@seamly/web-ui 20.0.0-beta.2 → 20.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/build/dist/lib/components.js +1 -1
  2. package/build/dist/lib/components.min.js +1 -1
  3. package/build/dist/lib/deprecated-view.css +1 -0
  4. package/build/dist/lib/deprecated-view.js +1 -0
  5. package/build/dist/lib/index.debug.js +95 -61
  6. package/build/dist/lib/index.debug.min.js +1 -1
  7. package/build/dist/lib/index.debug.min.js.LICENSE.txt +24 -12
  8. package/build/dist/lib/style-guide.js +305 -97
  9. package/build/dist/lib/style-guide.min.js +1 -1
  10. package/build/dist/lib/styles-default-implementation.css +1 -0
  11. package/build/dist/lib/styles-default-implementation.js +1 -0
  12. package/build/dist/lib/styles.css +1 -1
  13. package/package.json +8 -7
  14. package/src/.DS_Store +0 -0
  15. package/src/javascripts/api/index.js +19 -10
  16. package/src/javascripts/api/producer.js +5 -3
  17. package/src/javascripts/domains/translations/components/options-button.js +1 -1
  18. package/src/javascripts/index.js +2 -2
  19. package/src/javascripts/lib/engine/index.js +2 -1
  20. package/src/javascripts/lib/parse-body.js +1 -1
  21. package/src/javascripts/package/components.js +1 -1
  22. package/src/javascripts/style-guide/components/app.js +3 -3
  23. package/src/javascripts/style-guide/states.js +345 -69
  24. package/src/javascripts/style-guide/style-guide-engine.js +1 -0
  25. package/src/javascripts/ui/components/app-options/index.js +9 -3
  26. package/src/javascripts/ui/components/conversation/conversation.js +1 -1
  27. package/src/javascripts/ui/components/conversation/event/carousel-message/index.js +3 -1
  28. package/src/javascripts/ui/components/conversation/event/conversation-suggestions.js +12 -3
  29. package/src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js +35 -0
  30. package/src/javascripts/ui/components/conversation/event/participant.js +5 -2
  31. package/src/javascripts/ui/components/conversation/event/splash.js +2 -1
  32. package/src/javascripts/ui/components/conversation/event/text.js +2 -1
  33. package/src/javascripts/ui/components/entry/{toggle-button.js → deprecated-toggle-button.js} +0 -0
  34. package/src/javascripts/ui/components/entry/entry-container.js +1 -1
  35. package/src/javascripts/ui/components/faq/faq.js +162 -0
  36. package/src/javascripts/ui/components/layout/chat-frame.js +1 -1
  37. package/src/javascripts/ui/components/layout/chat.js +62 -0
  38. package/src/javascripts/ui/components/layout/{app-frame.js → deprecated-app-frame.js} +10 -24
  39. package/src/javascripts/ui/components/layout/header.js +1 -1
  40. package/src/javascripts/ui/components/layout/pre-chat-messages.js +2 -8
  41. package/src/javascripts/ui/components/options/options-button.js +2 -2
  42. package/src/javascripts/ui/components/suggestions/index.js +2 -3
  43. package/src/javascripts/ui/components/suggestions/suggestions-list.js +1 -1
  44. package/src/javascripts/ui/components/view/app-view.js +3 -3
  45. package/src/javascripts/ui/components/view/deprecated-view.js +6 -4
  46. package/src/javascripts/ui/components/view/index.js +61 -5
  47. package/src/javascripts/ui/components/view/inline-view.js +15 -4
  48. package/src/javascripts/ui/components/view/window-view/index.js +5 -5
  49. package/src/stylesheets/1-settings/_config.scss +6 -6
  50. package/src/stylesheets/{3-app/_app.scss → 3-chat/_chat.scss} +22 -35
  51. package/src/stylesheets/5-components/_chat-status.scss +1 -5
  52. package/src/stylesheets/5-components/_conversation.scss +3 -3
  53. package/src/stylesheets/5-components/_disclaimer.scss +2 -6
  54. package/src/stylesheets/5-components/_error.scss +20 -10
  55. package/src/stylesheets/5-components/_interrupt.scss +21 -2
  56. package/src/stylesheets/5-components/_message-body.scss +23 -1
  57. package/src/stylesheets/5-components/_message-count.scss +1 -0
  58. package/src/stylesheets/5-components/_message.scss +4 -0
  59. package/src/stylesheets/5-components/_modal.scss +2 -2
  60. package/src/stylesheets/5-components/_options.scss +6 -14
  61. package/src/stylesheets/5-components/_pre-chat-messages.scss +24 -17
  62. package/src/stylesheets/5-components/_suggestions.scss +6 -6
  63. package/src/stylesheets/5-components/_unstarted.scss +22 -36
  64. package/src/stylesheets/6-default-implementation/_hover.scss +153 -0
  65. package/src/stylesheets/{6-webui-only → 6-default-implementation}/_scrollbar.scss +1 -1
  66. package/src/stylesheets/7-deprecated/3-app/_app.scss +8 -8
  67. package/src/stylesheets/7-deprecated/5-components/_error.scss +19 -9
  68. package/src/stylesheets/7-deprecated/5-components/_input.scss +1 -1
  69. package/src/stylesheets/7-deprecated/5-components/_message.scss +1 -1
  70. package/src/stylesheets/7-deprecated/5-components/_modal.scss +1 -1
  71. package/src/stylesheets/7-deprecated/5-components/_options.scss +8 -10
  72. package/src/stylesheets/style-guide.scss +1 -1
  73. package/src/stylesheets/styles-default-implementation.scss +3 -0
  74. package/src/stylesheets/styles.scss +8 -9
  75. package/webpack/config.common.js +7 -1
  76. package/webpack/config.package.js +9 -1
  77. package/webpack/config.test.js +1 -0
  78. package/webpack/defaults.js +3 -6
  79. package/CHANGELOG.md +0 -625
  80. package/build/dist/lib/index.js +0 -25513
  81. package/build/dist/lib/index.min.js +0 -2
  82. package/build/dist/lib/index.min.js.LICENSE.txt +0 -9
  83. package/build/dist/lib/standalone.js +0 -34474
  84. package/build/dist/lib/standalone.min.js +0 -2
  85. package/build/dist/lib/standalone.min.js.LICENSE.txt +0 -4
  86. package/src/javascripts/ui/components/layout/modal-wrapper.js +0 -0
  87. package/src/stylesheets/6-webui-only/_hover.scss +0 -151
  88. package/src/stylesheets/styles-webui-only.scss +0 -3
@@ -62,16 +62,6 @@ eval("/**\n * This is the common logic for both the Node.js and web browser\n *
62
62
 
63
63
  /***/ }),
64
64
 
65
- /***/ "./node_modules/marked/lib/marked.js":
66
- /*!*******************************************!*\
67
- !*** ./node_modules/marked/lib/marked.js ***!
68
- \*******************************************/
69
- /***/ (function(module) {
70
-
71
- eval("/**\n * marked - a markdown parser\n * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n(function (global, factory) {\n true ? module.exports = factory() : 0;\n})(this, function () {\n 'use strict';\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _createForOfIteratorHelperLoose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n if (it) return (it = it.call(o)).next.bind(it);\n\n if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n return function () {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n var defaults$5 = {\n exports: {}\n };\n\n function getDefaults$1() {\n return {\n baseUrl: null,\n breaks: false,\n extensions: null,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: null,\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartLists: false,\n smartypants: false,\n tokenizer: null,\n walkTokens: null,\n xhtml: false\n };\n }\n\n function changeDefaults$1(newDefaults) {\n defaults$5.exports.defaults = newDefaults;\n }\n\n defaults$5.exports = {\n defaults: getDefaults$1(),\n getDefaults: getDefaults$1,\n changeDefaults: changeDefaults$1\n };\n /**\n * Helpers\n */\n\n var escapeTest = /[&<>\"']/;\n var escapeReplace = /[&<>\"']/g;\n var escapeTestNoEncode = /[<>\"']|&(?!#?\\w+;)/;\n var escapeReplaceNoEncode = /[<>\"']|&(?!#?\\w+;)/g;\n var escapeReplacements = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n };\n\n var getEscapeReplacement = function getEscapeReplacement(ch) {\n return escapeReplacements[ch];\n };\n\n function escape$2(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n } else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n }\n\n var unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n function unescape$1(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, function (_, n) {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));\n }\n\n return '';\n });\n }\n\n var caret = /(^|[^\\[])\\^/g;\n\n function edit$1(regex, opt) {\n regex = regex.source || regex;\n opt = opt || '';\n var obj = {\n replace: function replace(name, val) {\n val = val.source || val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: function getRegex() {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n }\n\n var nonWordAndColonTest = /[^\\w:]/g;\n var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n function cleanUrl$1(sanitize, base, href) {\n if (sanitize) {\n var prot;\n\n try {\n prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, '').toLowerCase();\n } catch (e) {\n return null;\n }\n\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return null;\n }\n }\n\n if (base && !originIndependentUrl.test(href)) {\n href = resolveUrl(base, href);\n }\n\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return null;\n }\n\n return href;\n }\n\n var baseUrls = {};\n var justDomain = /^[^:]+:\\/*[^/]*$/;\n var protocol = /^([^:]+:)[\\s\\S]*$/;\n var domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n function resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (justDomain.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = rtrim$1(base, '/', true);\n }\n }\n\n base = baseUrls[' ' + base];\n var relativeBase = base.indexOf(':') === -1;\n\n if (href.substring(0, 2) === '//') {\n if (relativeBase) {\n return href;\n }\n\n return base.replace(protocol, '$1') + href;\n } else if (href.charAt(0) === '/') {\n if (relativeBase) {\n return href;\n }\n\n return base.replace(domain, '$1') + href;\n } else {\n return base + href;\n }\n }\n\n var noopTest$1 = {\n exec: function noopTest() {}\n };\n\n function merge$2(obj) {\n var i = 1,\n target,\n key;\n\n for (; i < arguments.length; i++) {\n target = arguments[i];\n\n for (key in target) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n obj[key] = target[key];\n }\n }\n }\n\n return obj;\n }\n\n function splitCells$1(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n var row = tableRow.replace(/\\|/g, function (match, offset, str) {\n var escaped = false,\n curr = offset;\n\n while (--curr >= 0 && str[curr] === '\\\\') {\n escaped = !escaped;\n }\n\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(/ \\|/);\n var i = 0; // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n\n if (!cells[0].trim()) {\n cells.shift();\n }\n\n if (!cells[cells.length - 1].trim()) {\n cells.pop();\n }\n\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) {\n cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n\n return cells;\n } // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n // /c*$/ is vulnerable to REDOS.\n // invert: Remove suffix of non-c chars instead. Default falsey.\n\n\n function rtrim$1(str, c, invert) {\n var l = str.length;\n\n if (l === 0) {\n return '';\n } // Length of suffix matching the invert condition.\n\n\n var suffLen = 0; // Step left until we fail to match the invert condition.\n\n while (suffLen < l) {\n var currChar = str.charAt(l - suffLen - 1);\n\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.substr(0, l - suffLen);\n }\n\n function findClosingBracket$1(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n var l = str.length;\n var level = 0,\n i = 0;\n\n for (; i < l; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n\n if (level < 0) {\n return i;\n }\n }\n }\n\n return -1;\n }\n\n function checkSanitizeDeprecation$1(opt) {\n if (opt && opt.sanitize && !opt.silent) {\n console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n }\n } // copied from https://stackoverflow.com/a/5450113/806777\n\n\n function repeatString$1(pattern, count) {\n if (count < 1) {\n return '';\n }\n\n var result = '';\n\n while (count > 1) {\n if (count & 1) {\n result += pattern;\n }\n\n count >>= 1;\n pattern += pattern;\n }\n\n return result + pattern;\n }\n\n var helpers = {\n escape: escape$2,\n unescape: unescape$1,\n edit: edit$1,\n cleanUrl: cleanUrl$1,\n resolveUrl: resolveUrl,\n noopTest: noopTest$1,\n merge: merge$2,\n splitCells: splitCells$1,\n rtrim: rtrim$1,\n findClosingBracket: findClosingBracket$1,\n checkSanitizeDeprecation: checkSanitizeDeprecation$1,\n repeatString: repeatString$1\n };\n var defaults$4 = defaults$5.exports.defaults;\n var rtrim = helpers.rtrim,\n splitCells = helpers.splitCells,\n _escape = helpers.escape,\n findClosingBracket = helpers.findClosingBracket;\n\n function outputLink(cap, link, raw, lexer) {\n var href = link.href;\n var title = link.title ? _escape(link.title) : null;\n var text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n var token = {\n type: 'link',\n raw: raw,\n href: href,\n title: title,\n text: text,\n tokens: lexer.inlineTokens(text, [])\n };\n lexer.state.inLink = false;\n return token;\n } else {\n return {\n type: 'image',\n raw: raw,\n href: href,\n title: title,\n text: _escape(text)\n };\n }\n }\n\n function indentCodeCompensation(raw, text) {\n var matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n var indentToCode = matchIndentToCode[1];\n return text.split('\\n').map(function (node) {\n var matchIndentInNode = node.match(/^\\s+/);\n\n if (matchIndentInNode === null) {\n return node;\n }\n\n var indentInNode = matchIndentInNode[0];\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n }).join('\\n');\n }\n /**\n * Tokenizer\n */\n\n\n var Tokenizer_1 = /*#__PURE__*/function () {\n function Tokenizer(options) {\n this.options = options || defaults$4;\n }\n\n var _proto = Tokenizer.prototype;\n\n _proto.space = function space(src) {\n var cap = this.rules.block.newline.exec(src);\n\n if (cap) {\n if (cap[0].length > 1) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n\n return {\n raw: '\\n'\n };\n }\n };\n\n _proto.code = function code(src) {\n var cap = this.rules.block.code.exec(src);\n\n if (cap) {\n var text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic ? rtrim(text, '\\n') : text\n };\n }\n };\n\n _proto.fences = function fences(src) {\n var cap = this.rules.block.fences.exec(src);\n\n if (cap) {\n var raw = cap[0];\n var text = indentCodeCompensation(raw, cap[3] || '');\n return {\n type: 'code',\n raw: raw,\n lang: cap[2] ? cap[2].trim() : cap[2],\n text: text\n };\n }\n };\n\n _proto.heading = function heading(src) {\n var cap = this.rules.block.heading.exec(src);\n\n if (cap) {\n var text = cap[2].trim(); // remove trailing #s\n\n if (/#$/.test(text)) {\n var trimmed = rtrim(text, '#');\n\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n var token = {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text: text,\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n };\n\n _proto.hr = function hr(src) {\n var cap = this.rules.block.hr.exec(src);\n\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n };\n\n _proto.blockquote = function blockquote(src) {\n var cap = this.rules.block.blockquote.exec(src);\n\n if (cap) {\n var text = cap[0].replace(/^ *> ?/gm, '');\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens: this.lexer.blockTokens(text, []),\n text: text\n };\n }\n };\n\n _proto.list = function list(src) {\n var cap = this.rules.block.list.exec(src);\n\n if (cap) {\n var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, lines, itemContents;\n var bull = cap[1].trim();\n var isordered = bull.length > 1;\n var list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n bull = isordered ? \"\\\\d{1,9}\\\\\" + bull.slice(-1) : \"\\\\\" + bull;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n } // Get next list item\n\n\n var itemRegex = new RegExp(\"^( {0,3}\" + bull + \")((?: [^\\\\n]*| *)(?:\\\\n[^\\\\n]*)*(?:\\\\n|$))\"); // Get each top-level item\n\n while (src) {\n if (this.rules.block.hr.test(src)) {\n // End list if we encounter an HR (possibly move into itemRegex?)\n break;\n }\n\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n lines = cap[2].split('\\n');\n\n if (this.options.pedantic) {\n indent = 2;\n itemContents = lines[0].trimLeft();\n } else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n\n indent = cap[1].length + (indent > 4 ? 1 : indent); // intented code blocks after 4 spaces; indent is always 1\n\n itemContents = lines[0].slice(indent - cap[1].length);\n }\n\n blankLine = false;\n raw = cap[0];\n\n if (!lines[0] && /^ *$/.test(lines[1])) {\n // items begin with at most one blank line\n raw = cap[1] + lines.slice(0, 2).join('\\n') + '\\n';\n list.loose = true;\n lines = [];\n }\n\n var nextBulletRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}(?:[*+-]|\\\\d{1,9}[.)])\");\n\n for (i = 1; i < lines.length; i++) {\n line = lines[i];\n\n if (this.options.pedantic) {\n // Re-align to follow commonmark nesting rules\n line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n } // End list item if found start of new bullet\n\n\n if (nextBulletRegex.test(line)) {\n raw = cap[1] + lines.slice(0, i).join('\\n') + '\\n';\n break;\n } // Until we encounter a blank line, item contents do not need indentation\n\n\n if (!blankLine) {\n if (!line.trim()) {\n // Check if current line is empty\n blankLine = true;\n } // Dedent if possible\n\n\n if (line.search(/[^ ]/) >= indent) {\n itemContents += '\\n' + line.slice(indent);\n } else {\n itemContents += '\\n' + line;\n }\n\n continue;\n } // Dedent this line\n\n\n if (line.search(/[^ ]/) >= indent || !line.trim()) {\n itemContents += '\\n' + line.slice(indent);\n continue;\n } else {\n // Line was not properly indented; end of this item\n raw = cap[1] + lines.slice(0, i).join('\\n') + '\\n';\n break;\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n } // Check for task list items\n\n\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw: raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents\n });\n list.raw += raw;\n src = src.slice(raw.length);\n } // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n\n\n list.items[list.items.length - 1].raw = raw.trimRight();\n list.items[list.items.length - 1].text = itemContents.trimRight();\n list.raw = list.raw.trimRight();\n var l = list.items.length; // Item child tokens handled here at end because we needed to have the final item to trim it first\n\n for (i = 0; i < l; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n\n if (list.items[i].tokens.some(function (t) {\n return t.type === 'space';\n })) {\n list.loose = true;\n list.items[i].loose = true;\n }\n }\n\n return list;\n }\n };\n\n _proto.html = function html(src) {\n var cap = this.rules.block.html.exec(src);\n\n if (cap) {\n var token = {\n type: 'html',\n raw: cap[0],\n pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: cap[0]\n };\n\n if (this.options.sanitize) {\n token.type = 'paragraph';\n token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]);\n token.tokens = [];\n this.lexer.inline(token.text, token.tokens);\n }\n\n return token;\n }\n };\n\n _proto.def = function def(src) {\n var cap = this.rules.block.def.exec(src);\n\n if (cap) {\n if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);\n var tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n return {\n type: 'def',\n tag: tag,\n raw: cap[0],\n href: cap[2],\n title: cap[3]\n };\n }\n };\n\n _proto.table = function table(src) {\n var cap = this.rules.block.table.exec(src);\n\n if (cap) {\n var item = {\n type: 'table',\n header: splitCells(cap[1]).map(function (c) {\n return {\n text: c\n };\n }),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n rows: cap[3] ? cap[3].replace(/\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n item.raw = cap[0];\n var l = item.align.length;\n var i, j, k, row;\n\n for (i = 0; i < l; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n l = item.rows.length;\n\n for (i = 0; i < l; i++) {\n item.rows[i] = splitCells(item.rows[i], item.header.length).map(function (c) {\n return {\n text: c\n };\n });\n } // parse child tokens inside headers and cells\n // header child tokens\n\n\n l = item.header.length;\n\n for (j = 0; j < l; j++) {\n item.header[j].tokens = [];\n this.lexer.inlineTokens(item.header[j].text, item.header[j].tokens);\n } // cell child tokens\n\n\n l = item.rows.length;\n\n for (j = 0; j < l; j++) {\n row = item.rows[j];\n\n for (k = 0; k < row.length; k++) {\n row[k].tokens = [];\n this.lexer.inlineTokens(row[k].text, row[k].tokens);\n }\n }\n\n return item;\n }\n }\n };\n\n _proto.lheading = function lheading(src) {\n var cap = this.rules.block.lheading.exec(src);\n\n if (cap) {\n var token = {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n };\n\n _proto.paragraph = function paragraph(src) {\n var cap = this.rules.block.paragraph.exec(src);\n\n if (cap) {\n var token = {\n type: 'paragraph',\n raw: cap[0],\n text: cap[1].charAt(cap[1].length - 1) === '\\n' ? cap[1].slice(0, -1) : cap[1],\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n };\n\n _proto.text = function text(src) {\n var cap = this.rules.block.text.exec(src);\n\n if (cap) {\n var token = {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n };\n\n _proto.escape = function escape(src) {\n var cap = this.rules.inline.escape.exec(src);\n\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: _escape(cap[1])\n };\n }\n };\n\n _proto.tag = function tag(src) {\n var cap = this.rules.inline.tag.exec(src);\n\n if (cap) {\n if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: this.options.sanitize ? 'text' : 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]\n };\n }\n };\n\n _proto.link = function link(src) {\n var cap = this.rules.inline.link.exec(src);\n\n if (cap) {\n var trimmedUrl = cap[2].trim();\n\n if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!/>$/.test(trimmedUrl)) {\n return;\n } // ending angle bracket cannot be escaped\n\n\n var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n var lastParenIndex = findClosingBracket(cap[2], '()');\n\n if (lastParenIndex > -1) {\n var start = cap[0].indexOf('!') === 0 ? 5 : 4;\n var linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n\n var href = cap[2];\n var title = '';\n\n if (this.options.pedantic) {\n // split pedantic href and title\n var link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n\n if (/^</.test(href)) {\n if (this.options.pedantic && !/>$/.test(trimmedUrl)) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n }, cap[0], this.lexer);\n }\n };\n\n _proto.reflink = function reflink(src, links) {\n var cap;\n\n if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {\n var link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = links[link.toLowerCase()];\n\n if (!link || !link.href) {\n var text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text: text\n };\n }\n\n return outputLink(cap, link, cap[0], this.lexer);\n }\n };\n\n _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {\n if (prevChar === void 0) {\n prevChar = '';\n }\n\n var match = this.rules.inline.emStrong.lDelim.exec(src);\n if (!match) return; // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n\n if (match[3] && prevChar.match(/(?:[0-9A-Za-z\\xAA\\xB2\\xB3\\xB5\\xB9\\xBA\\xBC-\\xBE\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u0660-\\u0669\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07C0-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08C7\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0966-\\u096F\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09E6-\\u09F1\\u09F4-\\u09F9\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A6F\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AE6-\\u0AEF\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71-\\u0B77\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0BE6-\\u0BF2\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D58-\\u0D61\\u0D66-\\u0D78\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DE6-\\u0DEF\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F20-\\u0F33\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F-\\u1049\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u1090-\\u1099\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1369-\\u137C\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B50-\\u1B59\\u1B83-\\u1BA0\\u1BAE-\\u1BE5\\u1C00-\\u1C23\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2070\\u2071\\u2074-\\u2079\\u207F-\\u2089\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2150-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2CFD\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u3192-\\u3195\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DBF\\u4E00-\\u9FFC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7BF\\uA7C2-\\uA7CA\\uA7F5-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA830-\\uA835\\uA840-\\uA873\\uA882-\\uA8B3\\uA8D0-\\uA8D9\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA900-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF-\\uA9D9\\uA9E0-\\uA9E4\\uA9E6-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE1-\\uDEFB\\uDF00-\\uDF23\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC58-\\uDC76\\uDC79-\\uDC9E\\uDCA7-\\uDCAF\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDD1B\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE40-\\uDE48\\uDE60-\\uDE7E\\uDE80-\\uDE9F\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDEEB-\\uDEEF\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF58-\\uDF72\\uDF78-\\uDF91\\uDFA9-\\uDFAF]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDD23\\uDD30-\\uDD39\\uDE60-\\uDE7E\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF27\\uDF30-\\uDF45\\uDF51-\\uDF54\\uDFB0-\\uDFCB\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC52-\\uDC6F\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD03-\\uDD26\\uDD36-\\uDD3F\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDD0-\\uDDDA\\uDDDC\\uDDE1-\\uDDF4\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDEF0-\\uDEF9\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC50-\\uDC59\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEAA\\uDEB8\\uDEC0-\\uDEC9\\uDF00-\\uDF1A\\uDF30-\\uDF3B]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCF2\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDD50-\\uDD59\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC50-\\uDC6C\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD50-\\uDD59\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDDA0-\\uDDA9\\uDEE0-\\uDEF2\\uDFB0\\uDFC0-\\uDFD4]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE96\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82C[\\uDC00-\\uDD1E\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD834[\\uDEE0-\\uDEF3\\uDF60-\\uDF78]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD838[\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD40-\\uDD49\\uDD4E\\uDEC0-\\uDEEB\\uDEF0-\\uDEF9]|\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCCF\\uDD00-\\uDD43\\uDD4B\\uDD50-\\uDD59]|\\uD83B[\\uDC71-\\uDCAB\\uDCAD-\\uDCAF\\uDCB1-\\uDCB4\\uDD01-\\uDD2D\\uDD2F-\\uDD3D\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD00-\\uDD0C]|\\uD83E[\\uDFF0-\\uDFF9]|\\uD869[\\uDC00-\\uDEDD\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A])/)) return;\n var nextChar = match[1] || match[2] || '';\n\n if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {\n var lLength = match[0].length - 1;\n var rDelim,\n rLength,\n delimTotal = lLength,\n midDelimTotal = 0;\n var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n endReg.lastIndex = 0; // Clip maskedSrc to same section of string as src (move to lexer?)\n\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = rDelim.length;\n\n if (match[3] || match[4]) {\n // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) {\n // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n // Remove extra characters. *a*** -> *a*\n\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // Create `em` if smallest delimiter has odd char count. *a***\n\n if (Math.min(lLength, rLength) % 2) {\n var _text = src.slice(1, lLength + match.index + rLength);\n\n return {\n type: 'em',\n raw: src.slice(0, lLength + match.index + rLength + 1),\n text: _text,\n tokens: this.lexer.inlineTokens(_text, [])\n };\n } // Create 'strong' if smallest delimiter has even char count. **a***\n\n\n var text = src.slice(2, lLength + match.index + rLength - 1);\n return {\n type: 'strong',\n raw: src.slice(0, lLength + match.index + rLength + 1),\n text: text,\n tokens: this.lexer.inlineTokens(text, [])\n };\n }\n }\n };\n\n _proto.codespan = function codespan(src) {\n var cap = this.rules.inline.code.exec(src);\n\n if (cap) {\n var text = cap[2].replace(/\\n/g, ' ');\n var hasNonSpaceChars = /[^ ]/.test(text);\n var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n\n text = _escape(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text: text\n };\n }\n };\n\n _proto.br = function br(src) {\n var cap = this.rules.inline.br.exec(src);\n\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n };\n\n _proto.del = function del(src) {\n var cap = this.rules.inline.del.exec(src);\n\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2], [])\n };\n }\n };\n\n _proto.autolink = function autolink(src, mangle) {\n var cap = this.rules.inline.autolink.exec(src);\n\n if (cap) {\n var text, href;\n\n if (cap[2] === '@') {\n text = _escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n href = 'mailto:' + text;\n } else {\n text = _escape(cap[1]);\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text: text,\n href: href,\n tokens: [{\n type: 'text',\n raw: text,\n text: text\n }]\n };\n }\n };\n\n _proto.url = function url(src, mangle) {\n var cap;\n\n if (cap = this.rules.inline.url.exec(src)) {\n var text, href;\n\n if (cap[2] === '@') {\n text = _escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n var prevCapZero;\n\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n\n text = _escape(cap[0]);\n\n if (cap[1] === 'www.') {\n href = 'http://' + text;\n } else {\n href = text;\n }\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text: text,\n href: href,\n tokens: [{\n type: 'text',\n raw: text,\n text: text\n }]\n };\n }\n };\n\n _proto.inlineText = function inlineText(src, smartypants) {\n var cap = this.rules.inline.text.exec(src);\n\n if (cap) {\n var text;\n\n if (this.lexer.state.inRawBlock) {\n text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0];\n } else {\n text = _escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n }\n\n return {\n type: 'text',\n raw: cap[0],\n text: text\n };\n }\n };\n\n return Tokenizer;\n }();\n\n var noopTest = helpers.noopTest,\n edit = helpers.edit,\n merge$1 = helpers.merge;\n /**\n * Block-Level Grammar\n */\n\n var block$1 = {\n newline: /^(?: *(?:\\n|$))+/,\n code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n fences: /^ {0,3}(`{3,}(?=[^`\\n]*\\n)|~{3,})([^\\n]*)\\n(?:|([\\s\\S]*?)\\n)(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3}bull)( [^\\n]+?)?(?:\\n|$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *\\n? *<?([^\\s>]+)>?(?:(?: +\\n? *| *\\n *)(title))? *(?:\\n+|$)/,\n table: noopTest,\n lheading: /^([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html| +\\n)[^\\n]+)*)/,\n text: /^[^\\n]+/\n };\n block$1._label = /(?!\\s*\\])(?:\\\\[\\[\\]]|[^\\[\\]])+/;\n block$1._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\n block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex();\n block$1.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\n block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex();\n block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))').replace('def', '\\\\n+(?=' + block$1.def.source + ')').getRegex();\n block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';\n block$1._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\n block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex();\n block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex();\n /**\n * Normal Block Grammar\n */\n\n block$1.normal = merge$1({}, block$1);\n /**\n * GFM Block Grammar\n */\n\n block$1.gfm = merge$1({}, block$1.normal, {\n table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n\n });\n block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n /**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\n block$1.pedantic = merge$1({}, block$1.normal, {\n html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)' + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b').getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest,\n // fences not supported\n paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()\n });\n /**\n * Inline-Level Grammar\n */\n\n var inline$1 = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment' + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>',\n // CDATA section\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(?!\\s*\\])((?:\\\\[\\[\\]]?|[^\\[\\]\\\\])+)\\]/,\n nolink: /^!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?/,\n reflinkSearch: 'reflink|nolink(?!\\\\()',\n emStrong: {\n lDelim: /^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,\n // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.\n // () Skip orphan delim inside strong (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a\n rDelimAst: /^[^_*]*?\\_\\_[^_*]*?\\*[^_*]*?(?=\\_\\_)|[punct_](\\*+)(?=[\\s]|$)|[^punct*_\\s](\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|[^punct*_\\s](\\*+)(?=[^punct*_\\s])/,\n rDelimUnd: /^[^_*]*?\\*\\*[^_*]*?\\_[^_*]*?(?=\\*\\*)|[punct*](\\_+)(?=[\\s]|$)|[^punct*_\\s](\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/ // ^- Not allowed for _\n\n },\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n punctuation: /^([\\spunctuation])/\n }; // list of punctuation marks from CommonMark spec\n // without * and _ to handle the different emphasis markers * and _\n\n inline$1._punctuation = '!\"#$%&\\'()+\\\\-.,/:;<=>?@\\\\[\\\\]`^{|}~';\n inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>\n\n inline$1.blockSkip = /\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g;\n inline$1.escapedEmSt = /\\\\\\*|\\\\_/g;\n inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex();\n inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex();\n inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex();\n inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex();\n inline$1._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\n inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\n inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\n inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex();\n inline$1._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex();\n inline$1._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\n inline$1._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\n inline$1._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex();\n inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex();\n inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex();\n /**\n * Normal Inline Grammar\n */\n\n inline$1.normal = merge$1({}, inline$1);\n /**\n * Pedantic Inline Grammar\n */\n\n inline$1.pedantic = merge$1({}, inline$1.normal, {\n strong: {\n start: /^__|\\*\\*/,\n middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n endAst: /\\*\\*(?!\\*)/g,\n endUnd: /__(?!_)/g\n },\n em: {\n start: /^_|\\*/,\n middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n endAst: /\\*(?!\\*)/g,\n endUnd: /_(?!_)/g\n },\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/).replace('label', inline$1._label).getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace('label', inline$1._label).getRegex()\n });\n /**\n * GFM Inline Grammar\n */\n\n inline$1.gfm = merge$1({}, inline$1.normal, {\n escape: edit(inline$1.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n });\n inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex();\n /**\n * GFM + Line Breaks Inline Grammar\n */\n\n inline$1.breaks = merge$1({}, inline$1.gfm, {\n br: edit(inline$1.br).replace('{2,}', '*').getRegex(),\n text: edit(inline$1.gfm.text).replace('\\\\b_', '\\\\b_| {2,}\\\\n').replace(/\\{2,\\}/g, '*').getRegex()\n });\n var rules = {\n block: block$1,\n inline: inline$1\n };\n var Tokenizer$1 = Tokenizer_1;\n var defaults$3 = defaults$5.exports.defaults;\n var block = rules.block,\n inline = rules.inline;\n var repeatString = helpers.repeatString;\n /**\n * smartypants text replacement\n */\n\n function smartypants(text) {\n return text // em-dashes\n .replace(/---/g, \"\\u2014\") // en-dashes\n .replace(/--/g, \"\\u2013\") // opening singles\n .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, \"$1\\u2018\") // closing singles & apostrophes\n .replace(/'/g, \"\\u2019\") // opening doubles\n .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, \"$1\\u201C\") // closing doubles\n .replace(/\"/g, \"\\u201D\") // ellipses\n .replace(/\\.{3}/g, \"\\u2026\");\n }\n /**\n * mangle email addresses\n */\n\n\n function mangle(text) {\n var out = '',\n i,\n ch;\n var l = text.length;\n\n for (i = 0; i < l; i++) {\n ch = text.charCodeAt(i);\n\n if (Math.random() > 0.5) {\n ch = 'x' + ch.toString(16);\n }\n\n out += '&#' + ch + ';';\n }\n\n return out;\n }\n /**\n * Block Lexer\n */\n\n\n var Lexer_1 = /*#__PURE__*/function () {\n function Lexer(options) {\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || defaults$3;\n this.options.tokenizer = this.options.tokenizer || new Tokenizer$1();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n var rules = {\n block: block.normal,\n inline: inline.normal\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n\n this.tokenizer.rules = rules;\n }\n /**\n * Expose Rules\n */\n\n /**\n * Static Lex Method\n */\n\n\n Lexer.lex = function lex(src, options) {\n var lexer = new Lexer(options);\n return lexer.lex(src);\n }\n /**\n * Static Lex Inline Method\n */\n ;\n\n Lexer.lexInline = function lexInline(src, options) {\n var lexer = new Lexer(options);\n return lexer.inlineTokens(src);\n }\n /**\n * Preprocessing\n */\n ;\n\n var _proto = Lexer.prototype;\n\n _proto.lex = function lex(src) {\n src = src.replace(/\\r\\n|\\r/g, '\\n').replace(/\\t/g, ' ');\n this.blockTokens(src, this.tokens);\n var next;\n\n while (next = this.inlineQueue.shift()) {\n this.inlineTokens(next.src, next.tokens);\n }\n\n return this.tokens;\n }\n /**\n * Lexing\n */\n ;\n\n _proto.blockTokens = function blockTokens(src, tokens) {\n var _this = this;\n\n if (tokens === void 0) {\n tokens = [];\n }\n\n if (this.options.pedantic) {\n src = src.replace(/^ +$/gm, '');\n }\n\n var token, lastToken, cutSrc, lastParagraphClipped;\n\n while (src) {\n if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) {\n if (token = extTokenizer.call({\n lexer: _this\n }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n\n return false;\n })) {\n continue;\n } // newline\n\n\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n\n if (token.type) {\n tokens.push(token);\n }\n\n continue;\n } // code\n\n\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.\n\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n\n continue;\n } // fences\n\n\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // heading\n\n\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // hr\n\n\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // blockquote\n\n\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // list\n\n\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // html\n\n\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // def\n\n\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n\n continue;\n } // table (gfm)\n\n\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // lheading\n\n\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n\n\n cutSrc = src;\n\n if (this.options.extensions && this.options.extensions.startBlock) {\n (function () {\n var startIndex = Infinity;\n var tempSrc = src.slice(1);\n var tempStart = void 0;\n\n _this.options.extensions.startBlock.forEach(function (getStartIndex) {\n tempStart = getStartIndex.call({\n lexer: this\n }, tempSrc);\n\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n })();\n }\n\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n } // text\n\n\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n\n continue;\n }\n\n if (src) {\n var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n };\n\n _proto.inline = function inline(src, tokens) {\n this.inlineQueue.push({\n src: src,\n tokens: tokens\n });\n }\n /**\n * Lexing/Compiling\n */\n ;\n\n _proto.inlineTokens = function inlineTokens(src, tokens) {\n var _this2 = this;\n\n if (tokens === void 0) {\n tokens = [];\n }\n\n var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong\n\n var maskedSrc = src;\n var match;\n var keepPrevChar, prevChar; // Mask out reflinks\n\n if (this.tokens.links) {\n var links = Object.keys(this.tokens.links);\n\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n } // Mask out other blocks\n\n\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n } // Mask out escaped em & strong delimiters\n\n\n while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);\n }\n\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n\n keepPrevChar = false; // extensions\n\n if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) {\n if (token = extTokenizer.call({\n lexer: _this2\n }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n\n return false;\n })) {\n continue;\n } // escape\n\n\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // tag\n\n\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n\n continue;\n } // link\n\n\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // reflink, nolink\n\n\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n\n continue;\n } // em & strong\n\n\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // code\n\n\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // br\n\n\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // del (gfm)\n\n\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // autolink\n\n\n if (token = this.tokenizer.autolink(src, mangle)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // url (gfm)\n\n\n if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n } // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n\n\n cutSrc = src;\n\n if (this.options.extensions && this.options.extensions.startInline) {\n (function () {\n var startIndex = Infinity;\n var tempSrc = src.slice(1);\n var tempStart = void 0;\n\n _this2.options.extensions.startInline.forEach(function (getStartIndex) {\n tempStart = getStartIndex.call({\n lexer: this\n }, tempSrc);\n\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n })();\n }\n\n if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n src = src.substring(token.raw.length);\n\n if (token.raw.slice(-1) !== '_') {\n // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n\n continue;\n }\n\n if (src) {\n var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n };\n\n _createClass(Lexer, null, [{\n key: \"rules\",\n get: function get() {\n return {\n block: block,\n inline: inline\n };\n }\n }]);\n\n return Lexer;\n }();\n\n var defaults$2 = defaults$5.exports.defaults;\n var cleanUrl = helpers.cleanUrl,\n escape$1 = helpers.escape;\n /**\n * Renderer\n */\n\n var Renderer_1 = /*#__PURE__*/function () {\n function Renderer(options) {\n this.options = options || defaults$2;\n }\n\n var _proto = Renderer.prototype;\n\n _proto.code = function code(_code, infostring, escaped) {\n var lang = (infostring || '').match(/\\S*/)[0];\n\n if (this.options.highlight) {\n var out = this.options.highlight(_code, lang);\n\n if (out != null && out !== _code) {\n escaped = true;\n _code = out;\n }\n }\n\n _code = _code.replace(/\\n$/, '') + '\\n';\n\n if (!lang) {\n return '<pre><code>' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\\n';\n }\n\n return '<pre><code class=\"' + this.options.langPrefix + escape$1(lang, true) + '\">' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\\n';\n };\n\n _proto.blockquote = function blockquote(quote) {\n return '<blockquote>\\n' + quote + '</blockquote>\\n';\n };\n\n _proto.html = function html(_html) {\n return _html;\n };\n\n _proto.heading = function heading(text, level, raw, slugger) {\n if (this.options.headerIds) {\n return '<h' + level + ' id=\"' + this.options.headerPrefix + slugger.slug(raw) + '\">' + text + '</h' + level + '>\\n';\n } // ignore IDs\n\n\n return '<h' + level + '>' + text + '</h' + level + '>\\n';\n };\n\n _proto.hr = function hr() {\n return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n };\n\n _proto.list = function list(body, ordered, start) {\n var type = ordered ? 'ol' : 'ul',\n startatt = ordered && start !== 1 ? ' start=\"' + start + '\"' : '';\n return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n };\n\n _proto.listitem = function listitem(text) {\n return '<li>' + text + '</li>\\n';\n };\n\n _proto.checkbox = function checkbox(checked) {\n return '<input ' + (checked ? 'checked=\"\" ' : '') + 'disabled=\"\" type=\"checkbox\"' + (this.options.xhtml ? ' /' : '') + '> ';\n };\n\n _proto.paragraph = function paragraph(text) {\n return '<p>' + text + '</p>\\n';\n };\n\n _proto.table = function table(header, body) {\n if (body) body = '<tbody>' + body + '</tbody>';\n return '<table>\\n' + '<thead>\\n' + header + '</thead>\\n' + body + '</table>\\n';\n };\n\n _proto.tablerow = function tablerow(content) {\n return '<tr>\\n' + content + '</tr>\\n';\n };\n\n _proto.tablecell = function tablecell(content, flags) {\n var type = flags.header ? 'th' : 'td';\n var tag = flags.align ? '<' + type + ' align=\"' + flags.align + '\">' : '<' + type + '>';\n return tag + content + '</' + type + '>\\n';\n } // span level renderer\n ;\n\n _proto.strong = function strong(text) {\n return '<strong>' + text + '</strong>';\n };\n\n _proto.em = function em(text) {\n return '<em>' + text + '</em>';\n };\n\n _proto.codespan = function codespan(text) {\n return '<code>' + text + '</code>';\n };\n\n _proto.br = function br() {\n return this.options.xhtml ? '<br/>' : '<br>';\n };\n\n _proto.del = function del(text) {\n return '<del>' + text + '</del>';\n };\n\n _proto.link = function link(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n\n if (href === null) {\n return text;\n }\n\n var out = '<a href=\"' + escape$1(href) + '\"';\n\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n\n out += '>' + text + '</a>';\n return out;\n };\n\n _proto.image = function image(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n\n if (href === null) {\n return text;\n }\n\n var out = '<img src=\"' + href + '\" alt=\"' + text + '\"';\n\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n\n out += this.options.xhtml ? '/>' : '>';\n return out;\n };\n\n _proto.text = function text(_text) {\n return _text;\n };\n\n return Renderer;\n }();\n /**\n * TextRenderer\n * returns only the textual part of the token\n */\n\n\n var TextRenderer_1 = /*#__PURE__*/function () {\n function TextRenderer() {}\n\n var _proto = TextRenderer.prototype; // no need for block level renderers\n\n _proto.strong = function strong(text) {\n return text;\n };\n\n _proto.em = function em(text) {\n return text;\n };\n\n _proto.codespan = function codespan(text) {\n return text;\n };\n\n _proto.del = function del(text) {\n return text;\n };\n\n _proto.html = function html(text) {\n return text;\n };\n\n _proto.text = function text(_text) {\n return _text;\n };\n\n _proto.link = function link(href, title, text) {\n return '' + text;\n };\n\n _proto.image = function image(href, title, text) {\n return '' + text;\n };\n\n _proto.br = function br() {\n return '';\n };\n\n return TextRenderer;\n }();\n /**\n * Slugger generates header id\n */\n\n\n var Slugger_1 = /*#__PURE__*/function () {\n function Slugger() {\n this.seen = {};\n }\n\n var _proto = Slugger.prototype;\n\n _proto.serialize = function serialize(value) {\n return value.toLowerCase().trim() // remove html tags\n .replace(/<[!\\/a-z].*?>/ig, '') // remove unwanted chars\n .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '').replace(/\\s/g, '-');\n }\n /**\n * Finds the next safe (unique) slug to use\n */\n ;\n\n _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) {\n var slug = originalSlug;\n var occurenceAccumulator = 0;\n\n if (this.seen.hasOwnProperty(slug)) {\n occurenceAccumulator = this.seen[originalSlug];\n\n do {\n occurenceAccumulator++;\n slug = originalSlug + '-' + occurenceAccumulator;\n } while (this.seen.hasOwnProperty(slug));\n }\n\n if (!isDryRun) {\n this.seen[originalSlug] = occurenceAccumulator;\n this.seen[slug] = 0;\n }\n\n return slug;\n }\n /**\n * Convert string to unique id\n * @param {object} options\n * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator.\n */\n ;\n\n _proto.slug = function slug(value, options) {\n if (options === void 0) {\n options = {};\n }\n\n var slug = this.serialize(value);\n return this.getNextSafeSlug(slug, options.dryrun);\n };\n\n return Slugger;\n }();\n\n var Renderer$1 = Renderer_1;\n var TextRenderer$1 = TextRenderer_1;\n var Slugger$1 = Slugger_1;\n var defaults$1 = defaults$5.exports.defaults;\n var unescape = helpers.unescape;\n /**\n * Parsing & Compiling\n */\n\n var Parser_1 = /*#__PURE__*/function () {\n function Parser(options) {\n this.options = options || defaults$1;\n this.options.renderer = this.options.renderer || new Renderer$1();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new TextRenderer$1();\n this.slugger = new Slugger$1();\n }\n /**\n * Static Parse Method\n */\n\n\n Parser.parse = function parse(tokens, options) {\n var parser = new Parser(options);\n return parser.parse(tokens);\n }\n /**\n * Static Parse Inline Method\n */\n ;\n\n Parser.parseInline = function parseInline(tokens, options) {\n var parser = new Parser(options);\n return parser.parseInline(tokens);\n }\n /**\n * Parse Loop\n */\n ;\n\n var _proto = Parser.prototype;\n\n _proto.parse = function parse(tokens, top) {\n if (top === void 0) {\n top = true;\n }\n\n var out = '',\n i,\n j,\n k,\n l2,\n l3,\n row,\n cell,\n header,\n body,\n token,\n ordered,\n start,\n loose,\n itemBody,\n item,\n checked,\n task,\n checkbox,\n ret;\n var l = tokens.length;\n\n for (i = 0; i < l; i++) {\n token = tokens[i]; // Run any renderer extensions\n\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({\n parser: this\n }, token);\n\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n\n switch (token.type) {\n case 'space':\n {\n continue;\n }\n\n case 'hr':\n {\n out += this.renderer.hr();\n continue;\n }\n\n case 'heading':\n {\n out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger);\n continue;\n }\n\n case 'code':\n {\n out += this.renderer.code(token.text, token.lang, token.escaped);\n continue;\n }\n\n case 'table':\n {\n header = ''; // header\n\n cell = '';\n l2 = token.header.length;\n\n for (j = 0; j < l2; j++) {\n cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), {\n header: true,\n align: token.align[j]\n });\n }\n\n header += this.renderer.tablerow(cell);\n body = '';\n l2 = token.rows.length;\n\n for (j = 0; j < l2; j++) {\n row = token.rows[j];\n cell = '';\n l3 = row.length;\n\n for (k = 0; k < l3; k++) {\n cell += this.renderer.tablecell(this.parseInline(row[k].tokens), {\n header: false,\n align: token.align[k]\n });\n }\n\n body += this.renderer.tablerow(cell);\n }\n\n out += this.renderer.table(header, body);\n continue;\n }\n\n case 'blockquote':\n {\n body = this.parse(token.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n\n case 'list':\n {\n ordered = token.ordered;\n start = token.start;\n loose = token.loose;\n l2 = token.items.length;\n body = '';\n\n for (j = 0; j < l2; j++) {\n item = token.items[j];\n checked = item.checked;\n task = item.task;\n itemBody = '';\n\n if (item.task) {\n checkbox = this.renderer.checkbox(checked);\n\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n } else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox\n });\n }\n } else {\n itemBody += checkbox;\n }\n }\n\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, checked);\n }\n\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n\n case 'html':\n {\n // TODO parse inline content if parameter markdown=1\n out += this.renderer.html(token.text);\n continue;\n }\n\n case 'paragraph':\n {\n out += this.renderer.paragraph(this.parseInline(token.tokens));\n continue;\n }\n\n case 'text':\n {\n body = token.tokens ? this.parseInline(token.tokens) : token.text;\n\n while (i + 1 < l && tokens[i + 1].type === 'text') {\n token = tokens[++i];\n body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n }\n\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n\n default:\n {\n var errMsg = 'Token with \"' + token.type + '\" type was not found.';\n\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out;\n }\n /**\n * Parse Inline Tokens\n */\n ;\n\n _proto.parseInline = function parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n var out = '',\n i,\n token,\n ret;\n var l = tokens.length;\n\n for (i = 0; i < l; i++) {\n token = tokens[i]; // Run any renderer extensions\n\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({\n parser: this\n }, token);\n\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n\n switch (token.type) {\n case 'escape':\n {\n out += renderer.text(token.text);\n break;\n }\n\n case 'html':\n {\n out += renderer.html(token.text);\n break;\n }\n\n case 'link':\n {\n out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n break;\n }\n\n case 'image':\n {\n out += renderer.image(token.href, token.title, token.text);\n break;\n }\n\n case 'strong':\n {\n out += renderer.strong(this.parseInline(token.tokens, renderer));\n break;\n }\n\n case 'em':\n {\n out += renderer.em(this.parseInline(token.tokens, renderer));\n break;\n }\n\n case 'codespan':\n {\n out += renderer.codespan(token.text);\n break;\n }\n\n case 'br':\n {\n out += renderer.br();\n break;\n }\n\n case 'del':\n {\n out += renderer.del(this.parseInline(token.tokens, renderer));\n break;\n }\n\n case 'text':\n {\n out += renderer.text(token.text);\n break;\n }\n\n default:\n {\n var errMsg = 'Token with \"' + token.type + '\" type was not found.';\n\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out;\n };\n\n return Parser;\n }();\n\n var Lexer = Lexer_1;\n var Parser = Parser_1;\n var Tokenizer = Tokenizer_1;\n var Renderer = Renderer_1;\n var TextRenderer = TextRenderer_1;\n var Slugger = Slugger_1;\n var merge = helpers.merge,\n checkSanitizeDeprecation = helpers.checkSanitizeDeprecation,\n escape = helpers.escape;\n var getDefaults = defaults$5.exports.getDefaults,\n changeDefaults = defaults$5.exports.changeDefaults,\n defaults = defaults$5.exports.defaults;\n /**\n * Marked\n */\n\n function marked(src, opt, callback) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked(): input parameter is undefined or null');\n }\n\n if (typeof src !== 'string') {\n throw new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');\n }\n\n if (typeof opt === 'function') {\n callback = opt;\n opt = null;\n }\n\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n\n if (callback) {\n var highlight = opt.highlight;\n var tokens;\n\n try {\n tokens = Lexer.lex(src, opt);\n } catch (e) {\n return callback(e);\n }\n\n var done = function done(err) {\n var out;\n\n if (!err) {\n try {\n if (opt.walkTokens) {\n marked.walkTokens(tokens, opt.walkTokens);\n }\n\n out = Parser.parse(tokens, opt);\n } catch (e) {\n err = e;\n }\n }\n\n opt.highlight = highlight;\n return err ? callback(err) : callback(null, out);\n };\n\n if (!highlight || highlight.length < 3) {\n return done();\n }\n\n delete opt.highlight;\n if (!tokens.length) return done();\n var pending = 0;\n marked.walkTokens(tokens, function (token) {\n if (token.type === 'code') {\n pending++;\n setTimeout(function () {\n highlight(token.text, token.lang, function (err, code) {\n if (err) {\n return done(err);\n }\n\n if (code != null && code !== token.text) {\n token.text = code;\n token.escaped = true;\n }\n\n pending--;\n\n if (pending === 0) {\n done();\n }\n });\n }, 0);\n }\n });\n\n if (pending === 0) {\n done();\n }\n\n return;\n }\n\n try {\n var _tokens = Lexer.lex(src, opt);\n\n if (opt.walkTokens) {\n marked.walkTokens(_tokens, opt.walkTokens);\n }\n\n return Parser.parse(_tokens, opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (opt.silent) {\n return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';\n }\n\n throw e;\n }\n }\n /**\n * Options\n */\n\n\n marked.options = marked.setOptions = function (opt) {\n merge(marked.defaults, opt);\n changeDefaults(marked.defaults);\n return marked;\n };\n\n marked.getDefaults = getDefaults;\n marked.defaults = defaults;\n /**\n * Use Extension\n */\n\n marked.use = function () {\n var _this = this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var opts = merge.apply(void 0, [{}].concat(args));\n var extensions = marked.defaults.extensions || {\n renderers: {},\n childTokens: {}\n };\n var hasExtensions;\n args.forEach(function (pack) {\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n hasExtensions = true;\n pack.extensions.forEach(function (ext) {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n\n if (ext.renderer) {\n // Renderer extensions\n var prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;\n\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var ret = ext.renderer.apply(this, args);\n\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n\n if (ext.tokenizer) {\n // Tokenizer Extensions\n if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n\n if (extensions[ext.level]) {\n extensions[ext.level].unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n\n if (ext.start) {\n // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n\n if (ext.childTokens) {\n // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n } // ==-- Parse \"overwrite\" extensions --== //\n\n\n if (pack.renderer) {\n (function () {\n var renderer = marked.defaults.renderer || new Renderer();\n\n var _loop = function _loop(prop) {\n var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false\n\n renderer[prop] = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var ret = pack.renderer[prop].apply(renderer, args);\n\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n\n return ret;\n };\n };\n\n for (var prop in pack.renderer) {\n _loop(prop);\n }\n\n opts.renderer = renderer;\n })();\n }\n\n if (pack.tokenizer) {\n (function () {\n var tokenizer = marked.defaults.tokenizer || new Tokenizer();\n\n var _loop2 = function _loop2(prop) {\n var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false\n\n tokenizer[prop] = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n var ret = pack.tokenizer[prop].apply(tokenizer, args);\n\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n\n return ret;\n };\n };\n\n for (var prop in pack.tokenizer) {\n _loop2(prop);\n }\n\n opts.tokenizer = tokenizer;\n })();\n } // ==-- Parse WalkTokens extensions --== //\n\n\n if (pack.walkTokens) {\n var walkTokens = marked.defaults.walkTokens;\n\n opts.walkTokens = function (token) {\n pack.walkTokens.call(_this, token);\n\n if (walkTokens) {\n walkTokens(token);\n }\n };\n }\n\n if (hasExtensions) {\n opts.extensions = extensions;\n }\n\n marked.setOptions(opts);\n });\n };\n /**\n * Run callback for every token\n */\n\n\n marked.walkTokens = function (tokens, callback) {\n var _loop3 = function _loop3() {\n var token = _step.value;\n callback(token);\n\n switch (token.type) {\n case 'table':\n {\n for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done;) {\n var cell = _step2.value;\n marked.walkTokens(cell.tokens, callback);\n }\n\n for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done;) {\n var row = _step3.value;\n\n for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) {\n var _cell = _step4.value;\n marked.walkTokens(_cell.tokens, callback);\n }\n }\n\n break;\n }\n\n case 'list':\n {\n marked.walkTokens(token.items, callback);\n break;\n }\n\n default:\n {\n if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {\n // Walk any extensions\n marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) {\n marked.walkTokens(token[childTokens], callback);\n });\n } else if (token.tokens) {\n marked.walkTokens(token.tokens, callback);\n }\n }\n }\n };\n\n for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {\n _loop3();\n }\n };\n /**\n * Parse Inline\n */\n\n\n marked.parseInline = function (src, opt) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked.parseInline(): input parameter is undefined or null');\n }\n\n if (typeof src !== 'string') {\n throw new Error('marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');\n }\n\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n\n try {\n var tokens = Lexer.lexInline(src, opt);\n\n if (opt.walkTokens) {\n marked.walkTokens(tokens, opt.walkTokens);\n }\n\n return Parser.parseInline(tokens, opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (opt.silent) {\n return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';\n }\n\n throw e;\n }\n };\n /**\n * Expose\n */\n\n\n marked.Parser = Parser;\n marked.parser = Parser.parse;\n marked.Renderer = Renderer;\n marked.TextRenderer = TextRenderer;\n marked.Lexer = Lexer;\n marked.lexer = Lexer.lex;\n marked.Tokenizer = Tokenizer;\n marked.Slugger = Slugger;\n marked.parse = marked;\n var marked_1 = marked;\n return marked_1;\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/marked/lib/marked.js?");
72
-
73
- /***/ }),
74
-
75
65
  /***/ "./node_modules/phoenix/priv/static/phoenix.esm.js":
76
66
  /*!*********************************************************!*\
77
67
  !*** ./node_modules/phoenix/priv/static/phoenix.esm.js ***!
@@ -79,7 +69,7 @@ eval("/**\n * marked - a markdown parser\n * Copyright (c) 2011-2021, Christophe
79
69
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
80
70
 
81
71
  "use strict";
82
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Channel\": () => (/* binding */ Channel),\n/* harmony export */ \"LongPoll\": () => (/* binding */ LongPoll),\n/* harmony export */ \"Presence\": () => (/* binding */ Presence),\n/* harmony export */ \"Serializer\": () => (/* binding */ serializer_default),\n/* harmony export */ \"Socket\": () => (/* binding */ Socket)\n/* harmony export */ });\n// js/phoenix/utils.js\nvar closure = value => {\n if (typeof value === \"function\") {\n return value;\n } else {\n let closure2 = function () {\n return value;\n };\n\n return closure2;\n }\n}; // js/phoenix/constants.js\n\n\nvar globalSelf = typeof self !== \"undefined\" ? self : null;\nvar phxWindow = typeof window !== \"undefined\" ? window : null;\nvar global = globalSelf || phxWindow || void 0;\nvar DEFAULT_VSN = \"2.0.0\";\nvar SOCKET_STATES = {\n connecting: 0,\n open: 1,\n closing: 2,\n closed: 3\n};\nvar DEFAULT_TIMEOUT = 1e4;\nvar WS_CLOSE_NORMAL = 1e3;\nvar CHANNEL_STATES = {\n closed: \"closed\",\n errored: \"errored\",\n joined: \"joined\",\n joining: \"joining\",\n leaving: \"leaving\"\n};\nvar CHANNEL_EVENTS = {\n close: \"phx_close\",\n error: \"phx_error\",\n join: \"phx_join\",\n reply: \"phx_reply\",\n leave: \"phx_leave\"\n};\nvar TRANSPORTS = {\n longpoll: \"longpoll\",\n websocket: \"websocket\"\n};\nvar XHR_STATES = {\n complete: 4\n}; // js/phoenix/push.js\n\nvar Push = class {\n constructor(channel, event, payload, timeout) {\n this.channel = channel;\n this.event = event;\n\n this.payload = payload || function () {\n return {};\n };\n\n this.receivedResp = null;\n this.timeout = timeout;\n this.timeoutTimer = null;\n this.recHooks = [];\n this.sent = false;\n }\n\n resend(timeout) {\n this.timeout = timeout;\n this.reset();\n this.send();\n }\n\n send() {\n if (this.hasReceived(\"timeout\")) {\n return;\n }\n\n this.startTimeout();\n this.sent = true;\n this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload(),\n ref: this.ref,\n join_ref: this.channel.joinRef()\n });\n }\n\n receive(status, callback) {\n if (this.hasReceived(status)) {\n callback(this.receivedResp.response);\n }\n\n this.recHooks.push({\n status,\n callback\n });\n return this;\n }\n\n reset() {\n this.cancelRefEvent();\n this.ref = null;\n this.refEvent = null;\n this.receivedResp = null;\n this.sent = false;\n }\n\n matchReceive({\n status,\n response,\n _ref\n }) {\n this.recHooks.filter(h => h.status === status).forEach(h => h.callback(response));\n }\n\n cancelRefEvent() {\n if (!this.refEvent) {\n return;\n }\n\n this.channel.off(this.refEvent);\n }\n\n cancelTimeout() {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n\n startTimeout() {\n if (this.timeoutTimer) {\n this.cancelTimeout();\n }\n\n this.ref = this.channel.socket.makeRef();\n this.refEvent = this.channel.replyEventName(this.ref);\n this.channel.on(this.refEvent, payload => {\n this.cancelRefEvent();\n this.cancelTimeout();\n this.receivedResp = payload;\n this.matchReceive(payload);\n });\n this.timeoutTimer = setTimeout(() => {\n this.trigger(\"timeout\", {});\n }, this.timeout);\n }\n\n hasReceived(status) {\n return this.receivedResp && this.receivedResp.status === status;\n }\n\n trigger(status, response) {\n this.channel.trigger(this.refEvent, {\n status,\n response\n });\n }\n\n}; // js/phoenix/timer.js\n\nvar Timer = class {\n constructor(callback, timerCalc) {\n this.callback = callback;\n this.timerCalc = timerCalc;\n this.timer = null;\n this.tries = 0;\n }\n\n reset() {\n this.tries = 0;\n clearTimeout(this.timer);\n }\n\n scheduleTimeout() {\n clearTimeout(this.timer);\n this.timer = setTimeout(() => {\n this.tries = this.tries + 1;\n this.callback();\n }, this.timerCalc(this.tries + 1));\n }\n\n}; // js/phoenix/channel.js\n\nvar Channel = class {\n constructor(topic, params, socket) {\n this.state = CHANNEL_STATES.closed;\n this.topic = topic;\n this.params = closure(params || {});\n this.socket = socket;\n this.bindings = [];\n this.bindingRef = 0;\n this.timeout = this.socket.timeout;\n this.joinedOnce = false;\n this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);\n this.pushBuffer = [];\n this.stateChangeRefs = [];\n this.rejoinTimer = new Timer(() => {\n if (this.socket.isConnected()) {\n this.rejoin();\n }\n }, this.socket.rejoinAfterMs);\n this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset()));\n this.stateChangeRefs.push(this.socket.onOpen(() => {\n this.rejoinTimer.reset();\n\n if (this.isErrored()) {\n this.rejoin();\n }\n }));\n this.joinPush.receive(\"ok\", () => {\n this.state = CHANNEL_STATES.joined;\n this.rejoinTimer.reset();\n this.pushBuffer.forEach(pushEvent => pushEvent.send());\n this.pushBuffer = [];\n });\n this.joinPush.receive(\"error\", () => {\n this.state = CHANNEL_STATES.errored;\n\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.onClose(() => {\n this.rejoinTimer.reset();\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `close ${this.topic} ${this.joinRef()}`);\n this.state = CHANNEL_STATES.closed;\n this.socket.remove(this);\n });\n this.onError(reason => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `error ${this.topic}`, reason);\n\n if (this.isJoining()) {\n this.joinPush.reset();\n }\n\n this.state = CHANNEL_STATES.errored;\n\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.joinPush.receive(\"timeout\", () => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout);\n let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout);\n leavePush.send();\n this.state = CHANNEL_STATES.errored;\n this.joinPush.reset();\n\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.on(CHANNEL_EVENTS.reply, (payload, ref) => {\n this.trigger(this.replyEventName(ref), payload);\n });\n }\n\n join(timeout = this.timeout) {\n if (this.joinedOnce) {\n throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");\n } else {\n this.timeout = timeout;\n this.joinedOnce = true;\n this.rejoin();\n return this.joinPush;\n }\n }\n\n onClose(callback) {\n this.on(CHANNEL_EVENTS.close, callback);\n }\n\n onError(callback) {\n return this.on(CHANNEL_EVENTS.error, reason => callback(reason));\n }\n\n on(event, callback) {\n let ref = this.bindingRef++;\n this.bindings.push({\n event,\n ref,\n callback\n });\n return ref;\n }\n\n off(event, ref) {\n this.bindings = this.bindings.filter(bind => {\n return !(bind.event === event && (typeof ref === \"undefined\" || ref === bind.ref));\n });\n }\n\n canPush() {\n return this.socket.isConnected() && this.isJoined();\n }\n\n push(event, payload, timeout = this.timeout) {\n payload = payload || {};\n\n if (!this.joinedOnce) {\n throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`);\n }\n\n let pushEvent = new Push(this, event, function () {\n return payload;\n }, timeout);\n\n if (this.canPush()) {\n pushEvent.send();\n } else {\n pushEvent.startTimeout();\n this.pushBuffer.push(pushEvent);\n }\n\n return pushEvent;\n }\n\n leave(timeout = this.timeout) {\n this.rejoinTimer.reset();\n this.joinPush.cancelTimeout();\n this.state = CHANNEL_STATES.leaving;\n\n let onClose = () => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `leave ${this.topic}`);\n this.trigger(CHANNEL_EVENTS.close, \"leave\");\n };\n\n let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout);\n leavePush.receive(\"ok\", () => onClose()).receive(\"timeout\", () => onClose());\n leavePush.send();\n\n if (!this.canPush()) {\n leavePush.trigger(\"ok\", {});\n }\n\n return leavePush;\n }\n\n onMessage(_event, payload, _ref) {\n return payload;\n }\n\n isMember(topic, event, payload, joinRef) {\n if (this.topic !== topic) {\n return false;\n }\n\n if (joinRef && joinRef !== this.joinRef()) {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", \"dropping outdated message\", {\n topic,\n event,\n payload,\n joinRef\n });\n return false;\n } else {\n return true;\n }\n }\n\n joinRef() {\n return this.joinPush.ref;\n }\n\n rejoin(timeout = this.timeout) {\n if (this.isLeaving()) {\n return;\n }\n\n this.socket.leaveOpenTopic(this.topic);\n this.state = CHANNEL_STATES.joining;\n this.joinPush.resend(timeout);\n }\n\n trigger(event, payload, ref, joinRef) {\n let handledPayload = this.onMessage(event, payload, ref, joinRef);\n\n if (payload && !handledPayload) {\n throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");\n }\n\n let eventBindings = this.bindings.filter(bind => bind.event === event);\n\n for (let i = 0; i < eventBindings.length; i++) {\n let bind = eventBindings[i];\n bind.callback(handledPayload, ref, joinRef || this.joinRef());\n }\n }\n\n replyEventName(ref) {\n return `chan_reply_${ref}`;\n }\n\n isClosed() {\n return this.state === CHANNEL_STATES.closed;\n }\n\n isErrored() {\n return this.state === CHANNEL_STATES.errored;\n }\n\n isJoined() {\n return this.state === CHANNEL_STATES.joined;\n }\n\n isJoining() {\n return this.state === CHANNEL_STATES.joining;\n }\n\n isLeaving() {\n return this.state === CHANNEL_STATES.leaving;\n }\n\n}; // js/phoenix/ajax.js\n\nvar Ajax = class {\n static request(method, endPoint, accept, body, timeout, ontimeout, callback) {\n if (global.XDomainRequest) {\n let req = new global.XDomainRequest();\n this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);\n } else {\n let req = new global.XMLHttpRequest();\n this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);\n }\n }\n\n static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {\n req.timeout = timeout;\n req.open(method, endPoint);\n\n req.onload = () => {\n let response = this.parseJSON(req.responseText);\n callback && callback(response);\n };\n\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n\n req.onprogress = () => {};\n\n req.send(body);\n }\n\n static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {\n req.open(method, endPoint, true);\n req.timeout = timeout;\n req.setRequestHeader(\"Content-Type\", accept);\n\n req.onerror = () => {\n callback && callback(null);\n };\n\n req.onreadystatechange = () => {\n if (req.readyState === XHR_STATES.complete && callback) {\n let response = this.parseJSON(req.responseText);\n callback(response);\n }\n };\n\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n\n req.send(body);\n }\n\n static parseJSON(resp) {\n if (!resp || resp === \"\") {\n return null;\n }\n\n try {\n return JSON.parse(resp);\n } catch (e) {\n console && console.log(\"failed to parse JSON response\", resp);\n return null;\n }\n }\n\n static serialize(obj, parentKey) {\n let queryStr = [];\n\n for (var key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n\n let paramKey = parentKey ? `${parentKey}[${key}]` : key;\n let paramVal = obj[key];\n\n if (typeof paramVal === \"object\") {\n queryStr.push(this.serialize(paramVal, paramKey));\n } else {\n queryStr.push(encodeURIComponent(paramKey) + \"=\" + encodeURIComponent(paramVal));\n }\n }\n\n return queryStr.join(\"&\");\n }\n\n static appendParams(url, params) {\n if (Object.keys(params).length === 0) {\n return url;\n }\n\n let prefix = url.match(/\\?/) ? \"&\" : \"?\";\n return `${url}${prefix}${this.serialize(params)}`;\n }\n\n}; // js/phoenix/longpoll.js\n\nvar LongPoll = class {\n constructor(endPoint) {\n this.endPoint = null;\n this.token = null;\n this.skipHeartbeat = true;\n\n this.onopen = function () {};\n\n this.onerror = function () {};\n\n this.onmessage = function () {};\n\n this.onclose = function () {};\n\n this.pollEndpoint = this.normalizeEndpoint(endPoint);\n this.readyState = SOCKET_STATES.connecting;\n this.poll();\n }\n\n normalizeEndpoint(endPoint) {\n return endPoint.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\").replace(new RegExp(\"(.*)/\" + TRANSPORTS.websocket), \"$1/\" + TRANSPORTS.longpoll);\n }\n\n endpointURL() {\n return Ajax.appendParams(this.pollEndpoint, {\n token: this.token\n });\n }\n\n closeAndRetry() {\n this.close();\n this.readyState = SOCKET_STATES.connecting;\n }\n\n ontimeout() {\n this.onerror(\"timeout\");\n this.closeAndRetry();\n }\n\n poll() {\n if (!(this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting)) {\n return;\n }\n\n Ajax.request(\"GET\", this.endpointURL(), \"application/json\", null, this.timeout, this.ontimeout.bind(this), resp => {\n if (resp) {\n var {\n status,\n token,\n messages\n } = resp;\n this.token = token;\n } else {\n status = 0;\n }\n\n switch (status) {\n case 200:\n messages.forEach(msg => {\n setTimeout(() => {\n this.onmessage({\n data: msg\n });\n }, 0);\n });\n this.poll();\n break;\n\n case 204:\n this.poll();\n break;\n\n case 410:\n this.readyState = SOCKET_STATES.open;\n this.onopen();\n this.poll();\n break;\n\n case 403:\n this.onerror();\n this.close();\n break;\n\n case 0:\n case 500:\n this.onerror();\n this.closeAndRetry();\n break;\n\n default:\n throw new Error(`unhandled poll status ${status}`);\n }\n });\n }\n\n send(body) {\n Ajax.request(\"POST\", this.endpointURL(), \"application/json\", body, this.timeout, this.onerror.bind(this, \"timeout\"), resp => {\n if (!resp || resp.status !== 200) {\n this.onerror(resp && resp.status);\n this.closeAndRetry();\n }\n });\n }\n\n close(_code, _reason) {\n this.readyState = SOCKET_STATES.closed;\n this.onclose();\n }\n\n}; // js/phoenix/presence.js\n\nvar Presence = class {\n constructor(channel, opts = {}) {\n let events = opts.events || {\n state: \"presence_state\",\n diff: \"presence_diff\"\n };\n this.state = {};\n this.pendingDiffs = [];\n this.channel = channel;\n this.joinRef = null;\n this.caller = {\n onJoin: function () {},\n onLeave: function () {},\n onSync: function () {}\n };\n this.channel.on(events.state, newState => {\n let {\n onJoin,\n onLeave,\n onSync\n } = this.caller;\n this.joinRef = this.channel.joinRef();\n this.state = Presence.syncState(this.state, newState, onJoin, onLeave);\n this.pendingDiffs.forEach(diff => {\n this.state = Presence.syncDiff(this.state, diff, onJoin, onLeave);\n });\n this.pendingDiffs = [];\n onSync();\n });\n this.channel.on(events.diff, diff => {\n let {\n onJoin,\n onLeave,\n onSync\n } = this.caller;\n\n if (this.inPendingSyncState()) {\n this.pendingDiffs.push(diff);\n } else {\n this.state = Presence.syncDiff(this.state, diff, onJoin, onLeave);\n onSync();\n }\n });\n }\n\n onJoin(callback) {\n this.caller.onJoin = callback;\n }\n\n onLeave(callback) {\n this.caller.onLeave = callback;\n }\n\n onSync(callback) {\n this.caller.onSync = callback;\n }\n\n list(by) {\n return Presence.list(this.state, by);\n }\n\n inPendingSyncState() {\n return !this.joinRef || this.joinRef !== this.channel.joinRef();\n }\n\n static syncState(currentState, newState, onJoin, onLeave) {\n let state = this.clone(currentState);\n let joins = {};\n let leaves = {};\n this.map(state, (key, presence) => {\n if (!newState[key]) {\n leaves[key] = presence;\n }\n });\n this.map(newState, (key, newPresence) => {\n let currentPresence = state[key];\n\n if (currentPresence) {\n let newRefs = newPresence.metas.map(m => m.phx_ref);\n let curRefs = currentPresence.metas.map(m => m.phx_ref);\n let joinedMetas = newPresence.metas.filter(m => curRefs.indexOf(m.phx_ref) < 0);\n let leftMetas = currentPresence.metas.filter(m => newRefs.indexOf(m.phx_ref) < 0);\n\n if (joinedMetas.length > 0) {\n joins[key] = newPresence;\n joins[key].metas = joinedMetas;\n }\n\n if (leftMetas.length > 0) {\n leaves[key] = this.clone(currentPresence);\n leaves[key].metas = leftMetas;\n }\n } else {\n joins[key] = newPresence;\n }\n });\n return this.syncDiff(state, {\n joins,\n leaves\n }, onJoin, onLeave);\n }\n\n static syncDiff(state, diff, onJoin, onLeave) {\n let {\n joins,\n leaves\n } = this.clone(diff);\n\n if (!onJoin) {\n onJoin = function () {};\n }\n\n if (!onLeave) {\n onLeave = function () {};\n }\n\n this.map(joins, (key, newPresence) => {\n let currentPresence = state[key];\n state[key] = this.clone(newPresence);\n\n if (currentPresence) {\n let joinedRefs = state[key].metas.map(m => m.phx_ref);\n let curMetas = currentPresence.metas.filter(m => joinedRefs.indexOf(m.phx_ref) < 0);\n state[key].metas.unshift(...curMetas);\n }\n\n onJoin(key, currentPresence, newPresence);\n });\n this.map(leaves, (key, leftPresence) => {\n let currentPresence = state[key];\n\n if (!currentPresence) {\n return;\n }\n\n let refsToRemove = leftPresence.metas.map(m => m.phx_ref);\n currentPresence.metas = currentPresence.metas.filter(p => {\n return refsToRemove.indexOf(p.phx_ref) < 0;\n });\n onLeave(key, currentPresence, leftPresence);\n\n if (currentPresence.metas.length === 0) {\n delete state[key];\n }\n });\n return state;\n }\n\n static list(presences, chooser) {\n if (!chooser) {\n chooser = function (key, pres) {\n return pres;\n };\n }\n\n return this.map(presences, (key, presence) => {\n return chooser(key, presence);\n });\n }\n\n static map(obj, func) {\n return Object.getOwnPropertyNames(obj).map(key => func(key, obj[key]));\n }\n\n static clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n }\n\n}; // js/phoenix/serializer.js\n\nvar serializer_default = {\n HEADER_LENGTH: 1,\n META_LENGTH: 4,\n KINDS: {\n push: 0,\n reply: 1,\n broadcast: 2\n },\n\n encode(msg, callback) {\n if (msg.payload.constructor === ArrayBuffer) {\n return callback(this.binaryEncode(msg));\n } else {\n let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload];\n return callback(JSON.stringify(payload));\n }\n },\n\n decode(rawPayload, callback) {\n if (rawPayload.constructor === ArrayBuffer) {\n return callback(this.binaryDecode(rawPayload));\n } else {\n let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload);\n return callback({\n join_ref,\n ref,\n topic,\n event,\n payload\n });\n }\n },\n\n binaryEncode(message) {\n let {\n join_ref,\n ref,\n event,\n topic,\n payload\n } = message;\n let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length;\n let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);\n let view = new DataView(header);\n let offset = 0;\n view.setUint8(offset++, this.KINDS.push);\n view.setUint8(offset++, join_ref.length);\n view.setUint8(offset++, ref.length);\n view.setUint8(offset++, topic.length);\n view.setUint8(offset++, event.length);\n Array.from(join_ref, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(ref, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(topic, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(event, char => view.setUint8(offset++, char.charCodeAt(0)));\n var combined = new Uint8Array(header.byteLength + payload.byteLength);\n combined.set(new Uint8Array(header), 0);\n combined.set(new Uint8Array(payload), header.byteLength);\n return combined.buffer;\n },\n\n binaryDecode(buffer) {\n let view = new DataView(buffer);\n let kind = view.getUint8(0);\n let decoder = new TextDecoder();\n\n switch (kind) {\n case this.KINDS.push:\n return this.decodePush(buffer, view, decoder);\n\n case this.KINDS.reply:\n return this.decodeReply(buffer, view, decoder);\n\n case this.KINDS.broadcast:\n return this.decodeBroadcast(buffer, view, decoder);\n }\n },\n\n decodePush(buffer, view, decoder) {\n let joinRefSize = view.getUint8(1);\n let topicSize = view.getUint8(2);\n let eventSize = view.getUint8(3);\n let offset = this.HEADER_LENGTH + this.META_LENGTH - 1;\n let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize));\n offset = offset + joinRefSize;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n return {\n join_ref: joinRef,\n ref: null,\n topic,\n event,\n payload: data\n };\n },\n\n decodeReply(buffer, view, decoder) {\n let joinRefSize = view.getUint8(1);\n let refSize = view.getUint8(2);\n let topicSize = view.getUint8(3);\n let eventSize = view.getUint8(4);\n let offset = this.HEADER_LENGTH + this.META_LENGTH;\n let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize));\n offset = offset + joinRefSize;\n let ref = decoder.decode(buffer.slice(offset, offset + refSize));\n offset = offset + refSize;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n let payload = {\n status: event,\n response: data\n };\n return {\n join_ref: joinRef,\n ref,\n topic,\n event: CHANNEL_EVENTS.reply,\n payload\n };\n },\n\n decodeBroadcast(buffer, view, decoder) {\n let topicSize = view.getUint8(1);\n let eventSize = view.getUint8(2);\n let offset = this.HEADER_LENGTH + 2;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n return {\n join_ref: null,\n ref: null,\n topic,\n event,\n payload: data\n };\n }\n\n}; // js/phoenix/socket.js\n\nvar Socket = class {\n constructor(endPoint, opts = {}) {\n this.stateChangeCallbacks = {\n open: [],\n close: [],\n error: [],\n message: []\n };\n this.channels = [];\n this.sendBuffer = [];\n this.ref = 0;\n this.timeout = opts.timeout || DEFAULT_TIMEOUT;\n this.transport = opts.transport || global.WebSocket || LongPoll;\n this.establishedConnections = 0;\n this.defaultEncoder = serializer_default.encode.bind(serializer_default);\n this.defaultDecoder = serializer_default.decode.bind(serializer_default);\n this.closeWasClean = false;\n this.binaryType = opts.binaryType || \"arraybuffer\";\n this.connectClock = 1;\n\n if (this.transport !== LongPoll) {\n this.encode = opts.encode || this.defaultEncoder;\n this.decode = opts.decode || this.defaultDecoder;\n } else {\n this.encode = this.defaultEncoder;\n this.decode = this.defaultDecoder;\n }\n\n let awaitingConnectionOnPageShow = null;\n\n if (phxWindow && phxWindow.addEventListener) {\n phxWindow.addEventListener(\"pagehide\", _e => {\n if (this.conn) {\n this.disconnect();\n awaitingConnectionOnPageShow = this.connectClock;\n }\n });\n phxWindow.addEventListener(\"pageshow\", _e => {\n if (awaitingConnectionOnPageShow === this.connectClock) {\n awaitingConnectionOnPageShow = null;\n this.connect();\n }\n });\n }\n\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4;\n\n this.rejoinAfterMs = tries => {\n if (opts.rejoinAfterMs) {\n return opts.rejoinAfterMs(tries);\n } else {\n return [1e3, 2e3, 5e3][tries - 1] || 1e4;\n }\n };\n\n this.reconnectAfterMs = tries => {\n if (opts.reconnectAfterMs) {\n return opts.reconnectAfterMs(tries);\n } else {\n return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3;\n }\n };\n\n this.logger = opts.logger || null;\n this.longpollerTimeout = opts.longpollerTimeout || 2e4;\n this.params = closure(opts.params || {});\n this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`;\n this.vsn = opts.vsn || DEFAULT_VSN;\n this.heartbeatTimer = null;\n this.pendingHeartbeatRef = null;\n this.reconnectTimer = new Timer(() => {\n this.teardown(() => this.connect());\n }, this.reconnectAfterMs);\n }\n\n replaceTransport(newTransport) {\n this.disconnect();\n this.transport = newTransport;\n }\n\n protocol() {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n\n endPointURL() {\n let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), {\n vsn: this.vsn\n });\n\n if (uri.charAt(0) !== \"/\") {\n return uri;\n }\n\n if (uri.charAt(1) === \"/\") {\n return `${this.protocol()}:${uri}`;\n }\n\n return `${this.protocol()}://${location.host}${uri}`;\n }\n\n disconnect(callback, code, reason) {\n this.connectClock++;\n this.closeWasClean = true;\n this.reconnectTimer.reset();\n this.teardown(callback, code, reason);\n }\n\n connect(params) {\n this.connectClock++;\n\n if (params) {\n console && console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\");\n this.params = closure(params);\n }\n\n if (this.conn) {\n return;\n }\n\n this.closeWasClean = false;\n this.conn = new this.transport(this.endPointURL());\n this.conn.binaryType = this.binaryType;\n this.conn.timeout = this.longpollerTimeout;\n\n this.conn.onopen = () => this.onConnOpen();\n\n this.conn.onerror = error => this.onConnError(error);\n\n this.conn.onmessage = event => this.onConnMessage(event);\n\n this.conn.onclose = event => this.onConnClose(event);\n }\n\n log(kind, msg, data) {\n this.logger(kind, msg, data);\n }\n\n hasLogger() {\n return this.logger !== null;\n }\n\n onOpen(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.open.push([ref, callback]);\n return ref;\n }\n\n onClose(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.close.push([ref, callback]);\n return ref;\n }\n\n onError(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.error.push([ref, callback]);\n return ref;\n }\n\n onMessage(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.message.push([ref, callback]);\n return ref;\n }\n\n onConnOpen() {\n if (this.hasLogger()) this.log(\"transport\", `connected to ${this.endPointURL()}`);\n this.closeWasClean = false;\n this.establishedConnections++;\n this.flushSendBuffer();\n this.reconnectTimer.reset();\n this.resetHeartbeat();\n this.stateChangeCallbacks.open.forEach(([, callback]) => callback());\n }\n\n heartbeatTimeout() {\n if (this.pendingHeartbeatRef) {\n this.pendingHeartbeatRef = null;\n\n if (this.hasLogger()) {\n this.log(\"transport\", \"heartbeat timeout. Attempting to re-establish connection\");\n }\n\n this.abnormalClose(\"heartbeat timeout\");\n }\n }\n\n resetHeartbeat() {\n if (this.conn && this.conn.skipHeartbeat) {\n return;\n }\n\n this.pendingHeartbeatRef = null;\n clearTimeout(this.heartbeatTimer);\n setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n\n teardown(callback, code, reason) {\n if (!this.conn) {\n return callback && callback();\n }\n\n this.waitForBufferDone(() => {\n if (this.conn) {\n if (code) {\n this.conn.close(code, reason || \"\");\n } else {\n this.conn.close();\n }\n }\n\n this.waitForSocketClosed(() => {\n if (this.conn) {\n this.conn.onclose = function () {};\n\n this.conn = null;\n }\n\n callback && callback();\n });\n });\n }\n\n waitForBufferDone(callback, tries = 1) {\n if (tries === 5 || !this.conn || !this.conn.bufferedAmount) {\n callback();\n return;\n }\n\n setTimeout(() => {\n this.waitForBufferDone(callback, tries + 1);\n }, 150 * tries);\n }\n\n waitForSocketClosed(callback, tries = 1) {\n if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) {\n callback();\n return;\n }\n\n setTimeout(() => {\n this.waitForSocketClosed(callback, tries + 1);\n }, 150 * tries);\n }\n\n onConnClose(event) {\n if (this.hasLogger()) this.log(\"transport\", \"close\", event);\n this.triggerChanError();\n clearTimeout(this.heartbeatTimer);\n\n if (!this.closeWasClean) {\n this.reconnectTimer.scheduleTimeout();\n }\n\n this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event));\n }\n\n onConnError(error) {\n if (this.hasLogger()) this.log(\"transport\", error);\n let transportBefore = this.transport;\n let establishedBefore = this.establishedConnections;\n this.stateChangeCallbacks.error.forEach(([, callback]) => {\n callback(error, transportBefore, establishedBefore);\n });\n\n if (transportBefore === this.transport || establishedBefore > 0) {\n this.triggerChanError();\n }\n }\n\n triggerChanError() {\n this.channels.forEach(channel => {\n if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) {\n channel.trigger(CHANNEL_EVENTS.error);\n }\n });\n }\n\n connectionState() {\n switch (this.conn && this.conn.readyState) {\n case SOCKET_STATES.connecting:\n return \"connecting\";\n\n case SOCKET_STATES.open:\n return \"open\";\n\n case SOCKET_STATES.closing:\n return \"closing\";\n\n default:\n return \"closed\";\n }\n }\n\n isConnected() {\n return this.connectionState() === \"open\";\n }\n\n remove(channel) {\n this.off(channel.stateChangeRefs);\n this.channels = this.channels.filter(c => c.joinRef() !== channel.joinRef());\n }\n\n off(refs) {\n for (let key in this.stateChangeCallbacks) {\n this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => {\n return refs.indexOf(ref) === -1;\n });\n }\n }\n\n channel(topic, chanParams = {}) {\n let chan = new Channel(topic, chanParams, this);\n this.channels.push(chan);\n return chan;\n }\n\n push(data) {\n if (this.hasLogger()) {\n let {\n topic,\n event,\n payload,\n ref,\n join_ref\n } = data;\n this.log(\"push\", `${topic} ${event} (${join_ref}, ${ref})`, payload);\n }\n\n if (this.isConnected()) {\n this.encode(data, result => this.conn.send(result));\n } else {\n this.sendBuffer.push(() => this.encode(data, result => this.conn.send(result)));\n }\n }\n\n makeRef() {\n let newRef = this.ref + 1;\n\n if (newRef === this.ref) {\n this.ref = 0;\n } else {\n this.ref = newRef;\n }\n\n return this.ref.toString();\n }\n\n sendHeartbeat() {\n if (this.pendingHeartbeatRef && !this.isConnected()) {\n return;\n }\n\n this.pendingHeartbeatRef = this.makeRef();\n this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref: this.pendingHeartbeatRef\n });\n this.heartbeatTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs);\n }\n\n abnormalClose(reason) {\n this.closeWasClean = false;\n\n if (this.isConnected()) {\n this.conn.close(WS_CLOSE_NORMAL, reason);\n }\n }\n\n flushSendBuffer() {\n if (this.isConnected() && this.sendBuffer.length > 0) {\n this.sendBuffer.forEach(callback => callback());\n this.sendBuffer = [];\n }\n }\n\n onConnMessage(rawMessage) {\n this.decode(rawMessage.data, msg => {\n let {\n topic,\n event,\n payload,\n ref,\n join_ref\n } = msg;\n\n if (ref && ref === this.pendingHeartbeatRef) {\n clearTimeout(this.heartbeatTimer);\n this.pendingHeartbeatRef = null;\n setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n\n if (this.hasLogger()) this.log(\"receive\", `${payload.status || \"\"} ${topic} ${event} ${ref && \"(\" + ref + \")\" || \"\"}`, payload);\n\n for (let i = 0; i < this.channels.length; i++) {\n const channel = this.channels[i];\n\n if (!channel.isMember(topic, event, payload, join_ref)) {\n continue;\n }\n\n channel.trigger(event, payload, ref, join_ref);\n }\n\n for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) {\n let [, callback] = this.stateChangeCallbacks.message[i];\n callback(msg);\n }\n });\n }\n\n leaveOpenTopic(topic) {\n let dupChannel = this.channels.find(c => c.topic === topic && (c.isJoined() || c.isJoining()));\n\n if (dupChannel) {\n if (this.hasLogger()) this.log(\"transport\", `leaving duplicate topic \"${topic}\"`);\n dupChannel.leave();\n }\n }\n\n};\n\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/phoenix/priv/static/phoenix.esm.js?");
72
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Channel\": () => (/* binding */ Channel),\n/* harmony export */ \"LongPoll\": () => (/* binding */ LongPoll),\n/* harmony export */ \"Presence\": () => (/* binding */ Presence),\n/* harmony export */ \"Serializer\": () => (/* binding */ serializer_default),\n/* harmony export */ \"Socket\": () => (/* binding */ Socket)\n/* harmony export */ });\n// js/phoenix/utils.js\nvar closure = value => {\n if (typeof value === \"function\") {\n return value;\n } else {\n let closure2 = function () {\n return value;\n };\n\n return closure2;\n }\n}; // js/phoenix/constants.js\n\n\nvar globalSelf = typeof self !== \"undefined\" ? self : null;\nvar phxWindow = typeof window !== \"undefined\" ? window : null;\nvar global = globalSelf || phxWindow || void 0;\nvar DEFAULT_VSN = \"2.0.0\";\nvar SOCKET_STATES = {\n connecting: 0,\n open: 1,\n closing: 2,\n closed: 3\n};\nvar DEFAULT_TIMEOUT = 1e4;\nvar WS_CLOSE_NORMAL = 1e3;\nvar CHANNEL_STATES = {\n closed: \"closed\",\n errored: \"errored\",\n joined: \"joined\",\n joining: \"joining\",\n leaving: \"leaving\"\n};\nvar CHANNEL_EVENTS = {\n close: \"phx_close\",\n error: \"phx_error\",\n join: \"phx_join\",\n reply: \"phx_reply\",\n leave: \"phx_leave\"\n};\nvar TRANSPORTS = {\n longpoll: \"longpoll\",\n websocket: \"websocket\"\n};\nvar XHR_STATES = {\n complete: 4\n}; // js/phoenix/push.js\n\nvar Push = class {\n constructor(channel, event, payload, timeout) {\n this.channel = channel;\n this.event = event;\n\n this.payload = payload || function () {\n return {};\n };\n\n this.receivedResp = null;\n this.timeout = timeout;\n this.timeoutTimer = null;\n this.recHooks = [];\n this.sent = false;\n }\n\n resend(timeout) {\n this.timeout = timeout;\n this.reset();\n this.send();\n }\n\n send() {\n if (this.hasReceived(\"timeout\")) {\n return;\n }\n\n this.startTimeout();\n this.sent = true;\n this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload(),\n ref: this.ref,\n join_ref: this.channel.joinRef()\n });\n }\n\n receive(status, callback) {\n if (this.hasReceived(status)) {\n callback(this.receivedResp.response);\n }\n\n this.recHooks.push({\n status,\n callback\n });\n return this;\n }\n\n reset() {\n this.cancelRefEvent();\n this.ref = null;\n this.refEvent = null;\n this.receivedResp = null;\n this.sent = false;\n }\n\n matchReceive({\n status,\n response,\n _ref\n }) {\n this.recHooks.filter(h => h.status === status).forEach(h => h.callback(response));\n }\n\n cancelRefEvent() {\n if (!this.refEvent) {\n return;\n }\n\n this.channel.off(this.refEvent);\n }\n\n cancelTimeout() {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n\n startTimeout() {\n if (this.timeoutTimer) {\n this.cancelTimeout();\n }\n\n this.ref = this.channel.socket.makeRef();\n this.refEvent = this.channel.replyEventName(this.ref);\n this.channel.on(this.refEvent, payload => {\n this.cancelRefEvent();\n this.cancelTimeout();\n this.receivedResp = payload;\n this.matchReceive(payload);\n });\n this.timeoutTimer = setTimeout(() => {\n this.trigger(\"timeout\", {});\n }, this.timeout);\n }\n\n hasReceived(status) {\n return this.receivedResp && this.receivedResp.status === status;\n }\n\n trigger(status, response) {\n this.channel.trigger(this.refEvent, {\n status,\n response\n });\n }\n\n}; // js/phoenix/timer.js\n\nvar Timer = class {\n constructor(callback, timerCalc) {\n this.callback = callback;\n this.timerCalc = timerCalc;\n this.timer = null;\n this.tries = 0;\n }\n\n reset() {\n this.tries = 0;\n clearTimeout(this.timer);\n }\n\n scheduleTimeout() {\n clearTimeout(this.timer);\n this.timer = setTimeout(() => {\n this.tries = this.tries + 1;\n this.callback();\n }, this.timerCalc(this.tries + 1));\n }\n\n}; // js/phoenix/channel.js\n\nvar Channel = class {\n constructor(topic, params, socket) {\n this.state = CHANNEL_STATES.closed;\n this.topic = topic;\n this.params = closure(params || {});\n this.socket = socket;\n this.bindings = [];\n this.bindingRef = 0;\n this.timeout = this.socket.timeout;\n this.joinedOnce = false;\n this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);\n this.pushBuffer = [];\n this.stateChangeRefs = [];\n this.rejoinTimer = new Timer(() => {\n if (this.socket.isConnected()) {\n this.rejoin();\n }\n }, this.socket.rejoinAfterMs);\n this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset()));\n this.stateChangeRefs.push(this.socket.onOpen(() => {\n this.rejoinTimer.reset();\n\n if (this.isErrored()) {\n this.rejoin();\n }\n }));\n this.joinPush.receive(\"ok\", () => {\n this.state = CHANNEL_STATES.joined;\n this.rejoinTimer.reset();\n this.pushBuffer.forEach(pushEvent => pushEvent.send());\n this.pushBuffer = [];\n });\n this.joinPush.receive(\"error\", () => {\n this.state = CHANNEL_STATES.errored;\n\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.onClose(() => {\n this.rejoinTimer.reset();\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `close ${this.topic} ${this.joinRef()}`);\n this.state = CHANNEL_STATES.closed;\n this.socket.remove(this);\n });\n this.onError(reason => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `error ${this.topic}`, reason);\n\n if (this.isJoining()) {\n this.joinPush.reset();\n }\n\n this.state = CHANNEL_STATES.errored;\n\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.joinPush.receive(\"timeout\", () => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout);\n let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout);\n leavePush.send();\n this.state = CHANNEL_STATES.errored;\n this.joinPush.reset();\n\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.on(CHANNEL_EVENTS.reply, (payload, ref) => {\n this.trigger(this.replyEventName(ref), payload);\n });\n }\n\n join(timeout = this.timeout) {\n if (this.joinedOnce) {\n throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");\n } else {\n this.timeout = timeout;\n this.joinedOnce = true;\n this.rejoin();\n return this.joinPush;\n }\n }\n\n onClose(callback) {\n this.on(CHANNEL_EVENTS.close, callback);\n }\n\n onError(callback) {\n return this.on(CHANNEL_EVENTS.error, reason => callback(reason));\n }\n\n on(event, callback) {\n let ref = this.bindingRef++;\n this.bindings.push({\n event,\n ref,\n callback\n });\n return ref;\n }\n\n off(event, ref) {\n this.bindings = this.bindings.filter(bind => {\n return !(bind.event === event && (typeof ref === \"undefined\" || ref === bind.ref));\n });\n }\n\n canPush() {\n return this.socket.isConnected() && this.isJoined();\n }\n\n push(event, payload, timeout = this.timeout) {\n payload = payload || {};\n\n if (!this.joinedOnce) {\n throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`);\n }\n\n let pushEvent = new Push(this, event, function () {\n return payload;\n }, timeout);\n\n if (this.canPush()) {\n pushEvent.send();\n } else {\n pushEvent.startTimeout();\n this.pushBuffer.push(pushEvent);\n }\n\n return pushEvent;\n }\n\n leave(timeout = this.timeout) {\n this.rejoinTimer.reset();\n this.joinPush.cancelTimeout();\n this.state = CHANNEL_STATES.leaving;\n\n let onClose = () => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `leave ${this.topic}`);\n this.trigger(CHANNEL_EVENTS.close, \"leave\");\n };\n\n let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout);\n leavePush.receive(\"ok\", () => onClose()).receive(\"timeout\", () => onClose());\n leavePush.send();\n\n if (!this.canPush()) {\n leavePush.trigger(\"ok\", {});\n }\n\n return leavePush;\n }\n\n onMessage(_event, payload, _ref) {\n return payload;\n }\n\n isMember(topic, event, payload, joinRef) {\n if (this.topic !== topic) {\n return false;\n }\n\n if (joinRef && joinRef !== this.joinRef()) {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", \"dropping outdated message\", {\n topic,\n event,\n payload,\n joinRef\n });\n return false;\n } else {\n return true;\n }\n }\n\n joinRef() {\n return this.joinPush.ref;\n }\n\n rejoin(timeout = this.timeout) {\n if (this.isLeaving()) {\n return;\n }\n\n this.socket.leaveOpenTopic(this.topic);\n this.state = CHANNEL_STATES.joining;\n this.joinPush.resend(timeout);\n }\n\n trigger(event, payload, ref, joinRef) {\n let handledPayload = this.onMessage(event, payload, ref, joinRef);\n\n if (payload && !handledPayload) {\n throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");\n }\n\n let eventBindings = this.bindings.filter(bind => bind.event === event);\n\n for (let i = 0; i < eventBindings.length; i++) {\n let bind = eventBindings[i];\n bind.callback(handledPayload, ref, joinRef || this.joinRef());\n }\n }\n\n replyEventName(ref) {\n return `chan_reply_${ref}`;\n }\n\n isClosed() {\n return this.state === CHANNEL_STATES.closed;\n }\n\n isErrored() {\n return this.state === CHANNEL_STATES.errored;\n }\n\n isJoined() {\n return this.state === CHANNEL_STATES.joined;\n }\n\n isJoining() {\n return this.state === CHANNEL_STATES.joining;\n }\n\n isLeaving() {\n return this.state === CHANNEL_STATES.leaving;\n }\n\n}; // js/phoenix/ajax.js\n\nvar Ajax = class {\n static request(method, endPoint, accept, body, timeout, ontimeout, callback) {\n if (global.XDomainRequest) {\n let req = new global.XDomainRequest();\n this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);\n } else {\n let req = new global.XMLHttpRequest();\n this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);\n }\n }\n\n static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {\n req.timeout = timeout;\n req.open(method, endPoint);\n\n req.onload = () => {\n let response = this.parseJSON(req.responseText);\n callback && callback(response);\n };\n\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n\n req.onprogress = () => {};\n\n req.send(body);\n }\n\n static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {\n req.open(method, endPoint, true);\n req.timeout = timeout;\n req.setRequestHeader(\"Content-Type\", accept);\n\n req.onerror = () => {\n callback && callback(null);\n };\n\n req.onreadystatechange = () => {\n if (req.readyState === XHR_STATES.complete && callback) {\n let response = this.parseJSON(req.responseText);\n callback(response);\n }\n };\n\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n\n req.send(body);\n }\n\n static parseJSON(resp) {\n if (!resp || resp === \"\") {\n return null;\n }\n\n try {\n return JSON.parse(resp);\n } catch (e) {\n console && console.log(\"failed to parse JSON response\", resp);\n return null;\n }\n }\n\n static serialize(obj, parentKey) {\n let queryStr = [];\n\n for (var key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n\n let paramKey = parentKey ? `${parentKey}[${key}]` : key;\n let paramVal = obj[key];\n\n if (typeof paramVal === \"object\") {\n queryStr.push(this.serialize(paramVal, paramKey));\n } else {\n queryStr.push(encodeURIComponent(paramKey) + \"=\" + encodeURIComponent(paramVal));\n }\n }\n\n return queryStr.join(\"&\");\n }\n\n static appendParams(url, params) {\n if (Object.keys(params).length === 0) {\n return url;\n }\n\n let prefix = url.match(/\\?/) ? \"&\" : \"?\";\n return `${url}${prefix}${this.serialize(params)}`;\n }\n\n}; // js/phoenix/longpoll.js\n\nvar LongPoll = class {\n constructor(endPoint) {\n this.endPoint = null;\n this.token = null;\n this.skipHeartbeat = true;\n\n this.onopen = function () {};\n\n this.onerror = function () {};\n\n this.onmessage = function () {};\n\n this.onclose = function () {};\n\n this.pollEndpoint = this.normalizeEndpoint(endPoint);\n this.readyState = SOCKET_STATES.connecting;\n this.poll();\n }\n\n normalizeEndpoint(endPoint) {\n return endPoint.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\").replace(new RegExp(\"(.*)/\" + TRANSPORTS.websocket), \"$1/\" + TRANSPORTS.longpoll);\n }\n\n endpointURL() {\n return Ajax.appendParams(this.pollEndpoint, {\n token: this.token\n });\n }\n\n closeAndRetry() {\n this.close();\n this.readyState = SOCKET_STATES.connecting;\n }\n\n ontimeout() {\n this.onerror(\"timeout\");\n this.closeAndRetry();\n }\n\n poll() {\n if (!(this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting)) {\n return;\n }\n\n Ajax.request(\"GET\", this.endpointURL(), \"application/json\", null, this.timeout, this.ontimeout.bind(this), resp => {\n if (resp) {\n var {\n status,\n token,\n messages\n } = resp;\n this.token = token;\n } else {\n status = 0;\n }\n\n switch (status) {\n case 200:\n messages.forEach(msg => {\n setTimeout(() => {\n this.onmessage({\n data: msg\n });\n }, 0);\n });\n this.poll();\n break;\n\n case 204:\n this.poll();\n break;\n\n case 410:\n this.readyState = SOCKET_STATES.open;\n this.onopen();\n this.poll();\n break;\n\n case 403:\n this.onerror();\n this.close();\n break;\n\n case 0:\n case 500:\n this.onerror();\n this.closeAndRetry();\n break;\n\n default:\n throw new Error(`unhandled poll status ${status}`);\n }\n });\n }\n\n send(body) {\n Ajax.request(\"POST\", this.endpointURL(), \"application/json\", body, this.timeout, this.onerror.bind(this, \"timeout\"), resp => {\n if (!resp || resp.status !== 200) {\n this.onerror(resp && resp.status);\n this.closeAndRetry();\n }\n });\n }\n\n close(_code, _reason) {\n this.readyState = SOCKET_STATES.closed;\n this.onclose();\n }\n\n}; // js/phoenix/presence.js\n\nvar Presence = class {\n constructor(channel, opts = {}) {\n let events = opts.events || {\n state: \"presence_state\",\n diff: \"presence_diff\"\n };\n this.state = {};\n this.pendingDiffs = [];\n this.channel = channel;\n this.joinRef = null;\n this.caller = {\n onJoin: function () {},\n onLeave: function () {},\n onSync: function () {}\n };\n this.channel.on(events.state, newState => {\n let {\n onJoin,\n onLeave,\n onSync\n } = this.caller;\n this.joinRef = this.channel.joinRef();\n this.state = Presence.syncState(this.state, newState, onJoin, onLeave);\n this.pendingDiffs.forEach(diff => {\n this.state = Presence.syncDiff(this.state, diff, onJoin, onLeave);\n });\n this.pendingDiffs = [];\n onSync();\n });\n this.channel.on(events.diff, diff => {\n let {\n onJoin,\n onLeave,\n onSync\n } = this.caller;\n\n if (this.inPendingSyncState()) {\n this.pendingDiffs.push(diff);\n } else {\n this.state = Presence.syncDiff(this.state, diff, onJoin, onLeave);\n onSync();\n }\n });\n }\n\n onJoin(callback) {\n this.caller.onJoin = callback;\n }\n\n onLeave(callback) {\n this.caller.onLeave = callback;\n }\n\n onSync(callback) {\n this.caller.onSync = callback;\n }\n\n list(by) {\n return Presence.list(this.state, by);\n }\n\n inPendingSyncState() {\n return !this.joinRef || this.joinRef !== this.channel.joinRef();\n }\n\n static syncState(currentState, newState, onJoin, onLeave) {\n let state = this.clone(currentState);\n let joins = {};\n let leaves = {};\n this.map(state, (key, presence) => {\n if (!newState[key]) {\n leaves[key] = presence;\n }\n });\n this.map(newState, (key, newPresence) => {\n let currentPresence = state[key];\n\n if (currentPresence) {\n let newRefs = newPresence.metas.map(m => m.phx_ref);\n let curRefs = currentPresence.metas.map(m => m.phx_ref);\n let joinedMetas = newPresence.metas.filter(m => curRefs.indexOf(m.phx_ref) < 0);\n let leftMetas = currentPresence.metas.filter(m => newRefs.indexOf(m.phx_ref) < 0);\n\n if (joinedMetas.length > 0) {\n joins[key] = newPresence;\n joins[key].metas = joinedMetas;\n }\n\n if (leftMetas.length > 0) {\n leaves[key] = this.clone(currentPresence);\n leaves[key].metas = leftMetas;\n }\n } else {\n joins[key] = newPresence;\n }\n });\n return this.syncDiff(state, {\n joins,\n leaves\n }, onJoin, onLeave);\n }\n\n static syncDiff(state, diff, onJoin, onLeave) {\n let {\n joins,\n leaves\n } = this.clone(diff);\n\n if (!onJoin) {\n onJoin = function () {};\n }\n\n if (!onLeave) {\n onLeave = function () {};\n }\n\n this.map(joins, (key, newPresence) => {\n let currentPresence = state[key];\n state[key] = this.clone(newPresence);\n\n if (currentPresence) {\n let joinedRefs = state[key].metas.map(m => m.phx_ref);\n let curMetas = currentPresence.metas.filter(m => joinedRefs.indexOf(m.phx_ref) < 0);\n state[key].metas.unshift(...curMetas);\n }\n\n onJoin(key, currentPresence, newPresence);\n });\n this.map(leaves, (key, leftPresence) => {\n let currentPresence = state[key];\n\n if (!currentPresence) {\n return;\n }\n\n let refsToRemove = leftPresence.metas.map(m => m.phx_ref);\n currentPresence.metas = currentPresence.metas.filter(p => {\n return refsToRemove.indexOf(p.phx_ref) < 0;\n });\n onLeave(key, currentPresence, leftPresence);\n\n if (currentPresence.metas.length === 0) {\n delete state[key];\n }\n });\n return state;\n }\n\n static list(presences, chooser) {\n if (!chooser) {\n chooser = function (key, pres) {\n return pres;\n };\n }\n\n return this.map(presences, (key, presence) => {\n return chooser(key, presence);\n });\n }\n\n static map(obj, func) {\n return Object.getOwnPropertyNames(obj).map(key => func(key, obj[key]));\n }\n\n static clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n }\n\n}; // js/phoenix/serializer.js\n\nvar serializer_default = {\n HEADER_LENGTH: 1,\n META_LENGTH: 4,\n KINDS: {\n push: 0,\n reply: 1,\n broadcast: 2\n },\n\n encode(msg, callback) {\n if (msg.payload.constructor === ArrayBuffer) {\n return callback(this.binaryEncode(msg));\n } else {\n let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload];\n return callback(JSON.stringify(payload));\n }\n },\n\n decode(rawPayload, callback) {\n if (rawPayload.constructor === ArrayBuffer) {\n return callback(this.binaryDecode(rawPayload));\n } else {\n let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload);\n return callback({\n join_ref,\n ref,\n topic,\n event,\n payload\n });\n }\n },\n\n binaryEncode(message) {\n let {\n join_ref,\n ref,\n event,\n topic,\n payload\n } = message;\n let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length;\n let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);\n let view = new DataView(header);\n let offset = 0;\n view.setUint8(offset++, this.KINDS.push);\n view.setUint8(offset++, join_ref.length);\n view.setUint8(offset++, ref.length);\n view.setUint8(offset++, topic.length);\n view.setUint8(offset++, event.length);\n Array.from(join_ref, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(ref, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(topic, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(event, char => view.setUint8(offset++, char.charCodeAt(0)));\n var combined = new Uint8Array(header.byteLength + payload.byteLength);\n combined.set(new Uint8Array(header), 0);\n combined.set(new Uint8Array(payload), header.byteLength);\n return combined.buffer;\n },\n\n binaryDecode(buffer) {\n let view = new DataView(buffer);\n let kind = view.getUint8(0);\n let decoder = new TextDecoder();\n\n switch (kind) {\n case this.KINDS.push:\n return this.decodePush(buffer, view, decoder);\n\n case this.KINDS.reply:\n return this.decodeReply(buffer, view, decoder);\n\n case this.KINDS.broadcast:\n return this.decodeBroadcast(buffer, view, decoder);\n }\n },\n\n decodePush(buffer, view, decoder) {\n let joinRefSize = view.getUint8(1);\n let topicSize = view.getUint8(2);\n let eventSize = view.getUint8(3);\n let offset = this.HEADER_LENGTH + this.META_LENGTH - 1;\n let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize));\n offset = offset + joinRefSize;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n return {\n join_ref: joinRef,\n ref: null,\n topic,\n event,\n payload: data\n };\n },\n\n decodeReply(buffer, view, decoder) {\n let joinRefSize = view.getUint8(1);\n let refSize = view.getUint8(2);\n let topicSize = view.getUint8(3);\n let eventSize = view.getUint8(4);\n let offset = this.HEADER_LENGTH + this.META_LENGTH;\n let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize));\n offset = offset + joinRefSize;\n let ref = decoder.decode(buffer.slice(offset, offset + refSize));\n offset = offset + refSize;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n let payload = {\n status: event,\n response: data\n };\n return {\n join_ref: joinRef,\n ref,\n topic,\n event: CHANNEL_EVENTS.reply,\n payload\n };\n },\n\n decodeBroadcast(buffer, view, decoder) {\n let topicSize = view.getUint8(1);\n let eventSize = view.getUint8(2);\n let offset = this.HEADER_LENGTH + 2;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n return {\n join_ref: null,\n ref: null,\n topic,\n event,\n payload: data\n };\n }\n\n}; // js/phoenix/socket.js\n\nvar Socket = class {\n constructor(endPoint, opts = {}) {\n this.stateChangeCallbacks = {\n open: [],\n close: [],\n error: [],\n message: []\n };\n this.channels = [];\n this.sendBuffer = [];\n this.ref = 0;\n this.timeout = opts.timeout || DEFAULT_TIMEOUT;\n this.transport = opts.transport || global.WebSocket || LongPoll;\n this.establishedConnections = 0;\n this.defaultEncoder = serializer_default.encode.bind(serializer_default);\n this.defaultDecoder = serializer_default.decode.bind(serializer_default);\n this.closeWasClean = false;\n this.binaryType = opts.binaryType || \"arraybuffer\";\n this.connectClock = 1;\n\n if (this.transport !== LongPoll) {\n this.encode = opts.encode || this.defaultEncoder;\n this.decode = opts.decode || this.defaultDecoder;\n } else {\n this.encode = this.defaultEncoder;\n this.decode = this.defaultDecoder;\n }\n\n let awaitingConnectionOnPageShow = null;\n\n if (phxWindow && phxWindow.addEventListener) {\n phxWindow.addEventListener(\"pagehide\", _e => {\n if (this.conn) {\n this.disconnect();\n awaitingConnectionOnPageShow = this.connectClock;\n }\n });\n phxWindow.addEventListener(\"pageshow\", _e => {\n if (awaitingConnectionOnPageShow === this.connectClock) {\n awaitingConnectionOnPageShow = null;\n this.connect();\n }\n });\n }\n\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4;\n\n this.rejoinAfterMs = tries => {\n if (opts.rejoinAfterMs) {\n return opts.rejoinAfterMs(tries);\n } else {\n return [1e3, 2e3, 5e3][tries - 1] || 1e4;\n }\n };\n\n this.reconnectAfterMs = tries => {\n if (opts.reconnectAfterMs) {\n return opts.reconnectAfterMs(tries);\n } else {\n return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3;\n }\n };\n\n this.logger = opts.logger || null;\n this.longpollerTimeout = opts.longpollerTimeout || 2e4;\n this.params = closure(opts.params || {});\n this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`;\n this.vsn = opts.vsn || DEFAULT_VSN;\n this.heartbeatTimer = null;\n this.pendingHeartbeatRef = null;\n this.reconnectTimer = new Timer(() => {\n this.teardown(() => this.connect());\n }, this.reconnectAfterMs);\n }\n\n replaceTransport(newTransport) {\n this.disconnect();\n this.transport = newTransport;\n }\n\n protocol() {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n\n endPointURL() {\n let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), {\n vsn: this.vsn\n });\n\n if (uri.charAt(0) !== \"/\") {\n return uri;\n }\n\n if (uri.charAt(1) === \"/\") {\n return `${this.protocol()}:${uri}`;\n }\n\n return `${this.protocol()}://${location.host}${uri}`;\n }\n\n disconnect(callback, code, reason) {\n this.connectClock++;\n this.closeWasClean = true;\n this.reconnectTimer.reset();\n this.teardown(callback, code, reason);\n }\n\n connect(params) {\n this.connectClock++;\n\n if (params) {\n console && console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\");\n this.params = closure(params);\n }\n\n if (this.conn) {\n return;\n }\n\n this.closeWasClean = false;\n this.conn = new this.transport(this.endPointURL());\n this.conn.binaryType = this.binaryType;\n this.conn.timeout = this.longpollerTimeout;\n\n this.conn.onopen = () => this.onConnOpen();\n\n this.conn.onerror = error => this.onConnError(error);\n\n this.conn.onmessage = event => this.onConnMessage(event);\n\n this.conn.onclose = event => this.onConnClose(event);\n }\n\n log(kind, msg, data) {\n this.logger(kind, msg, data);\n }\n\n hasLogger() {\n return this.logger !== null;\n }\n\n onOpen(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.open.push([ref, callback]);\n return ref;\n }\n\n onClose(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.close.push([ref, callback]);\n return ref;\n }\n\n onError(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.error.push([ref, callback]);\n return ref;\n }\n\n onMessage(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.message.push([ref, callback]);\n return ref;\n }\n\n onConnOpen() {\n if (this.hasLogger()) this.log(\"transport\", `connected to ${this.endPointURL()}`);\n this.closeWasClean = false;\n this.establishedConnections++;\n this.flushSendBuffer();\n this.reconnectTimer.reset();\n this.resetHeartbeat();\n this.stateChangeCallbacks.open.forEach(([, callback]) => callback());\n }\n\n heartbeatTimeout() {\n if (this.pendingHeartbeatRef) {\n this.pendingHeartbeatRef = null;\n\n if (this.hasLogger()) {\n this.log(\"transport\", \"heartbeat timeout. Attempting to re-establish connection\");\n }\n\n this.abnormalClose(\"heartbeat timeout\");\n }\n }\n\n resetHeartbeat() {\n if (this.conn && this.conn.skipHeartbeat) {\n return;\n }\n\n this.pendingHeartbeatRef = null;\n clearTimeout(this.heartbeatTimer);\n setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n\n teardown(callback, code, reason) {\n if (!this.conn) {\n return callback && callback();\n }\n\n this.waitForBufferDone(() => {\n if (this.conn) {\n if (code) {\n this.conn.close(code, reason || \"\");\n } else {\n this.conn.close();\n }\n }\n\n this.waitForSocketClosed(() => {\n if (this.conn) {\n this.conn.onclose = function () {};\n\n this.conn = null;\n }\n\n callback && callback();\n });\n });\n }\n\n waitForBufferDone(callback, tries = 1) {\n if (tries === 5 || !this.conn || !this.conn.bufferedAmount) {\n callback();\n return;\n }\n\n setTimeout(() => {\n this.waitForBufferDone(callback, tries + 1);\n }, 150 * tries);\n }\n\n waitForSocketClosed(callback, tries = 1) {\n if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) {\n callback();\n return;\n }\n\n setTimeout(() => {\n this.waitForSocketClosed(callback, tries + 1);\n }, 150 * tries);\n }\n\n onConnClose(event) {\n let closeCode = event && event.code;\n if (this.hasLogger()) this.log(\"transport\", \"close\", event);\n this.triggerChanError();\n clearTimeout(this.heartbeatTimer);\n\n if (!this.closeWasClean && closeCode !== 1e3) {\n this.reconnectTimer.scheduleTimeout();\n }\n\n this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event));\n }\n\n onConnError(error) {\n if (this.hasLogger()) this.log(\"transport\", error);\n let transportBefore = this.transport;\n let establishedBefore = this.establishedConnections;\n this.stateChangeCallbacks.error.forEach(([, callback]) => {\n callback(error, transportBefore, establishedBefore);\n });\n\n if (transportBefore === this.transport || establishedBefore > 0) {\n this.triggerChanError();\n }\n }\n\n triggerChanError() {\n this.channels.forEach(channel => {\n if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) {\n channel.trigger(CHANNEL_EVENTS.error);\n }\n });\n }\n\n connectionState() {\n switch (this.conn && this.conn.readyState) {\n case SOCKET_STATES.connecting:\n return \"connecting\";\n\n case SOCKET_STATES.open:\n return \"open\";\n\n case SOCKET_STATES.closing:\n return \"closing\";\n\n default:\n return \"closed\";\n }\n }\n\n isConnected() {\n return this.connectionState() === \"open\";\n }\n\n remove(channel) {\n this.off(channel.stateChangeRefs);\n this.channels = this.channels.filter(c => c.joinRef() !== channel.joinRef());\n }\n\n off(refs) {\n for (let key in this.stateChangeCallbacks) {\n this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => {\n return refs.indexOf(ref) === -1;\n });\n }\n }\n\n channel(topic, chanParams = {}) {\n let chan = new Channel(topic, chanParams, this);\n this.channels.push(chan);\n return chan;\n }\n\n push(data) {\n if (this.hasLogger()) {\n let {\n topic,\n event,\n payload,\n ref,\n join_ref\n } = data;\n this.log(\"push\", `${topic} ${event} (${join_ref}, ${ref})`, payload);\n }\n\n if (this.isConnected()) {\n this.encode(data, result => this.conn.send(result));\n } else {\n this.sendBuffer.push(() => this.encode(data, result => this.conn.send(result)));\n }\n }\n\n makeRef() {\n let newRef = this.ref + 1;\n\n if (newRef === this.ref) {\n this.ref = 0;\n } else {\n this.ref = newRef;\n }\n\n return this.ref.toString();\n }\n\n sendHeartbeat() {\n if (this.pendingHeartbeatRef && !this.isConnected()) {\n return;\n }\n\n this.pendingHeartbeatRef = this.makeRef();\n this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref: this.pendingHeartbeatRef\n });\n this.heartbeatTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs);\n }\n\n abnormalClose(reason) {\n this.closeWasClean = false;\n\n if (this.isConnected()) {\n this.conn.close(WS_CLOSE_NORMAL, reason);\n }\n }\n\n flushSendBuffer() {\n if (this.isConnected() && this.sendBuffer.length > 0) {\n this.sendBuffer.forEach(callback => callback());\n this.sendBuffer = [];\n }\n }\n\n onConnMessage(rawMessage) {\n this.decode(rawMessage.data, msg => {\n let {\n topic,\n event,\n payload,\n ref,\n join_ref\n } = msg;\n\n if (ref && ref === this.pendingHeartbeatRef) {\n clearTimeout(this.heartbeatTimer);\n this.pendingHeartbeatRef = null;\n setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n\n if (this.hasLogger()) this.log(\"receive\", `${payload.status || \"\"} ${topic} ${event} ${ref && \"(\" + ref + \")\" || \"\"}`, payload);\n\n for (let i = 0; i < this.channels.length; i++) {\n const channel = this.channels[i];\n\n if (!channel.isMember(topic, event, payload, join_ref)) {\n continue;\n }\n\n channel.trigger(event, payload, ref, join_ref);\n }\n\n for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) {\n let [, callback] = this.stateChangeCallbacks.message[i];\n callback(msg);\n }\n });\n }\n\n leaveOpenTopic(topic) {\n let dupChannel = this.channels.find(c => c.topic === topic && (c.isJoined() || c.isJoining()));\n\n if (dupChannel) {\n if (this.hasLogger()) this.log(\"transport\", `leaving duplicate topic \"${topic}\"`);\n dupChannel.leave();\n }\n }\n\n};\n\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/phoenix/priv/static/phoenix.esm.js?");
83
73
 
84
74
  /***/ }),
85
75
 
@@ -244,7 +234,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
244
234
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
245
235
 
246
236
  "use strict";
247
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"API\": () => (/* binding */ API)\n/* harmony export */ });\n/* harmony import */ var xstream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! xstream */ \"./node_modules/xstream/index.js\");\n/* harmony import */ var xstream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(xstream__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent */ \"./node_modules/superagent/lib/client.js\");\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _lib_store_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/store/index */ \"./src/javascripts/lib/store/index.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _producer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./producer */ \"./src/javascripts/api/producer.js\");\n/* harmony import */ var _lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/store/providers/session-storage */ \"./src/javascripts/lib/store/providers/session-storage.js\");\n/* harmony import */ var _event_producer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./event-producer */ \"./src/javascripts/api/event-producer.js\");\n/* harmony import */ var _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_lib_debug__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst log = _lib_debug__WEBPACK_IMPORTED_MODULE_12___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\nconst TRANSLATIONS_VERSION = 1;\n\nfunction buildPayload(command, payload) {\n if (command !== 'message') {\n return payload;\n }\n\n const {\n type,\n body\n } = payload;\n let {\n transactionId\n } = payload;\n\n if (!transactionId) {\n transactionId = (0,_lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)();\n }\n\n return {\n type,\n body,\n transactionId\n };\n}\n/**\n * Tries to get the time zone key directly from the operating system for those\n * environments that support the ECMAScript Internationalization API.\n *\n * Based on https://github.com/pellepim/jstimezonedetect/blob/master/jstz.main.js\n */\n\n\nfunction getTimeZone() {\n if (!Intl || typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return null;\n }\n\n const format = Intl.DateTimeFormat();\n\n if (typeof format === 'undefined' || typeof format.resolvedOptions === 'undefined') {\n return null;\n }\n\n const timezone = format.resolvedOptions().timeZone; // Ensure we get a valid timezone\n\n if (timezone && (timezone.indexOf('/') > -1 || timezone === 'UTC')) {\n return timezone;\n } else {\n return null;\n }\n}\n\nfunction getEnvironment() {\n return {\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n userAgent: navigator.userAgent,\n currentUrl: window.location.toString(),\n timezone: getTimeZone()\n };\n}\n\nclass API {\n /**\n * Creates an instance of API.\n * @param {Object} [config={}]\n * @param {string} config.key Api key\n * @param {string} config.domain Domain to connect to\n * @param {string} config.secure Connect securely\n * @param {string} config.externalId Unique visitor identifier (optional)\n * @param {boolean} config.sendEnvironment\n * @param {string} namespace\n * @param {Object} [context={ variables: undefined, locale: undefined }]\n * @param {object} context.variables\n * @param {string} context.locale\n * @memberof API\n */\n constructor({\n namespace,\n config = {},\n context = {}\n }) {\n var _config$sendEnvironme;\n\n this.store = (0,_lib_store_index__WEBPACK_IMPORTED_MODULE_3__.objectStore)(`${namespace}.connection${context.locale ? '.' + context.locale : ''}`, config.storageProvider || _lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n this.connectionInfo = {\n apiKey: config.key,\n domain: config.domain || DOMAIN,\n secure: config.secure !== false ? config.secure || true : false\n };\n this.config = {\n sendEnvironment: (_config$sendEnvironme = config.sendEnvironment) !== null && _config$sendEnvironme !== void 0 ? _config$sendEnvironme : true,\n context\n };\n this.connected = false;\n this.configReady = false;\n this.externalId = config.externalId;\n this.internalProducer = new _event_producer__WEBPACK_IMPORTED_MODULE_7__[\"default\"]('API');\n this.internal$ = xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.internalProducer).flatten();\n this.connection$ = this.internal$.filter(event => event.type === 'connection');\n this.connection$.subscribe({\n next: ({\n connected,\n ready\n }) => {\n this.connected = connected;\n this.ready = ready;\n }\n });\n this.URLS = {};\n }\n\n getAccessToken() {\n return this.store.get('accessToken');\n }\n\n setAccessToken(accessToken) {\n this.store.set('accessToken', accessToken);\n }\n\n getConversationUrl() {\n return this.store.get('conversationUrl');\n }\n\n setConversationUrl(url) {\n this.store.set('conversationUrl', url);\n }\n\n hasConversation() {\n return !!this.getConversationUrl();\n }\n\n getChannelName() {\n return this.store.get('channelName');\n }\n\n setChannelName(name) {\n this.store.set('channelName', name);\n }\n\n clearStore() {\n this.store.delete('accessToken');\n this.store.delete('conversationUrl');\n this.store.delete('channelName');\n }\n\n getUrlPrefix(protocol) {\n const realProtocol = this.connectionInfo.secure ? `${protocol}s` : protocol;\n return `${realProtocol}://${this.connectionInfo.domain}`;\n }\n\n updateUrls({\n _links: responseLinks\n }) {\n this.URLS = Object.entries(responseLinks).filter(([key]) => key !== 'self').reduce((urls, [key, {\n href\n }]) => {\n return _objectSpread(_objectSpread({}, urls), {}, {\n [key]: href\n });\n }, this.URLS);\n }\n\n async reset() {\n await this.disconnect();\n this.clearStore();\n return this.getConfig();\n }\n\n async disconnect() {\n if (this.conversationProducer) {\n await this.conversationProducer.disconnect();\n }\n\n this.connected = false;\n this.configReady = false;\n }\n\n async createConversation() {\n try {\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.conversations}`).set('Content-Type', 'application/json').query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }) // withCredentials() is necessary to allow browsers to save received\n // cookies in CORS requests.\n .withCredentials().send({\n externalId: this.externalId || undefined\n });\n const {\n body\n } = await request;\n const {\n conversation\n } = body;\n\n const initialState = _objectSpread({}, conversation);\n\n delete initialState.accessToken;\n delete initialState.channelName;\n this.setAccessToken(conversation.accessToken);\n this.setChannelName(conversation.channelName);\n this.updateUrls(body);\n this.setConversationUrl(this.URLS.conversation);\n return initialState;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n getConfig() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}/client/${this.connectionInfo.apiKey}/configs`).set('Content-Type', 'application/json').query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).send({\n context: _objectSpread(_objectSpread({}, this.config.context), {}, {\n environment: this.config.sendEnvironment === true ? getEnvironment() : this.config.sendEnvironment\n })\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n this.configReady = true;\n return body.config;\n }).catch(error => {\n if (error.status === 404) {\n throw new _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_9__[\"default\"]();\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"]();\n }\n\n throw error;\n });\n }\n\n async getConversation() {\n if (!this.hasConversation()) {\n return null;\n }\n\n try {\n const {\n body\n } = await superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.URLS.history}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n });\n this.updateUrls(body);\n const {\n messages,\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n ui,\n translation\n } = body.history;\n return {\n events: messages.map(([type, msg]) => {\n return {\n type,\n payload: _objectSpread(_objectSpread({}, msg), {}, {\n type: type === 'participant' ? type : msg.type\n })\n };\n }),\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n resumeConversationPrompt: ui ? Boolean(ui.resumeConversationPrompt) : false,\n translation\n };\n } catch (error) {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n async connect() {\n this.connected = false;\n let conversationInitialState = null;\n\n if (!this.hasConversation()) {\n conversationInitialState = await this.createConversation();\n }\n\n this.conversationProducer = new _producer__WEBPACK_IMPORTED_MODULE_5__[\"default\"](`${this.getUrlPrefix('ws')}${this.URLS.socket}`, this.getChannelName(), this.getAccessToken());\n this.internalProducer.emit(xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.conversationProducer)); // Send environment\n\n if (this.config.sendEnvironment) {\n this.send('context', {\n environment: this.config.sendEnvironment === true ? getEnvironment() : this.config.sendEnvironment\n }, false);\n }\n\n return conversationInitialState;\n }\n\n uploadFile(file, progressCallback, successCallback, errorCallback) {\n const formData = new FormData();\n formData.append('upload', file);\n const req = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.uploads}`).set('Authorization', `Bearer ${this.getAccessToken()}`).send(formData);\n req.on('progress', function (e) {\n const {\n direction,\n percent\n } = e;\n\n if (direction === 'upload' && typeof progressCallback === 'function') {\n progressCallback(percent);\n }\n });\n req.then(uploadResponse => {\n if (successCallback) {\n successCallback(uploadResponse);\n }\n }).catch(err => {\n if (errorCallback) {\n errorCallback(err.response);\n } else {\n throw err;\n }\n });\n return req;\n }\n\n getConversationIntitialState() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.getConversationUrl()}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n return (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__.omit)(body.conversation, ['accessToken', 'channelName']);\n }).catch(error => {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n });\n }\n\n async getTranslations(locale) {\n try {\n const url = `${this.getUrlPrefix('http')}${this.URLS.translations}`.replace('{version}', String(TRANSLATIONS_VERSION)).replace('{locale}', locale);\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().get(url);\n const {\n body\n } = await request;\n return body.translations;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n send(command, payload, waitForReady = true) {\n if (!this.connected || waitForReady && !this.ready) {\n // Wait for connection\n this.connection$.filter(e => waitForReady ? e.connected && e.ready : e.connected).take(1).subscribe({\n next: () => this.send(command, payload, waitForReady)\n });\n return;\n }\n\n log('[SEND]', command, payload);\n this.conversationProducer.push(command, buildPayload(command, payload), 10000);\n }\n\n sendContext(context = {}) {\n const {\n locale,\n variables\n } = context;\n const payload = {};\n\n if (locale) {\n if (typeof locale !== 'string') {\n throw new Error('Locale must be a string');\n }\n\n payload.locale = locale;\n }\n\n if (variables) {\n if (typeof variables !== 'object') {\n throw new Error('Variables must be an object');\n }\n\n payload.variables = variables;\n } // If we have empty context don't send context message\n\n\n if (Object.keys(payload).length === 0 && payload.constructor === Object) {\n return;\n }\n\n this.send('context', payload, false);\n }\n\n stream() {\n return this.internal$.filter(event => event.type !== 'connection');\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/index.js?");
237
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"API\": () => (/* binding */ API)\n/* harmony export */ });\n/* harmony import */ var xstream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! xstream */ \"./node_modules/xstream/index.js\");\n/* harmony import */ var xstream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(xstream__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent */ \"./node_modules/superagent/lib/client.js\");\n/* harmony import */ var superagent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _lib_store_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/store/index */ \"./src/javascripts/lib/store/index.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _producer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./producer */ \"./src/javascripts/api/producer.js\");\n/* harmony import */ var _lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/store/providers/session-storage */ \"./src/javascripts/lib/store/providers/session-storage.js\");\n/* harmony import */ var _event_producer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./event-producer */ \"./src/javascripts/api/event-producer.js\");\n/* harmony import */ var _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_lib_debug__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst log = _lib_debug__WEBPACK_IMPORTED_MODULE_12___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\nconst TRANSLATIONS_VERSION = 1;\n\nfunction buildPayload(command, payload) {\n if (command !== 'message') {\n return payload;\n }\n\n const {\n type,\n body\n } = payload;\n let {\n transactionId\n } = payload;\n\n if (!transactionId) {\n transactionId = (0,_lib_id__WEBPACK_IMPORTED_MODULE_4__.randomId)();\n }\n\n return {\n type,\n body,\n transactionId\n };\n}\n/**\n * Tries to get the time zone key directly from the operating system for those\n * environments that support the ECMAScript Internationalization API.\n *\n * Based on https://github.com/pellepim/jstimezonedetect/blob/master/jstz.main.js\n */\n\n\nfunction getTimeZone() {\n if (!Intl || typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return null;\n }\n\n const format = Intl.DateTimeFormat();\n\n if (typeof format === 'undefined' || typeof format.resolvedOptions === 'undefined') {\n return null;\n }\n\n const timezone = format.resolvedOptions().timeZone; // Ensure we get a valid timezone\n\n if (timezone && (timezone.indexOf('/') > -1 || timezone === 'UTC')) {\n return timezone;\n } else {\n return null;\n }\n}\n\nfunction getEnvironment() {\n return {\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n userAgent: navigator.userAgent,\n currentUrl: window.location.toString(),\n timezone: getTimeZone()\n };\n}\n\nclass API {\n /**\n * Creates an instance of API.\n * @param {Object} [config={}]\n * @param {string} config.key Api key\n * @param {string} config.domain Domain to connect to\n * @param {string} config.secure Connect securely\n * @param {string} config.externalId Unique visitor identifier (optional)\n * @param {boolean} config.sendEnvironment\n * @param {string} namespace\n * @param {Object} [context={ channelName: undefined, variables: undefined, locale: undefined }]\n * @param {string} context.channelName\n * @param {object} context.variables\n * @param {string} context.locale\n * @memberof API\n */\n constructor({\n namespace,\n config = {},\n context = {}\n }) {\n this.store = (0,_lib_store_index__WEBPACK_IMPORTED_MODULE_3__.objectStore)(`${namespace}.connection${context.locale ? '.' + context.locale : ''}`, config.storageProvider || _lib_store_providers_session_storage__WEBPACK_IMPORTED_MODULE_6__[\"default\"]);\n this.connectionInfo = {\n apiKey: config.key,\n domain: config.domain || DOMAIN,\n secure: config.secure !== false ? config.secure || true : false\n };\n this.config = {\n sendEnvironment: config.sendEnvironment ?? true,\n context: _objectSpread(_objectSpread({}, context), {}, {\n channelName: context.channelName || 'web'\n })\n };\n this.connected = false;\n this.configReady = false;\n this.externalId = config.externalId;\n this.internalProducer = new _event_producer__WEBPACK_IMPORTED_MODULE_7__[\"default\"]('API');\n this.internal$ = xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.internalProducer).flatten();\n this.connection$ = this.internal$.filter(event => event.type === 'connection');\n this.connection$.subscribe({\n next: ({\n connected,\n ready\n }) => {\n this.connected = connected;\n this.ready = ready;\n }\n });\n this.URLS = {};\n }\n\n getAccessToken() {\n return this.store.get('accessToken');\n }\n\n setAccessToken(accessToken) {\n this.store.set('accessToken', accessToken);\n }\n\n getConversationUrl() {\n return this.store.get('conversationUrl');\n }\n\n setConversationUrl(url) {\n this.store.set('conversationUrl', url);\n }\n\n hasConversation() {\n return !!this.getConversationUrl();\n }\n\n getChannelTopic() {\n // The `channelName` fallback is needed for seamless client upgrades.\n // TODO: Remove when all clients have been upgraded past v20.\n return this.store.get('channelTopic') || this.store.get('channelName');\n }\n\n setChannelTopic(topic) {\n this.store.set('channelTopic', topic);\n }\n\n clearStore() {\n this.store.delete('accessToken');\n this.store.delete('conversationUrl'); // TODO: Remove `channelName` when all clients have been upgraded past v20.\n\n this.store.delete('channelName');\n this.store.delete('channelTopic');\n }\n\n getUrlPrefix(protocol) {\n const realProtocol = this.connectionInfo.secure ? `${protocol}s` : protocol;\n return `${realProtocol}://${this.connectionInfo.domain}`;\n }\n\n updateUrls({\n _links: responseLinks\n }) {\n this.URLS = Object.entries(responseLinks).filter(([key]) => key !== 'self').reduce((urls, [key, {\n href\n }]) => {\n return _objectSpread(_objectSpread({}, urls), {}, {\n [key]: href\n });\n }, this.URLS);\n }\n\n async reset() {\n await this.disconnect();\n this.clearStore();\n return this.getConfig();\n }\n\n async disconnect() {\n if (this.conversationProducer) {\n await this.conversationProducer.disconnect();\n }\n\n this.connected = false;\n this.configReady = false;\n }\n\n async createConversation() {\n try {\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.conversations}`).set('Content-Type', 'application/json').query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }) // withCredentials() is necessary to allow browsers to save received\n // cookies in CORS requests.\n .withCredentials().send({\n externalId: this.externalId || undefined\n });\n const {\n body\n } = await request;\n const {\n conversation\n } = body;\n\n const initialState = _objectSpread({}, conversation);\n\n delete initialState.accessToken;\n delete initialState.channelTopic;\n this.setAccessToken(conversation.accessToken);\n this.setChannelTopic(conversation.channelTopic);\n this.updateUrls(body);\n this.setConversationUrl(this.URLS.conversation);\n return initialState;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n getConfig() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}/client/${this.connectionInfo.apiKey}/configs`).set('Content-Type', 'application/json').query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).send({\n context: _objectSpread(_objectSpread({}, this.config.context), {}, {\n environment: this.config.sendEnvironment === true ? getEnvironment() : this.config.sendEnvironment\n })\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n this.configReady = true;\n return body.config;\n }).catch(error => {\n if (error.status === 404) {\n throw new _errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_9__[\"default\"]();\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"]();\n }\n\n throw error;\n });\n }\n\n async getConversation() {\n if (!this.hasConversation()) {\n return null;\n }\n\n try {\n const {\n body\n } = await superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.URLS.history}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n });\n this.updateUrls(body);\n const {\n messages,\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n ui,\n translation\n } = body.history;\n return {\n events: messages.map(([type, msg]) => {\n return {\n type,\n payload: _objectSpread(_objectSpread({}, msg), {}, {\n type: type === 'participant' ? type : msg.type\n })\n };\n }),\n participants,\n activeServiceSessionId,\n activeServiceSettings,\n serviceData,\n resumeConversationPrompt: ui ? Boolean(ui.resumeConversationPrompt) : false,\n translation\n };\n } catch (error) {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n async connect() {\n this.connected = false;\n let conversationInitialState = null;\n\n if (!this.hasConversation()) {\n conversationInitialState = await this.createConversation();\n }\n\n this.conversationProducer = new _producer__WEBPACK_IMPORTED_MODULE_5__[\"default\"](`${this.getUrlPrefix('ws')}${this.URLS.socket}`, this.config.context.channelName, this.getChannelTopic(), this.getAccessToken());\n this.internalProducer.emit(xstream__WEBPACK_IMPORTED_MODULE_0___default().create(this.conversationProducer)); // Send environment\n\n if (this.config.sendEnvironment) {\n this.send('context', {\n environment: this.config.sendEnvironment === true ? getEnvironment() : this.config.sendEnvironment\n }, false);\n }\n\n return conversationInitialState;\n }\n\n uploadFile(file, progressCallback, successCallback, errorCallback) {\n const formData = new FormData();\n formData.append('upload', file);\n const req = superagent__WEBPACK_IMPORTED_MODULE_1___default().post(`${this.getUrlPrefix('http')}${this.URLS.uploads}`).set('Authorization', `Bearer ${this.getAccessToken()}`).send(formData);\n req.on('progress', function (e) {\n const {\n direction,\n percent\n } = e;\n\n if (direction === 'upload' && typeof progressCallback === 'function') {\n progressCallback(percent);\n }\n });\n req.then(uploadResponse => {\n if (successCallback) {\n successCallback(uploadResponse);\n }\n }).catch(err => {\n if (errorCallback) {\n errorCallback(err.response);\n } else {\n throw err;\n }\n });\n return req;\n }\n\n getConversationIntitialState() {\n return superagent__WEBPACK_IMPORTED_MODULE_1___default().get(`${this.getUrlPrefix('http')}${this.getConversationUrl()}`).set('Authorization', `Bearer ${this.getAccessToken()}`).query({\n v: _config__WEBPACK_IMPORTED_MODULE_2__.apiVersion\n }).then(({\n body\n }) => {\n this.updateUrls(body);\n return (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__.omit)(body.conversation, ['accessToken', 'channelTopic']);\n }).catch(error => {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"](error);\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"default\"](error);\n }\n\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n });\n }\n\n async getTranslations(locale) {\n try {\n const url = `${this.getUrlPrefix('http')}${this.URLS.translations}`.replace('{version}', String(TRANSLATIONS_VERSION)).replace('{locale}', locale);\n const request = superagent__WEBPACK_IMPORTED_MODULE_1___default().get(url);\n const {\n body\n } = await request;\n return body.translations;\n } catch (error) {\n if (error.status >= 500) {\n throw new _errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"](error);\n }\n\n throw error;\n }\n }\n\n send(command, payload, waitForReady = true) {\n if (!this.connected || waitForReady && !this.ready) {\n // Wait for connection\n this.connection$.filter(e => waitForReady ? e.connected && e.ready : e.connected).take(1).subscribe({\n next: () => this.send(command, payload, waitForReady)\n });\n return;\n }\n\n log('[SEND]', command, payload);\n this.conversationProducer.push(command, buildPayload(command, payload), 10000);\n }\n\n sendContext(context = {}) {\n const {\n locale,\n variables\n } = context;\n const payload = {};\n\n if (locale) {\n if (typeof locale !== 'string') {\n throw new Error('Locale must be a string');\n }\n\n payload.locale = locale;\n }\n\n if (variables) {\n if (typeof variables !== 'object') {\n throw new Error('Variables must be an object');\n }\n\n payload.variables = variables;\n } // If we have empty context don't send context message\n\n\n if (Object.keys(payload).length === 0 && payload.constructor === Object) {\n return;\n }\n\n this.send('context', payload, false);\n }\n\n stream() {\n return this.internal$.filter(event => event.type !== 'connection');\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/index.js?");
248
238
 
249
239
  /***/ }),
250
240
 
@@ -255,7 +245,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
255
245
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
256
246
 
257
247
  "use strict";
258
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ConversationProducer)\n/* harmony export */ });\n/* harmony import */ var phoenix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! phoenix */ \"./node_modules/phoenix/priv/static/phoenix.esm.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _lib_split_url_params__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/split-url-params */ \"./src/javascripts/lib/split-url-params.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lib_debug__WEBPACK_IMPORTED_MODULE_3__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\nconst log = _lib_debug__WEBPACK_IMPORTED_MODULE_3___default()('seamly');\nclass ConversationProducer {\n constructor(url, channelName, accessToken) {\n this.url = url;\n this.accessToken = accessToken;\n this.channelName = channelName;\n this.connect();\n this.socket.onError(err => {\n log('[SOCKET][ERROR]', err);\n this.emit({\n type: 'error',\n payload: {\n type: 'seamly_offline',\n error: err\n }\n });\n });\n this.socket.onOpen(() => {\n log('[SOCKET]OPEN');\n this.emit({\n type: 'socket_opened'\n });\n });\n this.channel.on('system', msg => {\n switch (msg.type) {\n case 'join_conversation_succeeded':\n this.emit({\n type: 'connection',\n connected: true,\n ready: true\n });\n break;\n }\n });\n this.socket.onClose(() => {\n log('[SOCKET]CLOSE');\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.channel.onClose(() => {\n log('[CHANNEL]CLOSE');\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.channel.onError(msg => {\n log('[CHANNEL][ERROR]', msg);\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.listenTo('ack');\n this.listenTo('ui');\n this.listenTo('error');\n this.listenTo('participant', (type, msg) => _objectSpread(_objectSpread({}, msg), {}, {\n type\n }));\n this.listenTo('message');\n this.listenTo('service_data');\n this.listenTo('system');\n this.listenTo('info');\n this.listenTo('sync');\n }\n\n start(listener) {\n this.listener = listener;\n this.channel.join().receive('ok', () => {\n log('[CHANNEL][JOIN] OK');\n this.emit({\n type: 'connection',\n connected: true,\n ready: false\n });\n }).receive('error', err => {\n log('[CHANNEL][JOIN] ERROR', err);\n this.emit({\n type: 'error',\n payload: {\n type: 'join_channel_erred',\n error: err\n }\n });\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n this.channel.socket.disconnect();\n }).receive('timeout', () => {\n log('[CHANEL][JOIN] Networking issue. Still waiting...');\n });\n }\n\n stop() {\n this.listener = null;\n }\n\n connect() {\n const {\n url,\n params\n } = (0,_lib_split_url_params__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.url);\n this.socket = new phoenix__WEBPACK_IMPORTED_MODULE_0__.Socket(url, {\n params: _objectSpread(_objectSpread({}, params), {}, {\n v: _config__WEBPACK_IMPORTED_MODULE_1__.apiVersion\n })\n });\n this.socket.connect();\n this.channel = this.socket.channel(this.channelName, {\n authorization: `Bearer ${this.accessToken}`\n });\n }\n\n disconnect() {\n return new Promise(resolve => {\n this.socket.disconnect(resolve);\n });\n }\n\n listenTo(type, transform = null) {\n this.channel.on(type, msg => {\n log('[RECEIVE]', type, msg);\n this.emit({\n type,\n payload: transform ? transform(type, msg) : msg\n });\n });\n }\n\n emit(payload) {\n if (!this.listener) {\n return;\n }\n\n this.listener.next(payload);\n }\n\n push(command, payload, timeout) {\n this.channel.push(command, payload, timeout);\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/producer.js?");
248
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ConversationProducer)\n/* harmony export */ });\n/* harmony import */ var phoenix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! phoenix */ \"./node_modules/phoenix/priv/static/phoenix.esm.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _lib_split_url_params__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/split-url-params */ \"./src/javascripts/lib/split-url-params.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/debug */ \"./src/javascripts/lib/debug.js\");\n/* harmony import */ var _lib_debug__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lib_debug__WEBPACK_IMPORTED_MODULE_3__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\nconst log = _lib_debug__WEBPACK_IMPORTED_MODULE_3___default()('seamly');\nclass ConversationProducer {\n constructor(url, channelName, channelTopic, accessToken) {\n this.url = url;\n this.accessToken = accessToken;\n this.channelName = channelName;\n this.channelTopic = channelTopic;\n this.connect();\n this.socket.onError(err => {\n log('[SOCKET][ERROR]', err);\n this.emit({\n type: 'error',\n payload: {\n type: 'seamly_offline',\n error: err\n }\n });\n });\n this.socket.onOpen(() => {\n log('[SOCKET]OPEN');\n this.emit({\n type: 'socket_opened'\n });\n });\n this.channel.on('system', msg => {\n switch (msg.type) {\n case 'attach_channel_succeeded':\n this.emit({\n type: 'connection',\n connected: true,\n ready: true\n });\n break;\n }\n });\n this.socket.onClose(() => {\n log('[SOCKET]CLOSE');\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.channel.onClose(() => {\n log('[CHANNEL]CLOSE');\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.channel.onError(msg => {\n log('[CHANNEL][ERROR]', msg);\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.listenTo('ack');\n this.listenTo('ui');\n this.listenTo('error');\n this.listenTo('participant', (type, msg) => _objectSpread(_objectSpread({}, msg), {}, {\n type\n }));\n this.listenTo('message');\n this.listenTo('service_data');\n this.listenTo('system');\n this.listenTo('info');\n this.listenTo('sync');\n }\n\n start(listener) {\n this.listener = listener;\n this.channel.join().receive('ok', () => {\n log('[CHANNEL][JOIN] OK');\n this.emit({\n type: 'connection',\n connected: true,\n ready: false\n });\n }).receive('error', err => {\n log('[CHANNEL][JOIN] ERROR', err);\n this.emit({\n type: 'error',\n payload: {\n type: 'join_channel_erred',\n error: err\n }\n });\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n this.channel.socket.disconnect();\n }).receive('timeout', () => {\n log('[CHANEL][JOIN] Networking issue. Still waiting...');\n });\n }\n\n stop() {\n this.listener = null;\n }\n\n connect() {\n const {\n url,\n params\n } = (0,_lib_split_url_params__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(this.url);\n this.socket = new phoenix__WEBPACK_IMPORTED_MODULE_0__.Socket(url, {\n params: _objectSpread(_objectSpread({}, params), {}, {\n v: _config__WEBPACK_IMPORTED_MODULE_1__.apiVersion\n })\n });\n this.socket.connect();\n this.channel = this.socket.channel(this.channelTopic, {\n authorization: `Bearer ${this.accessToken}`,\n channelName: this.channelName\n });\n }\n\n disconnect() {\n return new Promise(resolve => {\n this.socket.disconnect(resolve);\n });\n }\n\n listenTo(type, transform = null) {\n this.channel.on(type, msg => {\n log('[RECEIVE]', type, msg);\n this.emit({\n type,\n payload: transform ? transform(type, msg) : msg\n });\n });\n }\n\n emit(payload) {\n if (!this.listener) {\n return;\n }\n\n this.listener.next(payload);\n }\n\n push(command, payload, timeout) {\n this.channel.push(command, payload, timeout);\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/api/producer.js?");
259
249
 
260
250
  /***/ }),
261
251
 
@@ -486,7 +476,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
486
476
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
487
477
 
488
478
  "use strict";
489
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/forms/utils.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/forms/actions.js\");\n/* harmony import */ var _app_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app/actions */ \"./src/javascripts/domains/app/actions.js\");\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\nconst initialState = {};\nconst initialFormState = {\n controls: {}\n};\nconst initialControlState = {\n value: '',\n touched: false\n};\n\nfunction updateFormControl(state, formId, name, controlState) {\n var _state$formId;\n\n const currentControlState = ((_state$formId = state[formId]) === null || _state$formId === void 0 ? void 0 : _state$formId.controls[name]) || initialControlState;\n return _objectSpread(_objectSpread({}, state), {}, {\n [formId]: _objectSpread(_objectSpread({}, state[formId]), {}, {\n controls: _objectSpread(_objectSpread({}, state[formId].controls), {}, {\n [name]: _objectSpread(_objectSpread({}, currentControlState), controlState)\n })\n })\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.createReducer)({\n // Form handlers\n [_actions__WEBPACK_IMPORTED_MODULE_1__.registerForm]: (state, {\n formId,\n persistData\n }) => {\n var _state$formId2;\n\n const formState = persistData ? (_state$formId2 = state[formId]) !== null && _state$formId2 !== void 0 ? _state$formId2 : _objectSpread(_objectSpread({}, initialFormState), {}, {\n persistData\n }) : _objectSpread(_objectSpread({}, initialFormState), {}, {\n persistData\n });\n return _objectSpread(_objectSpread({}, state), {}, {\n [formId]: formState\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.deregisterForm]: (state, {\n formId\n }) => {\n var _newState$formId;\n\n const newState = _objectSpread({}, state);\n\n if (!((_newState$formId = newState[formId]) !== null && _newState$formId !== void 0 && _newState$formId.persistData)) {\n delete newState[formId];\n }\n\n return newState;\n },\n // Form control handlers\n [_actions__WEBPACK_IMPORTED_MODULE_1__.registerControl]: (state, {\n name,\n formId\n }) => {\n return updateFormControl(state, formId, name);\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.deregisterControl]: (state, {\n formId,\n name\n }) => {\n const form = state[formId];\n\n if (!form) {\n return state;\n }\n\n if (form.persistData) {\n return state;\n }\n\n const controls = _objectSpread({}, form.controls);\n\n delete controls[name];\n return _objectSpread(_objectSpread({}, state), {}, {\n [formId]: _objectSpread(_objectSpread({}, form), {}, {\n controls\n })\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.updateControlValue]: (state, {\n formId,\n name,\n value\n }) => {\n return updateFormControl(state, formId, name, {\n value\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.updateControlTouched]: (state, {\n formId,\n name,\n touched\n }) => {\n return updateFormControl(state, formId, name, {\n touched\n });\n },\n [_app_actions__WEBPACK_IMPORTED_MODULE_2__.initialize.pending]: () => initialState\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/reducer.js?");
479
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/forms/utils.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/forms/actions.js\");\n/* harmony import */ var _app_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app/actions */ \"./src/javascripts/domains/app/actions.js\");\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\nconst initialState = {};\nconst initialFormState = {\n controls: {}\n};\nconst initialControlState = {\n value: '',\n touched: false\n};\n\nfunction updateFormControl(state, formId, name, controlState) {\n var _state$formId;\n\n const currentControlState = ((_state$formId = state[formId]) === null || _state$formId === void 0 ? void 0 : _state$formId.controls[name]) || initialControlState;\n return _objectSpread(_objectSpread({}, state), {}, {\n [formId]: _objectSpread(_objectSpread({}, state[formId]), {}, {\n controls: _objectSpread(_objectSpread({}, state[formId].controls), {}, {\n [name]: _objectSpread(_objectSpread({}, currentControlState), controlState)\n })\n })\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.createReducer)({\n // Form handlers\n [_actions__WEBPACK_IMPORTED_MODULE_1__.registerForm]: (state, {\n formId,\n persistData\n }) => {\n const formState = persistData ? state[formId] ?? _objectSpread(_objectSpread({}, initialFormState), {}, {\n persistData\n }) : _objectSpread(_objectSpread({}, initialFormState), {}, {\n persistData\n });\n return _objectSpread(_objectSpread({}, state), {}, {\n [formId]: formState\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.deregisterForm]: (state, {\n formId\n }) => {\n var _newState$formId;\n\n const newState = _objectSpread({}, state);\n\n if (!((_newState$formId = newState[formId]) !== null && _newState$formId !== void 0 && _newState$formId.persistData)) {\n delete newState[formId];\n }\n\n return newState;\n },\n // Form control handlers\n [_actions__WEBPACK_IMPORTED_MODULE_1__.registerControl]: (state, {\n name,\n formId\n }) => {\n return updateFormControl(state, formId, name);\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.deregisterControl]: (state, {\n formId,\n name\n }) => {\n const form = state[formId];\n\n if (!form) {\n return state;\n }\n\n if (form.persistData) {\n return state;\n }\n\n const controls = _objectSpread({}, form.controls);\n\n delete controls[name];\n return _objectSpread(_objectSpread({}, state), {}, {\n [formId]: _objectSpread(_objectSpread({}, form), {}, {\n controls\n })\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.updateControlValue]: (state, {\n formId,\n name,\n value\n }) => {\n return updateFormControl(state, formId, name, {\n value\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.updateControlTouched]: (state, {\n formId,\n name,\n touched\n }) => {\n return updateFormControl(state, formId, name, {\n touched\n });\n },\n [_app_actions__WEBPACK_IMPORTED_MODULE_2__.initialize.pending]: () => initialState\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/reducer.js?");
490
480
 
491
481
  /***/ }),
492
482
 
@@ -508,7 +498,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
508
498
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
509
499
 
510
500
  "use strict";
511
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createActions\": () => (/* binding */ createActions),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState),\n/* harmony export */ \"validate\": () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/redux-helpers */ \"./src/javascripts/lib/redux-helpers/index.js\");\n\nconst {\n createActions,\n createReducer,\n selectState\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('forms');\nfunction validate(values, schema = {}) {\n return Object.entries(schema).reduce((errors, [key, validations]) => {\n if (validations && !Array.isArray(validations)) {\n // eslint-disable-next-line no-param-reassign\n validations = [validations];\n }\n\n for (let i = 0; (_ref = i < ((_validations = validations) === null || _validations === void 0 ? void 0 : _validations.length)) !== null && _ref !== void 0 ? _ref : 0; i++) {\n var _ref, _validations;\n\n if (!validations[i].fn(values[key], validations[i].compareValue)) {\n errors[key] = validations[i].errorText;\n break;\n }\n }\n\n return errors;\n }, {});\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/utils.js?");
501
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createActions\": () => (/* binding */ createActions),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState),\n/* harmony export */ \"validate\": () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/redux-helpers */ \"./src/javascripts/lib/redux-helpers/index.js\");\n\nconst {\n createActions,\n createReducer,\n selectState\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('forms');\nfunction validate(values, schema = {}) {\n return Object.entries(schema).reduce((errors, [key, validations]) => {\n if (validations && !Array.isArray(validations)) {\n // eslint-disable-next-line no-param-reassign\n validations = [validations];\n }\n\n for (let i = 0; i < ((_validations = validations) === null || _validations === void 0 ? void 0 : _validations.length) ?? 0; i++) {\n var _validations;\n\n if (!validations[i].fn(values[key], validations[i].compareValue)) {\n errors[key] = validations[i].errorText;\n break;\n }\n }\n\n return errors;\n }, {});\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/utils.js?");
512
502
 
513
503
  /***/ }),
514
504
 
@@ -794,7 +784,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
794
784
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
795
785
 
796
786
  "use strict";
797
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TranslationsOptionButton)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _options_dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./options-dialog */ \"./src/javascripts/domains/translations/components/options-dialog/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\nfunction TranslationsOptionButton() {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.useI18n)();\n const [menuIsOpen, setMenuIsOpen] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const toggleButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const toggleButtonId = (0,_ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useGeneratedId)();\n\n const onMainKeyDownHandler = e => {\n if (!menuIsOpen) {\n return;\n }\n\n if ((0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.getKey)(e) === _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.keyNames.Escape) {\n setMenuIsOpen(false);\n (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.focusElement)(toggleButton.current);\n }\n };\n\n const handleDialogClose = () => {\n setMenuIsOpen(false);\n };\n\n const handleToggleClick = () => {\n setMenuIsOpen(o => !o);\n };\n\n const handleToggleKeyDown = e => {\n if ((0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.getKey)(e) === _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.keyNames.ArrowDown) {\n setMenuIsOpen(true);\n e.preventDefault();\n }\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('translations__container'),\n onKeyDown: onMainKeyDownHandler,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n transitionStartState: _ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__.transitionStartStates.notRendered,\n isActive: menuIsOpen,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('options__dialog'),\n role: \"dialog\",\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_options_dialog__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n onClose: handleDialogClose\n })\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['button', 'button--secondary', 'app__options__button']),\n id: toggleButtonId,\n onClick: handleToggleClick,\n onKeyDown: handleToggleKeyDown,\n ref: toggleButton,\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": menuIsOpen.toString(),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"newTranslation\",\n size: \"16\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button__text'),\n children: t('translations.settings.openButtonText')\n })]\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/components/options-button.js?");
787
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TranslationsOptionButton)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../ui/components/widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _options_dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./options-dialog */ \"./src/javascripts/domains/translations/components/options-dialog/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\nfunction TranslationsOptionButton() {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_5__.useI18n)();\n const [menuIsOpen, setMenuIsOpen] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const toggleButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const toggleButtonId = (0,_ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useGeneratedId)();\n\n const onMainKeyDownHandler = e => {\n if (!menuIsOpen) {\n return;\n }\n\n if ((0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.getKey)(e) === _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.keyNames.Escape) {\n setMenuIsOpen(false);\n (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.focusElement)(toggleButton.current);\n }\n };\n\n const handleDialogClose = () => {\n setMenuIsOpen(false);\n };\n\n const handleToggleClick = () => {\n setMenuIsOpen(o => !o);\n };\n\n const handleToggleKeyDown = e => {\n if ((0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.getKey)(e) === _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.keyNames.ArrowDown) {\n setMenuIsOpen(true);\n e.preventDefault();\n }\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('translations__container'),\n onKeyDown: onMainKeyDownHandler,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n transitionStartState: _ui_components_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_6__.transitionStartStates.notRendered,\n isActive: menuIsOpen,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('options__dialog'),\n role: \"dialog\",\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_options_dialog__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n onClose: handleDialogClose\n })\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['button', 'button--secondary', 'chat__options__button']),\n id: toggleButtonId,\n onClick: handleToggleClick,\n onKeyDown: handleToggleKeyDown,\n ref: toggleButton,\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": menuIsOpen.toString(),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"newTranslation\",\n size: \"16\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button__text'),\n children: t('translations.settings.openButtonText')\n })]\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/components/options-button.js?");
798
788
 
799
789
  /***/ }),
800
790
 
@@ -970,7 +960,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
970
960
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
971
961
 
972
962
  "use strict";
973
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"AgentInfo\": () => (/* reexport safe */ _ui_components_layout_agent_info__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ \"AppFrame\": () => (/* reexport safe */ _ui_components_layout_app_frame__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"calculateVisibility\": () => (/* reexport safe */ _domains_visibility__WEBPACK_IMPORTED_MODULE_4__.calculateVisibility),\n/* harmony export */ \"ChatFrame\": () => (/* reexport safe */ _ui_components_layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__[\"default\"]),\n/* harmony export */ \"className\": () => (/* reexport safe */ _lib_css__WEBPACK_IMPORTED_MODULE_6__.className),\n/* harmony export */ \"Conversation\": () => (/* reexport safe */ _ui_components_conversation_conversation__WEBPACK_IMPORTED_MODULE_7__[\"default\"]),\n/* harmony export */ \"createReduxStore\": () => (/* reexport safe */ _domains_redux__WEBPACK_IMPORTED_MODULE_8__.createReduxStore),\n/* harmony export */ \"Engine\": () => (/* reexport safe */ _lib_engine__WEBPACK_IMPORTED_MODULE_9__[\"default\"]),\n/* harmony export */ \"EntryContainer\": () => (/* reexport safe */ _ui_components_entry_entry_container__WEBPACK_IMPORTED_MODULE_10__[\"default\"]),\n/* harmony export */ \"EventParticipant\": () => (/* reexport safe */ _ui_components_conversation_event_event_participant__WEBPACK_IMPORTED_MODULE_11__[\"default\"]),\n/* harmony export */ \"eventTypes\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_12__.eventTypes),\n/* harmony export */ \"ExternalApi\": () => (/* reexport safe */ _lib_external_api__WEBPACK_IMPORTED_MODULE_13__[\"default\"]),\n/* harmony export */ \"getUrlParams\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_14__.getUrlParams),\n/* harmony export */ \"getUrlSearchString\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_14__.getUrlSearchString),\n/* harmony export */ \"Header\": () => (/* reexport safe */ _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"Icon\": () => (/* reexport safe */ _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_16__[\"default\"]),\n/* harmony export */ \"Interrupt\": () => (/* reexport safe */ _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_17__[\"default\"]),\n/* harmony export */ \"MessageContainer\": () => (/* reexport safe */ _ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_18__[\"default\"]),\n/* harmony export */ \"randomId\": () => (/* reexport safe */ _lib_id__WEBPACK_IMPORTED_MODULE_19__.randomId),\n/* harmony export */ \"seamlyActions\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_12__.seamlyActions),\n/* harmony export */ \"SeamlyApiContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_20__.SeamlyApiContext),\n/* harmony export */ \"SeamlyEventBusContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_20__.SeamlyEventBusContext),\n/* harmony export */ \"SeamlyLiveRegionContext\": () => (/* reexport safe */ _ui_components_core_seamly_live_region_context__WEBPACK_IMPORTED_MODULE_21__.SeamlyLiveRegionContext),\n/* harmony export */ \"StoreProvider\": () => (/* reexport safe */ _domains_redux__WEBPACK_IMPORTED_MODULE_8__.StoreProvider),\n/* harmony export */ \"useChoicePrompt\": () => (/* reexport safe */ _ui_components_conversation_event_choice_prompt__WEBPACK_IMPORTED_MODULE_22__.useChoicePrompt),\n/* harmony export */ \"useDispatch\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyDispatchContext),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyChat),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyCommands),\n/* harmony export */ \"useSeamlyConfig\": () => (/* reexport safe */ _domains_config__WEBPACK_IMPORTED_MODULE_24__.useConfig),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useEvents),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useGeneratedId),\n/* harmony export */ \"useI18n\": () => (/* reexport safe */ _domains_i18n__WEBPACK_IMPORTED_MODULE_25__.useI18n),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyEventStream),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyIdleDetachCountdown),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyOptions),\n/* harmony export */ \"useSeamlyVisibility\": () => (/* reexport safe */ _domains_visibility__WEBPACK_IMPORTED_MODULE_4__.useVisibility),\n/* harmony export */ \"useTranslations\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_26__.useTranslations),\n/* harmony export */ \"useTranslatedEventData\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_26__.useTranslatedEventData),\n/* harmony export */ \"useTranslationsContainer\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_26__.useTranslationsContainer),\n/* harmony export */ \"Text\": () => (/* reexport safe */ _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_27__[\"default\"]),\n/* harmony export */ \"DeprecatedToggleButton\": () => (/* reexport safe */ _ui_components_entry_toggle_button__WEBPACK_IMPORTED_MODULE_28__[\"default\"]),\n/* harmony export */ \"View\": () => (/* reexport safe */ _ui_components_view__WEBPACK_IMPORTED_MODULE_29__[\"default\"]),\n/* harmony export */ \"DeprecatedView\": () => (/* reexport safe */ _ui_components_view_deprecated_view__WEBPACK_IMPORTED_MODULE_30__[\"default\"]),\n/* harmony export */ \"ComponentFilter\": () => (/* reexport safe */ _ui_components_conversation_component_filter__WEBPACK_IMPORTED_MODULE_31__[\"default\"]),\n/* harmony export */ \"visibilityStates\": () => (/* reexport safe */ _domains_visibility__WEBPACK_IMPORTED_MODULE_4__.visibilityStates),\n/* harmony export */ \"API\": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_32__.API),\n/* harmony export */ \"SeamlyGeneralError\": () => (/* reexport safe */ _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_33__[\"default\"]),\n/* harmony export */ \"SeamlyOfflineError\": () => (/* reexport safe */ _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_34__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _lib_preact_debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/preact-debug */ \"./src/javascripts/lib/preact-debug.js\");\n/* harmony import */ var _lib_preact_debug__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lib_preact_debug__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_external_api_initialize_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/external-api/initialize-api */ \"./src/javascripts/lib/external-api/initialize-api.js\");\n/* harmony import */ var _ui_components_layout_agent_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui/components/layout/agent-info */ \"./src/javascripts/ui/components/layout/agent-info.js\");\n/* harmony import */ var _ui_components_layout_app_frame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ui/components/layout/app-frame */ \"./src/javascripts/ui/components/layout/app-frame.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _ui_components_layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ui/components/layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _ui_components_conversation_conversation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ui/components/conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _domains_redux__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domains/redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _lib_engine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lib/engine */ \"./src/javascripts/lib/engine/index.js\");\n/* harmony import */ var _ui_components_entry_entry_container__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ui/components/entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _ui_components_conversation_event_event_participant__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ui/components/conversation/event/event-participant */ \"./src/javascripts/ui/components/conversation/event/event-participant.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _lib_external_api__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./lib/external-api */ \"./src/javascripts/lib/external-api/index.js\");\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./ui/components/layout/header */ \"./src/javascripts/ui/components/layout/header.js\");\n/* harmony import */ var _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ui/components/layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _ui_components_core_seamly_live_region_context__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ui/components/core/seamly-live-region-context */ \"./src/javascripts/ui/components/core/seamly-live-region-context.js\");\n/* harmony import */ var _ui_components_conversation_event_choice_prompt__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ui/components/conversation/event/choice-prompt */ \"./src/javascripts/ui/components/conversation/event/choice-prompt.js\");\n/* harmony import */ var _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./ui/components/conversation/event/text */ \"./src/javascripts/ui/components/conversation/event/text.js\");\n/* harmony import */ var _ui_components_entry_toggle_button__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./ui/components/entry/toggle-button */ \"./src/javascripts/ui/components/entry/toggle-button.js\");\n/* harmony import */ var _ui_components_view__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./ui/components/view */ \"./src/javascripts/ui/components/view/index.js\");\n/* harmony import */ var _ui_components_view_deprecated_view__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./ui/components/view/deprecated-view */ \"./src/javascripts/ui/components/view/deprecated-view.js\");\n/* harmony import */ var _ui_components_conversation_component_filter__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./ui/components/conversation/component-filter */ \"./src/javascripts/ui/components/conversation/component-filter.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./api */ \"./src/javascripts/api/index.js\");\n/* harmony import */ var _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n // eslint-disable-line\n// Used by: Client\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_lib_external_api_initialize_api__WEBPACK_IMPORTED_MODULE_1__[\"default\"]); // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: Demo\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: Client\n// Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/index.js?");
963
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"AgentInfo\": () => (/* reexport safe */ _ui_components_layout_agent_info__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ \"Chat\": () => (/* reexport safe */ _ui_components_layout_chat__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"calculateVisibility\": () => (/* reexport safe */ _domains_visibility__WEBPACK_IMPORTED_MODULE_4__.calculateVisibility),\n/* harmony export */ \"ChatFrame\": () => (/* reexport safe */ _ui_components_layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__[\"default\"]),\n/* harmony export */ \"className\": () => (/* reexport safe */ _lib_css__WEBPACK_IMPORTED_MODULE_6__.className),\n/* harmony export */ \"Conversation\": () => (/* reexport safe */ _ui_components_conversation_conversation__WEBPACK_IMPORTED_MODULE_7__[\"default\"]),\n/* harmony export */ \"createReduxStore\": () => (/* reexport safe */ _domains_redux__WEBPACK_IMPORTED_MODULE_8__.createReduxStore),\n/* harmony export */ \"Engine\": () => (/* reexport safe */ _lib_engine__WEBPACK_IMPORTED_MODULE_9__[\"default\"]),\n/* harmony export */ \"EntryContainer\": () => (/* reexport safe */ _ui_components_entry_entry_container__WEBPACK_IMPORTED_MODULE_10__[\"default\"]),\n/* harmony export */ \"EventParticipant\": () => (/* reexport safe */ _ui_components_conversation_event_event_participant__WEBPACK_IMPORTED_MODULE_11__[\"default\"]),\n/* harmony export */ \"eventTypes\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_12__.eventTypes),\n/* harmony export */ \"ExternalApi\": () => (/* reexport safe */ _lib_external_api__WEBPACK_IMPORTED_MODULE_13__[\"default\"]),\n/* harmony export */ \"getUrlParams\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_14__.getUrlParams),\n/* harmony export */ \"getUrlSearchString\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_14__.getUrlSearchString),\n/* harmony export */ \"Header\": () => (/* reexport safe */ _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"Icon\": () => (/* reexport safe */ _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_16__[\"default\"]),\n/* harmony export */ \"Interrupt\": () => (/* reexport safe */ _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_17__[\"default\"]),\n/* harmony export */ \"MessageContainer\": () => (/* reexport safe */ _ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_18__[\"default\"]),\n/* harmony export */ \"randomId\": () => (/* reexport safe */ _lib_id__WEBPACK_IMPORTED_MODULE_19__.randomId),\n/* harmony export */ \"seamlyActions\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_12__.seamlyActions),\n/* harmony export */ \"SeamlyApiContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_20__.SeamlyApiContext),\n/* harmony export */ \"SeamlyEventBusContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_20__.SeamlyEventBusContext),\n/* harmony export */ \"SeamlyLiveRegionContext\": () => (/* reexport safe */ _ui_components_core_seamly_live_region_context__WEBPACK_IMPORTED_MODULE_21__.SeamlyLiveRegionContext),\n/* harmony export */ \"StoreProvider\": () => (/* reexport safe */ _domains_redux__WEBPACK_IMPORTED_MODULE_8__.StoreProvider),\n/* harmony export */ \"useChoicePrompt\": () => (/* reexport safe */ _ui_components_conversation_event_choice_prompt__WEBPACK_IMPORTED_MODULE_22__.useChoicePrompt),\n/* harmony export */ \"useDispatch\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyDispatchContext),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyChat),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyCommands),\n/* harmony export */ \"useSeamlyConfig\": () => (/* reexport safe */ _domains_config__WEBPACK_IMPORTED_MODULE_24__.useConfig),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useEvents),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useGeneratedId),\n/* harmony export */ \"useI18n\": () => (/* reexport safe */ _domains_i18n__WEBPACK_IMPORTED_MODULE_25__.useI18n),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyEventStream),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyIdleDetachCountdown),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyOptions),\n/* harmony export */ \"useSeamlyVisibility\": () => (/* reexport safe */ _domains_visibility__WEBPACK_IMPORTED_MODULE_4__.useVisibility),\n/* harmony export */ \"useTranslations\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_26__.useTranslations),\n/* harmony export */ \"useTranslatedEventData\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_26__.useTranslatedEventData),\n/* harmony export */ \"useTranslationsContainer\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_26__.useTranslationsContainer),\n/* harmony export */ \"Text\": () => (/* reexport safe */ _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_27__[\"default\"]),\n/* harmony export */ \"DeprecatedToggleButton\": () => (/* reexport safe */ _ui_components_entry_deprecated_toggle_button__WEBPACK_IMPORTED_MODULE_28__[\"default\"]),\n/* harmony export */ \"View\": () => (/* reexport safe */ _ui_components_view__WEBPACK_IMPORTED_MODULE_29__[\"default\"]),\n/* harmony export */ \"DeprecatedView\": () => (/* reexport safe */ _ui_components_view_deprecated_view__WEBPACK_IMPORTED_MODULE_30__[\"default\"]),\n/* harmony export */ \"ComponentFilter\": () => (/* reexport safe */ _ui_components_conversation_component_filter__WEBPACK_IMPORTED_MODULE_31__[\"default\"]),\n/* harmony export */ \"visibilityStates\": () => (/* reexport safe */ _domains_visibility__WEBPACK_IMPORTED_MODULE_4__.visibilityStates),\n/* harmony export */ \"API\": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_32__.API),\n/* harmony export */ \"SeamlyGeneralError\": () => (/* reexport safe */ _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_33__[\"default\"]),\n/* harmony export */ \"SeamlyOfflineError\": () => (/* reexport safe */ _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_34__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _lib_preact_debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/preact-debug */ \"./src/javascripts/lib/preact-debug.js\");\n/* harmony import */ var _lib_preact_debug__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lib_preact_debug__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_external_api_initialize_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/external-api/initialize-api */ \"./src/javascripts/lib/external-api/initialize-api.js\");\n/* harmony import */ var _ui_components_layout_agent_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui/components/layout/agent-info */ \"./src/javascripts/ui/components/layout/agent-info.js\");\n/* harmony import */ var _ui_components_layout_chat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ui/components/layout/chat */ \"./src/javascripts/ui/components/layout/chat.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _ui_components_layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ui/components/layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _ui_components_conversation_conversation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ui/components/conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _domains_redux__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domains/redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _lib_engine__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lib/engine */ \"./src/javascripts/lib/engine/index.js\");\n/* harmony import */ var _ui_components_entry_entry_container__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ui/components/entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _ui_components_conversation_event_event_participant__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ui/components/conversation/event/event-participant */ \"./src/javascripts/ui/components/conversation/event/event-participant.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _lib_external_api__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./lib/external-api */ \"./src/javascripts/lib/external-api/index.js\");\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./ui/components/layout/header */ \"./src/javascripts/ui/components/layout/header.js\");\n/* harmony import */ var _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ui/components/layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ui/components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _ui_components_core_seamly_live_region_context__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ui/components/core/seamly-live-region-context */ \"./src/javascripts/ui/components/core/seamly-live-region-context.js\");\n/* harmony import */ var _ui_components_conversation_event_choice_prompt__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ui/components/conversation/event/choice-prompt */ \"./src/javascripts/ui/components/conversation/event/choice-prompt.js\");\n/* harmony import */ var _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./ui/components/conversation/event/text */ \"./src/javascripts/ui/components/conversation/event/text.js\");\n/* harmony import */ var _ui_components_entry_deprecated_toggle_button__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./ui/components/entry/deprecated-toggle-button */ \"./src/javascripts/ui/components/entry/deprecated-toggle-button.js\");\n/* harmony import */ var _ui_components_view__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./ui/components/view */ \"./src/javascripts/ui/components/view/index.js\");\n/* harmony import */ var _ui_components_view_deprecated_view__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./ui/components/view/deprecated-view */ \"./src/javascripts/ui/components/view/deprecated-view.js\");\n/* harmony import */ var _ui_components_conversation_component_filter__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./ui/components/conversation/component-filter */ \"./src/javascripts/ui/components/conversation/component-filter.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./api */ \"./src/javascripts/api/index.js\");\n/* harmony import */ var _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n // eslint-disable-line\n// Used by: Client\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_lib_external_api_initialize_api__WEBPACK_IMPORTED_MODULE_1__[\"default\"]); // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: Demo\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: Client\n\n // Used by: StyleGuide\n\n // Used by: Client\n// Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n // Used by: StyleGuide\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/index.js?");
974
964
 
975
965
  /***/ }),
976
966
 
@@ -1002,7 +992,7 @@ eval("if (true) {\n module.exports = __webpack_require__(/*! debug */ \"./node_
1002
992
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1003
993
 
1004
994
  "use strict";
1005
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Engine)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var minivents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! minivents */ \"./node_modules/minivents/dist/minivents.commonjs.min.js\");\n/* harmony import */ var minivents__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(minivents__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _ui_components_chat_app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../ui/components/chat-app */ \"./src/javascripts/ui/components/chat-app.js\");\n/* harmony import */ var _ui_components_core_seamly_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ui/components/core/seamly-core */ \"./src/javascripts/ui/components/core/seamly-core.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../api */ \"./src/javascripts/api/index.js\");\n/* harmony import */ var _domains_store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../domains/store */ \"./src/javascripts/domains/store/index.js\");\n/* harmony import */ var _domains_app_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../domains/app/actions */ \"./src/javascripts/domains/app/actions.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\nconst _excluded = [\"namespace\", \"parentElement\", \"showFaq\"],\n _excluded2 = [\"view\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nclass Engine {\n constructor(config, externalApi) {\n const {\n namespace = '',\n parentElement,\n showFaq\n } = config,\n restConfig = _objectWithoutProperties(config, _excluded);\n\n this.config = _objectSpread(_objectSpread({}, restConfig), {}, {\n showFaq: showFaq !== false,\n namespace\n });\n this.namespace = namespace;\n this.parentElement = parentElement;\n this.externalApi = externalApi;\n this.api = new _api__WEBPACK_IMPORTED_MODULE_4__.API({\n namespace: config.namespace,\n config: config.api,\n context: config.context\n });\n this.eventBus = new (minivents__WEBPACK_IMPORTED_MODULE_1___default())();\n this.functions = {};\n this.registerFunctions({\n on: this.eventBus.on,\n off: this.eventBus.off\n });\n this.eventBus.on('function.register', (functionName, fn) => this.registerFunction(functionName, fn));\n this.eventBus.on('function.unregister', (functionName, fn) => this.unregisterFunction(functionName, fn));\n }\n\n async render() {\n const _ref = this.config.customComponents || {},\n {\n view: View\n } = _ref,\n restComponents = _objectWithoutProperties(_ref, _excluded2);\n\n const renderConfig = _objectSpread(_objectSpread({}, this.config), {}, {\n customComponents: Object.keys(restComponents).length ? restComponents : undefined\n });\n\n const store = (0,_domains_store__WEBPACK_IMPORTED_MODULE_5__.createStore)({\n api: this.api,\n eventBus: this.eventBus,\n config: renderConfig\n });\n await store.dispatch(_domains_app_actions__WEBPACK_IMPORTED_MODULE_6__.initialize());\n\n if (View) {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_ui_components_core_seamly_core__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n config: renderConfig,\n eventBus: this.eventBus,\n store: store,\n api: this.api,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(View, {})\n }), this.parentElement);\n } else {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_ui_components_chat_app__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n config: renderConfig,\n eventBus: this.eventBus,\n store: store,\n api: this.api\n }), this.parentElement);\n }\n }\n\n destroy() {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)(null, this.parentElement);\n this.eventBus.off();\n this.api.disconnect();\n delete this.functions;\n }\n\n registerFunctions(functionMap) {\n Object.entries(functionMap).forEach(([functionName, fn]) => {\n this.registerFunction(functionName, fn);\n });\n }\n\n registerFunction(functionName, fn) {\n this.functions[functionName] = this.functions[functionName] || [];\n this.functions[functionName].push(fn);\n this.externalApi.handleActions();\n }\n\n unregisterFunction(functionName, fn) {\n const functions = this.functions[functionName];\n\n if (functions && functions.length) {\n this.functions[functionName] = functions.filter(fn2 => fn2 !== fn);\n }\n }\n\n execFunction(functionName, ...args) {\n const functions = this.functions[functionName];\n\n if (!functions || !functions.length) {\n return false;\n }\n\n functions.forEach(fn => {\n try {\n fn(...args);\n } catch (e) {\n console.error(`Action(${functionName}) failed: `, e);\n }\n });\n return true;\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/engine/index.js?");
995
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Engine)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var minivents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! minivents */ \"./node_modules/minivents/dist/minivents.commonjs.min.js\");\n/* harmony import */ var minivents__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(minivents__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _ui_components_chat_app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../ui/components/chat-app */ \"./src/javascripts/ui/components/chat-app.js\");\n/* harmony import */ var _ui_components_core_seamly_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ui/components/core/seamly-core */ \"./src/javascripts/ui/components/core/seamly-core.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../api */ \"./src/javascripts/api/index.js\");\n/* harmony import */ var _domains_store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../domains/store */ \"./src/javascripts/domains/store/index.js\");\n/* harmony import */ var _domains_app_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../domains/app/actions */ \"./src/javascripts/domains/app/actions.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\nconst _excluded = [\"namespace\", \"parentElement\", \"showFaq\"],\n _excluded2 = [\"view\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nclass Engine {\n constructor(config, externalApi) {\n const {\n namespace = '',\n parentElement,\n showFaq\n } = config,\n restConfig = _objectWithoutProperties(config, _excluded);\n\n this.config = _objectSpread(_objectSpread({}, restConfig), {}, {\n namespace,\n showFaq: showFaq !== false\n });\n this.namespace = namespace;\n this.parentElement = parentElement;\n this.externalApi = externalApi;\n this.api = new _api__WEBPACK_IMPORTED_MODULE_4__.API({\n namespace: config.namespace,\n config: config.api,\n context: config.context\n });\n this.eventBus = new (minivents__WEBPACK_IMPORTED_MODULE_1___default())();\n this.functions = {};\n this.registerFunctions({\n on: this.eventBus.on,\n off: this.eventBus.off\n });\n this.eventBus.on('function.register', (functionName, fn) => this.registerFunction(functionName, fn));\n this.eventBus.on('function.unregister', (functionName, fn) => this.unregisterFunction(functionName, fn));\n }\n\n async render() {\n const _ref = this.config.customComponents || {},\n {\n view: View\n } = _ref,\n restComponents = _objectWithoutProperties(_ref, _excluded2);\n\n const renderConfig = _objectSpread(_objectSpread({}, this.config), {}, {\n customComponents: Object.keys(restComponents).length ? restComponents : undefined\n });\n\n const store = (0,_domains_store__WEBPACK_IMPORTED_MODULE_5__.createStore)({\n api: this.api,\n eventBus: this.eventBus,\n config: renderConfig\n });\n await store.dispatch(_domains_app_actions__WEBPACK_IMPORTED_MODULE_6__.initialize());\n\n if (View) {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_ui_components_core_seamly_core__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n config: renderConfig,\n eventBus: this.eventBus,\n store: store,\n api: this.api,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(View, {})\n }), this.parentElement);\n } else {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_ui_components_chat_app__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n config: renderConfig,\n eventBus: this.eventBus,\n store: store,\n api: this.api\n }), this.parentElement);\n }\n }\n\n destroy() {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)(null, this.parentElement);\n this.eventBus.off();\n this.api.disconnect();\n delete this.functions;\n }\n\n registerFunctions(functionMap) {\n Object.entries(functionMap).forEach(([functionName, fn]) => {\n this.registerFunction(functionName, fn);\n });\n }\n\n registerFunction(functionName, fn) {\n this.functions[functionName] = this.functions[functionName] || [];\n this.functions[functionName].push(fn);\n this.externalApi.handleActions();\n }\n\n unregisterFunction(functionName, fn) {\n const functions = this.functions[functionName];\n\n if (functions && functions.length) {\n this.functions[functionName] = functions.filter(fn2 => fn2 !== fn);\n }\n }\n\n execFunction(functionName, ...args) {\n const functions = this.functions[functionName];\n\n if (!functions || !functions.length) {\n return false;\n }\n\n functions.forEach(fn => {\n try {\n fn(...args);\n } catch (e) {\n console.error(`Action(${functionName}) failed: `, e);\n }\n });\n return true;\n }\n\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/engine/index.js?");
1006
996
 
1007
997
  /***/ }),
1008
998
 
@@ -1057,7 +1047,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1057
1047
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1058
1048
 
1059
1049
  "use strict";
1060
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var marked__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.js\");\n/* harmony import */ var marked__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(marked__WEBPACK_IMPORTED_MODULE_0__);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (body => {\n try {\n return marked__WEBPACK_IMPORTED_MODULE_0___default()(body);\n } catch (e) {\n console.log('Could not parse message', body, e);\n return '';\n }\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/parse-body.js?");
1050
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var marked__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! marked */ \"./node_modules/marked/lib/marked.esm.js\");\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (body => {\n try {\n return (0,marked__WEBPACK_IMPORTED_MODULE_0__.marked)(body);\n } catch (e) {\n console.log('Could not parse message', body, e);\n return '';\n }\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/parse-body.js?");
1061
1051
 
1062
1052
  /***/ }),
1063
1053
 
@@ -1122,7 +1112,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1122
1112
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1123
1113
 
1124
1114
  "use strict";
1125
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AppOptions)\n/* harmony export */ });\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _options_options_button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../options/options-button */ \"./src/javascripts/ui/components/options/options-button.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\nfunction AppOptions() {\n const {\n menuOptions,\n allowOptionSelection\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyOptions)();\n const {\n isAvailable: isTranslationsAvailable\n } = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_3__.useTranslations)();\n\n if (!isTranslationsAvailable && (!allowOptionSelection || !menuOptions.length)) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app__options'),\n children: [isTranslationsAvailable && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app__options-item', 'app__options-item--left'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_domains_translations__WEBPACK_IMPORTED_MODULE_3__.OptionsButton, {})\n }), allowOptionSelection && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app__options-item', 'app__options-item--right'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_options_options_button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {})\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/app-options/index.js?");
1115
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AppOptions)\n/* harmony export */ });\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _options_options_button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../options/options-button */ \"./src/javascripts/ui/components/options/options-button.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\nfunction AppOptions() {\n const {\n menuOptions,\n allowOptionSelection\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyOptions)();\n const {\n isAvailable: isTranslationsAvailable\n } = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_3__.useTranslations)();\n\n if (!isTranslationsAvailable && (!allowOptionSelection || !menuOptions.length)) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('chat__options'),\n children: [isTranslationsAvailable && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('chat__options-item', 'chat__options-item--left'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_domains_translations__WEBPACK_IMPORTED_MODULE_3__.OptionsButton, {})\n }), allowOptionSelection && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('chat__options-item', 'chat__options-item--right'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_options_options_button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {})\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/app-options/index.js?");
1126
1116
 
1127
1117
  /***/ }),
1128
1118
 
@@ -1177,7 +1167,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1177
1167
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1178
1168
 
1179
1169
  "use strict";
1180
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _event_event__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./event/event */ \"./src/javascripts/ui/components/conversation/event/event.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader */ \"./src/javascripts/ui/components/conversation/loader.js\");\n/* harmony import */ var _component_filter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./component-filter */ \"./src/javascripts/ui/components/conversation/component-filter.js\");\n/* harmony import */ var _layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../layout/privacy-disclaimer */ \"./src/javascripts/ui/components/layout/privacy-disclaimer.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Conversation = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const appBodyContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const events = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useEvents)();\n const isLoading = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyIsLoading)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_9__.useVisibility)();\n const skiplinkTargetId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplink)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplinkTargetFocusing)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n window.requestAnimationFrame(() => {\n if (appBodyContainer.current) {\n appBodyContainer.current.scrollTop = appBodyContainer.current.scrollHeight;\n }\n });\n }, [events, isLoading, isOpen]);\n\n const renderEvents = () => {\n let prevParticipant = null;\n return events.map(event => {\n const {\n type,\n payload\n } = event;\n const {\n participant,\n fromClient\n } = payload;\n let participantChanged = false;\n\n if (type !== 'participant') {\n const currentParticipant = fromClient ? 'seamly-client-participant' : participant;\n\n if (event.type !== 'info' && prevParticipant !== currentParticipant) {\n participantChanged = true;\n }\n\n prevParticipant = currentParticipant;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_event_event__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n event: event,\n newParticipant: participantChanged\n }, event.payload.id);\n });\n };\n\n const onClickHandler = e => {\n e.preventDefault();\n focusSkiplinkTarget();\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.Fragment, {\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"a\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('skip-link'),\n href: `#${skiplinkTargetId}`,\n onClick: onClickHandler,\n children: t('skiplinkText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app__body'),\n ref: appBodyContainer,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('conversation__container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"ol\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('conversation'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_component_filter__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n children: renderEvents()\n }), isLoading && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_loader__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {})]\n })]\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Conversation);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/conversation.js?");
1170
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _event_event__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./event/event */ \"./src/javascripts/ui/components/conversation/event/event.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loader */ \"./src/javascripts/ui/components/conversation/loader.js\");\n/* harmony import */ var _component_filter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./component-filter */ \"./src/javascripts/ui/components/conversation/component-filter.js\");\n/* harmony import */ var _layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../layout/privacy-disclaimer */ \"./src/javascripts/ui/components/layout/privacy-disclaimer.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Conversation = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const appBodyContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const events = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useEvents)();\n const isLoading = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyIsLoading)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_9__.useVisibility)();\n const skiplinkTargetId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplink)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplinkTargetFocusing)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n window.requestAnimationFrame(() => {\n if (appBodyContainer.current) {\n appBodyContainer.current.scrollTop = appBodyContainer.current.scrollHeight;\n }\n });\n }, [events, isLoading, isOpen]);\n\n const renderEvents = () => {\n let prevParticipant = null;\n return events.map(event => {\n const {\n type,\n payload\n } = event;\n const {\n participant,\n fromClient\n } = payload;\n let participantChanged = false;\n\n if (type !== 'participant') {\n const currentParticipant = fromClient ? 'seamly-client-participant' : participant;\n\n if (event.type !== 'info' && prevParticipant !== currentParticipant) {\n participantChanged = true;\n }\n\n prevParticipant = currentParticipant;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_event_event__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n event: event,\n newParticipant: participantChanged\n }, event.payload.id);\n });\n };\n\n const onClickHandler = e => {\n e.preventDefault();\n focusSkiplinkTarget();\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.Fragment, {\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"a\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('skip-link'),\n href: `#${skiplinkTargetId}`,\n onClick: onClickHandler,\n children: t('skiplinkText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('chat__body'),\n ref: appBodyContainer,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('conversation__container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_layout_privacy_disclaimer__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(\"ol\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('conversation'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_component_filter__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n children: renderEvents()\n }), isLoading && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_loader__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {})]\n })]\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Conversation);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/conversation.js?");
1181
1171
 
1182
1172
  /***/ }),
1183
1173
 
@@ -1265,7 +1255,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1265
1255
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1266
1256
 
1267
1257
  "use strict";
1268
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _carousel_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../carousel-component */ \"./src/javascripts/ui/components/conversation/event/carousel-component/index.js\");\n/* harmony import */ var _components_slide__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/slide */ \"./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\nconst getItemKey = (item, idx, prefix = '') => `${prefix}${item.title}:${idx}`;\n\nconst getItemLabel = item => item.title;\n\nconst CarouselMessage = ({\n event\n}) => {\n const slides = event.payload.body.cards;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n event: event,\n modifiers: 'type-carousel',\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_carousel_component__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n items: slides,\n ItemComponent: _components_slide__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n getItemKey: getItemKey,\n getItemLabel: getItemLabel\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CarouselMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/index.js?");
1258
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _carousel_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../carousel-component */ \"./src/javascripts/ui/components/conversation/event/carousel-component/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _components_slide__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/slide */ \"./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n\nconst getItemKey = (item, idx, prefix = '') => `${prefix}${item.title}:${idx}`;\n\nconst getItemLabel = item => item.title;\n\nconst CarouselMessage = ({\n event\n}) => {\n const [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData)(event);\n const slides = body.cards;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n event: event,\n modifiers: 'type-carousel',\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_carousel_component__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n items: slides,\n ItemComponent: _components_slide__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n getItemKey: getItemKey,\n getItemLabel: getItemLabel\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CarouselMessage);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/index.js?");
1269
1259
 
1270
1260
  /***/ }),
1271
1261
 
@@ -1287,7 +1277,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1287
1277
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1288
1278
 
1289
1279
  "use strict";
1290
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSuggestions\": () => (/* binding */ useSuggestions),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../suggestions/suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__);\nconst _excluded = [\"event\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\nconst useSuggestions = event => {\n const {\n payload\n } = event;\n const [suggestions] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)(event);\n return {\n suggestions,\n payload\n };\n};\n\nconst ConversationSuggestions = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText');\n const {\n sendAction,\n addMessageBubble\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyCommands)();\n const {\n suggestions,\n payload\n } = useSuggestions(event);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n question\n }) => {\n // @todo Refactor to 'suggestionclick'\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n }, [payload, sendAction, addMessageBubble]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions', 'suggestions--conversation'),\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"h2\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__heading'),\n children: headingText\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(_message_container__WEBPACK_IMPORTED_MODULE_5__[\"default\"], _objectSpread(_objectSpread({\n type: \"suggestions\",\n showParticipant: false,\n event: event\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"suggestions__list--conversation\",\n onClickSuggestion: handleClick,\n suggestions: suggestions\n }), footerText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__footer'),\n children: footerText\n })]\n }))]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConversationSuggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/conversation-suggestions.js?");
1280
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSuggestions\": () => (/* binding */ useSuggestions),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../suggestions/suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__);\nconst _excluded = [\"event\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n\nconst useSuggestions = event => {\n const {\n payload\n } = event;\n const [suggestions] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)(event);\n return {\n suggestions,\n payload\n };\n};\n\nconst ConversationSuggestions = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n userResponded\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_8__.useConfig)();\n const [isExpanded, setIsExpanded] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText');\n const {\n sendAction,\n addMessageBubble\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyCommands)();\n const {\n suggestions,\n payload\n } = useSuggestions(event);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n question\n }) => {\n // @todo Refactor to 'suggestionclick'\n setIsExpanded(false);\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n }, [payload, sendAction, addMessageBubble, setIsExpanded]);\n\n if (!isExpanded || userResponded) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions', 'suggestions--conversation'),\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__heading'),\n children: headingText\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(_message_container__WEBPACK_IMPORTED_MODULE_5__[\"default\"], _objectSpread(_objectSpread({\n type: \"suggestions\",\n showParticipant: false,\n event: event\n }, props), {}, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_suggestions_suggestions_list__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"suggestions__list--conversation\",\n onClickSuggestion: handleClick,\n suggestions: suggestions\n }), footerText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__footer'),\n children: footerText\n })]\n }))]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConversationSuggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/conversation-suggestions.js?");
1291
1281
 
1292
1282
  /***/ }),
1293
1283
 
@@ -1386,7 +1376,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1386
1376
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1387
1377
 
1388
1378
  "use strict";
1389
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useFormattedDate\": () => (/* binding */ useFormattedDate)\n/* harmony export */ });\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n\n\n\nconst dateFormatOptions = {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n};\nconst timeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric'\n};\nconst useFormattedDate = date => {\n var _config$context$local, _config$context;\n\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const locale = (_config$context$local = config === null || config === void 0 ? void 0 : (_config$context = config.context) === null || _config$context === void 0 ? void 0 : _config$context.locale) !== null && _config$context$local !== void 0 ? _config$context$local : [];\n const eventDate = new Date(date);\n const currentDate = new Date();\n const midnight = new Date(currentDate);\n midnight.setHours(24, 0, 0, 0);\n const timeUntilMidnight = midnight - currentDate;\n const fullDateTime = eventDate.toString();\n const time = new Intl.DateTimeFormat(locale, timeFormatOptions).format(eventDate);\n let relativeDate = (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__.getRelativeDate)(eventDate, currentDate);\n\n switch (relativeDate) {\n case 'today':\n relativeDate = t('dateTime.today');\n break;\n\n case 'yesterday':\n relativeDate = t('dateTime.yesterday');\n break;\n\n default:\n relativeDate = new Intl.DateTimeFormat(locale, dateFormatOptions).format(eventDate);\n }\n\n const srText = t('dateTime.srText', {\n date: relativeDate,\n time\n });\n return {\n date: relativeDate,\n srText,\n time,\n fullDateTime,\n timeUntilMidnight\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/hooks/use-formatted-date.js?");
1379
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useFormattedDate\": () => (/* binding */ useFormattedDate)\n/* harmony export */ });\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n\n\n\nconst dateFormatOptions = {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n};\nconst timeFormatOptions = {\n hour: 'numeric',\n minute: 'numeric'\n};\nconst useFormattedDate = date => {\n var _config$context;\n\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_0__.useI18n)();\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const locale = (config === null || config === void 0 ? void 0 : (_config$context = config.context) === null || _config$context === void 0 ? void 0 : _config$context.locale) ?? [];\n const eventDate = new Date(date);\n const currentDate = new Date();\n const midnight = new Date(currentDate);\n midnight.setHours(24, 0, 0, 0);\n const timeUntilMidnight = midnight - currentDate;\n const fullDateTime = eventDate.toString();\n const time = new Intl.DateTimeFormat(locale, timeFormatOptions).format(eventDate);\n let relativeDate = (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_1__.getRelativeDate)(eventDate, currentDate);\n\n switch (relativeDate) {\n case 'today':\n relativeDate = t('dateTime.today');\n break;\n\n case 'yesterday':\n relativeDate = t('dateTime.yesterday');\n break;\n\n default:\n relativeDate = new Intl.DateTimeFormat(locale, dateFormatOptions).format(eventDate);\n }\n\n const srText = t('dateTime.srText', {\n date: relativeDate,\n time\n });\n return {\n date: relativeDate,\n srText,\n time,\n fullDateTime,\n timeUntilMidnight\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/hooks/use-formatted-date.js?");
1380
+
1381
+ /***/ }),
1382
+
1383
+ /***/ "./src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js":
1384
+ /*!**************************************************************************************!*\
1385
+ !*** ./src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js ***!
1386
+ \**************************************************************************************/
1387
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1388
+
1389
+ "use strict";
1390
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"parseRichText\": () => (/* binding */ parseRichText)\n/* harmony export */ });\nObject(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }());\n\n\nObject(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()) = function (escapeText) {\n return escapeText;\n};\n\nconst parseLinkVariable = variable => {\n return `<a href='${variable.url}' data-link-id='${variable.id}' ${variable.newTab ? 'target=\"_blank\"' : ''}>${variable.name}</a>`;\n};\n\nfunction parseRichText(text, variables = {}) {\n const view = {};\n Object.entries(variables).forEach(([key, variable]) => {\n switch (variable.type) {\n case 'link':\n view[key] = parseLinkVariable(variable);\n break;\n\n case 'text':\n view[key] = variable.value;\n break;\n }\n }, {}); // Disable escaping as we'll be generating HTML\n\n const oldEscape = Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }());\n\n Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()) = function (escapeText) {\n return escapeText;\n };\n\n const output = Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())(text, view);\n Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()) = oldEscape;\n return output;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js?");
1390
1391
 
1391
1392
  /***/ }),
1392
1393
 
@@ -1419,7 +1420,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1419
1420
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1420
1421
 
1421
1422
  "use strict";
1422
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_parse_body__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.js\");\n/* harmony import */ var _event_divider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n\nconst Participant = ({\n event\n}) => {\n const {\n agentIcon\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_4__.useConfig)().defaults || {};\n const {\n participant\n } = event.payload;\n const [introduction] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_3__.useTranslatedEventData)(event);\n const intro = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return introduction ? (0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(introduction) : undefined;\n }, [introduction]);\n\n if (!intro) {\n return null;\n }\n\n const avatar = participant.avatar || agentIcon;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_event_divider__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n graphicSrc: avatar,\n graphicType: participant.avatar ? 'avatar' : undefined,\n iconName: !avatar ? 'balloon' : undefined,\n childrenHTML: intro,\n dividerType: \"participant\"\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Participant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/participant.js?");
1423
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\nObject(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }());\n/* harmony import */ var _lib_parse_body__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.js\");\n/* harmony import */ var _event_divider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\n\nconst Participant = ({\n event\n}) => {\n const {\n agentIcon\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_5__.useConfig)().defaults || {};\n const {\n participant\n } = event.payload;\n const [introduction] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)(event);\n const intro = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return introduction ? Object(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mustache'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())((0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(introduction), participant) : undefined;\n }, [introduction, participant]);\n\n if (!intro) {\n return null;\n }\n\n const avatar = participant.avatar || agentIcon;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_event_divider__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n graphicSrc: avatar,\n graphicType: participant.avatar ? 'avatar' : undefined,\n iconName: !avatar ? 'balloon' : undefined,\n childrenHTML: intro,\n dividerType: \"participant\"\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Participant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/participant.js?");
1423
1424
 
1424
1425
  /***/ }),
1425
1426
 
@@ -1430,7 +1431,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1430
1431
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1431
1432
 
1432
1433
  "use strict";
1433
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_parse_body__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.js\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"event\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\nconst Splash = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n payload\n } = event;\n const [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_3__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(payload.id);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _objectSpread(_objectSpread({\n type: \"splash\",\n event: event,\n onClick: eventClick\n }, props), {}, {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: (0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(body.text)\n }\n }\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Splash);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/splash.js?");
1434
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_parse_body__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.js\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var _hooks_use_text_rendering__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks/use-text-rendering */ \"./src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js\");\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\nconst _excluded = [\"event\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\nconst Splash = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n payload\n } = event;\n const [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(payload.id);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _objectSpread(_objectSpread({\n type: \"splash\",\n event: event,\n onClick: eventClick\n }, props), {}, {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: (0,_hooks_use_text_rendering__WEBPACK_IMPORTED_MODULE_2__.parseRichText)((0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(body.text), body.variables)\n }\n }\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Splash);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/splash.js?");
1434
1435
 
1435
1436
  /***/ }),
1436
1437
 
@@ -1441,7 +1442,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1441
1442
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1442
1443
 
1443
1444
  "use strict";
1444
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_parse_body__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.js\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\nconst _excluded = [\"event\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\nconst Text = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(event.payload.id);\n const containerProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (!event.payload.fromClient) {\n return {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: (0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(body.text)\n }\n }\n };\n }\n\n return {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n children: body.text\n })\n };\n }, [body, event]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _objectSpread(_objectSpread({\n type: \"text\",\n event: event,\n onClick: eventClick\n }, props), containerProps));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Text);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/text.js?");
1445
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_parse_body__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.js\");\n/* harmony import */ var _hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks/use-event-link-click-handler */ \"./src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js\");\n/* harmony import */ var _hooks_use_text_rendering__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks/use-text-rendering */ \"./src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js\");\n/* harmony import */ var _message_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\nconst _excluded = [\"event\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\nconst Text = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const eventClick = (0,_hooks_use_event_link_click_handler__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(event.payload.id);\n const containerProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (!event.payload.fromClient) {\n return {\n bodyProps: {\n dangerouslySetInnerHTML: {\n __html: (0,_hooks_use_text_rendering__WEBPACK_IMPORTED_MODULE_3__.parseRichText)((0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(body.text), body.variables)\n }\n }\n };\n }\n\n return {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n children: body.text\n })\n };\n }, [body, event]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n type: \"text\",\n event: event,\n onClick: eventClick\n }, props), containerProps));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Text);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/text.js?");
1445
1446
 
1446
1447
  /***/ }),
1447
1448
 
@@ -1654,6 +1655,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1654
1655
 
1655
1656
  /***/ }),
1656
1657
 
1658
+ /***/ "./src/javascripts/ui/components/entry/deprecated-toggle-button.js":
1659
+ /*!*************************************************************************!*\
1660
+ !*** ./src/javascripts/ui/components/entry/deprecated-toggle-button.js ***!
1661
+ \*************************************************************************/
1662
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1663
+
1664
+ "use strict";
1665
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n // Deprecated Toggle Button, should be removed once it is removed from clients\n\n\n\n\nconst DeprecatedToggleButton = ({\n onOpenChat\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const titleId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useGeneratedId)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const buttonRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const lastEventRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplinkTargetFocusing)();\n const focusIfContained = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useFocusIfSeamlyContainedFocus)();\n const currentAgent = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyCurrentAgent)();\n const agentSubtitle = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyHeaderData)().subTitle;\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const {\n headerCollapseButtonId\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyStateContext)();\n const showAgentInfo = currentAgent && !hasInterrupt;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n // Because we can close the app from the external API we\n // need to determine if current keyboard focus resides inside\n // the Seamly app first otherwise focus will be hijacked\n if (isOpen === false && prevIsOpen.current === true) {\n focusIfContained(buttonRef.current);\n }\n\n prevIsOpen.current = isOpen;\n }, [isOpen, focusIfContained]);\n\n const handleMouseUp = () => {\n lastEventRef.current = 'mouse';\n };\n\n const handleKeyUp = () => {\n lastEventRef.current = 'key';\n };\n\n const handleClick = () => {\n onOpenChat();\n\n if (lastEventRef.current === 'mouse') {\n // Sets focus on the input when opening through mouse interaction.\n // This avoids focus hijacking for keyboard users.\n // TODO: function is executed before the component is rendered, needs to be fixed.\n focusSkiplinkTarget();\n } else if (lastEventRef.current === 'key') {\n focusIfContained(headerCollapseButtonId);\n }\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n id: titleId,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__title'),\n children: showAgentInfo ? t('toggleButton.resumeTitle') : t('toggleButton.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__subtitle'),\n children: showAgentInfo ? agentSubtitle : t('toggleButton.subtitle')\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"button\",\n \"aria-labelledby\": titleId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__button'),\n ref: buttonRef,\n onMouseUp: handleMouseUp,\n onKeyUp: handleKeyUp,\n onClick: handleClick\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DeprecatedToggleButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/deprecated-toggle-button.js?");
1666
+
1667
+ /***/ }),
1668
+
1657
1669
  /***/ "./src/javascripts/ui/components/entry/entry-container.js":
1658
1670
  /*!****************************************************************!*\
1659
1671
  !*** ./src/javascripts/ui/components/entry/entry-container.js ***!
@@ -1661,7 +1673,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1661
1673
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1662
1674
 
1663
1675
  "use strict";
1664
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _warnings_idle_detach_warning__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../warnings/idle-detach-warning */ \"./src/javascripts/ui/components/warnings/idle-detach-warning.js\");\n/* harmony import */ var _warnings_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../warnings/resume-conversation-prompt */ \"./src/javascripts/ui/components/warnings/resume-conversation-prompt.js\");\n/* harmony import */ var _text_entry__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./text-entry */ \"./src/javascripts/ui/components/entry/text-entry/index.js\");\n/* harmony import */ var _upload_toggle__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./upload-toggle */ \"./src/javascripts/ui/components/entry/upload-toggle.js\");\n/* harmony import */ var _upload__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./upload */ \"./src/javascripts/ui/components/entry/upload/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EntryContainer = () => {\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_11__.useVisibility)();\n const entryContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n hasCountdown\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIdleDetachCountdown)();\n const [showCountdown, setShowCountDown] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(hasCountdown);\n const {\n hasPrompt: hasResumeConversationPrompt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyResumeConversationPrompt)();\n const [showResumeConversationPrompt, setShowResumeConversationPrompt] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(hasResumeConversationPrompt);\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing)();\n const containedFocus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n activeEntry\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyEntry)();\n const [entryComponents, setEntryComponents] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)({\n text: _text_entry__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n upload: _upload__WEBPACK_IMPORTED_MODULE_9__[\"default\"]\n });\n const [renderEntry, setRenderEntry] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(() => activeEntry);\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_10__.useConfig)();\n const {\n accountAllowsUploads\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useFileUploadMeta)();\n const focusFn = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(entryContainer.current, () => {\n focusSkiplinkTarget();\n });\n }, [focusSkiplinkTarget]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const {\n customComponents\n } = config;\n const {\n entry\n } = customComponents || {};\n\n if (entry) {\n setEntryComponents(c => _objectSpread(_objectSpread({}, c), entry));\n }\n }, [config]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // Focus the current target of the skip link if focus was inside the\n // container before this effect change.\n focusFn();\n setShowCountDown(hasCountdown);\n setShowResumeConversationPrompt(hasResumeConversationPrompt);\n }, [hasCountdown, hasResumeConversationPrompt, focusFn]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setRenderEntry(activeEntry); // This focus action is required for auto entry changes. User driven\n // changes should be handled in the originating components.\n\n focusFn();\n }, [activeEntry, focusFn, entryContainer]); // Check if the active element is inside this container and save it.\n\n containedFocus.current = !!(entryContainer.current && entryContainer.current.contains(document.activeElement));\n const EntryComponent = entryComponents[renderEntry];\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app__entry'),\n ref: entryContainer,\n children: [showCountdown && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_warnings_idle_detach_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}), showResumeConversationPrompt && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_warnings_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['entry__body', ...(hasCountdown || hasResumeConversationPrompt ? ['entry__body--hidden'] : [])]),\n children: [renderEntry !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.entryTypes.upload && accountAllowsUploads && isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_upload_toggle__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(EntryComponent, {})]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EntryContainer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/entry-container.js?");
1676
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _warnings_idle_detach_warning__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../warnings/idle-detach-warning */ \"./src/javascripts/ui/components/warnings/idle-detach-warning.js\");\n/* harmony import */ var _warnings_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../warnings/resume-conversation-prompt */ \"./src/javascripts/ui/components/warnings/resume-conversation-prompt.js\");\n/* harmony import */ var _text_entry__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./text-entry */ \"./src/javascripts/ui/components/entry/text-entry/index.js\");\n/* harmony import */ var _upload_toggle__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./upload-toggle */ \"./src/javascripts/ui/components/entry/upload-toggle.js\");\n/* harmony import */ var _upload__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./upload */ \"./src/javascripts/ui/components/entry/upload/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst EntryContainer = () => {\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_11__.useVisibility)();\n const entryContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n hasCountdown\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIdleDetachCountdown)();\n const [showCountdown, setShowCountDown] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(hasCountdown);\n const {\n hasPrompt: hasResumeConversationPrompt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyResumeConversationPrompt)();\n const [showResumeConversationPrompt, setShowResumeConversationPrompt] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(hasResumeConversationPrompt);\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing)();\n const containedFocus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n activeEntry\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyEntry)();\n const [entryComponents, setEntryComponents] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)({\n text: _text_entry__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n upload: _upload__WEBPACK_IMPORTED_MODULE_9__[\"default\"]\n });\n const [renderEntry, setRenderEntry] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(() => activeEntry);\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_10__.useConfig)();\n const {\n accountAllowsUploads\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useFileUploadMeta)();\n const focusFn = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(entryContainer.current, () => {\n focusSkiplinkTarget();\n });\n }, [focusSkiplinkTarget]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const {\n customComponents\n } = config;\n const {\n entry\n } = customComponents || {};\n\n if (entry) {\n setEntryComponents(c => _objectSpread(_objectSpread({}, c), entry));\n }\n }, [config]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n // Focus the current target of the skip link if focus was inside the\n // container before this effect change.\n focusFn();\n setShowCountDown(hasCountdown);\n setShowResumeConversationPrompt(hasResumeConversationPrompt);\n }, [hasCountdown, hasResumeConversationPrompt, focusFn]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setRenderEntry(activeEntry); // This focus action is required for auto entry changes. User driven\n // changes should be handled in the originating components.\n\n focusFn();\n }, [activeEntry, focusFn, entryContainer]); // Check if the active element is inside this container and save it.\n\n containedFocus.current = !!(entryContainer.current && entryContainer.current.contains(document.activeElement));\n const EntryComponent = entryComponents[renderEntry];\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('chat__entry'),\n ref: entryContainer,\n children: [showCountdown && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_warnings_idle_detach_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}), showResumeConversationPrompt && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_warnings_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['entry__body', ...(hasCountdown || hasResumeConversationPrompt ? ['entry__body--hidden'] : [])]),\n children: [renderEntry !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.entryTypes.upload && accountAllowsUploads && isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_upload_toggle__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(EntryComponent, {})]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EntryContainer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/entry-container.js?");
1665
1677
 
1666
1678
  /***/ }),
1667
1679
 
@@ -1698,17 +1710,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1698
1710
 
1699
1711
  /***/ }),
1700
1712
 
1701
- /***/ "./src/javascripts/ui/components/entry/toggle-button.js":
1702
- /*!**************************************************************!*\
1703
- !*** ./src/javascripts/ui/components/entry/toggle-button.js ***!
1704
- \**************************************************************/
1705
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1706
-
1707
- "use strict";
1708
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n // Deprecated Toggle Button, should be removed once it is removed from clients\n\n\n\n\nconst DeprecatedToggleButton = ({\n onOpenChat\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const titleId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useGeneratedId)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const buttonRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const lastEventRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplinkTargetFocusing)();\n const focusIfContained = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useFocusIfSeamlyContainedFocus)();\n const currentAgent = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyCurrentAgent)();\n const agentSubtitle = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyHeaderData)().subTitle;\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const {\n headerCollapseButtonId\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyStateContext)();\n const showAgentInfo = currentAgent && !hasInterrupt;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n // Because we can close the app from the external API we\n // need to determine if current keyboard focus resides inside\n // the Seamly app first otherwise focus will be hijacked\n if (isOpen === false && prevIsOpen.current === true) {\n focusIfContained(buttonRef.current);\n }\n\n prevIsOpen.current = isOpen;\n }, [isOpen, focusIfContained]);\n\n const handleMouseUp = () => {\n lastEventRef.current = 'mouse';\n };\n\n const handleKeyUp = () => {\n lastEventRef.current = 'key';\n };\n\n const handleClick = () => {\n onOpenChat();\n\n if (lastEventRef.current === 'mouse') {\n // Sets focus on the input when opening through mouse interaction.\n // This avoids focus hijacking for keyboard users.\n // TODO: function is executed before the component is rendered, needs to be fixed.\n focusSkiplinkTarget();\n } else if (lastEventRef.current === 'key') {\n focusIfContained(headerCollapseButtonId);\n }\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n id: titleId,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__title'),\n children: showAgentInfo ? t('toggleButton.resumeTitle') : t('toggleButton.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__subtitle'),\n children: showAgentInfo ? agentSubtitle : t('toggleButton.subtitle')\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"button\",\n \"aria-labelledby\": titleId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__button'),\n ref: buttonRef,\n onMouseUp: handleMouseUp,\n onKeyUp: handleKeyUp,\n onClick: handleClick\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DeprecatedToggleButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/toggle-button.js?");
1709
-
1710
- /***/ }),
1711
-
1712
1713
  /***/ "./src/javascripts/ui/components/entry/upload-toggle.js":
1713
1714
  /*!**************************************************************!*\
1714
1715
  !*** ./src/javascripts/ui/components/entry/upload-toggle.js ***!
@@ -1742,6 +1743,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1742
1743
 
1743
1744
  /***/ }),
1744
1745
 
1746
+ /***/ "./src/javascripts/ui/components/faq/faq.js":
1747
+ /*!**************************************************!*\
1748
+ !*** ./src/javascripts/ui/components/faq/faq.js ***!
1749
+ \**************************************************/
1750
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1751
+
1752
+ "use strict";
1753
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _layout_icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__);\nconst _excluded = [\"categories\"];\n\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Faq = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_12__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const sectionId = (0,_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_7__.useGeneratedId)();\n const focusSkiplinkTarget = (0,_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_8__.useSkiplinkTargetFocusing)();\n const {\n sendPolite\n } = (0,_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_9__.useLiveRegion)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_15__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_10__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const lastFaqEventPayload = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyServiceData)('suggestion');\n const [eventBody] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_14__.useTranslatedEventData)({\n payload: lastFaqEventPayload\n });\n const faqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n const newFaqs = lastFaqEventPayload && !hasInterrupt ? eventBody : [];\n const itemBaseClass = `faqs__item`;\n return newFaqs.map(_ref => {\n let {\n categories = []\n } = _ref,\n faqRest = _objectWithoutProperties(_ref, _excluded);\n\n return _objectSpread(_objectSpread({}, faqRest), {}, {\n categories,\n classNames: [itemBaseClass, ...categories.map(cat => `faqs__item--${String(cat).toLowerCase().replace(/[^a-z0-9_\\\\-]/, '')}`)]\n });\n });\n }, [lastFaqEventPayload, hasInterrupt, eventBody]);\n const prevFaqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const prevHasFaqs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n isInline\n } = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyLayoutMode)();\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_16__.useUserHasResponded)();\n const hideForWindow = !isInline && hasResponded;\n const prevHideForWindow = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(hideForWindow);\n const hasFaqs = !!faqs.length;\n const showFaqContainer = hasFaqs && !hideForWindow;\n const previousRenderedFaqList = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const renderedFaqList = hasFaqs ? faqs : previousRenderedFaqList.current;\n previousRenderedFaqList.current = renderedFaqList;\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevFaqs.current !== faqs && !hideForWindow) {\n if (hasFaqs) {\n const politeText = prevHasFaqs.current ? t('faq.srUpdatedText') : t('faq.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasFaqs.current) {\n sendPolite(t('faq.srUnavailableText'));\n }\n\n prevFaqs.current = faqs;\n }\n\n if (!prevHideForWindow.current && hideForWindow) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('faq.srUnavailableText'));\n } else if (!hasFaqs && prevHasFaqs.current) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasFaqs.current = hasFaqs;\n prevHideForWindow.current = hideForWindow;\n }, [hasFaqs, faqs, hideForWindow, focusSkiplinkTarget, sendPolite, t]);\n\n const onFaqClickHandler = ({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n }\n\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.custom,\n originMessage: lastFaqEventPayload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n focusSkiplinkTarget();\n };\n\n const headingText = t('faq.headingText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n isActive: showFaqContainer,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_13__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(ContainerElement, {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs'),\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"h2\", {\n id: sectionId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs__heading'),\n children: headingText\n }), !!renderedFaqList.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('faqs__list'),\n children: renderedFaqList.map(faq => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(faq.classNames),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(\"button\", {\n type: \"button\",\n onClick: () => {\n onFaqClickHandler(faq);\n },\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"chevronRight\",\n size: \"8\"\n }), faq.question]\n })\n }, faq.id.toString()))\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Faq);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/faq/faq.js?");
1754
+
1755
+ /***/ }),
1756
+
1745
1757
  /***/ "./src/javascripts/ui/components/form-controls/error.js":
1746
1758
  /*!**************************************************************!*\
1747
1759
  !*** ./src/javascripts/ui/components/form-controls/error.js ***!
@@ -1815,29 +1827,40 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1815
1827
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1816
1828
 
1817
1829
  "use strict";
1818
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst AgentInfo = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n title,\n subTitle\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyHeaderData)();\n const unreadMessageCount = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_6__.useVisibility)();\n const currentAgent = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCurrentAgent)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const {\n defaults\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n const {\n startChatIcon\n } = defaults || {};\n const avatar = currentAgent && !hasInterrupt ? currentAgent.avatar : null;\n const displaySubtitle = hasInterrupt ? '' : subTitle;\n const classNames = ['message-count'];\n\n if (isOpen) {\n classNames.push('message-count__hide');\n }\n\n if (unreadMessageCount === 0) {\n classNames.push('message-count__empty');\n }\n\n return (avatar || displaySubtitle || !isOpen) && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__graphic'),\n children: [avatar || startChatIcon ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(avatar ? 'avatar' : 'icon'),\n src: avatar || startChatIcon,\n alt: \"\"\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(classNames),\n \"aria-hidden\": \"true\",\n children: unreadMessageCount\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__heading'),\n children: title !== null && title !== void 0 ? title : t('header.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__text'),\n children: displaySubtitle\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AgentInfo);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/agent-info.js?");
1830
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst AgentInfo = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n title,\n subTitle\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyHeaderData)();\n const unreadMessageCount = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_6__.useVisibility)();\n const currentAgent = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCurrentAgent)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const {\n defaults\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n const {\n startChatIcon\n } = defaults || {};\n const avatar = currentAgent && !hasInterrupt ? currentAgent.avatar : null;\n const displaySubtitle = hasInterrupt ? '' : subTitle;\n const classNames = ['message-count'];\n\n if (isOpen) {\n classNames.push('message-count__hide');\n }\n\n if (unreadMessageCount === 0) {\n classNames.push('message-count__empty');\n }\n\n return (avatar || displaySubtitle || !isOpen) && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__graphic'),\n children: [avatar || startChatIcon ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(avatar ? 'avatar' : 'icon'),\n src: avatar || startChatIcon,\n alt: \"\"\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(classNames),\n \"aria-hidden\": \"true\",\n children: unreadMessageCount\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__heading'),\n children: title ?? t('header.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__text'),\n children: displaySubtitle\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AgentInfo);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/agent-info.js?");
1819
1831
 
1820
1832
  /***/ }),
1821
1833
 
1822
- /***/ "./src/javascripts/ui/components/layout/app-frame.js":
1823
- /*!***********************************************************!*\
1824
- !*** ./src/javascripts/ui/components/layout/app-frame.js ***!
1825
- \***********************************************************/
1834
+ /***/ "./src/javascripts/ui/components/layout/chat-frame.js":
1835
+ /*!************************************************************!*\
1836
+ !*** ./src/javascripts/ui/components/layout/chat-frame.js ***!
1837
+ \************************************************************/
1826
1838
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1827
1839
 
1828
1840
  "use strict";
1829
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _suggestions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../suggestions */ \"./src/javascripts/ui/components/suggestions/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\n\nconst AppFrame = ({\n children,\n className: givenClassName = '',\n isDeprecated\n}) => {\n const [, setSeamlyContainerElement] = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyContainerElement)();\n const {\n isOpen,\n isVisible,\n setVisibility\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_6__.useVisibility)();\n const {\n zIndex,\n namespace,\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_3__.useConfig)();\n const {\n isInline\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyLayoutMode)();\n const appContainerClassNames = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyAppContainerClassNames)();\n const userResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_4__.useUserHasResponded)();\n const {\n locale,\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_5__.useI18n)();\n const containerElementRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(container => {\n setSeamlyContainerElement(container);\n }, [setSeamlyContainerElement]);\n const blockLang = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (locale) {\n const htmlElementLang = document.querySelector('html').getAttribute('lang');\n\n if (htmlElementLang !== locale) {\n return locale;\n }\n }\n\n return undefined;\n }, [locale]);\n const baseClassName = isDeprecated ? 'app--deprecated' : 'app';\n const defaultClassNames = [`app--layout-${layoutMode}`, `namespace--${namespace}`];\n const classNames = [baseClassName, ...defaultClassNames, ...appContainerClassNames, givenClassName];\n\n if (!isOpen && layoutMode !== 'app') {\n classNames.push('app--collapsed');\n }\n\n if (userResponded) {\n classNames.push('app--user-responded');\n }\n\n const onKeyDownHandler = e => {\n if (e.code && e.code === 'Escape' || e.keyCode === 27) if (!isInline && isOpen) {\n setVisibility(_domains_visibility__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.minimized);\n }\n };\n\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"section\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(classNames),\n onKeyDown: onKeyDownHandler,\n lang: blockLang,\n tabIndex: \"-1\",\n ref: containerElementRef,\n style: {\n zIndex\n },\n \"data-nosnippet\": true,\n \"aria-label\": t('app.srLabel'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app-wrapper'),\n children: children\n }), layoutMode === 'inline' && isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_suggestions__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n isAside: true\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/app-frame.js?");
1841
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _app_options__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../app-options */ \"./src/javascripts/ui/components/app-options/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\nfunction ChatFrame({\n children,\n interruptComponent: InterruptComponent\n}) {\n const {\n hasInterrupt,\n meta\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_3__.useInterrupt)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_4__.useVisibility)();\n\n const getContent = () => {\n if (hasInterrupt) {\n if (isOpen) {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(InterruptComponent, _objectSpread({}, meta));\n }\n\n return null;\n }\n\n return children;\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_domains_translations__WEBPACK_IMPORTED_MODULE_2__.ChatStatus, {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('chat__container'),\n children: getContent()\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_app_options__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {})]\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/chat-frame.js?");
1830
1842
 
1831
1843
  /***/ }),
1832
1844
 
1833
- /***/ "./src/javascripts/ui/components/layout/chat-frame.js":
1834
- /*!************************************************************!*\
1835
- !*** ./src/javascripts/ui/components/layout/chat-frame.js ***!
1836
- \************************************************************/
1845
+ /***/ "./src/javascripts/ui/components/layout/chat.js":
1846
+ /*!******************************************************!*\
1847
+ !*** ./src/javascripts/ui/components/layout/chat.js ***!
1848
+ \******************************************************/
1837
1849
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1838
1850
 
1839
1851
  "use strict";
1840
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _app_options__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../app-options */ \"./src/javascripts/ui/components/app-options/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\nfunction ChatFrame({\n children,\n interruptComponent: InterruptComponent\n}) {\n const {\n hasInterrupt,\n meta\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_3__.useInterrupt)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_4__.useVisibility)();\n\n const getContent = () => {\n if (hasInterrupt) {\n if (isOpen) {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(InterruptComponent, _objectSpread({}, meta));\n }\n\n return null;\n }\n\n return children;\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_domains_translations__WEBPACK_IMPORTED_MODULE_2__.ChatStatus, {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('app__container'),\n children: getContent()\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_app_options__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {})]\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/chat-frame.js?");
1852
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _suggestions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../suggestions */ \"./src/javascripts/ui/components/suggestions/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\n\n\nconst Chat = ({\n children,\n className: givenClassName = ''\n}) => {\n const {\n isOpen,\n isVisible,\n setVisibility\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const {\n namespace,\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const {\n isInline\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyLayoutMode)();\n const appContainerClassNames = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyAppContainerClassNames)();\n const userResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_3__.useUserHasResponded)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const defaultClassNames = ['chat', `chat--layout-${layoutMode}`, `namespace--${namespace}`];\n const classNames = [...defaultClassNames, ...appContainerClassNames, givenClassName];\n\n if (!isOpen && layoutMode !== 'app') {\n classNames.push('chat--collapsed');\n }\n\n if (userResponded) {\n classNames.push('chat--user-responded');\n }\n\n const onKeyDownHandler = e => {\n if (e.code && e.code === 'Escape' || e.keyCode === 27) if (!isInline && isOpen) {\n setVisibility(_domains_visibility__WEBPACK_IMPORTED_MODULE_5__.visibilityStates.minimized);\n }\n };\n\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"section\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)(classNames),\n onKeyDown: onKeyDownHandler,\n tabIndex: \"-1\",\n \"aria-label\": t('chat.srLabel'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('chat-wrapper'),\n children: children\n }), layoutMode === 'inline' && isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_suggestions__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n isAside: true\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Chat);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/chat.js?");
1853
+
1854
+ /***/ }),
1855
+
1856
+ /***/ "./src/javascripts/ui/components/layout/deprecated-app-frame.js":
1857
+ /*!**********************************************************************!*\
1858
+ !*** ./src/javascripts/ui/components/layout/deprecated-app-frame.js ***!
1859
+ \**********************************************************************/
1860
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1861
+
1862
+ "use strict";
1863
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _faq_faq__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../faq/faq */ \"./src/javascripts/ui/components/faq/faq.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\n\nconst DeprecatedAppFrame = ({\n children\n}) => {\n const [, setSeamlyContainerElement] = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyContainerElement)();\n const {\n isOpen,\n isVisible,\n setVisibility\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_7__.useVisibility)();\n const {\n zIndex,\n showFaq,\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_4__.useConfig)();\n const {\n isInline\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyLayoutMode)();\n const appContainerClassNames = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyAppContainerClassNames)();\n const userResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_5__.useUserHasResponded)();\n const {\n locale\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_6__.useI18n)();\n const containerElementRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(container => {\n setSeamlyContainerElement(container);\n }, [setSeamlyContainerElement]);\n const blockLang = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (locale) {\n const htmlElementLang = document.querySelector('html').getAttribute('lang');\n\n if (htmlElementLang !== locale) {\n return locale;\n }\n }\n\n return undefined;\n }, [locale]);\n const classNames = ['app', 'app--deprecated', ...appContainerClassNames];\n\n if (!isOpen && layoutMode === 'window') {\n classNames.push('app--collapsed');\n }\n\n if (userResponded) {\n classNames.push('app--user-responded');\n }\n\n classNames.push(`app--layout-${layoutMode}`);\n\n const onKeyDownHandler = e => {\n if (e.code && e.code === 'Escape' || e.keyCode === 27) if (!isInline && isOpen) {\n setVisibility(_domains_visibility__WEBPACK_IMPORTED_MODULE_7__.visibilityStates.minimized);\n }\n };\n\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxs)(\"section\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(classNames),\n onKeyDown: onKeyDownHandler,\n lang: blockLang,\n tabIndex: \"-1\",\n ref: containerElementRef,\n style: {\n zIndex\n },\n \"data-nosnippet\": true,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app-wrapper'),\n children: children\n }), showFaq && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_8__.jsx)(_faq_faq__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {})]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DeprecatedAppFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/deprecated-app-frame.js?");
1841
1864
 
1842
1865
  /***/ }),
1843
1866
 
@@ -1848,7 +1871,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1848
1871
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1849
1872
 
1850
1873
  "use strict";
1851
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n\n\nconst Header = ({\n children,\n onCloseChat\n}) => {\n const {\n headerCollapseButtonId\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const closeButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"header\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('app__header'),\n children: [children, (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('header-controls'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'header-controls__collapse'),\n onClick: onCloseChat,\n ref: closeButton,\n id: headerCollapseButtonId,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"chevronDown\",\n size: \"32\",\n alt: t('header.collapseApp')\n })\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Header);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/header.js?");
1874
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n\n\nconst Header = ({\n children,\n onCloseChat\n}) => {\n const {\n headerCollapseButtonId\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const closeButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"header\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('chat__header'),\n children: [children, (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('header-controls'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'header-controls__collapse'),\n onClick: onCloseChat,\n ref: closeButton,\n id: headerCollapseButtonId,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"chevronDown\",\n size: \"32\",\n alt: t('header.collapseApp')\n })\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Header);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/header.js?");
1852
1875
 
1853
1876
  /***/ }),
1854
1877
 
@@ -1881,7 +1904,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1881
1904
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1882
1905
 
1883
1906
  "use strict";
1884
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PreChatMessages),\n/* harmony export */ \"PreChatMessageEvent\": () => (/* binding */ PreChatMessageEvent)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/use-event-component-mapping */ \"./src/javascripts/ui/hooks/use-event-component-mapping.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\nfunction PreChatMessages() {\n const {\n preChatEvents,\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_1__.useInterrupt)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_4__.useVisibility)();\n const isVisible = !(hasInterrupt || !preChatEvents.length || isOpen);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n isActive: isVisible,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_5__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('pre-chat-messages', `pre-chat-messages--${layoutMode}`),\n \"aria-hidden\": !isVisible,\n children: preChatEvents.map(event => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('pre-chat-messages__message'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(PreChatMessageEvent, {\n event: event\n })\n }, event.payload.id))\n })\n });\n}\nfunction PreChatMessageEvent({\n event\n}) {\n const [Component] = (0,_hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(Component, {\n event: event\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/pre-chat-messages.js?");
1907
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PreChatMessages),\n/* harmony export */ \"PreChatMessageEvent\": () => (/* binding */ PreChatMessageEvent)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/use-event-component-mapping */ \"./src/javascripts/ui/hooks/use-event-component-mapping.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\nfunction PreChatMessages() {\n const {\n preChatEvents,\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_1__.useInterrupt)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_4__.useVisibility)();\n const isVisible = !(hasInterrupt || !preChatEvents.length || isOpen);\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('pre-chat-messages', `pre-chat-messages--${layoutMode}`),\n \"aria-hidden\": !isVisible,\n children: preChatEvents.map(event => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('pre-chat-messages__message'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(PreChatMessageEvent, {\n event: event\n })\n }, event.payload.id))\n });\n}\nfunction PreChatMessageEvent({\n event\n}) {\n const [Component] = (0,_hooks_use_event_component_mapping__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(event);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(Component, {\n event: event\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/pre-chat-messages.js?");
1885
1908
 
1886
1909
  /***/ }),
1887
1910
 
@@ -1903,7 +1926,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1903
1926
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1904
1927
 
1905
1928
  "use strict";
1906
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _layout_icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _options__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./options */ \"./src/javascripts/ui/components/options/options.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__);\n\n\n\n\n\n\n\n\n\n\n\n\nconst OptionsButton = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const {\n menuOptions,\n showOption,\n panelActive,\n hideOption\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n id\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useOptionButton)();\n const focusOutDelayTimeoutID = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [menuIsOpen, setMenuIsOpen] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const toggleButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const optionsLength = menuOptions.length;\n const menuItemButtons = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(Array.from({\n length: optionsLength\n }, () => (0,preact__WEBPACK_IMPORTED_MODULE_0__.createRef)()));\n const prevMenuIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n const multiMenu = optionsLength > 1;\n const firstOption = menuOptions[0];\n const firstOptionName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n var _firstOption$name;\n\n return firstOption === null || firstOption === void 0 ? void 0 : (_firstOption$name = firstOption.name) === null || _firstOption$name === void 0 ? void 0 : _firstOption$name.trim().replace(/\\s+/g, '');\n }, [firstOption]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n return () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n }, []);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (menuIsOpen && !prevMenuIsOpen.current) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const firstActiveOptionIndex = menuOptions.findIndex(option => option.available);\n const focusIndex = firstActiveOptionIndex === -1 ? 0 : firstActiveOptionIndex;\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[focusIndex]);\n });\n });\n }\n\n prevMenuIsOpen.current = menuIsOpen;\n }, [menuIsOpen, menuOptions]);\n\n const onClickHandler = () => {\n if (panelActive) {\n hideOption();\n }\n\n if (multiMenu) {\n setMenuIsOpen(o => !o);\n } else if (firstOption.available) {\n showOption(firstOption.name);\n }\n };\n\n const onMainKeyDownHandler = e => {\n if (!menuIsOpen) {\n return;\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.Escape) {\n setMenuIsOpen(false);\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(toggleButton.current);\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.Home) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[0]);\n e.preventDefault();\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.End) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[optionsLength - 1]);\n e.preventDefault();\n }\n };\n\n const onButtonKeyDownHandler = e => {\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.ArrowDown) {\n setMenuIsOpen(true);\n e.preventDefault();\n }\n };\n\n const onMenuItemKeyDownHandler = (e, index) => {\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.ArrowDown) {\n const newIndex = Math.min(optionsLength - 1, index + 1);\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[index === newIndex ? 0 : newIndex]);\n e.preventDefault();\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.ArrowUp) {\n const newIndex = Math.max(0, index - 1);\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[index === newIndex ? optionsLength - 1 : newIndex]);\n e.preventDefault();\n }\n };\n\n const onFocusOutHandler = () => {\n if (multiMenu) {\n focusOutDelayTimeoutID.current = setTimeout(() => {\n setMenuIsOpen(false);\n }, 200);\n }\n };\n\n const onFocusInHandler = () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n\n const onKeyPressHandler = (e, index) => {\n const char = String.fromCharCode(e.charCode);\n const isPrintableChar = !!(char.length === 1 && char.match(/\\S/));\n\n if (!isPrintableChar) {\n return;\n }\n\n let foundIndex = -1;\n menuOptions.forEach((option, i) => {\n if (i > index && option.title.charAt(0).toLowerCase() === char.toLowerCase() && foundIndex === -1) {\n foundIndex = i;\n }\n });\n\n if (foundIndex !== -1) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[foundIndex]);\n }\n };\n\n const onMenuItemClickHandler = (name, available) => {\n if (available) {\n setMenuIsOpen(false);\n showOption(name);\n }\n };\n\n if (!optionsLength) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__container'),\n onKeyDown: onMainKeyDownHandler,\n onfocusout: onFocusOutHandler,\n onfocusin: onFocusInHandler,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__.transitionStartStates.notRendered,\n isActive: panelActive,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__dialog'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_options__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {})\n })\n }), multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n isActive: menuIsOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['options__menu']),\n role: \"menu\",\n tabIndex: \"-1\",\n \"aria-labelledby\": id,\n children: menuOptions.map(({\n name,\n title,\n available\n }, i) => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__menu__item'),\n role: \"menuitem\",\n \"data-testid\": name,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"button\", {\n type: \"button\",\n ref: item => {\n menuItemButtons.current[i] = item;\n },\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary', ...(available ? [] : ['button--disabled'])]),\n onKeyDown: e => onMenuItemKeyDownHandler(e, i),\n onKeyPress: e => onKeyPressHandler(e, i),\n onClick: () => onMenuItemClickHandler(name, available),\n \"aria-disabled\": !available ? 'true' : null,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: [title, !available && ' ']\n }), !available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })\n }, name))\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary', 'app__options__button', ...(!multiMenu && firstOptionName ? [`app__options__button--${firstOptionName}`] : []), ...(!multiMenu && !firstOption.available ? ['button--disabled'] : [])]),\n id: id,\n onClick: onClickHandler,\n onKeyDown: multiMenu ? onButtonKeyDownHandler : null,\n ref: toggleButton,\n \"aria-haspopup\": multiMenu ? 'menu' : null,\n \"aria-expanded\": multiMenu ? menuIsOpen.toString() : null,\n \"aria-disabled\": !multiMenu && !firstOption.available ? 'true' : null,\n children: [multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"options\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: multiMenu ? t('options.openButtonText') : `${firstOption.title}${!firstOption.available ? ' ' : ''}`\n }), !multiMenu && !firstOption.available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OptionsButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/options-button.js?");
1929
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"preact\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _layout_icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _options__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./options */ \"./src/javascripts/ui/components/options/options.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__);\n\n\n\n\n\n\n\n\n\n\n\n\nconst OptionsButton = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const {\n menuOptions,\n showOption,\n panelActive,\n hideOption\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n id\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useOptionButton)();\n const focusOutDelayTimeoutID = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [menuIsOpen, setMenuIsOpen] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const toggleButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const optionsLength = menuOptions.length;\n const menuItemButtons = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(Array.from({\n length: optionsLength\n }, () => (0,preact__WEBPACK_IMPORTED_MODULE_0__.createRef)()));\n const prevMenuIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(false);\n const multiMenu = optionsLength > 1;\n const firstOption = menuOptions[0];\n const firstOptionName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n var _firstOption$name;\n\n return firstOption === null || firstOption === void 0 ? void 0 : (_firstOption$name = firstOption.name) === null || _firstOption$name === void 0 ? void 0 : _firstOption$name.trim().replace(/\\s+/g, '');\n }, [firstOption]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n return () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n }, []);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (menuIsOpen && !prevMenuIsOpen.current) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const firstActiveOptionIndex = menuOptions.findIndex(option => option.available);\n const focusIndex = firstActiveOptionIndex === -1 ? 0 : firstActiveOptionIndex;\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[focusIndex]);\n });\n });\n }\n\n prevMenuIsOpen.current = menuIsOpen;\n }, [menuIsOpen, menuOptions]);\n\n const onClickHandler = () => {\n if (panelActive) {\n hideOption();\n }\n\n if (multiMenu) {\n setMenuIsOpen(o => !o);\n } else if (firstOption.available) {\n showOption(firstOption.name);\n }\n };\n\n const onMainKeyDownHandler = e => {\n if (!menuIsOpen) {\n return;\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.Escape) {\n setMenuIsOpen(false);\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(toggleButton.current);\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.Home) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[0]);\n e.preventDefault();\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.End) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[optionsLength - 1]);\n e.preventDefault();\n }\n };\n\n const onButtonKeyDownHandler = e => {\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.ArrowDown) {\n setMenuIsOpen(true);\n e.preventDefault();\n }\n };\n\n const onMenuItemKeyDownHandler = (e, index) => {\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.ArrowDown) {\n const newIndex = Math.min(optionsLength - 1, index + 1);\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[index === newIndex ? 0 : newIndex]);\n e.preventDefault();\n }\n\n if ((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.getKey)(e) === _utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.keyNames.ArrowUp) {\n const newIndex = Math.max(0, index - 1);\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[index === newIndex ? optionsLength - 1 : newIndex]);\n e.preventDefault();\n }\n };\n\n const onFocusOutHandler = () => {\n if (multiMenu) {\n focusOutDelayTimeoutID.current = setTimeout(() => {\n setMenuIsOpen(false);\n }, 200);\n }\n };\n\n const onFocusInHandler = () => {\n clearTimeout(focusOutDelayTimeoutID.current);\n };\n\n const onKeyPressHandler = (e, index) => {\n const char = String.fromCharCode(e.charCode);\n const isPrintableChar = !!(char.length === 1 && char.match(/\\S/));\n\n if (!isPrintableChar) {\n return;\n }\n\n let foundIndex = -1;\n menuOptions.forEach((option, i) => {\n if (i > index && option.title.charAt(0).toLowerCase() === char.toLowerCase() && foundIndex === -1) {\n foundIndex = i;\n }\n });\n\n if (foundIndex !== -1) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.focusElement)(menuItemButtons.current[foundIndex]);\n }\n };\n\n const onMenuItemClickHandler = (name, available) => {\n if (available) {\n setMenuIsOpen(false);\n showOption(name);\n }\n };\n\n if (!optionsLength) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__container'),\n onKeyDown: onMainKeyDownHandler,\n onfocusout: onFocusOutHandler,\n onfocusin: onFocusInHandler,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__.transitionStartStates.notRendered,\n isActive: panelActive,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__dialog'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_options__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {})\n })\n }), multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n isActive: menuIsOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_7__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['options__menu']),\n role: \"menu\",\n tabIndex: \"-1\",\n \"aria-labelledby\": id,\n children: menuOptions.map(({\n name,\n title,\n available\n }, i) => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__menu__item'),\n role: \"menuitem\",\n \"data-testid\": name,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"button\", {\n type: \"button\",\n ref: item => {\n menuItemButtons.current[i] = item;\n },\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary', ...(available ? [] : ['button--disabled'])]),\n onKeyDown: e => onMenuItemKeyDownHandler(e, i),\n onKeyPress: e => onKeyPressHandler(e, i),\n onClick: () => onMenuItemClickHandler(name, available),\n \"aria-disabled\": !available ? 'true' : null,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: [title, !available && ' ']\n }), !available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })\n }, name))\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)(['button', 'button--secondary', 'chat__options__button', ...(!multiMenu && firstOptionName ? [`chat__options__button--${firstOptionName}`] : []), ...(!multiMenu && !firstOption.available ? ['button--disabled'] : [])]),\n id: id,\n onClick: onClickHandler,\n onKeyDown: multiMenu ? onButtonKeyDownHandler : null,\n ref: toggleButton,\n \"aria-haspopup\": multiMenu ? 'menu' : null,\n \"aria-expanded\": multiMenu ? menuIsOpen.toString() : null,\n \"aria-disabled\": !multiMenu && !firstOption.available ? 'true' : null,\n children: [multiMenu && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"options\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__text'),\n children: multiMenu ? t('options.openButtonText') : `${firstOption.title}${!firstOption.available ? ' ' : ''}`\n }), !multiMenu && !firstOption.available && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button__state'),\n children: t('options.unavailableText')\n })]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OptionsButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/options-button.js?");
1907
1930
 
1908
1931
  /***/ }),
1909
1932
 
@@ -1958,7 +1981,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1958
1981
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1959
1982
 
1960
1983
  "use strict";
1961
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var _hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _suggestions_list__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Suggestions = ({\n isAside\n}) => {\n // generic hooks\n const {\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_18__.useConfig)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_9__[\"default\"])();\n const {\n isOpen,\n setVisibility\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_13__.useVisibility)(); // a11y hooks\n\n const sectionId = (0,_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_6__.useGeneratedId)();\n const focusSkiplinkTarget = (0,_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__.useSkiplinkTargetFocusing)();\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n sendPolite\n } = (0,_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_15__.useLiveRegion)(); // interrupt & countdown hooks\n\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_5__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(); // data hooks\n\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_12__.useUserHasResponded)();\n const payload = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyServiceData)('suggestion');\n const [eventBody] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)({\n payload\n });\n const suggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => payload && !hasInterrupt ? eventBody : [], [payload, hasInterrupt, eventBody]);\n const prevSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const prevHasSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const previousRenderedSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const hasSuggestions = !!suggestions.length;\n const hideSuggestions = layoutMode === 'inline' ? (hasResponded || isOpen) && !isAside : hasResponded;\n const prevHideSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(hideSuggestions);\n const showSuggestionsContainer = hasSuggestions && !hideSuggestions;\n const renderedSuggestions = hasSuggestions ? suggestions : previousRenderedSuggestions.current;\n previousRenderedSuggestions.current = renderedSuggestions; // click handler\n\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n } // @todo Refactor to 'suggestionclick'\n\n\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_11__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n\n if (!isOpen) {\n setVisibility(_domains_visibility__WEBPACK_IMPORTED_MODULE_13__.visibilityStates.open);\n }\n\n focusSkiplinkTarget();\n }, [addMessageBubble, continueChat, endCountdown, focusSkiplinkTarget, hasCountdown, hasPrompt, payload, sendAction, setVisibility, isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevSuggestions.current !== suggestions && !hideSuggestions) {\n if (hasSuggestions) {\n const politeText = prevHasSuggestions.current ? t('suggestions.srUpdatedText') : t('suggestions.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasSuggestions.current) {\n sendPolite(t('suggestions.srUnavailableText'));\n }\n\n prevSuggestions.current = suggestions;\n }\n\n if (!prevHideSuggestions.current && hideSuggestions) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_16__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('suggestions.srUnavailableText'));\n } else if (!hasSuggestions && prevHasSuggestions.current) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_16__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasSuggestions.current = hasSuggestions;\n prevHideSuggestions.current = hideSuggestions;\n }, [suggestions, hasSuggestions, hideSuggestions, focusSkiplinkTarget, sendPolite, t]);\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n isActive: showSuggestionsContainer,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_14__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsxs)(ContainerElement, {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions'),\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(\"h2\", {\n id: sectionId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__heading'),\n children: headingText\n }), !!renderedSuggestions.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(_suggestions_list__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n hasIcon: true,\n suggestions: renderedSuggestions,\n onClickSuggestion: handleClick\n }), footerText && !isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__footer'),\n children: footerText\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Suggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/suggestions/index.js?");
1984
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../hooks/use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../hooks/use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n/* harmony import */ var _hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../hooks/use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _suggestions_list__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./suggestions-list */ \"./src/javascripts/ui/components/suggestions/suggestions-list.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst Suggestions = ({\n isAside\n}) => {\n // generic hooks\n const {\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_18__.useConfig)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n sendAction,\n addMessageBubble\n } = (0,_hooks_use_seamly_commands__WEBPACK_IMPORTED_MODULE_9__[\"default\"])();\n const {\n isOpen,\n setVisibility\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_13__.useVisibility)(); // a11y hooks\n\n const sectionId = (0,_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_6__.useGeneratedId)();\n const focusSkiplinkTarget = (0,_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__.useSkiplinkTargetFocusing)();\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n sendPolite\n } = (0,_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_15__.useLiveRegion)(); // interrupt & countdown hooks\n\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_5__.useInterrupt)();\n const {\n hasCountdown,\n endCountdown\n } = (0,_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(); // data hooks\n\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_12__.useUserHasResponded)();\n const payload = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyServiceData)('suggestion');\n const [eventBody] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslatedEventData)({\n payload\n });\n const suggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => payload && !hasInterrupt ? eventBody : [], [payload, hasInterrupt, eventBody]);\n const prevSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const prevHasSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const previousRenderedSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)([]);\n const hasSuggestions = !!suggestions.length;\n const hideSuggestions = layoutMode === 'inline' ? (hasResponded || isOpen) && !isAside : hasResponded;\n const prevHideSuggestions = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(hideSuggestions);\n const showSuggestionsContainer = hasSuggestions && !hideSuggestions;\n const renderedSuggestions = hasSuggestions ? suggestions : previousRenderedSuggestions.current;\n previousRenderedSuggestions.current = renderedSuggestions; // click handler\n\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n question\n }) => {\n if (hasCountdown) {\n endCountdown(true);\n }\n\n if (hasPrompt) {\n continueChat();\n } // @todo Refactor to 'suggestionclick'\n\n\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_11__.actionTypes.custom,\n originMessage: payload.id,\n body: {\n type: 'faqclick',\n body: {\n faqId: id,\n faqQuestion: question\n }\n }\n });\n addMessageBubble(question);\n\n if (!isOpen) {\n setVisibility(_domains_visibility__WEBPACK_IMPORTED_MODULE_13__.visibilityStates.open);\n }\n\n focusSkiplinkTarget();\n }, [addMessageBubble, continueChat, endCountdown, focusSkiplinkTarget, hasCountdown, hasPrompt, payload, sendAction, setVisibility, isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevSuggestions.current !== suggestions && !hideSuggestions) {\n if (hasSuggestions) {\n const politeText = prevHasSuggestions.current ? t('suggestions.srUpdatedText') : t('suggestions.srAvailableText');\n setTimeout(() => {\n sendPolite(politeText);\n }, 30);\n } else if (prevHasSuggestions.current) {\n sendPolite(t('suggestions.srUnavailableText'));\n }\n\n prevSuggestions.current = suggestions;\n }\n\n if (!prevHideSuggestions.current && hideSuggestions) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_16__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n sendPolite(t('suggestions.srUnavailableText'));\n } else if (!hasSuggestions && prevHasSuggestions.current) {\n (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_16__.runIfElementContainsOrHasFocus)(containerRef.current, focusSkiplinkTarget);\n }\n\n prevHasSuggestions.current = hasSuggestions;\n prevHideSuggestions.current = hideSuggestions;\n }, [suggestions, hasSuggestions, hideSuggestions, focusSkiplinkTarget, sendPolite, t]);\n const headingText = t('suggestions.headingText');\n const footerText = t('suggestions.footerText');\n const ContainerElement = headingText ? 'section' : 'div';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n isActive: showSuggestionsContainer,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_14__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsxs)(ContainerElement, {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions'),\n \"aria-labelledby\": headingText ? sectionId : null,\n ref: containerRef,\n children: [headingText && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(\"p\", {\n id: sectionId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__heading'),\n children: headingText\n }), !!renderedSuggestions.length && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(_suggestions_list__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n suggestions: renderedSuggestions,\n onClickSuggestion: handleClick\n }), footerText && !isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_19__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('suggestions__footer'),\n children: footerText\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Suggestions);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/suggestions/index.js?");
1962
1985
 
1963
1986
  /***/ }),
1964
1987
 
@@ -1980,7 +2003,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1980
2003
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1981
2004
 
1982
2005
  "use strict";
1983
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _suggestions_item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./suggestions-item */ \"./src/javascripts/ui/components/suggestions/suggestions-item.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\nconst SuggestionsList = ({\n className: givenClassName,\n suggestions = [],\n onClickSuggestion,\n hasIcon\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('suggestions__list', givenClassName),\n children: suggestions.map(suggestion => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_suggestions_item__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread({\n hasIcon: hasIcon,\n onClick: onClickSuggestion\n }, suggestion), suggestion.id))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SuggestionsList);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/suggestions/suggestions-list.js?");
2006
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _suggestions_item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./suggestions-item */ \"./src/javascripts/ui/components/suggestions/suggestions-item.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\nconst SuggestionsList = ({\n className: givenClassName,\n suggestions = [],\n onClickSuggestion,\n hasIcon = true\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('suggestions__list', givenClassName),\n children: suggestions.map(suggestion => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_suggestions_item__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread({\n hasIcon: hasIcon,\n onClick: onClickSuggestion\n }, suggestion), suggestion.id))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SuggestionsList);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/suggestions/suggestions-list.js?");
1984
2007
 
1985
2008
  /***/ }),
1986
2009
 
@@ -1991,7 +2014,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1991
2014
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1992
2015
 
1993
2016
  "use strict";
1994
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _layout_app_frame__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../layout/app-frame */ \"./src/javascripts/ui/components/layout/app-frame.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\n\n\nconst AppView = () => {\n (0,_hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_layout_app_frame__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {})]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/app-view.js?");
2017
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _layout_chat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../layout/chat */ \"./src/javascripts/ui/components/layout/chat.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\n\n\nconst AppView = () => {\n (0,_hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_layout_chat__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {})]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AppView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/app-view.js?");
1995
2018
 
1996
2019
  /***/ }),
1997
2020
 
@@ -2002,7 +2025,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2002
2025
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2003
2026
 
2004
2027
  "use strict";
2005
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _layout_app_frame__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../layout/app-frame */ \"./src/javascripts/ui/components/layout/app-frame.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _layout_agent_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../layout/agent-info */ \"./src/javascripts/ui/components/layout/agent-info.js\");\n/* harmony import */ var _layout_header__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../layout/header */ \"./src/javascripts/ui/components/layout/header.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__);\n\n\n\n\n\n\n\n\n\n\n\n\nconst DeprecatedView = () => {\n const {\n isVisible\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_8__.useVisibility)();\n const {\n closeChat\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyChat)();\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(_layout_app_frame__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n isDeprecated: true,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_layout_header__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onCloseChat: closeChat,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_layout_agent_info__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {})\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {})]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DeprecatedView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/deprecated-view.js?");
2028
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _layout_deprecated_app_frame__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../layout/deprecated-app-frame */ \"./src/javascripts/ui/components/layout/deprecated-app-frame.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _layout_agent_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../layout/agent-info */ \"./src/javascripts/ui/components/layout/agent-info.js\");\n/* harmony import */ var _layout_header__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../layout/header */ \"./src/javascripts/ui/components/layout/header.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _entry_deprecated_toggle_button__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../entry/deprecated-toggle-button */ \"./src/javascripts/ui/components/entry/deprecated-toggle-button.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst DeprecatedView = () => {\n const {\n isVisible\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_8__.useVisibility)();\n const {\n openChat,\n closeChat\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyChat)();\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(_layout_deprecated_app_frame__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_entry_deprecated_toggle_button__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n onOpenChat: openChat\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_layout_header__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n onCloseChat: closeChat,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_layout_agent_info__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {})\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {})]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DeprecatedView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/deprecated-view.js?");
2006
2029
 
2007
2030
  /***/ }),
2008
2031
 
@@ -2013,7 +2036,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2013
2036
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2014
2037
 
2015
2038
  "use strict";
2016
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _app_view__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./app-view */ \"./src/javascripts/ui/components/view/app-view.js\");\n/* harmony import */ var _inline_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./inline-view */ \"./src/javascripts/ui/components/view/inline-view.js\");\n/* harmony import */ var _window_view__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./window-view */ \"./src/javascripts/ui/components/view/window-view/index.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\nconst ViewComponentsMap = {\n app: _app_view__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n inline: _inline_view__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n window: _window_view__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n};\n\nconst View = () => {\n const {\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_0__.useConfig)();\n const {\n visible\n } = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyStateContext)();\n const ViewComponent = ViewComponentsMap[layoutMode];\n\n if (!ViewComponent) {\n console.warn('\"layoutMode\" should be one of \"app\", \"inline\" or \"window\"');\n return null;\n }\n\n return visible !== _domains_visibility__WEBPACK_IMPORTED_MODULE_5__.visibilityStates.hidden && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ViewComponent, {});\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (View);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/index.js?");
2039
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _app_view__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app-view */ \"./src/javascripts/ui/components/view/app-view.js\");\n/* harmony import */ var _inline_view__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./inline-view */ \"./src/javascripts/ui/components/view/inline-view.js\");\n/* harmony import */ var _window_view__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./window-view */ \"./src/javascripts/ui/components/view/window-view/index.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _hooks_component_helper_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../hooks/component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\nconst ViewComponentsMap = {\n app: _app_view__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n inline: _inline_view__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n window: _window_view__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n};\n\nconst View = () => {\n const [, setSeamlyContainerElement] = (0,_hooks_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_10__.useSeamlyContainerElement)();\n const {\n namespace,\n layoutMode,\n zIndex\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_1__.useConfig)();\n const {\n isOpen,\n isVisible\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_5__.useVisibility)();\n const appContainerClassNames = (0,_hooks_component_helper_hooks__WEBPACK_IMPORTED_MODULE_7__.useSeamlyAppContainerClassNames)();\n const userResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_8__.useUserHasResponded)();\n const {\n locale\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_9__.useI18n)();\n const ViewComponent = ViewComponentsMap[layoutMode];\n const containerElementRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(container => {\n setSeamlyContainerElement(container);\n }, [setSeamlyContainerElement]);\n const blockLang = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (locale) {\n const htmlElementLang = document.querySelector('html').getAttribute('lang');\n\n if (htmlElementLang !== locale) {\n return locale;\n }\n }\n\n return undefined;\n }, [locale]);\n\n if (!ViewComponent) {\n console.warn('\"layoutMode\" should be one of \"app\", \"inline\" or \"window\"');\n return null;\n }\n\n const defaultClassNames = [`app--layout-${layoutMode}`, `namespace--${namespace}`];\n const classNames = ['app', ...defaultClassNames, ...appContainerClassNames];\n\n if (!isOpen && layoutMode !== 'app') {\n classNames.push('app--collapsed');\n }\n\n if (userResponded) {\n classNames.push('app--user-responded');\n }\n\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_6__.className)(classNames),\n lang: blockLang,\n tabIndex: \"-1\",\n \"data-nosnippet\": true,\n style: {\n zIndex\n },\n ref: containerElementRef,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(ViewComponent, {})\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (View);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/index.js?");
2017
2040
 
2018
2041
  /***/ }),
2019
2042
 
@@ -2024,7 +2047,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2024
2047
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2025
2048
 
2026
2049
  "use strict";
2027
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _layout_app_frame__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/app-frame */ \"./src/javascripts/ui/components/layout/app-frame.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../hooks/use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../layout/pre-chat-messages */ \"./src/javascripts/ui/components/layout/pre-chat-messages.js\");\n/* harmony import */ var _suggestions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../suggestions */ \"./src/javascripts/ui/components/suggestions/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst InlineView = () => {\n (0,_hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_7__.useVisibility)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: !isOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('unstarted-wrapper'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_suggestions__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {})]\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: isOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_layout_app_frame__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {})]\n })\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InlineView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/inline-view.js?");
2050
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _layout_chat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/chat */ \"./src/javascripts/ui/components/layout/chat.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../hooks/use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../layout/pre-chat-messages */ \"./src/javascripts/ui/components/layout/pre-chat-messages.js\");\n/* harmony import */ var _suggestions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../suggestions */ \"./src/javascripts/ui/components/suggestions/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__);\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst InlineView = () => {\n (0,_hooks_use_seamly_chat__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_7__.useVisibility)();\n const {\n hasInterrupt,\n meta\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_11__.useInterrupt)();\n\n if (hasInterrupt && !isOpen) {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_layout_interrupt__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _objectSpread({}, meta));\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: !isOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('unstarted-wrapper', 'unstarted-wrapper--inline'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_suggestions__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {})]\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: isOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_layout_chat__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {})]\n })\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InlineView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/inline-view.js?");
2028
2051
 
2029
2052
  /***/ }),
2030
2053
 
@@ -2046,7 +2069,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2046
2069
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2047
2070
 
2048
2071
  "use strict";
2049
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _layout_app_frame__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../layout/app-frame */ \"./src/javascripts/ui/components/layout/app-frame.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _window_open_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./window-open-button */ \"./src/javascripts/ui/components/view/window-view/window-open-button.js\");\n/* harmony import */ var _collapse_button__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./collapse-button */ \"./src/javascripts/ui/components/view/window-view/collapse-button.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../layout/pre-chat-messages */ \"./src/javascripts/ui/components/layout/pre-chat-messages.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _conversation_event_splash__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../conversation/event/splash */ \"./src/javascripts/ui/components/conversation/event/splash.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst WindowView = () => {\n const {\n openChat,\n closeChat\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyChat)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_2__.useVisibility)();\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_12__.useUserHasResponded)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_15__.useI18n)();\n const continueChatText = t('window.chat.continue');\n const continueChatEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n payload: {\n body: {\n text: continueChatText\n }\n }\n }), [continueChatText]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_window_open_button__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n onClick: openChat\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: !isOpen && !hasResponded,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_13__.className)('unstarted-wrapper', 'unstarted-wrapper--window'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {})\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: !isOpen && hasResponded,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_13__.className)('unstarted-wrapper', 'unstarted-wrapper--window', 'unstarted-wrapper--continue'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_conversation_event_splash__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n event: continueChatEvent\n })\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: isOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsxs)(_layout_app_frame__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_collapse_button__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n onClick: closeChat\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {})]\n })]\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WindowView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/window-view/index.js?");
2072
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact/hooks */ \"preact/hooks\");\n/* harmony import */ var preact_hooks__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preact_hooks__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_visibility__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../domains/visibility */ \"./src/javascripts/domains/visibility/index.js\");\n/* harmony import */ var _layout_chat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../layout/chat */ \"./src/javascripts/ui/components/layout/chat.js\");\n/* harmony import */ var _layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../layout/chat-frame */ \"./src/javascripts/ui/components/layout/chat-frame.js\");\n/* harmony import */ var _layout_interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../layout/interrupt */ \"./src/javascripts/ui/components/layout/interrupt.js\");\n/* harmony import */ var _conversation_conversation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../conversation/conversation */ \"./src/javascripts/ui/components/conversation/conversation.js\");\n/* harmony import */ var _entry_entry_container__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../entry/entry-container */ \"./src/javascripts/ui/components/entry/entry-container.js\");\n/* harmony import */ var _window_open_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./window-open-button */ \"./src/javascripts/ui/components/view/window-view/window-open-button.js\");\n/* harmony import */ var _collapse_button__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./collapse-button */ \"./src/javascripts/ui/components/view/window-view/collapse-button.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../layout/pre-chat-messages */ \"./src/javascripts/ui/components/layout/pre-chat-messages.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _conversation_event_text__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../conversation/event/text */ \"./src/javascripts/ui/components/conversation/event/text.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst WindowView = () => {\n const {\n openChat,\n closeChat\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyChat)();\n const {\n isOpen\n } = (0,_domains_visibility__WEBPACK_IMPORTED_MODULE_2__.useVisibility)();\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_12__.useUserHasResponded)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_15__.useI18n)();\n const continueChatText = t('window.chat.continue');\n const continueChatEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n payload: {\n body: {\n text: continueChatText\n }\n }\n }), [continueChatText]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_window_open_button__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n onClick: openChat\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: !isOpen && !hasResponded,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.rendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_13__.className)('unstarted-wrapper', 'unstarted-wrapper--window'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_layout_pre_chat_messages__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {})\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: !isOpen && hasResponded,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_13__.className)('unstarted-wrapper', 'unstarted-wrapper--window', 'unstarted-wrapper--continue'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_conversation_event_text__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n event: continueChatEvent\n })\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n isActive: isOpen,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_10__.transitionStartStates.notRendered,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsxs)(_layout_chat__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n children: [isOpen && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_collapse_button__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n onClick: closeChat\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsxs)(_layout_chat_frame__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n interruptComponent: _layout_interrupt__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_conversation_conversation__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_16__.jsx)(_entry_entry_container__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {})]\n })]\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WindowView);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/view/window-view/index.js?");
2050
2073
 
2051
2074
  /***/ }),
2052
2075
 
@@ -2233,7 +2256,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2233
2256
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2234
2257
 
2235
2258
  "use strict";
2236
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectState\": () => (/* binding */ selectState),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* binding */ useSeamlyStateContext),\n/* harmony export */ \"selectEventsWithSuggestion\": () => (/* binding */ selectEventsWithSuggestion),\n/* harmony export */ \"selectEvents\": () => (/* binding */ selectEvents),\n/* harmony export */ \"useEvents\": () => (/* binding */ useEvents),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* binding */ useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* binding */ useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* binding */ useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* binding */ useSkiplink),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* binding */ useSeamlyParticipant),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* binding */ useSeamlyServiceInfo),\n/* harmony export */ \"useLastMessageEventId\": () => (/* binding */ useLastMessageEventId),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* binding */ useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* binding */ useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* binding */ useSeamlyServiceData),\n/* harmony export */ \"useEntryTextLimit\": () => (/* binding */ useEntryTextLimit),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* binding */ useSeamlyLayoutMode)\n/* harmony export */ });\n/* harmony import */ var reselect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reselect */ \"./node_modules/reselect/es/index.js\");\n/* harmony import */ var _domains_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../domains/redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _domains_config_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../domains/config/selectors */ \"./src/javascripts/domains/config/selectors.js\");\n/* harmony import */ var _domains_app_selectors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../domains/app/selectors */ \"./src/javascripts/domains/app/selectors.js\");\n/* harmony import */ var _domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../domains/config/hooks */ \"./src/javascripts/domains/config/hooks.js\");\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\nconst selectState = state => state.state;\nconst useSeamlyStateContext = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectState);\nconst selectEventsWithSuggestion = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectState, _domains_config_selectors__WEBPACK_IMPORTED_MODULE_3__.selectConfig, _domains_app_selectors__WEBPACK_IMPORTED_MODULE_4__.selectUserHasResponded, ({\n events,\n serviceData\n}, config, userHasResponded) => {\n var _serviceData$suggesti;\n\n if (userHasResponded || config.layoutMode === 'inline' || !serviceData.suggestion || !((_serviceData$suggesti = serviceData.suggestion) !== null && _serviceData$suggesti !== void 0 && _serviceData$suggesti.body.length)) {\n return events;\n }\n\n const suggestionsEvent = {\n type: 'service_data',\n payload: serviceData.suggestion\n };\n return [...events, suggestionsEvent];\n});\nconst selectEvents = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectEventsWithSuggestion, _domains_config_selectors__WEBPACK_IMPORTED_MODULE_3__.selectConfig, (events, config) => {\n var _config$messages$time, _config$messages;\n\n const {\n enabled,\n threshold\n } = (_config$messages$time = config === null || config === void 0 ? void 0 : (_config$messages = config.messages) === null || _config$messages === void 0 ? void 0 : _config$messages.timeIndicator) !== null && _config$messages$time !== void 0 ? _config$messages$time : {};\n\n if (!enabled) {\n return events;\n }\n\n const mappedEvents = [];\n let previousEvent = null;\n events.forEach((event, idx) => {\n // always add timeIndicator to first message\n if (idx === 0) {\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator: event.payload.occurredAt\n })); // else check if diff is greater than threshold\n } else {\n const timeIndicator = previousEvent && (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.microsecondsToMilliseconds)(event.payload.occurredAt - previousEvent.payload.occurredAt) >= threshold ? event.payload.occurredAt : undefined;\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator\n }));\n }\n\n previousEvent = event;\n });\n return mappedEvents;\n});\nconst useEvents = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectEvents, []);\nconst useSeamlyIsLoading = () => useSeamlyStateContext().isLoading;\nconst useSeamlyHeaderData = () => useSeamlyStateContext().headerTitles;\nconst useSeamlyUnreadCount = () => useSeamlyStateContext().unreadEvents;\nconst useSkiplink = () => useSeamlyStateContext().skiplinkTargetId;\nconst useSeamlyParticipant = participantId => useSeamlyStateContext().participantInfo.participants[participantId];\nconst useSeamlyServiceInfo = () => useSeamlyStateContext().serviceInfo;\nconst selectLastMessageEventId = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectEvents, events => {\n var _filteredEvents;\n\n const filteredEvents = events.filter(event => event.type === 'message');\n return (_filteredEvents = filteredEvents[filteredEvents.length - 1]) === null || _filteredEvents === void 0 ? void 0 : _filteredEvents.payload.id;\n});\nconst useLastMessageEventId = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectLastMessageEventId);\nconst useSeamlyIsHistoryLoaded = () => useSeamlyStateContext().historyLoaded;\nconst useSeamlyCurrentAgent = () => {\n const {\n participants,\n currentAgent\n } = useSeamlyStateContext().participantInfo;\n return currentAgent ? participants[currentAgent] : null;\n};\nconst useSeamlyServiceData = key => useSeamlyStateContext().serviceData[key];\nconst useEntryTextLimit = () => {\n const {\n entryMeta: {\n options: {\n text\n }\n }\n } = useSeamlyStateContext();\n const {\n limit\n } = text || {};\n return {\n hasLimit: limit != null,\n limit: limit != null ? limit : null\n };\n};\nconst useSeamlyLayoutMode = () => {\n const {\n layoutMode\n } = (0,_domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n return {\n isInline: layoutMode === 'inline',\n isWindow: layoutMode === 'window',\n isResolving: !layoutMode\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-state-hooks.js?");
2259
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectState\": () => (/* binding */ selectState),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* binding */ useSeamlyStateContext),\n/* harmony export */ \"selectEventsWithSuggestion\": () => (/* binding */ selectEventsWithSuggestion),\n/* harmony export */ \"selectEvents\": () => (/* binding */ selectEvents),\n/* harmony export */ \"useEvents\": () => (/* binding */ useEvents),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* binding */ useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* binding */ useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* binding */ useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* binding */ useSkiplink),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* binding */ useSeamlyParticipant),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* binding */ useSeamlyServiceInfo),\n/* harmony export */ \"useLastMessageEventId\": () => (/* binding */ useLastMessageEventId),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* binding */ useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* binding */ useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* binding */ useSeamlyServiceData),\n/* harmony export */ \"useEntryTextLimit\": () => (/* binding */ useEntryTextLimit),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* binding */ useSeamlyLayoutMode)\n/* harmony export */ });\n/* harmony import */ var reselect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reselect */ \"./node_modules/reselect/es/index.js\");\n/* harmony import */ var _domains_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../domains/redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _domains_config_selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../domains/config/selectors */ \"./src/javascripts/domains/config/selectors.js\");\n/* harmony import */ var _domains_app_selectors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../domains/app/selectors */ \"./src/javascripts/domains/app/selectors.js\");\n/* harmony import */ var _domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../domains/config/hooks */ \"./src/javascripts/domains/config/hooks.js\");\nfunction 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; }\n\nfunction _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) { _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; }\n\nfunction _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; }\n\n\n\n\n\n\n\nconst selectState = state => state.state;\nconst useSeamlyStateContext = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectState);\nconst selectEventsWithSuggestion = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectState, _domains_config_selectors__WEBPACK_IMPORTED_MODULE_3__.selectConfig, _domains_app_selectors__WEBPACK_IMPORTED_MODULE_4__.selectUserHasResponded, ({\n events,\n serviceData\n}, config, userHasResponded) => {\n var _serviceData$suggesti;\n\n if (userHasResponded || config.layoutMode === 'inline' || !serviceData.suggestion || !((_serviceData$suggesti = serviceData.suggestion) !== null && _serviceData$suggesti !== void 0 && _serviceData$suggesti.body.length)) {\n return events;\n }\n\n const suggestionsEvent = {\n type: 'service_data',\n payload: serviceData.suggestion\n };\n return [...events, suggestionsEvent];\n});\nconst selectEvents = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectEventsWithSuggestion, _domains_config_selectors__WEBPACK_IMPORTED_MODULE_3__.selectConfig, (events, config) => {\n var _config$messages;\n\n const {\n enabled,\n threshold\n } = (config === null || config === void 0 ? void 0 : (_config$messages = config.messages) === null || _config$messages === void 0 ? void 0 : _config$messages.timeIndicator) ?? {};\n\n if (!enabled) {\n return events;\n }\n\n const mappedEvents = [];\n let previousEvent = null;\n events.forEach((event, idx) => {\n // always add timeIndicator to first message\n if (idx === 0) {\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator: event.payload.occurredAt\n })); // else check if diff is greater than threshold\n } else {\n const timeIndicator = previousEvent && (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_2__.microsecondsToMilliseconds)(event.payload.occurredAt - previousEvent.payload.occurredAt) >= threshold ? event.payload.occurredAt : undefined;\n mappedEvents.push(_objectSpread(_objectSpread({}, event), {}, {\n timeIndicator\n }));\n }\n\n previousEvent = event;\n });\n return mappedEvents;\n});\nconst useEvents = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectEvents, []);\nconst useSeamlyIsLoading = () => useSeamlyStateContext().isLoading;\nconst useSeamlyHeaderData = () => useSeamlyStateContext().headerTitles;\nconst useSeamlyUnreadCount = () => useSeamlyStateContext().unreadEvents;\nconst useSkiplink = () => useSeamlyStateContext().skiplinkTargetId;\nconst useSeamlyParticipant = participantId => useSeamlyStateContext().participantInfo.participants[participantId];\nconst useSeamlyServiceInfo = () => useSeamlyStateContext().serviceInfo;\nconst selectLastMessageEventId = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectEvents, events => {\n var _filteredEvents;\n\n const filteredEvents = events.filter(event => event.type === 'message');\n return (_filteredEvents = filteredEvents[filteredEvents.length - 1]) === null || _filteredEvents === void 0 ? void 0 : _filteredEvents.payload.id;\n});\nconst useLastMessageEventId = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectLastMessageEventId);\nconst useSeamlyIsHistoryLoaded = () => useSeamlyStateContext().historyLoaded;\nconst useSeamlyCurrentAgent = () => {\n const {\n participants,\n currentAgent\n } = useSeamlyStateContext().participantInfo;\n return currentAgent ? participants[currentAgent] : null;\n};\nconst useSeamlyServiceData = key => useSeamlyStateContext().serviceData[key];\nconst useEntryTextLimit = () => {\n const {\n entryMeta: {\n options: {\n text\n }\n }\n } = useSeamlyStateContext();\n const {\n limit\n } = text || {};\n return {\n hasLimit: limit != null,\n limit: limit != null ? limit : null\n };\n};\nconst useSeamlyLayoutMode = () => {\n const {\n layoutMode\n } = (0,_domains_config_hooks__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n return {\n isInline: layoutMode === 'inline',\n isWindow: layoutMode === 'window',\n isResolving: !layoutMode\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-state-hooks.js?");
2237
2260
 
2238
2261
  /***/ }),
2239
2262
 
@@ -3163,6 +3186,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3163
3186
  "use strict";
3164
3187
  eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _unsupportedIterableToArray)\n/* harmony export */ });\n/* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js?");
3165
3188
 
3189
+ /***/ }),
3190
+
3191
+ /***/ "./node_modules/marked/lib/marked.esm.js":
3192
+ /*!***********************************************!*\
3193
+ !*** ./node_modules/marked/lib/marked.esm.js ***!
3194
+ \***********************************************/
3195
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
3196
+
3197
+ "use strict";
3198
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Lexer\": () => (/* binding */ Lexer),\n/* harmony export */ \"Parser\": () => (/* binding */ Parser),\n/* harmony export */ \"Renderer\": () => (/* binding */ Renderer),\n/* harmony export */ \"Slugger\": () => (/* binding */ Slugger),\n/* harmony export */ \"TextRenderer\": () => (/* binding */ TextRenderer),\n/* harmony export */ \"Tokenizer\": () => (/* binding */ Tokenizer),\n/* harmony export */ \"defaults\": () => (/* binding */ defaults),\n/* harmony export */ \"getDefaults\": () => (/* binding */ getDefaults),\n/* harmony export */ \"lexer\": () => (/* binding */ lexer),\n/* harmony export */ \"marked\": () => (/* binding */ marked),\n/* harmony export */ \"options\": () => (/* binding */ options),\n/* harmony export */ \"parse\": () => (/* binding */ parse),\n/* harmony export */ \"parseInline\": () => (/* binding */ parseInline),\n/* harmony export */ \"parser\": () => (/* binding */ parser),\n/* harmony export */ \"setOptions\": () => (/* binding */ setOptions),\n/* harmony export */ \"use\": () => (/* binding */ use),\n/* harmony export */ \"walkTokens\": () => (/* binding */ walkTokens)\n/* harmony export */ });\n/**\n * marked - a markdown parser\n * Copyright (c) 2011-2022, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction getDefaults() {\n return {\n baseUrl: null,\n breaks: false,\n extensions: null,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: null,\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartLists: false,\n smartypants: false,\n tokenizer: null,\n walkTokens: null,\n xhtml: false\n };\n}\n\nlet defaults = getDefaults();\n\nfunction changeDefaults(newDefaults) {\n defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = /[&<>\"']/g;\nconst escapeTestNoEncode = /[<>\"']|&(?!#?\\w+;)/;\nconst escapeReplaceNoEncode = /[<>\"']|&(?!#?\\w+;)/g;\nconst escapeReplacements = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n } else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n regex = regex.source || regex;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n val = val.source || val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: () => {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\nfunction cleanUrl(sanitize, base, href) {\n if (sanitize) {\n let prot;\n try {\n prot = decodeURIComponent(unescape(href))\n .replace(nonWordAndColonTest, '')\n .toLowerCase();\n } catch (e) {\n return null;\n }\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return null;\n }\n }\n if (base && !originIndependentUrl.test(href)) {\n href = resolveUrl(base, href);\n }\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return null;\n }\n return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\nfunction resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (justDomain.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = rtrim(base, '/', true);\n }\n }\n base = baseUrls[' ' + base];\n const relativeBase = base.indexOf(':') === -1;\n\n if (href.substring(0, 2) === '//') {\n if (relativeBase) {\n return href;\n }\n return base.replace(protocol, '$1') + href;\n } else if (href.charAt(0) === '/') {\n if (relativeBase) {\n return href;\n }\n return base.replace(domain, '$1') + href;\n } else {\n return base + href;\n }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction merge(obj) {\n let i = 1,\n target,\n key;\n\n for (; i < arguments.length; i++) {\n target = arguments[i];\n for (key in target) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n obj[key] = target[key];\n }\n }\n }\n\n return obj;\n}\n\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false,\n curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(/ \\|/);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) { cells.shift(); }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) { cells.pop(); }\n\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n\n// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n// /c*$/ is vulnerable to REDOS.\n// invert: Remove suffix of non-c chars instead. Default falsey.\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.substr(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n const l = str.length;\n let level = 0,\n i = 0;\n for (; i < l; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction checkSanitizeDeprecation(opt) {\n if (opt && opt.sanitize && !opt.silent) {\n console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n }\n}\n\n// copied from https://stackoverflow.com/a/5450113/806777\nfunction repeatString(pattern, count) {\n if (count < 1) {\n return '';\n }\n let result = '';\n while (count > 1) {\n if (count & 1) {\n result += pattern;\n }\n count >>= 1;\n pattern += pattern;\n }\n return result + pattern;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n const href = link.href;\n const title = link.title ? escape(link.title) : null;\n const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n const token = {\n type: 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text, [])\n };\n lexer.state.inLink = false;\n return token;\n } else {\n return {\n type: 'image',\n raw,\n href,\n title,\n text: escape(text)\n };\n }\n}\n\nfunction indentCodeCompensation(raw, text) {\n const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nclass Tokenizer {\n constructor(options) {\n this.options = options || defaults;\n }\n\n space(src) {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n }\n\n code(src) {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text\n };\n }\n }\n\n fences(src) {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '');\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim() : cap[2],\n text\n };\n }\n }\n\n heading(src) {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (/#$/.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n const token = {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text: text,\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n }\n\n hr(src) {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n }\n\n blockquote(src) {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n const text = cap[0].replace(/^ *> ?/gm, '');\n\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens: this.lexer.blockTokens(text, []),\n text\n };\n }\n }\n\n list(src) {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine,\n line, nextLine, rawLine, itemContents, endEarly;\n\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = new RegExp(`^( {0,3}${bull})((?: [^\\\\n]*)?(?:\\\\n|$))`);\n\n // Check if current bullet point can start a new List Item\n while (src) {\n endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n line = cap[2].split('\\n', 1)[0];\n nextLine = src.split('\\n', 1)[0];\n\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimLeft();\n } else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n blankLine = false;\n\n if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])`);\n\n // Check if following lines should be included in List Item\n while (src) {\n rawLine = src.split('\\n', 1)[0];\n line = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(line)) {\n break;\n }\n\n if (line.search(/[^ ]/) >= indent || !line.trim()) { // Dedent if possible\n itemContents += '\\n' + line.slice(indent);\n } else if (!blankLine) { // Until blank line, item doesn't need indentation\n itemContents += '\\n' + line;\n } else { // Otherwise, improper indentation ends this item\n break;\n }\n\n if (!blankLine && !line.trim()) { // Check if current line is blank\n blankLine = true;\n }\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw: raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimRight();\n list.items[list.items.length - 1].text = itemContents.trimRight();\n list.raw = list.raw.trimRight();\n\n const l = list.items.length;\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (i = 0; i < l; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.every(t => {\n const chars = t.raw.split('');\n let lineBreaks = 0;\n for (const char of chars) {\n if (char === '\\n') {\n lineBreaks += 1;\n }\n if (lineBreaks > 1) {\n return true;\n }\n }\n\n return false;\n });\n\n if (!list.loose && spacers.length && hasMultipleLineBreaks) {\n // Having a single line break doesn't mean a list is loose. A single line break is terminating the last list item\n list.loose = true;\n list.items[i].loose = true;\n }\n }\n\n return list;\n }\n }\n\n html(src) {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token = {\n type: 'html',\n raw: cap[0],\n pre: !this.options.sanitizer\n && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: cap[0]\n };\n if (this.options.sanitize) {\n token.type = 'paragraph';\n token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n token.tokens = [];\n this.lexer.inline(token.text, token.tokens);\n }\n return token;\n }\n }\n\n def(src) {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);\n const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href: cap[2],\n title: cap[3]\n };\n }\n }\n\n table(src) {\n const cap = this.rules.block.table.exec(src);\n if (cap) {\n const item = {\n type: 'table',\n header: splitCells(cap[1]).map(c => { return { text: c }; }),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n item.raw = cap[0];\n\n let l = item.align.length;\n let i, j, k, row;\n for (i = 0; i < l; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n l = item.rows.length;\n for (i = 0; i < l; i++) {\n item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => { return { text: c }; });\n }\n\n // parse child tokens inside headers and cells\n\n // header child tokens\n l = item.header.length;\n for (j = 0; j < l; j++) {\n item.header[j].tokens = [];\n this.lexer.inlineTokens(item.header[j].text, item.header[j].tokens);\n }\n\n // cell child tokens\n l = item.rows.length;\n for (j = 0; j < l; j++) {\n row = item.rows[j];\n for (k = 0; k < row.length; k++) {\n row[k].tokens = [];\n this.lexer.inlineTokens(row[k].text, row[k].tokens);\n }\n }\n\n return item;\n }\n }\n }\n\n lheading(src) {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n const token = {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n }\n\n paragraph(src) {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const token = {\n type: 'paragraph',\n raw: cap[0],\n text: cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1],\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n }\n\n text(src) {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n const token = {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: []\n };\n this.lexer.inline(token.text, token.tokens);\n return token;\n }\n }\n\n escape(src) {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape(cap[1])\n };\n }\n }\n\n tag(src) {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: this.options.sanitize\n ? 'text'\n : 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n text: this.options.sanitize\n ? (this.options.sanitizer\n ? this.options.sanitizer(cap[0])\n : escape(cap[0]))\n : cap[0]\n };\n }\n }\n\n link(src) {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(/>$/.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (/^</.test(href)) {\n if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n }, cap[0], this.lexer);\n }\n }\n\n reflink(src, links) {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = links[link.toLowerCase()];\n if (!link || !link.href) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n }\n\n emStrong(src, maskedSrc, prevChar = '') {\n let match = this.rules.inline.emStrong.lDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u)) return;\n\n const nextChar = match[1] || match[2] || '';\n\n if (!nextChar || (nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar)))) {\n const lLength = match[0].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = rDelim.length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = src.slice(1, lLength + match.index + rLength);\n return {\n type: 'em',\n raw: src.slice(0, lLength + match.index + rLength + 1),\n text,\n tokens: this.lexer.inlineTokens(text, [])\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = src.slice(2, lLength + match.index + rLength - 1);\n return {\n type: 'strong',\n raw: src.slice(0, lLength + match.index + rLength + 1),\n text,\n tokens: this.lexer.inlineTokens(text, [])\n };\n }\n }\n }\n\n codespan(src) {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(/\\n/g, ' ');\n const hasNonSpaceChars = /[^ ]/.test(text);\n const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text\n };\n }\n }\n\n br(src) {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n }\n\n del(src) {\n const cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2], [])\n };\n }\n }\n\n autolink(src, mangle) {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n href = 'mailto:' + text;\n } else {\n text = escape(cap[1]);\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n\n url(src, mangle) {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + text;\n } else {\n href = text;\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text\n }\n ]\n };\n }\n }\n\n inlineText(src, smartypants) {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n let text;\n if (this.lexer.state.inRawBlock) {\n text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0];\n } else {\n text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text\n };\n }\n }\n}\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n newline: /^(?: *(?:\\n|$))+/,\n code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n fences: /^ {0,3}(`{3,}(?=[^`\\n]*\\n)|~{3,})([^\\n]*)\\n(?:|([\\s\\S]*?)\\n)(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3}bull)( [^\\n]+?)?(?:\\n|$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?<?([^\\s>]+)>?(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n table: noopTest,\n lheading: /^([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n .replace('label', block._label)\n .replace('title', block._title)\n .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n .replace('bull', block.bullet)\n .getRegex();\n\nblock.list = edit(block.list)\n .replace(/bull/g, block.bullet)\n .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n .replace('def', '\\\\n+(?=' + block.def.source + ')')\n .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i')\n .replace('comment', block._comment)\n .replace('tag', block._tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} ')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n .replace('paragraph', block.paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n});\n\nblock.gfm.table = edit(block.gfm.table)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} ')\n .replace('blockquote', ' {0,3}>')\n .replace('code', ' {4}[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.gfm.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} ')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('table', block.gfm.table) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = merge({}, block.normal, {\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', block._comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n paragraph: edit(block.normal._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', block.lheading)\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .getRegex()\n});\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>', // CDATA section\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n reflinkSearch: 'reflink|nolink(?!\\\\()',\n emStrong: {\n lDelim: /^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,\n // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.\n // () Skip orphan delim inside strong (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a\n rDelimAst: /^[^_*]*?\\_\\_[^_*]*?\\*[^_*]*?(?=\\_\\_)|[punct_](\\*+)(?=[\\s]|$)|[^punct*_\\s](\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|[^punct*_\\s](\\*+)(?=[^punct*_\\s])/,\n rDelimUnd: /^[^_*]*?\\*\\*[^_*]*?\\_[^_*]*?(?=\\*\\*)|[punct*](\\_+)(?=[\\s]|$)|[^punct*_\\s](\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/ // ^- Not allowed for _\n },\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n punctuation: /^([\\spunctuation])/\n};\n\n// list of punctuation marks from CommonMark spec\n// without * and _ to handle the different emphasis markers * and _\ninline._punctuation = '!\"#$%&\\'()+\\\\-.,/:;<=>?@\\\\[\\\\]`^{|}~';\ninline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g;\ninline.escapedEmSt = /\\\\\\*|\\\\_/g;\n\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\n\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim)\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g')\n .replace(/punct/g, inline._punctuation)\n .getRegex();\n\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n .replace('scheme', inline._scheme)\n .replace('email', inline._email)\n .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n .replace('comment', inline._comment)\n .replace('attribute', inline._attribute)\n .getRegex();\n\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n .replace('label', inline._label)\n .replace('href', inline._href)\n .replace('title', inline._title)\n .getRegex();\n\ninline.reflink = edit(inline.reflink)\n .replace('label', inline._label)\n .replace('ref', block._label)\n .getRegex();\n\ninline.nolink = edit(inline.nolink)\n .replace('ref', block._label)\n .getRegex();\n\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n .replace('reflink', inline.reflink)\n .replace('nolink', inline.nolink)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n strong: {\n start: /^__|\\*\\*/,\n middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n endAst: /\\*\\*(?!\\*)/g,\n endUnd: /__(?!_)/g\n },\n em: {\n start: /^_|\\*/,\n middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n endAst: /\\*(?!\\*)/g,\n endUnd: /_(?!_)/g\n },\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', inline._label)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', inline._label)\n .getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n});\n\ninline.gfm.url = edit(inline.gfm.url, 'i')\n .replace('email', inline.gfm._extended_email)\n .getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = merge({}, inline.gfm, {\n br: edit(inline.br).replace('{2,}', '*').getRegex(),\n text: edit(inline.gfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex()\n});\n\n/**\n * smartypants text replacement\n */\nfunction smartypants(text) {\n return text\n // em-dashes\n .replace(/---/g, '\\u2014')\n // en-dashes\n .replace(/--/g, '\\u2013')\n // opening singles\n .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n // closing singles & apostrophes\n .replace(/'/g, '\\u2019')\n // opening doubles\n .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n // closing doubles\n .replace(/\"/g, '\\u201d')\n // ellipses\n .replace(/\\.{3}/g, '\\u2026');\n}\n\n/**\n * mangle email addresses\n */\nfunction mangle(text) {\n let out = '',\n i,\n ch;\n\n const l = text.length;\n for (i = 0; i < l; i++) {\n ch = text.charCodeAt(i);\n if (Math.random() > 0.5) {\n ch = 'x' + ch.toString(16);\n }\n out += '&#' + ch + ';';\n }\n\n return out;\n}\n\n/**\n * Block Lexer\n */\nclass Lexer {\n constructor(options) {\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || defaults;\n this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n\n const rules = {\n block: block.normal,\n inline: inline.normal\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new Lexer(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline(src, options) {\n const lexer = new Lexer(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n')\n .replace(/\\t/g, ' ');\n\n this.blockTokens(src, this.tokens);\n\n let next;\n while (next = this.inlineQueue.shift()) {\n this.inlineTokens(next.src, next.tokens);\n }\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src, tokens = []) {\n if (this.options.pedantic) {\n src = src.replace(/^ +$/gm, '');\n }\n let token, lastToken, cutSrc, lastParagraphClipped;\n\n while (src) {\n if (this.options.extensions\n && this.options.extensions.block\n && this.options.extensions.block.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach(function(getStartIndex) {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = (cutSrc.length !== src.length);\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src, tokens) {\n this.inlineQueue.push({ src, tokens });\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src, tokens = []) {\n let token, lastToken, cutSrc;\n\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match;\n let keepPrevChar, prevChar;\n\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n // Mask out escaped em & strong delimiters\n while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);\n }\n\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n // extensions\n if (this.options.extensions\n && this.options.extensions.inline\n && this.options.extensions.inline.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src, mangle)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach(function(getStartIndex) {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) { startIndex = Math.min(startIndex, tempStart); }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n\n/**\n * Renderer\n */\nclass Renderer {\n constructor(options) {\n this.options = options || defaults;\n }\n\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/\\S*/)[0];\n if (this.options.highlight) {\n const out = this.options.highlight(code, lang);\n if (out != null && out !== code) {\n escaped = true;\n code = out;\n }\n }\n\n code = code.replace(/\\n$/, '') + '\\n';\n\n if (!lang) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n\n return '<pre><code class=\"'\n + this.options.langPrefix\n + escape(lang, true)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n';\n }\n\n blockquote(quote) {\n return '<blockquote>\\n' + quote + '</blockquote>\\n';\n }\n\n html(html) {\n return html;\n }\n\n heading(text, level, raw, slugger) {\n if (this.options.headerIds) {\n return '<h'\n + level\n + ' id=\"'\n + this.options.headerPrefix\n + slugger.slug(raw)\n + '\">'\n + text\n + '</h'\n + level\n + '>\\n';\n }\n // ignore IDs\n return '<h' + level + '>' + text + '</h' + level + '>\\n';\n }\n\n hr() {\n return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n }\n\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul',\n startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n }\n\n listitem(text) {\n return '<li>' + text + '</li>\\n';\n }\n\n checkbox(checked) {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"'\n + (this.options.xhtml ? ' /' : '')\n + '> ';\n }\n\n paragraph(text) {\n return '<p>' + text + '</p>\\n';\n }\n\n table(header, body) {\n if (body) body = '<tbody>' + body + '</tbody>';\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n';\n }\n\n tablerow(content) {\n return '<tr>\\n' + content + '</tr>\\n';\n }\n\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? '<' + type + ' align=\"' + flags.align + '\">'\n : '<' + type + '>';\n return tag + content + '</' + type + '>\\n';\n }\n\n // span level renderer\n strong(text) {\n return '<strong>' + text + '</strong>';\n }\n\n em(text) {\n return '<em>' + text + '</em>';\n }\n\n codespan(text) {\n return '<code>' + text + '</code>';\n }\n\n br() {\n return this.options.xhtml ? '<br/>' : '<br>';\n }\n\n del(text) {\n return '<del>' + text + '</del>';\n }\n\n link(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n let out = '<a href=\"' + escape(href) + '\"';\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n out += '>' + text + '</a>';\n return out;\n }\n\n image(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n\n let out = '<img src=\"' + href + '\" alt=\"' + text + '\"';\n if (title) {\n out += ' title=\"' + title + '\"';\n }\n out += this.options.xhtml ? '/>' : '>';\n return out;\n }\n\n text(text) {\n return text;\n }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n\n em(text) {\n return text;\n }\n\n codespan(text) {\n return text;\n }\n\n del(text) {\n return text;\n }\n\n html(text) {\n return text;\n }\n\n text(text) {\n return text;\n }\n\n link(href, title, text) {\n return '' + text;\n }\n\n image(href, title, text) {\n return '' + text;\n }\n\n br() {\n return '';\n }\n}\n\n/**\n * Slugger generates header id\n */\nclass Slugger {\n constructor() {\n this.seen = {};\n }\n\n serialize(value) {\n return value\n .toLowerCase()\n .trim()\n // remove html tags\n .replace(/<[!\\/a-z].*?>/ig, '')\n // remove unwanted chars\n .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n .replace(/\\s/g, '-');\n }\n\n /**\n * Finds the next safe (unique) slug to use\n */\n getNextSafeSlug(originalSlug, isDryRun) {\n let slug = originalSlug;\n let occurenceAccumulator = 0;\n if (this.seen.hasOwnProperty(slug)) {\n occurenceAccumulator = this.seen[originalSlug];\n do {\n occurenceAccumulator++;\n slug = originalSlug + '-' + occurenceAccumulator;\n } while (this.seen.hasOwnProperty(slug));\n }\n if (!isDryRun) {\n this.seen[originalSlug] = occurenceAccumulator;\n this.seen[slug] = 0;\n }\n return slug;\n }\n\n /**\n * Convert string to unique id\n * @param {object} options\n * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator.\n */\n slug(value, options = {}) {\n const slug = this.serialize(value);\n return this.getNextSafeSlug(slug, options.dryrun);\n }\n}\n\n/**\n * Parsing & Compiling\n */\nclass Parser {\n constructor(options) {\n this.options = options || defaults;\n this.options.renderer = this.options.renderer || new Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new TextRenderer();\n this.slugger = new Slugger();\n }\n\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new Parser(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline(tokens, options) {\n const parser = new Parser(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens, top = true) {\n let out = '',\n i,\n j,\n k,\n l2,\n l3,\n row,\n cell,\n header,\n body,\n token,\n ordered,\n start,\n loose,\n itemBody,\n item,\n checked,\n task,\n checkbox,\n ret;\n\n const l = tokens.length;\n for (i = 0; i < l; i++) {\n token = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n\n switch (token.type) {\n case 'space': {\n continue;\n }\n case 'hr': {\n out += this.renderer.hr();\n continue;\n }\n case 'heading': {\n out += this.renderer.heading(\n this.parseInline(token.tokens),\n token.depth,\n unescape(this.parseInline(token.tokens, this.textRenderer)),\n this.slugger);\n continue;\n }\n case 'code': {\n out += this.renderer.code(token.text,\n token.lang,\n token.escaped);\n continue;\n }\n case 'table': {\n header = '';\n\n // header\n cell = '';\n l2 = token.header.length;\n for (j = 0; j < l2; j++) {\n cell += this.renderer.tablecell(\n this.parseInline(token.header[j].tokens),\n { header: true, align: token.align[j] }\n );\n }\n header += this.renderer.tablerow(cell);\n\n body = '';\n l2 = token.rows.length;\n for (j = 0; j < l2; j++) {\n row = token.rows[j];\n\n cell = '';\n l3 = row.length;\n for (k = 0; k < l3; k++) {\n cell += this.renderer.tablecell(\n this.parseInline(row[k].tokens),\n { header: false, align: token.align[k] }\n );\n }\n\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote': {\n body = this.parse(token.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list': {\n ordered = token.ordered;\n start = token.start;\n loose = token.loose;\n l2 = token.items.length;\n\n body = '';\n for (j = 0; j < l2; j++) {\n item = token.items[j];\n checked = item.checked;\n task = item.task;\n\n itemBody = '';\n if (item.task) {\n checkbox = this.renderer.checkbox(checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n } else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox\n });\n }\n } else {\n itemBody += checkbox;\n }\n }\n\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, checked);\n }\n\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html': {\n // TODO parse inline content if parameter markdown=1\n out += this.renderer.html(token.text);\n continue;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(this.parseInline(token.tokens));\n continue;\n }\n case 'text': {\n body = token.tokens ? this.parseInline(token.tokens) : token.text;\n while (i + 1 < l && tokens[i + 1].type === 'text') {\n token = tokens[++i];\n body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n let out = '',\n i,\n token,\n ret;\n\n const l = tokens.length;\n for (i = 0; i < l; i++) {\n token = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token.text);\n break;\n }\n case 'html': {\n out += renderer.html(token.text);\n break;\n }\n case 'link': {\n out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n break;\n }\n case 'image': {\n out += renderer.image(token.href, token.title, token.text);\n break;\n }\n case 'strong': {\n out += renderer.strong(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'em': {\n out += renderer.em(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token.text);\n break;\n }\n case 'br': {\n out += renderer.br();\n break;\n }\n case 'del': {\n out += renderer.del(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'text': {\n out += renderer.text(token.text);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n}\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked(): input parameter is undefined or null');\n }\n if (typeof src !== 'string') {\n throw new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected');\n }\n\n if (typeof opt === 'function') {\n callback = opt;\n opt = null;\n }\n\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n\n if (callback) {\n const highlight = opt.highlight;\n let tokens;\n\n try {\n tokens = Lexer.lex(src, opt);\n } catch (e) {\n return callback(e);\n }\n\n const done = function(err) {\n let out;\n\n if (!err) {\n try {\n if (opt.walkTokens) {\n marked.walkTokens(tokens, opt.walkTokens);\n }\n out = Parser.parse(tokens, opt);\n } catch (e) {\n err = e;\n }\n }\n\n opt.highlight = highlight;\n\n return err\n ? callback(err)\n : callback(null, out);\n };\n\n if (!highlight || highlight.length < 3) {\n return done();\n }\n\n delete opt.highlight;\n\n if (!tokens.length) return done();\n\n let pending = 0;\n marked.walkTokens(tokens, function(token) {\n if (token.type === 'code') {\n pending++;\n setTimeout(() => {\n highlight(token.text, token.lang, function(err, code) {\n if (err) {\n return done(err);\n }\n if (code != null && code !== token.text) {\n token.text = code;\n token.escaped = true;\n }\n\n pending--;\n if (pending === 0) {\n done();\n }\n });\n }, 0);\n }\n });\n\n if (pending === 0) {\n done();\n }\n\n return;\n }\n\n try {\n const tokens = Lexer.lex(src, opt);\n if (opt.walkTokens) {\n marked.walkTokens(tokens, opt.walkTokens);\n }\n return Parser.parse(tokens, opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (opt.silent) {\n return '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n }\n throw e;\n }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n merge(marked.defaults, opt);\n changeDefaults(marked.defaults);\n return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args) {\n const opts = merge({}, ...args);\n const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };\n let hasExtensions;\n\n args.forEach((pack) => {\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n hasExtensions = true;\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if (ext.renderer) { // Renderer extensions\n const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if (ext.tokenizer) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n if (extensions[ext.level]) {\n extensions[ext.level].unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if (ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = marked.defaults.renderer || new Renderer();\n for (const prop in pack.renderer) {\n const prevRenderer = renderer[prop];\n // Replace renderer with func to run extension, but fall back if false\n renderer[prop] = (...args) => {\n let ret = pack.renderer[prop].apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = marked.defaults.tokenizer || new Tokenizer();\n for (const prop in pack.tokenizer) {\n const prevTokenizer = tokenizer[prop];\n // Replace tokenizer with func to run extension, but fall back if false\n tokenizer[prop] = (...args) => {\n let ret = pack.tokenizer[prop].apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = marked.defaults.walkTokens;\n opts.walkTokens = function(token) {\n pack.walkTokens.call(this, token);\n if (walkTokens) {\n walkTokens.call(this, token);\n }\n };\n }\n\n if (hasExtensions) {\n opts.extensions = extensions;\n }\n\n marked.setOptions(opts);\n });\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens, callback) {\n for (const token of tokens) {\n callback.call(marked, token);\n switch (token.type) {\n case 'table': {\n for (const cell of token.header) {\n marked.walkTokens(cell.tokens, callback);\n }\n for (const row of token.rows) {\n for (const cell of row) {\n marked.walkTokens(cell.tokens, callback);\n }\n }\n break;\n }\n case 'list': {\n marked.walkTokens(token.items, callback);\n break;\n }\n default: {\n if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { // Walk any extensions\n marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {\n marked.walkTokens(token[childTokens], callback);\n });\n } else if (token.tokens) {\n marked.walkTokens(token.tokens, callback);\n }\n }\n }\n }\n};\n\n/**\n * Parse Inline\n */\nmarked.parseInline = function(src, opt) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked.parseInline(): input parameter is undefined or null');\n }\n if (typeof src !== 'string') {\n throw new Error('marked.parseInline(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected');\n }\n\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n\n try {\n const tokens = Lexer.lexInline(src, opt);\n if (opt.walkTokens) {\n marked.walkTokens(tokens, opt.walkTokens);\n }\n return Parser.parseInline(tokens, opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (opt.silent) {\n return '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n }\n throw e;\n }\n};\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.parse = marked;\n\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = Parser.parse;\nconst lexer = Lexer.lex;\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/marked/lib/marked.esm.js?");
3199
+
3166
3200
  /***/ })
3167
3201
 
3168
3202
  /******/ });