1(function ($) { 2 3 if ('undefined' == typeof window.paCheckSafari) { 4 window.paCheckSafari = checkSafariBrowser(); 5 6 function checkSafariBrowser() { 7 8 var iOS = /iP(hone|ad|od)/i.test(navigator.userAgent) && !window.MSStream; 9 10 if (iOS) { 11 var allowedBrowser = /(Chrome|CriOS|OPiOS|FxiOS)/.test(navigator.userAgent); 12 13 if (!allowedBrowser) { 14 var isFireFox = '' === navigator.vendor; 15 allowedBrowser = allowedBrowser || isFireFox; 16 } 17 18 var isSafari = /WebKit/i.test(navigator.userAgent) && !allowedBrowser; 19 20 } else { 21 var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); 22 } 23 24 if (isSafari) { 25 return true; 26 } 27 28 return false; 29 } 30 31 } 32 33 $(window).on('elementor/frontend/init', function () { 34 var paFloatingEffects = elementorModules.frontend.handlers.Base.extend({ 35 36 floatingTarget: null, 37 38 targetSelector: null, 39 40 onInit: function () { 41 42 elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments); 43 44 //Return if animations should be disabled on Safari. 45 if (this.$element.hasClass('premium-disable-fe-yes') && window.paCheckSafari) 46 return; 47 48 var targetSelector = '' !== this.getElementSettings('premium_fe_target') ? this.getElementSettings('premium_fe_target') : ''; 49 50 this.setFloatingTarget(targetSelector); 51 52 if (this.$element.hasClass('premium-floating-effects-yes')) { 53 54 this.run(); 55 56 } else if (elementorFrontend.isEditMode()) { 57 58 if (anime.running.length) { 59 // Remove the animation if disabled in the editor. 60 this.removeFloatingAnimation(true); 61 } 62 } 63 64 }, 65 66 onElementChange: function (propertyName) { 67 if ('premium_fe_switcher' === propertyName) { 68 anime.remove(this.floatingTarget); 69 this.resetTargetProps(); 70 } 71 }, 72 73 run: function () { 74 var _this = this, 75 eleSettings = this.getEffectSettings(); 76 77 var hasEffects = Object.keys(eleSettings.effectSettings).length; 78 79 // Reset effects before applying it. 80 // Fix: disabled effects still works in the editor. 81 if (elementorFrontend.isEditMode() || !hasEffects) { 82 this.removeFloatingAnimation(false); 83 } 84 85 // Using IntersectionObserverAPI. 86 var eleObserver = new IntersectionObserver(function (entries) { 87 entries.forEach(function (entry) { 88 if (entry.isIntersecting) { 89 _this.applyEffects(eleSettings); 90 eleObserver.unobserve(entry.target); // to only execute the callback func once. 91 } 92 }); 93 }); 94 95 eleObserver.observe(_this.$element[0]); 96 }, 97 98 removeFloatingAnimation: function (checkAnimation) { 99 // anime.js doesn't reset the manipulated properties, so we need to reset it manually. 100 var hasRunningAnime = checkAnimation ? this.hasRunningAnime() : true; 101 102 if (-1 !== hasRunningAnime) { 103 anime.remove(this.floatingTarget); 104 this.resetTargetProps(); 105 } 106 }, 107 108 hasRunningAnime: function () { 109 var currentTarget = this.targetSelector; 110 111 var hasRunningAnime = anime.running.findIndex(function (element) { 112 113 if (element.animatables && element.animatables.length > 0 && element.animatables[0].target) { 114 return $(element.animatables[0].target).is(currentTarget); 115 } 116 117 return false; 118 }); 119 120 return hasRunningAnime; 121 }, 122 123 resetTargetProps: function () { 124 $(this.floatingTarget).css({ 125 transform: 'inherit', 126 opacity: 'inherit', 127 filter: 'inherit', 128 // background: 'inherit' 129 }); 130 }, 131 132 setFloatingTarget: function (target) { 133 134 var $widgetContainer = this.$element[0]; 135 136 this.targetSelector = '.elementor-element-' + this.$element.data('id'); 137 138 if (target) { 139 // If the selector does not exists in the current widget, then search in the whole page. 140 $widgetContainer = this.$element.find(target).length > 0 ? '.elementor-element-' + this.$element.data('id') + ' ' + target : target; 141 this.targetSelector = $widgetContainer; 142 } 143 144 this.floatingTarget = $widgetContainer; 145 146 // Remove any previously attached event handlers to prevent multiple bindings. 147 $(this.floatingTarget).off('.paFloating'); 148 }, 149 150 getEffectSettings: function () { 151 var settings = this.getElementSettings(); 152 153 var easing = 'steps' === settings.premium_fe_easing ? 'steps(' + settings.premium_fe_ease_step + ')' : settings.premium_fe_easing, 154 translateEnabled = 'yes' === settings.premium_fe_translate_switcher, 155 rotateEnabled = 'yes' === settings.premium_fe_rotate_switcher, 156 scaleEnabled = 'yes' === settings.premium_fe_scale_switcher, 157 skewEnabled = 'yes' === settings.premium_fe_skew_switcher, 158 opacityEnabled = 'yes' === settings.premium_fe_opacity_switcher, 159 bgColorEnabled = 'yes' === settings.premium_fe_bg_color_switcher, 160 blurEnabled = 'yes' === settings.premium_fe_blur_switcher, 161 contrastEnabled = 'yes' === settings.premium_fe_contrast_switcher,
162 gScaleEnabled = 'yes' === settings.premium_fe_gScale_switcher, 163 hueEnabled = 'yes' === settings.premium_fe_hue_switcher, 164 brightEnabled = 'yes' === settings.premium_fe_brightness_switcher, 165 satEnabled = 'yes' === settings.premium_fe_saturate_switcher, 166 generalSettings = { 167 direction: settings.premium_fe_direction, 168 loop: 'default' === settings.premium_fe_loop ? true : settings.premium_fe_loop_number, 169 easing: easing, 170 target: '' !== settings.premium_fe_target ? settings.premium_fe_target : '', 171 trigger: settings.premium_fe_trigger, 172 }; 173 174 var eleSettings = { 175 general: generalSettings, 176 effectSettings: {} 177 }; 178 179 if (translateEnabled) { 180 eleSettings.effectSettings.translate = { 181 'x_param_from': settings.premium_fe_Xtranslate.sizes.from, 182 'x_param_to': settings.premium_fe_Xtranslate.sizes.to, 183 'y_param_from': settings.premium_fe_Ytranslate.sizes.from, 184 'y_param_to': settings.premium_fe_Ytranslate.sizes.to, 185 'duration': settings.premium_fe_trans_duration.size, 186 'delay': settings.premium_fe_trans_delay.size, 187 } 188 } 189 190 if (rotateEnabled) { 191 eleSettings.effectSettings.rotate = { 192 'x_param_from': settings.premium_fe_Xrotate.sizes.from, 193 'x_param_to': settings.premium_fe_Xrotate.sizes.to, 194 'y_param_from': settings.premium_fe_Yrotate.sizes.from, 195 'y_param_to': settings.premium_fe_Yrotate.sizes.to, 196 'z_param_from': settings.premium_fe_Zrotate.sizes.from, 197 'z_param_to': settings.premium_fe_Zrotate.sizes.to, 198 'duration': settings.premium_fe_rotate_duration.size, 199 'delay': settings.premium_fe_rotate_delay.size, 200 } 201 } 202 203 if (scaleEnabled) { 204 eleSettings.effectSettings.scale = { 205 'x_param_from': settings.premium_fe_Xscale.sizes.from, 206 'x_param_to': settings.premium_fe_Xscale.sizes.to, 207 'y_param_from': settings.premium_fe_Yscale.sizes.from, 208 'y_param_to': settings.premium_fe_Yscale.sizes.to, 209 'duration': settings.premium_fe_scale_duration.size, 210 'delay': settings.premium_fe_scale_delay.size, 211 } 212 } 213 214 if (skewEnabled) { 215 eleSettings.effectSettings.skew = { 216 'x_param_from': settings.premium_fe_Xskew.sizes.from, 217 'x_param_to': settings.premium_fe_Xskew.sizes.to, 218 'y_param_from': settings.premium_fe_Yskew.sizes.from, 219 'y_param_to': settings.premium_fe_Yskew.sizes.to, 220 'duration': settings.premium_fe_skew_duration.size, 221 'delay': settings.premium_fe_skew_delay.size, 222 } 223 } 224 225 if (opacityEnabled) { 226 eleSettings.effectSettings.opacity = { 227 'from': settings.premium_fe_opacity.sizes.from / 100, 228 'to': settings.premium_fe_opacity.sizes.to / 100, 229 'duration': settings.premium_fe_opacity_duration.size, 230 'delay': settings.premium_fe_opacity_delay.size 231 }; 232 } 233 234 if (bgColorEnabled) { 235 eleSettings.effectSettings.bgColor = { 236 'from': settings.premium_fe_bg_color_from, 237 'to': settings.premium_fe_bg_color_to, 238 'duration': settings.premium_fe_bg_color_duration.size, 239 'delay': settings.premium_fe_bg_color_delay.size, 240 } 241 } 242 243 if (PremiumFESettings.papro_installed) { 244 if (blurEnabled) { 245 eleSettings.effectSettings.blur = { 246 'from': 'blur(' + settings.premium_fe_blur_val.sizes.from + 'px)', 247 'to': 'blur(' + settings.premium_fe_blur_val.sizes.to + 'px)', 248 'duration': settings.premium_fe_blur_duration.size, 249 'delay': settings.premium_fe_blur_delay.size, 250 } 251 } 252 253 if (contrastEnabled) { 254 eleSettings.effectSettings.contrast = { 255 'from': 'contrast(' + settings.premium_fe_contrast_val.sizes.from + '%)', 256 'to': 'contrast(' + settings.premium_fe_contrast_val.sizes.to + '%)', 257 'duration': settings.premium_fe_contrast_duration.size, 258 'delay': settings.premium_fe_contrast_delay.size, 259 } 260 } 261 262 if (gScaleEnabled) { 263 eleSettings.effectSettings.gScale = { 264 'from': 'grayscale(' + settings.premium_fe_gScale_val.sizes.from + '%)', 265 'to': 'grayscale(' + settings.premium_fe_gScale_val.sizes.to + '%)', 266 'duration': settings.premium_fe_gScale_duration.size, 267 'delay': settings.premium_fe_gScale_delay.size, 268 } 269 } 270 271 if (hueEnabled) { 272 eleSettings.effectSettings.hue = { 273 'from': 'hue-rotate(' + settings.premium_fe_hue_val.sizes.from + 'deg)', 274 'to': 'hue-rotate(' + settings.premium_fe_hue_val.sizes.to + 'deg)', 275 'duration': settings.premium_fe_hue_duration.size, 276 'delay': settings.premium_fe_hue_delay.size, 277 } 278 } 279 280 if (brightEnabled) { 281 eleSettings.effectSettings.bright = { 282 'from': 'brightness(' + settings.premium_fe_brightness_val.sizes.from + '%)', 283 'to': 'brightness(' + settings.premium_fe_brightness_val.sizes.to + '%)', 284 'duration': settings.premium_fe_brightness_duration.size, 285 'delay': settings.premium_fe_brightness_delay.size, 286 } 287 } 288 289 if (satEnabled) { 290 eleSettings.effectSettings.sat = { 291 'from': 'saturate(' + settings.premium_fe_saturate_val.sizes.from + '%)', 292 'to': 'saturate(' + settings.premium_fe_saturate_val.sizes.to + '%)', 293 'duration': settings.premium_fe_saturate_duration.size, 294 'delay': settings.premium_fe_saturate_delay.size, 295 } 296 } 297 298 } 299 300 return eleSettings; 301 }, 302 303 applyEffects: function (eleSettings) { 304 305 var settings = eleSettings, 306 effectSettings = settings.effectSettings, 307 filterArr = []; 308 309 var animeSettings = { 310 targets: this.floatingTarget, 311 loop: settings.general.loop, 312 direction: settings.general.direction, 313 easing: settings.general.easing, 314 }; 315 316 if (effectSettings.translate) { 317 var translate = effectSettings.translate, 318 x_translate = { 319 value: [translate.x_param_from || 0, translate.x_param_to || 0], 320 duration: translate.duration, 321 delay: translate.delay || 0 322 }, 323 y_translate = { 324 value: [translate.y_param_from || 0, translate.y_param_to || 0], 325 duration: translate.duration, 326 delay: translate.delay || 0, 327 }; 328 329 animeSettings.translateX = x_translate; 330 animeSettings.translateY = y_translate; 331 } 332 333 if (effectSettings.rotate) { 334 var rotate = effectSettings.rotate, 335 x_rotate = { 336 duration: rotate.duration, 337 delay: rotate.delay || 0, 338 value: [rotate.x_param_from || 0, rotate.x_param_to || 0], 339 }, 340 y_rotate = { 341 duration: rotate.duration, 342 delay: rotate.delay || 0, 343 value: [rotate.y_param_from || 0, rotate.y_param_to || 0], 344 }, 345 z_rotate = { 346 duration: rotate.duration, 347 delay: rotate.delay || 0, 348 value: [rotate.z_param_from || 0, rotate.z_param_to || 0], 349 }; 350 351 animeSettings.rotateX = x_rotate; 352 animeSettings.rotateY = y_rotate; 353 animeSettings.rotateZ = z_rotate; 354 } 355 356 if (effectSettings.scale) { 357 var scale = effectSettings.scale, 358 x_scale = { 359 value: [scale.x_param_from || 0, scale.x_param_to || 0], 360 duration: scale.duration, 361 delay: scale.delay || 0 362 }, 363 y_scale = { 364 value: [scale.y_param_from || 0, scale.y_param_to || 0], 365 duration: scale.duration, 366 delay: scale.delay || 0, 367 }; 368 369 animeSettings.scaleX = x_scale; 370 animeSettings.scaleY = y_scale; 371 } 372 373 if (effectSettings.skew) { 374 var skew = effectSettings.skew, 375 x_skew = { 376 value: [skew.x_param_from || 0, skew.x_param_to || 0], 377 duration: skew.duration, 378 delay: skew.delay || 0 379 }, 380 y_skew = { 381 value: [skew.y_param_from || 0, skew.y_param_to || 0], 382 duration: skew.duration, 383 delay: skew.delay || 0, 384 }; 385 386 animeSettings.skewX = x_skew; 387 animeSettings.skewY = y_skew; 388 } 389 390 if (effectSettings.opacity) { 391 var opacity = effectSettings.opacity; 392 393 animeSettings.opacity = { 394 value: [opacity.from || 0, opacity.to || 0], 395 duration: opacity.duration, 396 delay: opacity.delay || 0 397 }; 398 } 399 400 if (effectSettings.bgColor) { 401 var bgColor = effectSettings.bgColor; 402 403 animeSettings.backgroundColor = { 404 value: [bgColor.from || 0, bgColor.to || 0], 405 duration: bgColor.duration, 406 delay: bgColor.delay || 0 407 }; 408 } 409 410 if (effectSettings.blur) { 411 var blur = effectSettings.blur, 412 blurEffect = { 413 value: [blur.from || 0, blur.to || 0], 414 duration: blur.duration, 415 delay: blur.delay || 0 416 }; 417 418 filterArr.push(blurEffect); 419 } 420 421 if (effectSettings.hue) { 422 var hue = effectSettings.hue, 423 hueEffect = { 424 value: [hue.from || 0, hue.to || 0], 425 duration: hue.duration, 426 delay: hue.delay || 0 427 }; 428 429 filterArr.push(hueEffect); 430 } 431 432 if (effectSettings.gScale) { 433 var gScale = effectSettings.gScale, 434 gScaleEffect = { 435 value: [gScale.from || 0, gScale.to || 0], 436 duration: gScale.duration, 437 delay: gScale.delay || 0 438 }; 439 440 filterArr.push(gScaleEffect); 441 } 442 443 if (effectSettings.contrast) { 444 var contrast = effectSettings.contrast, 445 contrastEffect = { 446 value: [contrast.from || 0, contrast.to || 0], 447 duration: contrast.duration, 448 delay: contrast.delay || 0 449 }; 450 451 filterArr.push(contrastEffect); 452 } 453 454 if (effectSettings.bright) { 455 var bright = effectSettings.bright, 456 brightEffect = { 457 value: [bright.from || 0, bright.to || 0], 458 duration: bright.duration, 459 delay: bright.delay || 0 460 }; 461 462 filterArr.push(brightEffect); 463 } 464 465 if (effectSettings.sat) { 466 var sat = effectSettings.sat, 467 satEffect = { 468 value: [sat.from || 0, sat.to || 0], 469 duration: sat.duration, 470 delay: sat.delay || 0 471 }; 472 473 filterArr.push(satEffect); 474 } 475 476 //add filter settings to animation settings 477 if (filterArr.length !== 0) {
478 animeSettings.filter = filterArr; 479 } 480 481 var animationTrigger = eleSettings.general.trigger; 482 483 if ('hover' === animationTrigger) { 484 animeSettings.autoplay = false; 485 } 486 487 // Override Elementor transition duration. 488 $(animeSettings.targets).css('transition-duration', '0s'); 489 490 var floatingAnimation = anime(animeSettings); 491 492 if ('hover' === animationTrigger) { 493 494 $(animeSettings.targets).on('mouseenter.paFloating', () => { 495 this.playAnimation(floatingAnimation); 496 }); 497 498 $(animeSettings.targets).on('mouseleave.paFloating', () => { 499 this.pauseAnimation(floatingAnimation); 500 }); 501 502 } 503 504 }, 505 506 playAnimation: function (animation) { 507 animation.play(); 508 }, 509 510 pauseAnimation: function (animation) { 511 animation.pause(); 512 } 513 }); 514 515 elementorFrontend.hooks.addAction('frontend/element_ready/widget', function ($scope) { 516 elementorFrontend.elementsHandler.addHandler(paFloatingEffects, { 517 $element: $scope 518 }); 519 }); 520 521 }); 522 523})(jQuery);
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.