1/** 2 * frontend.js 3 * 4 * @copyright 2018 CleverSoft. All rights reserved. 5 * @license MIT 6 */ 7(function ($) { 8 "use strict"; 9 var cafe = { 10 init: function () { 11 var wrap = $('.append-class:not(.slick-slider)'); 12 cafe.cafe_StickyHeader(); 13 cafe.cafe_carousel(); 14 cafe.cafe_tabs(); 15 cafe.productFilter(wrap); 16 cafe.cafe_category_accordion(); 17 cafe.cafe_Tabsfiler_Mobile(992); 18 cafe.cafe_PaginationAjax('.cafe-products-wrap ul.products', '.product', 'a.cafe-pagination-next'); 19 cafe.cafe_AjaxSearch(); 20 cafe.cafe_AjaxCart(); 21 cafe.cafe_AjaxLogin(); 22 cafe.cafe_site_nav_menu(); 23 cafe.cafe_site_nav_menu_toggle(); 24 cafe.cafe_site_nav_widget(); 25 cafe.cafe_WipeBanner(); 26 cafe.cafe_TextonHover(); 27 cafe.cafe_masonry_layout(); 28 }, 29 //Cafe Text on Hover 30 cafe_TextonHover: function () { 31 if ($('.cafe-text-on-hover')[0]) { 32 $('.cafe-text-on-hover .cafe-text').each(function () { 33 let $parent = $(this).closest('.cafe-text-on-hover'); 34 if (!!$parent.data('video')) { 35 $parent.prepend('<div class="cafe-bg-cursor"><video src="' + $parent.data('video') + '" loop muted></div>'); 36 } else { 37 if (!!$parent.data('image')) { 38 $parent.prepend('<div class="cafe-bg-cursor" style="background-image: url(' + $parent.data('image') + ')"></div>'); 39 } 40 } 41 }); 42 $(document).on('mousemove', '.cafe-text', function (e) { 43 let $parent = $(this).closest('.cafe-text-on-hover'); 44 $parent.find('.cafe-bg-cursor').css({ 45 left: e.clientX, 46 top: e.clientY 47 }); 48 }) 49 $(document).on('mouseover', '.cafe-text', function (e) { 50 let $parent = $(this).closest('.cafe-text-on-hover'); 51 $parent.addClass('active'); 52 if ($parent.find('video')[0]) { 53 $parent.find('video').get(0).play(); 54 } 55 }) 56 $(document).on('mouseout', '.cafe-text', function (e) { 57 let $parent = $(this).closest('.cafe-text-on-hover'); 58 $parent.removeClass('active'); 59 if ($parent.find('video')[0]) { 60 $parent.find('video').get(0).pause(); 61 $parent.find('video').get(0).load(); 62 } 63 }) 64 } 65 }, 66 //Cafe Wipe Banner 67 cafe_WipeBanner: function () { 68 $('.cafe-wiper').each(function () { 69 let total = $(this).find('.cafe-banner-img').length; 70 $(this).find('.cafe-banner-img').each(function () { 71 $(this).css('z-index', total); 72 total--; 73 }) 74 }); 75 $(window).on('scroll', function () { 76 $('.elementor-widget-clever-wipe-banner .cafe-wipe-banner:not(.on-screen)').each(function () { 77 if ($(window).scrollTop() + $(window).height() * 0.7 > $(this).offset().top) { 78 $(this).addClass('on-screen'); 79 $(this).find('.wrap-heading .cafe-heading:first-child').addClass('active'); 80 $(this).find('.cafe-banner-img:first-child').addClass('active'); 81 $('body').addClass('disable-scroll'); 82 $('html, body').animate({ 83 scrollTop: $(this).closest('.elementor-widget-clever-wipe-banner').offset().top 84 }, 900); 85 } 86 }); 87 }); 88 let allScroll = true; 89 $('.elementor-widget-clever-wipe-banner .cafe-wipe-banner').on('mousewheel', function (e) { 90 if (allScroll) { 91 let $activeItem = $(this).find('.cafe-heading.active'); 92 let $activeImg = $(this).find('.cafe-banner-img.active'); 93 if (e.deltaY < 0) { 94 if ($activeItem.next()[0]) { 95 $activeItem.removeClass('active').addClass('after-active'); 96 $activeItem.next().addClass('active'); 97 $activeImg.removeClass('active').addClass('after-active'); 98 $activeImg.next().addClass('active'); 99 $('body:not(.disable-scroll)').addClass('disable-scroll'); 100 if ($(window).scrollTop() < $(this).closest('.elementor-widget-clever-wipe-banner').offset().top) { 101 $('html, body').animate({ 102 scrollTop: $(this).closest('.elementor-widget-clever-wipe-banner').offset().top 103 }, 900); 104 } 105 } else { 106 $('body').removeClass('disable-scroll'); 107 } 108 } else { 109 if ($activeItem.prev()[0]) { 110 $activeItem.prev().removeClass('after-active').addClass('active'); 111 $activeItem.removeClass('active'); 112 $activeImg.prev().removeClass('after-active').addClass('active'); 113 $activeImg.removeClass('active'); 114 $('body:not(.disable-scroll)').addClass('disable-scroll'); 115 if ($(window).scrollTop() > $(this).closest('.elementor-widget-clever-wipe-banner').offset().top) { 116 $('html, body').animate({ 117 scrollTop: $(this).closest('.elementor-widget-clever-wipe-banner').offset().top 118 }, 900); 119 } 120 } else { 121 $('body').removeClass('disable-scroll'); 122 } 123 } 124 allScroll = false;
125 setTimeout(function () { 126 allScroll = true; 127 }, 900) 128 } 129 }); 130 }, 131 //Sticky Header 132 cafe_StickyHeader: function () { 133 if ($('.cafe-row-sticky')[0]) { 134 $(window).on('load', function () { 135 $('.cafe-row-sticky').each(function () { 136 var $this = $(this); 137 var $parent = $(this).parent(); 138 var current_width = 0; 139 $(window).resize(function () { 140 if (current_width != $(window).width()) { 141 current_width = $(window).width(); 142 $parent.height(''); 143 if (current_width > 1024.98 && $this.hasClass('desktop-sticky')) { 144 setTimeout(function () { 145 $parent.height($this.outerHeight()); 146 }, 500); 147 } else if (current_width < 1024.98 && current_width > 768.98 && $this.hasClass('tablet-sticky')) { 148 setTimeout(function () { 149 $parent.height($this.outerHeight()); 150 }, 500); 151 } else if (current_width < 768.98 && $this.hasClass('mobile-sticky')) { 152 setTimeout(function () { 153 $parent.height($this.outerHeight()); 154 }, 500); 155 } else { 156 $this.removeClass('is-sticky'); 157 $this.find('.elementor-widget-clever-site-logo').removeClass('header-is-sticky'); 158 } 159 } 160 }).resize(); 161 var HeaderTop = $parent.offset().top - $('body').offset().top; 162 var windowWidth = $(window).width(); 163 var old_top_position = 0; 164 $(window).on('scroll', function () { 165 var top = $(window).scrollTop(); 166 if ($this.hasClass('cafe-scroll-up-sticky')) { 167 top = top - $parent.outerHeight(); 168 if (old_top_position > top && top > $parent.outerHeight() * 3) { 169 $this.not('.active-sticky').addClass('active-sticky'); 170 } else { 171 $this.removeClass('active-sticky'); 172 } 173 old_top_position = top; 174 } 175 if (current_width > 1024.98 && $this.hasClass('desktop-sticky')) { 176 if (HeaderTop < top) { 177 $this.not('.is-sticky').addClass('is-sticky'); 178 $this.find('.elementor-widget-clever-site-logo:not(.header-is-sticky)').addClass('header-is-sticky'); 179 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').removeClass('toggle-active'); 180 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideUp(); 181 } else { 182 $this.removeClass('is-sticky'); 183 $this.find('.elementor-widget-clever-site-logo').removeClass('header-is-sticky'); 184 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').addClass('toggle-active'); 185 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideDown(); 186 } 187 } else if (current_width < 1024.98 && current_width > 768.98 && $this.hasClass('tablet-sticky')) { 188 if (HeaderTop < top) { 189 $this.not('.is-sticky').addClass('is-sticky'); 190 $this.find('.elementor-widget-clever-site-logo').addClass('header-is-sticky'); 191 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').removeClass('toggle-active'); 192 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideUp(); 193 } else { 194 $this.removeClass('is-sticky'); 195 $this.find('.elementor-widget-clever-site-logo').removeClass('header-is-sticky'); 196 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').addClass('toggle-active'); 197 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideDown(); 198 } 199 } else if (current_width < 768.98 && $this.hasClass('mobile-sticky')) { 200 if (HeaderTop < top) { 201 $this.not('.is-sticky').addClass('is-sticky'); 202 $this.find('.elementor-widget-clever-site-logo:not(.header-is-sticky)').addClass('header-is-sticky'); 203 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').removeClass('toggle-active'); 204 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideUp(); 205 } else { 206 $this.removeClass('is-sticky'); 207 $this.find('.elementor-widget-clever-site-logo.header-is-sticky').removeClass('header-is-sticky'); 208 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').addClass('toggle-active'); 209 $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideDown(); 210 } 211 } 212 }); 213 }) 214 }); 215 } 216 }, 217 cafe_Animated_Headlines: function () { 218 $('.cafe-headline.animated-text').cafeAnimatedHeadlines(); 219 }, 220 //Ajax login 221 cafe_AjaxLogin: function () { 222 $('.cafe-account-modal .woocommerce-form-login').on('submit', function (e) { 223 e.preventDefault(); 224 var user = {}; 225 var $form = $(this); 226 user.username = $form.find('input[name=username]').val(); 227 user.password = $form.find('input[name=password]').val(); 228 user.rememberme = $form.find('input[name=rememberme]').is(":checked") ? true : false;
229 $form.closest('.cafe-account-modal').addClass('cafe-loading'); 230 $.ajax({ 231 url: ajaxurl, 232 type: "POST", 233 data: { 234 action: "cafe_user_login", 235 loginParam: JSON.stringify(user) 236 } 237 }).done(function (result) { 238 if (!!result) { 239 if ($form.find('.cafe-notice')[0]) { 240 $form.find('.cafe-notice').html(result); 241 } else { 242 $form.prepend('<p class="cafe-notice">' + result + '</p>'); 243 } 244 $form.closest('.cafe-account-modal').removeClass('cafe-loading'); 245 } else { 246 location.reload(true); 247 } 248 }).fail(function (result) { 249 console.log('Err' + result); 250 }); 251 }) 252 }, 253 //Ajax cart. All ajax cart feature will work follow theme trigger; 254 cafe_AjaxCart: function () { 255 /*Close cart*/ 256 $(document).on('click', '.cafe-close-cart, .cafe-canvas-cart-mask', function (e) { 257 e.preventDefault(); 258 $('.elementor-widget-clever-canvas-cart .cafe-toggle-input').prop('checked', false); 259 }); 260 /* Remove Class cart empty with site install vanish cache after loaded*/ 261 if (typeof Cookies != 'undefined') { 262 if (Cookies.get('woocommerce_items_in_cart') > 0) { 263 $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty'); 264 } 265 } 266 //Update mini top cart ajax 267 $(document).on('added_to_cart', function (event, fragments) { 268 $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty'); 269 $('.cafe-canvas-cart-content.loading').removeClass('loading'); 270 $('.cafe-cart-count').html(fragments['cart_count']); 271 $('.cafe-cart-subtotal').html(fragments['cart_subtotal']); 272 }); 273 //Ajax cart of single product after added 274 $(document).on('zoo_single_product_cart_added', function (event, res) { 275 $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty'); 276 $('.cafe-canvas-cart-content.loading').removeClass('loading'); 277 var $response = $(res.response); 278 $('.cafe-cart-count').html($response.find('.cafe-cart-count').html()); 279 $('.cafe-cart-subtotal').html($response.find('.cafe-cart-subtotal').html()); 280 }); 281 //Open cart when user click to button add to cart 282 $(document).on('zoo_starting_add_to_cart', function () { 283 $('.elementor-widget-clever-canvas-cart:visible input.cafe-toggle-input').prop("checked", true); 284 $('.cafe-canvas-cart-content').addClass('loading'); 285 }); 286 $(document).on('adding_to_cart', function () { 287 $('.elementor-widget-clever-canvas-cart:visible input.cafe-toggle-input').prop("checked", true); 288 $('.cafe-canvas-cart-content').addClass('loading'); 289 }); 290 //Remove and revert cart item 291 $(document).on('zoo_after_remove_product_item', function (event, response) { 292 var fragments = response.fragments; 293 if (fragments.cart_count == 0) { 294 $('.cafe-canvas-cart').addClass('cart-empty'); 295 } 296 $('.cafe-cart-count').html(fragments['cart_count']); 297 $('.cafe-cart-subtotal').html(fragments['cart_subtotal']); 298 }); 299 $(document).on('zoo_after_restore_product_item', function (event, response) { 300 var fragments = response.fragments; 301 $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty'); 302 $('.cafe-cart-count').html(fragments['cart_count']); 303 $('.cafe-cart-subtotal').html(fragments['cart_subtotal']); 304 }); 305 }, 306 // Ajax Search 307 cafe_AjaxSearch: function () { 308 $(document).on('click', function (e) { 309 var $target = e.target; 310 $('.cafe-search-form.searched').each(function () { 311 if (!$(this).is($target) && $target.closest('.cafe-search-form') == null) { 312 $(this).removeClass('searched'); 313 } 314 }) 315 }); 316 $(".cafe-search-form.ajax-search").each(function () { 317 var inputtingTimer = null; 318 var cafeSearchForm = $(this), 319 cafeSearchFormInputField = $(this).find(".cafe-search-field"), 320 cafeSearchFormSelectField = $(".cafe-product-cat", cafeSearchForm), 321 cafeSearchMaxResult = $("input[name=max_result]", cafeSearchForm), 322 cafeSearchPostType = $("input[name=post_type]", cafeSearchForm), 323 cafeSearchLayout = $("input[name=layout]", cafeSearchForm), 324 cafeSearchBySKU = $("input[name=searchBySKU]", cafeSearchForm); 325 cafeSearchFormInputField.on("keypress", function (e) { 326 if (e.which === 13) // Abort enter action. 327 e.preventDefault(); 328 cafe_ajax_searching(); 329 }); 330 cafeSearchFormSelectField.on('change', function () { 331 cafe_ajax_searching(); 332 }); 333 334 function cafe_ajax_searching() { 335 // Clear delayed timer before another key press. 336 clearTimeout(inputtingTimer); 337 // Delay 1s before handling user input. 338 inputtingTimer = setTimeout(function () { 339 var cafeSearchFormInputFieldVal = cafeSearchFormInputField.val(); 340 if (cafeSearchFormInputFieldVal.length >= 3) {
341 var queryData = { 342 queryString: cafeSearchFormInputFieldVal 343 }; 344 if (cafeSearchFormSelectField.length) { 345 queryData.productCat = cafeSearchFormSelectField.val(); 346 } 347 if (cafeSearchPostType.length) { 348 queryData.postType = cafeSearchPostType.val(); 349 } 350 if (cafeSearchMaxResult.length) { 351 queryData.maxResult = cafeSearchMaxResult.val(); 352 } 353 if (cafeSearchLayout.length) { 354 queryData.layout = cafeSearchLayout.val(); 355 } 356 if (cafeSearchBySKU.length) { 357 queryData.searchBySKU = cafeSearchBySKU.val(); 358 } 359 cafeSearchForm.addClass('searching'); 360 cafeSearchForm.removeClass('searched'); 361 $.ajax({ 362 url: ajaxurl, 363 type: "POST", 364 data: { 365 action: "cafe_live_search_results", 366 searchQuery: JSON.stringify(queryData) 367 } 368 }).done(function (result) { 369 if ($('.cafe-wrap-search-result .cafe-row')[0]) { 370 $('.cafe-wrap-search-result .cafe-row').html(result); 371 } else { 372 cafeSearchForm.find('.cafe-wrap-search-form-content .cafe-row').append(result); 373 } 374 cafeSearchForm.removeClass('searching'); 375 cafeSearchForm.addClass('searched'); 376 }).fail(function (result) { 377 cafeSearchForm.removeClass('searching'); 378 cafeSearchForm.addClass('searched'); 379 console.log(result); 380 }); 381 } 382 }, 500); 383 } 384 }); 385 }, 386 // Pagination Ajax 387 cafe_PaginationAjax: function (wrap, item, path) { 388 $(document).on('click', '.view-more-button', function (e) { 389 e.preventDefault(); 390 }); 391 if ($('.pagination-ajax')[0]) { 392 if ($(path)[0]) { 393 var button = false; 394 var scrollThreshold = true; 395 if ($('.view-more-button')[0]) { 396 button = '.view-more-button'; 397 scrollThreshold = false; 398 $(document).on('click', '.view-more-button', function () { 399 $(this).hide(); 400 }); 401 } 402 var infScroll = new InfiniteScroll(wrap, { 403 path: path, 404 append: item, 405 status: '.scroller-status', 406 hideNav: '.cafe-pagination', 407 button: button, 408 scrollThreshold: scrollThreshold, 409 }); 410 411 $(wrap).on('history.infiniteScroll', function (event, response, path) { 412 $('.view-more-button').show(); 413 if (typeof deferimg != "undefined") { 414 deferimg(wrap + ' img:not(.sec-img)', 0, 'loaded', 415 function () { 416 $(this).closest('.loading').removeClass('loading'); 417 }); 418 } 419 }); 420 $(wrap).on('last.infiniteScroll', function (event, response, path) { 421 $('.view-more-button').remove(); 422 }); 423 } else { 424 $('.pagination-ajax,.infinite-scroll-error,.infinite-scroll-request,.view-more-button').remove(); 425 } 426 } 427 428 }, 429 //Image Comparison 430 cafe_image_comparison: function ($target) { 431 let $currentTarget = $target.find('.cafe-wrap-image-comparison'); 432 let beforelabel = !!$currentTarget.find('.before-img').attr('alt') ? $currentTarget.find('.before-img').attr('alt') : 'Before'; 433 let afterlabel = !!$currentTarget.find('.after-img').attr('alt') ? $currentTarget.find('.after-img').attr('alt') : 'After'; 434 let _orientation = !!$currentTarget.data('orientation') ? $currentTarget.data('orientation') : 'horizontal'; 435 $currentTarget.twentytwenty({ 436 orientation: _orientation, 437 before_label: beforelabel, // Set a custom before label 438 after_label: afterlabel, // Set a custom after label 439 }); 440 }, 441 //Video Light Box 442 cafe_video_light_box: function ($target) { 443 $target.find('.cafe-wrap-content-video').on('click', function (e) { 444 e.preventDefault(); 445 var $this = $(this).find('.cafe-video-button'); 446 var url = $this.attr('href'); 447 var config = $this.data('cafe-config'); 448 var height = config.height; 449 var width = config.width; 450 var html = '<div class="cafe-video-mask"></div><div class="cafe-wrap-video-popup"><iframe src="' + url + '" height="' + height + '" width="' + width + '" ></iframe></div>'; 451 $('body').append(html); 452 }); 453 $(document).on('click', '.cafe-video-mask', function () { 454 $('.cafe-wrap-video-popup, .cafe-video-mask').fadeOut(); 455 setTimeout(function () { 456 $('.cafe-wrap-video-popup, .cafe-video-mask').remove(); 457 }, 500) 458 }); 459 }, 460 //Auto Typing 461 cafe_auto_typing: function ($target) { 462 let $currentTarget = $target.find('.cafe-auto-typing'); 463 let data = $currentTarget.data('cafe-config'); 464 $currentTarget.find(".cafe-content-auto-typing").typed({
465 strings: data.text, 466 typeSpeed: data.speed, 467 startDelay: data.delay, 468 showCursor: data.cursor ? true : false, 469 loop: data.loop ? true : false, 470 }); 471 }, 472 // Image 360 view 473 cafe_image_360_view: function ($target) { 474 475 let $currentTarget = $target.find(".cafe-image-360-view"); 476 477 var config = JSON.parse($currentTarget.attr('data-cafe-config')); 478 var frame_width = config['width']; 479 var frame_height = config['height']; 480 if (parseInt(frame_width) > $currentTarget.find('.cafe-wrap-img-360-view').width()) { 481 var res = parseInt(frame_width) / parseInt(frame_height); 482 frame_width = $currentTarget.find('.cafe-wrap-img-360-view').width(); 483 frame_height = parseInt(parseInt(frame_width) / res); 484 } 485 $currentTarget.find('.cafe-wrap-content-view').spritespin({ 486 // path to the source images. 487 source: config['source'].split(','), 488 width: frame_width, // width in pixels of the window/frame 489 height: frame_height, // height in pixels of the window/frame 490 animate: false, 491 }); 492 $(document).on('click', '.cafe-control-view.cafe-center:not(.active)', function () { 493 $(this).addClass('active'); 494 $('.cafe-wrap-content-view').spritespin({ 495 // path to the source images. 496 source: config['source'].split(','), 497 width: frame_width, // width in pixels of the window/frame 498 height: frame_height, // height in pixels of the window/frame 499 animate: true, 500 frameTime: 300, 501 sense: -1, 502 }); 503 }); 504 $(document).on('click', '.cafe-control-view.cafe-center.active', function () { 505 $(this).removeClass('active'); 506 $('.cafe-wrap-content-view').spritespin({ 507 // path to the source images. 508 source: config['source'].split(','), 509 width: frame_width, // width in pixels of the window/frame 510 height: frame_height, // height in pixels of the window/frame 511 animate: false, 512 }); 513 }); 514 515 var api = $currentTarget.find('.cafe-wrap-content-view').spritespin("api"); 516 // call function next/previous frame when click to button next/previous 517 $currentTarget.find('.cafe-control-view.cafe-prev-item').on('click', function () { 518 api.prevFrame(); 519 }); 520 $currentTarget.find('.cafe-control-view.cafe-next-item').on('click', function () { 521 api.nextFrame(); 522 }); 523 }, 524 525 //For productCarousel 526 cafe_carousel: function ($target, wrap_config, wrap_slider) { 527 if (typeof $.fn.slick === 'undefined') { 528 return false; 529 } 530 var $currentTarget = !!$target ? $target.find(".cafe-carousel:not(.slick-slider)") : $(".cafe-carousel:not(.slick-slider)"); 531 532 $currentTarget.each(function () { 533 var data = JSON.parse($(this).attr('data-cafe-config')); 534 var slides_to_show = data['slides_to_show']; 535 var slides_to_show_tablet = data['slides_to_show_tablet']; 536 var slides_to_show_mobile = data['slides_to_show_mobile']; 537 var scroll = data['scroll']; 538 var autoplay = data['autoplay']; 539 var autoplay_tablet = data['autoplay_tablet']; 540 var autoplay_mobile = data['autoplay_mobile']; 541 var speed = data['speed']; 542 var show_pag = data['show_pag']; 543 var show_pag_tablet = data['show_pag_tablet']; 544 var show_pag_mobile = data['show_pag_mobile']; 545 var show_nav = data['show_nav']; 546 var show_nav_tablet = data['show_nav_tablet']; 547 var show_nav_mobile = data['show_nav_mobile']; 548 var wrap = data['wrap'] != undefined ? data['wrap'] : ''; 549 var arrow_left = data['arrow_left'] != undefined ? data['arrow_left'] : 'cs-font clever-icon-arrow-left-1'; 550 var arrow_right = data['arrow_right'] != undefined ? data['arrow_right'] : 'cs-font clever-icon-arrow-right-1'; 551 var center_mode = data['center_mode'] != undefined ? data['center_mode'] : false;
552 var infinite = data['infinite'] != undefined ? data['infinite'] : true; 553 var wrapcaroul = !!wrap ? $(this).find(wrap) : $(this); 554 555 var row = data['row'] != undefined ? data['row'] : 0; 556 557 if (!wrapcaroul.hasClass('slick-slider')) { 558 if (typeof wrap_config != 'function') { 559 if (!!wrap_config || !!wrap_slider) { 560 if (!!wrap_slider) { 561 wrapcaroul = wrap_slider; 562 } else { 563 wrapcaroul = $(wrap_config).find($(wrap).not('.ajax-loaded')); 564 } 565 } 566 wrapcaroul.slick({ 567 infinite: infinite, 568 slidesToShow: slides_to_show, 569 slidesToScroll: scroll > slides_to_show ? slides_to_show : scroll, 570 arrows: show_nav, 571 dots: show_pag, 572 prevArrow: '<span class="cafe-carousel-btn prev-item"><i class="' + arrow_left + '"></i></span>', 573 nextArrow: '<span class="cafe-carousel-btn next-item "><i class="' + arrow_right + '"></i></span>', 574 autoplay: autoplay, 575 autoplaySpeed: speed, 576 rows: row, 577 rtl: $('body.rtl')[0] ? true : false, 578 centerMode: center_mode, 579 centerPadding: '0', 580 responsive: [ 581 582 { 583 breakpoint: 1024, 584 settings: { 585 slidesToShow: slides_to_show_tablet, 586 slidesToScroll: scroll > slides_to_show_tablet ? slides_to_show_tablet : scroll, 587 autoplay: autoplay_tablet, 588 arrows: show_nav_tablet, 589 dots: show_pag_mobile, 590 } 591 }, 592 { 593 breakpoint: 768.98, 594 settings: { 595 slidesToShow: slides_to_show_mobile, 596 slidesToScroll: scroll > slides_to_show_mobile ? slides_to_show_mobile : scroll, 597 autoplay: autoplay_mobile, 598 arrows: show_nav_tablet, 599 dots: show_pag_mobile, 600 } 601 } 602 ] 603 }); 604 } 605 } 606 }); 607 }, 608 //Tabs 609 cafe_tabs: function () { 610 $(document).on('click', '.cafe-wrap-tab-head .cafe-tab-item:not(.active)', function () { 611 let tab_class = $(this).data('tab'); 612 $(this).closest('.cafe-wrap-tab-head').find('.active').removeClass('active'); 613 $(this).addClass('active'); 614 $(this).closest('.cafe-tabs').find('.cafe-tab.active').removeClass('active'); 615 $(this).closest('.cafe-tabs').find('.cafe-tab.' + tab_class).addClass('active'); 616 if ($(this).closest('.cafe-tabs').find('.slick-slider')[0]) { 617 $(this).closest('.cafe-tabs').find('.slick-slider').slick('reinit'); 618 } 619 }); 620 }, 621 // Filter Product 622 productFilter: function (wrap) { 623 624 wrap.find('.cafe-ajax-load a.ajax-load').on('click', function (e) { 625 e.preventDefault(); 626 var $this = $(this); 627 var key = $this.data('value'); 628 wrap = $this.parents('.append-class'); 629 if ($this.hasClass('active')) { 630 return; 631 } 632 $this.parents('.cafe-ajax-load ').find('a').removeClass('active'); 633 $this.addClass('active'); 634 if ($this.hasClass('opened')) { 635 wrap.find('.products').html(wrap.find('.products').data(key)); 636 if (wrap.hasClass('cafe-carousel')) { 637 wrap.find('.products').removeClass('slick-initialized slick-slider slick-dotted'); 638 cafe.cafe_carousel(null, wrap, null); 639 } 640 return; 641 } 642 643 $this.addClass('opened'); 644 wrap.addClass('loading'); 645 var data = wrap.data('args'); 646 data['action'] = 'cafe_ajax_product_filter'; 647 if ($this.data('type') == 'product_cat') { 648 data['filter_categories'] = $this.data('value'); 649 } 650 if ($this.data('type') == 'asset_type') { 651 data['asset_type'] = $this.data('value'); 652 } 653 wrap.data('args', data); 654 $.ajax({ 655 url: wrap.data('url'), 656 data: data, 657 type: 'POST', 658 }).success(function (response) { 659 wrap.removeClass('loading'); 660 let content = $(response).html(); 661 wrap.find('.products').html(content); 662 wrap.find('.products').data(key, content); 663 if (wrap.hasClass('cafe-carousel')) { 664 wrap.find('.products').removeClass('slick-initialized slick-slider slick-dotted'); 665 cafe.cafe_carousel(null, wrap, null); 666 } 667 }).error(function (ex) { 668 console.log(ex); 669 }); 670 }); 671 }, 672 // Image 360 view 673 cafe_category_accordion: function () { 674 $(document).on('click', '.cafe-btn-accordion', function () { 675 $(this).closest('.cafe-cat-item').toggleClass('activated'); 676 $(this).next('.cafe-sub-cat').slideToggle(); 677 }); 678 }, 679 // Progress bar 680 cafe_progress_bar: function () { 681 $(window).load(function () { 682 $('.cafe-wrap-progress-bar:not(.loaded)').each(function () { 683 if ($(window).scrollTop() + $(window).height() > $(this).offset().top) { 684 cafe_progress_bar_animate($(this)); 685 } 686 }); 687 }); 688 $(window).on('scroll', function () { 689 $('.cafe-wrap-progress-bar:not(.loaded)').each(function () { 690 if ($(window).scrollTop() + $(window).height() > $(this).offset().top) { 691 cafe_progress_bar_animate($(this)); 692 } 693 }); 694 }); 695 696 function cafe_progress_bar_animate($current) { 697 $current.addClass('loaded'); 698 var config = $current.data('cafe-config'); 699 var percent = config.percent; 700 if (!!percent) { 701 var duration = Math.round(config.duration / (percent + 10)); 702 var width = 0; 703 var id = setInterval(frame, duration); 704 705 function frame() { 706 if (width >= percent) { 707 clearInterval(id); 708 } else { 709 width++; 710 $current.find('.value').text(width); 711 $current.find('.cafe-progress-bar').
711css('width', width + '%'); 712 } 713 } 714 } 715 } 716 }, 717 718 //Tabs filter in mobile 719 cafe_Tabsfiler_Mobile: function ($poiter) { 720 $('.cafe-head-product-filter.has-tabs .cafe-title').css('cursor', 'pointer'); 721 $(document).on('click', '.cafe-head-product-filter.has-tabs .cafe-title', function () { 722 var w = $(window).width(); 723 if (w <= $poiter) { 724 $(this).parent().find('.cafe-ajax-load').slideToggle(); 725 $(this).toggleClass('active'); 726 727 return false; 728 } 729 }); 730 }, 731 //Site nav Menu 732 cafe_site_nav_menu: function () { 733 var current_width = 0; 734 $(window).resize(function () { 735 if (current_width != $(window).width()) { 736 current_width = $(window).width(); 737 //Fix menu out of screen. 738 $('.cafe-site-menu .pos-left').removeClass('pos-left'); 739 $('.cafe-site-menu .menu-item>ul, .cafe-site-menu li>.cmm4e-sub-panel').each(function () { 740 if (current_width < parseInt($(this).offset()['left'] + $(this).width())) { 741 $(this).addClass('pos-left'); 742 } 743 }); 744 } 745 }).resize(); 746 $(document).on('click', '.cafe-site-menu a', function (e) { 747 let href = $(this).attr('href'); 748 if (!!href) { 749 if (href.startsWith("#")) { 750 if ($(href)[0]) { 751 $(this).closest('ul').find('.current-menu-item').removeClass('current-menu-item'); 752 $(this).closest('.menu-item').addClass('current-menu-item'); 753 $(this).closest('.cafe-site-menu').find('input:checked').prop('checked', false); 754 if (!$(href).hasClass('elementor-element')) { 755 let headerHeight = $('.site-header')[0] ? $('.site-header').height() : 0; 756 $('html, body').animate({ 757 scrollTop: $(href).offset().top - $('.site-header').height() 758 }, 500); 759 } 760 } 761 } 762 } 763 }) 764 //Scroll 765 $('.cafe-menu>.menu-item>a').each(function () { 766 let href = $(this).attr('href'); 767 if (!!href) { 768 if (href.startsWith("#")) { 769 if ($(href)[0]) { 770 $(this).addClass('is-static-link'); 771 } 772 } 773 } 774 }); 775 $(window).on("scroll", function () { 776 $('.is-static-link').each(function () { 777 let href = $(this).attr('href'); 778 if (!!href) { 779 if (href.startsWith("#")) { 780 if ($(href)[0]) { 781 782 let top_of_element = $(href).offset().top; 783 let bottom_of_element = $(href).offset().top + $(href).outerHeight(); 784 let bottom_of_screen = $(window).scrollTop() + $(window).innerHeight() / 2; 785 let top_of_screen = $(window).scrollTop(); 786 let at_bottom = $(document).height(); 787 if (bottom_of_screen > top_of_element || ((bottom_of_element + 50) > at_bottom && top_of_element < ($(window).scrollTop() + $(window).innerHeight()))) { 788 $('.cafe-menu>.current-menu-item').removeClass('current-menu-item'); 789 $(this).closest('.menu-item').addClass('current-menu-item'); 790 } 791 } 792 } 793 } 794 }) 795 }); 796 }, 797 //Site nav Menu Toggle 798 cafe_site_nav_menu_toggle: function () { 799 $(document).on('click', '.cafe-site-menu .menu-item:not(.is-mega-menu) .cafe-menu-arrow', function (e) { 800 if ($(this).closest('.horizontal')[0]) { 801 if ($(this).closest('.cafe-lg-width')[0] && $(window).width() > 1025) { 802 return; 803 } 804 if ($(this).closest('.cafe-md-width')[0] && $(window).width() > 768) { 805 return; 806 } 807 } 808 if (e.target !== this) 809 return; 810 else { 811 e.preventDefault(); 812 $(this).toggleClass('active'); 813 $(this).closest('.menu-item:not(.is-mega-menu)').children('ul').slideToggle(); 814 if (!$(this).hasClass('active')) { 815 $(this).closest('.menu-item:not(.is-mega-menu)').find('ul').slideUp(); 816 $(this).closest('.menu-item:not(.is-mega-menu)').find('.active').removeClass('active'); 817 } 818 } 819 }); 820 $(document).on('click', '.cafe-site-menu .is-mega-menu>a>.cafe-menu-arrow', function (e) { 821 if ($(this).closest('.horizontal')[0]) { 822 if ($(this).closest('.cafe-lg-width')[0] && $(window).width() > 1025) { 823 return; 824 } 825 if ($(this).closest('.cafe-md-width')[0] && $(window).width() > 768) { 826 return; 827 } 828 } 829 if (e.target !== this) 830 return; 831 else { 832 e.preventDefault(); 833 $(this).toggleClass('active'); 834 $(this).closest('.menu-item').children('.mega-menu-content').slideToggle(); 835 if (!$(this).hasClass('active')) { 836 $(this).closest('.menu-item').find('.mega-menu-content').slideUp(); 837 $(this).closest('.menu-item').find('.active').removeClass('active'); 838 } 839 } 840 }); 841 $(document).on('click', '.cafe-site-menu .menu-item-mega .cafe-menu-arrow', function (e) { 842 if ($(this).closest('.horizontal')[0]) { 843 if ($(this).closest('.cafe-lg-width')[0] && $(window).width() > 1025) { 844 return; 845 } 846 if ($(this).closest('.cafe-md-width')[0] && $(window).width() > 768) { 847 return; 848 } 849 } 850 if (e.target !== this) 851 return; 852 else { 853 e.preventDefault(); 854 $(this).toggleClass('active'); 855 $(this).closest('.menu-item-mega').children('.mega-menu-submenu').slideToggle(); 856 if (!$(this).hasClass('active')) { 857 $(this).closest('.menu-item-mega').find('.mega-menu-submenu').slideUp(); 858 $(this).closest('.menu-item-mega').find('.active').removeClass('active'); 859 } 860 } 861 }); 862 $(document).on('click', '.cafe-wrap-menu .toggle .arrow', function (e) { 863 $(this).parents('.cafe-wrap-menu').toggleClass('toggle-active'); 864 $(this).parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideToggle(); 865 }); 866 }, 867 //Site Menu widget 868 cafe_site_nav_widget: function () { 869 if ($('.cafe-hamburger-slide-left-effect')[0] && $('.cafe-site-header')[0]) { 870 $('body').wrapInner('<div class="cafe-wrap-body-content-inner"/>'); 871 $('body').wrapInner('<div class="cafe-wrap-body-content"/>'); 872 $('body').append('<div class="cafe-wrap-menu-slide-left elementor-' + $('.cafe-site-header').attr('data-elementor-id') + '"/>') 873 $('.cafe-hamburger-slide-left-effect').each(function () { 874 let id = $(this).find('.cafe-hamburger-input-control').attr('id'); 875 let current_menu = $(this).closest('.elementor-widget-clever-site-nav-menu').clone(); 876 current_menu.find('.cafe-hamburger-button, .cafe-hamburger-input-control').remove(); 877 $('.cafe-wrap-menu-slide-left').append(current_menu); 878 879 $(this).find('.cafe-wrap-menu').remove(); 880 $(this).find('.cafe-hamburger-mask').remove(); 881 }); 882 } 883 $(document).on('click', '.cafe-hamburger-slide-left-effect .cafe-hamburger-button', function (e) { 884 e.preventDefault(); 885 let target = $(this).closest('.elementor-widget-clever-site-nav-menu').attr('data-id'); 886 $('body').toggleClass('cafe-hamburger-slide-left-active'); 887 $('.cafe-wrap-menu-slide-left .elementor-element-' + target).toggleClass('hamburger-active'); 888 $(window).trigger('resize') 889 }); 890 $(document).on('click', '.cafe-hamburger-slide-left-active .cafe-wrap-body-content', function (e) { 891 e.preventDefault(); 892 if (!$(e.target).hasClass('cafe-hamburger-input-control')) { 893 $('body.cafe-hamburger-slide-left-active').removeClass('cafe-hamburger-slide-left-active'); 894 $('.cafe-wrap-menu-slide-left .hamburger-active').removeClass('hamburger-active'); 895 $(window).trigger('resize') 896 } 897 }); 898 }, 899 //Cafe Masonry 900 cafe_masonry_layout: function(){ 901 if($('.masonry-layout')[0]){ 902 $('.masonry-layout .cafe-row').isotope({ 903 itemSelector: '.cafe-banner', 904 }); 905 906 } 907 } 908 }; 909 window.cafe = cafe; 910 // DOCUMENT READY 911 $(function () {
912 cafe.init(); 913 }); 914 $(window).on('elementor/frontend/init', function () { 915 //Animated Headlines 916 elementorFrontend.hooks.addAction( 917 "frontend/element_ready/clever-animated-headlines.default", 918 cafe.cafe_Animated_Headlines 919 ); 920 //Image Comparison 921 elementorFrontend.hooks.addAction( 922 "frontend/element_ready/clever-image-comparison.default", 923 cafe.cafe_image_comparison 924 ); 925 //Testimonial Slider 926 elementorFrontend.hooks.addAction( 927 "frontend/element_ready/clever-testimonial.default", 928 cafe.cafe_carousel 929 ); 930 //Carousel Tabs 931 elementorFrontend.hooks.addAction( 932 "frontend/element_ready/clever-carousel-tabs.default", 933 cafe.cafe_carousel, 934 cafe.cafe_tabs, 935 ); 936 //Carousel Tabs 937 elementorFrontend.hooks.addAction( 938 "frontend/element_ready/clever-multi-banner.default", 939 cafe.cafe_carousel 940 ); 941 //Image 360 view 942 elementorFrontend.hooks.addAction( 943 "frontend/element_ready/clever-image-360-view.default", 944 cafe.cafe_image_360_view 945 ); 946 //Auto Typing 947 elementorFrontend.hooks.addAction( 948 "frontend/element_ready/clever-auto-typing.default", 949 cafe.cafe_auto_typing 950 ); 951 //Video Lightbox 952 elementorFrontend.hooks.addAction( 953 "frontend/element_ready/clever-video-light-box.default", 954 cafe.cafe_video_light_box 955 ); 956 //Progress bar 957 elementorFrontend.hooks.addAction( 958 "frontend/element_ready/clever-progress-bar.default", 959 cafe.cafe_progress_bar 960 ); 961 //Site Nav Menu 962 elementorFrontend.hooks.addAction( 963 "frontend/element_ready/clever-site-nav-menu.default", 964 cafe.cafe_site_nav_menu, 965 cafe.cafe_site_nav_menu_toggle 966 ); 967 }); 968 969 jQuery.fn.extend({ 970 cafeAnimatedHeadlines: function () { 971 var $this = $(this); 972 if (!$this[0]) { 973 return; 974 } 975 if($this.hasClass('marquee')) { 976 let speed = $(this).attr('data-speed')?parseInt($(this).attr('data-speed')):1, animAmount, animInterval; 977 978 animateNews(); 979 980 function animateNews() { 981 $this.find('.cafe-words-wrapper b').eq(0).animate({ 982 'marginLeft': '-=' + speed + 'px' 983 }, 1, function () { 984 animAmount = speed; 985 let animNews_W = $this.find('.cafe-words-wrapper b').eq(0).outerWidth(true); 986 if (animAmount >= animNews_W) { 987 $(this).parent().append($(this)); 988 $(this).removeAttr('style'); 989 } 990 animInterval = setTimeout(function () { 991 animateNews(); 992 }); 993 }); 994 } 995 996 $this.hover(function () { 997 clearTimeout(animInterval); 998 $this.find('.cafe-words-wrapper b').eq(0).stop(); 999 }, function () { 1000 animateNews(); 1001 }); 1002 return; 1003 } 1004 //set animation timing 1005 var animationDelay = 2500, 1006 //loading bar effect 1007 barAnimationDelay = 3800, 1008 barWaiting = barAnimationDelay - 3000, //3000 is the duration of the transition on the loading bar - set in the scss/css file 1009 //letters effect 1010 lettersDelay = 50, 1011 //type effect 1012 typeLettersDelay = 150, 1013 selectionDuration = 500, 1014 typeAnimationDelay = selectionDuration + 800, 1015 //clip effect 1016 revealDuration = 600, 1017 revealAnimationDelay = 1500; 1018 1019 initHeadline(); 1020 1021 1022 function initHeadline() { 1023 //insert <i> element for each letter of a changing word 1024 $this.each(function () { 1025 if ($this.hasClass('letters')) 1026 singleLetters($this.find('b')); 1027 }); 1028 //initialise headline animation 1029 animateHeadline($this); 1030 } 1031 1032 function singleLetters($words) { 1033 $words.each(function () { 1034 var word = $(this),
1035 letters = word.text().split(''), 1036 selected = word.hasClass('is-visible'); 1037 for (var i in letters) { 1038 if (word.parents('.rotate-2').length > 0) letters[i] = '<em>' + letters[i] + '</em>'; 1039 letters[i] = (selected) ? '<i class="in">' + letters[i] + '</i>' : '<i>' + letters[i] + '</i>'; 1040 } 1041 var newLetters = letters.join(''); 1042 word.html(newLetters).css('opacity', 1); 1043 }); 1044 } 1045 1046 function animateHeadline($headlines) { 1047 var duration = animationDelay; 1048 $headlines.each(function () { 1049 var headline = $(this); 1050 if (headline.hasClass('random-selected')) { 1051 let total_item = headline.find('.cafe-words-wrapper b').length; 1052 headline.data('total_item', total_item); 1053 //trigger animation 1054 setInterval(function () { 1055 hideWord(headline.find('.is-visible')); 1056 }, duration); 1057 1058 } else { 1059 if (headline.hasClass('loading-bar')) { 1060 duration = barAnimationDelay; 1061 setTimeout(function () { 1062 headline.find('.cafe-words-wrapper').addClass('is-loading') 1063 }, barWaiting); 1064 } else if (headline.hasClass('clip')) { 1065 var spanWrapper = headline.find('.cafe-words-wrapper'), 1066 newWidth = spanWrapper.width() + 10; 1067 spanWrapper.css('width', newWidth); 1068 } else if (!headline.hasClass('type')) { 1069 //assign to .cafe-words-wrapper the width of its longest word 1070 var words = headline.find('.cafe-words-wrapper b'), 1071 width = 0; 1072 words.each(function () { 1073 var wordWidth = $(this).width(); 1074 if (wordWidth > width) width = wordWidth; 1075 }); 1076 headline.find('.cafe-words-wrapper').css('width', width); 1077 } 1078 //trigger animation 1079 setTimeout(function () { 1080 hideWord(headline.find('.is-visible').eq(0)) 1081 }, duration); 1082 } 1083 }); 1084 } 1085 1086 function randomIndex(max) { 1087 return Math.floor(Math.random() * Math.floor(max)); 1088 } 1089 1090 function hideWord($word) { 1091 var nextWord = takeNext($word); 1092 if ($word.parents('.cafe-headline').hasClass('random-selected')) { 1093 let total_item = $word.parents('.cafe-headline').data('total_item'); 1094 nextWord = $word.parents('.cafe-headline').find('.cafe-words-wrapper b:eq(' + randomIndex(total_item) + ')'); 1095 switchWord($word, nextWord); 1096 } else if ($word.parents('.cafe-headline').hasClass('type')) { 1097 var parentSpan = $word.parent('.cafe-words-wrapper'); 1098 parentSpan.addClass('selected').removeClass('waiting'); 1099 setTimeout(function () { 1100 parentSpan.removeClass('selected'); 1101 $word.removeClass('is-visible').addClass('is-hidden').children('i').removeClass('in').addClass('out'); 1102 }, selectionDuration); 1103 setTimeout(function () { 1104 showWord(nextWord, typeLettersDelay) 1105 }, typeAnimationDelay); 1106 1107 } else if ($word.parents('.cafe-headline').hasClass('letters')) { 1108 var bool = ($word.children('i').length >= nextWord.children('i').length) ? true : false; 1109 hideLetter($word.find('i').eq(0), $word, bool, lettersDelay); 1110 showLetter(nextWord.find('i').eq(0), nextWord, bool, lettersDelay); 1111 1112 } else if ($word.parents('.cafe-headline').hasClass('clip')) { 1113 $word.parents('.cafe-words-wrapper').animate({width: '2px'}, revealDuration, function () { 1114 switchWord($word, nextWord); 1115 showWord(nextWord); 1116 }); 1117 1118 } else if ($word.parents('.cafe-headline').hasClass('loading-bar')) { 1119 $word.parents('.cafe-words-wrapper').removeClass('is-loading'); 1120 switchWord($word, nextWord); 1121 setTimeout(function () { 1122 hideWord(nextWord) 1123 }, barAnimationDelay); 1124 setTimeout(function () { 1125 $word.parents('.cafe-words-wrapper').addClass('is-loading') 1126 }, barWaiting); 1127 1128 } else { 1129 switchWord($word, nextWord); 1130 setTimeout(function () { 1131 hideWord(nextWord) 1132 }, animationDelay); 1133 } 1134 } 1135 1136 function showWord($word, $duration) { 1137 if ($word.parents('.cafe-headline').hasClass('type')) { 1138 showLetter($word.find('i').eq(0), $word, false, $duration); 1139 $word.addClass('is-visible').removeClass('is-hidden'); 1140 1141 } else if ($word.parents('.cafe-headline').hasClass('clip')) { 1142 $word.parents('.cafe-words-wrapper').animate({'width': $word.width() + 10}, revealDuration, function () { 1143 setTimeout(function () { 1144 hideWord($word) 1145 }, revealAnimationDelay); 1146 }); 1147 } 1148 } 1149 1150 function hideLetter($letter, $word, $bool, $duration) { 1151 $letter.removeClass('in').addClass('out'); 1152 1153 if (!$letter.is(':last-child')) { 1154 setTimeout(function () { 1155 hideLetter($letter.next(), $word, $bool, $duration); 1156 }, $duration); 1157 } else if ($bool) { 1158 setTimeout(function () { 1159 hideWord(takeNext($word)) 1160 }, animationDelay); 1161 } 1162 1163 if ($letter.is(':last-child') && $('html').hasClass('no-csstransitions')) { 1164 var nextWord = takeNext($word); 1165 switchWord($word, nextWord); 1166 } 1167 } 1168 1169 function showLetter($letter, $word, $bool, $duration) { 1170 $letter.addClass('in').removeClass('out'); 1171 1172 if (!$letter.is(':last-child')) { 1173 setTimeout(function () { 1174 showLetter($letter.next(), $word, $bool, $duration); 1175 }, $duration); 1176 } else { 1177 if ($word.parents('.cafe-headline').hasClass('type')) { 1178 setTimeout(function () { 1179 $word.parents('.cafe-words-wrapper').addClass('waiting'); 1180 }, 200); 1181 } 1182 if (!$bool) { 1183 setTimeout(function () { 1184 hideWord($word) 1185 }, animationDelay) 1186 } 1187 } 1188 } 1189 1190 function takeNext($word) { 1191 return (!$word.is(':last-child')) ? $word.next() : $word.parent().children().eq(0); 1192 } 1193 1194 function takePrev($word) { 1195 return (!$word.is(':first-child')) ? $word.prev() : $word.parent().children().last(
1195); 1196 } 1197 1198 function switchWord($oldWord, $newWord) { 1199 $oldWord.removeClass('is-visible').addClass('is-hidden'); 1200 $newWord.removeClass('is-hidden').addClass('is-visible'); 1201 } 1202 1203 1204 } 1205 }); 1206})(jQuery); 1207 1208/*Assign video backgound of slider to YT API*/ 1209function onYouTubeIframeAPIReady() { 1210 jQuery('.slick-slide:not(.slick-cloned) .cafe-viewer-video.youtube-embed iframe').each(function () { 1211 if (jQuery(this).attr('id') != '') ; 1212 { 1213 let sound = jQuery(this).parent().data('cafe-config').sound; 1214 let player = new YT.Player(jQuery(this).attr('id'), { 1215 playerVars: { 1216 'autoplay': 0, 1217 'controls': 0, 1218 'modestbranding': 1, 1219 'rel': 0, 1220 'showinfo': 0 1221 }, 1222 events: { 1223 onReady: function (e) { 1224 if (sound != 'yes') { 1225 e.target.mute(); 1226 } 1227 jQuery('#progressBar').hide(); 1228 } 1229 } 1230 } 1231 ); 1232 jQuery(this).parent().data('player', player); 1233 } 1234 }) 1235 1236} 1237 1238/*End Assign video backgound of slider to YT API*/ 1239 1240// webpackModules 1241(function (modules) { 1242 // The module cache 1243 var $ = jQuery, 1244 installedModules = {}; 1245 1246 // The require function 1247 function __webpack_require__(moduleId) { 1248 1249 // Check if module is in cache 1250 if (installedModules[moduleId]) { 1251 return installedModules[moduleId].exports; 1252 } 1253 // Create a new module (and put it into the cache) 1254 var module = installedModules[moduleId] = { 1255 i: moduleId, 1256 l: false, 1257 exports: {} 1258 }; 1259 1260 // Execute the module function 1261 modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 1262 1263 // Flag the module as loaded 1264 module.l = true; 1265 1266 // Return the exports of the module 1267 return module.exports; 1268 } 1269 1270 // expose the modules object (__webpack_modules__) 1271 __webpack_require__.m = modules; 1272 1273 // expose the module cache 1274 __webpack_require__.c = installedModules; 1275 1276 // define getter function for harmony exports 1277 __webpack_require__.d = function (exports, name, getter) { 1278 if (!__webpack_require__.o(exports, name)) { 1279 Object.defineProperty(exports, name, { 1280 enumerable: true, 1281 get: getter 1282 }); 1283 } 1284 }; 1285 1286 // define __esModule on exports 1287 __webpack_require__.r = function (exports) { 1288 if (typeof Symbol !== 'undefined' && Symbol.toStringTag) { 1289 Object.defineProperty(exports, Symbol.toStringTag, { 1290 value: 'Module' 1291 }); 1292 } 1293 Object.defineProperty(exports, '__esModule', { 1294 value: true 1295 }); 1296 }; 1297 1298 // create a fake namespace object 1299 // mode & 1: value is a module id, require it 1300 // mode & 2: merge all properties of value into the ns 1301 // mode & 4: return value when already ns object 1302 // mode & 8|1: behave like require 1303 __webpack_require__.t = function (value, mode) { 1304 if (mode & 1) value = __webpack_require__(value); 1305 if (mode & 8) return value; 1306 if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 1307 var ns = Object.create(null); 1308 __webpack_require__.r(ns); 1309 Object.defineProperty(ns, 'default', { 1310 enumerable: true, 1311 value: value 1312 }); 1313 if (mode & 2 && typeof value != 'string') 1314 for (var key in value) __webpack_require__.d(ns, key, function (key) { 1315 return value[key]; 1316 }.bind(null, key)); 1317 return ns; 1318 }; 1319 1320 // getDefaultExport function for compatibility with non-harmony modules 1321 __webpack_require__.n = function (module) {
1322 var getter = module && module.__esModule ? 1323 function getDefault() { 1324 return module['default']; 1325 } : 1326 function getModuleExports() { 1327 return module; 1328 }; 1329 __webpack_require__.d(getter, 'a', getter); 1330 return getter; 1331 }; 1332 1333 // Object.prototype.hasOwnProperty.call 1334 __webpack_require__.o = function (object, property) { 1335 return Object.prototype.hasOwnProperty.call(object, property); 1336 }; 1337 1338 // __webpack_public_path__ 1339 __webpack_require__.p = ''; 1340 1341 // Load entry module and return exports 1342 return __webpack_require__(__webpack_require__.s = 0); 1343}) 1344([ 1345 /* 0 */ 1346 (function (module, exports, __webpack_require__) { 1347 'use strict'; 1348 1349 function CleverAddonsForElementor(elementor) { 1350 var self = this, 1351 handlers = { 1352 slider: __webpack_require__(1) 1353 }; 1354 this.modules = {}; 1355 self.modules = {}; 1356 jQuery.each(handlers, function (moduleName) { 1357 self.modules[moduleName] = new this(elementor); 1358 }); 1359 1360 } 1361 1362 jQuery(window).on('elementor/frontend/init', function () { 1363 window.cafeFrontend = new CleverAddonsForElementor(elementorFrontend); 1364 }); 1365 }), 1366 /* 1 */ 1367 (function (module, exports, __webpack_require__) { 1368 'use strict'; 1369 1370 module.exports = function (elementor) { 1371 elementor.hooks.addAction('frontend/element_ready/clever-slider.default', __webpack_require__(2)); 1372 elementor.hooks.addAction('frontend/element_ready/clever-section-bookmark.default', __webpack_require__(3)); 1373 elementor.hooks.addAction('frontend/element_ready/clever-edd-tabs.default', __webpack_require__(4)); 1374 elementor.hooks.addAction('frontend/element_ready/clever-scroll-to.default', __webpack_require__(7)); 1375 }; 1376 }), 1377 /* 2 */ 1378 (function (module, exports, __webpack_require__) { 1379 'use strict'; 1380 1381 var CleverSlider = elementorModules.frontend.handlers.Base.extend({ 1382 getDefaultSettings: function () { 1383 return { 1384 selectors: { 1385 slider: '.cafe-slider-slides', 1386 slideBackground: '.slick-slide-bg', 1387 slideContent: '.cafe-slide-content' 1388 }, 1389 classes: { 1390 animated: 'animated' 1391 }, 1392 attributes: { 1393 dataSliderOptions: 'slider_options', 1394 dataAnimation: 'animation' 1395 } 1396 }; 1397 }, 1398 /*Resize iframe fit to slider size*/ 1399 resizeIframe: function ($slider) { 1400 let slide_res = $slider.width() / $slider.height(); 1401 $slider.find('.cafe-viewer-video iframe').each(function () { 1402 let frame_res = jQuery(this).attr('width') / jQuery(this).attr('height'); 1403 if (frame_res > slide_res) { 1404 jQuery(this).attr('width', frame_res * $slider.height()); 1405 jQuery(this).width(frame_res * $slider.height()); 1406 jQuery(this).attr('height', $slider.height()); 1407 } else { 1408 jQuery(this).attr('width', $slider.width()); 1409 jQuery(this).width($slider.width()); 1410 jQuery(this).attr('height', $slider.width() / frame_res); 1411 } 1412 }) 1413 }, 1414 1415 getDefaultElements: function () { 1416 var selectors = this.getSettings('selectors'); 1417 return { 1418 $slider: this.$element.find(selectors.slider) 1419 }; 1420 }, 1421 1422 initSlider: function () { 1423 var $slider = this.elements.$slider; 1424 var settings = this.getSettings(); 1425 if (!$slider.length) { 1426 return; 1427 } 1428 1429 $slider.slick($slider.data(this.getSettings('attributes.dataSliderOptions'))); 1430 /*JS for slider video*/ 1431 this.resizeIframe($slider); 1432 $slider.find('.cafe-viewer-video.vimeo-embed').each(function () { 1433 var options = { 1434 background: true 1435 }; 1436 if (typeof Vimeo != 'undefined') { 1437 var player = new Vimeo.Player(jQuery(this).find('iframe'), options); 1438 player.setLoop(true); 1439 var arg = jQuery(this).data('cafe-config'); 1440 if (arg.sound != 'yes') { 1441 player.setVolume(0); 1442 } 1443 player.disableTextTrack(); 1444 jQuery(this).data('player', player); 1445 } 1446 }) 1447 if ($slider.find('.slick-active .cafe-viewer-video.vimeo-embed')[0]) { 1448 let player = $slider.find('.slick-active .cafe-viewer-video.vimeo-embed').data('player'); 1449 player.play(); 1450 } 1451 if ($slider.find('.slick-active .cafe-viewer-video.youtube-embed')[0]) { 1452 let player = $slider.find('.slick-active .cafe-viewer-video.youtube-embed').data('player'); 1453 player.playVideo(); 1454 } 1455 /*End JS for slider video*/ 1456 }, 1457 1458 goToActiveSlide: function () { 1459 this.elements.$slider.slick('slickGoTo', this.getEditSettings('activeItemIndex') - 1); 1460 }, 1461 1462 onPanelShow: function () { 1463 var $slider = this.elements.$slider; 1464 1465 $slider.slick('slickPause'); 1466 1467 // On switch between slides while editing. stop again. 1468 $slider.on('afterChange', function () { 1469 $slider.slick('slickPause'); 1470 }); 1471 }, 1472 1473 bindEvents: function () { 1474 var $slider = this.elements.$slider,
1475 settings = this.getSettings(), 1476 animation = $slider.data(settings.attributes.dataAnimation); 1477 1478 if (!animation) { 1479 return; 1480 } 1481 1482 if (elementorFrontend.isEditMode()) { 1483 elementor.hooks.addAction('panel/open_editor/widget/clever-slider', this.onPanelShow); 1484 } 1485 1486 $slider.on({ 1487 init: function (event, slick) { 1488 let $currentSlide = $slider.find('.slick-current').find(settings.selectors.slideContent); 1489 let $currentBgSlide = $slider.find('.slick-current').find(settings.selectors.slideBackground); 1490 1491 let selfAnimation = $currentSlide.data('animation'); 1492 let selfBgAnimation = $currentBgSlide.data('animation'); 1493 1494 selfAnimation = selfAnimation == 'inherit' ? animation : selfAnimation; 1495 1496 $currentSlide.addClass(settings.classes.animated + ' ' + selfAnimation); 1497 if (selfBgAnimation != 'inherit') { 1498 $currentBgSlide.addClass(settings.classes.animated + ' ' + selfBgAnimation); 1499 } 1500 }, 1501 beforeChange: function (event, slick, currentSlide) { 1502 let $sliderContent = $slider.find(settings.selectors.slideContent); 1503 let $slideBackground = jQuery(slick.$slides.get(currentSlide)).find(settings.selectors.slideBackground); 1504 1505 let selfAnimation = $sliderContent.data('animation'); 1506 let selfBgAnimation = $slideBackground.data('animation'); 1507 1508 selfAnimation = selfAnimation == 'inherit' ? animation : selfAnimation; 1509 1510 $sliderContent.removeClass(settings.classes.animated + ' ' + selfAnimation); 1511 1512 if (selfBgAnimation != 'inherit') { 1513 $slideBackground.removeClass(settings.classes.animated + ' ' + selfBgAnimation); 1514 } 1515 }, 1516 afterChange: function (event, slick, currentSlide) { 1517 let $currentSlide = jQuery(slick.$slides.get(currentSlide)).find(settings.selectors.slideContent); 1518 let $currentBgSlide = jQuery(slick.$slides.get(currentSlide)).find(settings.selectors.slideBackground); 1519 1520 let selfAnimation = $currentSlide.data('animation'); 1521 let selfBgAnimation = $currentBgSlide.data('animation'); 1522 1523 selfAnimation = selfAnimation == 'inherit' ? animation : selfAnimation; 1524 1525 $currentSlide.addClass(settings.classes.animated + ' ' + selfAnimation); 1526 if (selfBgAnimation != 'inherit') { 1527 $currentBgSlide.addClass(settings.classes.animated + ' ' + selfBgAnimation); 1528 } 1529 /*Video background control play/pause when change slide*/ 1530 $slider.find('.cafe-viewer-video.vimeo-embed').each(function () { 1531 let player = jQuery(this).data('player'); 1532 if (jQuery(this).parents('.slick-active')[0]) { 1533 player.play(); 1534 } else { 1535 player.pause(); 1536 } 1537 }); 1538 $slider.find('.cafe-viewer-video.youtube-embed').each(function () { 1539 let player = jQuery(this).data('player'); 1540 if (typeof player != 'undefined') { 1541 if (jQuery(this).parents('.slick-active')[0]) { 1542 player.playVideo(); 1543 } else { 1544 player.pauseVideo(); 1545 } 1546 } 1547 }); 1548 /*End Video background control play/pause when change slide*/ 1549 } 1550 }); 1551 var $this = this; 1552 jQuery(window).on('resize', function () { 1553 $this.resizeIframe($slider); 1554 }) 1555 }, 1556 1557 onInit: function () { 1558 elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); 1559 1560 this.initSlider(); 1561 1562 if (this.isEdit) { 1563 this.goToActiveSlide(); 1564 } 1565 }, 1566 1567 onEditSettingsChange: function (propertyName) { 1568 if ('activeItemIndex' === propertyName) { 1569 this.goToActiveSlide(); 1570 } 1571 } 1572 }); 1573 1574 module.exports = function ($scope) { 1575 new CleverSlider({ 1576 $element: $scope 1577 }); 1578 }; 1579 }), 1580 /* 3 */ 1581 (function (module, exports, __webpack_require__) { 1582 'use strict'; 1583 1584 var CleverSectionBookmark = elementorModules.frontend.handlers.Base.extend({ 1585 addSection: function () { 1586 var context = jQuery(this.$element.context), 1587 section = context.find('.cafe-bookmark-section'), 1588 sectionId = section.attr('id'), 1589 sectionIcon = section.data('icon'), 1590 sectionLabel = section.data('label'), 1591 sectionModelId = section.data('modelId'); 1592 1593 if (!elementorFrontend.isEditMode() && !context.hasClass('cafe-section-bookmark-container')) { 1594 context.addClass('cafe-section-bookmark-container'); 1595 } 1596 1597 if (!context.hasClass('bookmarked')) { 1598 this.navBar.append('<li><a class="cafe-section-bookmark-link ' + sectionIcon + ' section-link-' + sectionModelId + '" href="#' + sectionId + '"><span class="screen-reader-text">' + sectionLabel + '</span></a></li>'); 1599 context.addClass('bookmarked'); 1600 } else { 1601 this.navBar.find('a[href="#' + sectionId + '"]').replaceWith('<li><a class="cafe-section-bookmark-link ' + sectionIcon + ' section-link-' + sectionModelId + '" href="#' + sectionId + '"><span class="screen-reader-text">' + sectionLabel + '</span></a></li>'); 1602 } 1603 },
1604 setActiveSection: function () { 1605 navLinks.removeClass('current'); 1606 $('#navigation li a[href="#' + id + '"]').addClass('current'); 1607 }, 1608 goToActiveSection: function () { 1609 if (target.length) { 1610 $('html, body').stop().animate({ 1611 scrollTop: target.offset().top 1612 }, 1000); 1613 } 1614 }, 1615 initNavBar: function () { 1616 var navBar = jQuery('#cafe-bookmark-bar'); 1617 if (!navBar.length) { 1618 var $ul = document.createElement('ul'); 1619 $ul.id = 'cafe-bookmark-bar'; 1620 $ul.style = 'list-style:none;margin:0;padding:0;position:fixed;width:20px;height:100px;right:1em;top:calc(50vh - 50px)'; 1621 document.body.appendChild($ul); 1622 this.navBar = jQuery('#cafe-bookmark-bar'); 1623 } else { 1624 this.navBar = navBar; 1625 } 1626 }, 1627 onInit: function () { 1628 elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); 1629 1630 this.initNavBar(); 1631 1632 this.addSection(); 1633 1634 // draft code 1635 jQuery('.cafe-section-bookmark-link').on('click', function (e) { 1636 var target = jQuery(this.getAttribute('href')); 1637 1638 if (target.length) { 1639 e.preventDefault(); 1640 jQuery('html, body').stop().animate({ 1641 scrollTop: target.offset().top 1642 }, 1000); 1643 } 1644 }); 1645 1646 jQuery(window).scroll(function () { 1647 var position = window.pageYOffset; 1648 jQuery('.cafe-bookmark-section').each(function () { 1649 var target = jQuery(this).offset().top; 1650 var id = jQuery(this).attr('id'); 1651 var navLinks = jQuery('#cafe-bookmark-bar li a'); 1652 if (position >= target) { 1653 navLinks.removeClass('current'); 1654 jQuery('#cafe-bookmark-bar li a[href="#' + id + '"]').addClass('current'); 1655 } 1656 }); 1657 }); 1658 }, 1659 onEditSettingsChange: function (propertyName) { 1660 console.log(propertyName); 1661 } 1662 }); 1663 1664 module.exports = function ($scope) { 1665 new CleverSectionBookmark({ 1666 $element: $scope 1667 }); 1668 }; 1669 }), 1670 /* 4 */ 1671 (function (module, exports, __webpack_require__) { 1672 'use strict'; 1673 1674 var TabsModule = __webpack_require__(5); 1675 1676 module.exports = function ($scope) { 1677 new TabsModule({ 1678 $element: $scope, 1679 toggleSelf: false 1680 }); 1681 }; 1682 }), 1683 /* 5 */ 1684 (function (module, exports, __webpack_require__) { 1685 "use strict"; 1686 1687 var HandlerModule = __webpack_require__(6); 1688 1689 module.exports = HandlerModule.extend({ 1690 $activeContent: null, 1691 1692 getDefaultSettings: function getDefaultSettings() { 1693 return { 1694 selectors: { 1695 tabTitle: '.elementor-tab-title', 1696 tabContent: '.elementor-tab-content' 1697 }, 1698 classes: { 1699 active: 'elementor-active' 1700 }, 1701 showTabFn: 'show', 1702 hideTabFn: 'hide', 1703 toggleSelf: true, 1704 hidePrevious: true, 1705 autoExpand: true 1706 }; 1707 }, 1708 1709 getDefaultElements: function getDefaultElements() { 1710 var selectors = this.getSettings('selectors'); 1711 1712 return { 1713 $tabTitles: this.findElement(selectors.tabTitle), 1714 $tabContents: this.findElement(selectors.tabContent) 1715 }; 1716 }, 1717 1718 activateDefaultTab: function activateDefaultTab() {
1719 var settings = this.getSettings(); 1720 1721 if (!settings.autoExpand || 'editor' === settings.autoExpand && !this.isEdit) { 1722 return; 1723 } 1724 1725 var defaultActiveTab = this.getEditSettings('activeItemIndex') || 1, 1726 originalToggleMethods = { 1727 showTabFn: settings.showTabFn, 1728 hideTabFn: settings.hideTabFn 1729 }; 1730 1731 // Toggle tabs without animation to avoid jumping 1732 this.setSettings({ 1733 showTabFn: 'show', 1734 hideTabFn: 'hide' 1735 }); 1736 1737 this.changeActiveTab(defaultActiveTab); 1738 1739 // Return back original toggle effects 1740 this.setSettings(originalToggleMethods); 1741 }, 1742 1743 deactivateActiveTab: function deactivateActiveTab(tabIndex) { 1744 var settings = this.getSettings(), 1745 activeClass = settings.classes.active, 1746 activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : '.' + activeClass, 1747 $activeTitle = this.elements.$tabTitles.filter(activeFilter), 1748 $activeContent = this.elements.$tabContents.filter(activeFilter); 1749 1750 $activeTitle.add($activeContent).removeClass(activeClass); 1751 1752 $activeContent[settings.hideTabFn](); 1753 }, 1754 1755 activateTab: function activateTab(tabIndex) { 1756 var settings = this.getSettings(), 1757 activeClass = settings.classes.active, 1758 $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'), 1759 $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]'); 1760 1761 $requestedTitle.add($requestedContent).addClass(activeClass); 1762 1763 $requestedContent[settings.showTabFn](); 1764 }, 1765 1766 isActiveTab: function isActiveTab(tabIndex) { 1767 return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings('classes.active')); 1768 }, 1769 1770 bindEvents: function bindEvents() { 1771 var _this = this; 1772 1773 this.elements.$tabTitles.on({ 1774 keydown: function keydown(event) { 1775 if ('Enter' === event.key) { 1776 event.preventDefault(); 1777 1778 _this.changeActiveTab(event.currentTarget.dataset.tab); 1779 } 1780 }, 1781 click: function click(event) { 1782 event.preventDefault(); 1783 1784 _this.changeActiveTab(event.currentTarget.dataset.tab); 1785 } 1786 }); 1787 }, 1788 1789 onInit: function onInit() { 1790 HandlerModule.prototype.onInit.apply(this, arguments); 1791 1792 this.activateDefaultTab(); 1793 }, 1794 1795 onEditSettingsChange: function onEditSettingsChange(propertyName) { 1796 if ('activeItemIndex' === propertyName) { 1797 this.activateDefaultTab(); 1798 } 1799 }, 1800 1801 changeActiveTab: function changeActiveTab(tabIndex) { 1802 var isActiveTab = this.isActiveTab(tabIndex), 1803 settings = this.getSettings(); 1804 1805 if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) { 1806 this.deactivateActiveTab(); 1807 } 1808 1809 if (!settings.hidePrevious && isActiveTab) { 1810 this.deactivateActiveTab(tabIndex); 1811 } 1812 1813 if (!isActiveTab) { 1814 this.activateTab(tabIndex); 1815 } 1816 } 1817 }); 1818 }), 1819 /* 6 */ 1820 (function (module, exports, __webpack_require__) { 1821 1822 "use strict"; 1823 1824 1825 module.exports = elementorModules.ViewModule.extend({ 1826 $element: null, 1827 1828 editorListeners: null, 1829 1830 onElementChange: null, 1831 1832 onEditSettingsChange: null, 1833 1834 onGeneralSettingsChange: null, 1835 1836 onPageSettingsChange: null, 1837 1838 isEdit: null, 1839 1840 __construct: function __construct(settings) { 1841 this.$element = settings.$element; 1842 1843 this.isEdit = this.$element.hasClass('elementor-element-edit-mode'); 1844 1845 if (this.isEdit) { 1846 this.addEditorListeners(); 1847 } 1848 }, 1849 1850 findElement: function findElement(selector) { 1851 var $mainElement = this.$element; 1852 1853 return $mainElement.find(selector).filter(function () { 1854 return jQuery(this).closest('.elementor-element').is($mainElement); 1855 }); 1856 }, 1857 1858 getUniqueHandlerID: function getUniqueHandlerID(cid, $element) { 1859 if (!cid) { 1860 cid = this.getModelCID(); 1861 } 1862 1863 if (!$element) { 1864 $element = this.$element; 1865 } 1866 1867 return cid + $element.attr('data-element_type') + this.getConstructorID(); 1868 }, 1869 1870 initEditorListeners: function initEditorListeners() { 1871 var self = this; 1872 1873 self.editorListeners = [{ 1874 event: 'element:destroy', 1875 to: elementor.channels.data, 1876 callback: function callback(removedModel) { 1877 if (removedModel.cid !== self.getModelCID()) { 1878 return; 1879 } 1880 1881 self.onDestroy(); 1882 } 1883 }]; 1884 1885 if (self.onElementChange) { 1886 var elementName = self.getElementName(), 1887 eventName = 'change'; 1888 1889 if ('global' !== elementName) { 1890 eventName += ':' + elementName; 1891 } 1892 1893 self.editorListeners.push({ 1894 event: eventName, 1895 to: elementor.channels.editor,
1896 callback: function callback(controlView, elementView) { 1897 var elementViewHandlerID = self.getUniqueHandlerID(elementView.model.cid, elementView.$el); 1898 1899 if (elementViewHandlerID !== self.getUniqueHandlerID()) { 1900 return; 1901 } 1902 1903 self.onElementChange(controlView.model.get('name'), controlView, elementView); 1904 } 1905 }); 1906 } 1907 1908 if (self.onEditSettingsChange) { 1909 self.editorListeners.push({ 1910 event: 'change:editSettings', 1911 to: elementor.channels.editor, 1912 callback: function callback(changedModel, view) { 1913 if (view.model.cid !== self.getModelCID()) { 1914 return; 1915 } 1916 1917 self.onEditSettingsChange(Object.keys(changedModel.changed)[0]); 1918 } 1919 }); 1920 } 1921 1922 ['page', 'general'].forEach(function (settingsType) { 1923 var listenerMethodName = 'on' + settingsType[0].toUpperCase() + settingsType.slice(1) + 'SettingsChange'; 1924 1925 if (self[listenerMethodName]) { 1926 self.editorListeners.push({ 1927 event: 'change', 1928 to: elementor.settings[settingsType].model, 1929 callback: function callback(model) { 1930 self[listenerMethodName](model.changed); 1931 } 1932 }); 1933 } 1934 }); 1935 }, 1936 1937 getEditorListeners: function getEditorListeners() { 1938 if (!this.editorListeners) { 1939 this.initEditorListeners(); 1940 } 1941 1942 return this.editorListeners; 1943 }, 1944 1945 addEditorListeners: function addEditorListeners() { 1946 var uniqueHandlerID = this.getUniqueHandlerID(); 1947 1948 this.getEditorListeners().forEach(function (listener) { 1949 elementorFrontend.addListenerOnce(uniqueHandlerID, listener.event, listener.callback, listener.to); 1950 }); 1951 }, 1952 1953 removeEditorListeners: function removeEditorListeners() { 1954 var uniqueHandlerID = this.getUniqueHandlerID(); 1955 1956 this.getEditorListeners().forEach(function (listener) { 1957 elementorFrontend.removeListeners(uniqueHandlerID, listener.event, null, listener.to); 1958 }); 1959 }, 1960 1961 getElementName: function getElementName() { 1962 return this.$element.data('element_type').split('.')[0]; 1963 }, 1964 1965 getID: function getID() { 1966 return this.$element.data('id'); 1967 }, 1968 1969 getModelCID: function getModelCID() { 1970 return this.$element.data('model-cid'); 1971 }, 1972 1973 getElementSettings: function getElementSettings(setting) { 1974 var elementSettings = {}, 1975 modelCID = this.getModelCID(); 1976 1977 if (this.isEdit && modelCID) { 1978 var settings = elementorFrontend.config.elements.data[modelCID], 1979 settingsKeys = elementorFrontend.config.elements.keys[settings.attributes.widgetType || settings.attributes.elType]; 1980 1981 jQuery.each(settings.getActiveControls(), function (controlKey) { 1982 if (-1 !== settingsKeys.indexOf(controlKey)) { 1983 elementSettings[controlKey] = settings.attributes[controlKey]; 1984 } 1985 }); 1986 } else { 1987 elementSettings = this.$element.data('settings') || {}; 1988 } 1989 1990 return this.getItems(elementSettings, setting); 1991 }, 1992 1993 getEditSettings: function getEditSettings(setting) { 1994 var attributes = {}; 1995 1996 if (this.isEdit) { 1997 attributes = elementorFrontend.config.elements.editSettings[this.getModelCID()].attributes; 1998 } 1999 2000 return this.getItems(attributes, setting); 2001 }, 2002 2003 onDestroy: function onDestroy() { 2004 this.removeEditorListeners(); 2005 2006 if (this.unbindEvents) { 2007 this.unbindEvents(); 2008 } 2009 } 2010 }); 2011 }), 2012 /* 7 */ 2013 (function (module, exports, __webpack_require__) { 2014 2015 function CleverScrollTo($selector, settings) { 2016 var $ = jQuery, 2017 self = this, 2018 $window = $(window), 2019 $instance = $selector, 2020 checkTemps = $selector.find(".cafe-scrollto-sections-wrap").length, 2021 $htmlBody = $("html, body"), 2022 deviceType = $("body").data("elementor-device-mode"), 2023 $itemsList = $(".cafe-scrollto-nav-item", $instance), 2024 $menuItems = $(".cafe-scrollto-nav-menu-item", $instance), 2025 defaultSettings = { 2026 speed: 1000, 2027 offset: 1, 2028 fullSection: true 2029 }, 2030 settings = $.extend({}, defaultSettings, settings), 2031 sections = {}, 2032 currentSection = null, 2033 isScrolling = false;
2034 2035 jQuery.extend(jQuery.easing, { 2036 easeInOutCirc: function (x, t, b, c, d) { 2037 if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b; 2038 return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; 2039 } 2040 }); 2041 2042 self.checkNextSection = function (object, key) { 2043 var keys = Object.keys(object), 2044 idIndex = keys.indexOf(key), 2045 nextIndex = (idIndex += 1); 2046 2047 if (nextIndex >= keys.length) { 2048 return false; 2049 } 2050 2051 var nextKey = keys[nextIndex]; 2052 2053 return nextKey; 2054 }; 2055 2056 self.checkPrevSection = function (object, key) { 2057 var keys = Object.keys(object), 2058 idIndex = keys.indexOf(key), 2059 prevIndex = (idIndex -= 1); 2060 2061 if (0 > idIndex) { 2062 return false; 2063 } 2064 2065 var prevKey = keys[prevIndex]; 2066 2067 return prevKey; 2068 }; 2069 2070 self.debounce = function (threshold, callback) { 2071 var timeout; 2072 2073 return function debounced($event) { 2074 function delayed() { 2075 callback.call(this, $event); 2076 timeout = null; 2077 } 2078 2079 if (timeout) { 2080 clearTimeout(timeout); 2081 } 2082 2083 timeout = setTimeout(delayed, threshold); 2084 }; 2085 }; 2086 self.visible = function (selector, partial, hidden) { 2087 2088 var s = selector.get(0), 2089 vpHeight = $window.outerHeight(), 2090 clientSize = hidden === true ? s.offsetWidth * s.offsetHeight : true; 2091 if (typeof s.getBoundingClientRect === 'function') { 2092 var rec = s.getBoundingClientRect(); 2093 var tViz = rec.top >= 0 && rec.top < vpHeight, 2094 bViz = rec.bottom > 0 && rec.bottom <= vpHeight, 2095 vVisible = partial ? tViz || bViz : tViz && bViz, 2096 vVisible = (rec.top < 0 && rec.bottom > vpHeight) ? true : vVisible; 2097 return clientSize && vVisible; 2098 } else { 2099 var viewTop = 0,
2100 viewBottom = viewTop + vpHeight, 2101 position = $window.position(), 2102 _top = position.top, 2103 _bottom = _top + $window.height(), 2104 compareTop = partial === true ? _bottom : _top, 2105 compareBottom = partial === true ? _top : _bottom; 2106 return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop)); 2107 } 2108 2109 }; 2110 2111 self.init = function () { 2112 self.setSectionsData(); 2113 $itemsList.on("click.premiumVerticalScroll", self.onNavDotChange); 2114 $menuItems.on("click.premiumVerticalScroll", self.onNavDotChange); 2115 2116 $itemsList.on("mouseenter.premiumVerticalScroll", self.onNavDotEnter); 2117 2118 $itemsList.on("mouseleave.premiumVerticalScroll", self.onNavDotLeave); 2119 2120 if (deviceType === "desktop") { 2121 $window.on("scroll.premiumVerticalScroll", self.onWheel); 2122 } 2123 $window.on( 2124 "resize.premiumVerticalScroll orientationchange.premiumVerticalScroll", 2125 self.debounce(50, self.onResize) 2126 ); 2127 $window.on("load", function () { 2128 self.setSectionsData(); 2129 }); 2130 2131 $(document).keydown(function (event) { 2132 if (38 == event.keyCode) { 2133 self.onKeyUp(event, "up"); 2134 } 2135 2136 if (40 == event.keyCode) { 2137 self.onKeyUp(event, "down"); 2138 } 2139 }); 2140 if (settings.fullSection) { 2141 var vSection = document.getElementById($instance.attr("id")); 2142 if (checkTemps) { 2143 document.addEventListener ? 2144 vSection.addEventListener("wheel", self.onWheel, !1) : 2145 vSection.attachEvent("onmousewheel", self.onWheel); 2146 } else { 2147 document.addEventListener ? 2148 document.addEventListener("wheel", self.onWheel, !1) : 2149 document.attachEvent("onmousewheel", self.onWheel); 2150 } 2151 } 2152 2153 for (var section in sections) { 2154 var $section = sections[section].selector; 2155 elementorFrontend.waypoint( 2156 $section, 2157 function (direction) { 2158 var $this = $(this), 2159 sectionId = $this.attr("id"); 2160 if ("down" === direction && !isScrolling) { 2161 currentSection = sectionId; 2162 $itemsList.removeClass("active"); 2163 $menuItems.removeClass("active"); 2164 $("[data-menuanchor=" + sectionId + "]", $instance).addClass( 2165 "active" 2166 ); 2167 } 2168 }, { 2169 offset: "95%", 2170 triggerOnce: false 2171 } 2172 ); 2173 2174 elementorFrontend.waypoint( 2175 $section, 2176 function (direction) { 2177 var $this = $(this), 2178 sectionId = $this.attr("id"); 2179 if ("up" === direction && !isScrolling) { 2180 currentSection = sectionId; 2181 $itemsList.removeClass("active"); 2182 $menuItems.removeClass("active"); 2183 $("[data-menuanchor=" + sectionId + "]", $instance).addClass( 2184 "active" 2185 ); 2186 } 2187 }, { 2188 offset: "0%", 2189 triggerOnce: false 2190 } 2191 ); 2192 } 2193 }; 2194 2195 self.setSectionsData = function () { 2196 $itemsList.each(function () { 2197 var $this = $(this), 2198 sectionId = $this.data("menuanchor"), 2199 $section = $("#" + sectionId); 2200 if ($section[0]) { 2201 sections[sectionId] = { 2202 selector: $section, 2203 offset: Math.round($section.offset().top), 2204 height: $section.outerHeight() 2205 }; 2206 } 2207 }); 2208 }; 2209 2210 self.onNavDotEnter = function () { 2211 var $this = $(this), 2212 index = $this.data("index"); 2213 if (settings.tooltips) { 2214 $('<div class="cafe-scrollto-nav-item-tooltip"><span>' + $this.data('label') + '</span></div>').hide().appendTo($this).fadeIn(200); 2215 } 2216 }; 2217 2218 self.onNavDotLeave = function () { 2219 $(".cafe-scrollto-nav-item-tooltip").fadeOut(200, function () { 2220 $(this).remove(); 2221 }); 2222 }; 2223 2224 self.onNavDotChange = function (event) { 2225 var $this = $(this), 2226 index = $this.index(), 2227 sectionId = $this.data("menuanchor"), 2228 offset = null; 2229 2230 if (!sections.hasOwnProperty(sectionId)) { 2231 return false;
2232 } 2233 2234 offset = sections[sectionId].offset - settings.offset; 2235 2236 if (!isScrolling) { 2237 isScrolling = true; 2238 2239 currentSection = sectionId; 2240 $menuItems.removeClass("active"); 2241 $itemsList.removeClass("active"); 2242 2243 if ($this.hasClass("cafe-scrollto-nav-menu-item")) { 2244 $($itemsList[index]).addClass("active"); 2245 } else { 2246 $($menuItems[index]).addClass("active"); 2247 } 2248 2249 $this.addClass("active"); 2250 2251 $htmlBody 2252 .stop() 2253 .clearQueue() 2254 .animate({ 2255 scrollTop: offset 2256 }, 2257 settings.speed, 2258 "easeInOutCirc", 2259 function () { 2260 isScrolling = false; 2261 } 2262 ); 2263 } 2264 }; 2265 2266 self.onKeyUp = function (event, direction) { 2267 var direction = direction || "up", 2268 sectionId, 2269 nextItem = $( 2270 ".cafe-scrollto-nav-item[data-menuanchor=" + currentSection + "]", 2271 $instance 2272 ).next(), 2273 prevItem = $( 2274 ".cafe-scrollto-nav-item[data-menuanchor=" + currentSection + "]", 2275 $instance 2276 ).prev(); 2277 2278 event.preventDefault(); 2279 2280 if (isScrolling) { 2281 return false; 2282 } 2283 2284 if ("up" === direction) { 2285 if (prevItem[0]) { 2286 prevItem.trigger("click.premiumVerticalScroll"); 2287 } 2288 } 2289 2290 if ("down" === direction) { 2291 if (nextItem[0]) { 2292 nextItem.trigger("click.premiumVerticalScroll"); 2293 } 2294 } 2295 }; 2296 2297 self.onScroll = function (event) { 2298 /* On Scroll Event */ 2299 if (isScrolling) { 2300 event.preventDefault(); 2301 } 2302 }; 2303 2304 function getFirstSection(object) { 2305 return Object.keys(object)[0]; 2306 } 2307 2308 function getLastSection(object) { 2309 return Object.keys(object)[Object.keys(object).length - 1]; 2310 } 2311 2312 function getDirection(e) { 2313 e = window.event || e; 2314 var t = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY || -e.detail)); 2315 return t; 2316 } 2317 2318 self.onWheel = function (event) { 2319 if (isScrolling) { 2320 event.preventDefault(); 2321 return false; 2322 } 2323 2324 var $target = $(event.target), 2325 sectionSelector = checkTemps ? 2326 ".cafe-scrollto-temp" : 2327 ".elementor-top-section", 2328 $section = $target.closest(sectionSelector), 2329 $vTarget = self.visible($instance, true, false), 2330 sectionId = $section.attr("id"), 2331 offset = 0, 2332 newSectionId = false, 2333 prevSectionId = false, 2334 nextSectionId = false, 2335 delta = getDirection(event), 2336 direction = 0 > delta ? "down" : "up", 2337 windowScrollTop = $window.scrollTop(), 2338 dotIndex = $(".cafe-scrollto-nav-item.active").index(); 2339 if ("mobile" === deviceType || "tablet" === deviceType) { 2340 $(".cafe-scrollto-nav-item-tooltip").hide(); 2341 if (dotIndex === $itemsList.length - 1 && !$vTarget) { 2342 $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass( 2343 "cafe-scrollto-nav-icons-hide" 2344 ); 2345 } else if (dotIndex === 0 && !$vTarget) { 2346 if ($instance.offset().top - $(document).scrollTop() > 200) { 2347 $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass( 2348 "cafe-scrollto-nav-icons-hide" 2349 ); 2350 } 2351 } else { 2352 $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").removeClass( 2353 "cafe-scrollto-nav-icons-hide" 2354 ); 2355 } 2356 } 2357 2358 if (beforeCheck()) { 2359 sectionId = getFirstSection(sections); 2360 } 2361 2362 if (afterCheck()) { 2363 sectionId = getLastSection(sections); 2364 } 2365 if (sectionId && sections.hasOwnProperty(sectionId)) { 2366 prevSectionId = self.checkPrevSection(sections, sectionId); 2367 nextSectionId = self.checkNextSection(sections, sectionId); 2368 if ("up" === direction) { 2369 if (!nextSectionId && sections[sectionId].offset < windowScrollTop) { 2370 newSectionId = sectionId; 2371 } else { 2372 newSectionId = prevSectionId; 2373 } 2374 } 2375 2376 if ("down" === direction) { 2377 if ( 2378 !prevSectionId && 2379 sections[sectionId].offset > windowScrollTop + 5 2380 ) { 2381 newSectionId = sectionId; 2382 } else { 2383 newSectionId = nextSectionId; 2384 } 2385 } 2386 2387 if (newSectionId) { 2388 $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").removeClass( 2389 "cafe-scrollto-nav-icons-hide" 2390 ); 2391 event.preventDefault(); 2392 offset = sections[newSectionId].offset - settings.offset; 2393 currentSection = newSectionId; 2394 $itemsList.removeClass("active"); 2395 $menuItems.removeClass("active"); 2396 $("[data-menuanchor=" + newSectionId + "]", $instance).addClass( 2397 "active" 2398 ); 2399 2400 isScrolling = true; 2401 self.scrollStop(); 2402 $htmlBody.animate({ 2403 scrollTop: offset 2404 }, 2405 settings.speed, 2406 "easeInOutCirc", 2407 function () { 2408 isScrolling = false;
2409 } 2410 ); 2411 } else { 2412 var $lastselector = checkTemps ? $instance : $("#" + sectionId); 2413 if ("down" === direction) { 2414 if ( 2415 $lastselector.offset().top + 2416 $lastselector.innerHeight() - 2417 $(document).scrollTop() > 2418 600 2419 ) { 2420 $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass( 2421 "cafe-scrollto-nav-icons-hide" 2422 ); 2423 } 2424 } else if ("up" === direction) { 2425 if ($lastselector.offset().top - $(document).scrollTop() > 200) { 2426 $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass( 2427 "cafe-scrollto-nav-icons-hide" 2428 ); 2429 } 2430 } 2431 } 2432 } 2433 } 2434 2435 function beforeCheck(event) { 2436 var windowScrollTop = $window.scrollTop(), 2437 firstSectionId = getFirstSection(sections), 2438 offset = sections[firstSectionId].offset, 2439 topBorder = windowScrollTop + $window.outerHeight(), 2440 visible = self.visible($instance, true, false); 2441 2442 if (topBorder > offset) { 2443 return false; 2444 } else if (visible) { 2445 return true; 2446 } 2447 return false; 2448 } 2449 2450 function afterCheck(event) { 2451 var windowScrollTop = $window.scrollTop(), 2452 lastSectionId = getLastSection(sections), 2453 offset = sections[lastSectionId].offset, 2454 bottomBorder = 2455 sections[lastSectionId].offset + sections[lastSectionId].height, 2456 visible = self.visible($instance, true, false); 2457 2458 if (windowScrollTop < bottomBorder) { 2459 return false; 2460 } else if (visible) { 2461 return true; 2462 } 2463 2464 return false; 2465 } 2466 2467 self.onResize = function (event) { 2468 self.setSectionsData(); 2469 }; 2470 2471 self.scrollStop = function () { 2472 $htmlBody.stop(true); 2473 }; 2474 } 2475 2476 module.exports = function ($scope) { 2477 var section = $scope.find(".cafe-scrollto-section"); 2478 var module = new CleverScrollTo(section, section.data("settings")); 2479 module.init(); 2480 } 2481 }) 2482]);
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.