diff --git a/build/index.js b/build/index.js index 968ec8ba..a3546068 100644 --- a/build/index.js +++ b/build/index.js @@ -570,14 +570,14 @@ var deepClone = function deepClone(host) { parent.appendChild(clone); if (node.shadowRoot) { - walkTree(node.shadowRoot.firstChild, clone, shadowNodeId); - handleAdoptedStyleSheets(node.shadowRoot, clone, shadowNodeId); + var rootShadowNodeId = shadowNodeId; + shadowNodeId++; + walkTree(node.shadowRoot.firstChild, clone, rootShadowNodeId); + handleAdoptedStyleSheets(node.shadowRoot, clone, rootShadowNodeId); if (typeof clone.setAttribute !== "undefined") { - clone.setAttribute("bb-shadow-parent", shadowNodeId); + clone.setAttribute("bb-shadow-parent", rootShadowNodeId); } - - ++shadowNodeId; } walkTree(node.firstChild, clone); @@ -6527,7 +6527,7 @@ var Gleap_Gleap = /*#__PURE__*/function () { currentUrl: window.location.href, language: navigator.language || navigator.userLanguage, mobile: isMobile(), - sdkVersion: "6.9.0", + sdkVersion: "6.9.1", sdkType: "javascript" }; } diff --git a/package.json b/package.json index ba3f91ac..99324c6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gleap", - "version": "6.9.0", + "version": "6.9.1", "main": "build/index.js", "scripts": { "start": "webpack serve", diff --git a/published/6.9.1/appwidget.min.css b/published/6.9.1/appwidget.min.css new file mode 100644 index 00000000..ecd67215 --- /dev/null +++ b/published/6.9.1/appwidget.min.css @@ -0,0 +1 @@ +*{box-sizing:border-box;margin:0;padding:0;border:none}.bb-feedback-dialog-backdrop{display:none!important}.bb-feedback-dialog-container{display:flex;justify-content:center;align-items:center;height:100vh;width:100vw}.bb-feedback-dialog{position:initial;animation-name:none;box-shadow:0 0 15px 0 rgba(0,0,0,.2);width:calc(100% - 20px)}.bb-feedback-dialog-header-close{position:absolute;top:20px;right:20px;display:flex;justify-content:center;align-items:center;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-dialog-header-close svg{width:24px;height:24px}.bb-feedback-dialog-header-next{height:40px;min-width:40px;display:flex;justify-content:center;align-items:center;background-color:#fff;border-radius:20px;padding-right:12px;padding-left:15px;box-shadow:0 5px 15px 0 rgb(0 0 0 / 15%)}.bb-feedback-dialog-header-next span{font-family:Inter,sans-serif;font-weight:600;font-size:16px;color:#192027;margin-right:10px}.bb-feedback-dialog-header-next svg{fill:#192027}.bb-feedback-dialog-header-next svg{width:18px;height:auto;transform:rotate(180deg)}.bb-feedback-dialog-header-next:hover{background-color:rgba(255,255,255,.75);cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-screenshot-editor-canv{display:flex;justify-content:center;padding-top:20px;padding-left:20px;padding-right:20px}#bb-screenshot-editor-canvas{width:auto;height:auto;background-color:#fff;box-shadow:0 5px 20px 0 rgb(0 0 0 / 30%);border-radius:8px}.bb-drawing-container{display:flex;justify-content:center;padding-top:20px;padding-bottom:10px}.bb-drawing-tools{display:flex;align-items:center}.bb-drawing-tool-item{width:44px;height:44px;display:flex;justify-content:center;align-items:center;padding:11px;cursor:pointer;-webkit-tap-highlight-color:transparent;border-radius:16px}.bb-drawing-tool-item--last{margin-right:5px}.bb-drawing-tool-action{width:44px;height:44px;display:flex;justify-content:center;align-items:center;padding:11px;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-drawing-tool-action svg{width:32px;height:32px;object-fit:contain}.bb-drawing-tool-action--disabled{opacity:.2;cursor:not-allowed}.bb-drawing-tool-spacer{width:1px;height:32px;margin:0 10px}.bb-drawing-tool-item svg{width:32px;height:32px;object-fit:contain}.bb-drawing-coloritem{width:36px;height:36px;border-radius:100%;margin:0 4px;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-drawing-coloritem--active{border:4px solid #00000033}#bb-drawing-color{width:26px;height:26px;border-radius:100%;box-shadow:0 0 10px 0 rgb(0 0 0 / 15%);cursor:pointer;-webkit-tap-highlight-color:transparent;margin:9px 5px}#bb-drawing-colorpopup{display:none;position:fixed;bottom:85px;left:50%;transform:translate(-50%,0);background:#fff;padding:8px;border-radius:8px;box-shadow:0 0 10px 0 rgb(0 0 0 / 15%)}.bb-feedback-dialog-drawing{background-color:#fff;max-width:100%;width:auto}@media only screen and (max-width:767px) and (orientation:portrait){.bb-feedback-dialog-drawing{max-width:calc(100% - 20px);width:100%}}.bb-anim-fadein{animation-duration:0s!important;animation-fill-mode:both!important;animation-name:none!important} \ No newline at end of file diff --git a/published/6.9.1/index.js b/published/6.9.1/index.js new file mode 100644 index 00000000..a3546068 --- /dev/null +++ b/published/6.9.1/index.js @@ -0,0 +1,7504 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Gleap"] = factory(); + else + root["Gleap"] = factory(); +})(this, function() { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": () => (/* binding */ src) +}); + +;// CONCATENATED MODULE: ./src/GleapHelper.js +var resizeImage = function resizeImage(base64Str) { + var maxWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 400; + var maxHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 400; + return new Promise(function (resolve, reject) { + var isJPEG = base64Str.indexOf("data:image/jpeg") === 0; + var img = new Image(); + img.src = base64Str; + + img.onerror = function () { + reject(); + }; + + img.onload = function () { + var canvas = document.createElement("canvas"); + var MAX_WIDTH = maxWidth; + var MAX_HEIGHT = maxHeight; // Adjust max width / height based on image props + + if (maxWidth > img.width / 4) { + MAX_WIDTH = img.width / 4; + } + + if (maxHeight > img.height / 4) { + MAX_HEIGHT = img.height / 4; + } + + var width = img.width; + var height = img.height; + + if (width > height) { + if (width > MAX_WIDTH) { + height *= MAX_WIDTH / width; + width = MAX_WIDTH; + } + } else { + if (height > MAX_HEIGHT) { + width *= MAX_HEIGHT / height; + height = MAX_HEIGHT; + } + } + + canvas.width = width; + canvas.height = height; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0, width, height); + + if (isJPEG) { + resolve(canvas.toDataURL("image/jpeg", 0.7)); + } else { + resolve(canvas.toDataURL()); + } + }; + }); +}; +var isMobile = function isMobile() { + if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))) { + return true; + } + + return false; +}; +var loadFromGleapCache = function loadFromGleapCache(key) { + try { + var cachedData = localStorage.getItem("gleap-widget-".concat(key)); + + if (cachedData) { + var config = JSON.parse(cachedData); + return config; + } + } catch (exp) {} + + return null; +}; +var truncateString = function truncateString(str, num) { + if (str.length > num) { + return str.slice(0, num) + "..."; + } else { + return str; + } +}; +var saveToGleapCache = function saveToGleapCache(key, data) { + var k = "gleap-widget-".concat(key); + + if (data) { + try { + localStorage.setItem(k, JSON.stringify(data)); + } catch (exp) {} + } else { + localStorage.removeItem(k); + } +}; +var getDOMElementDescription = function getDOMElementDescription(element) { + var html = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var innerText = truncateString(element.innerText || '', 40).replace(/(\r\n|\n|\r)/gm, "").replace(/ +(?= )/g, ''); + var elementId = ""; + var elementClass = ""; + + if (typeof element.getAttribute !== "undefined") { + var elemId = element.getAttribute("id"); + + if (elemId) { + elementId = " id=\"".concat(elemId, "\""); + } + + var elemClass = element.getAttribute("class"); + + if (elemClass) { + elementClass = " class=\"".concat(elemClass, "\""); + } + } + + var elementTag = (element.tagName || '').toLowerCase(); + var htmlPre = "<"; + var htmlPost = ">"; + + if (!html) { + htmlPre = "["; + htmlPost = "]"; + } + + return "".concat(htmlPre).concat(elementTag).concat(elementId).concat(elementClass).concat(htmlPost).concat(innerText).concat(htmlPre, "/").concat(elementTag).concat(htmlPost); +}; +;// CONCATENATED MODULE: ./src/ResourceExclusionList.js +var blacklist = ["//fonts.googleapis.com", "//cdn.jsdelivr.net", "//cdnjs.cloudflare.com", "//ajax.googleapis.com", "//use.typekit.net", ".amazonaws.com", "//jssdk.gleap.io", ".gstatic.com"]; +var isBlacklisted = function isBlacklisted(url) { + if (!url) { + return false; + } + + for (var i = 0; i < blacklist.length; i++) { + if (url.indexOf(blacklist[i]) !== -1) { + return true; + } + } + + return false; +}; +;// CONCATENATED MODULE: ./src/ScreenCapture.js + + +var startScreenCapture = function startScreenCapture(isLiveSite) { + return prepareScreenshotData(isLiveSite); +}; + +var documentToHTML = function documentToHTML(clone) { + var html = ""; + var node = window.document.doctype; + + if (node) { + html = ""; + } + + if (clone && clone.childNodes && clone.childNodes.length > 0) { + for (var i = 0; i < clone.childNodes.length; i++) { + if (clone.childNodes[i]) { + html += clone.childNodes[i].outerHTML; + } + } + } + + return html; +}; + +var replaceAsync = function replaceAsync(str, regex, asyncFn) { + return new Promise(function (resolve, reject) { + var promises = []; + str.replace(regex, function (match) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var promise = asyncFn.apply(void 0, [match].concat(args)); + promises.push(promise); + }); + Promise.all(promises).then(function (data) { + resolve(str.replace(regex, function () { + return data.shift(); + })); + })["catch"](function () { + reject(); + }); + }); +}; + +var loadCSSUrlResources = function loadCSSUrlResources(data, basePath) { + return replaceAsync(data, /url\((.*?)\)/g, function (matchedData) { + return new Promise(function (resolve, reject) { + if (!matchedData) { + return resolve(matchedData); + } + + var matchedUrl = matchedData.substr(4, matchedData.length - 5).replaceAll("'", "").replaceAll('"', ""); // Remote file or data + + if (matchedUrl.indexOf("http") === 0 || matchedUrl.indexOf("//") === 0 || matchedUrl.indexOf("data") === 0) { + return resolve(matchedData); + } + + try { + var resourcePath = matchedUrl; + + if (basePath) { + resourcePath = basePath + "/" + matchedUrl; + } + + return fetchCSSResource(resourcePath).then(function (resourceData) { + return resolve("url(" + resourceData + ")"); + }); + } catch (exp) { + return resolve(matchedData); + } + }); + }); +}; + +var fetchCSSResource = function fetchCSSResource(url) { + return new Promise(function (resolve, reject) { + if (url) { + var xhr = new XMLHttpRequest(); + + xhr.onload = function () { + var reader = new FileReader(); + + reader.onloadend = function () { + resolve(reader.result); + }; + + reader.onerror = function () { + reject(); + }; + + reader.readAsDataURL(xhr.response); + }; + + xhr.onerror = function (err) { + resolve(); + }; + + xhr.open("GET", url); + xhr.responseType = "blob"; + xhr.send(); + } else { + resolve(); + } + }); +}; + +var progressResource = function progressResource(data, elem, resolve, reject) { + resizeImage(data, 500, 500).then(function (data) { + elem.src = data; + resolve(); + })["catch"](function () { + console.warn("BB: Image resize failed."); + resolve(); + }); +}; + +var fetchItemResource = function fetchItemResource(elem) { + return new Promise(function (resolve, reject) { + if (elem && elem.src) { + if (isBlacklisted(elem.src)) { + return resolve(); + } + + var xhr = new XMLHttpRequest(); + + xhr.onload = function () { + var reader = new FileReader(); + + reader.onloadend = function () { + progressResource(reader.result, elem, resolve, reject); + }; + + reader.onerror = function () { + resolve(); + }; + + reader.readAsDataURL(xhr.response); + }; + + xhr.onerror = function (err) { + resolve(); + }; + + var url = elem.src; + xhr.open("GET", url); + xhr.responseType = "blob"; + xhr.send(); + } else { + resolve(); + } + }); +}; + +var downloadAllImages = function downloadAllImages(dom) { + var imgItems = dom.querySelectorAll("img"); + var imgItemsPromises = []; + + for (var i = 0; i < imgItems.length; i++) { + var item = imgItems[i]; + imgItemsPromises.push(fetchItemResource(item)); + } + + return Promise.all(imgItemsPromises); +}; + +var replaceStyleNodes = function replaceStyleNodes(clone, styleSheet, cssTextContent, styleId) { + { + var cloneTargetNode = null; + + if (styleSheet.ownerNode) { + cloneTargetNode = clone.querySelector('[bb-styleid="' + styleId + '"]'); + } + + try { + if (cloneTargetNode) { + var replacementNode = null; + + if (cssTextContent != "") { + // Create node. + var head = clone.querySelector("head"); + var styleNode = window.document.createElement("style"); + head.appendChild(styleNode); + styleNode.type = "text/css"; + + if (styleNode.styleSheet) { + styleNode.styleSheet.cssText = cssTextContent; + } else { + styleNode.appendChild(window.document.createTextNode(cssTextContent)); + } + + replacementNode = styleNode; + } else { + var linkNode = window.document.createElement("link"); + linkNode.rel = "stylesheet"; + linkNode.type = styleSheet.type; + linkNode.href = styleSheet.href; + linkNode.media = styleSheet.media; + replacementNode = linkNode; + } + + if (replacementNode) { + cloneTargetNode.parentNode.insertBefore(replacementNode, cloneTargetNode); + cloneTargetNode.remove(); + } + } + } catch (exp) {} + } +}; + +var getTextContentFromStyleSheet = function getTextContentFromStyleSheet(styleSheet) { + var cssRules = null; + + try { + if (styleSheet.cssRules) { + cssRules = styleSheet.cssRules; + } else if (styleSheet.rules) { + cssRules = styleSheet.rules; + } + } catch (exp) {} + + var cssTextContent = ""; + + if (cssRules) { + for (var cssRuleItem in cssRules) { + if (cssRules[cssRuleItem].cssText) { + cssTextContent += cssRules[cssRuleItem].cssText; + } + } + } + + return cssTextContent; +}; + +var downloadAllCSSUrlResources = function downloadAllCSSUrlResources(clone, remote) { + var promises = []; + + var _loop = function _loop() { + var styleSheet = document.styleSheets[i]; + var cssTextContent = getTextContentFromStyleSheet(styleSheet); + + if (styleSheet && styleSheet.ownerNode) { + if (cssTextContent != "" && !remote) { + // Resolve resources. + var baseTags = document.getElementsByTagName("base"); + basePathURL = baseTags.length ? baseTags[0].href.substr(location.origin.length, 999) : window.location.href; + + if (styleSheet.href) { + basePathURL = styleSheet.href; + } + + var basePath = basePathURL.substring(0, basePathURL.lastIndexOf("/")); + promises.push(loadCSSUrlResources(cssTextContent, basePath).then(function (replacedStyle) { + return { + styletext: replacedStyle, + stylesheet: styleSheet, + styleId: styleSheet.ownerNode.getAttribute("bb-styleid") + }; + })); + } else { + promises.push(Promise.resolve({ + styletext: cssTextContent, + stylesheet: styleSheet, + styleId: styleSheet.ownerNode.getAttribute("bb-styleid") + })); + } + } + }; + + for (var i = 0; i < document.styleSheets.length; i++) { + var basePathURL; + + _loop(); + } + + return Promise.all(promises).then(function (results) { + if (results) { + for (var i = 0; i < results.length; i++) { + replaceStyleNodes(clone, results[i].stylesheet, results[i].styletext, results[i].styleId); + } + } + + return true; + }); +}; + +var prepareRemoteData = function prepareRemoteData(clone, remote) { + return new Promise(function (resolve, reject) { + if (remote) { + // Always download CSS. + return downloadAllCSSUrlResources(clone, remote).then(function () { + resolve(); + })["catch"](function () { + resolve(); + }); + } else { + return downloadAllImages(clone).then(function () { + return downloadAllCSSUrlResources(clone, remote).then(function () { + resolve(); + }); + })["catch"](function () { + console.warn("Gleap: Failed with resolving local resources. Please contact the Gleap support team."); + resolve(); + }); + } + }); +}; + +var handleAdoptedStyleSheets = function handleAdoptedStyleSheets(doc, clone, shadowNodeId) { + if (typeof doc.adoptedStyleSheets !== "undefined") { + for (var i = 0; i < doc.adoptedStyleSheets.length; i++) { + var styleSheet = doc.adoptedStyleSheets[i]; + var cssTextContent = getTextContentFromStyleSheet(styleSheet); + var shadowStyleNode = window.document.createElement("style"); + shadowStyleNode.type = "text/css"; + + if (shadowStyleNode.styleSheet) { + shadowStyleNode.styleSheet.cssText = cssTextContent; + } else { + shadowStyleNode.appendChild(window.document.createTextNode(cssTextContent)); + } + + if (shadowNodeId) { + shadowStyleNode.setAttribute("bb-shadow-child", shadowNodeId); + } + + clone.insertBefore(shadowStyleNode, clone.firstElementChild); + } + } +}; + +var deepClone = function deepClone(host) { + var shadowNodeId = 1; + + var cloneNode = function cloneNode(node, parent, shadowRoot) { + var walkTree = function walkTree(nextn, nextp, innerShadowRoot) { + while (nextn) { + cloneNode(nextn, nextp, innerShadowRoot); + nextn = nextn.nextSibling; + } + }; + + var clone = node.cloneNode(); + + if (typeof clone.setAttribute !== "undefined") { + if (shadowRoot) { + clone.setAttribute("bb-shadow-child", shadowRoot); + } + + if (node instanceof HTMLCanvasElement) { + clone.setAttribute("bb-canvas-data", node.toDataURL()); + } + + if (node instanceof HTMLCanvasElement) { + clone.setAttribute("bb-canvas-data", node.toDataURL()); + } + } + + if (node.nodeType == Node.ELEMENT_NODE) { + var tagName = node.tagName ? node.tagName.toUpperCase() : node.tagName; + + if (tagName == "IFRAME" || tagName == "VIDEO" || tagName == "EMBED" || tagName == "IMG" || tagName == "SVG") { + var boundingRect = node.getBoundingClientRect(); + clone.setAttribute("bb-element", true); + clone.setAttribute("bb-height", boundingRect.height); + clone.setAttribute("bb-width", boundingRect.width); + } + + if (tagName == "DIV" && (node.scrollTop > 0 || node.scrollLeft > 0)) { + clone.setAttribute("bb-scrollpos", true); + clone.setAttribute("bb-scrolltop", node.scrollTop); + clone.setAttribute("bb-scrollleft", node.scrollLeft); + } + + if (tagName === "SELECT" || tagName === "TEXTAREA" || tagName === "INPUT") { + var val = node.value; + + if (node.getAttribute("gleap-ignore") === "value") { + val = new Array(val.length + 1).join("*"); + } + + clone.setAttribute("bb-data-value", val); + + if ((node.type === "checkbox" || node.type === "radio") && node.checked) { + clone.setAttribute("bb-data-checked", true); + } + } + } + + parent.appendChild(clone); + + if (node.shadowRoot) { + var rootShadowNodeId = shadowNodeId; + shadowNodeId++; + walkTree(node.shadowRoot.firstChild, clone, rootShadowNodeId); + handleAdoptedStyleSheets(node.shadowRoot, clone, rootShadowNodeId); + + if (typeof clone.setAttribute !== "undefined") { + clone.setAttribute("bb-shadow-parent", rootShadowNodeId); + } + } + + walkTree(node.firstChild, clone); + }; + + var fragment = document.createDocumentFragment(); + cloneNode(host, fragment); // Work on adopted stylesheets. + + var clonedHead = fragment.querySelector("head"); + + if (!clonedHead) { + clonedHead = fragment; + } + + handleAdoptedStyleSheets(window.document, clonedHead); + return fragment; +}; + +var prepareScreenshotData = function prepareScreenshotData(remote) { + return new Promise(function (resolve, reject) { + var styleTags = window.document.querySelectorAll("style, link"); + + for (var i = 0; i < styleTags.length; ++i) { + styleTags[i].setAttribute("bb-styleid", i); + } + + var clone = deepClone(window.document.documentElement); // Fix for web imports (depracted). + + var linkImportElems = clone.querySelectorAll("link[rel=import]"); + + for (var i = 0; i < linkImportElems.length; ++i) { + var referenceNode = linkImportElems[i]; + + if (referenceNode && referenceNode.childNodes && referenceNode.childNodes.length > 0) { + var childNodes = referenceNode.childNodes; + + while (childNodes.length > 0) { + referenceNode.parentNode.insertBefore(childNodes[0], referenceNode); + } + + referenceNode.remove(); + } + } // Remove all scripts & style + + + var scriptElems = clone.querySelectorAll("script, noscript"); + + for (var i = 0; i < scriptElems.length; ++i) { + scriptElems[i].remove(); + } // Cleanup base path + + + var baseElems = clone.querySelectorAll("base"); + + for (var i = 0; i < baseElems.length; ++i) { + baseElems[i].remove(); + } // Fix base node + + + var baseUrl = window.location.href.substring(0, window.location.href.lastIndexOf("/")) + "/"; + var baseNode = window.document.createElement("base"); + baseNode.href = baseUrl; + var head = clone.querySelector("head"); + head.insertBefore(baseNode, head.firstChild); // Do further cleanup. + + var dialogElems = clone.querySelectorAll(".bb-feedback-dialog-container, .bb-capture-editor-borderlayer"); + + for (var i = 0; i < dialogElems.length; ++i) { + dialogElems[i].remove(); + } // Calculate heights + + + var bbElems = clone.querySelectorAll("[bb-element=true]"); + + for (var i = 0; i < bbElems.length; ++i) { + if (bbElems[i]) { + bbElems[i].style.height = bbElems[i].getAttribute("bb-height") + "px"; + } + } + + prepareRemoteData(clone, remote).then(function () { + var html = documentToHTML(clone); + resolve({ + html: html, + baseUrl: baseUrl, + width: window.innerWidth, + height: window.innerHeight, + isMobile: isMobile() + }); + }); + }); +}; +;// CONCATENATED MODULE: ./src/Translation.js + +var translateText = function translateText(key, overrideLanguage) { + var instance = src_Gleap.getInstance(); + var language = navigator.language; + + if (overrideLanguage !== "") { + language = overrideLanguage; + } + + var customTranslation = {}; + var translationKeys = Object.keys(instance.customTranslation); + + for (var i = 0; i < translationKeys.length; i++) { + var translationKey = translationKeys[i]; + + if (language && language.includes(translationKey)) { + if (instance.customTranslation[translationKey]) { + customTranslation = instance.customTranslation[translationKey]; + } + } + } + + if (customTranslation[key]) { + return customTranslation[key]; + } + + if (!key) { + return ""; + } + + return key; +}; +;// CONCATENATED MODULE: ./src/UI.js +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + + + + +var calculateShadeColor = function calculateShadeColor(col, amt) { + col = col.replace(/^#/, ""); + if (col.length === 3) col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2]; + + var _col$match = col.match(/.{2}/g), + _col$match2 = _slicedToArray(_col$match, 3), + r = _col$match2[0], + g = _col$match2[1], + b = _col$match2[2]; + + var _ref = [parseInt(r, 16) + amt, parseInt(g, 16) + amt, parseInt(b, 16) + amt]; + r = _ref[0]; + g = _ref[1]; + b = _ref[2]; + r = Math.max(Math.min(255, r), 0).toString(16); + g = Math.max(Math.min(255, g), 0).toString(16); + b = Math.max(Math.min(255, b), 0).toString(16); + var rr = (r.length < 2 ? "0" : "") + r; + var gg = (g.length < 2 ? "0" : "") + g; + var bb = (b.length < 2 ? "0" : "") + b; + return "#".concat(rr).concat(gg).concat(bb); +}; + +var calculateContrast = function calculateContrast(hex) { + var r = parseInt(hex.substr(1, 2), 16), + g = parseInt(hex.substr(3, 2), 16), + b = parseInt(hex.substr(5, 2), 16), + yiq = (r * 299 + g * 587 + b * 114) / 1000; + return yiq >= 160 ? "#000000" : "#ffffff"; +}; + +var injectStyledCSS = function injectStyledCSS(primaryColor, headerColor, buttonColor, borderRadius, backgroundColor) { + var contrastColor = calculateContrast(primaryColor); + var contrastHeaderColor = calculateContrast(headerColor); + var contrastButtonColor = calculateContrast(buttonColor); + var contrastBackgroundColor = calculateContrast(backgroundColor); + var isDarkMode = contrastBackgroundColor === "#ffffff"; + var subTextColor = isDarkMode ? calculateShadeColor(backgroundColor, 100) : calculateShadeColor(backgroundColor, -120); + var backgroundColorHover = isDarkMode ? calculateShadeColor(backgroundColor, 30) : calculateShadeColor(backgroundColor, -12); + var hoverHoverColor = isDarkMode ? calculateShadeColor(backgroundColor, 80) : calculateShadeColor(backgroundColor, -30); + var borderColor = isDarkMode ? calculateShadeColor(backgroundColor, 70) : calculateShadeColor(backgroundColor, -70); + var borderRadius = parseInt(borderRadius, 10); + + if (borderRadius === NaN || borderRadius === undefined) { + borderRadius = 20; + } + + var containerBorderRadius = Math.round(borderRadius * 0.6); + var buttonBorderRadius = Math.round(borderRadius * 1.05); + var formItemBorderRadius = Math.round(borderRadius * 0.4); + var formItemSmallBorderRadius = Math.round(borderRadius * 0.25); + var colorStyleSheet = "\n .bb-capture-preview-retrybutton {\n color: ".concat(contrastBackgroundColor, ";\n border-radius: ").concat(buttonBorderRadius, "px;\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-capture-preview-retrybutton:hover {\n background-color: ").concat(hoverHoverColor, ";\n }\n .bb-feedback-dialog-success svg {\n box-shadow: inset 0px 0px 0px ").concat(primaryColor, ";\n }\n\n @keyframes bb-suc-fill {\n 100% {\n box-shadow: inset 0px 0px 0px 30px ").concat(primaryColor, ";\n }\n }\n .bb-feedback-dialog-success svg circle {\n stroke: ").concat(primaryColor, ";\n }\n .bb-capture-dismiss {\n background-color: ").concat(primaryColor, ";\n border-bottom-left-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-capture-dismiss svg path {\n fill: ").concat(contrastColor, ";\n }\n .bb-capture-toolbar-item-spacer {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-tooltip {\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n @keyframes bbRecIconFade {\n 0% {\n fill: transparent;\n }\n 50% {\n fill: ").concat(hoverHoverColor, ";\n }\n 100% {\n fill: transparent;\n }\n }\n .bb-feedback-inputgroup--privacy-policy a,\n .bb-feedback-inputgroup--privacy-policy [type=\"checkbox\"]:not(:checked) + label,\n .bb-feedback-inputgroup--privacy-policy [type=\"checkbox\"]:checked + label {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-capture-preview-sendbutton {\n color: ").concat(contrastColor, ";\n background-color: ").concat(primaryColor, ";\n border-radius: ").concat(buttonBorderRadius, "px;\n }\n .bb-capture-button-next {\n color: ").concat(contrastColor, ";\n background-color: ").concat(primaryColor, ";\n border-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-feedback-capture-item {\n border-radius: ").concat(buttonBorderRadius, "px;\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-capture-preview-inner {\n background-color: ").concat(backgroundColor, ";\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-feedback-capture-item .bb-item-title {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-capture-toolbar-item-timer {\n color: ").concat(subTextColor, ";\n }\n .bb-feedback-capture-item-selected-icon path,\n .bb-feedback-capture-item-selected-action path,\n .bb-feedback-capture-item path {\n fill: ").concat(contrastBackgroundColor, ";\n }\n .bb-svg-path {\n fill: ").concat(contrastBackgroundColor, ";\n }\n .bb-feedback-capture-item-selected-button {\n border-radius: ").concat(formItemBorderRadius, "px;\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-feedback-capture-item-selected-label {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-feedback-capture-item-selected-action:hover {\n background-color: ").concat(hoverHoverColor, ";\n border-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-capture-toolbar-item {\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-capture-toolbar {\n background-color: ").concat(backgroundColor, ";\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-capture-toolbar-item-colorpicker {\n background-color: ").concat(backgroundColor, ";\n }\n .bb-capture-toolbar-item--active {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-feedback-capture-item:hover {\n background-color: ").concat(hoverHoverColor, ";\n }\n .bb-feedback-onetofive-button {\n border-radius: ").concat(formItemSmallBorderRadius, "px;\n }\n .bb-feedback-button-classic {\n border-top-left-radius: ").concat(formItemBorderRadius, "px;\n border-top-right-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-logo-logo--default path {\n fill: ").concat(contrastButtonColor, ";\n }\n .bb-feedback-dialog-header-logo .bb-logo-logo--default path {\n fill: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-inputgroup textarea,\n .bb-feedback-inputgroup > input,\n .bb-feedback-inputgroup input {\n border-radius: ").concat(formItemBorderRadius, "px;\n }\n .bb-feedback-dialog-header-back:hover {\n background-color: ").concat(contrastHeaderColor, ";\n border-radius: ").concat(containerBorderRadius, "px;\n }\n .bb-feedback-dialog-header-next {\n background-color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-next span {\n color: ").concat(headerColor, ";\n }\n .bb-feedback-dialog-header-next svg {\n fill: ").concat(headerColor, ";\n }\n .bb-feedback-type {\n border-radius: ").concat(containerBorderRadius, "px;\n background-color: ").concat(backgroundColor, ";\n }\n .bb-feedback-type-description,\n .bb-feedback-poweredbycontainer span,\n .bb-feedback-onetofive-description span {\n color: ").concat(subTextColor, ";\n }\n .bb-feedback-poweredbycontainer svg g {\n fill: ").concat(subTextColor, ";\n }\n .bb-feedback-type:hover {\n background-color: ").concat(backgroundColorHover, ";\n }\n #bb-drawing-colorpopup {\n background-color: ").concat(backgroundColor, ";\n }\n .bb-feedback-type-title,\n .bb-feedback-form-description,\n .bb-feedback-elementtitle,\n .bb-feedback-multiplechoice-container,\n .bb-feedback-dialog-info-text\n {\n color: ").concat(contrastBackgroundColor, ";\n }\n .bb-drawing-tool-spacer {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-feedback-dialog {\n border-radius: ").concat(borderRadius, "px;\n background-color: ").concat(backgroundColor, ";\n }\n .bb-logo-arrowdown {\n fill: ").concat(contrastButtonColor, ";\n }\n .bb-feedback-dialog-header-back svg {\n fill: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-back:hover svg {\n fill: ").concat(headerColor, ";\n }\n .bb-feedback-dialog-header-close svg {\n fill: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-title,\n .bb-feedback-dialog-header-title span {\n color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-title-small {\n color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-dialog-header-description {\n color: ").concat(contrastHeaderColor, ";\n }\n .bb-feedback-onetofive-button-active,\n .bb-feedback-onetofive-button:hover {\n background-color: ").concat(primaryColor, ";\n color: ").concat(contrastColor, ";\n } \n .bb-feedback-button-icon {\n background-color: ").concat(buttonColor, ";\n }\n .bb-feedback-multiplechoice-checkmark {\n border: 2px solid ").concat(hoverHoverColor, ";\n }\n .bb-feedback-multiplechoice-container:hover\n input\n ~ .bb-feedback-multiplechoice-checkmark {\n border: 2px solid ").concat(primaryColor, ";\n }\n .bb-feedback-multiplechoice-container input:checked ~ .bb-feedback-multiplechoice-checkmark {\n background-color: ").concat(primaryColor, ";\n border: 2px solid ").concat(primaryColor, ";\n }\n .bb-feedback-dialog-header-button {\n color: ").concat(primaryColor, ";\n }\n .bb-drawing-tool-item--active {\n background-color: ").concat(backgroundColorHover, ";\n }\n .bb-capture-editor-borderlayer {\n border-color: ").concat(primaryColor, ";\n }\n .bb-feedback-button-classic {\n background-color: ").concat(buttonColor, ";\n color: ").concat(contrastButtonColor, ";\n }\n .bb-feedback-dialog-header {\n background-color: ").concat(headerColor, ";\n }\n .bb-form-progress-inner {\n background-color: ").concat(headerColor, "66;\n }\n .bb-feedback-inputgroup textarea,\n .bb-feedback-inputgroup > input,\n .bb-feedback-inputgroup input {\n background-color: ").concat(backgroundColor, ";\n color: ").concat(contrastBackgroundColor, ";\n border-color: ").concat(borderColor, ";\n }\n .bb-feedback-inputgroup textarea:focus {\n border-color: ").concat(primaryColor, ";\n }\n .bb-feedback-inputgroup > input:focus, .bb-feedback-inputgroup input:focus {\n border-color: ").concat(primaryColor, ";\n }\n .bb-feedback-send-button {\n color: ").concat(contrastColor, ";\n background-color: ").concat(primaryColor, ";\n border-radius: ").concat(buttonBorderRadius, "px;\n }\n .bb-double-bounce1,\n .bb-double-bounce2 {\n background-color: ").concat(primaryColor, ";\n }\n .bb-feedback-dialog-header-button-cancel {\n background-color: ").concat(primaryColor, ";\n }\n .bb-feedback-type-icon {\n background-color: ").concat(primaryColor, ";\n }\n .bb-feedback-inputgroup--privacy-policy\n [type=\"checkbox\"]:not(:checked)\n + label:after,\n .bb-feedback-inputgroup--privacy-policy\n [type=\"checkbox\"]:checked\n + label:after {\n color: ").concat(primaryColor, ";\n }\n "); + var oldNode = document.querySelector(".gleap-styles"); + + if (oldNode) { + oldNode.remove(); + } + + var node = document.createElement("style"); + node.innerHTML = colorStyleSheet; + node.className = "gleap-styles"; + src_Gleap.appendNode(node); +}; +var getHeaderImage = function getHeaderImage(customLogoUrl) { + var headerImage = loadIcon("bblogo", "#fff"); + + if (customLogoUrl) { + headerImage = "\"bb-logo\""); + } + + return headerImage; +}; +var createWidgetDialog = function createWidgetDialog(title, description, customLogoUrl, content, back) { + var showBack = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var appendClass = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : ""; + var elem = document.createElement("div"); + elem.className = "bb-feedback-dialog-container"; + elem.innerHTML = "
\n
\n ").concat(back ? "
\n ".concat(loadIcon("arrowleft", "#fff"), "\n
") : "
\n ".concat(getHeaderImage(customLogoUrl), "\n
"), "\n
\n
\n ").concat(title, "\n
\n ").concat(description === null ? "" : "
\n ".concat(description, "\n
"), "\n
\n
\n ").concat(loadIcon("close", "#fff"), "\n
\n
\n
\n ").concat(content, "\n
\n Powered by\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
"); + src_Gleap.appendNode(elem); + var buttonType = src_Gleap.getInstance().buttonType; + + if (buttonType === src_Gleap.FEEDBACK_BUTTON_BOTTOM_LEFT) { + elem.classList.add("bb-feedback-button--bottomleft"); + } + + if (buttonType === src_Gleap.FEEDBACK_BUTTON_NONE) { + elem.classList.add("bb-feedback-button--disabled"); + } + + if (buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC || buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC_LEFT || buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC_BOTTOM) { + elem.classList.add("bb-feedback-button--classic"); + } + + if (buttonType === src_Gleap.FEEDBACK_BUTTON_CLASSIC_LEFT) { + elem.classList.add("bb-feedback-button--classic-left"); + } + + var closeButton = document.querySelector(".bb-feedback-dialog-header-close"); + + closeButton.onclick = function () { + if (closeButton && closeButton.getAttribute("d") === "t") { + return; + } + + src_Gleap.getInstance().closeGleap(); + }; // Hook back action + + + if (back) { + var backButton = document.querySelector(".bb-feedback-dialog-header-back"); + + backButton.onclick = function () { + if (backButton && backButton.getAttribute("d") === "t") { + return; + } + + back(); + }; + } + + return elem; +}; +/** + * Creates the feedback type dialog + */ + +var createFeedbackTypeDialog = function createFeedbackTypeDialog(feedbackTypeActions, overrideLanguage, customLogoUrl, poweredByHidden, selectedMenuOption, title, subtitle, fromBack) { + // Generate options + var optionsHTML = "
"; + + for (var i = 0; i < feedbackTypeActions.length; i++) { + var action = feedbackTypeActions[i]; + optionsHTML += "
\n
\n \n
\n
\n
").concat(translateText(action.title, overrideLanguage), "
\n
").concat(translateText(action.description, overrideLanguage), "
\n
\n
"); + } + + optionsHTML += "
"; + var dialog = createWidgetDialog(title, subtitle, customLogoUrl, optionsHTML, null, true, fromBack ? "bb-anim-fadeinfromback" : "bb-anim-fadein"); // Hook actions + + var _loop = function _loop() { + var index = i; + + document.getElementById("bb-feedback-type-".concat(index)).onclick = function () { + dialog.remove(); + + if (feedbackTypeActions[index].action) { + // Cleanup widget. + src_Gleap.getInstance().closeGleap(); // Call custom action. + + feedbackTypeActions[index].action(); + } + + if (feedbackTypeActions[index].actionFlow) { + src_Gleap.startFeedbackFlow(feedbackTypeActions[index].actionFlow); + } + + if (selectedMenuOption) { + selectedMenuOption(); + } + }; + }; + + for (var i = 0; i < feedbackTypeActions.length; i++) { + _loop(); + } + + validatePoweredBy(poweredByHidden); +}; +var validatePoweredBy = function validatePoweredBy(poweredByHidden) { + var poweredByContainer = document.querySelector(".bb-feedback-poweredbycontainer"); + + if (poweredByHidden) { + poweredByContainer.style.display = "none"; + } else { + poweredByContainer.onclick = function () { + window.open("https://www.gleap.io/", "_blank"); + }; + } +}; +var setLoadingIndicatorProgress = function setLoadingIndicatorProgress(percentComplete) { + var loader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "main"; + var circle = window.document.querySelector(".bb-feedback-dialog-loading--".concat(loader, " .bb--progress-ring__circle")); + var circumference = 213.628300444; + var offset = circumference - percentComplete / 100 * circumference; + + if (circle) { + circle.style.strokeDasharray = "".concat(circumference, " ").concat(circumference); + circle.style.strokeDashoffset = offset; + } +}; +var loadIcon = function loadIcon(name, color) { + if (name === "bblogo") { + return ""; + } + + if (name === "dismiss") { + return "\n \n "; + } + + if (name === "screenshot") { + return "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n"; + } + + if (name === "success") { + return "\n \n \n "; + } + + if (name === "blur") { + return "\n \n"; + } + + if (name === "pen") { + return "\n \n \n \n \n \n \n \n \n \n \n \n \n"; + } + + if (name === "rect") { + return "\n \n \n \n \n \n \n \n \n \n \n"; + } + + if (name === "pointer") { + return "\n \n "; + } + + if (name === "clip") { + return "\n \n \n \n \n \n"; + } + + if (name === "mic") { + return "\n \n \n \n \n "; + } + + if (name === "camera") { + return "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n"; + } + + if (name === "recorderon") { + return "\n \n \n \n \n \n \n \n \n \n \n \n"; + } + + if (name === "recorderoff") { + return "\n \n \n \n \n \n \n \n \n "; + } + + if (name === "arrowdown") { + return "\n \n "); + } + + if (name === "arrowleft") { + return "\n \n "); + } + + if (name === "close") { + return "\n \n "); + } + + if (name === "undo") { + return "\n \n \n \n \n \n \n \n \n \n "; + } + + return ""; +}; +var toggleLoading = function toggleLoading(loading) { + var form = document.querySelector(".bb-feedback-form"); + var loader = document.querySelector(".bb-feedback-dialog-loading--main"); + var next = document.querySelector(".bb-feedback-dialog-header-back"); + var close = document.querySelector(".bb-feedback-dialog-header-close"); + + if (loading) { + form.style.display = "none"; + loader.style.display = "flex"; + + if (next) { + next.setAttribute("d", "t"); + next.style.opacity = "0.2"; + } + + if (close) { + close.setAttribute("d", "t"); + close.style.opacity = "0.2"; + } + } else { + form.style.display = "block"; + loader.style.display = "none"; + + if (next) { + next.setAttribute("d", "n"); + next.style.opacity = "1"; + } + + if (close) { + close.setAttribute("d", "n"); + close.style.opacity = "1"; + } + } +}; +;// CONCATENATED MODULE: ./src/NetworkInterception.js +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var GleapNetworkIntercepter = /*#__PURE__*/function () { + function GleapNetworkIntercepter() { + _classCallCheck(this, GleapNetworkIntercepter); + + _defineProperty(this, "requestId", 0); + + _defineProperty(this, "requests", {}); + + _defineProperty(this, "externalConsoleLogs", []); + + _defineProperty(this, "maxRequests", 10); + + _defineProperty(this, "filters", []); + + _defineProperty(this, "initialized", false); + + _defineProperty(this, "stopped", false); + } + + _createClass(GleapNetworkIntercepter, [{ + key: "isContentTypeSupported", + value: function isContentTypeSupported(contentType) { + if (typeof contentType !== "string") { + return false; + } + + if (contentType === "") { + return true; + } + + contentType = contentType.toLocaleLowerCase(); + var supportedContentTypes = ["text/", "xml", "json"]; + + for (var i = 0; i < supportedContentTypes.length; i++) { + if (contentType.includes(supportedContentTypes[i])) { + return true; + } + } + + return false; + } + }, { + key: "getRequests", + value: function getRequests() { + var requests = this.externalConsoleLogs.concat(Object.values(this.requests)); + + if (!this.filters || this.filters.length === 0) { + return requests; + } // Perform network log filtering. + + + for (var i = 0; i < requests.length; i++) { + var request = requests[i]; // Headers + + if (request && request.request && request.request.headers) { + for (var j = 0; j < this.filters.length; j++) { + delete request.request.headers[this.filters[j]]; + } + } // Payload + + + if (request && request.request && request.request.payload) { + var payloadObj = request.request.payload; + + try { + payloadObj = JSON.parse(request.request.payload); + } catch (e) {} + + if (payloadObj) { + for (var j = 0; j < this.filters.length; j++) { + delete payloadObj[this.filters[j]]; + } + + request.request.payload = JSON.stringify(payloadObj); + } + } // Response + + + if (request && request.response && request.response.responseText) { + try { + var data = JSON.parse(request.response.responseText); + + for (var j = 0; j < this.filters.length; j++) { + delete data[this.filters[j]]; + } + + request.response.responseText = JSON.stringify(data); + } catch (e) {} + } + } + + return requests; + } + }, { + key: "setMaxRequests", + value: function setMaxRequests(maxRequests) { + this.maxRequests = maxRequests; + } + }, { + key: "setStopped", + value: function setStopped(stopped) { + this.stopped = stopped; + } + }, { + key: "setFilters", + value: function setFilters(filters) { + if (filters) { + this.filters = filters; + } + } + }, { + key: "cleanRequests", + value: function cleanRequests() { + var keys = Object.keys(this.requests); + + if (keys.length > this.maxRequests) { + var keysToRemove = keys.slice(0, keys.length - this.maxRequests); + + for (var i = 0; i < keysToRemove.length; i++) { + delete this.requests[keysToRemove[i]]; + } + } + } + }, { + key: "calcRequestTime", + value: function calcRequestTime(bbRequestId) { + if (!bbRequestId || !this.requests || !this.requests[bbRequestId]) { + return; + } + + var startDate = this.requests[bbRequestId]["date"]; + + if (startDate) { + this.requests[bbRequestId]["duration"] = new Date().getTime() - startDate.getTime(); + } + } + }, { + key: "calculateTextSize", + value: function calculateTextSize(text) { + var size = new TextEncoder().encode(text).length; + var kiloBytes = size / 1024; + var megaBytes = kiloBytes / 1024; + return megaBytes; + } + }, { + key: "fixPayload", + value: function fixPayload(payload) { + if (payload === undefined || payload === null) { + return "{}"; + } + + try { + if ((typeof TextDecoder === "undefined" ? "undefined" : _typeof(TextDecoder)) !== undefined && ArrayBuffer.isView(payload)) { + var value = new TextDecoder().decode(payload); + return value; + } + } catch (exp) {} + + return payload; + } + }, { + key: "start", + value: function start() { + var _this = this; + + if (this.initialized) { + return; + } + + this.initialized = true; + var self = this; + this.interceptNetworkRequests({ + onFetch: function onFetch(params, bbRequestId) { + if (_this.stopped || !bbRequestId || !_this.requests) { + return; + } + + if (params.length > 0 && typeof params[0] !== "undefined" && typeof params[0].url !== "undefined") { + _this.requests[bbRequestId] = { + url: params[0].url, + date: new Date(), + request: { + payload: "", + headers: typeof params[0].headers !== "undefined" ? Object.fromEntries(params[0].headers.entries()) : {} + }, + type: typeof params[0].method !== "undefined" ? params[0].method : "" + }; + } else { + if (params.length >= 2 && params[1]) { + var method = params[1] && params[1].method ? params[1].method : "GET"; + _this.requests[bbRequestId] = { + request: { + payload: self.fixPayload(params[1].body), + headers: params[1].headers + }, + type: method, + url: params[0], + date: new Date() + }; + } else { + _this.requests[bbRequestId] = { + url: params[0], + date: new Date() + }; + } + } + + _this.cleanRequests(); + }, + onFetchLoad: function onFetchLoad(req, bbRequestId) { + if (_this.stopped || !bbRequestId || !_this.requests || !_this.requests[bbRequestId]) { + return; + } + + try { + _this.requests[bbRequestId]["success"] = true; + _this.requests[bbRequestId]["response"] = { + status: req.status, + statusText: "", + responseText: "" + }; + + _this.calcRequestTime(bbRequestId); + } catch (exp) {} + + try { + var contentType = ""; + + if (req.headers && typeof req.headers.get !== "undefined") { + contentType = req.headers.get("content-type"); + } + + console.log(contentType); + + if (_this.isContentTypeSupported(contentType)) { + req.text().then(function (responseText) { + if (_this.requests[bbRequestId]) { + _this.requests[bbRequestId]["success"] = true; + _this.requests[bbRequestId]["response"] = { + status: req.status, + statusText: req.statusText, + responseText: self.calculateTextSize(responseText) > 0.5 ? "" : responseText + }; + } + + _this.calcRequestTime(bbRequestId); + + _this.cleanRequests(); + })["catch"](function (err) { + _this.cleanRequests(); + }); + } else { + if (_this.requests[bbRequestId]) { + _this.requests[bbRequestId]["success"] = true; + _this.requests[bbRequestId]["response"] = { + status: req.status, + statusText: req.statusText, + responseText: "" + }; + } + + _this.calcRequestTime(bbRequestId); + + _this.cleanRequests(); + } + } catch (exp) {} + }, + onFetchFailed: function onFetchFailed(err, bbRequestId) { + if (_this.stopped || !bbRequestId || !_this.requests || !_this.requests[bbRequestId]) { + return; + } + + _this.requests[bbRequestId]["success"] = false; + + _this.calcRequestTime(bbRequestId); + + _this.cleanRequests(); + }, + onOpen: function onOpen(request, args) { + if (_this.stopped) { + return; + } + + if (request && request.bbRequestId && args.length >= 2 && _this.requests) { + _this.requests[request.bbRequestId] = { + type: args[0], + url: args[1], + date: new Date() + }; + } + + _this.cleanRequests(); + }, + onSend: function onSend(request, args) { + if (_this.stopped) { + return; + } + + if (request && request.bbRequestId && _this.requests && _this.requests[request.bbRequestId]) { + _this.requests[request.bbRequestId]["request"] = { + payload: _this.fixPayload(args.length > 0 ? args[0] : "{}"), + headers: request.requestHeaders + }; + } + + _this.cleanRequests(); + }, + onError: function onError(request, args) { + if (!_this.stopped && _this.requests && request && request.currentTarget && request.currentTarget.bbRequestId && _this.requests[request.currentTarget.bbRequestId]) { + _this.requests[request.currentTarget.bbRequestId]["success"] = false; + + _this.calcRequestTime(request.bbRequestId); + } + + _this.cleanRequests(); + }, + onLoad: function onLoad(request, args) { + if (_this.stopped) { + return; + } + + if (request && request.currentTarget && request.currentTarget.bbRequestId && _this.requests && _this.requests[request.currentTarget.bbRequestId]) { + var target = request.currentTarget; + var responseType = target.responseType; + var responseText = "<" + responseType + ">"; + + if (responseType === "" || responseType === "text") { + responseText = _this.calculateTextSize(target.responseText) > 0.5 ? "" : target.responseText; + } + + _this.requests[target.bbRequestId]["success"] = true; + _this.requests[target.bbRequestId]["response"] = { + status: target.status, + statusText: target.statusText, + responseText: responseText + }; + + _this.calcRequestTime(target.bbRequestId); + } + + _this.cleanRequests(); + } + }); + } + }, { + key: "interceptNetworkRequests", + value: function interceptNetworkRequests(callback) { + var self = this; + var open = XMLHttpRequest.prototype.open; + var send = XMLHttpRequest.prototype.send; + XMLHttpRequest.prototype.wrappedSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader; + + XMLHttpRequest.prototype.setRequestHeader = function (header, value) { + if (!this.requestHeaders) { + this.requestHeaders = {}; + } + + if (this.requestHeaders && this.requestHeaders.hasOwnProperty(header)) { + return; + } + + if (!this.requestHeaders[header]) { + this.requestHeaders[header] = []; + } + + this.requestHeaders[header].push(value); + this.wrappedSetRequestHeader(header, value); + }; + + XMLHttpRequest.prototype.open = function () { + this["bbRequestId"] = ++self.requestId; + callback.onOpen && callback.onOpen(this, arguments); + + if (callback.onLoad) { + this.addEventListener("load", callback.onLoad.bind(callback)); + } + + if (callback.onError) { + this.addEventListener("error", callback.onError.bind(callback)); + } + + return open.apply(this, arguments); + }; + + XMLHttpRequest.prototype.send = function () { + callback.onSend && callback.onSend(this, arguments); + return send.apply(this, arguments); + }; + + if (window.fetch) { + (function () { + var originalFetch = window.fetch; + + window.fetch = function () { + var bbRequestId = ++self.requestId; + callback.onFetch(arguments, bbRequestId); + return originalFetch.apply(this, arguments).then(function (response) { + if (response && typeof response.clone === "function") { + var data = response.clone(); + callback.onFetchLoad(data, bbRequestId); + } + + return response; + })["catch"](function (err) { + callback.onFetchFailed(err, bbRequestId); + throw err; + }); + }; + })(); + } + + return callback; + } + }, { + key: "blobToTextPromise", + value: function blobToTextPromise(blob) { + return new Promise(function (resolve, reject) { + var fr = new FileReader(); + + fr.onload = function (evt) { + if (evt && evt.target && evt.target.result) { + resolve(evt.target.result); + } else { + reject(); + } + }; + + fr.onerror = function (err) { + reject(err); + }; + + fr.readAsText(blob); + }); + } + }]); + + return GleapNetworkIntercepter; +}(); + +/* harmony default export */ const NetworkInterception = (GleapNetworkIntercepter); +;// CONCATENATED MODULE: ./src/ReplayConstants.js +function ReplayConstants_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ReplayConstants_typeof = function _typeof(obj) { return typeof obj; }; } else { ReplayConstants_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ReplayConstants_typeof(obj); } + +var REPLAYREC_ADD = "p"; +var REPLAYREC_CANVAS_DATA = "c"; +var REPLAYREC_DELAY = "o"; +var REPLAYREC_FORCE_STYLE_FLUSH = "f"; +var REPLAYREC_INPUT = "i"; +var REPLAYREC_INPUTCHECK = "z"; +var REPLAYREC_MOUSE_MOVE = "m"; +var REPLAYREC_MOUSE_DOWN = "n"; +var REPLAYREC_ATTR = "r"; +var REPLAYREC_TEXT = "t"; +var REPLAYREC_MOUSE_UP = "u"; +var REPLAYREC_REMOVE = "v"; +var REPLAYREC_SCROLL = "s"; +var REPLAYREC_MAINSCROLL = "x"; +function gleapRoughSizeOfObject(object) { + var objectList = []; + var stack = [object]; + var bytes = 0; + + while (stack.length) { + var value = stack.pop(); + + if (typeof value === "boolean") { + bytes += 4; + } else if (typeof value === "string") { + bytes += value.length * 2; + } else if (typeof value === "number") { + bytes += 8; + } else if (ReplayConstants_typeof(value) === "object" && objectList.indexOf(value) === -1) { + objectList.push(value); + + for (var i in value) { + stack.push(value[i]); + } + } + } + + return bytes / 1024 / 1024; +} +;// CONCATENATED MODULE: ./src/ReplayRecFrame.js +function ReplayRecFrame_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function ReplayRecFrame_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ReplayRecFrame_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ReplayRecFrame_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReplayRecFrame_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReplayRecFrame_defineProperties(Constructor, staticProps); return Constructor; } + + + +var ReplayRecFrame = /*#__PURE__*/function () { + function ReplayRecFrame(win, node, rec) { + var _this = this; + + ReplayRecFrame_classCallCheck(this, ReplayRecFrame); + + this.win = win; + this.node = node; + this.rec = rec; + this.initialState = {}; + this.initialActions = []; + + this.prepEvent = function (event) { + var _a; + + _this.flushObserver(); + + return ((_a = event.target) === null || _a === void 0 ? void 0 : _a.ReplayRecID) || 0; + }; + + this.mouseListener = function (event) { + var x = event.clientX; + var y = event.clientY; + var target = event.target; + var mouseEventNode = _this.node; + + if (!mouseEventNode.contains(target)) { + return; + } + + _this.flushObserver(); + + var nodeRect = mouseEventNode.getBoundingClientRect(); + x -= nodeRect.left; + y -= nodeRect.top; + var key; + + switch (event.type) { + case "mousemove": + key = REPLAYREC_MOUSE_MOVE; + break; + + case "mouseup": + key = REPLAYREC_MOUSE_UP; + break; + + case "mousedown": + key = REPLAYREC_MOUSE_DOWN; + break; + + default: + throw new Error("Unknown event type: ".concat(event.type)); + } + + _this.rec.actions.push(ReplayRecFrame_defineProperty({}, key, [Math.round(x), Math.round(y)])); + }; + + this.scrollListener = function (event) { + if (!_this.node.contains(event.target)) { + return; + } + + var id = _this.prepEvent(event); + + if (id) { + _this.rec.pushScrollAction(id, event.target); + } + }; + + this.mainScrollListener = function () { + _this.flushObserver(); + + _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_MAINSCROLL, [window.scrollX, window.scrollY])); + }; + + this.inputListener = function (event) { + if (!_this.node.contains(event.target)) { + return; + } + + var id = _this.prepEvent(event); + + if (id && "value" in event.target) { + var val = event.target.value; + + if (event.target.type === "password" && val && val.length) { + val = new Array(val.length + 1).join("*"); + } + + if (event.target.getAttribute("gleap-ignore") === "value") { + val = new Array(val.length + 1).join("*"); + } + + _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_INPUT, [id, val])); + } + + if (id && "type" in event.target && event.target.type === "checkbox") { + var checked = event.target.checked; + + _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_INPUTCHECK, [id, checked])); + } + }; + + this.flushListener = function (event) { + if (!_this.node.contains(event.target)) { + return; + } + + var id = _this.prepEvent(event); + + if (id) { + _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_FORCE_STYLE_FLUSH, id)); + } + }; + + this.canvasListener = function (event) { + if (!_this.node.contains(event.target)) { + return; + } + + var id = _this.prepEvent(event); + + if (id) { + _this.rec.actions.push(ReplayRecFrame_defineProperty({}, REPLAYREC_CANVAS_DATA, [id, event.target.toDataURL(), "didDraw"])); + } + }; + + this.focusListener = function () {}; + + node.ownerDocument.ReplayRecInner = this; + var initialActions = []; + var serializedNode = this.rec.serializeNode(this.node, initialActions); + + if (serializedNode) { + this.initialState = serializedNode; + this.initialActions = initialActions; // Fix for patched mutation observer. + + var GleapMutationObserver = MutationObserver; + + if (window && window.Zone && window[window.Zone.__symbol__("MutationObserver")]) { + GleapMutationObserver = window[window.Zone.__symbol__("MutationObserver")]; + } + + this.observer = new GleapMutationObserver(rec.observerCallback); + this.observer.observe(node, { + attributes: true, + characterData: true, + childList: true, + subtree: true + }); // Get scroll position + + this.mainScrollListener(); + win.addEventListener("input", this.inputListener, { + capture: true, + passive: true + }); + win.addEventListener("mousemove", this.mouseListener, { + capture: true, + passive: true + }); + win.addEventListener("mousedown", this.mouseListener, { + capture: true, + passive: true + }); + win.addEventListener("mouseup", this.mouseListener, { + capture: true, + passive: true + }); + win.addEventListener("forceStyleFlush", this.flushListener, { + capture: true, + passive: true + }); + win.addEventListener("didDrawCanvas", this.canvasListener, { + capture: true, + passive: true + }); + win.addEventListener("focus", this.focusListener, { + capture: true, + passive: true + }); + win.addEventListener("scroll", this.mainScrollListener, { + capture: true, + passive: true + }); + } + } + + ReplayRecFrame_createClass(ReplayRecFrame, [{ + key: "stop", + value: function stop() { + this.flushObserver(); + this.observer.disconnect(); + this.win.removeEventListener("input", this.inputListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("mousemove", this.mouseListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("mousedown", this.mouseListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("mouseup", this.mouseListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("forceStyleFlush", this.flushListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("didDrawCanvas", this.canvasListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("focus", this.focusListener, { + capture: true, + passive: true + }); + this.win.removeEventListener("scroll", this.mainScrollListener, { + capture: true, + passive: true + }); + this.rec.deleteAllReplayRecIDs(this.node); + } + }, { + key: "flushObserver", + value: function flushObserver() { + if (this.observer && typeof this.observer.takeRecords !== "undefined") { + this.rec.observerCallback(this.observer.takeRecords()); + } + } + }]); + + return ReplayRecFrame; +}(); + + +;// CONCATENATED MODULE: ./src/ReplayRecorder.js +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = ReplayRecorder_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + +function ReplayRecorder_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return ReplayRecorder_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return ReplayRecorder_arrayLikeToArray(o, minLen); } + +function ReplayRecorder_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function ReplayRecorder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ReplayRecorder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ReplayRecorder_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReplayRecorder_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReplayRecorder_defineProperties(Constructor, staticProps); return Constructor; } + +function ReplayRecorder_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + + + +var ReplayRecorder = /*#__PURE__*/function () { + function ReplayRecorder() { + var _this = this; + + ReplayRecorder_classCallCheck(this, ReplayRecorder); + + ReplayRecorder_defineProperty(this, "fetchCSSResource", function (url) { + var self = _this; + return new Promise(function (resolve, reject) { + if (url) { + var xhr = new XMLHttpRequest(); + + xhr.onload = function () { + var reader = new FileReader(); + + reader.onloadend = function () { + resolve(reader.result); + }; + + reader.onerror = function () { + resolve(); + }; + + reader.readAsDataURL(xhr.response); + }; + + xhr.onerror = function (err) { + resolve(); + }; + + xhr.open("GET", url); + xhr.responseType = "blob"; + xhr.send(); + } else { + resolve(); + } + }); + }); + + ReplayRecorder_defineProperty(this, "replaceAsync", function (str, regex, asyncFn) { + return new Promise(function (resolve, reject) { + var promises = []; + str.replace(regex, function (match) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var promise = asyncFn.apply(void 0, [match].concat(args)); + promises.push(promise); + }); + Promise.all(promises).then(function (data) { + resolve(str.replace(regex, function () { + return data.shift(); + })); + })["catch"](function () { + reject(); + }); + }); + }); + + ReplayRecorder_defineProperty(this, "validateStylesheetResources", function (data, url) { + var basePath = url.substring(0, url.lastIndexOf("/")); + var split = data.split(","); + + if (split.length !== 2) { + return Promise.reject(); + } + + data = atob(split[1]); + delete split[1]; + return _this.replaceAsync(data, /url\((.*?)\)/g, function (matchedData) { + return new Promise(function (resolve, reject) { + var matchedUrl = matchedData.substr(4, matchedData.length - 5).replaceAll("'", "").replaceAll('"', ""); // Remote file or data + + if (matchedUrl.indexOf("http") === 0 || matchedUrl.indexOf("//") === 0 || matchedUrl.indexOf("data") === 0) { + return resolve(matchedData); + } + + try { + var resourcePath = matchedUrl; + + if (basePath) { + resourcePath = basePath + "/" + matchedUrl; + } + + return _this.fetchCSSResource(resourcePath).then(function (resourceData) { + if (matchedUrl.indexOf("data:text/html") === 0) { + return resolve(matchedData); + } + + return resolve("url(" + resourceData + ")"); + }); + } catch (exp) { + return resolve(matchedData); + } + }); + }).then(function (result) { + return split[0] + "," + btoa(result); + }); + }); + + ReplayRecorder_defineProperty(this, "progressResource", function (data, src, resolve, reject) { + if (data && data.indexOf("data:text/css") === 0) { + _this.validateStylesheetResources(data, src).then(function (data) { + _this.resourcesToResolve[src] = data; + resolve(); + }); + } else if (data && (data.indexOf("data:image/jpeg") === 0 || data.indexOf("data:image/png") === 0)) { + resizeImage(data, 500, 500).then(function (data) { + _this.resourcesToResolve[src] = data; + resolve(); + }); + } else { + _this.resourcesToResolve[src] = data; + resolve(); + } + }); + + ReplayRecorder_defineProperty(this, "fetchItemResource", function (src) { + var self = _this; + return new Promise(function (resolve, reject) { + if (src) { + var xhr = new XMLHttpRequest(); + + xhr.onload = function () { + var reader = new FileReader(); + + reader.onloadend = function () { + self.progressResource(reader.result, src, resolve, reject); + }; + + reader.onerror = function () { + resolve(); + }; + + reader.readAsDataURL(xhr.response); + }; + + xhr.onerror = function (err) { + resolve(); + }; + + var url = src; + xhr.open("GET", url); + xhr.responseType = "blob"; + xhr.send(); + } else { + resolve(); + } + }); + }); + + this.stopped = false; + this.startDate = Date.now(); + this.node = document.documentElement; + this.nextID = 1; + this.actions = []; + this.actionsSize = 0; + this.lastActionTime = Date.now(); + this.observerCallback = this.callback.bind(this); + this.resourcesToResolve = {}; + this.rootFrame = new ReplayRecFrame(window, this.node, this); + this.evaluateFocus(); + this.result = null; + this.finalizingResult = false; + } + + ReplayRecorder_createClass(ReplayRecorder, [{ + key: "isFull", + value: function isFull() { + if (this.actions && this.actionsSize > 10) { + return true; + } + + return false; + } + }, { + key: "fetchImageResources", + value: function fetchImageResources() { + var resolvePromises = []; + var resourceKeys = Object.keys(this.resourcesToResolve); + + for (var i = 0; i < resourceKeys.length; i++) { + if (!isBlacklisted(resourceKeys[i])) { + resolvePromises.push(this.fetchItemResource(resourceKeys[i])); + } + } + + return Promise.all(resolvePromises); + } + }, { + key: "stop", + value: function stop() { + var _this2 = this; + + var fetchResources = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + this.stopped = true; + + if (!this.rootFrame) { + this.rootFrame = null; + return; + } + + var replayResult = { + startDate: this.startDate, + initialState: this.rootFrame.initialState, + initialActions: this.rootFrame.initialActions, + actions: this.actions, + baseUrl: window.location.origin, + width: window.innerWidth, + height: window.innerHeight, + resourcesToResolve: this.resourcesToResolve, + isMobile: isMobile() + }; + this.rootFrame.stop(); + this.rootFrame = null; + this.finalizingResult = true; + + if (fetchResources) { + return this.fetchImageResources().then(function () { + _this2.cleanupAfterStop(replayResult); + }); + } else { + this.cleanupAfterStop(replayResult); + } + } + }, { + key: "cleanupAfterStop", + value: function cleanupAfterStop(replayResult) { + this.cleanupResources(); + this.result = replayResult; + this.finalizingResult = false; + } + }, { + key: "cleanupResources", + value: function cleanupResources() { + var resourceKeys = Object.keys(this.resourcesToResolve); + + for (var i = 0; i < resourceKeys.length; i++) { + if (this.resourcesToResolve[resourceKeys[i]] === "--") { + delete this.resourcesToResolve[resourceKeys[i]]; + } + } + } + }, { + key: "evaluateFocus", + value: function evaluateFocus() { + this.rootFrame.flushObserver(); + } + }, { + key: "allowAttribute", + value: function allowAttribute(e, name) { + // eslint-disable-next-line default-case + switch (name) { + case "srcdoc": + if (e.tagName === "IFRAME") { + return false; + } + + break; + + case "title": + return false; + } + + return true; + } + }, { + key: "pushScrollAction", + value: function pushScrollAction(id, element, actionsList) { + var actions = actionsList ? actionsList : this.actions; + var scrolledIntoView = element.elementScrolledIntoView; + + if (scrolledIntoView) { + var a = {}; + + if (scrolledIntoView.ReplayRecID) { + var scrolledIntoViewOffset = "elementScrolledIntoViewOffset" in element ? element.elementScrolledIntoViewOffset : null; + a[REPLAYREC_SCROLL] = [id, scrolledIntoView.ReplayRecID, scrolledIntoViewOffset]; + } else { + if (scrolledIntoView !== "bottom") { + throw new Error("Unknown scrolledIntoView: ".concat(scrolledIntoView)); + } + + a[REPLAYREC_SCROLL] = [id, scrolledIntoView]; + } + + actions.push(a); + } + } + }, { + key: "serializeNode", + value: function serializeNode(node, actions) { + if ("ReplayRecID" in node) { + return null; + } + + var id = this.nextID++; + var obj = { + id: id + }; + node.ReplayRecID = id; + + switch (node.nodeType) { + case Node.ELEMENT_NODE: + { + var tag = node.tagName; // eslint-disable-next-line default-case + + switch (tag) { + case "INPUT": + case "TEXTAREA": + { + var a = {}; + var val = node.value; + + if (node.type && node.type === "password" && val && val.length) { + val = new Array(val.length + 1).join("*"); + } + + if (node.getAttribute("gleap-ignore") === "value") { + val = new Array(val.length + 1).join("*"); + } + + a[REPLAYREC_INPUT] = [id, val]; + actions.push(a); + var listener = node.ownerDocument.ReplayRecInner.scrollListener; + node.addEventListener("scroll", listener, { + passive: true + }); + break; + } + + case "PRE": + case "DIV": + { + if (node.classList.contains("bb-hidden")) { + delete node.ReplayRecID; + return null; + } // In Pernosco all scrollable elements happen to be DIV/INPUT/TEXTAREA + + + var _listener = node.ownerDocument.ReplayRecInner.scrollListener; + node.addEventListener("scroll", _listener, { + passive: true + }); + break; + } + + case "SCRIPT": + case "LINK": + delete node.ReplayRecID; + var nodeRel = node.getAttribute("rel"); // Stylesheets + + if (node && node.href && (node.href.includes(".css") || nodeRel && nodeRel.includes("stylesheet"))) { + this.resourcesToResolve[node.getAttribute("href")] = "--"; + break; + } // HTML Imports + + + if (nodeRel && nodeRel === "import") { + break; + } + + return null; + + case "CANVAS": + { + var _a = {}; + _a[REPLAYREC_CANVAS_DATA] = [id, node.toDataURL()]; + actions.push(_a); + break; + } + } + + obj[""] = tag; + var attrs = {}; + var hasAttr = false; + + var _iterator = _createForOfIteratorHelper(node.attributes), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var _a2 = _step.value; + var name = _a2.name; + + if (this.allowAttribute(node, name)) { + attrs[name] = _a2.value; + hasAttr = true; + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + if (hasAttr) { + obj.a = attrs; + + if (obj.a && obj.a.src && tag !== "SOURCE" && tag !== "IFRAME") { + this.optionallyAddAttribute("src", obj.a.src); + } + } + + var children = []; + + var _iterator2 = _createForOfIteratorHelper(node.childNodes), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var c = _step2.value; + var serialized = this.serializeNode(c, actions); + + if (serialized) { + children.push(serialized); + } + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + if (children.length > 0) { + obj.c = children; + } + + if (node.scrollLeft || node.scrollTop) { + this.pushScrollAction(id, node, actions); + } + + break; + } + + case Node.TEXT_NODE: + case Node.CDATA_SECTION_NODE: + { + // Check if it's a child of a style node. + var parentNode = node.parentNode; + + if (node.parentNode && parentNode.tagName && parentNode.tagName === "STYLE" && parentNode.ownerDocument) { + var styleSheets = parentNode.ownerDocument.styleSheets; + + if (styleSheets) { + for (var i = 0; i < styleSheets.length; i++) { + var styleSheet = styleSheets[i]; + + if (styleSheet.ownerNode && styleSheet.ownerNode.ReplayRecID && parentNode.ReplayRecID === styleSheet.ownerNode.ReplayRecID) { + var cssRules = null; + + if (styleSheet.cssRules) { + cssRules = styleSheet.cssRules; + } else if (styleSheet.rules) { + cssRules = styleSheet.rules; + } + + if (cssRules) { + var cssTextContent = ""; + + for (var cssRuleItem in cssRules) { + if (cssRules[cssRuleItem].cssText) { + cssTextContent += cssRules[cssRuleItem].cssText; + } + } + + obj.d = cssTextContent; + } + } + } + } + } // Simply pass the data of the text. + + + var data = node.data; + + if (data.length > 0 && !obj.d) { + obj.d = data; + } + + break; + } + + case Node.PROCESSING_INSTRUCTION_NODE: + case Node.COMMENT_NODE: + break; + + default: + delete node.ReplayRecID; + throw new Error("Bad node ".concat(node)); + } + + return obj; + } + }, { + key: "delay", + value: function delay(seconds) { + this.lastActionTime -= seconds * 1000; + } + }, { + key: "deleteAllReplayRecIDs", + value: function deleteAllReplayRecIDs(e) { + delete e.ReplayRecID; + var listener = e.ownerDocument.ReplayRecInner.scrollListener; + e.removeEventListener("scroll", listener, { + passive: true + }); + + for (var c = e.firstChild; c; c = c.nextSibling) { + if (c.ReplayRecID) { + this.deleteAllReplayRecIDs(c); + } + } + } + }, { + key: "optionallyAddAttribute", + value: function optionallyAddAttribute(name, value) { + if (name === "src" && value) { + var url = value; + + if (url.indexOf("data") !== 0) { + this.resourcesToResolve[url] = "--"; + } + } + } + }, { + key: "appendAction", + value: function appendAction(action) { + this.actions.push(action); + var self = this; + setTimeout(function () { + self.actionsSize += gleapRoughSizeOfObject(action); + }, 0); + } + }, { + key: "callback", + value: function callback(records, // eslint-disable-next-line @typescript-eslint/no-unused-vars + observer) { + var now = Date.now(); + + if (now > this.lastActionTime) { + var a = {}; + a[REPLAYREC_DELAY] = now - this.lastActionTime; + this.appendAction(a); + } + + this.lastActionTime = Date.now(); + + try { + var _iterator3 = _createForOfIteratorHelper(records), + _step3; + + try { + for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { + var r = _step3.value; + + if (r.target.ReplayRecID && r.type === "childList") { + var _iterator5 = _createForOfIteratorHelper(r.removedNodes), + _step5; + + try { + for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { + var child = _step5.value; + var childID = child.ReplayRecID; + + if (!childID) { + continue; + } + + var _a4 = {}; + _a4[REPLAYREC_REMOVE] = childID; + this.appendAction(_a4); + this.deleteAllReplayRecIDs(child); + } + } catch (err) { + _iterator5.e(err); + } finally { + _iterator5.f(); + } + } + } + } catch (err) { + _iterator3.e(err); + } finally { + _iterator3.f(); + } + + var nodesWithAddedChildren = []; + + var _iterator4 = _createForOfIteratorHelper(records), + _step4; + + try { + for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { + var _r = _step4.value; + var target = _r.target; + var id = target.ReplayRecID; + + if (!id) { + continue; + } // eslint-disable-next-line default-case + + + switch (_r.type) { + case "attributes": + { + var attributeName = _r.attributeName; + + if (this.allowAttribute(target, attributeName)) { + var _a5 = {}; + _a5[REPLAYREC_ATTR] = [id, attributeName, target.getAttribute(attributeName)]; + + if (target.tagName !== "SOURCE") { + this.optionallyAddAttribute(attributeName, target.getAttribute(attributeName)); + } + + this.appendAction(_a5); + } + + break; + } + + case "characterData": + { + var _a6 = {}; + + if (target.nodeType === Node.TEXT_NODE) { + _a6[REPLAYREC_TEXT] = [id, target.data]; + } + + this.appendAction(_a6); + break; + } + + case "childList": + { + if (_r.addedNodes.length > 0 && !target.ReplayRecNodesAdded) { + target.ReplayRecNodesAdded = true; + nodesWithAddedChildren.push(target); + } + } + } + } + } catch (err) { + _iterator4.e(err); + } finally { + _iterator4.f(); + } + + for (var _i = 0, _nodesWithAddedChildr = nodesWithAddedChildren; _i < _nodesWithAddedChildr.length; _i++) { + var node = _nodesWithAddedChildr[_i]; + delete node.ReplayRecNodesAdded; + + for (var c = node.lastChild; c; c = c.previousSibling) { + if (c.ReplayRecID) { + continue; + } + + var _a3 = {}; + var actions = []; + var serializedNode = this.serializeNode(c, actions); + + if (!serializedNode) { + continue; + } + + var nextSibling = c.nextSibling; + _a3[REPLAYREC_ADD] = [node.ReplayRecID, nextSibling ? nextSibling.ReplayRecID : null, serializedNode, actions]; + this.appendAction(_a3); + } + } + } catch (ex) { + throw ex; + } + } + }]); + + return ReplayRecorder; +}(); + + +;// CONCATENATED MODULE: ./src/ScreenDrawer.js +function ScreenDrawer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ScreenDrawer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ScreenDrawer_createClass(Constructor, protoProps, staticProps) { if (protoProps) ScreenDrawer_defineProperties(Constructor.prototype, protoProps); if (staticProps) ScreenDrawer_defineProperties(Constructor, staticProps); return Constructor; } + +function ScreenDrawer_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var ScreenDrawer = /*#__PURE__*/function () { + function ScreenDrawer(rerender) { + var _this = this; + + ScreenDrawer_classCallCheck(this, ScreenDrawer); + + ScreenDrawer_defineProperty(this, "rerender", void 0); + + ScreenDrawer_defineProperty(this, "svgElement", null); + + ScreenDrawer_defineProperty(this, "path", null); + + ScreenDrawer_defineProperty(this, "strPath", void 0); + + ScreenDrawer_defineProperty(this, "strokeWidth", 12); + + ScreenDrawer_defineProperty(this, "strokeWidthRect", 6); + + ScreenDrawer_defineProperty(this, "bufferSize", 4); + + ScreenDrawer_defineProperty(this, "buffer", []); + + ScreenDrawer_defineProperty(this, "startPoint", null); + + ScreenDrawer_defineProperty(this, "tool", "rect"); + + ScreenDrawer_defineProperty(this, "color", "#EB144C"); + + ScreenDrawer_defineProperty(this, "mouseDown", null); + + ScreenDrawer_defineProperty(this, "mouseMove", null); + + ScreenDrawer_defineProperty(this, "mouseUp", null); + + ScreenDrawer_defineProperty(this, "resizeListener", null); + + ScreenDrawer_defineProperty(this, "pathBuffer", []); + + var self = this; + this.rerender = rerender; + this.svgElement = document.querySelector(".bb-capture-svg"); + this.svgElement.style.minHeight = "".concat(document.documentElement.scrollHeight, "px"); // Window resize listener. + + this.resizeListener = function (e) { + self.svgElement.style.minHeight = "".concat(document.documentElement.scrollHeight, "px"); + }; + + window.addEventListener("resize", this.resizeListener, true); + + this.mouseDown = function (e) { + e.preventDefault(); + var colorpicker = document.querySelector(".bb-capture-toolbar-item-colorpicker"); + + if (colorpicker) { + colorpicker.style.display = "none"; + } + + self.fadeOutToolbar(); + + if (self.tool === "pen" || self.tool === "blur") { + self.mouseDownPen(e); + } + + if (self.tool === "rect") { + self.mouseDownRect(e); + } + }; + + this.mouseMove = function (e) { + e.preventDefault(); + + if (self.tool === "pen" || self.tool === "blur") { + self.mouseMovePen(e); + } + + if (self.tool === "rect") { + self.mouseMoveRect(e); + } + }; + + this.mouseUp = function (e) { + e.preventDefault(); + self.fadeInToolbar(); + + if (self.tool === "pen" || self.tool === "blur") { + self.mouseUpPen(e); + } + + if (self.tool === "rect") { + self.mouseUpRect(e); + } + }; + + this.svgElement.addEventListener("mousedown", this.mouseDown); + this.svgElement.addEventListener("mousemove", this.mouseMove); + this.svgElement.addEventListener("mouseup", this.mouseUp); + this.svgElement.addEventListener("touchstart", this.mouseDown, false); + this.svgElement.addEventListener("touchmove", this.mouseMove, false); + this.svgElement.addEventListener("touchend", this.mouseUp, false); + setTimeout(function () { + _this.rerender(); + }, 100); + } + + ScreenDrawer_createClass(ScreenDrawer, [{ + key: "clear", + value: function clear() { + if (this.svgElement) { + while (this.svgElement.firstChild) { + this.svgElement.firstChild.remove(); + } + } + } + }, { + key: "destroy", + value: function destroy() { + this.svgElement.removeEventListener("mousedown", this.mouseDown); + this.svgElement.removeEventListener("mousemove", this.mouseMove); + this.svgElement.removeEventListener("mouseup", this.mouseUp); + this.svgElement.removeEventListener("touchstart", this.mouseDown); + this.svgElement.removeEventListener("touchmove", this.mouseMove); + this.svgElement.removeEventListener("touchend", this.mouseUp); + window.removeEventListener("resize", this.resizeListener); + } + }, { + key: "mouseUpPen", + value: function mouseUpPen() { + if (this.path) { + this.path = null; + } + } + }, { + key: "mouseUpRect", + value: function mouseUpRect() { + if (this.path) { + this.path = null; + } + } + }, { + key: "mouseMovePen", + value: function mouseMovePen(e) { + if (this.path) { + this.appendToBuffer(this.getMousePosition(e)); + this.updateSvgPath(); + } + } + }, { + key: "mouseMoveRect", + value: function mouseMoveRect(e) { + if (this.path) { + var p = this.getMousePosition(e); + var w = Math.abs(p.x - this.startPoint.x); + var h = Math.abs(p.y - this.startPoint.y); + var x = p.x; + var y = p.y; + + if (p.x > this.startPoint.x) { + x = this.startPoint.x; + } + + if (p.y > this.startPoint.y) { + y = this.startPoint.y; + } + + this.path.setAttributeNS(null, "x", x); + this.path.setAttributeNS(null, "y", y); + this.path.setAttributeNS(null, "width", w); + this.path.setAttributeNS(null, "height", h); + } + } + }, { + key: "mouseDownRect", + value: function mouseDownRect(e) { + this.path = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + this.path.setAttribute("fill", "none"); + this.path.setAttribute("stroke", this.color); + this.path.setAttribute("stroke-linecap", "round"); + this.path.setAttribute("stroke-width", this.strokeWidthRect); + this.startPoint = this.getMousePosition(e); + this.appendPathToSvg(this.path); + } + }, { + key: "mouseDownPen", + value: function mouseDownPen(e) { + var color = this.color + "AA"; + var strokeWidth = this.strokeWidth; + + if (this.tool === "blur") { + color = "#000000"; + strokeWidth = 40; + } + + this.path = document.createElementNS("http://www.w3.org/2000/svg", "path"); + this.path.setAttribute("fill", "none"); + this.path.setAttribute("stroke", color); + this.path.setAttribute("stroke-linecap", "round"); + this.path.setAttribute("stroke-width", strokeWidth); + this.buffer = []; + var pt = this.getMousePosition(e); + this.appendToBuffer(pt); + this.strPath = "M" + pt.x + " " + pt.y; + this.path.setAttribute("d", this.strPath); + this.appendPathToSvg(this.path); + } + }, { + key: "setTool", + value: function setTool(tool) { + this.tool = tool; + } + }, { + key: "setColor", + value: function setColor(color) { + this.color = color; + } + }, { + key: "getMousePosition", + value: function getMousePosition(e) { + if (e.touches && e.touches.length > 0) { + return { + x: e.touches[0].pageX, + y: e.touches[0].pageY + }; + } + + return { + x: e.pageX, + y: e.pageY + }; + } // Calculate the average point, starting at offset in the buffer + + }, { + key: "getAveragePoint", + value: function getAveragePoint(offset) { + var len = this.buffer.length; + + if (len % 2 === 1 || len >= this.bufferSize) { + var totalX = 0; + var totalY = 0; + var pt, i; + var count = 0; + + for (i = offset; i < len; i++) { + count++; + pt = this.buffer[i]; + totalX += pt.x; + totalY += pt.y; + } + + return { + x: totalX / count, + y: totalY / count + }; + } + + return null; + } + }, { + key: "updateSvgPath", + value: function updateSvgPath() { + var pt = this.getAveragePoint(0); + + if (pt) { + // Get the smoothed part of the path that will not change + this.strPath += " L" + pt.x + " " + pt.y; // Get the last part of the path (close to the current mouse position) + // This part will change if the mouse moves again + + var tmpPath = ""; + + for (var offset = 2; offset < this.buffer.length; offset += 2) { + pt = this.getAveragePoint(offset); + tmpPath += " L" + pt.x + " " + pt.y; + } // Set the complete current path coordinates + + + this.path.setAttribute("d", this.strPath + tmpPath); + } + } + }, { + key: "appendToBuffer", + value: function appendToBuffer(pt) { + this.buffer.push(pt); + + while (this.buffer.length > this.bufferSize) { + this.buffer.shift(); + } + } + }, { + key: "appendPathToSvg", + value: function appendPathToSvg(path) { + this.svgElement.appendChild(path); + this.pathBuffer.push(path); + this.rerender(); + } + }, { + key: "removeLastAddedPathFromSvg", + value: function removeLastAddedPathFromSvg() { + if (this.pathBuffer.length <= 0 || !this.svgElement) { + return; + } + + this.svgElement.removeChild(this.pathBuffer[this.pathBuffer.length - 1]); + this.pathBuffer.pop(); + this.rerender(); + } + }, { + key: "fadeOutToolbar", + value: function fadeOutToolbar() { + var fadeTarget = document.querySelector(".bb-capture-toolbar"); + + if (fadeTarget) { + fadeTarget.style.opacity = 0; + fadeTarget.style.pointerEvents = "none"; + } + } + }, { + key: "fadeInToolbar", + value: function fadeInToolbar() { + var fadeTarget = document.querySelector(".bb-capture-toolbar"); + + if (fadeTarget) { + fadeTarget.style.opacity = 1; + fadeTarget.style.pointerEvents = "auto"; + } + } + }]); + + return ScreenDrawer; +}(); +;// CONCATENATED MODULE: ./src/ScrollStopper.js +function ScrollStopper_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ScrollStopper_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ScrollStopper_createClass(Constructor, protoProps, staticProps) { if (protoProps) ScrollStopper_defineProperties(Constructor.prototype, protoProps); if (staticProps) ScrollStopper_defineProperties(Constructor, staticProps); return Constructor; } + +function ScrollStopper_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var ScrollStopper = /*#__PURE__*/function () { + function ScrollStopper() { + ScrollStopper_classCallCheck(this, ScrollStopper); + + ScrollStopper_defineProperty(this, "keys", { + 37: 1, + 38: 1, + 39: 1, + 40: 1 + }); + + ScrollStopper_defineProperty(this, "supportsPassive", false); + + ScrollStopper_defineProperty(this, "wheelOpt", this.supportsPassive ? { + passive: false + } : false); + + ScrollStopper_defineProperty(this, "wheelEvent", "onwheel" in document.createElement("div") ? "wheel" : "mousewheel"); + + ScrollStopper_defineProperty(this, "scrollDisabled", false); + + var self = this; + + try { + window.addEventListener("test", null, Object.defineProperty({}, "passive", { + get: function get() { + self.supportsPassive = true; + self.wheelOpt = self.supportsPassive ? { + passive: false + } : false; + } + })); + } catch (e) {} + } + + ScrollStopper_createClass(ScrollStopper, [{ + key: "preventDefault", + value: function preventDefault(e) { + e.preventDefault(); + } + }, { + key: "preventDefaultForScrollKeys", + value: function preventDefaultForScrollKeys(e) { + if (this.keys && this.keys[e.keyCode]) { + this.preventDefault(e); + return false; + } + } + }], [{ + key: "getInstance", + value: // ScrollStopper singleton + function getInstance() { + if (!this.instance) { + this.instance = new ScrollStopper(); + return this.instance; + } else { + return this.instance; + } + } + }, { + key: "disableScroll", + value: function disableScroll() { + var instance = this.getInstance(); + + if (instance.scrollDisabled) { + return; + } + + instance.scrollDisabled = true; + window.addEventListener("DOMMouseScroll", instance.preventDefault, false); // older FF + + window.addEventListener(instance.wheelEvent, instance.preventDefault, instance.wheelOpt); // modern desktop + + window.addEventListener("touchmove", instance.preventDefault, instance.wheelOpt); // mobile + + window.addEventListener("keydown", instance.preventDefaultForScrollKeys, false); + } + }, { + key: "enableScroll", + value: function enableScroll() { + var instance = this.getInstance(); + + if (!instance.scrollDisabled) { + return; + } + + instance.scrollDisabled = false; + window.removeEventListener("DOMMouseScroll", instance.preventDefault, false); + window.removeEventListener(instance.wheelEvent, instance.preventDefault, instance.wheelOpt); + window.removeEventListener("touchmove", instance.preventDefault, instance.wheelOpt); + window.removeEventListener("keydown", instance.preventDefaultForScrollKeys, false); + } + }]); + + return ScrollStopper; +}(); + +ScrollStopper_defineProperty(ScrollStopper, "instance", void 0); +;// CONCATENATED MODULE: ./src/Session.js +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Session_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function Session_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Session_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Session_createClass(Constructor, protoProps, staticProps) { if (protoProps) Session_defineProperties(Constructor.prototype, protoProps); if (staticProps) Session_defineProperties(Constructor, staticProps); return Constructor; } + +function Session_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + +var Session = /*#__PURE__*/function () { + function Session() { + var _this = this; + + Session_classCallCheck(this, Session); + + Session_defineProperty(this, "apiUrl", "https://api.gleap.io"); + + Session_defineProperty(this, "widgetUrl", "https://widget.gleap.io"); + + Session_defineProperty(this, "sdkKey", null); + + Session_defineProperty(this, "session", { + gleapId: null, + gleapHash: null, + name: "", + email: "", + userId: "" + }); + + Session_defineProperty(this, "ready", false); + + Session_defineProperty(this, "onSessionReadyListener", []); + + Session_defineProperty(this, "setOnSessionReady", function (onSessionReady) { + if (_this.ready) { + onSessionReady(); + } else { + _this.onSessionReadyListener.push(onSessionReady); + } + }); + + Session_defineProperty(this, "injectSession", function (http) { + if (http && _this.session) { + http.setRequestHeader("Api-Token", _this.sdkKey); + http.setRequestHeader("Gleap-Id", _this.session.gleapId); + http.setRequestHeader("Gleap-Hash", _this.session.gleapHash); + } + }); + + Session_defineProperty(this, "clearSession", function () { + var renewSession = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + try { + localStorage.removeItem("bb-remember-reportedBy"); + saveToGleapCache("session-".concat(_this.sdkKey), null); + } catch (exp) {} + + _this.session = { + id: null, + hash: null, + type: null, + name: "", + email: "" + }; // Start guest session. + + if (renewSession) { + _this.startSession(); + } + }); + + Session_defineProperty(this, "validateSession", function (session) { + if (!session) { + return; + } + + saveToGleapCache("session-".concat(_this.sdkKey), session); + _this.session = session; + _this.ready = true; // Optionally update UI. + + var userNameInfo = document.querySelector("#bb-user-name"); + + if (userNameInfo) { + if (session.name && src_Gleap.getInstance().showUserName) { + userNameInfo.textContent = session.name; + } else { + userNameInfo.textContent = ""; + } + } + + _this.notifySessionReady(); + }); + + Session_defineProperty(this, "startSession", function () { + // Check if session is already ready. + var cachedSession = loadFromGleapCache("session-".concat(_this.sdkKey)); + + if (cachedSession) { + _this.validateSession(cachedSession); + } + + var self = _this; + var http = new XMLHttpRequest(); + http.open("POST", self.apiUrl + "/sessions"); + http.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + http.setRequestHeader("Api-Token", self.sdkKey); + + try { + if (_this.session && _this.session.gleapId && _this.session.gleapHash) { + http.setRequestHeader("Gleap-Id", _this.session.gleapId); + http.setRequestHeader("Gleap-Hash", _this.session.gleapHash); + } + + http.setRequestHeader("App-Widget", src_Gleap.getInstance().widgetOnly); + } catch (exp) {} + + http.onerror = function (error) { + self.clearSession(false); + }; + + http.onreadystatechange = function (e) { + if (http.readyState === XMLHttpRequest.DONE) { + if (http.status === 200 || http.status === 201) { + try { + var sessionData = JSON.parse(http.responseText); + self.validateSession(sessionData); + } catch (exp) {} + } else { + self.clearSession(false); + } + } + }; + + http.send(JSON.stringify({})); + }); + + Session_defineProperty(this, "checkIfSessionNeedsUpdate", function (userId, userData) { + if (!_this.session || !_this.session.userId || !userId) { + return true; + } + + try { + if (_this.session.userId.toString() !== userId.toString()) { + return true; + } + } catch (exp) {} + + if (userData) { + var userDataKeys = Object.keys(userData); + + for (var i = 0; i < userDataKeys.length; i++) { + var userDataKey = userDataKeys[i]; + + if (_this.session[userDataKey] !== userData[userDataKey]) { + return true; + } + } + } + + return false; + }); + + Session_defineProperty(this, "identifySession", function (userId, userData) { + if (!_this.checkIfSessionNeedsUpdate(userId, userData)) { + return; + } + + var self = _this; + return new Promise(function (resolve, reject) { + // Wait for gleap session to be ready. + _this.setOnSessionReady(function () { + if (!self.session.gleapId || !self.session.gleapHash) { + return reject(); + } + + var http = new XMLHttpRequest(); + http.open("POST", self.apiUrl + "/sessions/identify"); + http.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + http.setRequestHeader("Api-Token", self.sdkKey); + + try { + http.setRequestHeader("Gleap-Id", self.session.gleapId); + http.setRequestHeader("Gleap-Hash", self.session.gleapHash); + } catch (exp) {} + + http.onerror = function () { + reject(); + }; + + http.onreadystatechange = function (e) { + if (http.readyState === XMLHttpRequest.DONE) { + if (http.status === 200 || http.status === 201) { + try { + var sessionData = JSON.parse(http.responseText); + self.validateSession(sessionData); + resolve(sessionData); + } catch (exp) { + reject(exp); + } + } else { + self.clearSession(true); + reject(); + } + } + }; + + http.send(JSON.stringify(_objectSpread(_objectSpread({}, userData), {}, { + userId: userId + }))); + }); + }); + }); + } + + Session_createClass(Session, [{ + key: "notifySessionReady", + value: function notifySessionReady() { + if (this.onSessionReadyListener.length > 0) { + for (var i = 0; i < this.onSessionReadyListener.length; i++) { + this.onSessionReadyListener[i](); + } + } + + this.onSessionReadyListener = []; + } + }], [{ + key: "getInstance", + value: // Session singleton + function getInstance() { + if (!this.instance) { + this.instance = new Session(); + return this.instance; + } else { + return this.instance; + } + } + }]); + + return Session; +}(); + +Session_defineProperty(Session, "instance", void 0); + + +;// CONCATENATED MODULE: ./src/ScreenRecorder.js +function ScreenRecorder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ScreenRecorder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ScreenRecorder_createClass(Constructor, protoProps, staticProps) { if (protoProps) ScreenRecorder_defineProperties(Constructor.prototype, protoProps); if (staticProps) ScreenRecorder_defineProperties(Constructor, staticProps); return Constructor; } + +function ScreenRecorder_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + +var ScreenRecorder = /*#__PURE__*/function () { + function ScreenRecorder(rerender, permissionErrorText) { + var _this = this; + + ScreenRecorder_classCallCheck(this, ScreenRecorder); + + ScreenRecorder_defineProperty(this, "rerender", void 0); + + ScreenRecorder_defineProperty(this, "stream", void 0); + + ScreenRecorder_defineProperty(this, "mediaRecorder", void 0); + + ScreenRecorder_defineProperty(this, "audioMuted", false); + + ScreenRecorder_defineProperty(this, "audioAvailable", true); + + ScreenRecorder_defineProperty(this, "available", true); + + ScreenRecorder_defineProperty(this, "isRecording", false); + + ScreenRecorder_defineProperty(this, "file", null); + + ScreenRecorder_defineProperty(this, "maxRecordTime", 180); + + ScreenRecorder_defineProperty(this, "recordTime", 0); + + ScreenRecorder_defineProperty(this, "recordingTimer", null); + + ScreenRecorder_defineProperty(this, "permissionErrorText", ""); + + ScreenRecorder_defineProperty(this, "startScreenRecording", function () { + var self = this; + + if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia || this.isRecording) { + this.available = false; + this.rerender(); + return; + } + + navigator.mediaDevices.getDisplayMedia({ + video: true, + audio: true + }).then(function (displayStream) { + self.stream = displayStream; + + if (!self.audioMuted) { + self.startAudioRecording(); + } else { + self.audioAvailable = false; + self.handleRecord({ + stream: displayStream + }); + } + + self.rerender(); + })["catch"](function (err) { + window.alert(self.permissionErrorText); + self.rerender(); + }); + }); + + ScreenRecorder_defineProperty(this, "stopScreenRecording", function () { + if (!this.mediaRecorder || !this.stream || !this.isRecording) { + return; + } + + if (this.recordingTimer) { + clearInterval(this.recordingTimer); + this.recordingTimer = null; + } + + this.mediaRecorder.stop(); + this.stream.getTracks().forEach(function (track) { + track.stop(); + }); + this.rerender(); + }); + + ScreenRecorder_defineProperty(this, "startAudioRecording", function () { + var self = this; + + if (!this.stream) { + return; + } + + navigator.mediaDevices.getUserMedia({ + audio: true, + video: false + }).then(function (voiceStream) { + for (var i = 0; i < voiceStream.getAudioTracks().length; i++) { + self.stream.addTrack(voiceStream.getAudioTracks()[i]); + } + + self.audioMuted = false; + self.audioAvailable = true; + self.handleRecord({ + stream: self.stream + }); + self.rerender(); + })["catch"](function (audioErr) { + self.audioAvailable = false; + self.handleRecord({ + stream: self.stream + }); + self.rerender(); + }); + }); + + ScreenRecorder_defineProperty(this, "toggleAudio", function () { + this.audioMuted = !this.audioMuted; + this.rerender(); + + if (!this.stream) { + return; + } + + var audioTracks = this.stream.getAudioTracks(); + + for (var i = 0; i < audioTracks.length; i++) { + var audioTrack = audioTracks[i]; + audioTrack.enabled = !this.audioMuted; + } + }); + + ScreenRecorder_defineProperty(this, "clearPreview", function () { + document.querySelector(".bb-capture-preview video").src = null; + this.file = null; + this.rerender(); + }); + + ScreenRecorder_defineProperty(this, "handleRecord", function (_ref) { + var stream = _ref.stream, + _ref$mimeType = _ref.mimeType, + mimeType = _ref$mimeType === void 0 ? "video/mp4" : _ref$mimeType; + var self = this; + var recordedChunks = []; + this.mediaRecorder = new MediaRecorder(stream); + this.isRecording = true; + this.recordTime = 0; // Set timer. + + var timerLabel = document.querySelector(".bb-capture-toolbar-item-timer"); + this.recordingTimer = setInterval(function () { + self.recordTime++; + var remainingTime = self.maxRecordTime - self.recordTime; + + if (remainingTime > 0) { + timerLabel.innerHTML = self.formatTime(remainingTime); + } else { + timerLabel.innerHTML = "3:00"; + self.stopScreenRecording(); + } + }, 1000); + + this.mediaRecorder.ondataavailable = function (e) { + if (e.data.size > 0) { + recordedChunks.push(e.data); + } + }; + + stream.getVideoTracks()[0].onended = function () { + self.prepareRecording(recordedChunks, mimeType); + }; + + this.mediaRecorder.onstop = function () { + self.prepareRecording(recordedChunks, mimeType); + }; + + this.mediaRecorder.start(200); // here 200ms is interval of chunk collection + + self.rerender(); + }); + + ScreenRecorder_defineProperty(this, "prepareRecording", function (recordedChunks, mimeType) { + var completeBlob = new Blob(recordedChunks, { + type: mimeType + }); + this.file = new File([completeBlob], "screen-recording.mp4", { + type: "video/mp4" + }); + var previewVideoElement = document.querySelector(".bb-capture-preview video"); + + if (previewVideoElement) { + previewVideoElement.src = URL.createObjectURL(completeBlob); + this.audioAvailable = true; + this.isRecording = false; + this.rerender(); + } + }); + + this.rerender = rerender; + this.permissionErrorText = permissionErrorText; + + if (!navigator.mediaDevices || !navigator.mediaDevices.getDisplayMedia) { + this.available = false; + } + + setTimeout(function () { + _this.rerender(); + }, 100); + } + + ScreenRecorder_createClass(ScreenRecorder, [{ + key: "formatTime", + value: function formatTime(s) { + return (s - (s %= 60)) / 60 + (9 < s ? ":" : ":0") + s; + } + }]); + + return ScreenRecorder; +}(); + +ScreenRecorder_defineProperty(ScreenRecorder, "uploadScreenRecording", function (screenRecordingData) { + return new Promise(function (resolve, reject) { + if (screenRecordingData == null) { + resolve(null); + } + + var xhr = new XMLHttpRequest(); + xhr.open("POST", Session.getInstance().apiUrl + "/uploads/sdk"); + Session.getInstance().injectSession(xhr); + var formdata = new FormData(); + formdata.append("file", screenRecordingData); + xhr.send(formdata); + + xhr.onerror = function () { + reject(); + }; + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + resolve(JSON.parse(xhr.response).fileUrl); + } else { + reject(); + } + } + }; + }); +}); +;// CONCATENATED MODULE: ./src/MarkerManager.js +function MarkerManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function MarkerManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function MarkerManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) MarkerManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) MarkerManager_defineProperties(Constructor, staticProps); return Constructor; } + +function MarkerManager_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + + + + + +var MarkerManager = /*#__PURE__*/function () { + function MarkerManager(type) { + MarkerManager_classCallCheck(this, MarkerManager); + + MarkerManager_defineProperty(this, "type", "screenshot"); + + MarkerManager_defineProperty(this, "dragCursor", null); + + MarkerManager_defineProperty(this, "screenRecorder", null); + + MarkerManager_defineProperty(this, "callback", null); + + MarkerManager_defineProperty(this, "screenDrawer", null); + + MarkerManager_defineProperty(this, "escListener", null); + + MarkerManager_defineProperty(this, "pageLeaveListener", null); + + MarkerManager_defineProperty(this, "overrideLanguage", src_Gleap.getInstance().overrideLanguage); + + MarkerManager_defineProperty(this, "showNextStep", function () { + // Adapt the UI + this.showWidgetUI(); + + if (this.callback) { + this.callback(true); + } + }); + + this.type = type; + } + + MarkerManager_createClass(MarkerManager, [{ + key: "hideWidgetUI", + value: function hideWidgetUI() { + var feedbackButton = document.querySelector(".bb-feedback-button"); + + if (feedbackButton) { + feedbackButton.style.display = "none"; + } + + var dialogUI = document.querySelector(".bb-feedback-dialog-container"); + + if (dialogUI) { + dialogUI.style.display = "none"; + } + } + }, { + key: "showWidgetUI", + value: function showWidgetUI() { + if (this.type === "screenshot") { + ScrollStopper.enableScroll(); + } // Stop screenrecording. + + + if (this.screenRecorder) { + this.screenRecorder.stopScreenRecording(); + } // Unregister ESC listener + + + this.unregisterListeners(); // Cleanup mouse pointer + + this.cleanupMousePointer(); + + if (this.screenDrawer) { + this.screenDrawer.destroy(); + } // Remove the toolbar UI + + + var dialog = document.querySelector(".bb-capture-toolbar"); + + if (dialog) { + dialog.remove(); + } // Remove the preview UI + + + var videoPreviewContainer = document.querySelector(".bb-capture-preview"); + + if (videoPreviewContainer) { + videoPreviewContainer.remove(); + } // Feedback button + + + var feedbackButton = document.querySelector(".bb-feedback-button"); + + if (feedbackButton) { + feedbackButton.style.display = "flex"; + } // Feedback dialog container + + + var dialogUI = document.querySelector(".bb-feedback-dialog-container"); + + if (dialogUI) { + dialogUI.style.display = "block"; + } // Dismiss button + + + var dismissUI = document.querySelector(".bb-capture-dismiss"); + + if (dismissUI) { + dismissUI.style.display = "none"; + } // Hide the color picker + + + var colorPicker = document.querySelector(".bb-capture-toolbar-item-colorpicker"); + + if (colorPicker) { + colorPicker.style.display = "none"; + } // Border layer + + + var borderLayer = document.querySelector(".bb-capture-editor-borderlayer"); + + if (borderLayer) { + borderLayer.style.display = "none"; + } + } + }, { + key: "clear", + value: function clear() { + var captureEditor = document.querySelector(".bb-capture-editor"); + + if (captureEditor) { + captureEditor.remove(); + } + } + }, { + key: "setMouseMove", + value: function setMouseMove(x, y) { + if (!this.dragCursor) { + return; + } + + this.dragCursor.style.left = "".concat(x + 6, "px"); + this.dragCursor.style.top = "".concat(y - 26, "px"); + this.dragCursor.style.right = null; + } + }, { + key: "mouseMoveEventHandler", + value: function mouseMoveEventHandler(e) { + var x = e.pageX - document.documentElement.scrollLeft; + var y = e.pageY - document.documentElement.scrollTop; + this.setMouseMove(x, y); + } + }, { + key: "touchMoveEventHandler", + value: function touchMoveEventHandler(e) { + var x = e.touches[0].pageX - document.documentElement.scrollLeft; + var y = e.touches[0].pageY - document.documentElement.scrollTop; + this.setMouseMove(x, y); + } + }, { + key: "setupMousePointer", + value: function setupMousePointer() { + var self = this; + this.dragCursor = document.querySelector(".bb-capture-editor-drag-info"); + var captureSVG = document.querySelector(".bb-capture-svg"); + captureSVG.addEventListener("mouseenter", function (e) { + self.dragCursor.style.opacity = 1; + }); + captureSVG.addEventListener("mouseleave", function (e) { + self.dragCursor.style.opacity = 0; + }); + document.documentElement.addEventListener("mousemove", this.mouseMoveEventHandler.bind(this)); + document.documentElement.addEventListener("touchmove", this.touchMoveEventHandler.bind(this)); + } + }, { + key: "cleanupMousePointer", + value: function cleanupMousePointer() { + document.documentElement.removeEventListener("mousemove", this.mouseMoveEventHandler); + document.documentElement.removeEventListener("touchmove", this.touchMoveEventHandler); + + if (this.dragCursor) { + this.dragCursor.remove(); + } + } + }, { + key: "createEditorUI", + value: function createEditorUI() { + // Add HTML for drawing and recording + var bugReportingEditor = document.createElement("div"); + bugReportingEditor.className = "bb-capture-editor"; + bugReportingEditor.innerHTML = "\n
\n \n
".concat(loadIcon("dismiss"), "
\n
").concat(loadIcon("rect"), "
\n
\n ").concat(this.type === "capture" ? "
\n ".concat(loadIcon("recorderon"), "\n ").concat(loadIcon("recorderoff"), "\n \n
\n
\n ").concat(loadIcon("mic"), "\n \n
\n
3:00
\n
\n
\n ").concat(loadIcon("pointer"), "\n
") : "", "\n
\n ").concat(loadIcon("rect"), "\n
\n
\n ").concat(loadIcon("pen"), "\n
\n
\n ").concat(loadIcon("blur"), "\n
\n
\n
\n ").concat(translateText("Pick a color", this.overrideLanguage), "\n
\n
\n ").concat(loadIcon("undo"), "\n ").concat(translateText("Undo", this.overrideLanguage), "\n
\n ").concat(this.type !== "capture" ? "
".concat(translateText("Next", this.overrideLanguage), "
") : "", "\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
").concat(translateText("Retry", this.overrideLanguage), "
\n
").concat(translateText("Next", this.overrideLanguage), "
\n
\n
\n
\n "); + src_Gleap.appendNode(bugReportingEditor); + } + }, { + key: "unregisterListeners", + value: function unregisterListeners() { + if (this.escListener) { + document.removeEventListener("keydown", this.escListener); + } + + if (this.pageLeaveListener) { + window.removeEventListener("beforeunload", this.pageLeaveListener); + } // Register Gleap listener. + + + src_Gleap.getInstance().registerEscListener(); + } + }, { + key: "registerListeners", + value: function registerListeners() { + var self = this; // Esc listener + + this.escListener = function (evt) { + evt = evt || window.event; + var isEscape = false; + var isEnter = false; + + if ("key" in evt) { + isEscape = evt.key === "Escape" || evt.key === "Esc"; + isEnter = evt.key === "Enter"; + } else { + isEscape = evt.keyCode === 27; + isEnter = evt.keyCode === 13; + } + + if (isEscape) { + self.dismiss(); + } + + if (self.type === "screenshot" && isEnter) { + self.showNextStep(); + } + }; + + document.addEventListener("keydown", this.escListener); // Page leave listener + + this.pageLeaveListener = function (event) { + event.preventDefault(); + event.returnValue = ""; + }; + + window.addEventListener("beforeunload", this.pageLeaveListener); // Unregister Gleap listener. + + src_Gleap.getInstance().unregisterEscListener(); + } + }, { + key: "show", + value: function show(callback) { + this.callback = callback; + var self = this; + this.registerListeners(); // Hide widget UI + + this.hideWidgetUI(); // Create the editor UI + + this.createEditorUI(); // Setup the mouse pointer + + this.setupMousePointer(); // Setup screenshot data + + if (this.type === "screenshot") { + // Overwrite snapshot position + src_Gleap.getInstance().snapshotPosition = { + x: window.scrollX, + y: window.scrollY + }; // Disable scroll + + ScrollStopper.disableScroll(); + } else { + // Setup screen recording + this.setupScreenRecording(); + } // Hook up the drawing. + + + this.screenDrawer = new ScreenDrawer(this.captureScreenDrawerRerender.bind(this)); + this.setupColorPicker(); + this.setupToolbar(); + } + }, { + key: "setupColorPicker", + value: function setupColorPicker() { + var self = this; + var selectedColor = document.querySelector(".bb-capture-toolbar-item-selectedcolor"); + var colorItems = document.querySelectorAll(".bb-capture-toolbar-item-color"); + var colorpicker = document.querySelector(".bb-capture-toolbar-item-colorpicker"); + + var _loop = function _loop() { + var colorItem = colorItems[i]; + var hexColor = colorItem.getAttribute("data-color"); + colorItem.style.backgroundColor = hexColor; + + colorItem.onclick = function () { + if (colorItem) { + self.screenDrawer.setColor(hexColor); + + if (colorpicker) { + colorpicker.style.display = "none"; + } + + selectedColor.style.backgroundColor = colorItem.style.backgroundColor; + MarkerManager.setPenColor(hexColor); + } + }; + }; + + for (var i = 0; i < colorItems.length; i++) { + _loop(); + } + } + }, { + key: "dismiss", + value: function dismiss() { + this.showWidgetUI(); + + if (this.callback) { + this.callback(false); + } + } + }, { + key: "setupToolbar", + value: function setupToolbar() { + var self = this; // Hook up dismiss button + + var dismissButton = document.querySelector(".bb-capture-dismiss"); + + dismissButton.onclick = function () { + self.dismiss(); + }; // Hook up send button + + + var nextButton = document.querySelector(".bb-capture-button-next"); + + if (nextButton) { + nextButton.onclick = this.showNextStep.bind(this); + } + + var colorpicker = document.querySelector(".bb-capture-toolbar-item-colorpicker"); // Capture SVG ref + + var captureSVG = document.querySelector(".bb-capture-svg"); // Setup toolbar items + + var toolbarItems = document.querySelectorAll(".bb-capture-toolbar-item"); + + var _loop2 = function _loop2() { + var toolbarItem = toolbarItems[i]; + + toolbarItem.onclick = function () { + var type = toolbarItem.getAttribute("data-type"); + + if (colorpicker && type !== "colorpicker") { + colorpicker.style.display = "none"; + } // Mic & recording buttons + + + if (type === "mic") { + self.screenRecorder.toggleAudio(); + } + + if (type === "recording") { + if (self.screenRecorder.isRecording) { + self.screenRecorder.stopScreenRecording(); + } else { + self.screenRecorder.startScreenRecording(); + } + } // Marker buttons + + + if (self.type === "capture" && !self.screenRecorder.isRecording) { + // Inactivate buttons. + return; + } + + if (type === "pen" || type === "blur" || type === "rect" || type === "pointer") { + var toolbarTools = document.querySelectorAll(".bb-capture-toolbar-item-tool"); + + for (var j = 0; j < toolbarTools.length; j++) { + toolbarTools[j].classList.remove("bb-capture-toolbar-item--active"); + } + + toolbarItem.classList.add("bb-capture-toolbar-item--active"); + self.screenDrawer.setTool(type); + self.dragCursor.innerHTML = ""; + + if (type === "pointer") { + captureSVG.style.pointerEvents = "none"; + } else { + captureSVG.style.pointerEvents = "auto"; + + try { + var svgClone = toolbarItem.querySelector("svg").cloneNode(true); + + if (svgClone && self.dragCursor) { + self.dragCursor.appendChild(svgClone); + } + } catch (exp) {} + } + } + + if (type === "colorpicker") { + if (colorpicker.style.display === "flex") { + colorpicker.style.display = "none"; + } else { + colorpicker.style.display = "flex"; + } + } + + if (type === "undo") { + self.screenDrawer.removeLastAddedPathFromSvg(); + } + }; + }; + + for (var i = 0; i < toolbarItems.length; i++) { + _loop2(); + } + } + }, { + key: "captureScreenDrawerRerender", + value: function captureScreenDrawerRerender() { + if (!this.screenDrawer) { + return; + } + + var itemInactiveClass = "bb-capture-editor-item-inactive"; + var toolbarItems = document.querySelectorAll(".bb-capture-toolbar-item"); + + for (var i = 0; i < toolbarItems.length; i++) { + var toolbarItem = toolbarItems[i]; + var type = toolbarItem.getAttribute("data-type"); + + switch (type) { + case "undo": + if (this.screenDrawer.pathBuffer != null && this.screenDrawer.pathBuffer.length > 0) { + toolbarItem.classList.remove(itemInactiveClass); + } else { + toolbarItem.classList.add(itemInactiveClass); + } + + break; + + default: + break; + } + } + } + }, { + key: "captureRenderer", + value: function captureRenderer() { + if (!this.screenRecorder) { + return; + } + + if (this.screenRecorder.file) { + src_Gleap.getInstance().screenRecordingData = this.screenRecorder.file; + } + + var itemInactiveClass = "bb-capture-editor-item-inactive"; + var timerLabel = document.querySelector(".bb-capture-toolbar-item-timer"); + var toolbarItems = document.querySelectorAll(".bb-capture-toolbar-item"); + var screenRecordingTooltip = document.querySelector(".bb-tooltip-screen-recording"); + var audioRecordingTooltip = document.querySelector(".bb-tooltip-audio-recording"); + var captureEditor = document.querySelector(".bb-capture-editor"); + var recordingClass = "bb-capture-editor-recording"; + var notRecordingClass = "bb-capture-editor-notrecording"; + + if (this.screenRecorder.isRecording) { + captureEditor.classList.add(recordingClass); + captureEditor.classList.remove(notRecordingClass); + } else { + captureEditor.classList.add(notRecordingClass); + captureEditor.classList.remove(recordingClass); + } // Update UI. + + + var dialog = document.querySelector(".bb-capture-toolbar"); + var videoPreviewContainer = document.querySelector(".bb-capture-preview"); + videoPreviewContainer.style.display = this.screenRecorder.file ? "flex" : "none"; + dialog.style.display = !this.screenRecorder.file ? "flex" : "none"; + + for (var i = 0; i < toolbarItems.length; i++) { + var toolbarItem = toolbarItems[i]; + var type = toolbarItem.getAttribute("data-type"); + + switch (type) { + case "mic": + if (this.screenRecorder.audioAvailable && this.screenRecorder.available) { + toolbarItem.classList.remove(itemInactiveClass); + + if (!this.screenRecorder.audioMuted) { + toolbarItem.classList.remove("bb-capture-toolbar-item--inactivecross"); + audioRecordingTooltip.innerHTML = translateText("Mute", this.overrideLanguage); + } else { + toolbarItem.classList.add("bb-capture-toolbar-item--inactivecross"); + audioRecordingTooltip.innerHTML = translateText("Unmute", this.overrideLanguage); + } + } else { + toolbarItem.classList.add(itemInactiveClass); + toolbarItem.classList.add("bb-capture-toolbar-item--inactivecross"); + audioRecordingTooltip.innerHTML = translateText("Browser not supported", this.overrideLanguage); + } + + break; + + case "recording": + if (this.screenRecorder.available) { + toolbarItem.classList.remove(itemInactiveClass); + + if (this.screenRecorder.isRecording) { + toolbarItem.setAttribute("data-active", "true"); + screenRecordingTooltip.innerHTML = translateText("Stop recording", this.overrideLanguage); + timerLabel.style.display = "block"; + } else { + toolbarItem.setAttribute("data-active", "false"); + screenRecordingTooltip.innerHTML = translateText("Start recording", this.overrideLanguage); + timerLabel.style.display = "none"; + } + } else { + // Recording is not available. + toolbarItem.classList.add(itemInactiveClass); + screenRecordingTooltip.innerHTML = translateText("Browser not supported", this.overrideLanguage); + } + + break; + + default: + break; + } + } + } + }, { + key: "setupScreenRecording", + value: function setupScreenRecording() { + var self = this; // Hook preview next button + + var nextButtonPreview = document.querySelector(".bb-capture-preview-sendbutton"); + nextButtonPreview.onclick = this.showNextStep.bind(this); // Hook retry button + + var retryButton = document.querySelector(".bb-capture-preview-retrybutton"); + + retryButton.onclick = function () { + self.screenRecorder.clearPreview(); + + if (self.screenDrawer) { + self.screenDrawer.clear(); + } + }; // Setup screen recorder + + + this.screenRecorder = new ScreenRecorder(this.captureRenderer.bind(this), translateText("You denied access to screen sharing. Please turn it on in your browser settings.", this.overrideLanguage)); + } + }], [{ + key: "setPenColor", + value: function setPenColor(hexColor) { + var penTips = document.querySelectorAll(".bb-pen-tip"); + + for (var j = 0; j < penTips.length; j++) { + penTips[j].style.fill = hexColor; + } + } + }]); + + return MarkerManager; +}(); + + +;// CONCATENATED MODULE: ./src/FeedbackForm.js + + + + +var formPageClass = "bb-feedback-formpage"; + +var getTitleHTML = function getTitleHTML(title, overrideLanguage, required) { + if (title === undefined) { + return ""; + } + + return "
".concat(translateText(title, overrideLanguage)).concat(required ? "*" : "", "
"); +}; + +var getDescriptionHTML = function getDescriptionHTML(description, overrideLanguage) { + if (description === undefined || description.length === 0) { + return ""; + } + + return "
".concat(translateText(description, overrideLanguage), "
"); +}; + +var getFormPageClass = function getFormPageClass(formPage) { + if (formPage === undefined) { + return ""; + } + + return "".concat(formPageClass, " ").concat(formPageClass, "-").concat(formPage); +}; + +var renderButtonsForPage = function renderButtonsForPage(currentPage, totalPages, overrideLanguage) { + var lastButton = currentPage === totalPages - 1; + return "
\n
").concat(translateText(lastButton ? "Submit" : "Next", overrideLanguage), "
\n
"); +}; + +var isTypeAutoNext = function isTypeAutoNext(type) { + if (type === "rating" || type === "onetofive") { + return true; + } + + return false; +}; + +var buildForm = function buildForm(feedbackOptions, overrideLanguage) { + var form = feedbackOptions.form; + var formHTML = "
"; + + for (var i = 0; i < form.length; i++) { + var formItem = form[i]; + + if (!formItem) { + break; + } // Determine current page. + + + var currentPage = formItem.page; + var formItemData = "bb-form-page=\"".concat(currentPage, "\" bb-form-item=\"").concat(encodeURIComponent(JSON.stringify(formItem)), "\""); + + if (formItem.type === "text") { + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
"); + } + + if (formItem.type === "capture") { + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
\n ").concat(formItem.enableScreenshot ? "
\n ".concat(loadIcon("screenshot"), "\n ").concat(translateText(formItem.screenshotTitle, overrideLanguage), "\n ").concat(translateText(formItem.screenshotTooltip, overrideLanguage), "\n
") : "", "\n ").concat(formItem.enableCapture && typeof navigator !== "undefined" && navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia ? "
\n ".concat(loadIcon("camera"), "\n ").concat(translateText(formItem.captureTitle, overrideLanguage), "\n ").concat(translateText(formItem.captureTooltip, overrideLanguage), "\n
") : "", "\n
\n
\n
\n
").concat(loadIcon("clip"), "
\n
\n
").concat(loadIcon("dismiss"), "
\n
\n
\n
"); + } + + if (formItem.type === "upload") { + var acceptAttribute = ""; + + if (formItem.restrictions && formItem.restrictions.length > 0) { + acceptAttribute = "accept=\"".concat(formItem.restrictions, "\""); + } + + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n
\n \n \n \n
\n \n \n ").concat(translateText("The file you chose exceeds the file size limit of 3MB.", overrideLanguage), "\n
"); + } + + if (formItem.type === "textarea") { + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
"); + } + + if (formItem.type === "privacypolicy") { + formHTML += "
\n \n \n
"); + } + + if (formItem.type === "rating") { + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
    \n
  • \n
    \n \n \n \n \n \n \n \n \n \n
    \n
  • \n
  • \n
    \n \n \n \n \n \n \n \n \n \n
    \n
  • \n
  • \n
    \n
  • \n
  • \n
    \n \n \n \n \n \n \n \n \n \n
    \n
  • \n
  • \n
    \n \n \n \n \n \n \n
    \n
  • \n
\n \n \n \n \n \n \n \n \n
"); + } + + if (formItem.type === "onetofive") { + var getNumberButtonHTML = function getNumberButtonHTML(formItem, number) { + return "
").concat(number, "
"); + }; + + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n
\n ").concat(getNumberButtonHTML(formItem, 1), "\n ").concat(getNumberButtonHTML(formItem, 2), "\n ").concat(getNumberButtonHTML(formItem, 3), "\n ").concat(getNumberButtonHTML(formItem, 4), "\n ").concat(getNumberButtonHTML(formItem, 5), "\n
\n
").concat(translateText(formItem.lowestValueLabel, overrideLanguage), "").concat(translateText(formItem.highestValueLabel, overrideLanguage), "
\n
"); + } + + if (formItem.type === "multiplechoice" && formItem.choices && formItem.choices.length > 0) { + var getOptionHTML = function getOptionHTML(formItem, value) { + return ""); + }; + + var optionHTML = ""; + + if (formItem.randomizeChoices) { + formItem.choices = shuffle(formItem.choices); + } + + for (var j = 0; j < formItem.choices.length; j++) { + optionHTML += getOptionHTML(formItem, formItem.choices[j]); + } + + formHTML += "
\n ").concat(getDescriptionHTML(formItem.description, overrideLanguage), "\n ").concat(getTitleHTML(formItem.title, overrideLanguage, formItem.required), "\n \n ").concat(optionHTML, "\n
"); + } + + if ((form[i + 1] && form[i + 1].page !== currentPage || i + 1 === form.length) && !isTypeAutoNext(formItem.type)) { + formHTML += renderButtonsForPage(currentPage, feedbackOptions.pages, overrideLanguage); + } + } + + return formHTML; +}; + +function shuffle(array) { + var currentIndex = array.length, + randomIndex; + + while (currentIndex != 0) { + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + var _ref = [array[randomIndex], array[currentIndex]]; + array[currentIndex] = _ref[0]; + array[randomIndex] = _ref[1]; + } + + return array; +} + +var getFormData = function getFormData(form) { + var formData = {}; + + for (var i = 0; i < form.length; i++) { + var formItem = form[i]; + var formElement = document.querySelector(".bb-feedback-".concat(formItem.name)); + + if (formElement && formElement.value) { + formData[formItem.name] = formElement.value; + } + } + + return formData; +}; +var rememberForm = function rememberForm(form) { + for (var i = 0; i < form.length; i++) { + var formItem = form[i]; + + if (formItem.remember) { + var formElement = document.querySelector(".bb-feedback-".concat(formItem.name)); + + if (formElement && formElement.value) { + try { + localStorage.setItem("bb-remember-".concat(formItem.name), formElement.value); + } catch (exp) {} + } + } + } +}; + +var validateEmail = function validateEmail(email) { + var re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email).toLowerCase()); +}; + +var validateFormItem = function validateFormItem(formItem) { + var shouldShowError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var valid = true; + var formElement = document.querySelector(".bb-feedback-".concat(formItem.name)); + + if (!formElement) { + return false; + } + + var formElementDirtyFlag = formElement.getAttribute("bb-dirty"); + var showError = shouldShowError && formElementDirtyFlag === "true"; + + if ((formItem.type === "text" || formItem.type === "textarea") && formItem.required) { + if (!formElement.value || formElement.value === "") { + showError && formElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.classList.remove("bb-feedback-required"); + } + } + + if (formItem.type === "text" && formItem.inputtype === "email" && formItem.required) { + if (!validateEmail(formElement.value)) { + showError && formElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.classList.remove("bb-feedback-required"); + } + } + + if (formItem.type === "upload" && formItem.required) { + if (!formElement.value || formElement.value === "") { + showError && formElement.parentElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.parentElement.classList.remove("bb-feedback-required"); + } + } + + if (formItem.type === "rating" && formItem.required) { + if (!formElement.value || formElement.value === "") { + showError && formElement.parentElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.parentElement.classList.remove("bb-feedback-required"); + } + } + + if (formItem.type === "onetofive" && formItem.required) { + if (!formElement.value || formElement.value === "") { + showError && formElement.parentElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.parentElement.classList.remove("bb-feedback-required"); + } + } + + if (formItem.type === "multiplechoice" && formItem.required) { + if (!formElement.value || formElement.value === "") { + showError && formElement.parentElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.parentElement.classList.remove("bb-feedback-required"); + } + } + + if (formItem.type === "privacypolicy" && formItem.required) { + if (!formElement.checked) { + showError && formElement.parentElement.classList.add("bb-feedback-required"); + valid = false; + } else { + formElement.parentElement.classList.remove("bb-feedback-required"); + } + } + + return valid; +}; + +var updateFormProgressBar = function updateFormProgressBar(currentPage, pages) { + var innerProgressBar = document.querySelector(".bb-form-progress-inner"); + + if (innerProgressBar && pages > 0) { + var progress = Math.round((currentPage + 1) / pages * 100); + + if (progress > 100) { + progress = 100; + } + + innerProgressBar.style.width = "".concat(progress, "%"); + } +}; + +var handleNextFormStep = function handleNextFormStep(currentPage, pages, submitForm) { + if (!validateFormPage(currentPage)) { + return; + } + + updateFormProgressBar(currentPage + 1, pages); + + if (currentPage === pages - 1) { + submitForm(); + } else { + showFormPage(currentPage + 1); + } +}; + +var showFormPage = function showFormPage(pageToShow) { + var formPagesToHide = document.querySelectorAll(".".concat(formPageClass)); + + for (var i = 0; i < formPagesToHide.length; i++) { + if (formPagesToHide[i]) { + formPagesToHide[i].style.display = "none"; + } + } + + var formPagesToShow = document.querySelectorAll(".".concat(formPageClass, "-").concat(pageToShow)); + + for (var i = 0; i < formPagesToShow.length; i++) { + if (formPagesToShow[i]) { + formPagesToShow[i].style.display = "flex"; + } + } +}; + +var addDirtyFlagToFormElement = function addDirtyFlagToFormElement(formElement) { + formElement.setAttribute("bb-dirty", "true"); +}; + +var hookForm = function hookForm(formOptions, submitForm, overrideLanguage) { + var form = formOptions.form; + var singlePageForm = formOptions.singlePageForm; // Hook up submit buttons + + var sendButtons = document.querySelectorAll(".bb-feedback-send-button"); + + var _loop = function _loop() { + var sendButton = sendButtons[i]; + + sendButton.onclick = function () { + if (sendButton && sendButton.getAttribute("disabled") !== "true" && sendButton.getAttribute("bb-form-page")) { + var currentPage = parseInt(sendButton.getAttribute("bb-form-page")); + handleNextFormStep(currentPage, formOptions.pages, submitForm); + } + }; + }; + + for (var i = 0; i < sendButtons.length; i++) { + _loop(); + } // Hook up form + + + var _loop2 = function _loop2() { + var formItem = form[i]; + + if (!formItem) { + return "break"; + } + + var formInput = document.querySelector(".bb-feedback-".concat(formItem.name)); + + if (!formInput) { + return "break"; + } + + var currentPage = parseInt(formInput.getAttribute("bb-form-page")); + + if (formItem.type === "text") { + if (formItem.remember && !(formItem.defaultValue && formItem.defaultValue.length > 0)) { + try { + var rememberedValue = localStorage.getItem("bb-remember-".concat(formItem.name)); + + if (rememberedValue) { + formInput.value = rememberedValue; + formItem.defaultValue = rememberedValue; + } + } catch (exp) {} + } + + if (formItem.defaultValue) { + formInput.value = formItem.defaultValue; + } // Check if the email is valid. + + + if (!validateEmail(formItem.defaultValue)) { + formItem.defaultValue = ""; + formInput.value = ""; + } + + if (formItem.defaultValue && formItem.defaultValue.length > 0 && formItem.hideOnDefaultSet) { + formInput.parentElement.classList.add("bb-feedback-form--hidden"); + } + + formInput.addEventListener("focusin", function () { + addDirtyFlagToFormElement(formInput); + }); + formInput.addEventListener("focusout", function () { + validateFormPage(currentPage); + }); + + formInput.oninput = function () { + validateFormPage(currentPage, false); + }; + } + + if (formItem.type === "privacypolicy") { + formInput.onchange = function () { + addDirtyFlagToFormElement(formInput); + validateFormPage(currentPage); + }; + } + + if (formItem.type === "capture") { + (function () { + var captureItemsContainer = document.querySelector(".bb-feedback-capture-items"); + var captureItems = document.querySelectorAll(".bb-feedback-capture-item"); + var selectedItem = document.querySelector(".bb-feedback-capture-item-selected"); + var selectedItemLabel = document.querySelector(".bb-feedback-capture-item-selected-label"); + var selectedItemAction = document.querySelector(".bb-feedback-capture-item-selected-action"); + + var _loop3 = function _loop3() { + var captureItem = captureItems[j]; + var type = captureItem.getAttribute("data-type"); + + captureItem.onclick = function () { + var manager = new MarkerManager(type); + manager.show(function (success) { + if (!success) { + manager.clear(); + } else { + var actionLabel = ""; + + if (type === "screenshot") { + actionLabel = translateText("Screenshot", overrideLanguage); + } else { + actionLabel = translateText("Screen recording", overrideLanguage); + } + + selectedItemLabel.innerHTML = actionLabel; + captureItemsContainer.style.display = "none"; + selectedItem.style.display = "flex"; + + selectedItemAction.onclick = function () { + manager.clear(); + captureItemsContainer.style.display = "flex"; + selectedItem.style.display = "none"; + }; + } + }); + }; + }; + + for (j = 0; j < captureItems.length; j++) { + _loop3(); + } // Wire autostart. + + + if (formItem.autostartDrawing) { + var captureButton = document.querySelector('.bb-feedback-capture-item[data-type="screenshot"]'); + + if (captureButton) { + captureButton.click(); + } + } + })(); + } + + if (formItem.type === "upload") { + var formFileUploadInput = document.querySelector(".bb-form-fileupload-".concat(formItem.name)); + var fileSizeInfo = document.querySelector(".bb-feedback-filesizeinfo-".concat(formItem.name)); + + if (formFileUploadInput) { + formFileUploadInput.addEventListener("change", function () { + addDirtyFlagToFormElement(formInput); + validateFormPage(currentPage); + + if (fileSizeInfo) { + fileSizeInfo.style.display = "none"; + } + + if (formFileUploadInput.files && formFileUploadInput.files.length > 0) { + var file = formFileUploadInput.files[0]; + + if (file.size / 1024 / 1024 > 3) { + if (fileSizeInfo) { + fileSizeInfo.style.display = "block"; + } + + return; + } + + var formData = new FormData(); + formData.append("file", file); + var uploadLoader = document.querySelector(".bb-feedback-dialog-loading--".concat(formItem.name)); + + if (uploadLoader) { + uploadLoader.style.display = "flex"; + formFileUploadInput.style.display = "none"; + } + + var xhr = new XMLHttpRequest(); + xhr.open("POST", Session.getInstance().apiUrl + "/uploads/attachments"); + Session.getInstance().injectSession(xhr); + + xhr.upload.onprogress = function (e) { + if (e.lengthComputable) { + var percentComplete = parseInt(e.loaded / e.total * 100); + setLoadingIndicatorProgress(percentComplete, formItem.name); + } + }; + + xhr.onerror = function () { + if (uploadLoader) { + uploadLoader.style.display = "none"; + } + + formFileUploadInput.style.display = "block"; + }; + + xhr.onreadystatechange = function () { + if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText) { + try { + var data = JSON.parse(xhr.responseText); + + if (data.fileUrls && data.fileUrls.length > 0) { + formInput.value = data.fileUrls[0]; + + if (!singlePageForm) { + handleNextFormStep(currentPage, formOptions.pages, submitForm); + } + } + } catch (exp) {} + + if (uploadLoader) { + uploadLoader.style.display = "none"; + } + + formFileUploadInput.style.display = "block"; + } + }; + + xhr.send(formData); + } + }); + } + } + + if (formItem.type === "textarea") { + formInput.style.height = "inherit"; + formInput.style.height = formInput.scrollHeight + "px"; + formInput.addEventListener("focusin", function () { + addDirtyFlagToFormElement(formInput); + }); + + formInput.oninput = function () { + formInput.style.height = "inherit"; + formInput.style.height = formInput.scrollHeight + "px"; + validateFormPage(currentPage); + }; + } + + if (formItem.type === "rating") { + var ratingItems = document.querySelectorAll(".bb-feedback-rating-".concat(formItem.name, " .bb-feedback-emojigroup li")); + + var _loop4 = function _loop4() { + var ratingItem = ratingItems[j]; + ratingItem.addEventListener("click", function (e) { + if (!ratingItem) { + return; + } + + formInput.value = ratingItem.getAttribute("data-value"); + validateFormPage(currentPage); + var lastActiveItem = document.querySelector(".bb-feedback-rating-".concat(formItem.name, " .bb-feedback-emojigroup li.bb-feedback-active")); + + if (lastActiveItem) { + lastActiveItem.classList.remove("bb-feedback-active"); + } + + ratingItem.classList.add("bb-feedback-active"); + e.preventDefault(); + + if (!singlePageForm) { + handleNextFormStep(currentPage, formOptions.pages, submitForm); + } + }); + }; + + for (j = 0; j < ratingItems.length; j++) { + _loop4(); + } + } + + if (formItem.type === "onetofive") { + var onetofiveItems = document.querySelectorAll(".bb-feedback-onetofive-".concat(formItem.name, " .bb-feedback-onetofive-button")); + + var _loop5 = function _loop5() { + var onetofiveItem = onetofiveItems[j]; + onetofiveItem.addEventListener("click", function (e) { + if (!onetofiveItem) { + return; + } + + formInput.value = onetofiveItem.getAttribute("data-value"); + validateFormPage(currentPage); + var lastActiveItem = document.querySelector(".bb-feedback-onetofive-".concat(formItem.name, " .bb-feedback-onetofive-button-active")); + + if (lastActiveItem) { + lastActiveItem.classList.remove("bb-feedback-onetofive-button-active"); + } + + onetofiveItem.classList.add("bb-feedback-onetofive-button-active"); + e.preventDefault(); + + if (!singlePageForm) { + handleNextFormStep(currentPage, formOptions.pages, submitForm); + } + }); + }; + + for (j = 0; j < onetofiveItems.length; j++) { + _loop5(); + } + } + + if (formItem.type === "multiplechoice") { + var multiplechoiceItems = document.querySelectorAll(".bb-feedback-multiplechoice-".concat(formItem.name, " .bb-feedback-multiplechoice-container")); + + var _loop6 = function _loop6() { + var multiplechoiceItem = multiplechoiceItems[j]; + multiplechoiceItem.addEventListener("click", function (e) { + if (!multiplechoiceItem) { + return; + } + + formInput.value = multiplechoiceItem.getAttribute("data-value"); + validateFormPage(currentPage); + }); + }; + + for (j = 0; j < multiplechoiceItems.length; j++) { + _loop6(); + } + } // Validate form item initially. + + + validateFormPage(currentPage, false); + }; + + for (var i = 0; i < form.length; i++) { + var j; + var j; + var j; + var j; + + var _ret = _loop2(); + + if (_ret === "break") break; + } // Show first page. + + + showFormPage(0); + updateFormProgressBar(0, formOptions.pages); +}; +var validateFormPage = function validateFormPage(page) { + var showError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var formValid = true; + var formElementsToCheck = document.querySelectorAll("[bb-form-page=\"".concat(page, "\"]")); + + for (var i = 0; i < formElementsToCheck.length; i++) { + var formElementToCheck = formElementsToCheck[i]; + + if (formElementToCheck && formElementToCheck.getAttribute("bb-form-item")) { + var formItem = JSON.parse(decodeURIComponent(formElementToCheck.getAttribute("bb-form-item"))); + + if (!validateFormItem(formItem, showError)) { + formValid = false; + } + } + } + + var currentNextButton = document.querySelector(".bb-feedback-next-btn-".concat(page)); + + if (currentNextButton) { + if (!formValid) { + currentNextButton.setAttribute("disabled", "true"); + currentNextButton.classList.add("bb-feedback-send-button--disabled"); + } else { + currentNextButton.removeAttribute("disabled"); + currentNextButton.classList.remove("bb-feedback-send-button--disabled"); + } + } + + return formValid; +}; +;// CONCATENATED MODULE: ./src/UXDetectors.js +var detectRageClicks = function detectRageClicks(subscribe, options) { + var interval = options.interval, + limit = options.limit; + var count = 1; + var countClear = setInterval(function () { + count = 1; + }, interval); + + var listener = function listener(event) { + if (count === limit) { + subscribe(event.target); + } + + count++; + }; + + document.addEventListener("click", listener); +}; + +var startRageClickDetector = function startRageClickDetector(callback) { + detectRageClicks(function (target, unsubscribe) { + callback(target); + }, { + interval: 750, + limit: 4 + }); +}; +;// CONCATENATED MODULE: ./src/DrawingCanvas.js + + + +var createScreenshotEditor = function createScreenshotEditor(screenshot, onDone, onCancel, overrideLanguage, showBack) { + var elem = document.createElement("div"); + elem.className = "bb-feedback-dialog-container"; + elem.innerHTML = "
\n
\n
\n ").concat(loadIcon(showBack ? "arrowleft" : "close", "#fff"), "\n
\n
\n
").concat(translateText("Mark the bug", overrideLanguage), "
\n
\n
\n ").concat(translateText("Next", overrideLanguage), "\n ").concat(loadIcon("arrowleft", "#000"), "\n
\n
\n
\n
\n \n
\n
\n
\n
\n ").concat(loadIcon("pen"), "\n
\n
\n ").concat(loadIcon("blur"), "\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n ").concat(loadIcon("undo"), "\n
\n
\n
\n
\n
"); + document.body.appendChild(elem); + setTimeout(function () { + var drawingDialog = document.querySelector(".bb-feedback-dialog-drawing"); + + if (drawingDialog) { + drawingDialog.classList.remove("bb-anim-fadeinright"); + } + }, 500); + var drawBack = document.querySelector(".bb-drawing-tool-back"); + var canvas = document.getElementById("bb-screenshot-editor-canvas"); + var ctx = canvas.getContext("2d"); + var currentColor = "#EB144C"; + var currentTool = "pen"; + var baseImage = null; + var drawingStack = []; + var drawingHistory = []; + + function getCanvasScale() { + return canvas.width / canvas.offsetWidth; + } + + function updateDrawingTools() { + var scale = getCanvasScale(); + + if (currentTool === "pen") { + ctx.lineWidth = 8 * scale; + ctx.strokeStyle = currentColor; + ctx.lineCap = "round"; + } else { + ctx.lineWidth = 34 * scale; + ctx.strokeStyle = "#000"; + ctx.lineCap = "round"; + } + + drawingStack.push({ + t: "t", + lw: ctx.lineWidth, + ss: ctx.strokeStyle + }); + } + + function validateBackButton() { + var disabled = "bb-drawing-tool-action--disabled"; + + if (drawingHistory.length > 0) { + drawBack.classList.remove(disabled); + } else { + drawBack.classList.add(disabled); + } + } + + function drawBackAction() { + drawingHistory.pop(); // Redraw base image + + ctx.drawImage(baseImage, 0, 0); // Replay + + for (var i = 0; i < drawingHistory.length; i++) { + var steps = drawingHistory[i]; + + for (var j = 0; j < steps.length; j++) { + var step = steps[j]; + + if (step.t === "t") { + ctx.lineWidth = step.lw; + ctx.strokeStyle = step.ss; + ctx.lineCap = "round"; + } + + if (step.t === "m") { + ctx.beginPath(); + ctx.lineTo(step.x, step.y); + } + + if (step.t === "l") { + ctx.lineTo(step.x, step.y); + ctx.stroke(); + } + } + } // Reset tools to current + + + updateDrawingTools(); // Update back button + + validateBackButton(); + } + + var resizeCanvas = function resizeCanvas() { + // Calculate canvas scale. + var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); + var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0); + var ratio = 0; + var maxWidth = Math.min(vw - 60, 700); + var maxHeight = Math.min(vh - 200, 700); + var width = canvas.width; + var height = canvas.height; + + if (width > maxWidth) { + ratio = maxWidth / width; + height = height * ratio; + width = width * ratio; + } + + if (height > maxHeight) { + ratio = maxHeight / height; + width = width * ratio; + height = height * ratio; + } + + canvas.style.width = "".concat(width, "px"); + canvas.style.height = "".concat(height, "px"); + }; + + drawBack.addEventListener("click", function () { + drawBackAction(); + }); + var backButton = document.querySelector(".bb-feedback-dialog-header-back"); + backButton.addEventListener("click", function () { + window.removeEventListener("resize", resizeCanvas); + onCancel(); + }); + var nextButton = document.querySelector(".bb-feedback-dialog-header-next"); + nextButton.addEventListener("click", function () { + window.removeEventListener("resize", resizeCanvas); + onDone(canvas.toDataURL("image/png")); + }); + var colorItem = document.getElementById("bb-drawing-color"); + var colorPopup = document.getElementById("bb-drawing-colorpopup"); + colorPopup.style.display = "none"; + colorItem.addEventListener("click", function () { + if (colorPopup.style.display === "none") { + colorPopup.style.display = "flex"; + } else { + colorPopup.style.display = "none"; + } + }); // Prepare tools + + var drawingItems = document.querySelectorAll(".bb-drawing-tool-item"); + + var selectTool = function selectTool(tool) { + var activeTool = "bb-drawing-tool-item--active"; + + for (var i = 0; i < drawingItems.length; i++) { + var drawingItem = drawingItems[i]; + var drawingItemTool = drawingItem.getAttribute("data-tool"); + + if (drawingItemTool === tool) { + drawingItem.classList.add(activeTool); + } else { + drawingItem.classList.remove(activeTool); + } + } + + currentTool = tool; + updateDrawingTools(); + }; + + var _loop = function _loop() { + var drawingItem = drawingItems[i]; + var tool = drawingItem.getAttribute("data-tool"); + drawingItem.addEventListener("click", function () { + selectTool(tool); + }); + }; + + for (var i = 0; i < drawingItems.length; i++) { + _loop(); + } // Prepare drawing color. + + + var drawingColorActive = "bb-drawing-coloritem--active"; + var drawingColors = document.querySelectorAll(".bb-drawing-coloritem"); + + var _loop2 = function _loop2() { + var drawingColor = drawingColors[i]; + var color = drawingColor.getAttribute("data-color"); + drawingColor.style.backgroundColor = color; + drawingColor.addEventListener("click", function () { + for (var j = 0; j < drawingColors.length; j++) { + drawingColors[j].classList.remove(drawingColorActive); + } + + currentColor = color; + MarkerManager.setPenColor(color); + colorItem.style.backgroundColor = color; + drawingColor.classList.add(drawingColorActive); + selectTool("pen"); + updateDrawingTools(); + }); + }; + + for (var i = 0; i < drawingColors.length; i++) { + _loop2(); + } // Draw screenshot. + + + baseImage = new Image(); + + baseImage.onload = function () { + ctx.canvas.width = this.width; + ctx.canvas.height = this.height; + resizeCanvas(); + ctx.drawImage(this, 0, 0); + updateDrawingTools(); + }; + + baseImage.src = screenshot; + window.addEventListener("resize", resizeCanvas); + var isIdle = true; + + function drawstart(event) { + var scale = getCanvasScale(); + ctx.beginPath(); + var x = (event.pageX - canvas.offsetLeft) * scale; + var y = (event.pageY - canvas.offsetTop) * scale; + ctx.lineTo(x, y); + drawingStack.push({ + t: "m", + x: x, + y: y + }); + isIdle = false; + } + + function drawmove(event) { + if (isIdle) return; + var scale = getCanvasScale(); + var x = (event.pageX - canvas.offsetLeft) * scale; + var y = (event.pageY - canvas.offsetTop) * scale; + ctx.lineTo(x, y); + ctx.stroke(); + drawingStack.push({ + t: "l", + x: x, + y: y + }); + } + + function drawend(event) { + if (isIdle) return; + drawmove(event); + drawingHistory.push(drawingStack); + drawingStack = []; + validateBackButton(); + isIdle = true; + } + + function touchstart(event) { + drawstart(event.touches[0]); + } + + function touchmove(event) { + drawmove(event.touches[0]); + event.preventDefault(); + } + + function touchend(event) { + drawend(event.changedTouches[0]); + } + + canvas.addEventListener("touchstart", touchstart, false); + canvas.addEventListener("touchmove", touchmove, false); + canvas.addEventListener("touchend", touchend, false); + canvas.addEventListener("mousedown", drawstart, false); + canvas.addEventListener("mousemove", drawmove, false); + canvas.addEventListener("mouseup", drawend, false); +}; +;// CONCATENATED MODULE: ./src/StreamedEvent.js +function StreamedEvent_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function StreamedEvent_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function StreamedEvent_createClass(Constructor, protoProps, staticProps) { if (protoProps) StreamedEvent_defineProperties(Constructor.prototype, protoProps); if (staticProps) StreamedEvent_defineProperties(Constructor, staticProps); return Constructor; } + +function StreamedEvent_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + +var StreamedEvent = /*#__PURE__*/function () { + function StreamedEvent() { + var _this = this; + + StreamedEvent_classCallCheck(this, StreamedEvent); + + StreamedEvent_defineProperty(this, "eventArray", []); + + StreamedEvent_defineProperty(this, "streamedEventArray", []); + + StreamedEvent_defineProperty(this, "eventMaxLength", 500); + + StreamedEvent_defineProperty(this, "lastUrl", undefined); + + StreamedEvent_defineProperty(this, "startEventStream", function () { + var self = _this; + var interval = 1500; + + if (Session.getInstance().ready && self.streamedEventArray && self.streamedEventArray.length > 0) { + self.streamEvents(); + interval = 3000; + } + + setTimeout(function () { + self.startEventStream(); + }, interval); + }); + + StreamedEvent_defineProperty(this, "streamEvents", function () { + if (Session.getInstance().ready) { + var http = new XMLHttpRequest(); + http.open("POST", Session.getInstance().apiUrl + "/sessions/stream"); + http.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + Session.getInstance().injectSession(http); + + http.onerror = function (error) { + Session.getInstance().clearSession(true); + }; + + http.onreadystatechange = function (e) { + if (http.readyState === XMLHttpRequest.DONE) { + if (http.status === 200 || http.status === 201) { + try { + var action = JSON.parse(http.responseText); + src_Gleap.getInstance().performAction(action); + } catch (exp) {} + } else { + Session.getInstance().clearSession(true); + } + } + }; + + http.send(JSON.stringify({ + events: _this.streamedEventArray + })); + _this.streamedEventArray = []; + } + }); + } + + StreamedEvent_createClass(StreamedEvent, [{ + key: "start", + value: function start() { + this.startEventStream(); + this.startPageListener(); + } + }, { + key: "startPageListener", + value: function startPageListener() { + this.logEvent("sessionStarted"); + var self = this; + setInterval(function () { + var currentUrl = window.location.href; + + if (currentUrl && currentUrl !== self.lastUrl) { + self.lastUrl = currentUrl; + self.logEvent("pageView", { + page: currentUrl + }); + } + }, 1000); + } + }, { + key: "logEvent", + value: function logEvent(name, data) { + var log = { + name: name, + date: new Date() + }; + + if (data) { + log.data = gleapDataParser(data); + } + + this.eventArray.push(log); + this.streamedEventArray.push(log); // Check max size of event log + + if (this.eventArray.length > this.eventMaxLength) { + this.eventArray.shift(); + } // Check max size of streamed event log + + + if (this.streamedEventArray.length > this.eventMaxLength) { + this.streamedEventArray.shift(); + } + } + }], [{ + key: "getInstance", + value: // Session singleton + function getInstance() { + if (!this.instance) { + this.instance = new StreamedEvent(); + return this.instance; + } else { + return this.instance; + } + } + }]); + + return StreamedEvent; +}(); + +StreamedEvent_defineProperty(StreamedEvent, "instance", void 0); + + +;// CONCATENATED MODULE: ./src/AutoConfig.js +function AutoConfig_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { AutoConfig_typeof = function _typeof(obj) { return typeof obj; }; } else { AutoConfig_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return AutoConfig_typeof(obj); } + +function AutoConfig_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function AutoConfig_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function AutoConfig_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoConfig_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoConfig_defineProperties(Constructor, staticProps); return Constructor; } + +function AutoConfig_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + + +var AutoConfig = /*#__PURE__*/function () { + function AutoConfig() { + AutoConfig_classCallCheck(this, AutoConfig); + } + + AutoConfig_createClass(AutoConfig, null, [{ + key: "applyConfig", + value: + /** + * Applies the Gleap config. + * @param {*} config + */ + function applyConfig(config, soft) { + try { + var item; + + var _ret = function () { + var flowConfig = config.flowConfig; + var projectActions = config.projectActions; + + if (flowConfig.color) { + src_Gleap.setStyles({ + primaryColor: flowConfig.color, + headerColor: flowConfig.headerColor, + buttonColor: flowConfig.buttonColor, + borderRadius: flowConfig.borderRadius, + backgroundColor: flowConfig.backgroundColor ? flowConfig.backgroundColor : "#FFFFFF" + }); + } // If it's only a soft update, return here. + + + if (soft) { + return { + v: void 0 + }; + } + + if (flowConfig.logo && flowConfig.logo.length > 0) { + src_Gleap.setLogoUrl(flowConfig.logo); + } + + if (flowConfig.hideBranding) { + src_Gleap.enablePoweredBy(); + } + + if (flowConfig.enableReplays) { + src_Gleap.enableReplays(flowConfig.enableReplays); + } + + src_Gleap.enableShortcuts(flowConfig.enableShortcuts ? true : false); + + if (flowConfig.enableNetworkLogs) { + src_Gleap.enableNetworkLogger(); + } + + if (flowConfig.networkLogPropsToIgnore) { + src_Gleap.setNetworkLogFilters(flowConfig.networkLogPropsToIgnore); + } + + if (!flowConfig.enableConsoleLogs) { + src_Gleap.disableConsoleLogOverwrite(); + } + + if (typeof flowConfig.enableCrashDetector !== "undefined" && flowConfig.enableCrashDetector) { + src_Gleap.enableCrashDetector(true, flowConfig.enableCrashDetector); + } + + if (typeof flowConfig.enableRageClickDetector !== "undefined" && flowConfig.enableRageClickDetector) { + src_Gleap.enableRageClickDetector(flowConfig.rageClickDetectorIsSilent); + } + + if (flowConfig.customTranslations) { + src_Gleap.setCustomTranslation(flowConfig.customTranslations); + } + + if (typeof flowConfig.feedbackButtonPosition !== "undefined" && flowConfig.feedbackButtonPosition.length > 0) { + src_Gleap.setButtonType(flowConfig.feedbackButtonPosition); + } + + if (typeof flowConfig.widgetButtonText !== "undefined" && flowConfig.widgetButtonText.length > 0) { + src_Gleap.setFeedbackButtonText(flowConfig.widgetButtonText); + } + + if (typeof flowConfig.hideWavingHandAfterName !== "undefined" && flowConfig.hideWavingHandAfterName) { + src_Gleap.setWelcomeIcon(""); + } + + if (typeof flowConfig.hideUsersName !== "undefined" && flowConfig.hideUsersName) { + src_Gleap.setShowUserName(false); + } + + if (flowConfig.widgetInfoTitle && flowConfig.widgetInfoTitle.length > 0) { + src_Gleap.setWidgetInfo({ + title: flowConfig.widgetInfoTitle + }); + } + + if (flowConfig.widgetInfoSubtitle && flowConfig.widgetInfoSubtitle.length > 0) { + src_Gleap.setWidgetInfo({ + subtitle: flowConfig.widgetInfoSubtitle + }); + } + + if (flowConfig.widgetInfoDialogSubtitle && flowConfig.widgetInfoDialogSubtitle.length > 0) { + src_Gleap.setWidgetInfo({ + dialogSubtitle: flowConfig.widgetInfoDialogSubtitle + }); + } + + var instance = src_Gleap.getInstance(); + + if (flowConfig.enableMenu && flowConfig.menuItems && flowConfig.menuItems.length > 0) { + var menuItems = []; + + var _loop = function _loop(i) { + var menuItem = flowConfig.menuItems[i]; + var actionFlow = null; + var action = null; + + if (menuItem.actionType === "OPEN_INTERCOM") { + action = function action() { + if (instance.widgetCallback) { + return; + } + + if (typeof Intercom !== "undefined") { + Intercom("showNewMessage"); + } + }; + } else if (menuItem.actionType === "REDIRECT_URL") { + if (instance.widgetCallback) { + action = function action() { + instance.widgetCallback("openExternalURL", { + url: menuItem.actionBody + }); + }; + } else { + if (menuItem.actionOpenInNewTab) { + action = function action() { + window.open(menuItem.actionBody, "_blank").focus(); + }; + } else { + action = function action() { + window.location.href = menuItem.actionBody; + }; + } + } + } else if (menuItem.actionType === "CUSTOM_ACTION") { + action = function action() { + src_Gleap.triggerCustomAction(menuItem.actionBody); + }; + } else { + actionFlow = menuItem.actionType; + } // Action flow + + + if (actionFlow != null || action != null) { + item = { + title: menuItem.title, + description: menuItem.description, + icon: menuItem.icon, + color: menuItem.color + }; + + if (actionFlow) { + item["actionFlow"] = actionFlow; + } + + if (action) { + item["action"] = action; + } + + menuItems.push(item); + } + }; + + for (var i = 0; i < flowConfig.menuItems.length; i++) { + _loop(i); + } + + src_Gleap.setMenuOptions(menuItems); + } + + if (projectActions) { + src_Gleap.setFeedbackActions(projectActions); + } + + if (flowConfig.buttonLogo && flowConfig.buttonLogo.length > 0) { + src_Gleap.setButtonLogoUrl(flowConfig.buttonLogo); + } + }(); + + if (AutoConfig_typeof(_ret) === "object") return _ret.v; + } catch (e) {} + } + }]); + + return AutoConfig; +}(); + +AutoConfig_defineProperty(AutoConfig, "run", function () { + var session = Session.getInstance(); + /*const cachedConfig = loadFromGleapCache(`config-${session.sdkKey}`); + if (cachedConfig) { + AutoConfig.applyConfig(cachedConfig, false); + AutoConfig.loadConfigFromServer(true).catch(function (e) {}); + return Promise.resolve(); + }*/ + + return AutoConfig.loadConfigFromServer(false); +}); + +AutoConfig_defineProperty(AutoConfig, "loadConfigFromServer", function (soft) { + return new Promise(function (resolve, reject) { + var session = Session.getInstance(); + var http = new XMLHttpRequest(); + http.open("GET", session.widgetUrl + "/widget/" + session.sdkKey + "/config"); + http.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + session.injectSession(http); + + http.onerror = function () { + reject(); + }; + + http.onreadystatechange = function (e) { + if (http.readyState === XMLHttpRequest.DONE) { + if (http.status === 200 || http.status === 201) { + try { + var config = JSON.parse(http.responseText); + + try { + saveToGleapCache("config-".concat(session.sdkKey), config); + } catch (exp) {} + + AutoConfig.applyConfig(config, soft); + return resolve(); + } catch (e) {} + } + + reject(); + } + }; + + http.send(); + }); +}); + + +;// CONCATENATED MODULE: ./src/NetworkUtils.js +var isLocalNetwork = function isLocalNetwork() { + var hostname = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.hostname; + return ["localhost", "127.0.0.1", "0.0.0.0", "", "::1"].includes(hostname) || hostname.startsWith("192.168.") || hostname.startsWith("10.0.") || hostname.endsWith(".local") || !hostname.includes("."); +}; +;// CONCATENATED MODULE: ./src/GleapConsoleLogManager.js +function GleapConsoleLogManager_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function GleapConsoleLogManager_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { GleapConsoleLogManager_ownKeys(Object(source), true).forEach(function (key) { GleapConsoleLogManager_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { GleapConsoleLogManager_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function GleapConsoleLogManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GleapConsoleLogManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GleapConsoleLogManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) GleapConsoleLogManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) GleapConsoleLogManager_defineProperties(Constructor, staticProps); return Constructor; } + +function GleapConsoleLogManager_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + +var GleapConsoleLogManager = /*#__PURE__*/function () { + function GleapConsoleLogManager() { + GleapConsoleLogManager_classCallCheck(this, GleapConsoleLogManager); + + GleapConsoleLogManager_defineProperty(this, "logArray", []); + + GleapConsoleLogManager_defineProperty(this, "originalConsoleLog", void 0); + + GleapConsoleLogManager_defineProperty(this, "logMaxLength", 500); + } + + GleapConsoleLogManager_createClass(GleapConsoleLogManager, [{ + key: "getLogs", + value: + /** + * Return the console logs + * @returns {any[]} logs + */ + function getLogs() { + return this.logArray; + } + /** + * Revert console log overwrite. + */ + + }, { + key: "stop", + value: function stop() { + window.console = this.originalConsoleLog; + } + /** + * Add entry to logs. + * @param {*} args + * @param {*} priority + * @returns + */ + + }, { + key: "addLog", + value: function addLog(args, priority) { + if (!args || args.length <= 0) { + return; + } + + var log = ""; + + for (var i = 0; i < args.length; i++) { + log += args[i] + " "; + } + + this.logArray.push({ + log: truncateString(log, 1000), + date: new Date(), + priority: priority + }); + + if (this.logArray.length > this.logMaxLength) { + this.logArray.shift(); + } + } + /** + * Start console log overwrite. + */ + + }, { + key: "start", + value: function start() { + var self = this; + + window.console = function (origConsole) { + if (!window.console || !origConsole) { + origConsole = {}; + } + + self.originalConsoleLog = origConsole; + return GleapConsoleLogManager_objectSpread(GleapConsoleLogManager_objectSpread({}, origConsole), {}, { + log: function log() { + self.addLog(arguments, "INFO"); + origConsole.log && origConsole.log.apply(origConsole, arguments); + }, + warn: function warn() { + self.addLog(arguments, "WARNING"); + origConsole.warn && origConsole.warn.apply(origConsole, arguments); + }, + error: function error() { + self.addLog(arguments, "ERROR"); + origConsole.error && origConsole.error.apply(origConsole, arguments); + }, + info: function info(v) { + self.addLog(arguments, "INFO"); + origConsole.info && origConsole.info.apply(origConsole, arguments); + } + }); + }(window.console); + } + }], [{ + key: "getInstance", + value: function getInstance() { + if (!this.instance) { + this.instance = new GleapConsoleLogManager(); + } + + return this.instance; + } + }]); + + return GleapConsoleLogManager; +}(); + +GleapConsoleLogManager_defineProperty(GleapConsoleLogManager, "instance", void 0); + + +;// CONCATENATED MODULE: ./src/GleapCrashDetector.js +function GleapCrashDetector_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GleapCrashDetector_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GleapCrashDetector_createClass(Constructor, protoProps, staticProps) { if (protoProps) GleapCrashDetector_defineProperties(Constructor.prototype, protoProps); if (staticProps) GleapCrashDetector_defineProperties(Constructor, staticProps); return Constructor; } + +function GleapCrashDetector_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + +var GleapCrashDetector = /*#__PURE__*/function () { + function GleapCrashDetector() { + GleapCrashDetector_classCallCheck(this, GleapCrashDetector); + } + + GleapCrashDetector_createClass(GleapCrashDetector, [{ + key: "start", + value: function start() { + window.addEventListener('error', function (e) { + var message = e.message, + filename = e.filename, + lineno = e.lineno, + colno = e.colno, + error = e.error; + var stackTrace = ""; + + if (error !== null && typeof error.stack !== "undefined") { + stackTrace = error.stack; + } + + var messageObject = ["Message: " + message, "URL: " + filename, "Line: " + lineno, "Column: " + colno, "Stack: " + stackTrace]; + GleapConsoleLogManager.getInstance().addLog(messageObject, "ERROR"); + var gleapInstance = src_Gleap.getInstance(); + + if (gleapInstance.enabledCrashDetector && !gleapInstance.appCrashDetected && !gleapInstance.currentlySendingBug) { + gleapInstance.appCrashDetected = true; + + if (gleapInstance.enabledCrashDetectorSilent) { + return src_Gleap.sendSilentReport({ + errorMessage: message, + url: filename, + lineNo: lineno, + columnNo: colno, + stackTrace: stackTrace + }, src_Gleap.PRIORITY_MEDIUM, "CRASH", { + screenshot: true, + replays: true + }); + } else { + src_Gleap.startFeedbackFlow("crash"); + } + } + }); + + window.onerror = function (msg, url, lineNo, columnNo, error) { + return false; + }; + } + }], [{ + key: "getInstance", + value: // GleapCrashDetector singleton + function getInstance() { + if (!this.instance) { + this.instance = new GleapCrashDetector(); + } + + return this.instance; + } + }]); + + return GleapCrashDetector; +}(); + +GleapCrashDetector_defineProperty(GleapCrashDetector, "instance", void 0); + + +;// CONCATENATED MODULE: ./src/GleapClickListener.js +function GleapClickListener_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function GleapClickListener_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function GleapClickListener_createClass(Constructor, protoProps, staticProps) { if (protoProps) GleapClickListener_defineProperties(Constructor.prototype, protoProps); if (staticProps) GleapClickListener_defineProperties(Constructor, staticProps); return Constructor; } + +function GleapClickListener_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + +var GleapClickListener = /*#__PURE__*/function () { + function GleapClickListener() { + GleapClickListener_classCallCheck(this, GleapClickListener); + } + + GleapClickListener_createClass(GleapClickListener, [{ + key: "start", + value: function start() { + document.addEventListener("click", function (event) { + if (!event.target) { + return; + } + + if (!Gleap.getInstance().currentlySendingBug) { + GleapConsoleLogManager.getInstance().addLog([getDOMElementDescription(event.target)], "CLICK"); + } + }); + } + }], [{ + key: "getInstance", + value: function getInstance() { + if (!this.instance) { + this.instance = new GleapClickListener(); + } + + return this.instance; + } + }]); + + return GleapClickListener; +}(); + +GleapClickListener_defineProperty(GleapClickListener, "instance", void 0); + + +;// CONCATENATED MODULE: ./src/Gleap.js +function Gleap_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function Gleap_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function Gleap_createClass(Constructor, protoProps, staticProps) { if (protoProps) Gleap_defineProperties(Constructor.prototype, protoProps); if (staticProps) Gleap_defineProperties(Constructor, staticProps); return Constructor; } + +function Gleap_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function Gleap_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { Gleap_ownKeys(Object(source), true).forEach(function (key) { Gleap_defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { Gleap_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function Gleap_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + + + + + + + + + + + + + + + + + +if (typeof HTMLCanvasElement !== "undefined" && HTMLCanvasElement.prototype) { + HTMLCanvasElement.prototype.__originalGetContext = HTMLCanvasElement.prototype.getContext; + + HTMLCanvasElement.prototype.getContext = function (type, options) { + return this.__originalGetContext(type, Gleap_objectSpread(Gleap_objectSpread({}, options), {}, { + preserveDrawingBuffer: true + })); + }; +} + +var gleapDataParser = function gleapDataParser(data) { + if (typeof data === "string" || data instanceof String) { + try { + return JSON.parse(data); + } catch (e) { + return {}; + } + } + + return data; +}; + +var Gleap_Gleap = /*#__PURE__*/function () { + /** + * Main constructor + */ + function Gleap() { + var _this = this; + + Gleap_classCallCheck(this, Gleap); + + Gleap_defineProperty(this, "uiContainer", null); + + Gleap_defineProperty(this, "widgetOnly", false); + + Gleap_defineProperty(this, "widgetStartFlow", undefined); + + Gleap_defineProperty(this, "widgetCallback", null); + + Gleap_defineProperty(this, "overrideLanguage", ""); + + Gleap_defineProperty(this, "screenshot", null); + + Gleap_defineProperty(this, "autostartDrawing", false); + + Gleap_defineProperty(this, "actionLog", []); + + Gleap_defineProperty(this, "customData", {}); + + Gleap_defineProperty(this, "formData", {}); + + Gleap_defineProperty(this, "excludeData", {}); + + Gleap_defineProperty(this, "buttonType", Gleap.FEEDBACK_BUTTON_NONE); + + Gleap_defineProperty(this, "feedbackType", "BUG"); + + Gleap_defineProperty(this, "sessionStart", new Date()); + + Gleap_defineProperty(this, "customActionCallbacks", []); + + Gleap_defineProperty(this, "poweredByHidden", false); + + Gleap_defineProperty(this, "enabledCrashDetector", false); + + Gleap_defineProperty(this, "enabledCrashDetectorSilent", false); + + Gleap_defineProperty(this, "enabledRageClickDetector", false); + + Gleap_defineProperty(this, "enabledRageClickDetectorSilent", false); + + Gleap_defineProperty(this, "appCrashDetected", false); + + Gleap_defineProperty(this, "rageClickDetected", false); + + Gleap_defineProperty(this, "currentlySendingBug", false); + + Gleap_defineProperty(this, "isLiveSite", false); + + Gleap_defineProperty(this, "replaysEnabled", false); + + Gleap_defineProperty(this, "customLogoUrl", null); + + Gleap_defineProperty(this, "shortcutsEnabled", true); + + Gleap_defineProperty(this, "silentBugReport", false); + + Gleap_defineProperty(this, "initialized", false); + + Gleap_defineProperty(this, "screenshotFeedbackOptions", null); + + Gleap_defineProperty(this, "customerInfo", {}); + + Gleap_defineProperty(this, "showUserName", true); + + Gleap_defineProperty(this, "welcomeIcon", "👋"); + + Gleap_defineProperty(this, "feedbackButtonText", "Feedback"); + + Gleap_defineProperty(this, "widgetInfo", { + title: "Feedback", + subtitle: "var us know how we can do better.", + dialogSubtitle: "Report a bug, or share your feedback with us." + }); + + Gleap_defineProperty(this, "originalConsoleLog", void 0); + + Gleap_defineProperty(this, "severity", "LOW"); + + Gleap_defineProperty(this, "appVersionCode", ""); + + Gleap_defineProperty(this, "appBuildNumber", ""); + + Gleap_defineProperty(this, "mainColor", "#485bff"); + + Gleap_defineProperty(this, "feedbackTypeActions", []); + + Gleap_defineProperty(this, "customTranslation", {}); + + Gleap_defineProperty(this, "networkIntercepter", new NetworkInterception()); + + Gleap_defineProperty(this, "replay", null); + + Gleap_defineProperty(this, "escListener", null); + + Gleap_defineProperty(this, "feedbackButton", null); + + Gleap_defineProperty(this, "fakeLoading", null); + + Gleap_defineProperty(this, "fakeLoadingProgress", 0); + + Gleap_defineProperty(this, "widgetOpened", false); + + Gleap_defineProperty(this, "openedMenu", false); + + Gleap_defineProperty(this, "showInfoPopup", false); + + Gleap_defineProperty(this, "snapshotPosition", { + x: 0, + y: 0 + }); + + Gleap_defineProperty(this, "eventListeners", {}); + + Gleap_defineProperty(this, "feedbackActions", {}); + + Gleap_defineProperty(this, "actionToPerform", undefined); + + Gleap_defineProperty(this, "screenRecordingData", null); + + Gleap_defineProperty(this, "screenRecordingUrl", null); + + Gleap_defineProperty(this, "getWidgetDialogClass", function () { + if (_this.appCrashDetected || _this.rageClickDetected) { + return "bb-feedback-dialog--crashed"; + } + + return ""; + }); + + if (typeof window !== "undefined") { + this.init(); + } + } + /** + * Sets a custom UI container. + */ + + + Gleap_createClass(Gleap, [{ + key: "postInit", + value: function postInit() { + if (!this.widgetCallback) { + // Start event stream only on web. + StreamedEvent.getInstance().start(); + } + + var self = this; + + if (document.readyState === "complete" || document.readyState === "loaded" || document.readyState === "interactive") { + self.checkForInitType(); + } else { + document.addEventListener("DOMContentLoaded", function (event) { + self.checkForInitType(); + }); + } + + if (this.widgetCallback) { + self.widgetCallback("sessionReady"); + } + } + }, { + key: "unregisterEscListener", + value: function unregisterEscListener() { + if (this.escListener) { + document.removeEventListener("keydown", this.escListener); + } + } + }, { + key: "registerEscListener", + value: function registerEscListener() { + var self = this; + + this.escListener = function (evt) { + evt = evt || window.event; + var isEscape = false; + + if ("key" in evt) { + isEscape = evt.key === "Escape" || evt.key === "Esc"; + } else { + isEscape = evt.keyCode === 27; + } + + if (isEscape) { + self.closeGleap(true); + } + }; + + document.addEventListener("keydown", this.escListener); + } + /** + * Indentifies the user session + * @param {string} userId + * @param {*} userData + */ + + }, { + key: "notifyEvent", + value: + /** + * Notify all registrants for event. + */ + function notifyEvent(event) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var eventListeners = this.eventListeners[event]; + + if (eventListeners) { + for (var i = 0; i < eventListeners.length; i++) { + var eventListener = eventListeners[i]; + + if (eventListener) { + eventListener(data); + } + } + } + } + /** + * Appends a node to the widgets container. + * @param {*} node + */ + + }, { + key: "getFeedbackOptions", + value: function getFeedbackOptions(feedbackFlow) { + var feedbackOptions = null; // Try to load the specific feedback flow. + + if (feedbackFlow) { + feedbackOptions = this.feedbackActions[feedbackFlow]; + } // Fallback + + + if (!feedbackOptions) { + feedbackOptions = this.feedbackActions.bugreporting; + } // Deep copy to prevent changes. + + + try { + feedbackOptions = JSON.parse(JSON.stringify(feedbackOptions)); + } catch (e) {} + + return feedbackOptions; + } + /** + * Starts the bug reporting flow. + */ + + }, { + key: "stopBugReportingAnalytics", + value: function stopBugReportingAnalytics() { + this.networkIntercepter.setStopped(true); + + if (this.replay && !this.replay.stopped) { + this.replay.stop(!this.isLiveSite); + } + } + }, { + key: "resetLoading", + value: function resetLoading(resetProgress) { + if (this.fakeLoading) { + clearInterval(this.fakeLoading); + } + + this.fakeLoading = null; + this.fakeLoadingProgress = 0; + + if (resetProgress) { + setLoadingIndicatorProgress(1); + } + } + }, { + key: "createFeedbackFormDialog", + value: function createFeedbackFormDialog(feedbackOptions) { + var self = this; + var formData = buildForm(feedbackOptions, this.overrideLanguage); + var title = translateText(feedbackOptions.title, this.overrideLanguage); + var htmlContent = "
".concat(translateText("Something went wrong, please try again.", self.overrideLanguage), "
\n \n \n \n
\n
\n ").concat(loadIcon("success", this.mainColor), "\n
").concat(translateText(feedbackOptions.thanksMessage ? feedbackOptions.thanksMessage : "Thank you!", this.overrideLanguage), "
\n
\n
\n ").concat(formData, "\n
"); + createWidgetDialog(title, null, this.customLogoUrl, htmlContent, function () { + self.goBackToMainMenu(); + }, this.openedMenu, "bb-anim-fadeinright ".concat(this.getWidgetDialogClass(), " bb-feedback-dialog-form")); + this.openedMenu = true; + this.resetLoading(true); + validatePoweredBy(this.poweredByHidden); + hookForm(feedbackOptions, function () { + self.formSubmitAction(feedbackOptions); + }, this.overrideLanguage); + } + }, { + key: "formSubmitAction", + value: function formSubmitAction(feedbackOptions) { + var self = this; // Remember form items + + rememberForm(feedbackOptions.form); // Show loading spinner + + toggleLoading(true); // Hide error message + + var errorForm = document.querySelector(".bb-feedback-dialog-error"); + + if (errorForm) { + errorForm.style.display = "none"; + } // Start fake loading + + + self.fakeLoading = setInterval(function () { + if (self.fakeLoadingProgress > 75) { + self.resetLoading(false); + return; + } + + self.fakeLoadingProgress += 2; + setLoadingIndicatorProgress(self.fakeLoadingProgress); + }, 75); // Send form + + var formData = getFormData(feedbackOptions.form); + self.formData = formData; + self.excludeData = feedbackOptions.excludeData ? feedbackOptions.excludeData : {}; + self.feedbackType = feedbackOptions.feedbackType ? feedbackOptions.feedbackType : "BUG"; + + if (self.widgetOnly && self.widgetCallback) { + self.widgetCallback("sendFeedback", { + type: self.feedbackType, + formData: self.formData, + screenshot: self.screenshot, + excludeData: self.excludeData + }); + } else { + self.checkReplayLoaded(); + } + } + }, { + key: "checkReplayLoaded", + value: function checkReplayLoaded() { + var _this2 = this; + + var retries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + + if (this.replaysEnabled && !(this.replay && this.replay.result) && retries < 5) { + // Replay is not ready yet. + setTimeout(function () { + _this2.checkReplayLoaded(++retries); + }, 1000); + } else { + this.checkForScreenRecording(); + } + } + }, { + key: "checkForScreenRecording", + value: function checkForScreenRecording() { + var self = this; + + if (this.screenRecordingData != null) { + ScreenRecorder.uploadScreenRecording(this.screenRecordingData).then(function (recordingUrl) { + self.screenRecordingUrl = recordingUrl; + self.takeScreenshotAndSend(); + })["catch"](function (err) { + self.takeScreenshotAndSend(); + }); + } else { + this.takeScreenshotAndSend(); + } + } + }, { + key: "takeScreenshotAndSend", + value: function takeScreenshotAndSend() { + var _this3 = this; + + var self = this; + + if (this.excludeData && this.excludeData.screenshot) { + // Screenshot excluded. + this.sendBugReportToServer(); + } else { + return startScreenCapture(this.isLiveSite).then(function (data) { + // Set scroll position + if (data) { + data["x"] = self.snapshotPosition.x; + data["y"] = self.snapshotPosition.y; + } + + _this3.sendBugReportToServer(data); + })["catch"](function (err) { + _this3.showError(); + }); + } + } + }, { + key: "reportCleanupOnClose", + value: function reportCleanupOnClose() { + try { + Gleap.enableReplays(this.replaysEnabled); + } catch (exp) {} + + try { + this.networkIntercepter.setStopped(false); + } catch (exp) {} + + this.actionToPerform = undefined; + + if (this.widgetCallback) { + this.widgetCallback("closeGleap", {}); + } + } + }, { + key: "closeModalUI", + value: function closeModalUI(cleanUp) { + var dialogContainer = document.querySelector(".bb-feedback-dialog-container"); + + if (dialogContainer) { + dialogContainer.remove(); + } + } + }, { + key: "closeGleap", + value: function closeGleap() { + var cleanUp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (cleanUp) { + this.reportCleanupOnClose(); + } + + ScrollStopper.enableScroll(); + this.currentlySendingBug = false; + this.widgetOpened = false; + this.openedMenu = false; + this.appCrashDetected = false; + this.rageClickDetected = false; + this.updateFeedbackButtonState(); // Remove editor. + + var editorContainer = document.querySelector(".bb-capture-editor"); + + if (editorContainer) { + editorContainer.remove(); + } + + this.notifyEvent("close"); + this.closeModalUI(cleanUp); + } + }, { + key: "init", + value: function init() { + GleapConsoleLogManager.getInstance().start(); + GleapCrashDetector.getInstance().start(); + GleapClickListener.getInstance().start(); + this.registerKeyboardListener(); + this.registerEscListener(); // Initially check network + + if (isLocalNetwork()) { + this.isLiveSite = false; + } else { + this.isLiveSite = true; + } + } + }, { + key: "registerKeyboardListener", + value: function registerKeyboardListener() { + var self = this; + + var charForEvent = function charForEvent(event) { + var code; + + if (event.key !== undefined) { + code = event.key; + } else if (event.keyIdentifier !== undefined) { + code = event.keyIdentifier; + } else if (event.keyCode !== undefined) { + code = event.keyCode; + } + + return code; + }; + + document.addEventListener("keyup", function (e) { + var _char = charForEvent(e); + + if (e.ctrlKey && (_char === "i" || _char === "I" || _char === 73) && self.shortcutsEnabled) { + self.autostartDrawing = true; + Gleap.startFeedbackFlow(); + } + }); + } + }, { + key: "checkForInitType", + value: function checkForInitType() { + var _this4 = this; + + if (window && window.onGleapLoaded) { + window.onGleapLoaded(Gleap); + } + + setInterval(function () { + if (_this4.replay && _this4.replay.isFull()) { + Gleap.enableReplays(_this4.replaysEnabled); + } + }, 1000); + + if (this.widgetOnly) { + // App widget + var _self = this; + + if (_self.widgetStartFlow) { + Gleap.startFeedbackFlow(_self.widgetStartFlow); + } else { + if (_self.feedbackTypeActions.length > 0) { + Gleap.startFeedbackTypeSelection(); + } else { + Gleap.startFeedbackFlow(); + } + } + } else { + // Web widget + Session.getInstance().setOnSessionReady(function () { + _this4.injectFeedbackButton(); + }); + } + } + }, { + key: "injectFeedbackButton", + value: function injectFeedbackButton() { + var self = this; + var buttonIcon = ""; + + if (self.customButtonLogoUrl) { + buttonIcon = "\"Feedback"); + } else { + buttonIcon = loadIcon("bblogo", "#fff"); + } + + var elem = document.createElement("div"); + elem.className = "bb-feedback-button"; + + if (this.buttonType === Gleap.FEEDBACK_BUTTON_CLASSIC || this.buttonType === Gleap.FEEDBACK_BUTTON_CLASSIC_BOTTOM || this.buttonType === Gleap.FEEDBACK_BUTTON_CLASSIC_LEFT) { + elem.innerHTML = "
").concat(translateText(this.feedbackButtonText, this.overrideLanguage), "
"); + } else { + elem.innerHTML = "
".concat(buttonIcon).concat(loadIcon("arrowdown", "#fff"), "
"); + } + + elem.onclick = function () { + self.feedbackButtonPressed(); + }; + + Gleap.appendNode(elem); + + if (this.buttonType === Gleap.FEEDBACK_BUTTON_NONE) { + elem.classList.add("bb-feedback-button--disabled"); + } + + if (this.buttonType === Gleap.FEEDBACK_BUTTON_BOTTOM_LEFT) { + elem.classList.add("bb-feedback-button--bottomleft"); + } + + this.feedbackButton = elem; + } + }, { + key: "showGleap", + value: function showGleap() { + if (this.widgetOpened) { + return; + } + + if (this.feedbackTypeActions.length > 0) { + Gleap.startFeedbackTypeSelection(); + } else { + Gleap.startFeedbackFlow(); + } // Remove shoutout. + + + var feedbackShoutout = window.document.getElementsByClassName("bb-feedback-button-shoutout"); + + if (feedbackShoutout && feedbackShoutout.length > 0) { + feedbackShoutout[0].remove(); + } // Prevent shoutout from showing again. + + + try { + localStorage.setItem("bb-fto", true); + } catch (exp) {} + + this.notifyEvent("open"); + } + }, { + key: "feedbackButtonPressed", + value: function feedbackButtonPressed() { + if (this.widgetOpened) { + this.closeGleap(); + return; + } + + this.showGleap(); + } + }, { + key: "updateFeedbackButtonState", + value: function updateFeedbackButtonState() { + var _this5 = this; + + var retry = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (this.feedbackButton === null) { + if (!retry) { + setTimeout(function () { + _this5.updateFeedbackButtonState(true); + }, 500); + } + + return; + } + + var sendingClass = "bb-feedback-button--sending"; + + if (this.widgetOpened) { + this.feedbackButton.classList.add(sendingClass); + } else { + this.feedbackButton.classList.remove(sendingClass); + } + + var crashedClass = "bb-feedback-button--crashed"; + + if (this.appCrashDetected || this.rageClickDetected) { + this.feedbackButton.classList.add(crashedClass); + } else { + this.feedbackButton.classList.remove(crashedClass); + } + + var dialogContainer = document.querySelector(".bb-feedback-dialog-container"); + var containerFocusClass = "bb-feedback-dialog-container--focused"; + + if (dialogContainer) { + if (this.appCrashDetected || this.rageClickDetected) { + dialogContainer.classList.add(containerFocusClass); + } else { + dialogContainer.classList.remove(containerFocusClass); + } + } + } + }, { + key: "showSuccessMessage", + value: function showSuccessMessage() { + var success = document.querySelector(".bb-feedback-dialog-success"); + var form = document.querySelector(".bb-feedback-form"); + var loader = document.querySelector(".bb-feedback-dialog-loading"); + form.style.display = "none"; + loader.style.display = "none"; + success.style.display = "flex"; + } + }, { + key: "performAction", + value: function performAction(action) { + if (action && action.outbound && action.actionType) { + this.actionToPerform = action; + Gleap.startFeedbackFlow(action.actionType); + } + } + }, { + key: "sendBugReportToServer", + value: function sendBugReportToServer(screenshotData) { + var self = this; + var http = new XMLHttpRequest(); + http.open("POST", Session.getInstance().apiUrl + "/bugs"); + http.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + Session.getInstance().injectSession(http); + + http.onerror = function (error) { + if (self.silentBugReport) { + self.closeGleap(); + return; + } + + self.showError(); + }; + + http.upload.onprogress = function (e) { + if (self.silentBugReport) { + self.closeGleap(); + return; + } + + if (e.lengthComputable) { + var percentComplete = parseInt(e.loaded / e.total * 100); + + if (percentComplete > 25 && percentComplete > self.fakeLoadingProgress) { + if (self.fakeLoading) { + self.resetLoading(false); + } + + setLoadingIndicatorProgress(percentComplete); + } + } + }; + + http.onreadystatechange = function (e) { + if (self.silentBugReport) { + self.closeGleap(); + return; + } + + if (http.readyState === XMLHttpRequest.DONE) { + if (http.status === 200 || http.status === 201) { + self.notifyEvent("feedback-sent"); + self.showSuccessAndClose(); + } else { + self.showError(http.status); + } + } + }; + + var bugReportData = { + priority: this.severity, + customData: this.customData, + metaData: this.getMetaData(), + consoleLog: GleapConsoleLogManager.getInstance().getLogs(), + networkLogs: this.networkIntercepter.getRequests(), + customEventLog: StreamedEvent.getInstance().eventArray, + type: this.feedbackType, + formData: this.formData, + isSilent: this.silentBugReport + }; + + if (this.actionToPerform && this.actionToPerform.outbound) { + bugReportData["outbound"] = this.actionToPerform.outbound; + } + + if (screenshotData && screenshotData.fileUrl) { + bugReportData["screenshotUrl"] = screenshotData.fileUrl; + } + + if (screenshotData && screenshotData.html) { + bugReportData["screenshotData"] = screenshotData; + } + + if (this.replay && this.replay.result) { + bugReportData["webReplay"] = this.replay.result; + } + + if (this.screenRecordingUrl && this.screenRecordingUrl != "uploading") { + bugReportData["screenRecordingUrl"] = this.screenRecordingUrl; + } // Exclude data logic. + + + var keysToExclude = Object.keys(this.excludeData); + + for (var _i = 0; _i < keysToExclude.length; _i++) { + var keyToExclude = keysToExclude[_i]; + + if (this.excludeData[keyToExclude] === true) { + delete bugReportData[keyToExclude]; + + if (keyToExclude === "screenshot") { + delete bugReportData.screenshotData; + delete bugReportData.screenshotUrl; + } + + if (keyToExclude === "replays") { + delete bugReportData.webReplay; + } + } + } + + http.send(JSON.stringify(bugReportData)); + } + }, { + key: "jsonSize", + value: function jsonSize(obj) { + var size = new TextEncoder().encode(JSON.stringify(obj)).length; + var kiloBytes = size / 1024; + var megaBytes = kiloBytes / 1024; + } + }, { + key: "showSuccessAndClose", + value: function showSuccessAndClose() { + var self = this; + self.showSuccessMessage(); + setTimeout(function () { + self.closeGleap(); + }, 2800); + } + }, { + key: "showError", + value: function showError(error) { + if (this.silentBugReport) { + this.closeGleap(); + return; + } + + var errorText = translateText("Something went wrong, please try again.", self.overrideLanguage); + + if (error === 429) { + errorText = translateText("Too many requests, please try again later.", self.overrideLanguage); + } + + this.notifyEvent("error-while-sending"); + toggleLoading(false); + document.querySelector(".bb-feedback-dialog-error").innerHTML = errorText; + document.querySelector(".bb-feedback-dialog-error").style.display = "flex"; + document.querySelector(".bb-form-progress").style.display = "none"; + } + }, { + key: "getMetaData", + value: function getMetaData() { + var nAgt = navigator.userAgent; + var browserName = navigator.appName; + var fullVersion = "" + parseFloat(navigator.appVersion); + var majorVersion = parseInt(navigator.appVersion, 10); + var nameOffset, verOffset, ix; // In Opera, the true version is after "Opera" or after "Version" + + if ((verOffset = nAgt.indexOf("Opera")) !== -1) { + browserName = "Opera"; + fullVersion = nAgt.substring(verOffset + 6); + if ((verOffset = nAgt.indexOf("Version")) !== -1) fullVersion = nAgt.substring(verOffset + 8); + } // In MSIE, the true version is after "MSIE" in userAgent + else if ((verOffset = nAgt.indexOf("MSIE")) !== -1) { + browserName = "Microsoft Internet Explorer"; + fullVersion = nAgt.substring(verOffset + 5); + } // In Chrome, the true version is after "Chrome" + else if ((verOffset = nAgt.indexOf("Chrome")) !== -1) { + browserName = "Chrome"; + fullVersion = nAgt.substring(verOffset + 7); + } // In Safari, the true version is after "Safari" or after "Version" + else if ((verOffset = nAgt.indexOf("Safari")) !== -1) { + browserName = "Safari"; + fullVersion = nAgt.substring(verOffset + 7); + if ((verOffset = nAgt.indexOf("Version")) !== -1) fullVersion = nAgt.substring(verOffset + 8); + } // In Firefox, the true version is after "Firefox" + else if ((verOffset = nAgt.indexOf("Firefox")) !== -1) { + browserName = "Firefox"; + fullVersion = nAgt.substring(verOffset + 8); + } // In most other browsers, "name/version" is at the end of userAgent + else if ((nameOffset = nAgt.lastIndexOf(" ") + 1) < (verOffset = nAgt.lastIndexOf("/"))) { + browserName = nAgt.substring(nameOffset, verOffset); + fullVersion = nAgt.substring(verOffset + 1); + + if (browserName.toLowerCase() === browserName.toUpperCase()) { + browserName = navigator.appName; + } + } // trim the fullVersion string at semicolon/space if present + + + if ((ix = fullVersion.indexOf(";")) !== -1) fullVersion = fullVersion.substring(0, ix); + if ((ix = fullVersion.indexOf(" ")) !== -1) fullVersion = fullVersion.substring(0, ix); + majorVersion = parseInt("" + fullVersion, 10); + + if (isNaN(majorVersion)) { + fullVersion = "" + parseFloat(navigator.appVersion); + majorVersion = parseInt(navigator.appVersion, 10); + } + + var OSName = "Unknown OS"; + if (navigator.appVersion.indexOf("Win") !== -1) OSName = "Windows"; + if (navigator.appVersion.indexOf("Mac") !== -1) OSName = "MacOS"; + if (navigator.appVersion.indexOf("X11") !== -1) OSName = "UNIX"; + if (navigator.appVersion.indexOf("Linux") !== -1) OSName = "Linux"; + if (navigator.appVersion.indexOf("iPad") !== -1) OSName = "iPad"; + if (navigator.appVersion.indexOf("iPhone") !== -1) OSName = "iPhone"; + if (navigator.appVersion.indexOf("Android") !== -1) OSName = "Android"; + var now = new Date(); + var sessionDuration = (now.getTime() - this.sessionStart.getTime()) / 1000; + return { + browserName: browserName + "(" + fullVersion + ")", + userAgent: nAgt, + browser: navigator.appName, + systemName: OSName, + buildVersionNumber: this.appBuildNumber, + releaseVersionNumber: this.appVersionCode, + sessionDuration: sessionDuration, + devicePixelRatio: window.devicePixelRatio, + screenWidth: window.screen.width, + screenHeight: window.screen.height, + innerWidth: window.innerWidth, + innerHeight: window.innerHeight, + currentUrl: window.location.href, + language: navigator.language || navigator.userLanguage, + mobile: isMobile(), + sdkVersion: "6.9.1", + sdkType: "javascript" + }; + } + }, { + key: "showBugReportEditor", + value: function showBugReportEditor(feedbackOptions) { + // Native screenshot SDK. + if (!feedbackOptions.disableUserScreenshot) { + if (this.screenshot) { + this.showMobileScreenshotEditor(feedbackOptions); + return; + } // Fetch screenshot from native SDK. + + + if (this.widgetOnly && this.widgetCallback) { + this.screenshotFeedbackOptions = feedbackOptions; + this.widgetCallback("requestScreenshot", {}); + return; + } + } + + this.createFeedbackFormDialog(feedbackOptions); + } + }, { + key: "goBackToMainMenu", + value: function goBackToMainMenu() { + if (this.feedbackTypeActions.length > 0) { + // Go back to menu + this.closeGleap(false); + Gleap.startFeedbackTypeSelection(true); + } else { + // Close + this.closeGleap(); + } + } + }, { + key: "showMobileScreenshotEditor", + value: function showMobileScreenshotEditor(feedbackOptions) { + var self = this; + createScreenshotEditor(this.screenshot, function (screenshot) { + // Update screenshot. + self.screenshot = screenshot; + self.closeModalUI(); + self.createFeedbackFormDialog(feedbackOptions); + }, function () { + self.goBackToMainMenu(); + }, this.overrideLanguage, this.feedbackTypeActions.length > 0); + } + }], [{ + key: "getInstance", + value: // Feedback button types + // Bug priorities + // Gleap singleton + function getInstance() { + if (!this.instance) { + this.instance = new Gleap(); + return this.instance; + } else { + return this.instance; + } + } + }, { + key: "setUIContainer", + value: function setUIContainer(container) { + var instance = this.getInstance(); + instance.uiContainer = container; + } + /** + * Attaches external network logs that get merged with the internal network logs. + * @param {*} externalConsoleLogs + */ + + }, { + key: "attachNetworkLogs", + value: function attachNetworkLogs(externalConsoleLogs) { + this.getInstance().networkIntercepter.externalConsoleLogs = externalConsoleLogs; + } + /** + * Set if you running on a live site or local environment. + * @param {*} isLiveSite + */ + + }, { + key: "setLiveSite", + value: function setLiveSite(isLiveSite) { + var instance = this.getInstance(); + instance.isLiveSite = isLiveSite; + } + /** + * Initializes the SDK + * @param {*} sdkKey + */ + + }, { + key: "initialize", + value: function initialize(sdkKey, gleapId, gleapHash) { + var instance = this.getInstance(); + + if (instance.initialized) { + console.warn("Gleap already initialized."); + return; + } + + instance.initialized = true; // Set default session (i.e. from the app SDK). + + if (gleapId && gleapHash) { + try { + var oldSession = loadFromGleapCache("session-".concat(sdkKey)); + + if (!oldSession) { + oldSession = {}; + } + + if (oldSession.gleapId !== gleapId) { + oldSession = {}; + } + + oldSession.gleapId = gleapId; + oldSession.gleapHash = gleapHash; + saveToGleapCache("session-".concat(sdkKey), oldSession); + } catch (exp) {} + } + + var sessionInstance = Session.getInstance(); + sessionInstance.sdkKey = sdkKey; + sessionInstance.setOnSessionReady(function () { + // Run auto configuration. + setTimeout(function () { + AutoConfig.run().then(function () { + instance.postInit(); + })["catch"](function (err) {}); + }, 0); + }); + sessionInstance.startSession(); + } + }, { + key: "identify", + value: function identify(userId, userData) { + return Session.getInstance().identifySession(userId, gleapDataParser(userData)); + } + /** + * Clears the current user session + */ + + }, { + key: "clearIdentity", + value: function clearIdentity() { + Session.getInstance().clearSession(); + } + /** + * Widget opened status + * @returns {boolean} isOpened + */ + + }, { + key: "isOpened", + value: function isOpened() { + return this.getInstance().openedMenu; + } + /** + * Hides any open Gleap dialogs. + */ + + }, { + key: "hide", + value: function hide() { + var instance = this.getInstance(); + instance.closeGleap(); + } + /** + * Starts the Gleap flow. + */ + + }, { + key: "open", + value: function open() { + var instance = this.getInstance(); + instance.showGleap(); + } + /** + * Sets a custom translation + * @param {*} customTranslation + */ + + }, { + key: "setCustomTranslation", + value: function setCustomTranslation(customTranslation) { + var instance = this.getInstance(); + instance.customTranslation = customTranslation; + } + /** + * Sets a custom screenshot + * @param {*} screenshot + */ + + }, { + key: "setScreenshot", + value: function setScreenshot(screenshot) { + var instance = this.getInstance(); + instance.screenshot = screenshot; // Open screenshot + + if (instance.screenshotFeedbackOptions) { + instance.showMobileScreenshotEditor(instance.screenshotFeedbackOptions); + instance.screenshotFeedbackOptions = null; + } + } + /** + * Sets the feedback button text + * @param {string} feedbackButtonText + */ + + }, { + key: "setFeedbackButtonText", + value: function setFeedbackButtonText(feedbackButtonText) { + var instance = this.getInstance(); + instance.feedbackButtonText = feedbackButtonText; + } + /** + * Enable replays + * @param {*} enabled + */ + + }, { + key: "enableReplays", + value: function enableReplays(enabled) { + var instance = this.getInstance(); + instance.replaysEnabled = enabled; + + if (enabled) { + if (instance.replay) { + instance.replay.stop(); + instance.replay = null; + } + + instance.replay = new ReplayRecorder(); + } else { + if (instance.replay) { + instance.replay.stop(); + instance.replay = null; + } + } + } + /** + * Logs a custom event + * @param {string} name + * @param {any} data + */ + + }, { + key: "logEvent", + value: function logEvent(name, data) { + StreamedEvent.getInstance().logEvent(name, data); + } + /** + * Show info popup + * @param {boolean} showInfoPopup + */ + + }, { + key: "showInfoPopup", + value: function showInfoPopup(_showInfoPopup) { + this.getInstance().showInfoPopup = _showInfoPopup; + } + /** + * Set widget only + * @param {boolean} widgetOnly + */ + + }, { + key: "isWidgetOnly", + value: function isWidgetOnly(widgetOnly) { + this.getInstance().widgetOnly = widgetOnly; + } + /** + * Set widget only start feedback flow + * @param {boolean} widgetStartFlow + */ + + }, { + key: "setWidgetStartFlow", + value: function setWidgetStartFlow(widgetStartFlow) { + this.getInstance().widgetStartFlow = widgetStartFlow; + } + /** + * Set welcome icon + * @param {string} welcomeIcon + */ + + }, { + key: "setWelcomeIcon", + value: function setWelcomeIcon(welcomeIcon) { + this.getInstance().welcomeIcon = welcomeIcon; + } + /** + * Show or hide the user name within the widget header + * @param {boolean} showUserName + */ + + }, { + key: "setShowUserName", + value: function setShowUserName(showUserName) { + this.getInstance().showUserName = showUserName; + } + /** + * Sets the button type. + * @param {string} buttonType + */ + + }, { + key: "setButtonType", + value: function setButtonType(buttonType) { + this.getInstance().buttonType = buttonType; + } + /** + * Register events for Gleap. + * @param {*} eventName + * @param {*} callback + */ + + }, { + key: "on", + value: function on(eventName, callback) { + var instance = this.getInstance(); + + if (!instance.eventListeners[eventName]) { + instance.eventListeners[eventName] = []; + } + + instance.eventListeners[eventName].push(callback); + } + }, { + key: "appendNode", + value: function appendNode(node) { + var instance = this.getInstance(); + + if (instance.uiContainer) { + instance.uiContainer.appendChild(node); + } else { + document.body.appendChild(node); + } + } + /** + * Sets the native widget callback + * @param {*} widgetCallback + */ + + }, { + key: "widgetCallback", + value: function widgetCallback(_widgetCallback) { + this.getInstance().widgetCallback = _widgetCallback; + } + /** + * Enable or disable shortcuts + * @param {boolean} enabled + */ + + }, { + key: "enableShortcuts", + value: function enableShortcuts(enabled) { + this.getInstance().shortcutsEnabled = enabled; + } + /** + * Enable Intercom compatibility mode + */ + + }, { + key: "enableIntercomCompatibilityMode", + value: function enableIntercomCompatibilityMode() {} + /** + * Show or hide the feedback button + * @param {*} show + * @returns + */ + + }, { + key: "showFeedbackButton", + value: function showFeedbackButton(show) { + var feedbackButton = this.getInstance().feedbackButton; + + if (!feedbackButton) { + return; + } + + if (show) { + feedbackButton.style.display = "flex"; + } else { + feedbackButton.style.display = "none"; + } + } + /** + * Hides the powered by Gleap logo. + * @param {boolean} hide + */ + + }, { + key: "enablePoweredBy", + value: function enablePoweredBy(enabled) { + this.getInstance().poweredByHidden = !enabled; + } + /** + * Enables the network logger. + */ + + }, { + key: "enableNetworkLogger", + value: function enableNetworkLogger() { + this.getInstance().networkIntercepter.start(); + } + /** + * Enables the network logger. + */ + + }, { + key: "setNetworkLogFilters", + value: function setNetworkLogFilters(filters) { + this.getInstance().networkIntercepter.setFilters(filters); + } + /** + * Sets the logo url. + * @param {string} logoUrl + */ + + }, { + key: "setLogoUrl", + value: function setLogoUrl(logoUrl) { + this.getInstance().customLogoUrl = logoUrl; + } + /** + * Sets the button logo url. + * @param {string} logoUrl + */ + + }, { + key: "setButtonLogoUrl", + value: function setButtonLogoUrl(logoUrl) { + this.getInstance().customButtonLogoUrl = logoUrl; + } + /** + * Enables the privacy policy. + * @param {boolean} enabled + */ + + }, { + key: "enablePrivacyPolicy", + value: function enablePrivacyPolicy(enabled) {} + /** + * Sets the privacy policy url. + * @param {string} privacyPolicyUrl + */ + + }, { + key: "setPrivacyPolicyUrl", + value: function setPrivacyPolicyUrl(privacyPolicyUrl) {} + /** + * Sets the widget info texts. + * @param {string} widgetInfo + */ + + }, { + key: "setWidgetInfo", + value: function setWidgetInfo(widgetInfo) { + if (!widgetInfo) { + return; + } + + this.getInstance().widgetInfo = Object.assign(this.getInstance().widgetInfo, widgetInfo); + } + /** + * Sets the app version code. + * @param {string} appVersionCode + */ + + }, { + key: "setAppVersionCode", + value: function setAppVersionCode(appVersionCode) { + this.getInstance().appVersionCode = appVersionCode; + } + /** + * Sets the app version code. + * @param {string} appVersionCode + */ + + }, { + key: "setAppBuildNumber", + value: function setAppBuildNumber(appBuildNumber) { + this.getInstance().appBuildNumber = appBuildNumber; + } + /** + * Set a custom api url. + * @param {string} apiUrl + */ + + }, { + key: "setApiUrl", + value: function setApiUrl(apiUrl) { + Session.getInstance().apiUrl = apiUrl; + } + /** + * Set a custom widget api url. + * @param {string} widgetUrl + */ + + }, { + key: "setWidgetUrl", + value: function setWidgetUrl(widgetUrl) { + Session.getInstance().widgetUrl = widgetUrl; + } + /** + * Set custom data that will be attached to the bug-report. + * @param {*} data + */ + + }, { + key: "attachCustomData", + value: function attachCustomData(data) { + var instance = this.getInstance(); + instance.customData = Object.assign(instance.customData, gleapDataParser(data)); + } + /** + * Add one key value pair to the custom data object + * @param {*} key The key of the custom data entry you want to add. + * @param {*} value The custom data you want to add. + */ + + }, { + key: "setCustomData", + value: function setCustomData(key, value) { + this.getInstance().customData[key] = value; + } + /** + * Remove one key value pair of the custom data object + * @param {*} key The key of the custom data entry you want to remove. + */ + + }, { + key: "removeCustomData", + value: function removeCustomData(key) { + delete this.getInstance().customData[key]; + } + /** + * Clear the custom data + */ + + }, { + key: "clearCustomData", + value: function clearCustomData() { + this.getInstance().customData = {}; + } + /** + * Override the browser language. Currently supported languages: + * - en + * - de + * - fr + * - it + * - es + * @param {string} language country code with two letters + */ + + }, { + key: "setLanguage", + value: function setLanguage(language) { + this.getInstance().overrideLanguage = language; + } + /** + * Enables crash detection. + * @param {*} enabled + * @param {*} silent + */ + + }, { + key: "enableCrashDetector", + value: function enableCrashDetector(enabled) { + var silent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var instance = this.getInstance(); + instance.enabledCrashDetector = enabled; + instance.enabledCrashDetectorSilent = silent; + } + /** + * Enables rage click detection. + * @param {*} silent + */ + + }, { + key: "enableRageClickDetector", + value: function enableRageClickDetector() { + var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var instance = this.getInstance(); + + if (instance.enabledRageClickDetector) { + return; + } + + instance.enabledRageClickDetector = true; + instance.enabledRageClickDetectorSilent = silent; + startRageClickDetector(function (target) { + var elementDescription = getDOMElementDescription(target, false); + instance.rageClickDetected = true; + + if (instance.enabledRageClickDetectorSilent) { + Gleap.sendSilentReport({ + description: "Rage click detected.", + element: elementDescription + }); + } else { + Gleap.startFeedbackFlow("crash"); + } + }); + } + /** + * Sets a custom color scheme. + * @param {string} primaryColor + */ + + }, { + key: "setColors", + value: function setColors(primaryColor, headerColor, buttonColor) { + var backgroundColor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "#ffffff"; + this.setStyles({ + headerColor: headerColor, + primaryColor: primaryColor, + buttonColor: buttonColor, + backgroundColor: backgroundColor + }); + } + /** + * Sets a custom color scheme. + * @param {any} styles + */ + + }, { + key: "setStyles", + value: function setStyles(styles) { + this.getInstance().mainColor = styles.primaryColor; + var headerColor = styles.headerColor ? styles.headerColor : styles.primaryColor; + var buttonColor = styles.buttonColor ? styles.buttonColor : styles.primaryColor; + var borderRadius = styles.borderRadius != null ? styles.borderRadius : 20; + var backgroundColor = styles.backgroundColor != null ? styles.backgroundColor : "#fff"; + + if (document.readyState === "complete" || document.readyState === "loaded" || document.readyState === "interactive") { + injectStyledCSS(styles.primaryColor, headerColor, buttonColor, borderRadius, backgroundColor); + } else { + document.addEventListener("DOMContentLoaded", function (event) { + injectStyledCSS(styles.primaryColor, headerColor, buttonColor, borderRadius, backgroundColor); + }); + } + } + /** + * Sends a silent feedback report + * @param {*} formData + * @param {*} priority + * @param {*} feedbackType + */ + + }, { + key: "sendSilentReport", + value: function sendSilentReport(formData) { + var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Gleap.PRIORITY_MEDIUM; + var feedbackType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "BUG"; + var excludeData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var instance = this.getInstance(); + var sessionInstance = Session.getInstance(); + + if (!sessionInstance.ready) { + return; + } + + instance.excludeData = excludeData ? excludeData : {}; + instance.severity = priority; + instance.feedbackType = feedbackType; + instance.formData = formData ? formData : {}; + + if (sessionInstance.session.email) { + instance.formData.reportedBy = sessionInstance.session.email; + } + + this.startFeedbackFlow(null, true); + } + /** + * Reports a bug silently + * @param {*} description + * @param {*} priority + * @param {*} type + * @deprecated Please use sendSilentReport instead. + */ + + }, { + key: "sendSilentBugReportWithType", + value: function sendSilentBugReportWithType(description) { + var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Gleap.PRIORITY_MEDIUM; + var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "BUG"; + return Gleap.sendSilentReport({ + description: description + }, priority, type); + } + /** + * Reports a bug silently + * @param {*} description + * @param {*} priority + * @deprecated Please use sendSilentReport instead. + */ + + }, { + key: "sendSilentBugReport", + value: function sendSilentBugReport(description) { + var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Gleap.PRIORITY_MEDIUM; + return Gleap.sendSilentReport({ + description: description + }, priority, "BUG"); + } + /** + * Starts the feedback type selection flow. + */ + + }, { + key: "startFeedbackTypeSelection", + value: function startFeedbackTypeSelection() { + var fromBack = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var sessionInstance = Session.getInstance(); + var instance = this.getInstance(); + instance.stopBugReportingAnalytics(); + instance.widgetOpened = true; + instance.openedMenu = true; + instance.updateFeedbackButtonState(); + var displayUserName = ""; + + if (instance.showUserName && sessionInstance.session && sessionInstance.session.name) { + displayUserName = sessionInstance.session.name; + } // Start feedback type dialog + + + createFeedbackTypeDialog(instance.feedbackTypeActions, instance.overrideLanguage, instance.customLogoUrl, instance.poweredByHidden, function () {}, "".concat(translateText("Hi", instance.overrideLanguage), " ").concat(displayUserName, " ").concat(instance.welcomeIcon), translateText(instance.widgetInfo.dialogSubtitle, instance.overrideLanguage), fromBack); + } + /** + * Register custom action + */ + + }, { + key: "registerCustomAction", + value: function registerCustomAction(customAction) { + var instance = this.getInstance(); + + if (instance.customActionCallbacks) { + instance.customActionCallbacks.push(customAction); + } + } + /** + * Triggers a custom action + */ + + }, { + key: "triggerCustomAction", + value: function triggerCustomAction(name) { + var instance = this.getInstance(); + + if (instance.widgetCallback) { + instance.widgetCallback("customActionCalled", { + name: name + }); + } + + if (instance.customActionCallbacks) { + for (var i = 0; i < instance.customActionCallbacks.length; i++) { + var callback = instance.customActionCallbacks[i]; + + if (callback) { + callback({ + name: name + }); + } + } + } + } + /** + * Sets the feedback flow options. + */ + + }, { + key: "setFeedbackActions", + value: function setFeedbackActions(feedbackActions) { + this.getInstance().feedbackActions = feedbackActions; + } + /** + * Sets the menu options. + */ + + }, { + key: "setMenuOptions", + value: function setMenuOptions(options) { + this.getInstance().feedbackTypeActions = options; + } + }, { + key: "startFeedbackFlow", + value: function startFeedbackFlow(feedbackFlow) { + var silentBugReport = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var sessionInstance = Session.getInstance(); + var instance = this.getInstance(); + + if (instance.currentlySendingBug) { + return; + } + + if (!sessionInstance.ready) { + return; + } // Initially set scroll position + + + instance.snapshotPosition = { + x: window.scrollX, + y: window.scrollY + }; // Get feedback options + + var feedbackOptions = instance.getFeedbackOptions(feedbackFlow); + + if (!feedbackOptions) { + return; + } + + instance.notifyEvent("flow-started", feedbackOptions); + instance.closeModalUI(); + instance.currentlySendingBug = true; + instance.silentBugReport = silentBugReport; + + if (!silentBugReport) { + instance.widgetOpened = true; + } + + if (feedbackOptions.form && feedbackOptions.form.length > 0) { + // Cleanup form from unsupported items. + var newFormArray = []; + + for (var i = 0; i < feedbackOptions.form.length; i++) { + var feedbackOption = feedbackOptions.form[i]; + + if (feedbackOption && feedbackOption.type !== "privacypolicy" && feedbackOption.type !== "spacer" && feedbackOption.type !== "submit" && feedbackOption.name !== "reportedBy") { + newFormArray.push(feedbackOption); + } + } + + var emailFormItem = feedbackOptions.collectEmail === true || feedbackOptions.collectEmail === undefined ? { + title: "Email", + placeholder: "Your e-mail", + type: "text", + inputtype: "email", + name: "reportedBy", + required: true, + remember: true + } : null; // Collect email when user needs to enter it. + + if (emailFormItem && !(sessionInstance.session && sessionInstance.session.email)) { + emailFormItem.hideOnDefaultSet = false; + newFormArray.push(emailFormItem); + } // Update form. + + + feedbackOptions.form = newFormArray; + feedbackOptions.pages = feedbackOptions.singlePageForm === true ? 1 : newFormArray.length; // Add page id's + + for (var i = 0; i < feedbackOptions.form.length; i++) { + var feedbackOption = feedbackOptions.form[i]; + + if (feedbackOptions.singlePageForm === true) { + feedbackOption.page = 0; + } else { + feedbackOption.page = i; + } + } // Add email as hidden default option. + + + if (emailFormItem && sessionInstance.session && sessionInstance.session.email) { + emailFormItem.hideOnDefaultSet = true; + emailFormItem.defaultValue = sessionInstance.session.email; + emailFormItem.page = feedbackOptions.form[feedbackOptions.form.length - 1].page; + newFormArray.push(emailFormItem); + } // Inject privacy policy. + + + if (!feedbackOptions.disableUserScreenshot && !instance.widgetCallback) { + var captureItem = { + name: "capture", + type: "capture", + enableScreenshot: true, + autostartDrawing: instance.autostartDrawing, + enableCapture: feedbackOptions.enableUserScreenRecording ? true : false, + captureTitle: translateText("Record screen", instance.overrideLanguage), + captureTooltip: translateText("Record your screen to showcase the bug", instance.overrideLanguage), + screenshotTitle: translateText("Mark the bug", instance.overrideLanguage), + screenshotTooltip: translateText("Draw on the screen to mark the bug", instance.overrideLanguage), + page: feedbackOptions.form[feedbackOptions.form.length - 1].page + }; + feedbackOptions.form.push(captureItem); + } // Inject privacy policy. + + + if (feedbackOptions.privacyPolicyEnabled) { + var policyItem = { + name: "privacypolicy", + type: "privacypolicy", + required: true, + url: feedbackOptions.privacyPolicyUrl, + page: feedbackOptions.form[feedbackOptions.form.length - 1].page + }; + feedbackOptions.form.push(policyItem); + } + } // Disable autostart drawing for the next call. + + + instance.autostartDrawing = false; // Stop bug analytics. + + instance.stopBugReportingAnalytics(); + + if (instance.silentBugReport) { + // Move on + instance.checkReplayLoaded(); + } else { + // Show editor + instance.showBugReportEditor(feedbackOptions); + } + + instance.updateFeedbackButtonState(); + } + }, { + key: "disableConsoleLogOverwrite", + value: function disableConsoleLogOverwrite() { + GleapConsoleLogManager.getInstance().stop(); + } + }]); + + return Gleap; +}(); // Check for unperformed Gleap actions. + + +Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_BOTTOM_RIGHT", "BOTTOM_RIGHT"); + +Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_BOTTOM_LEFT", "BOTTOM_LEFT"); + +Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_CLASSIC", "BUTTON_CLASSIC"); + +Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_CLASSIC_LEFT", "BUTTON_CLASSIC_LEFT"); + +Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_CLASSIC_BOTTOM", "BUTTON_CLASSIC_BOTTOM"); + +Gleap_defineProperty(Gleap_Gleap, "FEEDBACK_BUTTON_NONE", "BUTTON_NONE"); + +Gleap_defineProperty(Gleap_Gleap, "PRIORITY_LOW", "LOW"); + +Gleap_defineProperty(Gleap_Gleap, "PRIORITY_MEDIUM", "MEDIUM"); + +Gleap_defineProperty(Gleap_Gleap, "PRIORITY_HIGH", "HIGH"); + +Gleap_defineProperty(Gleap_Gleap, "instance", void 0); + +if (typeof window !== "undefined") { + var GleapActions = window.GleapActions; + + if (GleapActions && GleapActions.length > 0) { + for (var i = 0; i < GleapActions.length; i++) { + var GLAction = GleapActions[i]; + + if (GLAction && GLAction.e && Gleap_Gleap[GLAction.e]) { + Gleap_Gleap[GLAction.e].apply(Gleap_Gleap, GLAction.a); + } + } + } +} + +/* harmony default export */ const src_Gleap = (Gleap_Gleap); +;// CONCATENATED MODULE: ./src/index.js + +/* harmony default export */ const src = (src_Gleap); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/published/6.9.1/index.min.css b/published/6.9.1/index.min.css new file mode 100644 index 00000000..50e0a60e --- /dev/null +++ b/published/6.9.1/index.min.css @@ -0,0 +1 @@ +@import url(https://fonts.googleapis.com/css2?family=Inter:wght@100;300;400;500;600;700&display=swap);.bb-feedback-dialog-container input{margin:0;padding:0;border:none}.bb-feedback-button{margin:0;position:fixed;bottom:20px;right:20px;border-radius:30px;cursor:pointer;-webkit-tap-highlight-color:transparent;background-color:transparent;color:#000;z-index:2147483100;box-sizing:border-box;display:flex;align-items:center;padding:0}.bb-feedback-button--disabled .bb-feedback-button-icon{display:none!important}.bb-feedback-button--disabled .bb-feedback-button-text{display:none}.bb-feedback-button--bottomleft{bottom:20px;right:auto;left:20px}.bb-feedback-button-shoutout{position:fixed;bottom:22px;right:94px;animation-duration:.2s;animation-fill-mode:both;animation-name:bbFadeInUp}.bb-feedback-button--bottomleft .bb-feedback-button-shoutout{right:auto;left:94px}.bb-feedback-button-text{padding:8px 12px;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;background-color:#fff;border-radius:8px;box-shadow:0 0 14px 0 rgba(0,0,0,.15);position:relative;z-index:99}.bb-feedback-button-text:before{content:"";position:absolute;box-shadow:rgba(0,0,0,.04) 6px 6px 5px;transform:rotate(315deg);bottom:16px;right:-4px;border-width:10px;border-style:solid;border-color:transparent #fff #fff transparent}.bb-feedback-button--bottomleft .bb-feedback-button-text:before{display:none}.bb-feedback-button-text:after{content:"";position:absolute;bottom:12px;right:0;background-color:#fff;width:5px;height:30px}.bb-feedback-button-text-title{font-family:Inter,sans-serif;font-size:14px;color:#666;line-height:18px;max-width:220px}.bb-feedback-button-text-title b{color:#000;font-weight:600}.bb-logo-logo--default path{fill:#fff}.bb-feedback-capture-item-selected{display:none}.bb-feedback-capture-item-selected-button{display:flex;font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:5px 8px;width:auto;margin-top:5px;margin-bottom:0;margin-right:auto;justify-content:flex-start;align-items:center;height:39px}.bb-feedback-capture-item-selected-label{font-size:14px;line-height:19px;font-weight:600;font-weight:400;margin-left:8px}.bb-feedback-capture-item-selected-icon{display:flex;justify-content:center;align-items:center}.bb-feedback-capture-item-selected-icon svg{width:18px;height:18px;object-fit:contain}.bb-feedback-capture-item-selected-action{display:flex;justify-content:center;align-items:center;cursor:pointer;-webkit-tap-highlight-color:transparent;padding:5px;margin-left:8px}.bb-feedback-capture-item-selected-action svg{width:14px;height:14px;object-fit:contain}.bb-feedback-capture-items{display:flex;justify-content:flex-start;flex-wrap:wrap}.bb-feedback-capture-item{font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:8px 12px;width:auto;margin-top:5px;margin-right:8px;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent;display:flex;justify-content:center;align-items:center;position:relative;height:39px}.bb-feedback-capture-item:last-of-type{margin-right:0}.bb-feedback-capture-item:hover{background-color:#ddd}.bb-feedback-capture-item .bb-item-title{font-size:14px;line-height:19px;font-weight:600;color:#333;font-weight:400;margin-left:8px}.bb-feedback-capture-item svg{width:18px;height:18px;object-fit:contain}.bb-feedback-button-icon{width:60px;height:60px;border-radius:60px;background-color:#485bff;transition:box-shadow .3s ease-in-out;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);position:relative}.bb-feedback-button-classic{cursor:pointer;-webkit-tap-highlight-color:transparent;top:50%;right:0;position:fixed;transform:rotate(-90deg) translate(50%,-50%);transform-origin:100% 50%;padding:9px 20px;text-align:center;background-color:#485bff;border-top-left-radius:8px;border-top-right-radius:8px;font-family:Inter,sans-serif;font-size:16px;color:#fff;box-shadow:0 0 14px 0 rgba(0,0,0,.25);animation-duration:.2s;animation-fill-mode:both;animation-name:bbFadeInOpacity}.bb-feedback-button-classic--left{top:50%;left:0;right:auto;transform:rotate(90deg) translate(-50%,-100%);transform-origin:0 0}.bb-feedback-button-classic--bottom{top:auto;bottom:0;transform:none;right:20px}.bb-feedback-button--sending .bb-feedback-button-classic{animation-duration:.2s;animation-fill-mode:both;animation-name:bbFadeOutRight}.bb-feedback-button .bb-logo-logo{position:absolute;width:38px;height:38px;top:11px;left:11px;object-fit:contain;animation-duration:.3s;animation-fill-mode:both;animation-name:bbZoomIn}.bb-feedback-button .bb-logo-arrowdown{position:absolute;width:18px;height:18px;top:23px;left:21px;object-fit:contain;animation-duration:.3s;animation-fill-mode:both}.bb-feedback-button .bb-logo-arrowdown{animation-name:bbZoomOut}.bb-feedback-button--sending .bb-logo-arrowdown{animation-name:bbZoomIn}.bb-feedback-button--sending .bb-logo-logo{animation-name:bbZoomOut}.bb-feedback-button-icon:hover{box-shadow:0 1px 3px rgba(0,0,0,.25),0 0 20px rgba(0,0,0,.2)}.bb-feedback-button--bottomleft.bb-feedback-button--sending{padding-left:0;padding-right:5px}.bb-feedback-button--sending .bb-feedback-button-text{animation-name:bbFadeOutDown}.bb-feedback-button--sending .bb-feedback-button-icon{display:flex}.bb-feedback-dialog{width:90%;max-width:365px;box-shadow:0 4px 12px rgba(0,0,0,.1),0 2px 4px rgba(0,0,0,.1);border-radius:20px;box-sizing:border-box;position:fixed;right:16px;bottom:92px;z-index:2147483105;overflow:hidden}.bb-feedback-button--bottomleft .bb-feedback-dialog{right:auto;left:16px}.bb-feedback-button--classic .bb-feedback-dialog,.bb-feedback-button--disabled .bb-feedback-dialog{bottom:20px}.bb-feedback-button--classic-left .bb-feedback-dialog{right:auto;left:16px}.bb-feedback-form-description{font-size:16px;line-height:19px;font-family:Inter,sans-serif;color:#000;font-weight:400;margin-top:5px;margin-bottom:10px}.bb-feedback-form--hidden{display:none!important}.bb-feedback-form{margin:25px;margin-bottom:22px;position:relative;flex-grow:1}.bb-feedback-dialog-header{display:flex;align-items:flex-start;justify-content:center;padding:25px;box-sizing:border-box;background-color:#485bff;flex-direction:column;padding-bottom:58px;position:relative}.bb-feedback-dialog-header-button-cancel svg{width:10px;height:10px}.bb-feedback-dialog-header-button-cancel:hover svg{opacity:.6}.bb-feedback-dialog-header-title,.bb-feedback-dialog-header-title span{font-weight:400;text-align:center;color:#fff;font-family:Inter,sans-serif;text-align:left;margin-top:15px;font-weight:600;font-size:22px;line-height:26px}#bb-user-name{text-transform:capitalize}.bb-feedback-dialog-header-description{font-weight:400;text-align:center;color:#fff;font-family:Inter,sans-serif;text-align:left;font-weight:400;margin-top:5px;font-size:16px;line-height:19px}.bb-feedback-dialog-header-back svg{fill:#fff}.bb-feedback-dialog-header-back:hover svg{fill:#fff}.bb-logo-arrowdown{fill:#fff}.bb-feedback-dialog-header-logo img,.bb-feedback-dialog-header-logo svg{height:40px;width:auto;max-width:200px;object-fit:contain;text-align:left}.bb-feedback-dialog-header-back{width:40px;height:40px;min-width:40px;display:flex;justify-content:center;align-items:center}.bb-feedback-dialog-header-back svg{width:18px;height:18px;object-fit:contain}.bb-feedback-dialog-header-back--close svg{width:26px}.bb-feedback-dialog-header-back:hover{background-color:#fff;border-radius:11px;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-dialog-header--back{display:flex;flex-direction:row;width:100%;align-items:center;padding:12px;padding-top:12px}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-text{flex-grow:1;padding-left:8px}.bb-feedback-dialog-header--backhidden .bb-feedback-dialog-header-text{padding-left:0}.bb-feedback-dialog-header--backhidden{padding:21px;padding-top:21px}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-title{margin-top:0;line-height:22px;font-family:Inter,sans-serif;font-size:18px;font-weight:600}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-title-small{margin-top:0;line-height:22px;font-family:Inter,sans-serif;font-size:16px;font-weight:600}.bb-feedback-dialog-header--back .bb-feedback-dialog-header-description{font-family:Inter,sans-serif;font-size:14px;line-height:18px;margin-top:5px}.bb-feedback-dialog-header--backhidden .bb-feedback-dialog-header-back{display:none!important}.bb-feedback-types{margin:35px 0;margin-top:-45px;margin-bottom:20px;flex-grow:1;z-index:1}.bb-feedback-type{display:flex;justify-content:flex-start;align-items:center;padding:9px;margin:12px 25px;cursor:pointer;-webkit-tap-highlight-color:transparent;border:1px solid transparent;border-radius:12px;background-color:#fff;box-sizing:border-box;box-shadow:0 0 12px rgba(0,0,0,.05),0 1px 3px rgba(0,0,0,.1);transition:box-shadow .2s ease-in-out}.bb-feedback-type:hover{background-color:#fff;box-shadow:0 0 12px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.2)}.bb-feedback-type-icon{width:44px;height:44px;min-width:44px;background-color:#485bff;border-radius:44px;margin-right:12px;padding:10px;box-sizing:border-box}.bb-feedback-type-icon img{width:100%;height:100%;object-fit:contain}.bb-feedback-type-text{flex-grow:1}.bb-feedback-type-title{font-family:Inter,sans-serif;font-weight:500;font-size:16px;line-height:18px;margin-bottom:3px;color:#000}.bb-feedback-multiplechoice{display:flex;flex-direction:column;margin-bottom:20px}.bb-feedback-multiplechoice-container{font-family:Inter,sans-serif;display:block;position:relative;margin-bottom:12px;cursor:pointer;-webkit-tap-highlight-color:transparent;user-select:none;padding-left:35px;font-size:15px;line-height:25px;min-height:25px}.bb-feedback-multiplechoice-container:first-of-type{margin-top:8px}.bb-feedback-multiplechoice-container input{position:absolute;opacity:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-multiplechoice-checkmark{position:absolute;top:0;left:0;height:25px;width:25px;border-radius:50%;box-sizing:border-box}.bb-feedback-multiplechoice-container:hover input~.bb-feedback-multiplechoice-checkmark{border:2px solid #59617d}.bb-feedback-multiplechoice-container input:checked~.bb-feedback-multiplechoice-checkmark{border:2px solid #000}.bb-feedback-multiplechoice-checkmark:after{content:"";position:absolute;display:none}.bb-feedback-multiplechoice-container input:checked~.bb-feedback-multiplechoice-checkmark:after{display:block}.bb-feedback-multiplechoice-container .bb-feedback-multiplechoice-checkmark:after{top:5.5px;left:6px;width:9px;height:9px;border-radius:50%;background:#fff}.bb-feedback-onetofive{display:flex;flex-direction:column;animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight}.bb-feedback-onetofive-description{display:flex;flex-direction:row;justify-content:space-between}.bb-feedback-onetofive-description span{color:#59617d;font-size:13px;font-weight:500;margin-bottom:20px;font-family:Inter,sans-serif}.bb-feedback-onetofive-buttons{display:flex;justify-content:space-between;margin-bottom:8px}.bb-feedback-onetofive-button{font-family:Inter,sans-serif;cursor:pointer;-webkit-tap-highlight-color:transparent;padding:0;background-color:#eceaf3;color:#59617d;border-radius:5px;width:calc(20% - 2px);text-align:center;line-height:44px;min-height:44px;font-size:17px;font-weight:500}.bb-feedback-onetofive-button-active,.bb-feedback-onetofive-button:hover{background-color:#59617d;color:#fff}.bb-feedback-type-description{font-family:Inter,sans-serif;color:#59617d;font-size:14px;line-height:16px;font-weight:400}.bb-feedback-elementtitle{font-family:Inter,sans-serif;font-size:15px;line-height:19px;text-align:left;margin-bottom:5px;margin-top:4px;font-weight:500;color:#000}.bb-feedback-elementtitle span{font-family:Inter,sans-serif;font-size:15px;line-height:19px;text-align:left;margin-bottom:12px;margin-top:0;font-weight:500;color:#ed4337;margin-left:3px}.bb-feedback-dialog-info-text{font-family:Inter,sans-serif;color:#000;font-size:16px;padding-top:20px;text-align:center;line-height:21px}.bb-feedback-dialog-success{display:flex;justify-content:center;align-items:center;flex-direction:column;padding:50px;display:none;flex-grow:1}.bb-feedback-dialog-success svg{width:56px;height:56px;border-radius:50%;display:block;stroke-width:2;stroke:#fff;stroke-miterlimit:10;animation:bb-suc-fill .4s ease-in-out .4s forwards,bb-suc-scale .3s ease-in-out .9s both}.bb-feedback-dialog-success svg path{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;animation:bb-suc-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}.bb-feedback-dialog-success svg circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;fill:none;animation:bb-suc-stroke .6s cubic-bezier(.65,0,.45,1) forwards}@keyframes bb-suc-stroke{100%{stroke-dashoffset:0}}@keyframes bb-suc-scale{0%,100%{transform:none}50%{transform:scale3d(1.1,1.1,1)}}.bb-feedback-dialog-body{display:flex;flex-grow:1;flex-direction:column;z-index:1}.bb-feedback-dialog-form .bb-feedback-dialog-body{max-height:calc(100vh - 200px);overflow-y:auto}.bb-feedback-inputgroup{display:flex;justify-content:center;margin-bottom:12px;padding:0;flex-direction:column;animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight}.bb-form-progress{position:absolute;top:-25px;left:-25px;right:-25px}.bb-form-progress-inner{width:0;height:4px;background-color:#485bff44;transition:width .5s ease-in-out}.bb-feedback-formpage{display:none}.bb-feedback-inputgroup-spacer{display:flex;height:10px}.bb-feedback-inputgroup-button{display:flex;align-items:center;justify-content:flex-end;flex-direction:row;margin-top:20px}.bb-feedback-inputgroup-text{font-family:Inter,sans-serif;color:#000;font-size:16px;font-weight:400}.bb-feedback-inputgroup-label{font-family:Inter,sans-serif;padding:0;margin-bottom:5px;color:#000;font-size:14px;font-weight:600}.bb-feedback-send-button{font-family:Inter,sans-serif;background-color:#485bff;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;color:#fff;text-align:center;width:100%;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-send-button--disabled{background-color:#dee1ea!important;color:#9b9fae!important;opacity:1!important;cursor:not-allowed!important}.bb-feedback-send-button:hover{opacity:.9}.bb-feedback-back-button{width:auto;color:#59617d;font-weight:400;font-size:14px;line-height:19px;text-decoration:underline;cursor:pointer;-webkit-tap-highlight-color:transparent;margin-right:30px}.bb-feedback-back-button:hover{color:#000}.bb-feedback-inputgroup input,.bb-feedback-inputgroup>input{font-size:15px;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:Inter,sans-serif;width:auto;padding:11px 12px;outline:0;border:1px solid #eee;background-color:#fff;border-radius:8px;box-sizing:border-box;color:#000;font-weight:400}.bb-feedback-inputgroup input:focus,.bb-feedback-inputgroup>input:focus{border-color:#485bff}input.bb-feedback-required,textarea.bb-feedback-required{border:1px solid #da0e07!important;background-color:#da0e0710!important}.bb-feedback-rating{flex-direction:column}.bb-feedback-emojigroup{--normal:#eceaf3;--normal-shadow:#d9d8e3;--normal-mouth:#9795a4;--normal-eye:#595861;--active:#f8da69;--active-shadow:#f4b555;--active-mouth:#f05136;--active-eye:#313036;--active-tear:#76b5e7;--active-shadow-angry:#e94f1d;margin:0;padding:0;list-style:none;display:flex;justify-content:center;margin-bottom:10px;margin-top:8px}.bb-feedback-required .bb-feedback-emojigroup{--normal:#fde6e6;--normal-shadow:#ffbdbd}.bb-feedback-emojigroup li{position:relative;border-radius:50%;background:var(--sb,var(--normal));box-shadow:inset 3px -3px 4px var(--sh,var(--normal-shadow));transition:background .4s,box-shadow .4s,transform .3s;-webkit-tap-highlight-color:transparent}.bb-feedback-emojigroup li:not(:last-child){margin-right:10px}@media only screen and (max-width:330px){.bb-feedback-emojigroup li:not(:last-child){margin-right:5px}}.bb-feedback-emojigroup li div{width:45px;height:45px;position:relative;transform:perspective(240px) translateZ(4px)}.bb-feedback-emojigroup li div svg,.bb-feedback-emojigroup li div:after,.bb-feedback-emojigroup li div:before{display:block;position:absolute;left:var(--l,9px);top:var(--t,13px);width:var(--w,8px);height:var(--h,2px);transform:rotate(var(--r,0deg)) scale(var(--sc,1)) translateZ(0)}.bb-feedback-emojigroup li div svg{fill:none;stroke:var(--s);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;transition:stroke .4s}.bb-feedback-emojigroup li div svg.bb-feedback-eye{--s:var(--e, var(--normal-eye));--t:17px;--w:10px;--h:4px}.bb-feedback-emojigroup li div svg.bb-feedback-eye.bb-feedback-right{--l:28px}.bb-feedback-emojigroup li div svg.bb-feedback-mouth{--s:var(--m, var(--normal-mouth));--l:14px;--t:25px;--w:18px;--h:10px}.bb-feedback-emojigroup li div:after,.bb-feedback-emojigroup li div:before{content:"";z-index:var(--zi,1);border-radius:var(--br,1px);background:var(--b,var(--e,var(--normal-eye)));transition:background .4s}.bb-feedback-emojigroup li.bb-feedback-angry{--step-1-rx:-24deg;--step-1-ry:20deg;--step-2-rx:-24deg;--step-2-ry:-20deg}.bb-feedback-emojigroup li.bb-feedback-angry div:before{--r:20deg;top:12px;left:11px}.bb-feedback-emojigroup li.bb-feedback-angry div:after{--l:23px;--r:-20deg;top:12px;left:28px}.bb-feedback-emojigroup li.bb-feedback-angry div svg.bb-feedback-eye{stroke-dasharray:4.55;stroke-dashoffset:8.15}.bb-feedback-emojigroup li.bb-feedback-angry.bb-feedback-active,.bb-feedback-emojigroup li.bb-feedback-angry:hover{animation:angry 1s linear}.bb-feedback-emojigroup li.bb-feedback-angry.bb-feedback-active div:before,.bb-feedback-emojigroup li.bb-feedback-angry:hover div:before{--middle-y:-2px;--middle-r:22deg;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li.bb-feedback-angry.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-angry:hover div:after{--middle-y:1px;--middle-r:-18deg;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li.bb-feedback-sad{--step-1-rx:20deg;--step-1-ry:-12deg;--step-2-rx:-18deg;--step-2-ry:14deg}.bb-feedback-emojigroup li.bb-feedback-sad div:after,.bb-feedback-emojigroup li.bb-feedback-sad div:before{--b:var(--active-tear);--sc:0;--w:5px;--h:5px;--t:15px;--br:50%}.bb-feedback-emojigroup li.bb-feedback-sad div:after{--l:25px}.bb-feedback-emojigroup li.bb-feedback-sad div svg.bb-feedback-eye{--t:16px}.bb-feedback-emojigroup li.bb-feedback-sad div svg.bb-feedback-mouth{--t:25px;stroke-dasharray:9.5;stroke-dashoffset:33.25}.bb-feedback-emojigroup li.bb-feedback-sad.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-sad.bb-feedback-active div:before,.bb-feedback-emojigroup li.bb-feedback-sad:hover div:after,.bb-feedback-emojigroup li.bb-feedback-sad:hover div:before{animation:tear .6s linear forwards}.bb-feedback-emojigroup li.bb-feedback-ok{--step-1-rx:4deg;--step-1-ry:-22deg;--step-1-rz:6deg;--step-2-rx:4deg;--step-2-ry:22deg;--step-2-rz:-6deg}.bb-feedback-emojigroup li.bb-feedback-ok div:before{--l:15px;--t:15px;--h:4px;--w:4px;--br:50%;box-shadow:12px 0 0 var(--e,var(--normal-eye))}.bb-feedback-emojigroup li.bb-feedback-ok div:after{--l:16px;--t:27px;--w:14px;--h:2px;--br:1px;--b:var(--m, var(--normal-mouth))}.bb-feedback-emojigroup li.bb-feedback-ok.bb-feedback-active div:before,.bb-feedback-emojigroup li.bb-feedback-ok:hover div:before{--middle-s-y:0.35;animation:toggle .2s linear forwards}.bb-feedback-emojigroup li.bb-feedback-ok.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-ok:hover div:after{--middle-s-x:0.5;animation:toggle .7s linear forwards}.bb-feedback-emojigroup li.bb-feedback-good{--step-1-rx:-14deg;--step-1-rz:10deg;--step-2-rx:10deg;--step-2-rz:-8deg}.bb-feedback-emojigroup li.bb-feedback-good div:before{--b:var(--m, var(--normal-mouth));--w:5px;--h:5px;--br:50%;--t:22px;--zi:0;opacity:.5;box-shadow:16px 0 0 var(--b);filter:blur(2px)}.bb-feedback-emojigroup li.bb-feedback-good div:after{--sc:0}.bb-feedback-emojigroup li.bb-feedback-good div svg.bb-feedback-eye{--t:15px;--sc:-1;stroke-dasharray:4.55;stroke-dashoffset:8.15}.bb-feedback-emojigroup li.bb-feedback-good div svg.bb-feedback-mouth{--t:22px;--sc:-1;stroke-dasharray:13.3;stroke-dashoffset:23.75}.bb-feedback-emojigroup li.bb-feedback-good.bb-feedback-active div svg.bb-feedback-mouth,.bb-feedback-emojigroup li.bb-feedback-good:hover div svg.bb-feedback-mouth{--middle-y:1px;--middle-s:-1;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li.bb-feedback-happy div{--step-1-rx:18deg;--step-1-ry:24deg;--step-2-rx:18deg;--step-2-ry:-24deg}.bb-feedback-emojigroup li.bb-feedback-happy div:before{--sc:0}.bb-feedback-emojigroup li.bb-feedback-happy div:after{--b:var(--m, var(--normal-mouth));--l:14px;--t:25px;--w:18px;--h:8px;--br:0 0 8px 8px}.bb-feedback-emojigroup li.bb-feedback-happy div svg.bb-feedback-eye{--t:14px;--sc:-1}.bb-feedback-emojigroup li.bb-feedback-happy.bb-feedback-active div:after,.bb-feedback-emojigroup li.bb-feedback-happy:hover div:after{--middle-s-x:0.95;--middle-s-y:0.75;animation:toggle .8s linear forwards}.bb-feedback-emojigroup li:not(.active){cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-emojigroup li:not(.active):active{transform:scale(.925)}.bb-feedback-emojigroup li.bb-feedback-active,.bb-feedback-emojigroup li:hover{--sb:var(--active);--sh:var(--active-shadow);--m:var(--active-mouth);--e:var(--active-eye)}.bb-feedback-emojigroup li.bb-feedback-active div,.bb-feedback-emojigroup li:hover div{animation:shake .8s linear forwards}@keyframes shake{30%{transform:perspective(240px) rotateX(var(--step-1-rx,0deg)) rotateY(var(--step-1-ry,0deg)) rotateZ(var(--step-1-rz,0deg)) translateZ(10px)}60%{transform:perspective(240px) rotateX(var(--step-2-rx,0deg)) rotateY(var(--step-2-ry,0deg)) rotateZ(var(--step-2-rz,0deg)) translateZ(10px)}100%{transform:perspective(240px) translateZ(4px)}}@keyframes tear{0%{opacity:0;transform:translateY(-2px) scale(0) translateZ(0)}50%{transform:translateY(12px) scale(.6,1.2) translateZ(0)}20%,80%{opacity:1}100%{opacity:0;transform:translateY(24px) translateX(4px) rotateZ(-30deg) scale(.7,1.1) translateZ(0)}}@keyframes toggle{50%{transform:translateY(var(--middle-y,0)) scale(var(--middle-s-x,var(--middle-s,1)),var(--middle-s-y,var(--middle-s,1))) rotate(var(--middle-r,0deg))}}@keyframes angry{40%{background:var(--active)}45%{box-shadow:inset 3px -3px 4px var(--active-shadow),inset 0 8px 10px var(--active-shadow-angry)}}.bb-feedback-inputgroup textarea{font-size:15px;line-height:19px;font-weight:400;font-family:Inter,sans-serif;outline:0;-webkit-appearance:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;resize:none;width:auto;height:auto;padding:11px 12px;margin:0;box-sizing:border-box;border:1px solid #eee;background-color:#fff;border-radius:8px;box-sizing:border-box;color:#000;max-height:140px;min-height:60px}.bb-feedback-inputgroup textarea:focus{border-color:#485bff}.bb-feedback-inputgroup--privacy-policy{font-family:Inter,sans-serif;padding:8px 0;font-size:14px;font-weight:400;flex-direction:row;width:100%;justify-content:flex-start;align-items:center}.bb-feedback-inputgroup--privacy-policy a{margin-top:0;margin-bottom:0;display:inline;text-decoration:underline;font-family:Inter,sans-serif;font-size:14px;font-weight:400}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked){position:absolute;left:0;opacity:.01}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label{font-family:Inter,sans-serif;position:relative;padding-left:2em;font-size:14px;font-weight:400;line-height:1.7;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:before,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:before{content:"";position:absolute;left:0;top:0;width:1.4em;height:1.4em;border:1px solid #0d1018;background:#fff;border-radius:.2em;-webkit-transition:all 275ms;transition:all 275ms}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:after,.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:after{content:"✕";position:absolute;top:.525em;left:.18em;font-family:Inter,sans-serif;font-size:1.375em;color:#485bff;line-height:0;-webkit-transition:all .2s;transition:all .2s}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0) rotate(45deg);transform:scale(0) rotate(45deg)}.bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}.bb-feedback-inputgroup--privacy-policy.bb-feedback-required [type=checkbox]:checked+label .bb-feedback-inputgroup--privacy-policy.bb-feedback-required,.bb-feedback-inputgroup--privacy-policy.bb-feedback-required [type=checkbox]:not(:checked)+label,.bb-feedback-inputgroup--privacy-policy.bb-feedback-required a{color:#da0e07}.bb-feedback-importance{font-family:Inter,sans-serif;margin:20px;margin-bottom:-8px;font-weight:600;color:#222426;font-size:14px;font-weight:400}.bb-feedback-image{position:relative}.bb-feedback-poweredbycontainer{display:flex;justify-content:center;align-items:center;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0;padding:25px 25px;padding-top:0;padding-bottom:20px;margin-top:-16px}.bb-feedback-poweredbycontainer span{font-family:Inter,sans-serif;font-weight:400;font-size:14px;color:#59617d}.bb-feedback-poweredbycontainer svg{height:16px;width:auto;margin-left:4px;margin-top:2px}.bb--edit-button{position:absolute;top:calc(50% - 25px);left:100px;width:50px;height:50px;border-radius:50%;background-color:rgba(0,0,0,.45);cursor:pointer;-webkit-tap-highlight-color:transparent;display:flex;justify-content:center;align-items:center}.bb-feedback-dialog-error{background-color:#da0e0710;padding:16px 25px;margin:0;font-size:14px;font-weight:400;font-family:Inter,sans-serif;color:#da0e07;display:none}.bb-feedback-filesizeinfo{display:none;font-size:14px;font-weight:400;font-family:Inter,sans-serif;color:#da0e07;margin-top:10px}.bb-feedback-dialog-loading{display:none;justify-content:center;align-items:center;flex-grow:1}.bb-feedback-dialog-loading--main{padding:20px}.bb--progress-ring__circle{transition:.2s stroke-dashoffset;transform:rotate(-90deg);transform-origin:50% 50%}.bb--edit-button svg{width:60%}.bb-screenshot-editor-canvas{position:absolute;top:0;left:0;width:100vw;height:100vh;height:-webkit-fill-available;cursor:crosshair;z-index:916777267}.bb-capture-svg{position:absolute;z-index:916777264;top:0;left:0;right:0;width:100%;height:100%;padding:0;margin:0;cursor:crosshair}@keyframes bbRecIconContFade{0%{fill:#b10802}50%{fill:red}100%{fill:#b10802}}.bb-rec-on-circle{animation-name:bbRecIconFade;animation-duration:2s;animation-iteration-count:infinite;animation-direction:alternate}.bb-rec-on-cont{animation-name:bbRecIconContFade;animation-duration:2s;animation-iteration-count:infinite;animation-direction:alternate}.bb-capture-editor-drag-info{position:fixed;top:-200px;left:0;z-index:916777266;transition:opacity .3s ease-in-out}.bb-capture-editor-drag-info svg{width:24px;height:24px}.bb-capture-editor-borderlayer{position:fixed;top:0;left:0;width:100vw;height:100vh;border:4px solid #485bff;cursor:crosshair;z-index:916777260;box-sizing:border-box;pointer-events:none}.bb-feedback-dialog-backdrop{display:none}.bb-capture-editor-notrecording .bb-capture-editor-borderlayer{background-color:rgba(0,0,0,.8)}.bb-capture-editor-recording .bb-capture-dismiss{display:none}.bb-capture-editor-item-inactive{opacity:.3;cursor:not-allowed!important}.bb-capture-editor-notrecording .bb-capture-toolbar-drawingitem{opacity:.3;cursor:not-allowed!important}.bb-capture-editor-notrecording .bb-capture-editor-drag-info{display:none}.bb-capture-editor-notrecording .bb-capture-svg{pointer-events:none!important}.bb-screenshot-editor--marked .bb-capture-editor-borderlayer,.bb-screenshot-editor--marked .bb-screenshot-editor-canvas{cursor:default}.bb-capture-toolbar{position:fixed;top:20px;left:50%;transform:translateX(-50%);z-index:916777268;background-color:#fff;padding:5px;display:flex;align-items:center;border-radius:8px;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);transition:opacity .3s ease-in-out}.bb-capture-dismiss{position:fixed;top:0;right:0;z-index:916777268;cursor:pointer;-webkit-tap-highlight-color:transparent;width:36px;height:36px;display:flex;justify-content:center;align-items:center}.bb-capture-dismiss svg{width:20px;height:20px;object-fit:contain}.bb-capture-button-next{font-family:Inter,sans-serif;box-sizing:border-box;font-weight:600;text-align:center;width:auto;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0;line-height:36px;padding:0 12px;font-size:15px;margin-left:12px}.bb-capture-toolbar-item-spacer{width:1px;height:38px;min-width:1px;margin:0 5px}.bb-capture-toolbar-item{width:42px;height:38px;min-width:42px;display:flex;align-items:center;justify-content:center;cursor:pointer;-webkit-tap-highlight-color:transparent;position:relative;margin-right:5px}.bb-capture-toolbar-item svg{width:23px;height:23px;object-fit:contain}.bb-capture-toolbar-item-selectedcolor{border-radius:100%;width:20px;height:20px;background-color:#db4035}.bb-capture-toolbar-item[data-type=undo] svg{width:18px;height:18px}.bb-capture-toolbar-item[data-active=true]{position:relative}.bb-capture-preview{display:none;background-color:rgba(0,0,0,.6);position:fixed;top:0;left:0;width:100vw;height:100vh;justify-content:center;align-items:center;z-index:916777270}.bb-capture-preview-inner{background-color:#fff;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);border-radius:8px;flex-direction:column;max-width:640px;width:100%;margin:20px}.bb-capture-preview-inner video{border-radius:8px 8px 0 0;display:block;border:0;outline:0;width:100%;max-height:60vh}.bb-capture-preview-buttons{display:flex;justify-content:space-between;padding:14px}.bb-capture-preview-retrybutton{font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;text-align:center;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-capture-preview-sendbutton{font-family:Inter,sans-serif;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;text-align:center;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-capture-preview-retrybutton:hover,.bb-capture-preview-sendbutton:hover{opacity:.9}.bb-capture-toolbar-item-recording{margin-right:0}.bb-capture-toolbar-item-recording svg{width:33px;height:33px}.bb-capture-toolbar-item-colorpicker{position:fixed;top:70px;left:50%;transform:translateX(-50%);z-index:916777268;background-color:#fff;display:none;padding:10px;box-shadow:0 1px 3px rgba(0,0,0,.15),0 0 20px rgba(0,0,0,.1);border-radius:8px}.bb-capture-toolbar-item-color{width:20px;height:20px;border-radius:100%;margin-right:12px;box-shadow:0 0 3px rgba(0,0,0,.15);cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-capture-toolbar-item-color:hover{box-shadow:0 0 6px rgba(0,0,0,.25)}.bb-capture-toolbar-item-color:last-of-type{margin-right:0}.bb-capture-toolbar-item-recording[data-active=true] svg:first-of-type{display:none}.bb-capture-toolbar-item-recording[data-active=true] svg:nth-of-type(2){display:block}.bb-capture-toolbar-item-recording[data-active=false] svg:first-of-type{display:block}.bb-capture-toolbar-item-recording[data-active=false] svg:nth-of-type(2){display:none}.bb-capture-toolbar-item--active{background-color:#eee}.bb-capture-toolbar-item:hover svg{opacity:1}.bb-capture-toolbar-item--active{background-color:#f8f8f8}.bb-capture-toolbar-item--active svg{opacity:1}.bb-capture-toolbar-item--inactivecross::before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;height:3px;width:26px;margin:auto;border-radius:4px;background-color:#e80000;transform:rotate(45deg)}.bb-capture-toolbar-item--inactivecross svg{fill:#eee}.bb-capture-toolbar-item-timer{text-align:left;line-height:32px;font-size:14px;margin:5px;min-width:40px;display:none}.bb-feedback-capture-item .bb-tooltip{background-color:#555;color:#fff;visibility:hidden;font-size:13px;text-align:center;padding:8px 10px;position:absolute;z-index:1;top:initial;bottom:42px;left:50%;opacity:0;transition:opacity .3s;transform:translateX(-50%);width:190px}.bb-feedback-capture-item:nth-of-type(2) .bb-tooltip{left:auto;right:0;transform:none}.bb-feedback-capture-item .bb-tooltip::after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;transform:rotate(0);border-color:#555 transparent transparent transparent}.bb-feedback-capture-item:nth-of-type(2) .bb-tooltip::after{left:auto;right:25%}.bb-feedback-capture-item:hover .bb-tooltip{visibility:visible;opacity:1}.bb-capture-toolbar-item .bb-tooltip{background-color:#555;color:#fff;visibility:hidden;font-size:14px;text-align:center;padding:5px 10px;position:absolute;z-index:1;top:45px;left:0;transform:translateX(calc(-50% + 21px));opacity:0;transition:opacity .3s;white-space:nowrap}.bb-capture-toolbar-item .bb-tooltip::after{content:"";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;transform:rotate(180deg);border-color:#555 transparent transparent transparent}.bb-capture-toolbar-item:hover .bb-tooltip{visibility:visible;opacity:1}.bb-anim-fadein{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInUp}.bb-anim-fadeinfromback{overflow:hidden}.bb-anim-fadeinfromback .bb-feedback-dialog-header>div{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInLeft;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-anim-fadeinfromback .bb-feedback-dialog-body{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInLeft;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-anim-fadeinright{overflow:hidden}.bb-anim-fadeinright .bb-feedback-dialog-header>div{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-anim-fadeinright .bb-feedback-dialog-body{animation-duration:.3s;animation-fill-mode:both;animation-name:bbFadeInRight;animation-timing-function:cubic-bezier(.465,.183,.153,.946)}.bb-feedback-dialog-header-close{position:absolute;top:20px;right:20px;display:none;justify-content:center;align-items:center;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-feedback-dialog-header-close svg{width:24px;height:24px}.bb-feedback-button--classic .bb-feedback-dialog-header-close,.bb-feedback-button--disabled .bb-feedback-dialog-header-close{display:flex}.bb-select-capture-options{display:flex}.bb-select-capture-options div:first-of-type{margin-right:5px}.bb-select-capture-options div:last-of-type{margin-left:5px}.bb-select-capture-option{font-family:Inter,sans-serif;background-color:#dee1ea;border-radius:21px;box-sizing:border-box;padding:12px 26px;font-size:16px;line-height:19px;font-weight:600;color:#9b9fae;text-align:center;width:100%;margin-top:0;margin-bottom:0;cursor:pointer;-webkit-tap-highlight-color:transparent}.bb-select-capture-option--active{background-color:#485bff;color:#fff}.bb-capture-options{display:none}.bb-capture-options--active{display:flex}@media only screen and (max-width:450px){.bb-feedback-dialog{width:calc(100% - 20px);box-sizing:border-box;max-width:inherit;position:fixed;bottom:10px;left:10px;right:10px;display:flex;flex-direction:column}.bb-tooltip{display:none!important}.bb-capture-toolbar-item-colorpicker{top:75px}.bb-capture-button-next{margin-left:auto}.bb-capture-dismiss{display:none}.bb-capture-toolbar{top:15px;right:15px;left:15px;width:auto;transform:none}.bb-feedback-dialog-backdrop{display:block;position:fixed;top:0;left:0;width:100vw;height:100vh;height:-webkit-fill-available;z-index:916777230;box-sizing:border-box;pointer-events:none;background-color:rgba(0,0,0,.6)}.bb-capture-editor-drag-info{display:none}.bb-feedback-button--bottomleft .bb-feedback-dialog{left:10px;right:10px}.bb-feedback-dialog-header-close{display:flex}.bb-capture-editor-borderlayer{border-width:4px}.bb-feedback-inputgroup textarea{font-size:16px}.bb-feedback-inputgroup input,.bb-feedback-inputgroup>input{font-size:16px}.bb-feedback-dialog-form .bb-feedback-dialog-body{max-height:calc(100vh - 84px);overflow-y:auto}}.bb-feedback-button--crashed .bb-feedback-button-icon{background-color:#ed4337}.bb-feedback-button--crashed .bb-feedback-button-icon:hover{background-color:#c7372d}.bb-feedback-dialog--crashed .bb-feedback-dialog-header{background:linear-gradient(135deg,#ed4337 0,#c7372d 100%)}.bb-feedback-dialog--crashed .bb-feedback-dialog-header-title{color:#fff}.bb-feedback-dialog--crashed .bb-feedback-send-button{color:#fff}.bb-feedback-dialog--crashed .bb-feedback-send-button{background-color:#ed4337}.bb-feedback-dialog--crashed .bb-feedback-inputgroup--privacy-policy [type=checkbox]:checked+label:after,.bb-feedback-dialog--crashed .bb-feedback-inputgroup--privacy-policy [type=checkbox]:not(:checked)+label:after{color:#ed4337}.bb-feedback-dialog--crashed .bb-form-progress-inner{background-color:#ed433766!important}@media print{.bb-feedback-button{display:none!important}}@keyframes bbFadeOutRight{from{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}@keyframes bbFadeOutDown{from{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}@keyframes bbFadeInUp{from{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}@keyframes bbFadeInOpacity{from{opacity:0}to{opacity:1}}@keyframes bbFadeInLeft{from{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}@keyframes bbFadeInRight{from{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}@keyframes bbFadeOutRight{from{opacity:1}to{opacity:0}}@keyframes bbZoomOut{from{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes bbZoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}} \ No newline at end of file diff --git a/published/latest/index.js b/published/latest/index.js index 968ec8ba..a3546068 100644 --- a/published/latest/index.js +++ b/published/latest/index.js @@ -570,14 +570,14 @@ var deepClone = function deepClone(host) { parent.appendChild(clone); if (node.shadowRoot) { - walkTree(node.shadowRoot.firstChild, clone, shadowNodeId); - handleAdoptedStyleSheets(node.shadowRoot, clone, shadowNodeId); + var rootShadowNodeId = shadowNodeId; + shadowNodeId++; + walkTree(node.shadowRoot.firstChild, clone, rootShadowNodeId); + handleAdoptedStyleSheets(node.shadowRoot, clone, rootShadowNodeId); if (typeof clone.setAttribute !== "undefined") { - clone.setAttribute("bb-shadow-parent", shadowNodeId); + clone.setAttribute("bb-shadow-parent", rootShadowNodeId); } - - ++shadowNodeId; } walkTree(node.firstChild, clone); @@ -6527,7 +6527,7 @@ var Gleap_Gleap = /*#__PURE__*/function () { currentUrl: window.location.href, language: navigator.language || navigator.userLanguage, mobile: isMobile(), - sdkVersion: "6.9.0", + sdkVersion: "6.9.1", sdkType: "javascript" }; } diff --git a/src/ScreenCapture.js b/src/ScreenCapture.js index 8e9c9fc9..0a349b70 100644 --- a/src/ScreenCapture.js +++ b/src/ScreenCapture.js @@ -411,14 +411,14 @@ const deepClone = (host) => { parent.appendChild(clone); if (node.shadowRoot) { - walkTree(node.shadowRoot.firstChild, clone, shadowNodeId); - handleAdoptedStyleSheets(node.shadowRoot, clone, shadowNodeId); + var rootShadowNodeId = shadowNodeId; + shadowNodeId++; + walkTree(node.shadowRoot.firstChild, clone, rootShadowNodeId); + handleAdoptedStyleSheets(node.shadowRoot, clone, rootShadowNodeId); if (typeof clone.setAttribute !== "undefined") { - clone.setAttribute("bb-shadow-parent", shadowNodeId); + clone.setAttribute("bb-shadow-parent", rootShadowNodeId); } - - ++shadowNodeId; } walkTree(node.firstChild, clone);