1(function () { 2 var widgetHandler = function ($scope, $) { 3 const fallback = $scope.find("> div > div > .dce-posts-fallback"); 4 if (fallback.length !== 0) { 5 // no posts where found, nothing to do. 6 return; 7 } 8 9 var elementSettings = dceGetElementSettings($scope); 10 var id_scope = $scope.attr("data-id"); 11 var id_post = $scope.attr("data-post-id"); 12 var elementSwiper = $scope.find( 13 ".dce-posts-container.dce-skin-carousel", 14 ); 15 let mainSwiper = null; 16 var isCarouselEnabled = false; 17 var centeredSlides = Boolean( 18 elementSettings[dceDynamicPostsSkinPrefix + "centeredSlides"], 19 ); 20 var centerInsufficientSlides = elementSettings[dceDynamicPostsSkinPrefix + "centerInsufficientSlides"] === 'yes'; 21 22 var infiniteLoop = Boolean( 23 elementSettings[dceDynamicPostsSkinPrefix + "loop"], 24 ); 25 var slideInitNum = 0; 26 var slidesPerView = Number( 27 elementSettings[dceDynamicPostsSkinPrefix + "slidesPerView"], 28 ); 29 30 if (elementSettings.carousel_match_height) { 31 if (elementSettings.style_items === "template") { 32 if ($scope.find(".e-con")) { 33 // select all top level containers: 34 $scope 35 .find(".e-con") 36 .not($scope.find(".e-con .e-con")) 37 .matchHeight(); 38 } else if ( 39 $scope.find(".dce-post-block .elementor-inner-section") 40 .length 41 ) { 42 $scope 43 .find(".dce-post-block") 44 .first() 45 .find(".elementor-inner-section") 46 .each((i) => { 47 let $els = $scope 48 .find(".dce-post-block") 49 .map((_, $e) => { 50 return jQuery($e).find( 51 ".elementor-inner-section", 52 )[i]; 53 }); 54 $els.matchHeight(); 55 }); 56 } else { 57 selector = ".dce-post-block .elementor-top-section"; 58 $scope.find(selector).matchHeight(); 59 } 60 } else { 61 selector = ".dce-post-block"; 62 $scope.find(selector).matchHeight(); 63 } 64 } 65 66 let nextElement = $scope.find(".swiper-button-right")[0]; 67 let prevElement = $scope.find(".swiper-button-left")[0]; 68 if (Boolean(elementSettings["rtl"])) { 69 let temp = nextElement; 70 nextElement = prevElement; 71 prevElement = temp; 72 } 73 74 // Prevent text selection on navigation buttons 75 if (nextElement) { 76 nextElement.addEventListener('mousedown', function(e) { 77 e.preventDefault(); 78 }); 79 // Keyboard accessibility for navigation buttons 80 nextElement.addEventListener('keydown', function(e) { 81 if (e.key === 'Enter' || e.key === ' ') { 82 e.preventDefault(); 83 nextElement.click(); 84 } 85 }); 86 } 87 if (prevElement) { 88 prevElement.addEventListener('mousedown', function(e) { 89 e.preventDefault(); 90 }); 91 // Keyboard accessibility for navigation buttons 92 prevElement.addEventListener('keydown', function(e) { 93 if (e.key === 'Enter' || e.key === ' ') { 94 e.preventDefault(); 95 prevElement.click(); 96 } 97 }); 98 } 99 100 var sliderEffect = 101 elementSettings[dceDynamicPostsSkinPrefix + "effects"] || 102 "slide"; 103 sliderEffect = String(sliderEffect); 104 105 var mainSwiperOptions = { 106 observer: true, 107 observeParents: true, 108 direction: 109 String( 110 elementSettings[ 111 dceDynamicPostsSkinPrefix + "direction_slider" 112 ], 113 ) || "horizontal", //vertical 114 initialSlide: slideInitNum, 115 reverseDirection: Boolean(elementSettings["rtl"]), 116 speed: 117 Number( 118 elementSettings[dceDynamicPostsSkinPrefix + "speed_slider"], 119 ) || 300, 120 autoHeight: Boolean( 121 elementSettings[dceDynamicPostsSkinPrefix + "autoHeight"], 122 ), // Set to true and slider wrapper will adopt its height to the height of the currently active slide 123 effect: sliderEffect, 124 cubeEffect: { 125 shadow: Boolean( 126 elementSettings[dceDynamicPostsSkinPrefix + "cube_shadow"], 127 ), 128 slideShadows: Boolean( 129 elementSettings[dceDynamicPostsSkinPrefix + "slideShadows"], 130 ), 131 shadowOffset: 20, 132 shadowScale: 0.94, 133 }, 134 coverflowEffect: { 135 rotate: 50, 136 stretch: 137 Number( 138 elementSettings[ 139 dceDynamicPostsSkinPrefix + "coverflow_stretch" 140 ], 141 ) || 0, 142 depth: 100, 143 modifier: 144 Number( 145 elementSettings[ 146 dceDynamicPostsSkinPrefix + "coverflow_modifier" 147 ], 148 ) || 1, 149 slideShadows: Boolean( 150 elementSettings[dceDynamicPostsSkinPrefix + "slideShadows"], 151 ), 152 }, 153 flipEffect: { 154 rotate: 30, 155 slideShadows: Boolean( 156 elementSettings[dceDynamicPostsSkinPrefix + "slideShadows"], 157 ), 158 limitRotation: true, 159 }, 160 fadeEffect: { 161 crossFade: true, 162 }, 163 initialSlide: 164 Number( 165 elementSettings[dceDynamicPostsSkinPrefix + "initialSlide"], 166 ) || 0, 167 slidesPerView: slidesPerView || "auto", 168 slidesPerGroup: 169 Number( 170 elementSettings[ 171 dceDynamicPostsSkinPrefix + "slidesPerGroup" 172 ], 173 ) || 1, // Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1 174 slidesPerColumn: 175 Number( 176 elementSettings[dceDynamicPostsSkinPrefix + "slidesColumn"], 177 ) || 1, // Number of slides per column, for multirow layout 178 spaceBetween: 179 Number( 180 elementSettings[dceDynamicPostsSkinPrefix + "spaceBetween"], 181 ) || 0, 182 slidesOffsetBefore: 183 Number( 184 elementSettings[ 185 dceDynamicPostsSkinPrefix + "slidesOffsetBefore" 186 ], 187 ) || 0, // Add (in px) additional slide offset in the beginning of the container (before all slides) 188 slidesOffsetAfter: 189 Number( 190 elementSettings[ 191 dceDynamicPostsSkinPrefix + "slidesOffsetAfter" 192 ], 193 ) || 0, // Add (in px) additional slide offset in the end of the container (after all slides) 194 slidesPerColumnFill: 195 String( 196 elementSettings[ 197 dceDynamicPostsSkinPrefix + "slidesPerColumnFill" 198 ], 199 ) || "row", // Could be 'column' or 'row'. Defines how slides should fill rows, by column or by row 200 centerInsufficientSlides: centerInsufficientSlides, 201 centeredSlides: centeredSlides,
202 centeredSlidesBounds: Boolean( 203 elementSettings[ 204 dceDynamicPostsSkinPrefix + "centeredSlidesBounds" 205 ], 206 ), 207 grabCursor: Boolean( 208 elementSettings[dceDynamicPostsSkinPrefix + "grabCursor"], 209 ), 210 freeMode: Boolean( 211 elementSettings[dceDynamicPostsSkinPrefix + "freeMode"], 212 ), 213 freeModeMomentum: Boolean( 214 elementSettings[dceDynamicPostsSkinPrefix + "freeModeMomentum"], 215 ), 216 freeModeMomentumRatio: 217 Number( 218 elementSettings[ 219 dceDynamicPostsSkinPrefix + "freeModeMomentumRatio" 220 ], 221 ) || 1, 222 freeModeMomentumVelocityRatio: 223 Number( 224 elementSettings[ 225 dceDynamicPostsSkinPrefix + 226 "freeModeMomentumVelocityRatio" 227 ], 228 ) || 1, 229 freeModeMomentumBounce: Boolean( 230 elementSettings[ 231 dceDynamicPostsSkinPrefix + "freeModeMomentumBounce" 232 ], 233 ), 234 freeModeMomentumBounceRatio: 235 Number(elementSettings[dceDynamicPostsSkinPrefix + "speed"]) || 236 1, 237 freeModeMinimumVelocity: 238 Number(elementSettings[dceDynamicPostsSkinPrefix + "speed"]) || 239 0.02, 240 freeModeSticky: Boolean( 241 elementSettings[dceDynamicPostsSkinPrefix + "freeModeSticky"], 242 ), 243 loop: infiniteLoop, 244 navigation: { 245 nextEl: nextElement, 246 prevEl: prevElement, 247 }, 248 pagination: { 249 el: id_post 250 ? ".elementor-element-" + 251 id_scope + 252 '[data-post-id="' + 253 id_post + 254 '"] .pagination-' + 255 id_scope 256 : ".pagination-" + id_scope, 257 clickable: true, 258 type: 259 String( 260 elementSettings[ 261 dceDynamicPostsSkinPrefix + "pagination_type" 262 ], 263 ) || "bullets", 264 dynamicBullets: Boolean( 265 elementSettings[ 266 dceDynamicPostsSkinPrefix + "dynamicBullets" 267 ], 268 ), 269 renderBullet: function (index, className) { 270 var indexLabel = 271 !Boolean( 272 elementSettings[ 273 dceDynamicPostsSkinPrefix + "dynamicBullets" 274 ], 275 ) && 276 Boolean( 277 elementSettings[ 278 dceDynamicPostsSkinPrefix + "bullets_numbers" 279 ], 280 ) 281 ? '<span class="swiper-pagination-bullet-title">' + 282 (index + 1) + 283 "</span>" 284 : ""; 285 return ( 286 '<span class="' + 287 className + 288 '">' + 289 indexLabel + 290 "</span>" 291 ); 292 }, 293 renderFraction: function (currentClass, totalClass) { 294 if (!Boolean(elementSettings["rtl"])) { 295 return ( 296 '<span class="' + 297 currentClass + 298 '"></span>' + 299 '<span class="separator">' + 300 String( 301 elementSettings[ 302 dceDynamicPostsSkinPrefix + 303 "fraction_separator" 304 ], 305 ) + 306 "</span>" + 307 '<span class="' + 308 totalClass + 309 '"></span>' 310 ); 311 } 312 return ( 313 '<span class="' + 314 totalClass + 315 '"></span>' + 316 '<span class="separator">' + 317 String( 318 elementSettings[ 319 dceDynamicPostsSkinPrefix + "fraction_separator" 320 ], 321 ) + 322 "</span>" + 323 '<span class="' + 324 currentClass + 325 '"></span>' 326 ); 327 }, 328 renderProgressbar: function (progressbarFillClass) { 329 return '<span class="' + progressbarFillClass + '"></span>'; 330 }, 331 }, 332 scrollbar: { 333 el: $scope.find(".swiper-scrollbar")[0], 334 hide: Boolean( 335 elementSettings[ 336 dceDynamicPostsSkinPrefix + "scrollbar_hide" 337 ], 338 ), 339 draggable: Boolean( 340 elementSettings[ 341 dceDynamicPostsSkinPrefix + "scrollbar_draggable" 342 ], 343 ), 344 snapOnRelease: true, // Set to true to snap slider position to slides when you release scrollbar 345 }, 346 mousewheel: elementSettings[ 347 dceDynamicPostsSkinPrefix + "mousewheelControl" 348 ] 349 ? { 350 releaseOnEdges: true, 351 } 352 : false, 353 keyboard: { 354 enabled: Boolean( 355 elementSettings[ 356 dceDynamicPostsSkinPrefix + "keyboardControl" 357 ], 358 ), 359 }, 360 }; 361 362 // Cube effect with loop: prevent duplicate slide content 363 // Cube effect requires explicit loopedSlides count because it pre-calculates 364 // 3D transformations for all faces (including duplicates) to avoid visual glitches 365 if ("cube" === sliderEffect && infiniteLoop) { 366 var sliderSlidesCount = elementSwiper.find(".swiper-slide").length; 367 if (sliderSlidesCount > 0) { 368 // Tell Swiper exactly how many slides to duplicate for seamless 3D loop 369 mainSwiperOptions.loopedSlides = sliderSlidesCount; 370 // Add additional duplicates to ensure smooth transitions between faces 371 mainSwiperOptions.loopAdditionalSlides = sliderSlidesCount; 372 // Disable automatic limit to use our exact count 373 mainSwiperOptions.loopedSlidesLimit = false;
374 } 375 } 376 377 if (elementSettings[dceDynamicPostsSkinPrefix + "useAutoplay"]) { 378 mainSwiperOptions = $.extend(mainSwiperOptions, { 379 autoplay: { 380 delay: 381 Number( 382 elementSettings[ 383 dceDynamicPostsSkinPrefix + "autoplay" 384 ], 385 ) || 3000, 386 disableOnInteraction: Boolean( 387 elementSettings[ 388 dceDynamicPostsSkinPrefix + 389 "autoplayDisableOnInteraction" 390 ], 391 ), 392 stopOnLastSlide: Boolean( 393 elementSettings[ 394 dceDynamicPostsSkinPrefix + "autoplayStopOnLast" 395 ], 396 ), 397 }, 398 }); 399 } 400 401 mainSwiperOptions.breakpoints = dynamicooo.makeSwiperBreakpoints( 402 { 403 slidesPerView: { 404 elementor_key: "slidesPerView", 405 default_value: "auto", 406 }, 407 slidesPerGroup: { 408 elementor_key: "slidesPerGroup", 409 default_value: 1, 410 }, 411 spaceBetween: { 412 elementor_key: "spaceBetween", 413 default_value: 1, 414 }, 415 slidesPerColumn: { 416 elementor_key: "slidesColumn", 417 default_value: 1, 418 }, 419 slidesOffsetBefore: { 420 elementor_key: "slidesOffsetBefore", 421 default_value: 0, 422 }, 423 slidesOffsetAfter: { 424 elementor_key: "slidesOffsetAfter", 425 default_value: 0, 426 }, 427 }, 428 elementSettings, 429 dceDynamicPostsSkinPrefix, 430 ); 431 432 mainSwiperOptions.grid = { 433 rows: mainSwiperOptions.slidesPerColumn || 1, 434 fill: mainSwiperOptions.slidesPerColumnFill || "row", 435 }; 436 437 438 if ("dualcarousel" === dceDynamicPostsSkin) { 439 let dualCarouselSlidesPerView = Number( 440 elementSettings[ 441 dceDynamicPostsSkinPrefix + "thumbnails_slidesPerView" 442 ], 443 ); 444 445 let dualCarouselSwiperOptions = { 446 spaceBetween: 447 Number( 448 elementSettings[ 449 dceDynamicPostsSkinPrefix + "dualcarousel_gap" 450 ], 451 ) || 0, 452 slidesPerView: dualCarouselSlidesPerView || "auto", 453 autoHeight: true, 454 watchOverflow: true, 455 watchSlidesProgress: true, 456 centeredSlides: Boolean(elementSettings[dceDynamicPostsSkinPrefix + "thumbnails_centered"]), 457 loop: Boolean(elementSettings[dceDynamicPostsSkinPrefix + "thumbnails_loop"]), 458 }; 459 460 dualCarouselSwiperOptions.breakpoints = 461 dynamicooo.makeSwiperBreakpoints( 462 { 463 slidesPerView: { 464 elementor_key: "thumbnails_slidesPerView", 465 default_value: "auto", 466 }, 467 spaceBetween: { 468 elementor_key: "dualcarousel_gap", 469 default_value: 0, 470 }, 471 }, 472 elementSettings, 473 dceDynamicPostsSkinPrefix, 474 ); 475 476 initSwiperThumbs(dualCarouselSwiperOptions); 477 } 478 479 function initSwiperThumbs(dualCarouselSwiperOptions) { 480 let thumbsContainer = $scope.find( 481 ".dce-dualcarousel-gallery-thumbs", 482 ); 483 let swiperThumbs; 484 mainSwiperOptions.on = mainSwiperOptions.on || {}; 485 mainSwiperOptions.on.slideChange = function (e) { 486 swiperThumbs.slideToLoop(this.realIndex); 487 }; 488 const asyncSwiper = elementorFrontend.utils.swiper; 489 490 new asyncSwiper(thumbsContainer, dualCarouselSwiperOptions) 491 .then((newSwiperInstance) => { 492 swiperThumbs = newSwiperInstance; 493 mainSwiperOptions.thumbs = { 494 swiper: swiperThumbs, 495 }; 496 initSwiperCarousel(); 497 }) 498 .catch((error) => console.log(error)); 499 } 500 501 function initSwiperCarousel() { 502 const asyncSwiper = elementorFrontend.utils.swiper; 503 new asyncSwiper(elementSwiper, mainSwiperOptions) 504 .then((newSwiperInstance) => { 505 mainSwiper = newSwiperInstance; 506 }) 507 .catch((error) => console.log(error)); 508 } 509 510 if (elementSwiper.length && "dualcarousel" !== dceDynamicPostsSkin) { 511 initSwiperCarousel(); 512 } 513 514 // Callback function executed when mutations occur 515 var handleCarouselClassChange = function (mutationsList, observer) { 516 for (var mutation of mutationsList) { 517 if ( 518 mutation.type === "attributes" && 519 mutation.attributeName === "class" && 520 isCarouselEnabled 521 ) { 522 mainSwiper.update(); 523 } 524 } 525 }; 526 527 dceObserveElement($scope[0], handleCarouselClassChange); 528 }; 529 530 const addActions = () => { 531 elementorFrontend.hooks.addAction( 532 "frontend/element_ready/dce-dynamicposts-v2.carousel", 533 widgetHandler, 534 ); 535 elementorFrontend.hooks.addAction( 536 "frontend/element_ready/dce-woo-products-cart.carousel", 537 widgetHandler, 538 ); 539 elementorFrontend.hooks.addAction( 540 "frontend/element_ready/dce-dynamic-woo-products.carousel", 541 widgetHandler, 542 ); 543 elementorFrontend.hooks.addAction( 544 "frontend/element_ready/dce-dynamic-woo-products-on-sale.carousel", 545 widgetHandler, 546 ); 547 elementorFrontend.hooks.addAction( 548 "frontend/element_ready/dce-woo-product-upsells.carousel", 549 widgetHandler, 550 ); 551 elementorFrontend.hooks.addAction( 552 "frontend/element_ready/dce-woo-product-crosssells.carousel", 553 widgetHandler, 554 ); 555 elementorFrontend.hooks.addAction( 556 "frontend/element_ready/dce-dynamic-show-favorites.carousel", 557 widgetHandler, 558 ); 559 elementorFrontend.hooks.addAction( 560 "frontend/element_ready/dce-my-posts.carousel", 561 widgetHandler, 562 ); 563 elementorFrontend.hooks.addAction( 564 "frontend/element_ready/dce-dynamic-archives.carousel", 565 widgetHandler, 566 ); 567 elementorFrontend.hooks.addAction( 568 "frontend/element_ready/dce-sticky-posts.carousel", 569 widgetHandler, 570 ); 571 elementorFrontend.hooks.addAction( 572 "frontend/element_ready/dce-search-results.carousel", 573 widgetHandler, 574 ); 575 elementorFrontend.hooks.addAction( 576 "frontend/element_ready/dce-woo-products-variations.carousel", 577 widgetHandler, 578 ); 579 elementorFrontend.hooks.addAction( 580 "frontend/element_ready/dce-dynamicposts-v2.dualcarousel", 581 widgetHandler, 582 ); 583 elementorFrontend.hooks.addAction( 584 "frontend/element_ready/dce-woo-products-cart.dualcarousel", 585 widgetHandler, 586 ); 587 elementorFrontend.hooks.addAction( 588 "frontend/element_ready/dce-woo-products-cart-on-sale.dualcarousel", 589 widgetHandler, 590 ); 591 elementorFrontend.hooks.addAction( 592 "frontend/element_ready/dce-dynamic-woo-products.dualcarousel", 593 widgetHandler, 594 ); 595 elementorFrontend.hooks.addAction( 596 "frontend/element_ready/dce-woo-products-variations.dualcarousel", 597 widgetHandler, 598 ); 599 elementorFrontend.hooks.addAction( 600 "frontend/element_ready/dce-woo-product-upsells.dualcarousel", 601 widgetHandler, 602 ); 603 elementorFrontend.hooks.addAction( 604 "frontend/element_ready/dce-woo-product-crosssells.dualcarousel", 605 widgetHandler, 606 ); 607 elementorFrontend.hooks.addAction( 608 "frontend/element_ready/dce-dynamic-show-favorites.dualcarousel", 609 widgetHandler, 610 ); 611 elementorFrontend.hooks.addAction( 612 "frontend/element_ready/dce-my-posts.dualcarousel", 613 widgetHandler, 614 ); 615 elementorFrontend.hooks.addAction( 616 "frontend/element_ready/dce-dynamic-archives.dualcarousel", 617 widgetHandler, 618 ); 619 elementorFrontend.hooks.addAction( 620 "frontend/element_ready/dce-sticky-posts.dualcarousel", 621 widgetHandler, 622 ); 623 elementorFrontend.hooks.addAction( 624 "frontend/element_ready/dce-search-results.dualcarousel", 625 widgetHandler, 626 ); 627 elementorFrontend.hooks.addAction( 628 "frontend/element_ready/dce-metabox-relationship.carousel", 629 widgetHandler, 630 ); 631 elementorFrontend.hooks.addAction( 632 "frontend/element_ready/dce-metabox-relationship.dualcarousel", 633 widgetHandler, 634 ); 635 elementorFrontend.hooks.addAction( 636 "frontend/element_ready/dce-acf-relationship.carousel", 637 widgetHandler, 638 ); 639 elementorFrontend.hooks.addAction( 640 "frontend/element_ready/dce-acf-relationship.dualcarousel", 641 widgetHandler, 642 ); 643 }; 644 if ( 645 typeof elementorFrontend === "object" && 646 elementorFrontend.hasOwnProperty("hooks") 647 ) { 648 addActions(); 649 } else { 650 jQuery(window).on("elementor/frontend/init", addActions); 651 } 652})();
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.