1 2 3$('.why-should-choose__image img, .hero-info__image img, .how-get-started__image img, .info-block__image img').removeAttr('width height'); 4$('.powerful-texting-features img').removeAttr('width height'); 5 6$(window).resize(function () { 7 paginationBlogChange(); 8}); 9paginationBlogChange(); 10 11function paginationBlogChange() { 12 if ($(window).width() < 600) { 13 14 $(".next-link a").html('<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.58589 3.19948C5.24692 3.53844 5.24692 4.08601 5.58589 4.42497L8.95818 7.79726L5.58589 11.1696C5.24692 11.5085 5.24692 12.0561 5.58589 12.3951C5.92486 12.734 6.47242 12.734 6.81139 12.3951L10.8008 8.40567C11.1397 8.0667 11.1397 7.51914 10.8008 7.18017L6.81139 3.19078C6.48111 2.86051 5.92486 2.86051 5.58589 3.19948Z" fill="#6E7191"></path></svg>'); 15 $(".next-link svg").attr("style", "display:none"); 16 $(".next-link a svg").attr("style", "position: inherit;"); 17 18 19 $('.prev-link a').html('<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.8869 2.9558C10.5013 2.57028 9.87858 2.57028 9.49306 2.9558L4.95577 7.49309C4.57025 7.87861 4.57025 8.50137 4.95577 8.88689L9.49306 13.4242C9.87858 13.8097 10.5013 13.8097 10.8869 13.4242C11.2724 13.0387 11.2724 12.4159 10.8869 12.0304L7.05142 8.18505L10.8869 4.3496C11.2724 3.96408 11.2625 3.33143 10.8869 2.9558Z" fill="#6E7191"></path></svg>'); 20 $(".prev-link svg").attr("style", "display:none"); 21 $(".prev-link a svg").attr("style", "position: inherit;"); 22 23 24 } 25 else { 26 $(".next-link a").html('Next'); 27 $(".next-link svg").attr("style", "position: absolute;"); 28 29 $(".prev-link a").html('Previous'); 30 $(".prev-link svg").attr("style", "position: absolute;"); 31 32 } 33} 34 35function getCookieDomain() { 36 return '.' + location.hostname.split('.').reverse().splice(0, 2).reverse().join('.'); 37} 38 39function copyToClipboard(str) { 40 if (window.clipboardData && window.clipboardData.setData) { 41 return window.clipboardData.setData("Text", str); 42 43 } 44 else if (document.queryCommandSupported && document.queryCommandSupported("copy")) { 45 var textarea = document.createElement("textarea"); 46 textarea.textContent = str; 47 textarea.style.position = "fixed"; 48 document.body.appendChild(textarea); 49 textarea.select(); 50 try { 51 return document.execCommand("copy"); 52 } 53 catch (ex) { 54 55 } 56 finally { 57 document.body.removeChild(textarea); 58 } 59 } 60} 61 62jQuery(document).ready(function ($) { 63 64 65 $(".tmi-close" ).bind( "click", function() { 66 document.getElementById("header").classList.remove("header--active"); 67 }); 68 69 var titleBlue = $('.title-blue').html(); 70 /* 71 if(titleBlue == ' free tools') { 72 const toClass = 'free-tools'; 73 const yOffset = -72; 74 const element = document.getElementsByClassName(toClass)[0]; 75 const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset; 76 77 window.scrollTo({top: y, behavior: 'smooth'}); 78 } 79 */ 80 81 $('.filter-list__item').on("click", function () { 82 if (titleBlue != " free tools") { 83 //document.getElementsByClassName("features")[0].scrollIntoView({block: "start", behavior: "smooth"}); 84 85 const toClass = 'features'; 86 const yOffset = -72; 87 const element = document.getElementsByClassName(toClass)[0]; 88 const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset; 89 90 window.scrollTo({ top: y, behavior: 'smooth' }); 91 92 } 93 }); 94 95 $(".sms-template .button-wrapper").on("click", function () { 96 97 var textC = $(this).parent().find('.message-text-cnt').html(); 98 textC = textC.replaceAll(/(<([^>]+)>)/gi, ""); 99 navigator.clipboard.writeText(textC); 100 101 }); 102 103 $('.why-should-choose__image img, .hero-info__image img, .how-get-started__image img, .info-block__image img').removeAttr('width height'); 104 105 $('.tooltip__icon').click(function (e) { 106 e.stopPropagation(); 107 $('.tooltip').removeClass('show'); 108 $('.tooltip').attr('style', " "); 109 $(this).parents('.tooltip__container').find('.tooltip').toggleClass('show'); 110 }); 111 112 $(document).click(function () { 113 if ($('.tooltip').hasClass('show')) { 114 $('.tooltip').removeClass('show'); 115 $('.tooltip').attr('style', "display:none;"); 116 } 117 }); 118 119 120 121 $(".form-control, #form-control").keyup(function () { 122 let entered = $(this).val().length; 123 //console.log("keyup: " + $(this).val().length); 124 if ($(this).val().length > 0) { 125 $(".close").attr("style", "position:absolute"); 126 } else { 127 $(".close").attr("style", "position:absolute; display:none;"); 128 } 129 }); 130 131 132 if ($("#form-control").length) { 133 if ($("#form-control").val().length > 0) 134 $(".close").attr("style", " "); 135 } 136 137 138 $("#Subscribe").click(function (event) { 139 event.preventDefault(); 140 141 let email = $("#cemail").val(); 142 143 $.ajax({ 144 url: '/', 145 method: 'POST', 146 dataType: 'html', 147 data: 'action=mailchimp&email=' + email, 148 success: function (data) { 149 //alert(data); 150 $(".subscribe-result").html(data); 151 152 var attr = $("#Subscribe").attr('class'); 153 if (attr == 'blogarticle') { 154 $(".subscribe-result").addClass("blogarticle"); 155 } 156 157 if (data === 'Invalid email format') 158 $(".subscribe-result").addClass("subscribe-error"); 159 else 160 $(".subscribe-result").removeClass("subscribe-error"); 161 162 } 163 }); 164 }); 165 166 $("#Subscribe2").click(function (event) { 167 event.preventDefault(); 168 169 let email = $("#cemail2").val(); 170 171 $.ajax({ 172 url: '/', 173 method: 'POST', 174 dataType: 'html', 175 data: 'action=mailchimp&email=' + email, 176 success: function (data) { 177 //alert(data); 178 $(".subscribe-result2").html(data); 179 if (data === 'Invalid email format') 180 $(".subscribe-result2").addClass("subscribe-error"); 181 else 182 $(".subscribe-result2").removeClass("subscribe-error"); 183 } 184 }); 185 }); 186 187 188}); 189 190function hoverImg(id, type, event) { 191 //alert(1); 192 //console.log(type); 193
194 if (type == 'top3') { 195 if (event == 'out') { 196 document.querySelector('#link_top3_' + id).classList.remove('ahover'); 197 } 198 else { 199 document.querySelector('#link_top3_' + id).classList.add('ahover'); 200 } 201 } 202 203 if (type == 'top1') { 204 if (event == 'out') { 205 document.querySelector('.title').classList.remove('hover'); 206 } 207 else { 208 document.querySelector('.title').classList.add('hover'); 209 } 210 } 211 212 if (type == 'categoryBlock') { 213 if (event == 'out') { 214 document.querySelector('#link_categoryBlock_' + id).classList.remove('ahover'); 215 } 216 else { 217 document.querySelector('#link_categoryBlock_' + id).classList.add('ahover'); 218 } 219 } 220 221} 222 223$(".quest-icon").mouseover(function () { 224 if (!$(this).hasClass('active')) 225 $(this).parent().closest('.blogs .question-wrap').find(".single-question .quest").addClass('faq-hover'); 226}); 227$(".quest-icon").mouseout(function () { 228 $(this).parent().closest('.blogs .question-wrap').find(".single-question .quest").removeClass('faq-hover'); 229}); 230 231function hoverTool(id, event) { 232 if (event == 'out') { 233 document.querySelector('#link_tool_' + id).classList.remove('ahover'); 234 } 235 else { 236 document.querySelector('#link_tool_' + id).classList.add('ahover'); 237 } 238} 239 240function toolLinkRedirect(link) { 241 window.location.href = link; 242} 243 244if ( window.location.pathname !== "/" ) { 245jQuery(document).ready(function ($) { 246 $('.carousel-item#slide-0').addClass('active'); 247 $('.thumbnails-carousel .slide-0').addClass('active'); 248 if (typeof $.fn.slick === 'function' && $('.blog-slick-slider').length) { 249 $(".prev-btn").click(function () { 250 $(".blog-slick-slider").slick("slickPrev"); 251 }); 252 253 $(".next-btn").click(function () { 254 $(".blog-slick-slider").slick("slickNext"); 255 }); 256 $(".prev-btn").addClass("slick-disabled"); 257 $(".blog-slick-slider").on("afterChange", function () { 258 if ($(".slick-prev").hasClass("slick-disabled")) { 259 $(".prev-btn").addClass("slick-disabled"); 260 } else { 261 $(".prev-btn").removeClass("slick-disabled"); 262 } 263 if ($(".slick-next").hasClass("slick-disabled")) { 264 $(".next-btn").addClass("slick-disabled"); 265 } else { 266 $(".next-btn").removeClass("slick-disabled"); 267 } 268 }); 269 270 $('.blog-slick-slider').slick({ 271 dots: false, 272 infinite: true, 273 speed: 500, 274 autoplay: true, 275 autoplaySpeed: 3000, 276 slidesToShow: 4, 277 slidesToScroll: 1, 278 centerMode: false, 279 responsive: [ 280 { 281 breakpoint: 1300, 282 settings: { 283 slidesToShow: 3, 284 slidesToScroll: 1, 285 infinite: true, 286 } 287 }, 288 { 289 breakpoint: 1024, 290 settings: { 291 slidesToShow: 2, 292 dots: true, 293 slidesToScroll: 1, 294 infinite: true, 295 } 296 }, 297 { 298 breakpoint: 600, 299 settings: { 300 dots: true, 301 slidesToShow: 1, 302 slidesToScroll: 1 303 // centerMode: true, 304 } 305 }, 306 ] 307 }); 308 } 309 310 311 312 $(".from-video-library").css("display", "block"); 313 314 315 316 317 318 // var toc = []; 319 // var tocContainer = $("#toc-list"); 320 321 // $("#blog-content-inner h2").each(function (index) {//:header 322 // var header = $(this); 323 // var headerText = header.text(); 324 // var headerLevel = parseInt(header[0].tagName.charAt(1)); 325 // var headerId = headerText.replace(/\s+/g, '-').toLowerCase().replace(/^[^a-zA-Z]+/, '') + '-' + index; 326 327 // // Ensure that the generated ID starts with a letter and is a valid HTML ID 328 // headerId = headerId.replace(/[^a-zA-Z0-9\-_]/g, ''); 329 330 // header.attr("id", headerId); 331 332 // // Create a table of contents entry 333 // var entry = { 334 // id: headerId, 335 // text: headerText, 336 // level: headerLevel 337 // }; 338 339 // toc.push(entry); 340 341 // // Add the entry to the list 342 // var entryHtml = '<li class="' + headerId + ' titles-article" data-scroll="' + headerId + '">' + headerText + '</li>'; 343 // tocContainer.append(entryHtml); 344 // }); 345 346 // // Scroll to the position of the corresponding header with an offset of -200 pixels 347 // $("#toc-list li").on("click", function () { 348 // var targetId = $(this).data("scroll"); 349 // var targetPosition = $("#" + targetId).offset().top - 70; 350 351 // $("html, body").animate({ 352 // scrollTop: targetPosition 353 // }, 100); // Adjust the duration as needed 354 // }); 355 356 357 358 359 /* */ 360 const bottoms = []; 361 var anchors = document.querySelectorAll('h2'); 362 363 for (var i = 0; i < anchors.length; i++) { 364 var anchorID = anchors[i].getAttribute('id'); 365 if ((i + 1) < anchors.length) { 366 var anchorIDNext = anchors[(i + 1)].getAttribute('id'); 367 //if (anchors[(i+1)].length) { 368 if ($("#" + anchorIDNext).offset() != undefined) { 369 var elementTopNext = $("#" + anchorIDNext).offset().top; 370 bottoms[i] = elementTopNext; 371 } 372 //} 373 //console.log("bottoms[i] "+bottoms[i]); 374 } 375 } 376 //console.log("START "); 377 //console.log("bottoms:!: "+JSON.stringify(bottoms)); 378 /* */ 379 380 $.fn.isInViewport = function (i, count) { 381 if ($(this).offset() != undefined) { 382 var elementTop = $(this).offset().top; 383 var elementBottom = elementTop + $(this).outerHeight(); 384 var viewportTop = $(window).scrollTop(); 385 var viewportBottom = viewportTop + $(window).height(); 386 } 387 if (elementBottom > (viewportTop + 95) && elementTop < (viewportTop + 80)) { 388 389 390 } 391 //console.log("bottoms::: "+JSON.stringify(bottoms)); 392 //return elementBottom > (viewportTop) && elementTop < viewportBottom; 393 //return (elementBottom > (viewportTop + 95) && elementTop < (viewportTop + 80) ); 394 if (i < bottoms.length) { 395 396 397 return (bottoms[i] > (viewportTop + 95) && elementTop < (viewportTop + 80)); 398 } 399 else 400 return (bottoms[i - 1] < (viewportTop + 95) && elementTop < (viewportTop + 80)); 401 402 }; 403 404 $(window).on('resize scroll', function () { 405 406 //setTimeout(function(){ 407 const anchors = document.querySelectorAll('h2'); 408 409 410 411 for (var x = 0; x < anchors.length; x++) {// 412 413 var anchorID = anchors[x].getAttribute('id'); 414 415 if ($('#' + anchorID).isInViewport(x, anchors.length)) { 416 //console.log(anchorID+' is visible'); 417 418 $('.titles-article').attr('style', " "); 419 $('.' + anchorID).attr('style', "font-weight: bold"); 420 } else { 421 //console.log(anchorID+' is not visible'); 422 } 423 } 424 //},100); 425 426 }); 427 428 //alert($(".content-wrap").height()) 429 let heightRight = $(".content-wrap").height(); 430 $('.block-right').attr('style', "height:" + (heightRight - 300) + "px;"); 431 432 const el = document.querySelector(".checkelement") 433 const observer = new IntersectionObserver( 434 ([e]) => e.target.classList.toggle("is-pinned", e.intersectionRatio < 1), 435 { 436 threshold: [1] 437 } 438 ); 439 440 if (el != undefined) { 441 observer.observe(el); 442 } 443}); 444} 445 446function copyAText() { 447 // Get the text field 448 var copyText = document.getElementById("myInput"); 449 450 // Select the text field 451 copyText.select(); 452 copyText.setSelectionRange(0, 99999); // For mobile devices 453 454 // Copy the text inside the text field 455 navigator.clipboard.writeText(copyText.value); 456 457 // Alert the copied text 458 alert("Copied the text: " + copyText.value); 459} 460 461 462 463 /******/ (function (modules) { 464 // webpackBootstrap 465 /******/ // The module cache 466 /******/ var installedModules = {}; 467 /******/ 468 /******/ // The require function 469 /******/ function __webpack_require__(moduleId) { 470 /******/ 471 /******/ // Check if module is in cache 472 /******/ if (installedModules[moduleId]) { 473 /******/ return installedModules[moduleId].exports; 474 /******/ 475 } 476 /******/ // Create a new module (and put it into the cache) 477 /******/ var module = (installedModules[moduleId] = { 478 /******/ i: moduleId, 479 /******/ l: false, 480 /******/ exports: {}, 481 /******/ 482 }); 483 /******/ 484 /******/ // Execute the module function 485 /******/ modules[moduleId].call( 486 module.exports, 487 module, 488 module.exports, 489 __webpack_require__ 490 ); 491 /******/ 492 /******/ // Flag the module as loaded 493 /******/ module.l = true; 494 /******/ 495 /******/ // Return the exports of the module 496 /******/ return module.exports; 497 /******/ 498 } 499 /******/ 500 /******/ 501 /******/ // expose the modules object (__webpack_modules__) 502 /******/ __webpack_require__.m = modules; 503 /******/ 504 /******/ // expose the module cache 505 /******/ __webpack_require__.c = installedModules; 506 /******/ 507 /******/ // define getter function for harmony exports 508 /******/ __webpack_require__.d = function (exports, name, getter) { 509 /******/ if (!__webpack_require__.o(exports, name)) { 510 /******/ Object.defineProperty(exports, name, { 511 enumerable: true, 512 get: getter, 513 }); 514 /******/ 515 } 516 /******/ 517 }; 518 /******/ 519 /******/ // define __esModule on exports 520 /******/ __webpack_require__.r = function (exports) { 521 /******/ if (typeof Symbol !== "undefined" && Symbol.toStringTag) { 522 /******/ Object.defineProperty(exports, Symbol.toStringTag, { 523 value: "Module", 524 }); 525 /******/ 526 } 527 /******/ Object.defineProperty(exports, "__esModule", { value: true }); 528 /******/ 529 }; 530 /******/ 531 /******/ // create a fake namespace object 532 /******/ // mode & 1: value is a module id, require it 533 /******/ // mode & 2: merge all properties of value into the ns 534 /******/ // mode & 4: return value when already ns object 535 /******/ // mode & 8|1: behave like require 536 /******/ __webpack_require__.t = function (value, mode) { 537 /******/ if (mode & 1) value = __webpack_require__(value); 538 /******/ if (mode & 8) return value; 539 /******/ if ( 540 mode & 4 && 541 typeof value === "object" && 542 value &&
543 value.__esModule 544 ) 545 return value; 546 /******/ var ns = Object.create(null); 547 /******/ __webpack_require__.r(ns); 548 /******/ Object.defineProperty(ns, "default", { 549 enumerable: true, 550 value: value, 551 }); 552 /******/ if (mode & 2 && typeof value != "string") 553 for (var key in value) 554 __webpack_require__.d( 555 ns, 556 key, 557 function (key) { 558 return value[key]; 559 }.bind(null, key) 560 ); 561 /******/ return ns; 562 /******/ 563 }; 564 /******/ 565 /******/ // getDefaultExport function for compatibility with non-harmony modules 566 /******/ __webpack_require__.n = function (module) { 567 /******/ var getter = 568 module && module.__esModule 569 ? /******/ function getDefault() { 570 return module["default"]; 571 } 572 : /******/ function getModuleExports() { 573 return module; 574 }; 575 /******/ __webpack_require__.d(getter, "a", getter); 576 /******/ return getter; 577 /******/ 578 }; 579 /******/ 580 /******/ // Object.prototype.hasOwnProperty.call 581 /******/ __webpack_require__.o = function (object, property) { 582 return Object.prototype.hasOwnProperty.call(object, property); 583 }; 584 /******/ 585 /******/ // __webpack_public_path__ 586 /******/ __webpack_require__.p = ""; 587 /******/ 588 /******/ 589 /******/ // Load entry module and return exports 590 /******/ return __webpack_require__((__webpack_require__.s = 0)); 591 /******/ 592})( 593 /************************************************************************/ 594 /******/[ 595 /* 0 */ 596 /***/ function (module, exports, __webpack_require__) { 597 module.exports = __webpack_require__(1); 598 599 /***/ 600 }, 601 /* 1 */ 602 /***/ function (module, __webpack_exports__, __webpack_require__) { 603 "use strict"; 604 __webpack_require__.r(__webpack_exports__); 605 /* harmony import */ var _core_header_js__WEBPACK_IMPORTED_MODULE_0__ = 606 __webpack_require__(2); 607 /* harmony import */ var _core_footer_js__WEBPACK_IMPORTED_MODULE_1__ = 608 __webpack_require__(4); 609 /* harmony import */ var _core_faq_js__WEBPACK_IMPORTED_MODULE_2__ = 610 __webpack_require__(5); 611 /* harmony import */ var _core_inputClearButton__WEBPACK_IMPORTED_MODULE_3__ = 612 __webpack_require__(7); 613 /* harmony import */ var _core_utils_highlight__WEBPACK_IMPORTED_MODULE_4__ = 614 __webpack_require__(8); 615 616 /***/ 617 }, 618 /* 2 */ 619 /***/ function (module, __webpack_exports__, __webpack_require__) { 620 "use strict"; 621 __webpack_require__.r(__webpack_exports__); 622 /* harmony import */ var _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__ = 623 __webpack_require__(3); 624 625 const headerWorker = () => { 626 const header = document.getElementById("header"); 627 const headerOpen = document.getElementById("header-open"); 628 const headerClose = document.getElementById("header-close"); 629 630 const headerMenuButtons = [ 631 ...document.querySelectorAll( 632 ".header-menu--mobile > .header-menu__item--with-submenu > button" 633 ), 634 ]; 635 636 const dropOpenAll = () => { 637 headerMenuButtons.forEach((button) => { 638 button.parentElement.classList.remove("submenu-open"); 639 }); 640 }; 641 642 headerMenuButtons.forEach((button) => { 643 button.addEventListener("click", () => { 644 if (window.innerWidth < Number("1200")) { 645 if (button.parentElement.classList.contains("submenu-open")) { 646 dropOpenAll(); 647 } else { 648 dropOpenAll(); 649 button.parentElement.classList.add("submenu-open"); 650 } 651 } 652 }); 653 }); 654 655 let preInnerWidth = window.innerWidth; 656 657 window.addEventListener( 658 "resize", 659 () => { 660 if ( 661 preInnerWidth < Number("1200") && 662 window.innerWidth >= Number("1200") 663 ) { 664 header.classList.remove("header--active"); 665 dropOpenAll(); 666 } 667 preInnerWidth = window.innerWidth; 668 }, 669 true 670 ); 671 672 if (headerOpen) { 673 headerOpen.addEventListener("click", () => { 674 header.classList.add("header--active"); 675 }); 676 677 headerClose.addEventListener("click", () => { 678 header.classList.remove("header--active"); 679 dropOpenAll(); 680 }); 681 } 682 683 const featuresCategories = Object( 684 _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElement"] 685 )(".header-submenu-features"); 686 const featureCategoryButton = Object( 687 _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"] 688 )(".header-aside__item", featuresCategories); 689 const featureBlock = Object( 690 _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"] 691 )(".header-submenu__link", featuresCategories); 692 693 if (featuresCategories) { 694 if (!featureCategoryButton[0]) { 695 return 696 } 697 featureCategoryButton[0].classList.add("header-aside__item--active"); 698 const defaultActiveTab = featureCategoryButton[0].dataset.category; 699 for (let i = 0; i < featureBlock.length; i++) { 700 featureBlock[i].dataset.category = Object( 701 _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["kebabCase"] 702 )(featureBlock[i].dataset.category); 703 featureBlock[i].classList.add("d-none"); 704 705 if ( 706 featureBlock[i].dataset.category.indexOf(defaultActiveTab) > -1 707 ) { 708 featureBlock[i].classList.remove("d-none"); 709 } 710 } 711 712 for (let i = 0; i < featureCategoryButton.length; i++) { 713 let activeTab = featureCategoryButton[0].dataset.category; 714 715 featureCategoryButton[i].addEventListener("click", () => { 716 for (let k = 0; k < featureCategoryButton.length; k++) { 717 featureCategoryButton[k].classList.remove( 718 "header-aside__item--active" 719 ); 720 } 721 featureCategoryButton[i].classList.add( 722 "header-aside__item--active" 723 ); 724 activeTab = featureCategoryButton[i].dataset.category; 725 726 for (let j = 0; j < featureBlock.length; j++) { 727 featureBlock[j].classList.add("d-none"); 728 729 if (featureBlock[j].dataset.category.indexOf(activeTab) > -1) { 730 featureBlock[j].classList.remove("d-none"); 731 } 732 } 733 }); 734 } 735 } 736 }; 737 738 /* harmony default export */ __webpack_exports__["default"] = 739 headerWorker(); 740 741 /***/ 742 }, 743 /* 3 */ 744 /***/ function (module, __webpack_exports__, __webpack_require__) { 745 "use strict"; 746 __webpack_require__.r(__webpack_exports__); 747 /* harmony export (binding) */ __webpack_require__.d( 748 __webpack_exports__, 749 "getElement", 750 function () { 751 return getElement; 752 } 753 ); 754 /* harmony export (binding) */ __webpack_require__.d( 755 __webpack_exports__, 756 "getElements", 757 function () { 758 return getElements; 759 } 760 ); 761 /* harmony export (binding) */ __webpack_require__.d( 762 __webpack_exports__, 763 "kebabCase", 764 function () { 765 return kebabCase; 766 } 767 ); 768 /* harmony export (binding) */ __webpack_require__.d( 769 __webpack_exports__, 770 "getOffset", 771 function () { 772 return getOffset; 773 } 774 ); 775 /* harmony export (binding) */ __webpack_require__.d( 776 __webpack_exports__, 777 "closestParent", 778 function () { 779 return closestParent; 780 } 781 ); 782 const getElement = (el, wrap = document) => { 783 if (el == null) return undefined; 784 785 if (typeof el === "string") { 786 try { 787 return wrap.querySelector(el) || undefined; 788 } catch ({ message }) { 789 console.error(message); 790 return undefined; 791 } 792 } 793 }; 794 795 const getElements = (el, wrap = document) => { 796 if (el == null) return undefined; 797 798 if (typeof el === "string") { 799 try { 800 return wrap.querySelectorAll(el) || undefined; 801 } catch ({ message }) { 802 console.error(message); 803 return undefined; 804 } 805 } 806 }; 807
808 const kebabCase = (string) => 809 string 810 .replace(/([a-z])([A-Z])/g, "$1-$2") 811 .replace(/[\s_]+/g, "-") 812 .toLowerCase(); 813 814 const getOffset = (element) => { 815 if (!element.getClientRects().length) { 816 return { top: 0, left: 0 }; 817 } 818 819 let rect = element.getBoundingClientRect(); 820 let win = element.ownerDocument.defaultView; 821 return { 822 top: rect.top + win.pageYOffset, 823 left: rect.left + win.pageXOffset, 824 }; 825 }; 826 827 const closestParent = (child, className) => { 828 if (!child || child == document) { 829 return null; 830 } 831 if (child.classList.contains(className)) { 832 return child; 833 } else { 834 return closestParent(child.parentNode, className); 835 } 836 }; 837 838 /***/ 839 }, 840 841 /* 6 */ 842 /***/ function (module, __webpack_exports__, __webpack_require__) { 843 "use strict"; 844 __webpack_require__.r(__webpack_exports__); 845 const doScrolling = (element, duration = 250) => { 846 const startingY = window.pageYOffset; 847 const elementY = startingY + element.getBoundingClientRect().top; 848 if (startingY < elementY) return; 849 850 const targetYPosition = elementY - 60; 851 852 const targetY = 853 document.body.scrollHeight - targetYPosition < window.innerHeight 854 ? document.body.scrollHeight - window.innerHeight 855 : targetYPosition; 856 const diff = targetY - startingY; 857 const easing = (t) => 858 t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; 859 let start; 860 861 if (!diff) return; 862 863 const step = (timestamp) => { 864 if (!start) start = timestamp; 865 const time = timestamp - start; 866 let percent = Math.min(time / duration, 1); 867 percent = easing(percent); 868 869 window.scrollTo(0, startingY + diff * percent); 870 871 if (time < duration) { 872 window.requestAnimationFrame(step); 873 } 874 }; 875 876 window.requestAnimationFrame(step); 877 }; 878 879 /* harmony default export */ __webpack_exports__["default"] = doScrolling; 880 881 /***/ 882 }, 883 /* 7 */ 884 /***/ function (module, __webpack_exports__, __webpack_require__) { 885 "use strict"; 886 __webpack_require__.r(__webpack_exports__); 887 const inputClearButton = () => { 888 const clearButton = document.getElementsByClassName( 889 "input__clear-button" 890 ); 891 892 [...clearButton].forEach((el) => { 893 el.addEventListener("click", () => { 894 el.previousSibling.previousElementSibling.value = ""; 895 el.previousSibling.previousElementSibling.focus(); 896 }); 897 }); 898 }; 899 900 /* harmony default export */ __webpack_exports__["default"] = 901 inputClearButton(); 902 903 /***/ 904 }, 905 /* 8 */ 906 /***/ function (module, __webpack_exports__, __webpack_require__) { 907 "use strict"; 908 __webpack_require__.r(__webpack_exports__); 909 /* harmony export (binding) */ __webpack_require__.d( 910 __webpack_exports__, 911 "reEscape", 912 function () { 913 return reEscape; 914 } 915 ); 916 /* harmony export (binding) */ __webpack_require__.d( 917 __webpack_exports__, 918 "highlight", 919 function () { 920 return highlight; 921 } 922 ); 923 const reEscape = (s) => s.replace(/([.*+?^$|(){}[\]])/gm, "\\$1"); 924 const highlight = (str, search) => 925 str.replace( 926 new RegExp(`(${reEscape(search)})`, "gi"), 927 '<span class="highlight">$1</span>' 928 ); 929 930 [...document.querySelectorAll("[data-highlight]")].forEach((e) => { 931 const search = e.dataset.highlight; 932 const text = e.innerText; 933 934 e.innerHTML = highlight(text, search); 935 }); 936 937 /***/ 938 },/* 9 */ 939 /***/function (module, __webpack_exports__, __webpack_require__) { 940 941 "use strict"; 942 __webpack_require__.r(__webpack_exports__); 943 /* harmony import */ var _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); 944 945 946 const compareTabs = () => { 947 948 const compareLinksBlock = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElement"])('#compare-tabs-links') 949 const tabItem = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('input', compareLinksBlock) 950 const contentTabItem = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('.compare-tab') 951 952 if (contentTabItem.length > 0 && contentTabItem != undefined) { 953 tabItem[0].checked = true 954 955 contentTabItem[0].classList.add('compare-tab--active') 956 957 958 const faqLinksBlock = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElement"])('#faq-tabs-links') 959 960 const faqTabItem = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('input', faqLinksBlock) 961 const faqContentTabItem = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('.faq-tab') 962 963 faqTabItem[0].checked = true 964 faqContentTabItem[0].classList.add('faq-tab--active') 965 966 const faqButton = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('.compare-tabs .btn') 967 968 for (let i = 0; i < tabItem.length; i++) { 969 tabItem[i].addEventListener('click', () => { 970 for (let j = 0; j < contentTabItem.length; j++) { 971 contentTabItem[j].dataset.id === tabItem[i].id 972 ? contentTabItem[j].classList.add('compare-tab--active') 973 : contentTabItem[j].classList.remove('compare-tab--active') 974 } 975 for (let k = 0; k < tabItem.length; k++) { 976 tabItem[k].checked = false 977 } 978 tabItem[i].checked = true 979 }) 980 } 981 982 for (let i = 0; i < faqTabItem.length; i++) { 983 faqTabItem[i].addEventListener('click', () => { 984 for (let j = 0; j < faqContentTabItem.length; j++) { 985 faqContentTabItem[j].dataset.id === faqTabItem[i].id 986 ? faqContentTabItem[j].classList.add('faq-tab--active') 987 : faqContentTabItem[j].classList.remove('faq-tab--active') 988 } 989 for (let k = 0; k < faqTabItem.length; k++) { 990 faqTabItem[k].checked = false 991 } 992 faqTabItem[i].checked = true 993 }) 994 } 995 996 997 for (let i = 0; i < faqButton.length; i++) { 998 faqButton[i].addEventListener('click', () => { 999 for (let j = 0; j < faqContentTabItem.length; j++) { 1000 faqContentTabItem[j].dataset.id === faqButton[i].dataset.id 1001 ? faqContentTabItem[j].classList.add('faq-tab--active') 1002 : faqContentTabItem[j].classList.remove('faq-tab--active') 1003 } 1004 for (let k = 0; k < faqTabItem.length; k++) { 1005 faqTabItem[k].checked = false 1006 } 1007 faqTabItem[i].checked = true 1008 }) 1009 } 1010 1011 } 1012 1013 }; 1014 1015 /* harmony default export */ __webpack_exports__["default"] = (compareTabs()); 1016 1017 1018 1019 /***/ 1020 }, 1021 function (module, __webpack_exports__, __webpack_require__) { 1022 1023 "use strict"; 1024 __webpack_require__.r(__webpack_exports__); 1025 /* harmony import */ var _core_utils_elements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); 1026 1027 1028 const pricingTabs = () => { 1029 1030 1031 const tabItem = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('.hero-tab-link'); 1032 const contentTabItem = Object(_core_utils_elements__WEBPACK_IMPORTED_MODULE_0__["getElements"])('.hero-pricing-tab'); 1033 1034 if (contentTabItem.length > 0) { 1035 tabItem[0].classList.add('hero-tab-link--active') 1036 contentTabItem[0].classList.add('hero-pricing-tab--active') 1037 1038 for (let i = 0; i < tabItem.length; i++) { 1039 tabItem[i].addEventListener('click', () => { 1040 for (let j = 0; j < contentTabItem.length; j++) { 1041 contentTabItem[j].id === tabItem[i].dataset.id 1042 ? contentTabItem[j].classList.add('hero-pricing-tab--active') 1043 : contentTabItem[j].classList.remove('hero-pricing-tab--active') 1044 } 1045 for (let k = 0; k < tabItem.length; k++) { 1046 tabItem[k].classList.remove('hero-tab-link--active') 1047 } 1048 tabItem[i].classList.add('hero-tab-link--active') 1049 }) 1050 } 1051 } 1052 1053 }; 1054 1055 /* harmony default export */ __webpack_exports__["default"] = (pricingTabs()); 1056 1057 1058 /***/ 1059 }, 1060 1061 1062 /******/ 1063 ] 1064); 1065 1066 1067const toggleToc = () => { 1068 const toggleTocTitle = getElement('.blog__toc-title'); 1069 const tocWrapper = getElement('.blog__toc__wrapper'); 1070 const tocOverlay = getElement('.toc__overlay'); 1071 1072 if (ifItemExist(toggleTocTitle) && ifItemExist(tocWrapper)) { 1073 toggleTocTitle.addEventListener('click', () => { 1074 tocWrapper.classList.toggle('active'); 1075 tocOverlay.classList.toggle('active'); 1076 if (tocWrapper.classList.contains('active')) { 1077 tocWrapper.style.top = 'calc(100% - ' + (tocWrapper.offsetHeight - 2) + 'px'; 1078 } else { 1079 tocWrapper.style.top = 'calc(100% - 53px)'; 1080 } 1081 }); 1082 tocOverlay.addEventListener('click', () => { 1083 tocWrapper.classList.remove('active'); 1084 tocOverlay.classList.remove('active'); 1085 tocWrapper.style.top = 'calc(100% - 53px)'; 1086 }); 1087 1088 const tocLinks = getElements('a', tocWrapper); 1089 if (ifItemExist(tocLinks)) {
1090 Array.from(tocLinks).forEach((link) => { 1091 link.addEventListener('click', () => { 1092 tocWrapper.classList.remove('active'); 1093 tocOverlay.classList.remove('active'); 1094 tocWrapper.style.top = 'calc(100% - 53px)'; 1095 }); 1096 }); 1097 } 1098 } 1099}; 1100 1101/* initTextareaCopy start */ 1102const initCopyToClipboard = () => { 1103 const copyToClipboard = (e) => { 1104 // TODO: replace in origin file 1105 // console.log(e.dataset.target); 1106 // const r = document.createRange(); 1107 // r.selectNode(getElement(`#${e.dataset.target}`)); 1108 // window.getSelection().removeAllRanges(); 1109 // window.getSelection().addRange(r); 1110 // document.execCommand('copy'); 1111 // window.getSelection().removeAllRanges(); 1112 // Find the closest .alert element to the clicked button 1113 let quoteText = e.target.closest('.alert__wrapper')?.querySelector('.alert') || 1114 e.target.closest('.alert') || 1115 document.querySelector('.alert'); 1116 let text = quoteText ? quoteText.textContent : ''; 1117 navigator.clipboard.writeText(`${text}`); 1118 console.log('copyToClipboard function') 1119 1120 // Add light animation feedback 1121 const textSpan = e.target.querySelector('.alertCopyBtnText') || e.target.querySelector('span'); 1122 const originalText = textSpan ? textSpan.textContent.trim() : e.target.textContent.trim(); 1123 1124 e.target.classList.add('copied'); 1125 if (textSpan) { 1126 textSpan.textContent = 'Copied!'; 1127 } else { 1128 e.target.textContent = 'Copied!'; 1129 } 1130 1131 setTimeout(() => { 1132 e.target.classList.remove('copied'); 1133 if (textSpan) { 1134 textSpan.textContent = originalText; 1135 } else { 1136 e.target.textContent = originalText; 1137 } 1138 }, 2000); 1139 }; 1140 1141 const btns = Array.from(getElements('[data-type="copy-to-clipboard"]')); 1142 btns.forEach((el) => { 1143 el.addEventListener('click', copyToClipboard); 1144 1145 }); 1146}; 1147 1148/* Global events start */ 1149const globalListeners = { 1150 click: {}, 1151 resize: {}, 1152 scroll: {}, 1153}; 1154const addGlobalListeners = (type, cb, name) => { 1155 if (!name) { 1156 name = getCounter(); 1157 } 1158 globalListeners[type][name] = cb; 1159}; 1160// const removeGlobalListeners = (type, name) => { 1161// delete globalListeners[type][name] 1162// } 1163Object.keys(globalListeners).forEach((type) => { 1164 window.addEventListener(type, (e) => { 1165 if (Object.values(globalListeners[type]).length) { 1166 Object.values(globalListeners[type]).forEach((cb) => cb(e)); 1167 } 1168 }); 1169}); 1170/* Global events end */ 1171 1172const getElement = (el, wrap = document) => { 1173 if (el == null) return undefined; 1174 1175 if (typeof el === 'string') { 1176 try { 1177 return wrap.querySelector(el) || undefined; 1178 } catch ({ message }) { 1179 console.error(message); 1180 return undefined; 1181 } 1182 } 1183}; 1184 1185const getElements = (el, wrap = document) => { 1186 if (el == null) return undefined; 1187 1188 if (typeof el === 'string') { 1189 try { 1190 return wrap.querySelectorAll(el) || undefined; 1191 } catch ({ message }) { 1192 console.error(message); 1193 return undefined; 1194 } 1195 } 1196}; 1197 1198const style = (el, property) => window.getComputedStyle(el).getPropertyValue(property); 1199 1200const css = (el, css) => { 1201 Object.keys(css).forEach((prop) => { 1202 el.style[prop] = css[prop]; 1203 }); 1204}; 1205 1206const ready = (fn) => { 1207 if (document.readyState !== 'loading') return fn(); 1208 document.addEventListener('DOMContentLoaded', fn, false); 1209}; 1210 1211const stopAndPrevent = (e) => { 1212 e.cancelable !== false && e.preventDefault(); 1213 e.stopPropagation(); 1214}; 1215 1216const getCounter = (() => { 1217 let counter = 0; 1218 return () => { 1219 counter += 1; 1220 return counter; 1221 }; 1222})(); 1223 1224const backdrop = { 1225 msToSec: (val) => `${val / 1000}s`, 1226 open: (transitionDuration = 200) => { 1227 document.documentElement.classList.add('backdrop'); 1228 setTimeout(() => document.documentElement.classList.add('backdrop--opening'), 0); 1229 setTimeout(backdrop._opened, transitionDuration); 1230 document.documentElement.style.setProperty('--backdrop-transition-duration', backdrop.msToSec(transitionDuration)); 1231 }, 1232 hide: (transitionDuration = 200) => { 1233 document.documentElement.classList.add('backdrop--hiding'); 1234 setTimeout(backdrop._hidden, transitionDuration); 1235 document.documentElement.style.setProperty('--backdrop-transition-duration', backdrop.msToSec(transitionDuration)); 1236 }, 1237 _opened: () => { 1238 document.documentElement.classList.add('backdrop--opened'); 1239 document.documentElement.classList.remove('backdrop--opening'); 1240 document.documentElement.style.setProperty('--backdrop-transition-duration', ''); 1241 }, 1242 _hidden: () => { 1243 document.documentElement.classList.remove('backdrop--opened'); 1244 document.documentElement.classList.remove('backdrop--hiding'); 1245 document.documentElement.classList.remove('backdrop'); 1246 document.documentElement.style.setProperty('--backdrop-transition-duration', ''); 1247 }, 1248}; 1249 1250class Swipe { 1251 constructor(element) { 1252 this.xDown = null; 1253 this.yDown = null; 1254 this.element = typeof element === 'string' ? getElement(element) : element; 1255 1256 this.element.addEventListener( 1257 'touchstart', 1258 function (evt) { 1259 this.xDown = evt.touches[0].clientX; 1260 this.yDown = evt.touches[0].clientY; 1261 }.bind(this), 1262 false, 1263 ); 1264 } 1265 onLeft(callback) { 1266 this.onLeft = callback; 1267 1268 return this; 1269 } 1270 onRight(callback) { 1271 this.onRight = callback; 1272 1273 return this; 1274 } 1275 onUp(callback) { 1276 this.onUp = callback; 1277 1278 return this; 1279 } 1280 onDown(callback) { 1281 this.onDown = callback; 1282 1283 return this; 1284 } 1285 handleTouchMove(evt) { 1286 if (!this.xDown || !this.yDown) { 1287 return; 1288 } 1289 1290 const xUp = evt.touches[0].clientX; 1291 const yUp = evt.touches[0].clientY; 1292 1293 this.xDiff = this.xDown - xUp; 1294 this.yDiff = this.yDown - yUp; 1295 1296 if (Math.abs(this.xDiff) > Math.abs(this.yDiff)) { 1297 // Most significant. 1298 if (this.xDiff > 0) { 1299 this.onLeft(); 1300 } else { 1301 this.onRight(); 1302 } 1303 } else { 1304 if (this.yDiff > 0) { 1305 this.onUp(); 1306 } else { 1307 this.onDown(); 1308 } 1309 } 1310 1311 // Reset values. 1312 this.xDown = null; 1313 this.yDown = null; 1314 } 1315 1316 run() { 1317 this.element.addEventListener( 1318 'touchmove', 1319 function (evt) { 1320 this.handleTouchMove(evt); 1321 }.bind(this), 1322 false, 1323 ); 1324 } 1325} 1326 1327// TODO: add to WP 1328const numberWithCommas = (x) => { 1329 let n = x; 1330 let parts = (+n).toFixed(2).split('.'); 1331 let num = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',') + (+parts[1] ? '.' + parts[1] : ''); 1332 // return x.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ','); 1333 return num; 1334}; 1335 1336const numberWithCommasCalc = (x) => { 1337 return x.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ','); 1338}; 1339 1340function ifItemExist(item) { 1341 if (item != null && item != undefined) { 1342 return true; 1343 } else { 1344 return false;
1345 } 1346} 1347 1348function getRandomInt(max) { 1349 return Math.floor(Math.random() * max); 1350} 1351 1352function fits(x, y) { 1353 if (Number.isInteger(y / x)) { 1354 return true; 1355 } 1356 return false; 1357} 1358 1359function updateTextView(_obj) { 1360 var num = getNumber(_obj.value); 1361 if (num == 0) { 1362 _obj.value = parseInt(_obj.getAttribute('min')); 1363 } else { 1364 _obj.value = num.toLocaleString(); 1365 } 1366 return _obj.value; 1367} 1368 1369function getNumber(_str) { 1370 var arr = _str.split(''); 1371 var out = new Array(); 1372 for (var cnt = 0; cnt < arr.length; cnt++) { 1373 if (isNaN(arr[cnt]) == false) { 1374 out.push(arr[cnt]); 1375 } 1376 } 1377 return Number(out.join('')); 1378} 1379 1380function addMultipleListeners(element, events, handler, useCapture, args) { 1381 if (!(events instanceof Array)) { 1382 throw 'addMultipleListeners: ' + 'please supply an array of eventstrings ' + '(like ["click","mouseover"])'; 1383 } 1384 //create a wrapper to be able to use additional arguments 1385 var handlerFn = function (e) { 1386 handler.apply(this, args && args instanceof Array ? args : []); 1387 }; 1388 for (var i = 0; i < events.length; i += 1) { 1389 element.addEventListener(events[i], handlerFn, useCapture); 1390 } 1391} 1392 1393function sanitizeInput(input) { 1394 const sanitizedInput = input 1395 .replace(/&/g, "&") 1396 .replace(/</g, "<") 1397 .replace(/>/g, ">") 1398 .replace(/"/g, """) 1399 .replace(/'/g, "'"); 1400 return sanitizedInput; 1401} 1402 1403const initBackEnd = () => { 1404 toggleToc(); 1405 initCopyToClipboard(); 1406}; 1407 1408if ( window.location.pathname !== "/" ) { 1409 ready(initBackEnd); 1410}
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.