/*! elementor - v3.3.1 - 20-07-2021 */
(self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["text-path"],{

/***/ "../assets/dev/js/frontend/utils/utils.js":
/*!************************************************!*\
  !*** ../assets/dev/js/frontend/utils/utils.js ***!
  \************************************************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: __webpack_exports__, __webpack_require__ */
/*! CommonJS bailout: exports is used directly at 5:23-30 */
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {

"use strict";


var _Object$defineProperty = __webpack_require__(/*! @babel/runtime-corejs2/core-js/object/define-property */ "../node_modules/@babel/runtime-corejs2/core-js/object/define-property.js");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.escapeHTML = void 0;

__webpack_require__(/*! core-js/modules/es6.regexp.replace.js */ "../node_modules/core-js/modules/es6.regexp.replace.js");

// Escape HTML special chars to prevent XSS.
var escapeHTML = function escapeHTML(str) {
  var specialChars = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    "'": '&#39;',
    '"': '&quot;'
  };
  return str.replace(/[&<>'"]/g, function (tag) {
    return specialChars[tag] || tag;
  });
};

exports.escapeHTML = escapeHTML;

/***/ }),

/***/ "../modules/shapes/assets/js/frontend/handlers/text-path.js":
/*!******************************************************************!*\
  !*** ../modules/shapes/assets/js/frontend/handlers/text-path.js ***!
  \******************************************************************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: __webpack_exports__, __webpack_require__ */
/*! CommonJS bailout: exports is used directly at 7:23-30 */
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {

"use strict";


var _interopRequireDefault = __webpack_require__(/*! @babel/runtime-corejs2/helpers/interopRequireDefault */ "../node_modules/@babel/runtime-corejs2/helpers/interopRequireDefault.js");

var _Object$defineProperty = __webpack_require__(/*! @babel/runtime-corejs2/core-js/object/define-property */ "../node_modules/@babel/runtime-corejs2/core-js/object/define-property.js");

_Object$defineProperty(exports, "__esModule", {
  value: true
});

exports.default = void 0;

__webpack_require__(/*! core-js/modules/es6.regexp.split.js */ "../node_modules/core-js/modules/es6.regexp.split.js");

__webpack_require__(/*! core-js/modules/es6.regexp.replace.js */ "../node_modules/core-js/modules/es6.regexp.replace.js");

__webpack_require__(/*! core-js/modules/es6.string.link.js */ "../node_modules/core-js/modules/es6.string.link.js");

var _parseInt2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime-corejs2/core-js/parse-int */ "../node_modules/@babel/runtime-corejs2/core-js/parse-int.js"));

var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime-corejs2/helpers/classCallCheck */ "../node_modules/@babel/runtime-corejs2/helpers/classCallCheck.js"));

var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime-corejs2/helpers/createClass */ "../node_modules/@babel/runtime-corejs2/helpers/createClass.js"));

var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime-corejs2/helpers/inherits */ "../node_modules/@babel/runtime-corejs2/helpers/inherits.js"));

var _createSuper2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime-corejs2/helpers/createSuper */ "../node_modules/@babel/runtime-corejs2/helpers/createSuper.js"));

var _utils = __webpack_require__(/*! elementor-frontend/utils/utils */ "../assets/dev/js/frontend/utils/utils.js");

var TextPathHandler = /*#__PURE__*/function (_elementorModules$fro) {
  (0, _inherits2.default)(TextPathHandler, _elementorModules$fro);

  var _super = (0, _createSuper2.default)(TextPathHandler);

  function TextPathHandler() {
    (0, _classCallCheck2.default)(this, TextPathHandler);
    return _super.apply(this, arguments);
  }

  (0, _createClass2.default)(TextPathHandler, [{
    key: "getDefaultSettings",
    value: function getDefaultSettings() {
      return {
        selectors: {
          pathContainer: '.e-text-path',
          svg: '.e-text-path > svg'
        }
      };
    }
  }, {
    key: "getDefaultElements",
    value: function getDefaultElements() {
      var _this$getSettings = this.getSettings(),
          selectors = _this$getSettings.selectors;

      var element = this.$element[0];
      return {
        widgetWrapper: element,
        pathContainer: element.querySelector(selectors.pathContainer),
        svg: element.querySelector(selectors.svg),
        textPath: element.querySelector(selectors.textPath)
      };
    }
    /**
     * Initialize the object.
     *
     * @returns {void}
     */

  }, {
    key: "onInit",
    value: function onInit() {
      this.elements = this.getDefaultElements(); // Generate unique IDs using the wrapper's `data-id`.

      this.pathId = "e-path-".concat(this.elements.widgetWrapper.dataset.id);
      this.textPathId = "e-text-path-".concat(this.elements.widgetWrapper.dataset.id);

      if (!this.elements.svg) {
        return;
      }

      this.initTextPath();
    }
    /**
     *  Gets a text offset (relative to the starting point) as a string or int, and set it as percents to the
     *  `startOffset` attribute of the `<textPath>` element.
     *
     * @param offset {string|int} The text start offset.
     *
     * @returns {void}
     */

  }, {
    key: "setOffset",
    value: function setOffset(offset) {
      if (!this.elements.textPath) {
        return;
      }

      if (this.isRTL()) {
        offset = 100 - (0, _parseInt2.default)(offset);
      }

      this.elements.textPath.setAttribute('startOffset', offset + '%');
    }
    /**
     * Handle element settings changes.
     *
     * @param setting {Object} The settings object from the editor.
     *
     * @returns {void}
     */

  }, {
    key: "onElementChange",
    value: function onElementChange(setting) {
      var _this$getElementSetti = this.getElementSettings(),
          startPoint = _this$getElementSetti.start_point,
          text = _this$getElementSetti.text;

      switch (setting) {
        case 'start_point':
          this.setOffset(startPoint.size);
          break;

        case 'text':
          this.setText(text);
          break;

        case 'text_path_direction':
          this.setOffset(startPoint.size);
          this.setText(text);
          break;

        default:
          break;
      }
    }
    /**
     * Attach a unique ID to the `path` element in the SVG, based on the container's ID.
     * This function selects the first `path` with a `data-path-anchor` attribute, or defaults to the first `path` element.
     *
     * @returns {void}
     */

  }, {
    key: "attachIdToPath",
    value: function attachIdToPath() {
      // Prioritize the custom `data` attribute over the `path` element, and fallback to the first `path`.
      var path = this.elements.svg.querySelector('[data-path-anchor]') || this.elements.svg.querySelector('path');
      path.id = this.pathId;
    }
    /**
     * Initialize & build the SVG markup of the widget using the settings from the panel.
     *
     * @returns {void}
     */

  }, {
    key: "initTextPath",
    value: function initTextPath() {
      var _this$getElementSetti2 = this.getElementSettings(),
          startPoint = _this$getElementSetti2.start_point;

      var text = this.elements.pathContainer.dataset.text;
      this.attachIdToPath(); // Generate the `textPath` element with its settings.

      this.elements.svg.innerHTML += "\n\t\t\t<text>\n\t\t\t\t<textPath id=\"".concat(this.textPathId, "\" href=\"#").concat(this.pathId, "\"></textPath>\n\t\t\t</text>\n\t\t"); // Regenerate the elements object to have access to `this.elements.textPath`.

      this.elements.textPath = this.elements.svg.querySelector("#".concat(this.textPathId));
      this.setOffset(startPoint.size);
      this.setText(text);
    }
    /**
     * Sets the text on the SVG path, including the link (if set) and its properties.
     *
     * @param newText {string} The new text to put in the text path.
     *
     * @returns {void}
     */

  }, {
    key: "setText",
    value: function setText(newText) {
      var _this$getElementSetti4;

      var _this$getElementSetti3 = (_this$getElementSetti4 = this.getElementSettings()) === null || _this$getElementSetti4 === void 0 ? void 0 : _this$getElementSetti4.link,
          url = _this$getElementSetti3.url,
          isExternal = _this$getElementSetti3.is_external,
          nofollow = _this$getElementSetti3.nofollow;

      var target = isExternal ? '_blank' : '',
          rel = nofollow ? 'nofollow' : ''; // Add link attributes.

      if (url) {
        newText = "<a href=\"".concat((0, _utils.escapeHTML)(url), "\" rel=\"").concat(rel, "\" target=\"").concat(target, "\">").concat((0, _utils.escapeHTML)(newText), "</a>");
      } // Set the text.


      this.elements.textPath.innerHTML = newText; // Remove the cloned element if exists.

      var existingClone = this.elements.svg.querySelector("#".concat(this.textPathId, "-clone"));

      if (existingClone) {
        existingClone.remove();
      } // Reverse the text if needed.


      if (this.shouldReverseText()) {
        // Keep an invisible selectable copy of original element for better a11y.
        var clone = this.elements.textPath.cloneNode();
        clone.id += '-clone';
        clone.classList.add('elementor-hidden');
        clone.textContent = newText;
        this.elements.textPath.parentNode.appendChild(clone);
        this.reverseToRTL();
      }
    }
    /**
     * Determine if the text direction of the widget should be RTL or not, based on the site direction and the widget's settings.
     *
     * @returns {boolean}
     */

  }, {
    key: "isRTL",
    value: function isRTL() {
      var _this$getElementSetti5 = this.getElementSettings(),
          direction = _this$getElementSetti5.text_path_direction;

      var isRTL = elementorFrontend.config.is_rtl;

      if (direction) {
        isRTL = 'rtl' === direction;
      }

      return isRTL;
    }
    /**
     * Determine if it should RTL the text (reversing it, etc.).
     *
     * @returns {boolean}
     */

  }, {
    key: "shouldReverseText",
    value: function shouldReverseText() {
      return this.isRTL() && -1 === navigator.userAgent.indexOf('Firefox');
    }
    /**
     * Reverse the text path to support RTL.
     *
     * @returns {void}
     */

  }, {
    key: "reverseToRTL",
    value: function reverseToRTL() {
      // Make sure to use the inner `a` tag if exists.
      var parentElement = this.elements.textPath;
      parentElement = parentElement.querySelector('a') || parentElement; // Catch all RTL chars and reverse their order.

      var pattern = /([\u0591-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC\s$&+,:;=?@#|'<>.^*()%!-]+)/ig; // Reverse the text.

      parentElement.textContent = parentElement.textContent.replace(pattern, function (word) {
        return word.split('').reverse().join('');
      }); // Add a11y attributes.

      parentElement.setAttribute('aria-hidden', true);
    }
  }]);
  return TextPathHandler;
}(elementorModules.frontend.handlers.Base);

exports.default = TextPathHandler;

/***/ }),

/***/ "../node_modules/core-js/modules/_string-html.js":
/*!*******************************************************!*\
  !*** ../node_modules/core-js/modules/_string-html.js ***!
  \*******************************************************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: module, __webpack_require__ */
/*! CommonJS bailout: module.exports is used directly at 12:0-14 */
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

var $export = __webpack_require__(/*! ./_export */ "../node_modules/core-js/modules/_export.js");
var fails = __webpack_require__(/*! ./_fails */ "../node_modules/core-js/modules/_fails.js");
var defined = __webpack_require__(/*! ./_defined */ "../node_modules/core-js/modules/_defined.js");
var quot = /"/g;
// B.2.3.2.1 CreateHTML(string, tag, attribute, value)
var createHTML = function (string, tag, attribute, value) {
  var S = String(defined(string));
  var p1 = '<' + tag;
  if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
  return p1 + '>' + S + '</' + tag + '>';
};
module.exports = function (NAME, exec) {
  var O = {};
  O[NAME] = exec(createHTML);
  $export($export.P + $export.F * fails(function () {
    var test = ''[NAME]('"');
    return test !== test.toLowerCase() || test.split('"').length > 3;
  }), 'String', O);
};


/***/ }),

/***/ "../node_modules/core-js/modules/es6.regexp.replace.js":
/*!*************************************************************!*\
  !*** ../node_modules/core-js/modules/es6.regexp.replace.js ***!
  \*************************************************************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: __webpack_require__ */
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

"use strict";


var anObject = __webpack_require__(/*! ./_an-object */ "../node_modules/core-js/modules/_an-object.js");
var toObject = __webpack_require__(/*! ./_to-object */ "../node_modules/core-js/modules/_to-object.js");
var toLength = __webpack_require__(/*! ./_to-length */ "../node_modules/core-js/modules/_to-length.js");
var toInteger = __webpack_require__(/*! ./_to-integer */ "../node_modules/core-js/modules/_to-integer.js");
var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "../node_modules/core-js/modules/_advance-string-index.js");
var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "../node_modules/core-js/modules/_regexp-exec-abstract.js");
var max = Math.max;
var min = Math.min;
var floor = Math.floor;
var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g;
var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g;

var maybeToString = function (it) {
  return it === undefined ? it : String(it);
};

// @@replace logic
__webpack_require__(/*! ./_fix-re-wks */ "../node_modules/core-js/modules/_fix-re-wks.js")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {
  return [
    // `String.prototype.replace` method
    // https://tc39.github.io/ecma262/#sec-string.prototype.replace
    function replace(searchValue, replaceValue) {
      var O = defined(this);
      var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
      return fn !== undefined
        ? fn.call(searchValue, O, replaceValue)
        : $replace.call(String(O), searchValue, replaceValue);
    },
    // `RegExp.prototype[@@replace]` method
    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace
    function (regexp, replaceValue) {
      var res = maybeCallNative($replace, regexp, this, replaceValue);
      if (res.done) return res.value;

      var rx = anObject(regexp);
      var S = String(this);
      var functionalReplace = typeof replaceValue === 'function';
      if (!functionalReplace) replaceValue = String(replaceValue);
      var global = rx.global;
      if (global) {
        var fullUnicode = rx.unicode;
        rx.lastIndex = 0;
      }
      var results = [];
      while (true) {
        var result = regExpExec(rx, S);
        if (result === null) break;
        results.push(result);
        if (!global) break;
        var matchStr = String(result[0]);
        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
      }
      var accumulatedResult = '';
      var nextSourcePosition = 0;
      for (var i = 0; i < results.length; i++) {
        result = results[i];
        var matched = String(result[0]);
        var position = max(min(toInteger(result.index), S.length), 0);
        var captures = [];
        // NOTE: This is equivalent to
        //   captures = result.slice(1).map(maybeToString)
        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
        // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));
        var namedCaptures = result.groups;
        if (functionalReplace) {
          var replacerArgs = [matched].concat(captures, position, S);
          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
          var replacement = String(replaceValue.apply(undefined, replacerArgs));
        } else {
          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
        }
        if (position >= nextSourcePosition) {
          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
          nextSourcePosition = position + matched.length;
        }
      }
      return accumulatedResult + S.slice(nextSourcePosition);
    }
  ];

    // https://tc39.github.io/ecma262/#sec-getsubstitution
  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {
    var tailPos = position + matched.length;
    var m = captures.length;
    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
    if (namedCaptures !== undefined) {
      namedCaptures = toObject(namedCaptures);
      symbols = SUBSTITUTION_SYMBOLS;
    }
    return $replace.call(replacement, symbols, function (match, ch) {
      var capture;
      switch (ch.charAt(0)) {
        case '$': return '$';
        case '&': return matched;
        case '`': return str.slice(0, position);
        case "'": return str.slice(tailPos);
        case '<':
          capture = namedCaptures[ch.slice(1, -1)];
          break;
        default: // \d\d?
          var n = +ch;
          if (n === 0) return match;
          if (n > m) {
            var f = floor(n / 10);
            if (f === 0) return match;
            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
            return match;
          }
          capture = captures[n - 1];
      }
      return capture === undefined ? '' : capture;
    });
  }
});


/***/ }),

/***/ "../node_modules/core-js/modules/es6.string.link.js":
/*!**********************************************************!*\
  !*** ../node_modules/core-js/modules/es6.string.link.js ***!
  \**********************************************************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: __webpack_require__ */
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {

"use strict";

// B.2.3.10 String.prototype.link(url)
__webpack_require__(/*! ./_string-html */ "../node_modules/core-js/modules/_string-html.js")('link', function (createHTML) {
  return function link(url) {
    return createHTML(this, 'a', 'href', url);
  };
});


/***/ })

}]);
//# sourceMappingURL=text-path.a25111b02271055ec181.bundle.js.map