@seamly/web-ui 18.2.0 → 19.0.0-beta.1

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 (194) hide show
  1. package/build/dist/lib/index.debug.js +598 -136
  2. package/build/dist/lib/index.debug.min.js +1 -1
  3. package/build/dist/lib/index.debug.min.js.LICENSE.txt +190 -22
  4. package/build/dist/lib/index.js +4745 -4468
  5. package/build/dist/lib/index.min.js +1 -1
  6. package/build/dist/lib/index.min.js.LICENSE.txt +1 -1
  7. package/build/dist/lib/standalone.js +4839 -4465
  8. package/build/dist/lib/standalone.min.js +1 -1
  9. package/build/dist/lib/standalone.min.js.LICENSE.txt +1 -1
  10. package/build/dist/lib/style-guide.js +1770 -980
  11. package/build/dist/lib/style-guide.min.js +1 -1
  12. package/build/dist/lib/styles.css +1 -1
  13. package/build/dist/lib/utils.js +0 -1
  14. package/build/dist/lib/utils.min.js +1 -1
  15. package/package.json +29 -29
  16. package/src/javascripts/api/index.js +33 -48
  17. package/src/javascripts/api/producer.js +9 -12
  18. package/src/javascripts/config.js +9 -11
  19. package/src/javascripts/domains/app/actions.js +43 -0
  20. package/src/javascripts/domains/app/hooks.js +6 -0
  21. package/src/javascripts/domains/app/index.js +6 -0
  22. package/src/javascripts/domains/app/reducer.js +16 -0
  23. package/src/javascripts/domains/app/selectors.js +8 -0
  24. package/src/javascripts/domains/app/utils.js +4 -0
  25. package/src/javascripts/domains/config/actions.js +4 -0
  26. package/src/javascripts/domains/config/hooks.js +6 -0
  27. package/src/javascripts/domains/config/index.js +8 -0
  28. package/src/javascripts/domains/config/middleware.js +22 -0
  29. package/src/javascripts/domains/config/reducer.js +63 -0
  30. package/src/javascripts/domains/config/selectors.js +23 -0
  31. package/src/javascripts/domains/config/utils.js +4 -0
  32. package/src/javascripts/domains/forms/actions.js +2 -4
  33. package/src/javascripts/domains/forms/hooks.js +10 -14
  34. package/src/javascripts/domains/forms/provider.js +4 -6
  35. package/src/javascripts/domains/forms/reducer.js +1 -2
  36. package/src/javascripts/domains/forms/selectors.js +4 -4
  37. package/src/javascripts/domains/forms/utils.js +5 -0
  38. package/src/javascripts/domains/i18n/actions.js +35 -0
  39. package/src/javascripts/domains/i18n/hooks.js +38 -0
  40. package/src/javascripts/domains/i18n/index.js +5 -80
  41. package/src/javascripts/domains/i18n/reducer.js +58 -0
  42. package/src/javascripts/domains/i18n/selectors.js +15 -0
  43. package/src/javascripts/domains/i18n/utils.js +9 -0
  44. package/src/javascripts/domains/interrupt/actions.js +4 -0
  45. package/src/javascripts/domains/interrupt/hooks.js +29 -0
  46. package/src/javascripts/domains/interrupt/index.js +9 -0
  47. package/src/javascripts/domains/interrupt/middleware.js +30 -0
  48. package/src/javascripts/domains/interrupt/reducer.js +21 -0
  49. package/src/javascripts/domains/interrupt/selectors.js +6 -0
  50. package/src/javascripts/domains/interrupt/utils.js +4 -0
  51. package/src/javascripts/domains/options/index.js +1 -0
  52. package/src/javascripts/domains/options/middleware.js +35 -0
  53. package/src/javascripts/domains/redux/create-redux-store.js +14 -6
  54. package/src/javascripts/domains/redux/hooks.js +3 -2
  55. package/src/javascripts/domains/redux/index.js +2 -1
  56. package/src/javascripts/domains/redux/provider.js +5 -0
  57. package/src/javascripts/domains/store/index.js +44 -0
  58. package/src/javascripts/{ui → domains}/store/state-reducer.js +4 -7
  59. package/src/javascripts/domains/translations/actions.js +4 -6
  60. package/src/javascripts/domains/translations/components/chat-status.js +7 -13
  61. package/src/javascripts/domains/translations/components/options-button.js +3 -3
  62. package/src/javascripts/domains/translations/components/options-dialog/form.js +12 -7
  63. package/src/javascripts/domains/translations/components/options-dialog/index.js +2 -5
  64. package/src/javascripts/domains/translations/hooks.js +1 -1
  65. package/src/javascripts/domains/translations/index.js +1 -0
  66. package/src/javascripts/domains/translations/middleware.js +43 -0
  67. package/src/javascripts/domains/translations/reducer.js +4 -11
  68. package/src/javascripts/domains/translations/selectors.js +3 -3
  69. package/src/javascripts/domains/translations/utils.js +4 -0
  70. package/src/javascripts/index.js +20 -5
  71. package/src/javascripts/lib/css.js +5 -5
  72. package/src/javascripts/lib/engine/index.js +39 -11
  73. package/src/javascripts/lib/external-api/index.js +6 -6
  74. package/src/javascripts/lib/mutex.js +30 -0
  75. package/src/javascripts/lib/parse-body.js +1 -1
  76. package/src/javascripts/lib/redux-helpers/index.js +25 -8
  77. package/src/javascripts/lib/split-url-params.js +2 -2
  78. package/src/javascripts/lib/store/providers/app-storage.js +1 -1
  79. package/src/javascripts/lib/store/providers/cookie-storage.js +1 -1
  80. package/src/javascripts/package/utils.js +0 -1
  81. package/src/javascripts/style-guide/components/app.js +12 -14
  82. package/src/javascripts/style-guide/components/links.js +6 -6
  83. package/src/javascripts/style-guide/components/static-core.js +32 -10
  84. package/src/javascripts/style-guide/state-helpers/index.js +1 -1
  85. package/src/javascripts/style-guide/states.js +29 -71
  86. package/src/javascripts/style-guide/style-guide-engine.js +13 -12
  87. package/src/javascripts/ui/components/chat-app.js +2 -2
  88. package/src/javascripts/ui/components/conversation/component-filter.js +2 -2
  89. package/src/javascripts/ui/components/conversation/conversation.js +2 -2
  90. package/src/javascripts/ui/components/conversation/event/card-component.js +24 -3
  91. package/src/javascripts/ui/components/conversation/event/carousel-component/components/pagination.js +2 -2
  92. package/src/javascripts/ui/components/conversation/event/carousel-component/index.js +4 -3
  93. package/src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js +2 -1
  94. package/src/javascripts/ui/components/conversation/event/carousel-message/index.js +2 -2
  95. package/src/javascripts/ui/components/conversation/event/choice-prompt.js +5 -5
  96. package/src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js +2 -2
  97. package/src/javascripts/ui/components/conversation/event/event-participant.js +3 -5
  98. package/src/javascripts/ui/components/conversation/event/hooks/use-event-link-click-handler.js +2 -2
  99. package/src/javascripts/ui/components/conversation/event/hooks/use-formatted-date.js +3 -3
  100. package/src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js +3 -3
  101. package/src/javascripts/ui/components/conversation/event/participant.js +2 -2
  102. package/src/javascripts/ui/components/conversation/event/upload.js +12 -27
  103. package/src/javascripts/ui/components/conversation/message-container.js +4 -6
  104. package/src/javascripts/ui/components/core/seamly-activity-monitor.js +4 -5
  105. package/src/javascripts/ui/components/core/seamly-core.js +6 -7
  106. package/src/javascripts/ui/components/core/seamly-event-subscriber.js +18 -17
  107. package/src/javascripts/ui/components/core/seamly-file-upload.js +5 -6
  108. package/src/javascripts/ui/components/core/seamly-idle-detach-counter.js +2 -6
  109. package/src/javascripts/ui/components/core/seamly-initializer.js +7 -60
  110. package/src/javascripts/ui/components/core/seamly-instance-functions-loader.js +10 -16
  111. package/src/javascripts/ui/components/core/seamly-live-region.js +1 -1
  112. package/src/javascripts/ui/components/core/seamly-new-notifications.js +5 -6
  113. package/src/javascripts/ui/components/core/seamly-read-state.js +8 -6
  114. package/src/javascripts/ui/components/entry/entry-container.js +7 -10
  115. package/src/javascripts/ui/components/entry/text-entry/hooks.js +6 -4
  116. package/src/javascripts/ui/components/entry/text-entry/text-entry-form.js +10 -3
  117. package/src/javascripts/ui/components/entry/toggle-button.js +24 -10
  118. package/src/javascripts/ui/components/entry/upload/file-upload-form.js +6 -3
  119. package/src/javascripts/ui/components/entry/upload/index.js +11 -13
  120. package/src/javascripts/ui/components/faq/faq.js +6 -6
  121. package/src/javascripts/ui/components/form-controls/error.js +22 -0
  122. package/src/javascripts/ui/components/form-controls/file-input.js +3 -9
  123. package/src/javascripts/ui/components/form-controls/select.js +1 -1
  124. package/src/javascripts/ui/components/form-controls/wrapper.js +2 -9
  125. package/src/javascripts/ui/components/layout/agent-info.js +4 -4
  126. package/src/javascripts/ui/components/layout/app-frame.js +15 -12
  127. package/src/javascripts/ui/components/layout/chat-frame.js +3 -5
  128. package/src/javascripts/ui/components/layout/header.js +4 -18
  129. package/src/javascripts/ui/components/layout/interrupt.js +6 -2
  130. package/src/javascripts/ui/components/layout/privacy-disclaimer.js +2 -2
  131. package/src/javascripts/ui/components/options/cobrowsing.js +3 -7
  132. package/src/javascripts/ui/components/options/options-button.js +9 -13
  133. package/src/javascripts/ui/components/options/options-frame.js +1 -1
  134. package/src/javascripts/ui/components/options/transcript/index.js +2 -2
  135. package/src/javascripts/ui/components/options/transcript/transcript-form.js +1 -1
  136. package/src/javascripts/ui/components/warnings/cobrowsing-active-frame.js +3 -6
  137. package/src/javascripts/ui/components/warnings/idle-detach-warning.js +2 -6
  138. package/src/javascripts/ui/components/warnings/resume-conversation-prompt.js +1 -1
  139. package/src/javascripts/ui/components/widgets/in-out-transition.js +2 -2
  140. package/src/javascripts/ui/components/widgets/lightbox.js +4 -4
  141. package/src/javascripts/ui/components/widgets/modal.js +3 -3
  142. package/src/javascripts/ui/components/widgets/upload-progress.js +3 -14
  143. package/src/javascripts/ui/hooks/component-helper-hooks.js +4 -15
  144. package/src/javascripts/ui/hooks/file-upload-hooks.js +3 -3
  145. package/src/javascripts/ui/hooks/focus-helper-hooks.js +4 -4
  146. package/src/javascripts/ui/hooks/live-region-hooks.js +2 -2
  147. package/src/javascripts/ui/hooks/seamly-api-hooks.js +0 -6
  148. package/src/javascripts/ui/hooks/seamly-entry-hooks.js +22 -25
  149. package/src/javascripts/ui/hooks/seamly-hooks.js +3 -10
  150. package/src/javascripts/ui/hooks/seamly-option-hooks.js +4 -4
  151. package/src/javascripts/ui/hooks/seamly-state-hooks.js +8 -16
  152. package/src/javascripts/ui/hooks/use-event-component-mapping.js +1 -1
  153. package/src/javascripts/ui/hooks/use-seamly-chat.js +1 -0
  154. package/src/javascripts/ui/hooks/use-seamly-commands.js +31 -54
  155. package/src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js +3 -3
  156. package/src/javascripts/ui/hooks/use-seamly-stored-visibility.js +3 -3
  157. package/src/javascripts/ui/hooks/use-seamly-visibility.js +6 -8
  158. package/src/javascripts/ui/hooks/use-single-file-upload.js +4 -1
  159. package/src/javascripts/ui/hooks/utility-hooks.js +2 -2
  160. package/src/javascripts/ui/utils/form-utils.js +3 -3
  161. package/src/javascripts/ui/utils/general-utils.js +21 -22
  162. package/src/javascripts/ui/utils/seamly-utils.js +15 -83
  163. package/src/javascripts/ui/utils/validations.js +10 -7
  164. package/src/stylesheets/1-settings/_config.scss +2 -1
  165. package/src/stylesheets/3-app/_app.scss +3 -4
  166. package/src/stylesheets/5-components/_card.scss +0 -1
  167. package/src/stylesheets/5-components/_faq.scss +3 -8
  168. package/src/stylesheets/5-components/_message.scss +10 -0
  169. package/src/stylesheets/5-components/_modal.scss +3 -3
  170. package/src/stylesheets/5-components/_options.scss +3 -2
  171. package/webpack/config.common.js +3 -3
  172. package/webpack/config.package.js +4 -22
  173. package/webpack/config.site.js +8 -6
  174. package/webpack/defaults.js +0 -3
  175. package/CHANGELOG.md +0 -561
  176. package/build/dist/translations/de-informal.js +0 -275
  177. package/build/dist/translations/de-informal.min.js +0 -1
  178. package/build/dist/translations/en.js +0 -275
  179. package/build/dist/translations/en.min.js +0 -1
  180. package/build/dist/translations/es-informal.js +0 -281
  181. package/build/dist/translations/es-informal.min.js +0 -1
  182. package/build/dist/translations/nl-formal.js +0 -275
  183. package/build/dist/translations/nl-formal.min.js +0 -1
  184. package/build/dist/translations/nl-informal.js +0 -275
  185. package/build/dist/translations/nl-informal.min.js +0 -1
  186. package/src/javascripts/lib/i18n.js +0 -46
  187. package/src/javascripts/ui/components/core/seamly-api.js +0 -44
  188. package/src/javascripts/ui/hooks/use-seamly-interrupt.js +0 -62
  189. package/src/javascripts/ui/store/index.js +0 -37
  190. package/translations/de-informal.js +0 -237
  191. package/translations/en.js +0 -234
  192. package/translations/es-informal.js +0 -243
  193. package/translations/nl-formal.js +0 -230
  194. package/translations/nl-informal.js +0 -230
@@ -9,13 +9,46 @@
9
9
  /******/ (() => { // webpackBootstrap
10
10
  /******/ var __webpack_modules__ = ({
11
11
 
12
+ /***/ "./node_modules/@ultraq/array-utils/array-utils.es.js":
13
+ /*!************************************************************!*\
14
+ !*** ./node_modules/@ultraq/array-utils/array-utils.es.js ***!
15
+ \************************************************************/
16
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
17
+
18
+ "use strict";
19
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"flatten\": () => (/* binding */ flatten),\n/* harmony export */ \"range\": () => (/* binding */ range),\n/* harmony export */ \"remove\": () => (/* binding */ remove)\n/* harmony export */ });\n/* \n * Copyright 2017, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Flattens an array of arrays of infinite depth into a single-dimension array.\n * \n * > This is now natively in JavaScript as the `flat` method on an Array\n * > instance. [Check MDN for which browsers have access to this feature](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat).\n * > If you can't use `flat`, then this method will do the job 🙂\n * \n * @param {Array} array\n * @return {Array} Flattened array.\n */\nfunction flatten(array) {\n return array.reduce(function (accumulator, value) {\n return accumulator.concat(Array.isArray(value) ? flatten(value) : value);\n }, []);\n}\n/**\n * Creates an array of numbers from the starting value (inclusive) to the end\n * (exclusive), with an optional step (the gap between values).\n * \n * @param {Number} start\n * The value to start at, the first item in the returned array.\n * @param {Number} end\n * The value to end with, the last item in the returned array.\n * @param {Number} [step=1]\n * The increment/gap between values, defaults to 1.\n * @return {Array} An array encompassing the given range.\n */\n\nfunction range(start, end) {\n var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n return Array.apply(0, Array(Math.ceil((end - start) / step))).map(function (empty, index) {\n return index * step + start;\n });\n}\n/**\n * Remove and return the first item from `array` that matches the predicate\n * function.\n * \n * @param {Array} array\n * @param {Function} predicate\n * Invoked with the array item.\n * @return {Object} The matching item, or `null` if no match was found.\n */\n\nfunction remove(array, predicate) {\n return array.find(function (item, index) {\n if (predicate(item)) {\n array.splice(index, 1);\n return item;\n }\n });\n}\n\n//# sourceMappingURL=array-utils.es.js.map\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/array-utils/array-utils.es.js?");
20
+
21
+ /***/ }),
22
+
23
+ /***/ "./node_modules/@ultraq/function-utils/function-utils.es.js":
24
+ /*!******************************************************************!*\
25
+ !*** ./node_modules/@ultraq/function-utils/function-utils.es.js ***!
26
+ \******************************************************************/
27
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
28
+
29
+ "use strict";
30
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"memoize\": () => (/* binding */ memoize)\n/* harmony export */ });\n/**\n * A higher-order function to apply [memoization](https://en.wikipedia.org/wiki/Memoization).\n * \n * If memoizing a recursive function, then memoize and define the function at\n * the same time so you can make a call to the memoized function, eg:\n * \n * ```javascript\n * const myFunction = memoize(() => myFunction());\n * ```\n * \n * @param {Function} func\n * @return {Function} \n */\nfunction memoize(func) {\n var cache = {};\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var key = args.length ? args.map(function (arg) {\n return arg === null ? 'null' : arg === undefined ? 'undefined' : typeof arg === 'function' ? arg.toString() : arg instanceof Date ? arg.toISOString() : JSON.stringify(arg);\n }).join('|') : '_(no-args)_';\n\n if (Object.prototype.hasOwnProperty.call(cache, key)) {\n return cache[key];\n }\n\n var result = func.apply(void 0, args);\n cache[key] = result;\n return result;\n };\n}\n\n//# sourceMappingURL=function-utils.es.js.map\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/function-utils/function-utils.es.js?");
31
+
32
+ /***/ }),
33
+
34
+ /***/ "./node_modules/@ultraq/icu-message-formatter/lib/icu-message-formatter.es.js":
35
+ /*!************************************************************************************!*\
36
+ !*** ./node_modules/@ultraq/icu-message-formatter/lib/icu-message-formatter.es.js ***!
37
+ \************************************************************************************/
38
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
39
+
40
+ "use strict";
41
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MessageFormatter\": () => (/* binding */ MessageFormatter),\n/* harmony export */ \"findClosingBracket\": () => (/* binding */ findClosingBracket),\n/* harmony export */ \"parseCases\": () => (/* binding */ parseCases),\n/* harmony export */ \"pluralTypeHandler\": () => (/* binding */ pluralTypeHandler),\n/* harmony export */ \"selectTypeHandler\": () => (/* binding */ selectTypeHandler),\n/* harmony export */ \"splitFormattedArgument\": () => (/* binding */ splitFormattedArgument)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _ultraq_array_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ultraq/array-utils */ \"./node_modules/@ultraq/array-utils/array-utils.es.js\");\n/* harmony import */ var _ultraq_function_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ultraq/function-utils */ \"./node_modules/@ultraq/function-utils/function-utils.es.js\");\n\n\n\n\n\n\n\n/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Most branch-based type handlers are based around \"cases\".\n * For example, `select` and `plural` compare compare a value\n * to \"case keys\" to choose a subtranslation.\n * \n * This util splits \"matches\" portions provided to the aforementioned\n * handlers into case strings, and extracts any prepended arguments\n * (for example, `plural` supports an `offset:n` argument used for\n * populating the magic `#` variable).\n * \n * @param {String} string\n * @return {Object} The `cases` key points to a map of all cases.\n * The `arguments` key points to a list of prepended arguments.\n */\nfunction parseCases(string) {\n var isWhitespace = function isWhitespace(ch) {\n return /\\s/.test(ch);\n };\n\n var args = [];\n var cases = {};\n var currTermStart = 0;\n var latestTerm = null;\n var inTerm = false;\n var i = 0;\n\n while (i < string.length) {\n // Term ended\n if (inTerm && (isWhitespace(string[i]) || string[i] === '{')) {\n inTerm = false;\n latestTerm = string.slice(currTermStart, i); // We want to process the opening char again so the case will be properly registered.\n\n if (string[i] === '{') {\n i--;\n }\n } // New term\n else if (!inTerm && !isWhitespace(string[i])) {\n var caseBody = string[i] === '{'; // If there's a previous term, we can either handle a whole\n // case, or add that as an argument.\n\n if (latestTerm && caseBody) {\n var branchEndIndex = findClosingBracket(string, i);\n\n if (branchEndIndex === -1) {\n throw new Error(\"Unbalanced curly braces in string: \\\"\".concat(string, \"\\\"\"));\n }\n\n cases[latestTerm] = string.slice(i + 1, branchEndIndex); // Don't include the braces\n\n i = branchEndIndex; // Will be moved up where needed at end of loop.\n\n latestTerm = null;\n } else {\n if (latestTerm) {\n args.push(latestTerm);\n latestTerm = null;\n }\n\n inTerm = true;\n currTermStart = i;\n }\n }\n\n i++;\n }\n\n if (inTerm) {\n latestTerm = string.slice(currTermStart);\n }\n\n if (latestTerm) {\n args.push(latestTerm);\n }\n\n return {\n args: args,\n cases: cases\n };\n}\n/**\n * Finds the index of the matching closing curly bracket, including through\n * strings that could have nested brackets.\n * \n * @param {String} string\n * @param {Number} fromIndex\n * @return {Number} The index of the matching closing bracket, or -1 if no\n * closing bracket could be found.\n */\n\nfunction findClosingBracket(string, fromIndex) {\n var depth = 0;\n\n for (var i = fromIndex + 1; i < string.length; i++) {\n var char = string.charAt(i);\n\n if (char === '}') {\n if (depth === 0) {\n return i;\n }\n\n depth--;\n } else if (char === '{') {\n depth++;\n }\n }\n\n return -1;\n}\n/**\n * Split a `{key, type, format}` block into those 3 parts, taking into account\n * nested message syntax that can exist in the `format` part.\n * \n * @param {String} block\n * @return {Array}\n * An array with `key`, `type`, and `format` items in that order, if present\n * in the formatted argument block.\n */\n\nfunction splitFormattedArgument(block) {\n return split(block.slice(1, -1), ',', 3);\n}\n/**\n * Like `String.prototype.split()` but where the limit parameter causes the\n * remainder of the string to be grouped together in a final entry.\n * \n * @private\n * @param {String} string\n * @param {String} separator\n * @param {Number} limit\n * @param {Array} [accumulator=[]]\n * @return {Array}\n */\n\nfunction split(string, separator, limit) {\n var accumulator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n\n if (!string) {\n return accumulator;\n }\n\n if (limit === 1) {\n accumulator.push(string);\n return accumulator;\n }\n\n var indexOfDelimiter = string.indexOf(separator);\n\n if (indexOfDelimiter === -1) {\n accumulator.push(string);\n return accumulator;\n }\n\n var head = string.substring(0, indexOfDelimiter).trim();\n var tail = string.substring(indexOfDelimiter + separator.length + 1).trim();\n accumulator.push(head);\n return split(tail, separator, limit - 1, accumulator);\n}\n\n/**\n * The main class for formatting messages.\n * \n * @author Emanuel Rabina\n */\n\nvar MessageFormatter = /*#__PURE__*/function () {\n /**\n * Creates a new formatter that can work using any of the custom type handlers\n * you register.\n * \n * @param {String} locale\n * @param {Object} [typeHandlers={}]\n * Optional object where the keys are the names of the types to register,\n * their values being the functions that will return a nicely formatted\n * string for the data and locale they are given.\n */\n function MessageFormatter(locale) {\n var _this = this;\n\n var typeHandlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n (0,_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, MessageFormatter);\n\n (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(this, \"format\", (0,_ultraq_function_utils__WEBPACK_IMPORTED_MODULE_4__.memoize)(function (message) {\n var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return (0,_ultraq_array_utils__WEBPACK_IMPORTED_MODULE_5__.flatten)(_this.process(message, values)).join('');\n }));\n\n this.locale = locale;\n this.typeHandlers = typeHandlers;\n }\n /**\n * Formats an ICU message syntax string using `values` for placeholder data\n * and any currently-registered type handlers.\n * \n * @param {String} message\n * @param {Object} [values={}]\n * @return {String}\n */\n\n\n (0,_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(MessageFormatter, [{\n key: \"process\",\n value:\n /**\n * Process an ICU message syntax string using `values` for placeholder data\n * and any currently-registered type handlers. The result of this method is\n * an array of the component parts after they have been processed in turn by\n * their own type handlers. This raw output is useful for other renderers,\n * eg: React where components can be used instead of being forced to return\n * raw strings.\n * \n * This method is used by {@link MessageFormatter#format} where it acts as a\n * string renderer.\n * \n * @param {String} message\n * @param {Object} [values={}]\n * @return {Array}\n */\n function process(message) {\n var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!message) {\n return [];\n }\n\n var blockStartIndex = message.indexOf('{');\n\n if (blockStartIndex !== -1) {\n var blockEndIndex = findClosingBracket(message, blockStartIndex);\n\n if (blockEndIndex !== -1) {\n var block = message.substring(blockStartIndex, blockEndIndex + 1);\n\n if (block) {\n var result = [];\n var head = message.substring(0, blockStartIndex);\n\n if (head) {\n result.push(head);\n }\n\n var _splitFormattedArgume = splitFormattedArgument(block),\n _splitFormattedArgume2 = (0,_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_splitFormattedArgume, 3),\n key = _splitFormattedArgume2[0],\n type = _splitFormattedArgume2[1],\n format = _splitFormattedArgume2[2];\n\n var body = values[key];\n\n if (body === null || body === undefined) {\n body = '';\n }\n\n var typeHandler = type && this.typeHandlers[type];\n result.push(typeHandler ? typeHandler(body, format, this.locale, values, this.process.bind(this)) : body);\n var tail = message.substring(blockEndIndex + 1);\n\n if (tail) {\n result.push(this.process(tail, values));\n }\n\n return result;\n }\n } else {\n throw new Error(\"Unbalanced curly braces in string: \\\"\".concat(message, \"\\\"\"));\n }\n }\n\n return [message];\n }\n }]);\n\n return MessageFormatter;\n}();\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) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(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; }\nvar pluralFormatter;\nvar keyCounter = 0; // All the special keywords that can be used in `plural` blocks for the various branches\n\nvar ONE = 'one';\nvar OTHER$1 = 'other';\n/**\n * @private\n * @param {String} caseBody\n * @param {Number} value\n * @return {Object} {caseBody: string, numberValues: object}\n */\n\nfunction replaceNumberSign(caseBody, value) {\n var i = 0;\n var output = '';\n var numBraces = 0;\n var numberValues = {};\n\n while (i < caseBody.length) {\n if (caseBody[i] === '#' && !numBraces) {\n var keyParam = \"__hashToken\".concat(keyCounter++);\n output += \"{\".concat(keyParam, \", number}\");\n numberValues[keyParam] = value;\n } else {\n output += caseBody[i];\n }\n\n if (caseBody[i] === '{') {\n numBraces++;\n } else if (caseBody[i] === '}') {\n numBraces--;\n }\n\n i++;\n }\n\n return {\n caseBody: output,\n numberValues: numberValues\n };\n}\n/**\n * Handler for `plural` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#plural-format for more\n * details on how the `plural` statement works.\n * \n * @param {String} value\n * @param {String} matches\n * @param {String} locale\n * @param {String} values\n * @param {Function} format\n * @return {String}\n */\n\n\nfunction pluralTypeHandler(value) {\n var matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var locale = arguments.length > 2 ? arguments[2] : undefined;\n var values = arguments.length > 3 ? arguments[3] : undefined;\n var format = arguments.length > 4 ? arguments[4] : undefined;\n\n var _parseCases = parseCases(matches),\n args = _parseCases.args,\n cases = _parseCases.cases;\n\n var intValue = parseInt(value);\n args.forEach(function (arg) {\n if (arg.startsWith('offset:')) {\n intValue -= parseInt(arg.slice('offset:'.length));\n }\n });\n var keywordPossibilities = [];\n\n if ('PluralRules' in Intl) {\n // Effectively memoize because instantiation of `Int.*` objects is expensive.\n if (pluralFormatter === undefined || pluralFormatter.resolvedOptions().locale !== locale) {\n pluralFormatter = new Intl.PluralRules(locale);\n }\n\n var pluralKeyword = pluralFormatter.select(intValue); // Other is always added last with least priority, so we don't want to add it here.\n\n if (pluralKeyword !== OTHER$1) {\n keywordPossibilities.push(pluralKeyword);\n }\n }\n\n if (intValue === 1) {\n keywordPossibilities.push(ONE);\n }\n\n keywordPossibilities.push(\"=\".concat(intValue), OTHER$1);\n\n for (var i = 0; i < keywordPossibilities.length; i++) {\n var keyword = keywordPossibilities[i];\n\n if (keyword in cases) {\n var _replaceNumberSign = replaceNumberSign(cases[keyword], intValue),\n caseBody = _replaceNumberSign.caseBody,\n numberValues = _replaceNumberSign.numberValues;\n\n return format(caseBody, _objectSpread(_objectSpread({}, values), numberValues));\n }\n }\n\n return value;\n}\n\n/* \n * Copyright 2019, Emanuel Rabina (http://www.ultraq.net.nz/)\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar OTHER = 'other';\n/**\n * Handler for `select` statements within ICU message syntax strings. Returns\n * a formatted string for the branch that closely matches the current value.\n * \n * See https://formatjs.io/docs/core-concepts/icu-syntax#select-format for more\n * details on how the `select` statement works.\n * \n * @param {String} value\n * @param {String} matches\n * @param {String} locale\n * @param {String} values\n * @param {Function} format\n * @return {String}\n */\n\nfunction selectTypeHandler(value) {\n var matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var values = arguments.length > 3 ? arguments[3] : undefined;\n var format = arguments.length > 4 ? arguments[4] : undefined;\n\n var _parseCases = parseCases(matches),\n cases = _parseCases.cases;\n\n if (value in cases) {\n return format(cases[value], values);\n } else if (OTHER in cases) {\n return format(cases[OTHER], values);\n }\n\n return value;\n}\n\n\n//# sourceMappingURL=icu-message-formatter.es.js.map\n\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/lib/icu-message-formatter.es.js?");
42
+
43
+ /***/ }),
44
+
12
45
  /***/ "./node_modules/debug/src/browser.js":
13
46
  /*!*******************************************!*\
14
47
  !*** ./node_modules/debug/src/browser.js ***!
15
48
  \*******************************************/
16
49
  /***/ ((module, exports, __webpack_require__) => {
17
50
 
18
- eval("/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n\nexports.destroy = (() => {\n let warned = false;\n return () => {\n if (!warned) {\n warned = true;\n console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n }\n };\n})();\n/**\n * Colors.\n */\n\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n// eslint-disable-next-line complexity\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n return true;\n } // Internet Explorer and Edge do not support colors.\n\n\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n } // Is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\n\n return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 || typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);\n\n if (!this.useColors) {\n return;\n }\n\n const c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit'); // The final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n\n let index = 0;\n let lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, match => {\n if (match === '%%') {\n return;\n }\n\n index++;\n\n if (match === '%c') {\n // We only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n args.splice(lastC, 0, c);\n}\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\n\n\nexports.log = console.debug || console.log || (() => {});\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n try {\n if (namespaces) {\n exports.storage.setItem('debug', namespaces);\n } else {\n exports.storage.removeItem('debug');\n }\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n let r;\n\n try {\n r = exports.storage.getItem('debug');\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\n\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\n\nfunction localstorage() {\n try {\n // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n // The Browser also has localStorage in the global context.\n return localStorage;\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\nmodule.exports = __webpack_require__(/*! ./common */ \"./node_modules/debug/src/common.js\")(exports);\nconst {\n formatters\n} = module.exports;\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n try {\n return JSON.stringify(v);\n } catch (error) {\n return '[UnexpectedJSONParseError]: ' + error.message;\n }\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/debug/src/browser.js?");
51
+ eval("/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n\nexports.destroy = (() => {\n let warned = false;\n return () => {\n if (!warned) {\n warned = true;\n console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n }\n };\n})();\n/**\n * Colors.\n */\n\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n// eslint-disable-next-line complexity\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n return true;\n } // Internet Explorer and Edge do not support colors.\n\n\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n } // Is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\n\n return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773\n typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);\n\n if (!this.useColors) {\n return;\n }\n\n const c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit'); // The final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n\n let index = 0;\n let lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, match => {\n if (match === '%%') {\n return;\n }\n\n index++;\n\n if (match === '%c') {\n // We only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n args.splice(lastC, 0, c);\n}\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\n\n\nexports.log = console.debug || console.log || (() => {});\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n try {\n if (namespaces) {\n exports.storage.setItem('debug', namespaces);\n } else {\n exports.storage.removeItem('debug');\n }\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n let r;\n\n try {\n r = exports.storage.getItem('debug');\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\n\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\n\nfunction localstorage() {\n try {\n // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n // The Browser also has localStorage in the global context.\n return localStorage;\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\nmodule.exports = __webpack_require__(/*! ./common */ \"./node_modules/debug/src/common.js\")(exports);\nconst {\n formatters\n} = module.exports;\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n try {\n return JSON.stringify(v);\n } catch (error) {\n return '[UnexpectedJSONParseError]: ' + error.message;\n }\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/debug/src/browser.js?");
19
52
 
20
53
  /***/ }),
21
54
 
@@ -35,18 +68,18 @@ eval("/**\n * This is the common logic for both the Node.js and web browser\n *
35
68
  \*******************************************/
36
69
  /***/ (function(module) {
37
70
 
38
- 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 other delimiter (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?");
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?");
39
72
 
40
73
  /***/ }),
41
74
 
42
- /***/ "./node_modules/phoenix/assets/js/phoenix.js":
43
- /*!***************************************************!*\
44
- !*** ./node_modules/phoenix/assets/js/phoenix.js ***!
45
- \***************************************************/
75
+ /***/ "./node_modules/phoenix/priv/static/phoenix.esm.js":
76
+ /*!*********************************************************!*\
77
+ !*** ./node_modules/phoenix/priv/static/phoenix.esm.js ***!
78
+ \*********************************************************/
46
79
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
47
80
 
48
81
  "use strict";
49
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Channel\": () => (/* binding */ Channel),\n/* harmony export */ \"Serializer\": () => (/* binding */ Serializer),\n/* harmony export */ \"Socket\": () => (/* binding */ Socket),\n/* harmony export */ \"LongPoll\": () => (/* binding */ LongPoll),\n/* harmony export */ \"Ajax\": () => (/* binding */ Ajax),\n/* harmony export */ \"Presence\": () => (/* binding */ Presence)\n/* harmony export */ });\n/**\n * Phoenix Channels JavaScript client\n *\n * ## Socket Connection\n *\n * A single connection is established to the server and\n * channels are multiplexed over the connection.\n * Connect to the server using the `Socket` class:\n *\n * ```javascript\n * let socket = new Socket(\"/socket\", {params: {userToken: \"123\"}})\n * socket.connect()\n * ```\n *\n * The `Socket` constructor takes the mount point of the socket,\n * the authentication params, as well as options that can be found in\n * the Socket docs, such as configuring the `LongPoll` transport, and\n * heartbeat.\n *\n * ## Channels\n *\n * Channels are isolated, concurrent processes on the server that\n * subscribe to topics and broker events between the client and server.\n * To join a channel, you must provide the topic, and channel params for\n * authorization. Here's an example chat room example where `\"new_msg\"`\n * events are listened for, messages are pushed to the server, and\n * the channel is joined with ok/error/timeout matches:\n *\n * ```javascript\n * let channel = socket.channel(\"room:123\", {token: roomToken})\n * channel.on(\"new_msg\", msg => console.log(\"Got message\", msg) )\n * $input.onEnter( e => {\n * channel.push(\"new_msg\", {body: e.target.val}, 10000)\n * .receive(\"ok\", (msg) => console.log(\"created message\", msg) )\n * .receive(\"error\", (reasons) => console.log(\"create failed\", reasons) )\n * .receive(\"timeout\", () => console.log(\"Networking issue...\") )\n * })\n *\n * channel.join()\n * .receive(\"ok\", ({messages}) => console.log(\"catching up\", messages) )\n * .receive(\"error\", ({reason}) => console.log(\"failed join\", reason) )\n * .receive(\"timeout\", () => console.log(\"Networking issue. Still waiting...\"))\n *```\n *\n * ## Joining\n *\n * Creating a channel with `socket.channel(topic, params)`, binds the params to\n * `channel.params`, which are sent up on `channel.join()`.\n * Subsequent rejoins will send up the modified params for\n * updating authorization params, or passing up last_message_id information.\n * Successful joins receive an \"ok\" status, while unsuccessful joins\n * receive \"error\".\n *\n * With the default serializers and WebSocket transport, JSON text frames are\n * used for pushing a JSON object literal. If an `ArrayBuffer` instance is provided,\n * binary encoding will be used and the message will be sent with the binary\n * opcode.\n *\n * *Note*: binary messages are only supported on the WebSocket transport.\n *\n * ## Duplicate Join Subscriptions\n *\n * While the client may join any number of topics on any number of channels,\n * the client may only hold a single subscription for each unique topic at any\n * given time. When attempting to create a duplicate subscription,\n * the server will close the existing channel, log a warning, and\n * spawn a new channel for the topic. The client will have their\n * `channel.onClose` callbacks fired for the existing channel, and the new\n * channel join will have its receive hooks processed as normal.\n *\n * ## Pushing Messages\n *\n * From the previous example, we can see that pushing messages to the server\n * can be done with `channel.push(eventName, payload)` and we can optionally\n * receive responses from the push. Additionally, we can use\n * `receive(\"timeout\", callback)` to abort waiting for our other `receive` hooks\n * and take action after some period of waiting. The default timeout is 10000ms.\n *\n *\n * ## Socket Hooks\n *\n * Lifecycle events of the multiplexed connection can be hooked into via\n * `socket.onError()` and `socket.onClose()` events, ie:\n *\n * ```javascript\n * socket.onError( () => console.log(\"there was an error with the connection!\") )\n * socket.onClose( () => console.log(\"the connection dropped\") )\n * ```\n *\n *\n * ## Channel Hooks\n *\n * For each joined channel, you can bind to `onError` and `onClose` events\n * to monitor the channel lifecycle, ie:\n *\n * ```javascript\n * channel.onError( () => console.log(\"there was an error!\") )\n * channel.onClose( () => console.log(\"the channel has gone away gracefully\") )\n * ```\n *\n * ### onError hooks\n *\n * `onError` hooks are invoked if the socket connection drops, or the channel\n * crashes on the server. In either case, a channel rejoin is attempted\n * automatically in an exponential backoff manner.\n *\n * ### onClose hooks\n *\n * `onClose` hooks are invoked only in two cases. 1) the channel explicitly\n * closed on the server, or 2). The client explicitly closed, by calling\n * `channel.leave()`\n *\n *\n * ## Presence\n *\n * The `Presence` object provides features for syncing presence information\n * from the server with the client and handling presences joining and leaving.\n *\n * ### Syncing state from the server\n *\n * To sync presence state from the server, first instantiate an object and\n * pass your channel in to track lifecycle events:\n *\n * ```javascript\n * let channel = socket.channel(\"some:topic\")\n * let presence = new Presence(channel)\n * ```\n *\n * Next, use the `presence.onSync` callback to react to state changes\n * from the server. For example, to render the list of users every time\n * the list changes, you could write:\n *\n * ```javascript\n * presence.onSync(() => {\n * myRenderUsersFunction(presence.list())\n * })\n * ```\n *\n * ### Listing Presences\n *\n * `presence.list` is used to return a list of presence information\n * based on the local state of metadata. By default, all presence\n * metadata is returned, but a `listBy` function can be supplied to\n * allow the client to select which metadata to use for a given presence.\n * For example, you may have a user online from different devices with\n * a metadata status of \"online\", but they have set themselves to \"away\"\n * on another device. In this case, the app may choose to use the \"away\"\n * status for what appears on the UI. The example below defines a `listBy`\n * function which prioritizes the first metadata which was registered for\n * each user. This could be the first tab they opened, or the first device\n * they came online from:\n *\n * ```javascript\n * let listBy = (id, {metas: [first, ...rest]}) => {\n * first.count = rest.length + 1 // count of this user's presences\n * first.id = id\n * return first\n * }\n * let onlineUsers = presence.list(listBy)\n * ```\n *\n * ### Handling individual presence join and leave events\n *\n * The `presence.onJoin` and `presence.onLeave` callbacks can be used to\n * react to individual presences joining and leaving the app. For example:\n *\n * ```javascript\n * let presence = new Presence(channel)\n *\n * // detect if user has joined for the 1st time or from another tab/device\n * presence.onJoin((id, current, newPres) => {\n * if(!current){\n * console.log(\"user has entered for the first time\", newPres)\n * } else {\n * console.log(\"user additional presence\", newPres)\n * }\n * })\n *\n * // detect if user has left from all tabs/devices, or is still present\n * presence.onLeave((id, current, leftPres) => {\n * if(current.metas.length === 0){\n * console.log(\"user has left from all devices\", leftPres)\n * } else {\n * console.log(\"user left from a device\", leftPres)\n * }\n * })\n * // receive presence data from server\n * presence.onSync(() => {\n * displayUsers(presence.list())\n * })\n * ```\n * @module phoenix\n */\nconst globalSelf = typeof self !== \"undefined\" ? self : null;\nconst phxWindow = typeof window !== \"undefined\" ? window : null;\nconst global = globalSelf || phxWindow || undefined;\nconst DEFAULT_VSN = \"2.0.0\";\nconst SOCKET_STATES = {\n connecting: 0,\n open: 1,\n closing: 2,\n closed: 3\n};\nconst DEFAULT_TIMEOUT = 10000;\nconst WS_CLOSE_NORMAL = 1000;\nconst CHANNEL_STATES = {\n closed: \"closed\",\n errored: \"errored\",\n joined: \"joined\",\n joining: \"joining\",\n leaving: \"leaving\"\n};\nconst CHANNEL_EVENTS = {\n close: \"phx_close\",\n error: \"phx_error\",\n join: \"phx_join\",\n reply: \"phx_reply\",\n leave: \"phx_leave\"\n};\nconst CHANNEL_LIFECYCLE_EVENTS = [CHANNEL_EVENTS.close, CHANNEL_EVENTS.error, CHANNEL_EVENTS.join, CHANNEL_EVENTS.reply, CHANNEL_EVENTS.leave];\nconst TRANSPORTS = {\n longpoll: \"longpoll\",\n websocket: \"websocket\"\n}; // wraps value in closure or returns closure\n\nlet closure = value => {\n if (typeof value === \"function\") {\n return value;\n } else {\n let closure = function () {\n return value;\n };\n\n return closure;\n }\n};\n/**\n * Initializes the Push\n * @param {Channel} channel - The Channel\n * @param {string} event - The event, for example `\"phx_join\"`\n * @param {Object} payload - The payload, for example `{user_id: 123}`\n * @param {number} timeout - The push timeout in milliseconds\n */\n\n\nclass Push {\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 *\n * @param {number} timeout\n */\n\n\n resend(timeout) {\n this.timeout = timeout;\n this.reset();\n this.send();\n }\n /**\n *\n */\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 *\n * @param {*} status\n * @param {*} callback\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 * @private\n */\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 * @private\n */\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 * @private\n */\n\n\n cancelRefEvent() {\n if (!this.refEvent) {\n return;\n }\n\n this.channel.off(this.refEvent);\n }\n /**\n * @private\n */\n\n\n cancelTimeout() {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n /**\n * @private\n */\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 * @private\n */\n\n\n hasReceived(status) {\n return this.receivedResp && this.receivedResp.status === status;\n }\n /**\n * @private\n */\n\n\n trigger(status, response) {\n this.channel.trigger(this.refEvent, {\n status,\n response\n });\n }\n\n}\n/**\n *\n * @param {string} topic\n * @param {(Object|function)} params\n * @param {Socket} socket\n */\n\n\nclass Channel {\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 the channel\n * @param {integer} timeout\n * @returns {Push}\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 * Hook into channel close\n * @param {Function} callback\n */\n\n\n onClose(callback) {\n this.on(CHANNEL_EVENTS.close, callback);\n }\n /**\n * Hook into channel errors\n * @param {Function} callback\n */\n\n\n onError(callback) {\n return this.on(CHANNEL_EVENTS.error, reason => callback(reason));\n }\n /**\n * Subscribes on channel events\n *\n * Subscription returns a ref counter, which can be used later to\n * unsubscribe the exact event listener\n *\n * @example\n * const ref1 = channel.on(\"event\", do_stuff)\n * const ref2 = channel.on(\"event\", do_other_stuff)\n * channel.off(\"event\", ref1)\n * // Since unsubscription, do_stuff won't fire,\n * // while do_other_stuff will keep firing on the \"event\"\n *\n * @param {string} event\n * @param {Function} callback\n * @returns {integer} ref\n */\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 * Unsubscribes off of channel events\n *\n * Use the ref returned from a channel.on() to unsubscribe one\n * handler, or pass nothing for the ref to unsubscribe all\n * handlers for the given event.\n *\n * @example\n * // Unsubscribe the do_stuff handler\n * const ref1 = channel.on(\"event\", do_stuff)\n * channel.off(\"event\", ref1)\n *\n * // Unsubscribe all handlers from event\n * channel.off(\"event\")\n *\n * @param {string} event\n * @param {integer} ref\n */\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 * @private\n */\n\n\n canPush() {\n return this.socket.isConnected() && this.isJoined();\n }\n /**\n * Sends a message `event` to phoenix with the payload `payload`.\n * Phoenix receives this in the `handle_in(event, payload, socket)`\n * function. if phoenix replies or it times out (default 10000ms),\n * then optionally the reply can be received.\n *\n * @example\n * channel.push(\"event\")\n * .receive(\"ok\", payload => console.log(\"phoenix replied:\", payload))\n * .receive(\"error\", err => console.log(\"phoenix errored\", err))\n * .receive(\"timeout\", () => console.log(\"timed out pushing\"))\n * @param {string} event\n * @param {Object} payload\n * @param {number} [timeout]\n * @returns {Push}\n */\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 /** Leaves the channel\n *\n * Unsubscribes from server events, and\n * instructs channel to terminate on server\n *\n * Triggers onClose() hooks\n *\n * To receive leave acknowledgements, use the `receive`\n * hook to bind to the server ack, ie:\n *\n * @example\n * channel.leave().receive(\"ok\", () => alert(\"left!\") )\n *\n * @param {integer} timeout\n * @returns {Push}\n */\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 * Overridable message hook\n *\n * Receives all events for specialized message handling\n * before dispatching to the channel callbacks.\n *\n * Must return the payload, modified or unmodified\n * @param {string} event\n * @param {Object} payload\n * @param {integer} ref\n * @returns {Object}\n */\n\n\n onMessage(event, payload, ref) {\n return payload;\n }\n /**\n * @private\n */\n\n\n isLifecycleEvent(event) {\n return CHANNEL_LIFECYCLE_EVENTS.indexOf(event) >= 0;\n }\n /**\n * @private\n */\n\n\n isMember(topic, event, payload, joinRef) {\n if (this.topic !== topic) {\n return false;\n }\n\n if (joinRef && joinRef !== this.joinRef() && this.isLifecycleEvent(event)) {\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 * @private\n */\n\n\n joinRef() {\n return this.joinPush.ref;\n }\n /**\n * @private\n */\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 * @private\n */\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 * @private\n */\n\n\n replyEventName(ref) {\n return `chan_reply_${ref}`;\n }\n /**\n * @private\n */\n\n\n isClosed() {\n return this.state === CHANNEL_STATES.closed;\n }\n /**\n * @private\n */\n\n\n isErrored() {\n return this.state === CHANNEL_STATES.errored;\n }\n /**\n * @private\n */\n\n\n isJoined() {\n return this.state === CHANNEL_STATES.joined;\n }\n /**\n * @private\n */\n\n\n isJoining() {\n return this.state === CHANNEL_STATES.joining;\n }\n /**\n * @private\n */\n\n\n isLeaving() {\n return this.state === CHANNEL_STATES.leaving;\n }\n\n}\n/* The default serializer for encoding and decoding messages */\n\nlet Serializer = {\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 // private\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); // kind\n\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; // pushes have no ref\n\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: topic,\n event: 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: ref,\n topic: topic,\n event: CHANNEL_EVENTS.reply,\n payload: 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: topic,\n event: event,\n payload: data\n };\n }\n\n};\n/** Initializes the Socket\n *\n *\n * For IE8 support use an ES5-shim (https://github.com/es-shims/es5-shim)\n *\n * @param {string} endPoint - The string WebSocket endpoint, ie, `\"ws://example.com/socket\"`,\n * `\"wss://example.com\"`\n * `\"/socket\"` (inherited host & protocol)\n * @param {Object} [opts] - Optional configuration\n * @param {string} [opts.transport] - The Websocket Transport, for example WebSocket or Phoenix.LongPoll.\n *\n * Defaults to WebSocket with automatic LongPoll fallback.\n * @param {Function} [opts.encode] - The function to encode outgoing messages.\n *\n * Defaults to JSON encoder.\n *\n * @param {Function} [opts.decode] - The function to decode incoming messages.\n *\n * Defaults to JSON:\n *\n * ```javascript\n * (payload, callback) => callback(JSON.parse(payload))\n * ```\n *\n * @param {number} [opts.timeout] - The default timeout in milliseconds to trigger push timeouts.\n *\n * Defaults `DEFAULT_TIMEOUT`\n * @param {number} [opts.heartbeatIntervalMs] - The millisec interval to send a heartbeat message\n * @param {number} [opts.reconnectAfterMs] - The optional function that returns the millsec\n * socket reconnect interval.\n *\n * Defaults to stepped backoff of:\n *\n * ```javascript\n * function(tries){\n * return [10, 50, 100, 150, 200, 250, 500, 1000, 2000][tries - 1] || 5000\n * }\n * ````\n *\n * @param {number} [opts.rejoinAfterMs] - The optional function that returns the millsec\n * rejoin interval for individual channels.\n *\n * ```javascript\n * function(tries){\n * return [1000, 2000, 5000][tries - 1] || 10000\n * }\n * ````\n *\n * @param {Function} [opts.logger] - The optional function for specialized logging, ie:\n *\n * ```javascript\n * function(kind, msg, data) {\n * console.log(`${kind}: ${msg}`, data)\n * }\n * ```\n *\n * @param {number} [opts.longpollerTimeout] - The maximum timeout of a long poll AJAX request.\n *\n * Defaults to 20s (double the server long poll timer).\n *\n * @param {{Object|function)} [opts.params] - The optional params to pass when connecting\n * @param {string} [opts.binaryType] - The binary type to use for binary WebSocket frames.\n *\n * Defaults to \"arraybuffer\"\n *\n * @param {vsn} [opts.vsn] - The serializer's protocol version to send on connect.\n *\n * Defaults to DEFAULT_VSN.\n*/\n\nclass Socket {\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.defaultEncoder = Serializer.encode.bind(Serializer);\n this.defaultDecoder = Serializer.decode.bind(Serializer);\n this.closeWasClean = false;\n this.unloaded = false;\n this.binaryType = opts.binaryType || \"arraybuffer\";\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 if (phxWindow && phxWindow.addEventListener) {\n phxWindow.addEventListener(\"beforeunload\", e => {\n if (this.conn) {\n this.unloaded = true;\n this.abnormalClose(\"unloaded\");\n }\n });\n }\n\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 30000;\n\n this.rejoinAfterMs = tries => {\n if (opts.rejoinAfterMs) {\n return opts.rejoinAfterMs(tries);\n } else {\n return [1000, 2000, 5000][tries - 1] || 10000;\n }\n };\n\n this.reconnectAfterMs = tries => {\n if (this.unloaded) {\n return 100;\n }\n\n if (opts.reconnectAfterMs) {\n return opts.reconnectAfterMs(tries);\n } else {\n return [10, 50, 100, 150, 200, 250, 500, 1000, 2000][tries - 1] || 5000;\n }\n };\n\n this.logger = opts.logger || null;\n this.longpollerTimeout = opts.longpollerTimeout || 20000;\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 * Returns the socket protocol\n *\n * @returns {string}\n */\n\n\n protocol() {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n /**\n * The fully qualifed socket url\n *\n * @returns {string}\n */\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 * Disconnects the socket\n *\n * See https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes for valid status codes.\n *\n * @param {Function} callback - Optional callback which is called after socket is disconnected.\n * @param {integer} code - A status code for disconnection (Optional).\n * @param {string} reason - A textual description of the reason to disconnect. (Optional)\n */\n\n\n disconnect(callback, code, reason) {\n this.closeWasClean = true;\n this.reconnectTimer.reset();\n this.teardown(callback, code, reason);\n }\n /**\n *\n * @param {Object} params - The params to send when connecting, for example `{user_id: userToken}`\n *\n * Passing params to connect is deprecated; pass them in the Socket constructor instead:\n * `new Socket(\"/socket\", {params: {user_id: userToken}})`.\n */\n\n\n connect(params) {\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 * Logs the message. Override `this.logger` for specialized logging. noops by default\n * @param {string} kind\n * @param {string} msg\n * @param {Object} data\n */\n\n\n log(kind, msg, data) {\n this.logger(kind, msg, data);\n }\n /**\n * Returns true if a logger has been set on this socket.\n */\n\n\n hasLogger() {\n return this.logger !== null;\n }\n /**\n * Registers callbacks for connection open events\n *\n * @example socket.onOpen(function(){ console.info(\"the socket was opened\") })\n *\n * @param {Function} callback\n */\n\n\n onOpen(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.open.push([ref, callback]);\n return ref;\n }\n /**\n * Registers callbacks for connection close events\n * @param {Function} callback\n */\n\n\n onClose(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.close.push([ref, callback]);\n return ref;\n }\n /**\n * Registers callbacks for connection error events\n *\n * @example socket.onError(function(error){ alert(\"An error occurred\") })\n *\n * @param {Function} callback\n */\n\n\n onError(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.error.push([ref, callback]);\n return ref;\n }\n /**\n * Registers callbacks for connection message events\n * @param {Function} callback\n */\n\n\n onMessage(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.message.push([ref, callback]);\n return ref;\n }\n /**\n * @private\n */\n\n\n onConnOpen() {\n if (this.hasLogger()) this.log(\"transport\", `connected to ${this.endPointURL()}`);\n this.unloaded = false;\n this.closeWasClean = false;\n this.flushSendBuffer();\n this.reconnectTimer.reset();\n this.resetHeartbeat();\n this.stateChangeCallbacks.open.forEach(([, callback]) => callback());\n }\n /**\n * @private\n */\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 () {}; // noop\n\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 * @private\n */\n\n\n onConnError(error) {\n if (this.hasLogger()) this.log(\"transport\", error);\n this.triggerChanError();\n this.stateChangeCallbacks.error.forEach(([, callback]) => callback(error));\n }\n /**\n * @private\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 * @returns {string}\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 * @returns {boolean}\n */\n\n\n isConnected() {\n return this.connectionState() === \"open\";\n }\n /**\n * @private\n *\n * @param {Channel}\n */\n\n\n remove(channel) {\n this.off(channel.stateChangeRefs);\n this.channels = this.channels.filter(c => c.joinRef() !== channel.joinRef());\n }\n /**\n * Removes `onOpen`, `onClose`, `onError,` and `onMessage` registrations.\n *\n * @param {refs} - list of refs returned by calls to\n * `onOpen`, `onClose`, `onError,` and `onMessage`\n */\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 * Initiates a new channel for the given topic\n *\n * @param {string} topic\n * @param {Object} chanParams - Parameters for the channel\n * @returns {Channel}\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 * @param {Object} data\n */\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 * Return the next message ref, accounting for overflows\n * @returns {string}\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}\nclass LongPoll {\n constructor(endPoint) {\n this.endPoint = null;\n this.token = null;\n this.skipHeartbeat = true;\n\n this.onopen = function () {}; // noop\n\n\n this.onerror = function () {}; // noop\n\n\n this.onmessage = function () {}; // noop\n\n\n this.onclose = function () {}; // noop\n\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 var status = 0;\n }\n\n switch (status) {\n case 200:\n messages.forEach(msg => {\n // Tasks are what things like event handlers, setTimeout callbacks,\n // promise resolves and more are run within.\n // In modern browsers, there are two different kinds of tasks,\n // microtasks and macrotasks.\n // Microtasks are mainly used for Promises, while macrotasks are\n // used for everything else.\n // Microtasks always have priority over macrotasks. If the JS engine\n // is looking for a task to run, it will always try to empty the\n // microtask queue before attempting to run anything from the\n // macrotask queue.\n //\n // For the WebSocket transport, messages always arrive in their own\n // event. This means that if any promises are resolved from within,\n // their callbacks will always finish execution by the time the\n // next message event handler is run.\n //\n // In order to emulate this behaviour, we need to make sure each\n // onmessage handler is run within it's own macrotask.\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}\nclass Ajax {\n static request(method, endPoint, accept, body, timeout, ontimeout, callback) {\n if (global.XDomainRequest) {\n let req = new XDomainRequest(); // IE8, IE9\n\n this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);\n } else {\n let req = new global.XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari\n\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 } // Work around bug in IE9 that requires an attached onprogress handler\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 === this.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 (!obj.hasOwnProperty(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}\nAjax.states = {\n complete: 4\n};\n/**\n * Initializes the Presence\n * @param {Channel} channel - The Channel\n * @param {Object} opts - The options,\n * for example `{events: {state: \"state\", diff: \"diff\"}}`\n */\n\nclass Presence {\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 } // lower-level public static API\n\n /**\n * Used to sync the list of presences on the server\n * with the client's state. An optional `onJoin` and `onLeave` callback can\n * be provided to react to changes in the client's local presences across\n * disconnects and reconnects with the server.\n *\n * @returns {Presence}\n */\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: joins,\n leaves: leaves\n }, onJoin, onLeave);\n }\n /**\n *\n * Used to sync a diff of presence join and leave\n * events from the server, as they happen. Like `syncState`, `syncDiff`\n * accepts optional `onJoin` and `onLeave` callbacks to react to a user\n * joining or leaving from a device.\n *\n * @returns {Presence}\n */\n\n\n static syncDiff(currentState, {\n joins,\n leaves\n }, onJoin, onLeave) {\n let state = this.clone(currentState);\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] = 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 * Returns the array of presences, with selected metadata.\n *\n * @param {Object} presences\n * @param {Function} chooser\n *\n * @returns {Presence}\n */\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 } // private\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}\n/**\n *\n * Creates a timer that accepts a `timerCalc` function to perform\n * calculated timeout retries, such as exponential backoff.\n *\n * @example\n * let reconnectTimer = new Timer(() => this.connect(), function(tries){\n * return [1000, 5000, 10000][tries - 1] || 10000\n * })\n * reconnectTimer.scheduleTimeout() // fires after 1000\n * reconnectTimer.scheduleTimeout() // fires after 5000\n * reconnectTimer.reset()\n * reconnectTimer.scheduleTimeout() // fires after 1000\n *\n * @param {Function} callback\n * @param {Function} timerCalc\n */\n\nclass Timer {\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 * Cancels any previous scheduleTimeout and schedules callback\n */\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}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/phoenix/assets/js/phoenix.js?");
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?");
50
83
 
51
84
  /***/ }),
52
85
 
@@ -189,7 +222,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
189
222
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
190
223
 
191
224
  "use strict";
192
- 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__);\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\nconst log = _lib_debug__WEBPACK_IMPORTED_MODULE_12___default()('seamly');\nconst DOMAIN = 'api.seamly-app.com';\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 * @memberof API\n */\n constructor({\n namespace,\n config = {}\n }) {\n this.store = (0,_lib_store_index__WEBPACK_IMPORTED_MODULE_3__.objectStore)(`${namespace}.connection`, 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.sendEnvironment = config.sendEnvironment !== undefined ? config.sendEnvironment : true;\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 setUserResponded(value) {\n this.store.set('userResponded', value);\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 authorizationRequired: true,\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\"]();\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\"]();\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"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 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.sendEnvironment) {\n this.send('context', {\n environment: this.sendEnvironment === true ? getEnvironment() : this.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 getAccountConfig() {\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 }).then(({\n body\n }) => {\n this.updateUrls(body);\n return {\n accountConfig: body.config\n };\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 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\n const initialState = _objectSpread({}, body.conversation);\n\n delete initialState.accessToken;\n delete initialState.channelName;\n return {\n initialState\n };\n }).catch(error => {\n if (error.status === 401) {\n throw new _errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_11__[\"default\"]();\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"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 getConfig() {\n const promiseArray = [this.getAccountConfig()];\n\n if (this.hasConversation()) {\n promiseArray.push(this.getConversationIntitialState());\n }\n\n return Promise.all(promiseArray).then(responses => {\n const config = responses.reduce((configObj, partialConfig) => _objectSpread(_objectSpread({}, configObj), partialConfig), {});\n this.configReady = true;\n return config;\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 if (command === 'message' || command === 'action' && payload && payload.type === 'pick_choice' || command === 'action' && payload && payload.type === 'custom' && payload.body && payload.body.type == 'faqclick') {\n this.setUserResponded(true);\n }\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?");
225
+ 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 * @memberof API\n */\n constructor({\n namespace,\n config = {},\n locale\n }) {\n this.store = (0,_lib_store_index__WEBPACK_IMPORTED_MODULE_3__.objectStore)(`${namespace}.connection${locale ? '.' + 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.sendEnvironment = config.sendEnvironment !== undefined ? config.sendEnvironment : true;\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 authorizationRequired: true,\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\"]();\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\"]();\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"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 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.sendEnvironment) {\n this.send('context', {\n environment: this.sendEnvironment === true ? getEnvironment() : this.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 getAccountConfig() {\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 }).then(({\n body\n }) => {\n this.updateUrls(body);\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 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\"]();\n }\n\n if (error.status === 404) {\n throw new _errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_8__[\"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 getConfig() {\n const config = await this.getAccountConfig();\n this.configReady = true;\n return config;\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\"]();\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?");
193
226
 
194
227
  /***/ }),
195
228
 
@@ -200,7 +233,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
200
233
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
201
234
 
202
235
  "use strict";
203
- 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_assets_js_phoenix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! phoenix/assets/js/phoenix */ \"./node_modules/phoenix/assets/js/phoenix.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/* eslint-disable */\n// Self compile Phoenix to avoid CSP violation caused by the built package due to\n// use of \"new Function\".\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 }\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(msg => {\n log('[SOCKET]CLOSE');\n this.emit({\n type: 'connection',\n connected: false,\n ready: false\n });\n });\n this.channel.onClose(msg => {\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 }\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_assets_js_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?");
236
+ 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 }\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 }\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?");
204
237
 
205
238
  /***/ }),
206
239
 
@@ -211,7 +244,150 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
211
244
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
212
245
 
213
246
  "use strict";
214
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CSS_NAME\": () => (/* binding */ CSS_NAME),\n/* harmony export */ \"apiVersion\": () => (/* binding */ apiVersion),\n/* harmony export */ \"layoutMode\": () => (/* binding */ layoutMode),\n/* harmony export */ \"appContainerClassNames\": () => (/* binding */ appContainerClassNames),\n/* harmony export */ \"typing\": () => (/* binding */ typing),\n/* harmony export */ \"userParticipantId\": () => (/* binding */ userParticipantId),\n/* harmony export */ \"unreadScreenReaderWait\": () => (/* binding */ unreadScreenReaderWait),\n/* harmony export */ \"newMessageScreenReaderWait\": () => (/* binding */ newMessageScreenReaderWait),\n/* harmony export */ \"screenReaderDebounceDelaySeconds\": () => (/* binding */ screenReaderDebounceDelaySeconds),\n/* harmony export */ \"activitySendDelay\": () => (/* binding */ activitySendDelay),\n/* harmony export */ \"maxCharacterWarningLimit\": () => (/* binding */ maxCharacterWarningLimit),\n/* harmony export */ \"maxCharacterSrDebounceDelay\": () => (/* binding */ maxCharacterSrDebounceDelay),\n/* harmony export */ \"defaultTransitionTimeMs\": () => (/* binding */ defaultTransitionTimeMs),\n/* harmony export */ \"defaultConfig\": () => (/* binding */ defaultConfig)\n/* harmony export */ });\nconst CSS_NAME = 'cvco';\nconst apiVersion = '2';\nconst layoutMode = 'window'; // \"window\", \"inline\" (\"sidebar\"), \"modal\"\n\nconst appContainerClassNames = config => [`app--layout-${config.layoutMode}`, `namespace--${config.namespace}`];\nconst typing = {\n timeout: 2000 // How long to wait before we decide the user isn't typing\n\n};\nconst userParticipantId = 'seamly-client-participant'; // How long to debounce distinct changes in unread messages for before\n// broadcasting to the screen reader. This is done to avoid verbosity.\n\nconst unreadScreenReaderWait = 2000;\nconst newMessageScreenReaderWait = 1000;\nconst screenReaderDebounceDelaySeconds = 10;\nconst activitySendDelay = 15000;\nconst maxCharacterWarningLimit = 50;\nconst maxCharacterSrDebounceDelay = 300;\nconst defaultTransitionTimeMs = 300;\nconst defaultConfig = {\n messages: {\n agent: {\n showAvatar: false,\n // true, \"inline\"\n showName: false\n },\n user: {\n showAvatar: false,\n // true, \"inline\"\n showName: false\n },\n timeIndicator: {\n enabled: false,\n threshold: 3600000 // Default threshold is an hour in milliseconds\n\n }\n }\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/config.js?");
247
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CSS_NAME\": () => (/* binding */ CSS_NAME),\n/* harmony export */ \"apiVersion\": () => (/* binding */ apiVersion),\n/* harmony export */ \"userParticipantId\": () => (/* binding */ userParticipantId),\n/* harmony export */ \"unreadScreenReaderWait\": () => (/* binding */ unreadScreenReaderWait),\n/* harmony export */ \"newMessageScreenReaderWait\": () => (/* binding */ newMessageScreenReaderWait),\n/* harmony export */ \"screenReaderDebounceDelaySeconds\": () => (/* binding */ screenReaderDebounceDelaySeconds),\n/* harmony export */ \"activitySendDelay\": () => (/* binding */ activitySendDelay),\n/* harmony export */ \"maxCharacterWarningLimit\": () => (/* binding */ maxCharacterWarningLimit),\n/* harmony export */ \"maxCharacterSrDebounceDelay\": () => (/* binding */ maxCharacterSrDebounceDelay),\n/* harmony export */ \"defaultTransitionTimeMs\": () => (/* binding */ defaultTransitionTimeMs),\n/* harmony export */ \"typingTimeout\": () => (/* binding */ typingTimeout),\n/* harmony export */ \"defaultConfig\": () => (/* binding */ defaultConfig)\n/* harmony export */ });\nconst CSS_NAME = 'cvco';\nconst apiVersion = '2';\nconst userParticipantId = 'seamly-client-participant'; // How long to debounce distinct changes in unread messages for before\n// broadcasting to the screen reader. This is done to avoid verbosity.\n\nconst unreadScreenReaderWait = 2000;\nconst newMessageScreenReaderWait = 1000;\nconst screenReaderDebounceDelaySeconds = 10;\nconst activitySendDelay = 15000;\nconst maxCharacterWarningLimit = 50;\nconst maxCharacterSrDebounceDelay = 300;\nconst defaultTransitionTimeMs = 300; // How long to wait before we decide the user isn't typing\n\nconst typingTimeout = 2000;\nconst defaultConfig = {\n namespace: 'default',\n layoutMode: 'window',\n // \"window\", \"inline\" (\"sidebar\"), \"modal\"\n messages: {\n agent: {\n showAvatar: false,\n // true, \"inline\"\n showName: false\n },\n user: {\n showAvatar: false,\n // true, \"inline\"\n showName: false\n },\n timeIndicator: {\n enabled: false,\n threshold: 3600000 // Default threshold is an hour in milliseconds\n\n }\n },\n appContainerClassNames: config => [`app--layout-${config.layoutMode}`, `namespace--${config.namespace}`]\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/config.js?");
248
+
249
+ /***/ }),
250
+
251
+ /***/ "./src/javascripts/domains/app/actions.js":
252
+ /*!************************************************!*\
253
+ !*** ./src/javascripts/domains/app/actions.js ***!
254
+ \************************************************/
255
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
256
+
257
+ "use strict";
258
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setHasResponded\": () => (/* binding */ setHasResponded),\n/* harmony export */ \"initialize\": () => (/* binding */ initialize)\n/* harmony export */ });\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/app/utils.js\");\n\n\n\n\n\nconst setHasResponded = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.createAction)('setHasResponded', hasResponded => ({\n hasResponded\n}));\nconst initialize = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.createThunk)('initialize', config => async (dispatch, getState, {\n api\n}) => {\n try {\n var _config$context;\n\n dispatch(_config__WEBPACK_IMPORTED_MODULE_1__.Actions.initialize(config));\n const {\n features,\n defaultLocale\n } = await api.getConfig();\n dispatch({\n type: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__.seamlyActions.SET_FEATURES,\n features\n });\n let locale = (config === null || config === void 0 ? void 0 : (_config$context = config.context) === null || _config$context === void 0 ? void 0 : _config$context.locale) || defaultLocale;\n dispatch(_i18n__WEBPACK_IMPORTED_MODULE_3__.Actions.setInitialLocale(locale));\n\n try {\n if (api.hasConversation()) {\n var _initialState$transla;\n\n const initialState = await api.getConversationIntitialState();\n dispatch({\n type: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__.seamlyActions.SET_INITIAL_STATE,\n initialState\n });\n locale = ((_initialState$transla = initialState.translation) === null || _initialState$transla === void 0 ? void 0 : _initialState$transla.locale) || locale;\n\n if ('userResponded' in initialState) {\n dispatch(setHasResponded(initialState.userResponded));\n }\n }\n } catch (error) {\n dispatch(_interrupt__WEBPACK_IMPORTED_MODULE_2__.Actions.set(error));\n }\n\n await dispatch(_i18n__WEBPACK_IMPORTED_MODULE_3__.Actions.setLocale(locale));\n } catch (error) {\n dispatch(_interrupt__WEBPACK_IMPORTED_MODULE_2__.Actions.set(error));\n }\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/actions.js?");
259
+
260
+ /***/ }),
261
+
262
+ /***/ "./src/javascripts/domains/app/hooks.js":
263
+ /*!**********************************************!*\
264
+ !*** ./src/javascripts/domains/app/hooks.js ***!
265
+ \**********************************************/
266
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
267
+
268
+ "use strict";
269
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useUserHasResponded\": () => (/* binding */ useUserHasResponded)\n/* harmony export */ });\n/* harmony import */ var _redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/app/selectors.js\");\n\n\nfunction useUserHasResponded() {\n return (0,_redux__WEBPACK_IMPORTED_MODULE_0__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_1__.selectUserHasResponded);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/hooks.js?");
270
+
271
+ /***/ }),
272
+
273
+ /***/ "./src/javascripts/domains/app/index.js":
274
+ /*!**********************************************!*\
275
+ !*** ./src/javascripts/domains/app/index.js ***!
276
+ \**********************************************/
277
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
278
+
279
+ "use strict";
280
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useUserHasResponded\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_1__.useUserHasResponded),\n/* harmony export */ \"Reducer\": () => (/* reexport safe */ _reducer__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ \"Actions\": () => (/* reexport module object */ _actions__WEBPACK_IMPORTED_MODULE_0__)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/app/actions.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/app/hooks.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/app/reducer.js\");\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/index.js?");
281
+
282
+ /***/ }),
283
+
284
+ /***/ "./src/javascripts/domains/app/reducer.js":
285
+ /*!************************************************!*\
286
+ !*** ./src/javascripts/domains/app/reducer.js ***!
287
+ \************************************************/
288
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
289
+
290
+ "use strict";
291
+ 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/app/utils.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./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\nconst initialState = {\n userHasResponded: false\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.createReducer)({\n [_actions__WEBPACK_IMPORTED_MODULE_1__.setHasResponded]: (state, {\n hasResponded\n }) => _objectSpread(_objectSpread({}, state), {}, {\n userHasResponded: hasResponded\n })\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/reducer.js?");
292
+
293
+ /***/ }),
294
+
295
+ /***/ "./src/javascripts/domains/app/selectors.js":
296
+ /*!**************************************************!*\
297
+ !*** ./src/javascripts/domains/app/selectors.js ***!
298
+ \**************************************************/
299
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
300
+
301
+ "use strict";
302
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectUserHasResponded\": () => (/* binding */ selectUserHasResponded),\n/* harmony export */ \"selectState\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_1__.selectState)\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 _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/app/utils.js\");\n\n\nconst selectUserHasResponded = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(_utils__WEBPACK_IMPORTED_MODULE_1__.selectState, state => state.userHasResponded);\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/selectors.js?");
303
+
304
+ /***/ }),
305
+
306
+ /***/ "./src/javascripts/domains/app/utils.js":
307
+ /*!**********************************************!*\
308
+ !*** ./src/javascripts/domains/app/utils.js ***!
309
+ \**********************************************/
310
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
311
+
312
+ "use strict";
313
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createAction\": () => (/* binding */ createAction),\n/* harmony export */ \"createThunk\": () => (/* binding */ createThunk),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState)\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 createAction,\n createThunk,\n createReducer,\n selectState\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('app');\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/app/utils.js?");
314
+
315
+ /***/ }),
316
+
317
+ /***/ "./src/javascripts/domains/config/actions.js":
318
+ /*!***************************************************!*\
319
+ !*** ./src/javascripts/domains/config/actions.js ***!
320
+ \***************************************************/
321
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
322
+
323
+ "use strict";
324
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initialize\": () => (/* binding */ initialize),\n/* harmony export */ \"update\": () => (/* binding */ update)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/config/utils.js\");\n\nconst initialize = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createAction)('initialize', config => ({\n config\n}));\nconst update = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createAction)('update', config => ({\n config\n}));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/actions.js?");
325
+
326
+ /***/ }),
327
+
328
+ /***/ "./src/javascripts/domains/config/hooks.js":
329
+ /*!*************************************************!*\
330
+ !*** ./src/javascripts/domains/config/hooks.js ***!
331
+ \*************************************************/
332
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
333
+
334
+ "use strict";
335
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useConfig\": () => (/* binding */ useConfig)\n/* harmony export */ });\n/* harmony import */ var _redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/config/selectors.js\");\n\n\nfunction useConfig() {\n return (0,_redux__WEBPACK_IMPORTED_MODULE_0__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_1__.selectConfig);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/hooks.js?");
336
+
337
+ /***/ }),
338
+
339
+ /***/ "./src/javascripts/domains/config/index.js":
340
+ /*!*************************************************!*\
341
+ !*** ./src/javascripts/domains/config/index.js ***!
342
+ \*************************************************/
343
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
344
+
345
+ "use strict";
346
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useConfig\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useConfig),\n/* harmony export */ \"createMiddleware\": () => (/* reexport safe */ _middleware__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"Reducer\": () => (/* reexport safe */ _reducer__WEBPACK_IMPORTED_MODULE_4__[\"default\"]),\n/* harmony export */ \"Actions\": () => (/* reexport module object */ _actions__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"Selectors\": () => (/* reexport module object */ _selectors__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/config/actions.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/config/selectors.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/config/hooks.js\");\n/* harmony import */ var _middleware__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./middleware */ \"./src/javascripts/domains/config/middleware.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/config/reducer.js\");\n\n\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/index.js?");
347
+
348
+ /***/ }),
349
+
350
+ /***/ "./src/javascripts/domains/config/middleware.js":
351
+ /*!******************************************************!*\
352
+ !*** ./src/javascripts/domains/config/middleware.js ***!
353
+ \******************************************************/
354
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
355
+
356
+ "use strict";
357
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createMiddleware)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/config/actions.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n\n\nfunction createMiddleware() {\n return ({\n dispatch\n }) => next => action => {\n var _action$config, _action$config$defaul;\n\n const result = next(action);\n\n switch (action.type) {\n case String(_actions__WEBPACK_IMPORTED_MODULE_0__.initialize):\n case String(_actions__WEBPACK_IMPORTED_MODULE_0__.update):\n if (action !== null && action !== void 0 && (_action$config = action.config) !== null && _action$config !== void 0 && (_action$config$defaul = _action$config.defaults) !== null && _action$config$defaul !== void 0 && _action$config$defaul.agentName) {\n var _action$config2, _action$config2$defau;\n\n dispatch({\n type: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.SET_HEADER_SUB_TITLE,\n title: action === null || action === void 0 ? void 0 : (_action$config2 = action.config) === null || _action$config2 === void 0 ? void 0 : (_action$config2$defau = _action$config2.defaults) === null || _action$config2$defau === void 0 ? void 0 : _action$config2$defau.agentName\n });\n }\n\n }\n\n return result;\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/middleware.js?");
358
+
359
+ /***/ }),
360
+
361
+ /***/ "./src/javascripts/domains/config/reducer.js":
362
+ /*!***************************************************!*\
363
+ !*** ./src/javascripts/domains/config/reducer.js ***!
364
+ \***************************************************/
365
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
366
+
367
+ "use strict";
368
+ 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 _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/config/utils.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/config/actions.js\");\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\nconst _excluded = [\"messages\"];\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\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\nconst initialState = _objectSpread(_objectSpread({}, _config__WEBPACK_IMPORTED_MODULE_0__.defaultConfig), {}, {\n hideOnNoUserResponse: false,\n showDisclaimer: false,\n showFaq: false,\n customComponents: {},\n defaults: {}\n});\n\nconst configKeys = ['hideOnNoUserResponse', 'showDisclaimer', 'showFaq', 'namespace', 'customComponents', 'defaults', 'layoutMode', 'api', 'zIndex', 'context', 'appContainerClassNames', 'messages', 'visible', 'visibilityCallback'];\n\nconst updateState = (state, {\n config\n}) => {\n const _pick = (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_3__.pick)(config, configKeys),\n {\n messages\n } = _pick,\n partialConfig = _objectWithoutProperties(_pick, _excluded);\n\n let newState = state;\n\n if (Object.keys(partialConfig).length > 0) {\n newState = _objectSpread(_objectSpread({}, newState), partialConfig);\n }\n\n if (messages) {\n newState = _objectSpread(_objectSpread({}, newState), {}, {\n messages: _objectSpread(_objectSpread({}, newState.messages), messages)\n });\n }\n\n return newState;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.createReducer)({\n [_actions__WEBPACK_IMPORTED_MODULE_2__.initialize]: (state, action) => {\n return updateState(state, action);\n },\n [_actions__WEBPACK_IMPORTED_MODULE_2__.update]: (state, action) => {\n return updateState(state, action);\n }\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/reducer.js?");
369
+
370
+ /***/ }),
371
+
372
+ /***/ "./src/javascripts/domains/config/selectors.js":
373
+ /*!*****************************************************!*\
374
+ !*** ./src/javascripts/domains/config/selectors.js ***!
375
+ \*****************************************************/
376
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
377
+
378
+ "use strict";
379
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectConfig\": () => (/* binding */ selectConfig),\n/* harmony export */ \"selectState\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_2__.selectState)\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 _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/config/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\nconst selectConfig = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(_utils__WEBPACK_IMPORTED_MODULE_2__.selectState, config => {\n let newConfig = _objectSpread({\n visible: (config === null || config === void 0 ? void 0 : config.layoutMode) === 'inline' ? _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.visibilityStates.open : _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.visibilityStates.minimized,\n appContainerClassNames: config.appContainerClassNames || []\n }, config);\n\n if (typeof newConfig.appContainerClassNames === 'function') {\n newConfig = _objectSpread(_objectSpread({}, newConfig), {}, {\n appContainerClassNames: newConfig.appContainerClassNames(newConfig)\n });\n }\n\n return newConfig;\n});\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/selectors.js?");
380
+
381
+ /***/ }),
382
+
383
+ /***/ "./src/javascripts/domains/config/utils.js":
384
+ /*!*************************************************!*\
385
+ !*** ./src/javascripts/domains/config/utils.js ***!
386
+ \*************************************************/
387
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
388
+
389
+ "use strict";
390
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createAction\": () => (/* binding */ createAction),\n/* harmony export */ \"createThunk\": () => (/* binding */ createThunk),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState)\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 createAction,\n createThunk,\n createReducer,\n selectState\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('config');\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/config/utils.js?");
215
391
 
216
392
  /***/ }),
217
393
 
@@ -222,7 +398,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
222
398
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
223
399
 
224
400
  "use strict";
225
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerForm\": () => (/* binding */ registerForm),\n/* harmony export */ \"deregisterForm\": () => (/* binding */ deregisterForm),\n/* harmony export */ \"registerControl\": () => (/* binding */ registerControl),\n/* harmony export */ \"deregisterControl\": () => (/* binding */ deregisterControl),\n/* harmony export */ \"updateControlValue\": () => (/* binding */ updateControlValue),\n/* harmony export */ \"updateControlTouched\": () => (/* binding */ updateControlTouched)\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} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('forms');\nconst [registerForm, deregisterForm] = createActions('form', {\n register: (formId, persistData) => ({\n formId,\n persistData\n }),\n deregister: formId => ({\n formId\n })\n});\nconst [registerControl, deregisterControl, updateControlValue, updateControlTouched] = createActions('control', {\n register: (formId, name) => ({\n formId,\n name\n }),\n deregister: (formId, name) => ({\n formId,\n name\n }),\n updateValue: (formId, name, value) => ({\n formId,\n name,\n value\n }),\n updateTouched: (formId, name, touched) => ({\n formId,\n name,\n touched\n })\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/actions.js?");
401
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerForm\": () => (/* binding */ registerForm),\n/* harmony export */ \"deregisterForm\": () => (/* binding */ deregisterForm),\n/* harmony export */ \"registerControl\": () => (/* binding */ registerControl),\n/* harmony export */ \"deregisterControl\": () => (/* binding */ deregisterControl),\n/* harmony export */ \"updateControlValue\": () => (/* binding */ updateControlValue),\n/* harmony export */ \"updateControlTouched\": () => (/* binding */ updateControlTouched)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/forms/utils.js\");\n\nconst [registerForm, deregisterForm] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createActions)('form', {\n register: (formId, persistData) => ({\n formId,\n persistData\n }),\n deregister: formId => ({\n formId\n })\n});\nconst [registerControl, deregisterControl, updateControlValue, updateControlTouched] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createActions)('control', {\n register: (formId, name) => ({\n formId,\n name\n }),\n deregister: (formId, name) => ({\n formId,\n name\n }),\n updateValue: (formId, name, value) => ({\n formId,\n name,\n value\n }),\n updateTouched: (formId, name, touched) => ({\n formId,\n name,\n touched\n })\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/actions.js?");
226
402
 
227
403
  /***/ }),
228
404
 
@@ -277,7 +453,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
277
453
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
278
454
 
279
455
  "use strict";
280
- 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_redux_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/redux-helpers */ \"./src/javascripts/lib/redux-helpers/index.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/forms/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\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,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createReducer)('form', {\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}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/reducer.js?");
456
+ 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\");\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\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}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/reducer.js?");
281
457
 
282
458
  /***/ }),
283
459
 
@@ -288,7 +464,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
288
464
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
289
465
 
290
466
  "use strict";
291
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getState\": () => (/* binding */ getState),\n/* harmony export */ \"getFormById\": () => (/* binding */ getFormById),\n/* harmony export */ \"getFormControlsByFormId\": () => (/* binding */ getFormControlsByFormId),\n/* harmony export */ \"getFormValuesByFormId\": () => (/* binding */ getFormValuesByFormId),\n/* harmony export */ \"getControlValueByName\": () => (/* binding */ getControlValueByName),\n/* harmony export */ \"getControlTouchedByName\": () => (/* binding */ getControlTouchedByName)\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 _redux_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../redux/utils */ \"./src/javascripts/domains/redux/utils.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/forms/reducer.js\");\n\n\n\nconst getState = state => state[String(_reducer__WEBPACK_IMPORTED_MODULE_2__[\"default\"])];\nconst getFormById = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getState, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('formId'), (forms, formId) => forms[formId]);\nconst getFormControlsByFormId = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormById, form => (form === null || form === void 0 ? void 0 : form.controls) || {});\nconst getFormValuesByFormId = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormControlsByFormId, controls => {\n const valuesObj = {};\n Object.entries(controls).forEach(([key, {\n value\n }]) => {\n valuesObj[key] = value;\n });\n return valuesObj;\n});\nconst getControlValueByName = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormControlsByFormId, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('name'), (controls, name) => {\n var _controls$name;\n\n return (_controls$name = controls[name]) === null || _controls$name === void 0 ? void 0 : _controls$name.value;\n});\nconst getControlTouchedByName = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormControlsByFormId, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('name'), (controls, name) => {\n var _controls$name2;\n\n return (_controls$name2 = controls[name]) === null || _controls$name2 === void 0 ? void 0 : _controls$name2.touched;\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/selectors.js?");
467
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getState\": () => (/* binding */ getState),\n/* harmony export */ \"getFormById\": () => (/* binding */ getFormById),\n/* harmony export */ \"getFormControlsByFormId\": () => (/* binding */ getFormControlsByFormId),\n/* harmony export */ \"getFormValuesByFormId\": () => (/* binding */ getFormValuesByFormId),\n/* harmony export */ \"getControlValueByName\": () => (/* binding */ getControlValueByName),\n/* harmony export */ \"getControlTouchedByName\": () => (/* binding */ getControlTouchedByName)\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 _redux_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../redux/utils */ \"./src/javascripts/domains/redux/utils.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/forms/utils.js\");\n\n\n\nconst getState = _utils__WEBPACK_IMPORTED_MODULE_2__.selectState;\nconst getFormById = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getState, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('formId'), (forms, formId) => forms[formId]);\nconst getFormControlsByFormId = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormById, form => (form === null || form === void 0 ? void 0 : form.controls) || {});\nconst getFormValuesByFormId = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormControlsByFormId, controls => {\n const valuesObj = {};\n Object.entries(controls).forEach(([key, {\n value\n }]) => {\n valuesObj[key] = value;\n });\n return valuesObj;\n});\nconst getControlValueByName = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormControlsByFormId, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('name'), (controls, name) => {\n var _controls$name;\n\n return (_controls$name = controls[name]) === null || _controls$name === void 0 ? void 0 : _controls$name.value;\n});\nconst getControlTouchedByName = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getFormControlsByFormId, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('name'), (controls, name) => {\n var _controls$name2;\n\n return (_controls$name2 = controls[name]) === null || _controls$name2 === void 0 ? void 0 : _controls$name2.touched;\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/forms/selectors.js?");
292
468
 
293
469
  /***/ }),
294
470
 
@@ -299,7 +475,29 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
299
475
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
300
476
 
301
477
  "use strict";
302
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"validate\": () => (/* binding */ validate)\n/* harmony export */ });\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?");
478
+ 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?");
479
+
480
+ /***/ }),
481
+
482
+ /***/ "./src/javascripts/domains/i18n/actions.js":
483
+ /*!*************************************************!*\
484
+ !*** ./src/javascripts/domains/i18n/actions.js ***!
485
+ \*************************************************/
486
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
487
+
488
+ "use strict";
489
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"setInitialLocale\": () => (/* binding */ setInitialLocale),\n/* harmony export */ \"setLocaleStart\": () => (/* binding */ setLocaleStart),\n/* harmony export */ \"setLocaleResolve\": () => (/* binding */ setLocaleResolve),\n/* harmony export */ \"setLocaleReject\": () => (/* binding */ setLocaleReject),\n/* harmony export */ \"setLocale\": () => (/* binding */ setLocale)\n/* harmony export */ });\n/* harmony import */ var _lib_mutex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/mutex */ \"./src/javascripts/lib/mutex.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/i18n/selectors.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/i18n/utils.js\");\n\n\n\nconst setInitialLocale = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.createAction)('setInitialLocale', locale => ({\n locale\n}));\nconst [setLocaleStart, setLocaleResolve, setLocaleReject] = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.createActions)('setLocale', {\n start: locale => ({\n locale\n }),\n resolve: (locale, translations) => ({\n locale,\n translations\n }),\n reject: (locale, error) => ({\n locale,\n error\n })\n});\nconst mutex = (0,_lib_mutex__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\nconst setLocale = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.createThunk)('setLocale', locale => async (dispatch, getState, {\n api\n}) => {\n await mutex.runExclusively(async () => {\n const currentLocale = (0,_selectors__WEBPACK_IMPORTED_MODULE_1__.selectLocale)(getState());\n\n if (currentLocale === locale) {\n return;\n }\n\n dispatch(setLocaleStart(locale));\n\n try {\n const translations = await api.getTranslations(locale);\n dispatch(setLocaleResolve(locale, translations));\n } catch (error) {\n dispatch(setLocaleReject(locale, error));\n }\n });\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/actions.js?");
490
+
491
+ /***/ }),
492
+
493
+ /***/ "./src/javascripts/domains/i18n/hooks.js":
494
+ /*!***********************************************!*\
495
+ !*** ./src/javascripts/domains/i18n/hooks.js ***!
496
+ \***********************************************/
497
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
498
+
499
+ "use strict";
500
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useI18n\": () => (/* binding */ useI18n)\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 _ultraq_icu_message_formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ultraq/icu-message-formatter */ \"./node_modules/@ultraq/icu-message-formatter/lib/icu-message-formatter.es.js\");\n/* harmony import */ var _redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/i18n/selectors.js\");\n\n\n\n // The passed in locale (en-GB) is only used to call Intl.PluralRules.select() in\n// pluralTypeHandler. Since we only use exact plural matches (=0, =1 etc) we can\n// safely use en-GB all the time.\n\nconst formatter = new _ultraq_icu_message_formatter__WEBPACK_IMPORTED_MODULE_3__.MessageFormatter('en-GB', {\n plural: _ultraq_icu_message_formatter__WEBPACK_IMPORTED_MODULE_3__.pluralTypeHandler,\n select: _ultraq_icu_message_formatter__WEBPACK_IMPORTED_MODULE_3__.selectTypeHandler\n});\nfunction useI18n() {\n const translations = (0,_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_2__.selectTranslations);\n const locale = (0,_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_2__.selectLocale);\n const initialLocale = (0,_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_2__.selectInitialLocale);\n const t = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((key, values = {}) => {\n const translation = translations[key];\n\n if (!translation) {\n return null;\n }\n\n return formatter.format(translation, values);\n }, [translations]);\n return {\n t,\n locale,\n initialLocale\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/hooks.js?");
303
501
 
304
502
  /***/ }),
305
503
 
@@ -310,7 +508,139 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
310
508
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
311
509
 
312
510
  "use strict";
313
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initI18n\": () => (/* binding */ initI18n),\n/* harmony export */ \"Reducer\": () => (/* binding */ Reducer),\n/* harmony export */ \"getState\": () => (/* binding */ getState),\n/* harmony export */ \"getTranslations\": () => (/* binding */ getTranslations),\n/* harmony export */ \"getOverrides\": () => (/* binding */ getOverrides),\n/* harmony export */ \"getCombinedTranslations\": () => (/* binding */ getCombinedTranslations),\n/* harmony export */ \"useI18n\": () => (/* binding */ useI18n)\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 reselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! reselect */ \"./node_modules/reselect/es/index.js\");\n/* harmony import */ var _lib_redux_helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib/redux-helpers */ \"./src/javascripts/lib/redux-helpers/index.js\");\n/* harmony import */ var _redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../ui/utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _translations_en__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../translations/en */ \"./translations/en.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 // Actions\n\nconst {\n createAction\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_2__.createDomain)('i18n');\nconst initI18n = createAction('init', overrides => ({\n overrides\n})); // Reducer\n\nconst defaultState = {\n translations: (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.flattenObject)(_translations_en__WEBPACK_IMPORTED_MODULE_5__[\"default\"]),\n overrides: {}\n};\nconst Reducer = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_2__.createReducer)('i18n', {\n [initI18n]: (state, {\n overrides\n }) => {\n return _objectSpread(_objectSpread({}, state), {}, {\n overrides: overrides ? (0,_ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.flattenObject)(overrides) : undefined\n });\n }\n}, defaultState); // Selectors\n\nconst getState = state => state[String(Reducer)];\nconst getTranslations = (0,reselect__WEBPACK_IMPORTED_MODULE_1__.createSelector)(getState, state => state.translations);\nconst getOverrides = (0,reselect__WEBPACK_IMPORTED_MODULE_1__.createSelector)(getState, state => state.overrides || {});\nconst getCombinedTranslations = (0,reselect__WEBPACK_IMPORTED_MODULE_1__.createSelector)(getTranslations, getOverrides, (translations, overrides) => {\n const overrideKeys = Object.keys(overrides);\n\n if (overrideKeys.length === 0) {\n return translations;\n }\n\n const defaultKeys = Object.keys(translations);\n defaultKeys.forEach(key => {\n if (overrideKeys.indexOf(key) === -1) {\n console.error('Seamly: Missing translation key:', key);\n }\n });\n return _objectSpread(_objectSpread({}, translations), overrides);\n}); // Hooks\n\nfunction useI18n() {\n const translations = (0,_redux__WEBPACK_IMPORTED_MODULE_3__.useSelector)(getCombinedTranslations);\n const t = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((key, values = {}) => {\n const translation = translations[key];\n\n if (typeof translation === 'function') {\n return translation(values);\n } else {\n return translation;\n }\n }, [translations]);\n return {\n t\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/index.js?");
511
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useI18n\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useI18n),\n/* harmony export */ \"Reducer\": () => (/* reexport safe */ _reducer__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"Actions\": () => (/* reexport module object */ _actions__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"Selectors\": () => (/* reexport module object */ _selectors__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/i18n/actions.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/i18n/selectors.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/i18n/hooks.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/i18n/reducer.js\");\n\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/index.js?");
512
+
513
+ /***/ }),
514
+
515
+ /***/ "./src/javascripts/domains/i18n/reducer.js":
516
+ /*!*************************************************!*\
517
+ !*** ./src/javascripts/domains/i18n/reducer.js ***!
518
+ \*************************************************/
519
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
520
+
521
+ "use strict";
522
+ 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 _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/i18n/actions.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/i18n/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\nconst defaultState = {\n translations: {\n 'errors.configError.message': 'We are sorry this happened, please retry at a later time.',\n 'errors.configError.srText': 'A chat configuration error occurred. Our apologies, please retry at a later time.',\n 'errors.configError.title': 'Chat configuration error.',\n 'errors.general.buttonText': 'Restart chat',\n 'errors.general.message': 'Do you want to start a new chat session?',\n 'errors.general.srText': 'Something went wrong with the chat session. You can restart the chat.',\n 'errors.general.title': 'Something went wrong',\n 'errors.seamlyOffline.message': 'There might be a problem with your or our network connection. The chat session should resume as soon the connection is available again.',\n 'errors.seamlyOffline.srText': 'The chat has connection issues. There might be a problem with your or our network connection. The chat session should resume as soon as the connection is available again.',\n 'errors.seamlyOffline.title': 'Connection issues'\n },\n isLoading: false,\n initialLocale: undefined\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.createReducer)({\n [_actions__WEBPACK_IMPORTED_MODULE_0__.setInitialLocale]: (state, {\n locale\n }) => _objectSpread(_objectSpread({}, state), {}, {\n initialLocale: locale\n }),\n [_actions__WEBPACK_IMPORTED_MODULE_0__.setLocaleStart]: state => _objectSpread(_objectSpread({}, state), {}, {\n isLoading: true\n }),\n [_actions__WEBPACK_IMPORTED_MODULE_0__.setLocaleResolve]: (state, {\n locale,\n translations\n }) => {\n return _objectSpread(_objectSpread({}, state), {}, {\n isLoading: false,\n locale,\n translations: Object.keys(translations).sort().reduce((accum, key) => _objectSpread(_objectSpread({}, accum), {}, {\n [key]: translations[key]\n }), {})\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_0__.setLocaleReject]: state => _objectSpread(_objectSpread({}, state), {}, {\n isLoading: false\n })\n}, defaultState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/reducer.js?");
523
+
524
+ /***/ }),
525
+
526
+ /***/ "./src/javascripts/domains/i18n/selectors.js":
527
+ /*!***************************************************!*\
528
+ !*** ./src/javascripts/domains/i18n/selectors.js ***!
529
+ \***************************************************/
530
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
531
+
532
+ "use strict";
533
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectTranslations\": () => (/* binding */ selectTranslations),\n/* harmony export */ \"selectInitialLocale\": () => (/* binding */ selectInitialLocale),\n/* harmony export */ \"selectLocale\": () => (/* binding */ selectLocale),\n/* harmony export */ \"selectState\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_1__.selectState)\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 _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/i18n/utils.js\");\n\n\nconst selectTranslations = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(_utils__WEBPACK_IMPORTED_MODULE_1__.selectState, state => state.translations);\nconst selectInitialLocale = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(_utils__WEBPACK_IMPORTED_MODULE_1__.selectState, state => state.initialLocale);\nconst selectLocale = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(_utils__WEBPACK_IMPORTED_MODULE_1__.selectState, state => state.locale);\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/selectors.js?");
534
+
535
+ /***/ }),
536
+
537
+ /***/ "./src/javascripts/domains/i18n/utils.js":
538
+ /*!***********************************************!*\
539
+ !*** ./src/javascripts/domains/i18n/utils.js ***!
540
+ \***********************************************/
541
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
542
+
543
+ "use strict";
544
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createAction\": () => (/* binding */ createAction),\n/* harmony export */ \"createActions\": () => (/* binding */ createActions),\n/* harmony export */ \"createThunk\": () => (/* binding */ createThunk),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState)\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 createAction,\n createActions,\n createThunk,\n createReducer,\n selectState\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('i18n');\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/i18n/utils.js?");
545
+
546
+ /***/ }),
547
+
548
+ /***/ "./src/javascripts/domains/interrupt/actions.js":
549
+ /*!******************************************************!*\
550
+ !*** ./src/javascripts/domains/interrupt/actions.js ***!
551
+ \******************************************************/
552
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
553
+
554
+ "use strict";
555
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"set\": () => (/* binding */ set),\n/* harmony export */ \"clear\": () => (/* binding */ clear)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/interrupt/utils.js\");\n\nconst set = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createAction)('set', error => ({\n error\n}));\nconst clear = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createAction)('clear');\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/actions.js?");
556
+
557
+ /***/ }),
558
+
559
+ /***/ "./src/javascripts/domains/interrupt/hooks.js":
560
+ /*!****************************************************!*\
561
+ !*** ./src/javascripts/domains/interrupt/hooks.js ***!
562
+ \****************************************************/
563
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
564
+
565
+ "use strict";
566
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useInterrupt\": () => (/* binding */ useInterrupt)\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 _i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/interrupt/selectors.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\nfunction useInterrupt() {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const error = (0,_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(_selectors__WEBPACK_IMPORTED_MODULE_3__.selectError);\n const hasInterrupt = Boolean(error);\n const meta = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n if (!error) return {};\n const {\n langKey,\n action\n } = error;\n const title = t(`${langKey}.title`);\n const message = t(`${langKey}.message`);\n const srText = t(`${langKey}.srText`);\n const buttonText = t(`${langKey}.buttonText`);\n return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, langKey ? {\n title,\n message,\n srText\n } : {}), action ? {\n action\n } : {}), action && langKey ? {\n buttonText\n } : {}), {}, {\n originalError: error\n });\n }, [t, error]);\n return {\n hasInterrupt,\n meta,\n error\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/hooks.js?");
567
+
568
+ /***/ }),
569
+
570
+ /***/ "./src/javascripts/domains/interrupt/index.js":
571
+ /*!****************************************************!*\
572
+ !*** ./src/javascripts/domains/interrupt/index.js ***!
573
+ \****************************************************/
574
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
575
+
576
+ "use strict";
577
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useInterrupt\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useInterrupt),\n/* harmony export */ \"createMiddleware\": () => (/* reexport safe */ _middleware__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"Reducer\": () => (/* reexport safe */ _reducer__WEBPACK_IMPORTED_MODULE_4__[\"default\"]),\n/* harmony export */ \"Actions\": () => (/* reexport module object */ _actions__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"Selectors\": () => (/* reexport module object */ _selectors__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/interrupt/actions.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/interrupt/selectors.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/interrupt/hooks.js\");\n/* harmony import */ var _middleware__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./middleware */ \"./src/javascripts/domains/interrupt/middleware.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/interrupt/reducer.js\");\n\n\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/index.js?");
578
+
579
+ /***/ }),
580
+
581
+ /***/ "./src/javascripts/domains/interrupt/middleware.js":
582
+ /*!*********************************************************!*\
583
+ !*** ./src/javascripts/domains/interrupt/middleware.js ***!
584
+ \*********************************************************/
585
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
586
+
587
+ "use strict";
588
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createMiddleware)\n/* harmony export */ });\n/* harmony import */ var _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../api/errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var _api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../api/errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/interrupt/actions.js\");\n\n\n\n\n\n\nconst handledErrorTypes = [_api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_0__[\"default\"], _api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"], _api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"]];\nfunction createMiddleware() {\n return () => next => action => {\n if (action.type === String(_actions__WEBPACK_IMPORTED_MODULE_5__.set)) {\n if (!handledErrorTypes.some(ErrorType => action.error instanceof ErrorType)) {\n throw action.error;\n }\n }\n\n return next(action);\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/middleware.js?");
589
+
590
+ /***/ }),
591
+
592
+ /***/ "./src/javascripts/domains/interrupt/reducer.js":
593
+ /*!******************************************************!*\
594
+ !*** ./src/javascripts/domains/interrupt/reducer.js ***!
595
+ \******************************************************/
596
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
597
+
598
+ "use strict";
599
+ 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/interrupt/utils.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/interrupt/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\nconst initialState = {\n error: undefined\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.createReducer)({\n [_actions__WEBPACK_IMPORTED_MODULE_1__.set]: (state, {\n error\n }) => {\n return _objectSpread(_objectSpread({}, state), {}, {\n error\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_1__.clear]: () => {\n return initialState;\n }\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/reducer.js?");
600
+
601
+ /***/ }),
602
+
603
+ /***/ "./src/javascripts/domains/interrupt/selectors.js":
604
+ /*!********************************************************!*\
605
+ !*** ./src/javascripts/domains/interrupt/selectors.js ***!
606
+ \********************************************************/
607
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
608
+
609
+ "use strict";
610
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectError\": () => (/* binding */ selectError),\n/* harmony export */ \"selectState\": () => (/* reexport safe */ _utils__WEBPACK_IMPORTED_MODULE_1__.selectState)\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 _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/interrupt/utils.js\");\n\n\nconst selectError = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(_utils__WEBPACK_IMPORTED_MODULE_1__.selectState, ({\n error\n}) => error);\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/selectors.js?");
611
+
612
+ /***/ }),
613
+
614
+ /***/ "./src/javascripts/domains/interrupt/utils.js":
615
+ /*!****************************************************!*\
616
+ !*** ./src/javascripts/domains/interrupt/utils.js ***!
617
+ \****************************************************/
618
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
619
+
620
+ "use strict";
621
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createAction\": () => (/* binding */ createAction),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"selectState\": () => (/* binding */ selectState)\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 createAction,\n createReducer,\n selectState\n} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('interrupt');\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/interrupt/utils.js?");
622
+
623
+ /***/ }),
624
+
625
+ /***/ "./src/javascripts/domains/options/index.js":
626
+ /*!**************************************************!*\
627
+ !*** ./src/javascripts/domains/options/index.js ***!
628
+ \**************************************************/
629
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
630
+
631
+ "use strict";
632
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createMiddleware\": () => (/* reexport safe */ _middleware__WEBPACK_IMPORTED_MODULE_0__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _middleware__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./middleware */ \"./src/javascripts/domains/options/middleware.js\");\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/options/index.js?");
633
+
634
+ /***/ }),
635
+
636
+ /***/ "./src/javascripts/domains/options/middleware.js":
637
+ /*!*******************************************************!*\
638
+ !*** ./src/javascripts/domains/options/middleware.js ***!
639
+ \*******************************************************/
640
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
641
+
642
+ "use strict";
643
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createMiddleware)\n/* harmony export */ });\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.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\nfunction createMiddleware({\n api\n}) {\n return ({\n dispatch\n }) => next => action => {\n const result = next(action);\n\n switch (action.type) {\n // This is needed for backwards compatibility. If there's an error,\n // Cobrowsing has to be disabled in order to not \"re-start\" into co-browsing\n case String(_interrupt__WEBPACK_IMPORTED_MODULE_1__.Actions.set):\n if (!(action.error instanceof _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_2__[\"default\"])) {\n dispatch({\n type: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__.seamlyActions.SET_USER_SELECTED_OPTION,\n option: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__.featureKeys.cobrowsing,\n value: false\n });\n }\n\n break;\n\n case _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__.seamlyActions.SET_USER_SELECTED_OPTIONS:\n api.store.set('options', action.options);\n break;\n\n case _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_0__.seamlyActions.SET_USER_SELECTED_OPTION:\n api.store.set('options', _objectSpread(_objectSpread({}, api.store.get('options') || {}), {}, {\n [action.option]: action.value\n }));\n break;\n }\n\n return result;\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/options/middleware.js?");
314
644
 
315
645
  /***/ }),
316
646
 
@@ -332,7 +662,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
332
662
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
333
663
 
334
664
  "use strict";
335
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createReduxStore)\n/* harmony export */ });\n/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux */ \"./node_modules/redux/es/redux.js\");\n\nlet enhancer;\n\nif (true) {\n var _window$__REDUX_DEVTO, _window;\n\n /* eslint-disable no-underscore-dangle */\n enhancer = typeof window !== 'undefined' && ((_window$__REDUX_DEVTO = (_window = window).__REDUX_DEVTOOLS_EXTENSION__) === null || _window$__REDUX_DEVTO === void 0 ? void 0 : _window$__REDUX_DEVTO.call(_window));\n /* eslint-enable no-underscore-dangle */\n}\n\nfunction createReduxStore(reducers = {}, initialState = {}) {\n return (0,redux__WEBPACK_IMPORTED_MODULE_0__.createStore)((0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)(reducers), initialState, enhancer);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/create-redux-store.js?");
665
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createReduxStore)\n/* harmony export */ });\n/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux */ \"./node_modules/redux/es/redux.js\");\n\nlet composeEnhancers = redux__WEBPACK_IMPORTED_MODULE_0__.compose;\n\nif (true) {\n /* eslint-disable no-underscore-dangle */\n composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || composeEnhancers;\n /* eslint-enable no-underscore-dangle */\n}\n\nfunction createReduxStore({\n reducers = {},\n initialState = {},\n middlewares = []\n} = {}) {\n return (0,redux__WEBPACK_IMPORTED_MODULE_0__.createStore)((0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)(reducers), initialState, composeEnhancers((0,redux__WEBPACK_IMPORTED_MODULE_0__.applyMiddleware)(...middlewares)));\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/create-redux-store.js?");
336
666
 
337
667
  /***/ }),
338
668
 
@@ -343,7 +673,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
343
673
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
344
674
 
345
675
  "use strict";
346
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useStoreContext\": () => (/* binding */ useStoreContext),\n/* harmony export */ \"useStoreDispatch\": () => (/* binding */ useStoreDispatch),\n/* harmony export */ \"useSelector\": () => (/* binding */ useSelector),\n/* harmony export */ \"useSelectorWithProps\": () => (/* binding */ useSelectorWithProps)\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 _context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context */ \"./src/javascripts/domains/redux/context.js\");\n\n // import { arrayContentEquals } from './utils'\n\nfunction useStoreContext() {\n return (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n}\nfunction useStoreDispatch() {\n return useStoreContext().dispatch;\n}\nfunction useSelector(selector, deps = []) {\n const store = useStoreContext(); // we need a force-update because we're manually updating a ref instead of a useState\n\n const [, forceUpdate] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useReducer)(x => x + 1, 0); // we're keeping the value to compare against\n\n const valueRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(); // instead of accepting a stabilized selector, we stick to the signature\n // of useCallback, as that makes the exposed api much more dev-friendly\n // otherwise you'd have to stabilize selectors externally\n\n const selectorCb = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(selector, deps); // we're keeping the selector in a ref to compare against\n // we need this both in the store subscription and for\n // synchronous state updates if the selector changes, but the store didn't\n // if the selector changes, we want to synchronously select the new information\n // otherwise, the rendered component does not accurately and predictably reflect\n // the selector+state\n // in order to keep multiple selectors in sync, we also re-calculate when\n // the state has changed but the selector hasn't re-calculated async.\n // selectors *might* be heavy, which could kill FPS, but the alternative is\n // stale data\n\n const selectorRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const stateRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const state = store.getState();\n\n if (selectorRef.current !== selectorCb || stateRef.current !== state) {\n stateRef.current = state;\n valueRef.current = selectorCb(stateRef.current);\n selectorRef.current = selectorCb;\n }\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n // we subscribe to the store changes\n return store.subscribe(() => {\n var _selectorRef$current;\n\n const newState = store.getState(); // prevent recalculating if the state hasn't changed\n // if the selector changed, it was already handled synchronously\n\n if (newState === stateRef.current) {\n return;\n } // calculate the new value based on selector+state\n\n\n const newValue = (_selectorRef$current = selectorRef.current) === null || _selectorRef$current === void 0 ? void 0 : _selectorRef$current.call(selectorRef, store.getState()); // only if the value changed we update. this saves heaps of re-rendering\n\n if (newValue !== valueRef.current) {\n valueRef.current = newValue;\n forceUpdate();\n }\n });\n }, [store]);\n return valueRef.current;\n}\nconst useSelectorWithProps = function useSelectorWithProps(selector, props, inputs = [] // equalityFn = arrayContentEquals,\n) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const wrappedMapper = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(state => selector(state, props), inputs);\n return useSelector(wrappedMapper, inputs);\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/hooks.js?");
676
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useStoreContext\": () => (/* binding */ useStoreContext),\n/* harmony export */ \"useStoreDispatch\": () => (/* binding */ useStoreDispatch),\n/* harmony export */ \"useSelector\": () => (/* binding */ useSelector),\n/* harmony export */ \"useSelectorWithProps\": () => (/* binding */ useSelectorWithProps)\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 _context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context */ \"./src/javascripts/domains/redux/context.js\");\n\n // import { arrayContentEquals } from './utils'\n\nfunction useStoreContext() {\n return (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n}\nfunction useStoreDispatch() {\n return useStoreContext().dispatch;\n}\nfunction useSelector(selector, deps = []) {\n const store = useStoreContext(); // we need a force-update because we're manually updating a ref instead of a useState\n\n const [, forceUpdate] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useReducer)(x => x + 1, 0); // we're keeping the value to compare against\n\n const valueRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(); // instead of accepting a stabilized selector, we stick to the signature\n // of useCallback, as that makes the exposed api much more dev-friendly\n // otherwise you'd have to stabilize selectors externally\n // eslint-disable-next-line react-hooks/exhaustive-deps\n\n const selectorCb = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(selector, deps); // we're keeping the selector in a ref to compare against\n // we need this both in the store subscription and for\n // synchronous state updates if the selector changes, but the store didn't\n // if the selector changes, we want to synchronously select the new information\n // otherwise, the rendered component does not accurately and predictably reflect\n // the selector+state\n // in order to keep multiple selectors in sync, we also re-calculate when\n // the state has changed but the selector hasn't re-calculated async.\n // selectors *might* be heavy, which could kill FPS, but the alternative is\n // stale data\n\n const selectorRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const stateRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const state = store.getState();\n\n if (selectorRef.current !== selectorCb || stateRef.current !== state) {\n stateRef.current = state;\n valueRef.current = selectorCb(stateRef.current);\n selectorRef.current = selectorCb;\n }\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n // we subscribe to the store changes\n return store.subscribe(() => {\n var _selectorRef$current;\n\n const newState = store.getState(); // prevent recalculating if the state hasn't changed\n // if the selector changed, it was already handled synchronously\n\n if (newState === stateRef.current) {\n return;\n } // calculate the new value based on selector+state\n\n\n const newValue = (_selectorRef$current = selectorRef.current) === null || _selectorRef$current === void 0 ? void 0 : _selectorRef$current.call(selectorRef, store.getState()); // only if the value changed we update. this saves heaps of re-rendering\n\n if (newValue !== valueRef.current) {\n valueRef.current = newValue;\n forceUpdate();\n }\n });\n }, [store]);\n return valueRef.current;\n}\nconst useSelectorWithProps = function useSelectorWithProps(selector, props, inputs = [] // equalityFn = arrayContentEquals,\n) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const wrappedMapper = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(state => selector(state, props), inputs);\n return useSelector(wrappedMapper, inputs);\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/hooks.js?");
347
677
 
348
678
  /***/ }),
349
679
 
@@ -354,7 +684,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
354
684
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
355
685
 
356
686
  "use strict";
357
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createReduxStore\": () => (/* reexport safe */ _create_redux_store__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ \"useSelector\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useSelector),\n/* harmony export */ \"useSelectorWithProps\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useSelectorWithProps),\n/* harmony export */ \"useStoreDispatch\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useStoreDispatch),\n/* harmony export */ \"useStoreContext\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useStoreContext),\n/* harmony export */ \"StoreContext\": () => (/* reexport safe */ _context__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ \"StoreProvider\": () => (/* reexport safe */ _context__WEBPACK_IMPORTED_MODULE_0__.Provider)\n/* harmony export */ });\n/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./context */ \"./src/javascripts/domains/redux/context.js\");\n/* harmony import */ var _create_redux_store__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./create-redux-store */ \"./src/javascripts/domains/redux/create-redux-store.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/redux/hooks.js\");\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/index.js?");
687
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createReduxStore\": () => (/* reexport safe */ _create_redux_store__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ \"useSelector\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_3__.useSelector),\n/* harmony export */ \"useSelectorWithProps\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_3__.useSelectorWithProps),\n/* harmony export */ \"useStoreDispatch\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_3__.useStoreDispatch),\n/* harmony export */ \"useStoreContext\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_3__.useStoreContext),\n/* harmony export */ \"StoreContext\": () => (/* reexport safe */ _context__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ \"StoreProvider\": () => (/* reexport safe */ _provider__WEBPACK_IMPORTED_MODULE_1__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./context */ \"./src/javascripts/domains/redux/context.js\");\n/* harmony import */ var _provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./provider */ \"./src/javascripts/domains/redux/provider.js\");\n/* harmony import */ var _create_redux_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./create-redux-store */ \"./src/javascripts/domains/redux/create-redux-store.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/redux/hooks.js\");\n\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/index.js?");
688
+
689
+ /***/ }),
690
+
691
+ /***/ "./src/javascripts/domains/redux/provider.js":
692
+ /*!***************************************************!*\
693
+ !*** ./src/javascripts/domains/redux/provider.js ***!
694
+ \***************************************************/
695
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
696
+
697
+ "use strict";
698
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ StoreProvider)\n/* harmony export */ });\n/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./context */ \"./src/javascripts/domains/redux/context.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__);\n\n\nfunction StoreProvider({\n store,\n children\n}) {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)(_context__WEBPACK_IMPORTED_MODULE_0__.Provider, {\n value: store,\n children: children\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/redux/provider.js?");
358
699
 
359
700
  /***/ }),
360
701
 
@@ -369,6 +710,28 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
369
710
 
370
711
  /***/ }),
371
712
 
713
+ /***/ "./src/javascripts/domains/store/index.js":
714
+ /*!************************************************!*\
715
+ !*** ./src/javascripts/domains/store/index.js ***!
716
+ \************************************************/
717
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
718
+
719
+ "use strict";
720
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createStore\": () => (/* binding */ createStore)\n/* harmony export */ });\n/* harmony import */ var redux_thunk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux-thunk */ \"./node_modules/redux-thunk/es/index.js\");\n/* harmony import */ var _redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _translations__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _options__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../options */ \"./src/javascripts/domains/options/index.js\");\n/* harmony import */ var _state_reducer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./state-reducer */ \"./src/javascripts/domains/store/state-reducer.js\");\n\n\n\n\n\n\n\n\n\n\nfunction createStore({\n initialState,\n api\n} = {}) {\n const store = (0,_redux__WEBPACK_IMPORTED_MODULE_1__.createReduxStore)({\n reducers: {\n state: _state_reducer__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n [String(_app__WEBPACK_IMPORTED_MODULE_2__.Reducer)]: _app__WEBPACK_IMPORTED_MODULE_2__.Reducer,\n [String(_config__WEBPACK_IMPORTED_MODULE_3__.Reducer)]: _config__WEBPACK_IMPORTED_MODULE_3__.Reducer,\n [String(_forms__WEBPACK_IMPORTED_MODULE_4__.Reducer)]: _forms__WEBPACK_IMPORTED_MODULE_4__.Reducer,\n [String(_translations__WEBPACK_IMPORTED_MODULE_5__.Reducer)]: _translations__WEBPACK_IMPORTED_MODULE_5__.Reducer,\n [String(_i18n__WEBPACK_IMPORTED_MODULE_6__.Reducer)]: _i18n__WEBPACK_IMPORTED_MODULE_6__.Reducer,\n [String(_interrupt__WEBPACK_IMPORTED_MODULE_7__.Reducer)]: _interrupt__WEBPACK_IMPORTED_MODULE_7__.Reducer\n },\n initialState,\n middlewares: [redux_thunk__WEBPACK_IMPORTED_MODULE_0__[\"default\"].withExtraArgument({\n api\n }), (0,_config__WEBPACK_IMPORTED_MODULE_3__.createMiddleware)(), (0,_interrupt__WEBPACK_IMPORTED_MODULE_7__.createMiddleware)(), (0,_options__WEBPACK_IMPORTED_MODULE_8__.createMiddleware)({\n api\n }), (0,_translations__WEBPACK_IMPORTED_MODULE_5__.createMiddleware)()]\n });\n return store;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/index.js?");
721
+
722
+ /***/ }),
723
+
724
+ /***/ "./src/javascripts/domains/store/state-reducer.js":
725
+ /*!********************************************************!*\
726
+ !*** ./src/javascripts/domains/store/state-reducer.js ***!
727
+ \********************************************************/
728
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
729
+
730
+ "use strict";
731
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ stateReducer)\n/* harmony export */ });\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n// Legacy state reducer. Do not add new features here but extract/create new reducers as needed\n\n\nconst initialState = {\n events: [],\n initialState: {},\n unreadEvents: 0,\n isLoading: false,\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false\n },\n resumeConversationPrompt: false,\n visible: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.visibilityStates.hidden,\n serviceInfo: {\n activeServiceSessionId: ''\n },\n participantInfo: {\n participants: {},\n currentAgent: ''\n },\n headerTitles: {\n title: null,\n subTitle: ''\n },\n historyLoaded: false,\n skiplinkTargetId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n optionsButtonId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n cobrowsingContainerId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n headerCollapseButtonId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n serviceData: {},\n options: {\n features: {},\n panelActive: false,\n optionActive: '',\n userSelectedOptions: {}\n },\n showFileUpload: false,\n currentUploads: [],\n entryMeta: {\n default: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n active: _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {}\n },\n seamlyContainerElement: null\n};\nfunction stateReducer(state = initialState, action) {\n return (0,_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyStateReducer)(state, action);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/store/state-reducer.js?");
732
+
733
+ /***/ }),
734
+
372
735
  /***/ "./src/javascripts/domains/translations/actions.js":
373
736
  /*!*********************************************************!*\
374
737
  !*** ./src/javascripts/domains/translations/actions.js ***!
@@ -376,7 +739,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
376
739
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
377
740
 
378
741
  "use strict";
379
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"enable\": () => (/* binding */ enable),\n/* harmony export */ \"disable\": () => (/* binding */ disable),\n/* harmony export */ \"enableEvent\": () => (/* binding */ enableEvent),\n/* harmony export */ \"disableEvent\": () => (/* binding */ disableEvent)\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} = (0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createDomain)('translations');\nconst [enable, disable] = createActions('translate', {\n enable: locale => ({\n locale\n }),\n disable: () => ({})\n});\nconst [enableEvent, disableEvent] = createActions('event', {\n enable: payloadId => ({\n payloadId\n }),\n disable: payloadId => ({\n payloadId\n })\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/actions.js?");
742
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"enable\": () => (/* binding */ enable),\n/* harmony export */ \"disable\": () => (/* binding */ disable),\n/* harmony export */ \"enableEvent\": () => (/* binding */ enableEvent),\n/* harmony export */ \"disableEvent\": () => (/* binding */ disableEvent)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/translations/utils.js\");\n\nconst [enable, disable] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createActions)('translate', {\n enable: locale => ({\n locale\n }),\n disable: () => ({})\n});\nconst [enableEvent, disableEvent] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createActions)('event', {\n enable: payloadId => ({\n payloadId\n }),\n disable: payloadId => ({\n payloadId\n })\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/actions.js?");
380
743
 
381
744
  /***/ }),
382
745
 
@@ -387,7 +750,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
387
750
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
388
751
 
389
752
  "use strict";
390
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TranslationsChatStatus)\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 _ui_components_chat_status__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../ui/components/chat-status */ \"./src/javascripts/ui/components/chat-status/index.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../hooks */ \"./src/javascripts/domains/translations/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\nfunction TranslationsChatStatus() {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n id\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslationsContainer)();\n const {\n hasInterrupt\n } = (0,_ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyInterrupt)();\n const {\n isActive,\n disableTranslations,\n languages,\n currentLocale\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n const focusSkiplinkTarget = (0,_ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplinkTargetFocusing)();\n const languageName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n var _languages$find;\n\n return languages === null || languages === void 0 ? void 0 : (_languages$find = languages.find(lang => lang.locale === currentLocale)) === null || _languages$find === void 0 ? void 0 : _languages$find.nativeName;\n }, [languages, currentLocale]);\n const handleClickStop = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n disableTranslations();\n focusSkiplinkTarget();\n }, [disableTranslations, focusSkiplinkTarget]);\n\n if (!isActive || hasInterrupt) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_ui_components_chat_status__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n type: \"translations\",\n id: id,\n label: t('translations.status.label', languageName),\n onButtonClick: handleClickStop,\n buttonText: t('translations.status.stopText'),\n srButtonText: t('translations.status.srStopText')\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/components/chat-status.js?");
753
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TranslationsChatStatus)\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 _ui_components_chat_status__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../ui/components/chat-status */ \"./src/javascripts/ui/components/chat-status/index.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../hooks */ \"./src/javascripts/domains/translations/hooks.js\");\n/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../interrupt */ \"./src/javascripts/domains/interrupt/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\nfunction TranslationsChatStatus() {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n id\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslationsContainer)();\n const {\n hasInterrupt\n } = (0,_interrupt__WEBPACK_IMPORTED_MODULE_5__.useInterrupt)();\n const {\n isActive,\n disableTranslations,\n languages,\n currentLocale\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n const focusSkiplinkTarget = (0,_ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSkiplinkTargetFocusing)();\n const languageName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n var _languages$find;\n\n return languages === null || languages === void 0 ? void 0 : (_languages$find = languages.find(lang => lang.locale === currentLocale)) === null || _languages$find === void 0 ? void 0 : _languages$find.nativeName;\n }, [languages, currentLocale]);\n const handleClickStop = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n disableTranslations();\n focusSkiplinkTarget();\n }, [disableTranslations, focusSkiplinkTarget]);\n\n if (!isActive || hasInterrupt) {\n return null;\n }\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_ui_components_chat_status__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n type: \"translations\",\n id: id,\n label: t('translations.status.label', {\n language: languageName\n }),\n onButtonClick: handleClickStop,\n buttonText: t('translations.status.stopText'),\n srButtonText: t('translations.status.srStopText')\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/components/chat-status.js?");
391
754
 
392
755
  /***/ }),
393
756
 
@@ -409,7 +772,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
409
772
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
410
773
 
411
774
  "use strict";
412
- 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 _ui_components_form_controls_form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../ui/components/form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks */ \"./src/javascripts/domains/translations/hooks.js\");\n/* harmony import */ var _ui_components_form_controls_select__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../ui/components/form-controls/select */ \"./src/javascripts/ui/components/form-controls/select.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\n\nfunction TranslationsOptionsDialogForm({\n controlName,\n descriptionId\n}) {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n isActive,\n languages,\n currentLocale\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n const languageName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n var _languages$find;\n\n return languages === null || languages === void 0 ? void 0 : (_languages$find = languages.find(lang => lang.locale === currentLocale)) === null || _languages$find === void 0 ? void 0 : _languages$find.nativeName;\n }, [languages, currentLocale]);\n const options = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return [{\n value: '',\n label: t('translations.settings.defaultOptionLabel')\n }, ...languages.map(language => ({\n value: language.locale,\n label: language.nativeName\n }))];\n }, [t, languages]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_ui_components_form_controls_form__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n noValidate: \"true\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__description'),\n id: descriptionId,\n children: t('translations.settings.description')\n }), isActive ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"h3\", {\n children: t('translations.settings.currentTranslationLabel')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__active-language'),\n children: languageName\n })]\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_ui_components_form_controls_select__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: controlName,\n type: \"text\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('input__select'),\n \"aria-describedby\": descriptionId,\n labelClass: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('label'),\n labelText: t('translations.settings.inputLabel'),\n options: options,\n defaultValue: currentLocale || ''\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__actions'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"submit\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button', 'button--primary', 'options__submit'),\n children: isActive ? t('translations.settings.endButtonText') : t('translations.settings.startButtonText')\n })\n })]\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TranslationsOptionsDialogForm);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/components/options-dialog/form.js?");
775
+ 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 _ui_components_form_controls_form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../ui/components/form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks */ \"./src/javascripts/domains/translations/hooks.js\");\n/* harmony import */ var _ui_components_form_controls_select__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../ui/components/form-controls/select */ \"./src/javascripts/ui/components/form-controls/select.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\n\nfunction TranslationsOptionsDialogForm({\n controlName,\n descriptionId\n}) {\n const {\n t\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n isActive,\n languages,\n currentLocale\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n const {\n locale: uiLocale\n } = (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const languageName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n var _languages$find;\n\n return languages === null || languages === void 0 ? void 0 : (_languages$find = languages.find(lang => lang.locale === currentLocale)) === null || _languages$find === void 0 ? void 0 : _languages$find.nativeName;\n }, [languages, currentLocale]);\n const options = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return [{\n value: '',\n label: t('translations.settings.defaultOptionLabel')\n }, ...languages.filter(language => language.locale.toLowerCase() !== String(uiLocale).toLowerCase()).map(language => ({\n value: language.locale,\n label: language.nativeName\n }))];\n }, [t, languages, uiLocale]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(_ui_components_form_controls_form__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n noValidate: \"true\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__description'),\n id: descriptionId,\n children: t('translations.settings.description')\n }), isActive ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"h3\", {\n children: t('translations.settings.currentTranslationLabel')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__active-language'),\n children: languageName\n })]\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_ui_components_form_controls_select__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: controlName,\n type: \"text\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('input__select'),\n \"aria-describedby\": descriptionId,\n labelClass: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('label'),\n labelText: t('translations.settings.inputLabel'),\n options: options,\n defaultValue: currentLocale || ''\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('options__actions'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"submit\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('button', 'button--primary', 'options__submit'),\n children: isActive ? t('translations.settings.endButtonText') : t('translations.settings.startButtonText')\n })\n })]\n });\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TranslationsOptionsDialogForm);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/components/options-dialog/form.js?");
413
776
 
414
777
  /***/ }),
415
778
 
@@ -442,7 +805,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
442
805
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
443
806
 
444
807
  "use strict";
445
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useTranslatedEventData\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData),\n/* harmony export */ \"useTranslations\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslations),\n/* harmony export */ \"useTranslationsContainer\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslationsContainer),\n/* harmony export */ \"Reducer\": () => (/* reexport safe */ _reducer__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"OptionsButton\": () => (/* reexport safe */ _components_options_button__WEBPACK_IMPORTED_MODULE_4__[\"default\"]),\n/* harmony export */ \"ChatStatus\": () => (/* reexport safe */ _components_chat_status__WEBPACK_IMPORTED_MODULE_5__[\"default\"]),\n/* harmony export */ \"Actions\": () => (/* reexport module object */ _actions__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"Selectors\": () => (/* reexport module object */ _selectors__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/translations/actions.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/translations/selectors.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/translations/hooks.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/translations/reducer.js\");\n/* harmony import */ var _components_options_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/options-button */ \"./src/javascripts/domains/translations/components/options-button.js\");\n/* harmony import */ var _components_chat_status__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/chat-status */ \"./src/javascripts/domains/translations/components/chat-status.js\");\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/index.js?");
808
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useTranslatedEventData\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslatedEventData),\n/* harmony export */ \"useTranslations\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslations),\n/* harmony export */ \"useTranslationsContainer\": () => (/* reexport safe */ _hooks__WEBPACK_IMPORTED_MODULE_2__.useTranslationsContainer),\n/* harmony export */ \"createMiddleware\": () => (/* reexport safe */ _middleware__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"Reducer\": () => (/* reexport safe */ _reducer__WEBPACK_IMPORTED_MODULE_4__[\"default\"]),\n/* harmony export */ \"OptionsButton\": () => (/* reexport safe */ _components_options_button__WEBPACK_IMPORTED_MODULE_5__[\"default\"]),\n/* harmony export */ \"ChatStatus\": () => (/* reexport safe */ _components_chat_status__WEBPACK_IMPORTED_MODULE_6__[\"default\"]),\n/* harmony export */ \"Actions\": () => (/* reexport module object */ _actions__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"Selectors\": () => (/* reexport module object */ _selectors__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/translations/actions.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectors */ \"./src/javascripts/domains/translations/selectors.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/domains/translations/hooks.js\");\n/* harmony import */ var _middleware__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./middleware */ \"./src/javascripts/domains/translations/middleware.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/translations/reducer.js\");\n/* harmony import */ var _components_options_button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/options-button */ \"./src/javascripts/domains/translations/components/options-button.js\");\n/* harmony import */ var _components_chat_status__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/chat-status */ \"./src/javascripts/domains/translations/components/chat-status.js\");\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/index.js?");
809
+
810
+ /***/ }),
811
+
812
+ /***/ "./src/javascripts/domains/translations/middleware.js":
813
+ /*!************************************************************!*\
814
+ !*** ./src/javascripts/domains/translations/middleware.js ***!
815
+ \************************************************************/
816
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
817
+
818
+ "use strict";
819
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createMiddleware)\n/* harmony export */ });\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/translations/actions.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../i18n */ \"./src/javascripts/domains/i18n/index.js\");\n\n\n\nfunction createMiddleware() {\n return ({\n dispatch,\n getState\n }) => next => action => {\n var _action$history, _action$history$trans, _action$initialState, _action$initialState$, _action$event, _action$event$payload, _action$event$payload2;\n\n const result = next(action);\n\n switch (action.type) {\n case String(_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.SET_HISTORY):\n if ((_action$history = action.history) !== null && _action$history !== void 0 && (_action$history$trans = _action$history.translation) !== null && _action$history$trans !== void 0 && _action$history$trans.enabled) {\n dispatch(_actions__WEBPACK_IMPORTED_MODULE_0__.enable(action.history.translation.locale));\n }\n\n break;\n\n case String(_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.SET_INITIAL_STATE):\n if ((_action$initialState = action.initialState) !== null && _action$initialState !== void 0 && (_action$initialState$ = _action$initialState.translation) !== null && _action$initialState$ !== void 0 && _action$initialState$.enabled) {\n dispatch(_actions__WEBPACK_IMPORTED_MODULE_0__.enable(action.initialState.translation.locale));\n dispatch(_i18n__WEBPACK_IMPORTED_MODULE_2__.Actions.setLocale(action.locale));\n }\n\n break;\n\n case String(_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.ADD_EVENT):\n if (action.event.type === 'info' && ((_action$event = action.event) === null || _action$event === void 0 ? void 0 : (_action$event$payload = _action$event.payload) === null || _action$event$payload === void 0 ? void 0 : (_action$event$payload2 = _action$event$payload.body) === null || _action$event$payload2 === void 0 ? void 0 : _action$event$payload2.subtype) === 'new_translation' && action.event.payload.body.translationEnabled) {\n dispatch(_i18n__WEBPACK_IMPORTED_MODULE_2__.Actions.setLocale(action.event.payload.body.translationLocale));\n }\n\n break;\n\n case String(_actions__WEBPACK_IMPORTED_MODULE_0__.disable):\n const initialLocale = _i18n__WEBPACK_IMPORTED_MODULE_2__.Selectors.selectInitialLocale(getState());\n dispatch(_i18n__WEBPACK_IMPORTED_MODULE_2__.Actions.setLocale(initialLocale));\n break;\n }\n\n return result;\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/middleware.js?");
446
820
 
447
821
  /***/ }),
448
822
 
@@ -453,7 +827,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
453
827
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
454
828
 
455
829
  "use strict";
456
- 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_redux_helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/redux-helpers */ \"./src/javascripts/lib/redux-helpers/index.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/translations/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\n\nconst initialState = {\n isActive: false,\n currentLocale: undefined,\n isAvailable: false,\n languages: [],\n originalPayloadIds: [],\n containerId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_2__.randomId)()\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_lib_redux_helpers__WEBPACK_IMPORTED_MODULE_0__.createReducer)('translations', {\n [_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.SET_FEATURES]: (state, action) => {\n var _action$features;\n\n const feature = action === null || action === void 0 ? void 0 : (_action$features = action.features) === null || _action$features === void 0 ? void 0 : _action$features.translation;\n\n if (!feature) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n isAvailable: feature.enabled === true,\n languages: feature.languages || []\n });\n },\n [_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.SET_HISTORY]: (state, {\n history\n }) => {\n var _history$translation, _history$translation2;\n\n return _objectSpread(_objectSpread({}, state), {}, {\n isActive: history === null || history === void 0 ? void 0 : (_history$translation = history.translation) === null || _history$translation === void 0 ? void 0 : _history$translation.enabled,\n currentLocale: history === null || history === void 0 ? void 0 : (_history$translation2 = history.translation) === null || _history$translation2 === void 0 ? void 0 : _history$translation2.locale\n });\n },\n [_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.CLEAR_FEATURES]: () => initialState,\n [_actions__WEBPACK_IMPORTED_MODULE_3__.enable]: (state, {\n locale\n }) => {\n return _objectSpread(_objectSpread({}, state), {}, {\n isActive: true,\n currentLocale: locale\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_3__.disable]: state => {\n return _objectSpread(_objectSpread({}, state), {}, {\n isActive: false,\n currentLocale: undefined\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_3__.enableEvent]: (state, {\n payloadId\n }) => {\n if (!state.originalPayloadIds.includes(payloadId)) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n originalPayloadIds: state.originalPayloadIds.filter(id => id !== payloadId)\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_3__.disableEvent]: (state, {\n payloadId\n }) => {\n if (state.originalPayloadIds.includes(payloadId)) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n originalPayloadIds: [...state.originalPayloadIds, payloadId]\n });\n }\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/reducer.js?");
830
+ 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/translations/utils.js\");\n/* harmony import */ var _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actions */ \"./src/javascripts/domains/translations/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\n\nconst initialState = {\n isActive: false,\n currentLocale: undefined,\n isAvailable: false,\n languages: [],\n originalPayloadIds: [],\n containerId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_2__.randomId)()\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.createReducer)({\n [_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.SET_FEATURES]: (state, action) => {\n var _action$features;\n\n const feature = action === null || action === void 0 ? void 0 : (_action$features = action.features) === null || _action$features === void 0 ? void 0 : _action$features.translation;\n\n if (!feature) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n isAvailable: feature.enabled === true,\n languages: feature.languages || []\n });\n },\n [_ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions.CLEAR_FEATURES]: () => initialState,\n [_actions__WEBPACK_IMPORTED_MODULE_3__.enable]: (state, {\n locale\n }) => {\n return _objectSpread(_objectSpread({}, state), {}, {\n isActive: true,\n currentLocale: locale\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_3__.disable]: state => {\n return _objectSpread(_objectSpread({}, state), {}, {\n isActive: false,\n currentLocale: undefined\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_3__.enableEvent]: (state, {\n payloadId\n }) => {\n if (!state.originalPayloadIds.includes(payloadId)) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n originalPayloadIds: state.originalPayloadIds.filter(id => id !== payloadId)\n });\n },\n [_actions__WEBPACK_IMPORTED_MODULE_3__.disableEvent]: (state, {\n payloadId\n }) => {\n if (state.originalPayloadIds.includes(payloadId)) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n originalPayloadIds: [...state.originalPayloadIds, payloadId]\n });\n }\n}, initialState));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/reducer.js?");
457
831
 
458
832
  /***/ }),
459
833
 
@@ -464,7 +838,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
464
838
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
465
839
 
466
840
  "use strict";
467
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getState\": () => (/* binding */ getState),\n/* harmony export */ \"getOriginalPayloadIds\": () => (/* binding */ getOriginalPayloadIds),\n/* harmony export */ \"getIsPayloadTranslated\": () => (/* binding */ getIsPayloadTranslated)\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 _redux_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../redux/utils */ \"./src/javascripts/domains/redux/utils.js\");\n/* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reducer */ \"./src/javascripts/domains/translations/reducer.js\");\n\n\n\nconst getState = state => state[String(_reducer__WEBPACK_IMPORTED_MODULE_2__[\"default\"])];\nconst getOriginalPayloadIds = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getState, state => state.originalPayloadIds);\nconst getIsPayloadTranslated = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getOriginalPayloadIds, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('payloadId'), (payloadIds, payloadId) => !payloadIds.includes(payloadId));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/selectors.js?");
841
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getState\": () => (/* binding */ getState),\n/* harmony export */ \"getOriginalPayloadIds\": () => (/* binding */ getOriginalPayloadIds),\n/* harmony export */ \"getIsPayloadTranslated\": () => (/* binding */ getIsPayloadTranslated)\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 _redux_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../redux/utils */ \"./src/javascripts/domains/redux/utils.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./src/javascripts/domains/translations/utils.js\");\n\n\n\nconst getState = _utils__WEBPACK_IMPORTED_MODULE_2__.selectState;\nconst getOriginalPayloadIds = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getState, state => state.originalPayloadIds);\nconst getIsPayloadTranslated = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(getOriginalPayloadIds, (0,_redux_utils__WEBPACK_IMPORTED_MODULE_1__.getPropSelector)('payloadId'), (payloadIds, payloadId) => !payloadIds.includes(payloadId));\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/selectors.js?");
842
+
843
+ /***/ }),
844
+
845
+ /***/ "./src/javascripts/domains/translations/utils.js":
846
+ /*!*******************************************************!*\
847
+ !*** ./src/javascripts/domains/translations/utils.js ***!
848
+ \*******************************************************/
849
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
850
+
851
+ "use strict";
852
+ 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 */ });\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)('translations');\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/domains/translations/utils.js?");
468
853
 
469
854
  /***/ }),
470
855
 
@@ -475,7 +860,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
475
860
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
476
861
 
477
862
  "use strict";
478
- 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 */ _ui_utils_seamly_utils__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_4__.eventTypes),\n/* harmony export */ \"ExternalApi\": () => (/* reexport safe */ _lib_external_api__WEBPACK_IMPORTED_MODULE_12__[\"default\"]),\n/* harmony export */ \"getSeamlyConfig\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.getSeamlyConfig),\n/* harmony export */ \"getUrlParams\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__.getUrlParams),\n/* harmony export */ \"getUrlSearchString\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__.getUrlSearchString),\n/* harmony export */ \"Header\": () => (/* reexport safe */ _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_14__[\"default\"]),\n/* harmony export */ \"Icon\": () => (/* reexport safe */ _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"Interrupt\": () => (/* reexport safe */ _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_16__[\"default\"]),\n/* harmony export */ \"MessageContainer\": () => (/* reexport safe */ _ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_17__[\"default\"]),\n/* harmony export */ \"randomId\": () => (/* reexport safe */ _lib_id__WEBPACK_IMPORTED_MODULE_18__.randomId),\n/* harmony export */ \"seamlyActions\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.seamlyActions),\n/* harmony export */ \"SeamlyApiContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_19__.SeamlyApiContext),\n/* harmony export */ \"SeamlyEventBusContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_19__.SeamlyEventBusContext),\n/* harmony export */ \"SeamlyLiveRegionContext\": () => (/* reexport safe */ _ui_components_core_seamly_live_region_context__WEBPACK_IMPORTED_MODULE_20__.SeamlyLiveRegionContext),\n/* harmony export */ \"StoreProvider\": () => (/* reexport safe */ _ui_store__WEBPACK_IMPORTED_MODULE_21__[\"default\"]),\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 */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyConfig),\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_24__.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 */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_23__.useSeamlyVisibility),\n/* harmony export */ \"useTranslations\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_25__.useTranslations),\n/* harmony export */ \"useTranslatedEventData\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_25__.useTranslatedEventData),\n/* harmony export */ \"useTranslationsContainer\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_25__.useTranslationsContainer),\n/* harmony export */ \"Text\": () => (/* reexport safe */ _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_26__[\"default\"]),\n/* harmony export */ \"ToggleButton\": () => (/* reexport safe */ _ui_components_entry_toggle_button__WEBPACK_IMPORTED_MODULE_27__[\"default\"]),\n/* harmony export */ \"View\": () => (/* reexport safe */ _ui_components_layout_view__WEBPACK_IMPORTED_MODULE_28__[\"default\"]),\n/* harmony export */ \"visibilityStates\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.visibilityStates)\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 _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 _lib_external_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./lib/external-api */ \"./src/javascripts/lib/external-api/index.js\");\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\");\n/* harmony import */ var _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ui/components/layout/header */ \"./src/javascripts/ui/components/layout/header.js\");\n/* harmony import */ var _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_16__ = __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_17__ = __webpack_require__(/*! ./ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_19__ = __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_20__ = __webpack_require__(/*! ./ui/components/core/seamly-live-region-context */ \"./src/javascripts/ui/components/core/seamly-live-region-context.js\");\n/* harmony import */ var _ui_store__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ui/store */ \"./src/javascripts/ui/store/index.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_i18n__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_26__ = __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_27__ = __webpack_require__(/*! ./ui/components/entry/toggle-button */ \"./src/javascripts/ui/components/entry/toggle-button.js\");\n/* harmony import */ var _ui_components_layout_view__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./ui/components/layout/view */ \"./src/javascripts/ui/components/layout/view.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: 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: Client\n// Used by: StyleGuide\n\n // Used by: Client\n// Used by: StyleGuide\n\n\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/index.js?");
863
+ 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 */ _ui_utils_seamly_utils__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_4__.eventTypes),\n/* harmony export */ \"ExternalApi\": () => (/* reexport safe */ _lib_external_api__WEBPACK_IMPORTED_MODULE_12__[\"default\"]),\n/* harmony export */ \"getUrlParams\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__.getUrlParams),\n/* harmony export */ \"getUrlSearchString\": () => (/* reexport safe */ _ui_utils_general_utils__WEBPACK_IMPORTED_MODULE_13__.getUrlSearchString),\n/* harmony export */ \"Header\": () => (/* reexport safe */ _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_14__[\"default\"]),\n/* harmony export */ \"Icon\": () => (/* reexport safe */ _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"Interrupt\": () => (/* reexport safe */ _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_16__[\"default\"]),\n/* harmony export */ \"MessageContainer\": () => (/* reexport safe */ _ui_components_conversation_message_container__WEBPACK_IMPORTED_MODULE_17__[\"default\"]),\n/* harmony export */ \"randomId\": () => (/* reexport safe */ _lib_id__WEBPACK_IMPORTED_MODULE_18__.randomId),\n/* harmony export */ \"seamlyActions\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.seamlyActions),\n/* harmony export */ \"SeamlyApiContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_19__.SeamlyApiContext),\n/* harmony export */ \"SeamlyEventBusContext\": () => (/* reexport safe */ _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_19__.SeamlyEventBusContext),\n/* harmony export */ \"SeamlyLiveRegionContext\": () => (/* reexport safe */ _ui_components_core_seamly_live_region_context__WEBPACK_IMPORTED_MODULE_20__.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_21__.useChoicePrompt),\n/* harmony export */ \"useDispatch\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyDispatchContext),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyChat),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyCommands),\n/* harmony export */ \"useSeamlyConfig\": () => (/* reexport safe */ _domains_config__WEBPACK_IMPORTED_MODULE_23__.useConfig),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useEvents),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useGeneratedId),\n/* harmony export */ \"useI18n\": () => (/* reexport safe */ _domains_i18n__WEBPACK_IMPORTED_MODULE_24__.useI18n),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyEventStream),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyIdleDetachCountdown),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyOptions),\n/* harmony export */ \"useSeamlyVisibility\": () => (/* reexport safe */ _ui_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_22__.useSeamlyVisibility),\n/* harmony export */ \"useTranslations\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_25__.useTranslations),\n/* harmony export */ \"useTranslatedEventData\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_25__.useTranslatedEventData),\n/* harmony export */ \"useTranslationsContainer\": () => (/* reexport safe */ _domains_translations__WEBPACK_IMPORTED_MODULE_25__.useTranslationsContainer),\n/* harmony export */ \"Text\": () => (/* reexport safe */ _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_26__[\"default\"]),\n/* harmony export */ \"ToggleButton\": () => (/* reexport safe */ _ui_components_entry_toggle_button__WEBPACK_IMPORTED_MODULE_27__[\"default\"]),\n/* harmony export */ \"View\": () => (/* reexport safe */ _ui_components_layout_view__WEBPACK_IMPORTED_MODULE_28__[\"default\"]),\n/* harmony export */ \"visibilityStates\": () => (/* reexport safe */ _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.visibilityStates),\n/* harmony export */ \"API\": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_29__.API),\n/* harmony export */ \"SeamlyGeneralError\": () => (/* reexport safe */ _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_30__[\"default\"]),\n/* harmony export */ \"SeamlyConfigurationError\": () => (/* reexport safe */ _api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_31__[\"default\"]),\n/* harmony export */ \"SeamlySessionExpiredError\": () => (/* reexport safe */ _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_32__[\"default\"]),\n/* harmony export */ \"SeamlyOfflineError\": () => (/* reexport safe */ _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_33__[\"default\"]),\n/* harmony export */ \"SeamlyUnauthorizedError\": () => (/* reexport safe */ _api_errors_seamly_unauthorized_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 _ui_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ui/utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 _lib_external_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./lib/external-api */ \"./src/javascripts/lib/external-api/index.js\");\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\");\n/* harmony import */ var _ui_components_layout_header__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ui/components/layout/header */ \"./src/javascripts/ui/components/layout/header.js\");\n/* harmony import */ var _ui_components_layout_icon__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./ui/components/layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _ui_components_layout_interrupt__WEBPACK_IMPORTED_MODULE_16__ = __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_17__ = __webpack_require__(/*! ./ui/components/conversation/message-container */ \"./src/javascripts/ui/components/conversation/message-container.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _ui_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_19__ = __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_20__ = __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_21__ = __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_22__ = __webpack_require__(/*! ./ui/hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n/* harmony import */ var _ui_components_conversation_event_text__WEBPACK_IMPORTED_MODULE_26__ = __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_27__ = __webpack_require__(/*! ./ui/components/entry/toggle-button */ \"./src/javascripts/ui/components/entry/toggle-button.js\");\n/* harmony import */ var _ui_components_layout_view__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./ui/components/layout/view */ \"./src/javascripts/ui/components/layout/view.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./api */ \"./src/javascripts/api/index.js\");\n/* harmony import */ var _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./api/errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var _api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./api/errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-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: Client\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 // 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?");
479
864
 
480
865
  /***/ }),
481
866
 
@@ -507,7 +892,7 @@ eval("if (true) {\n module.exports = __webpack_require__(/*! debug */ \"./node_
507
892
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
508
893
 
509
894
  "use strict";
510
- 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 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 = [\"customComponents\", \"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\nclass Engine {\n constructor(config, externalApi) {\n const {\n customComponents,\n parentElement,\n showFaq\n } = config,\n restConfig = _objectWithoutProperties(config, _excluded);\n\n this.config = _objectSpread(_objectSpread({}, restConfig), {}, {\n showFaq: showFaq !== false\n });\n this.namespace = config.namespace || '';\n this.parentElement = parentElement;\n this.customComponents = customComponents;\n this.externalApi = externalApi;\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 render() {\n const _ref = this.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 if (View) {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_ui_components_core_seamly_core__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n config: renderConfig,\n eventBus: this.eventBus,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(View, {})\n }), this.parentElement);\n } else {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_ui_components_chat_app__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n config: renderConfig,\n eventBus: this.eventBus\n }), this.parentElement);\n }\n }\n\n destroy() {\n (0,preact__WEBPACK_IMPORTED_MODULE_0__.render)(null, this.parentElement);\n this.eventBus.off();\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?");
895
+ 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__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../domains/app */ \"./src/javascripts/domains/app/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__);\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 var _config$context;\n\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 locale: config === null || config === void 0 ? void 0 : (_config$context = config.context) === null || _config$context === void 0 ? void 0 : _config$context.locale\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 });\n await store.dispatch(_domains_app__WEBPACK_IMPORTED_MODULE_6__.Actions.initialize(renderConfig));\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?");
511
896
 
512
897
  /***/ }),
513
898
 
@@ -544,6 +929,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
544
929
 
545
930
  /***/ }),
546
931
 
932
+ /***/ "./src/javascripts/lib/mutex.js":
933
+ /*!**************************************!*\
934
+ !*** ./src/javascripts/lib/mutex.js ***!
935
+ \**************************************/
936
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
937
+
938
+ "use strict";
939
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ createMutex)\n/* harmony export */ });\nfunction createMutex() {\n let isRunning = false;\n const tasks = [];\n\n const next = async () => {\n if (!isRunning) {\n while (tasks.length) {\n const task = tasks.shift();\n isRunning = true; // eslint-disable-next-line no-await-in-loop\n\n await task().catch(() => {});\n isRunning = false;\n }\n }\n };\n\n const runExclusively = async task => {\n const prms = new Promise((resolve, reject) => {\n tasks.push(async () => {\n try {\n resolve(await task());\n } catch (e) {\n reject(e);\n }\n });\n });\n next();\n return prms;\n };\n\n return {\n next,\n runExclusively\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/mutex.js?");
940
+
941
+ /***/ }),
942
+
547
943
  /***/ "./src/javascripts/lib/parse-body.js":
548
944
  /*!*******************************************!*\
549
945
  !*** ./src/javascripts/lib/parse-body.js ***!
@@ -572,7 +968,7 @@ eval("if (true) {\n module.exports = __webpack_require__(/*! preact/debug */ \"
572
968
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
573
969
 
574
970
  "use strict";
575
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SLICE_DELIMITER\": () => (/* binding */ SLICE_DELIMITER),\n/* harmony export */ \"DOMAIN_DELIMITER\": () => (/* binding */ DOMAIN_DELIMITER),\n/* harmony export */ \"prefixType\": () => (/* binding */ prefixType),\n/* harmony export */ \"createAction\": () => (/* binding */ createAction),\n/* harmony export */ \"createActions\": () => (/* binding */ createActions),\n/* harmony export */ \"createDomain\": () => (/* binding */ createDomain),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer)\n/* harmony export */ });\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\nconst SLICE_DELIMITER = '/';\nconst DOMAIN_DELIMITER = '//';\nfunction prefixType(prefix, fn, delimiter = '/') {\n return (type, ...args) => fn(prefix + delimiter + type, ...args);\n}\nfunction createAction(type, identityReducer = payload => ({\n payload\n})) {\n const action = (...params) => _objectSpread({\n type\n }, identityReducer(...params));\n\n action.toString = () => type.toString();\n\n return action;\n}\nfunction createActions(baseType, ...args) {\n const handlers = []; // eslint-disable-next-line consistent-return\n\n args.forEach(arg => {\n const argType = typeof arg;\n\n if (argType === 'string') {\n return handlers.push([arg]);\n }\n\n if (argType !== 'object' || arg instanceof Array) {\n return undefined;\n }\n\n Object.keys(arg).forEach(key => handlers.push([key, arg[key]]));\n });\n const create = prefixType(baseType, createAction, SLICE_DELIMITER);\n return handlers.map(handler => create(...handler));\n}\nfunction createDomain(domain) {\n return {\n createAction: prefixType(domain, createAction, DOMAIN_DELIMITER),\n createActions: prefixType(domain, createActions, DOMAIN_DELIMITER)\n };\n}\nfunction createReducer(domain, handlers = {}, defaultState) {\n const reducer = (state, action) => {\n if (state === undefined) {\n // eslint-disable-next-line no-param-reassign\n state = defaultState;\n }\n\n const typeReducer = handlers === null || handlers === void 0 ? void 0 : handlers[action === null || action === void 0 ? void 0 : action.type];\n return typeReducer ? typeReducer(state, action) : state;\n };\n\n reducer.toString = () => domain;\n\n return reducer;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/redux-helpers/index.js?");
971
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SLICE_DELIMITER\": () => (/* binding */ SLICE_DELIMITER),\n/* harmony export */ \"DOMAIN_DELIMITER\": () => (/* binding */ DOMAIN_DELIMITER),\n/* harmony export */ \"prefixType\": () => (/* binding */ prefixType),\n/* harmony export */ \"createAction\": () => (/* binding */ createAction),\n/* harmony export */ \"createActions\": () => (/* binding */ createActions),\n/* harmony export */ \"createThunk\": () => (/* binding */ createThunk),\n/* harmony export */ \"createReducer\": () => (/* binding */ createReducer),\n/* harmony export */ \"createDomain\": () => (/* binding */ createDomain)\n/* harmony export */ });\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\nconst SLICE_DELIMITER = '/';\nconst DOMAIN_DELIMITER = '//';\nfunction prefixType(prefix, fn, delimiter = '/') {\n return (type, ...args) => fn(prefix + delimiter + type, ...args);\n}\nfunction createAction(type, identityReducer = payload => ({\n payload\n})) {\n const action = (...params) => _objectSpread({\n type\n }, identityReducer(...params));\n\n action.toString = () => type.toString();\n\n return action;\n}\nfunction createActions(baseType, ...args) {\n const handlers = []; // eslint-disable-next-line consistent-return\n\n args.forEach(arg => {\n const argType = typeof arg;\n\n if (argType === 'string') {\n return handlers.push([arg]);\n }\n\n if (argType !== 'object' || arg instanceof Array) {\n return undefined;\n }\n\n Object.keys(arg).forEach(key => handlers.push([key, arg[key]]));\n });\n const create = prefixType(baseType, createAction, SLICE_DELIMITER);\n return handlers.map(handler => create(...handler));\n}\nfunction createThunk(type, thunkCreator) {\n const fn = (...args) => {\n const thunk = thunkCreator(...args);\n thunk.type = type;\n return thunk;\n };\n\n fn.toString = () => type;\n\n return fn;\n}\nfunction createReducer(domain, handlers = {}, defaultState) {\n const reducer = (state, action) => {\n if (state === undefined) {\n // eslint-disable-next-line no-param-reassign\n state = defaultState;\n }\n\n const typeReducer = handlers === null || handlers === void 0 ? void 0 : handlers[action === null || action === void 0 ? void 0 : action.type];\n return typeReducer ? typeReducer(state, action) : state;\n };\n\n reducer.toString = () => domain;\n\n return reducer;\n}\nfunction createDomain(domain) {\n return {\n createAction: prefixType(domain, createAction, DOMAIN_DELIMITER),\n createActions: prefixType(domain, createActions, DOMAIN_DELIMITER),\n createThunk: prefixType(domain, createThunk, DOMAIN_DELIMITER),\n createReducer: (handlers, defaultState) => createReducer(domain, handlers, defaultState),\n selectState: state => state[domain]\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/lib/redux-helpers/index.js?");
576
972
 
577
973
  /***/ }),
578
974
 
@@ -627,7 +1023,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
627
1023
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
628
1024
 
629
1025
  "use strict";
630
- 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_view__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./layout/view */ \"./src/javascripts/ui/components/layout/view.js\");\n/* harmony import */ var _core_seamly_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/seamly-core */ \"./src/javascripts/ui/components/core/seamly-core.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__);\n\n\n\n\nconst ChatApp = ({\n config,\n eventBus\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_core_seamly_core__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n config: config,\n eventBus: eventBus,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_layout_view__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {})\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatApp);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/chat-app.js?");
1026
+ 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_view__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./layout/view */ \"./src/javascripts/ui/components/layout/view.js\");\n/* harmony import */ var _core_seamly_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/seamly-core */ \"./src/javascripts/ui/components/core/seamly-core.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 ChatApp = props => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_core_seamly_core__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _objectSpread(_objectSpread({}, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_layout_view__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {})\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ChatApp);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/chat-app.js?");
631
1027
 
632
1028
  /***/ }),
633
1029
 
@@ -660,7 +1056,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
660
1056
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
661
1057
 
662
1058
  "use strict";
663
- 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 _component_context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./component-context */ \"./src/javascripts/ui/components/conversation/component-context.js\");\n/* harmony import */ var _event_choice_prompt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./event/choice-prompt */ \"./src/javascripts/ui/components/conversation/event/choice-prompt.js\");\n/* harmony import */ var _event_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./event/text */ \"./src/javascripts/ui/components/conversation/event/text.js\");\n/* harmony import */ var _event_image__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./event/image */ \"./src/javascripts/ui/components/conversation/event/image.js\");\n/* harmony import */ var _event_video__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./event/video */ \"./src/javascripts/ui/components/conversation/event/video.js\");\n/* harmony import */ var _event_divider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./event/divider */ \"./src/javascripts/ui/components/conversation/event/divider/index.js\");\n/* harmony import */ var _event_translation__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./event/translation */ \"./src/javascripts/ui/components/conversation/event/translation.js\");\n/* harmony import */ var _event_participant__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./event/participant */ \"./src/javascripts/ui/components/conversation/event/participant.js\");\n/* harmony import */ var _event_upload__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./event/upload */ \"./src/javascripts/ui/components/conversation/event/upload.js\");\n/* harmony import */ var _event_cta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./event/cta */ \"./src/javascripts/ui/components/conversation/event/cta.js\");\n/* harmony import */ var _event_divider_variants_time_indicator__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./event/divider/variants/time-indicator */ \"./src/javascripts/ui/components/conversation/event/divider/variants/time-indicator.js\");\n/* harmony import */ var _event_carousel_message__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./event/carousel-message */ \"./src/javascripts/ui/components/conversation/event/carousel-message/index.js\");\n/* harmony import */ var _event_card_message__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./event/card-message */ \"./src/javascripts/ui/components/conversation/event/card-message.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15__);\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 eventTypeMapping = {\n message: {\n choice_prompt: _event_choice_prompt__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n text: _event_text__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n image: _event_image__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n video: _event_video__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n upload: _event_upload__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n cta: _event_cta__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n carousel: _event_carousel_message__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n card: _event_card_message__WEBPACK_IMPORTED_MODULE_14__[\"default\"]\n },\n info: {\n text: _event_text__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n divider: _event_divider__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n translation: _event_translation__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n timeIndicator: _event_divider_variants_time_indicator__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n participant: {\n participant: _event_participant__WEBPACK_IMPORTED_MODULE_9__[\"default\"]\n }\n};\n\nconst ComponentFilter = ({\n children\n}) => {\n const {\n customComponents\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConfig)();\n const resolvedComponents = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n // Calculates a combined component mapping object based on the defaults with\n // user implementation component overrides where required.\n return Object.keys(eventTypeMapping).reduce((acc, key) => {\n return _objectSpread(_objectSpread({}, acc), {}, {\n [key]: _objectSpread(_objectSpread({}, eventTypeMapping[key]), customComponents ? customComponents[key] : {})\n });\n }, {\n fallback: _event_text__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n }, [customComponents]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15__.jsx)(_component_context__WEBPACK_IMPORTED_MODULE_2__[\"default\"].Provider, {\n value: resolvedComponents,\n children: children\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ComponentFilter);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/component-filter.js?");
1059
+ 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 _component_context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./component-context */ \"./src/javascripts/ui/components/conversation/component-context.js\");\n/* harmony import */ var _event_choice_prompt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./event/choice-prompt */ \"./src/javascripts/ui/components/conversation/event/choice-prompt.js\");\n/* harmony import */ var _event_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./event/text */ \"./src/javascripts/ui/components/conversation/event/text.js\");\n/* harmony import */ var _event_image__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./event/image */ \"./src/javascripts/ui/components/conversation/event/image.js\");\n/* harmony import */ var _event_video__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./event/video */ \"./src/javascripts/ui/components/conversation/event/video.js\");\n/* harmony import */ var _event_divider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./event/divider */ \"./src/javascripts/ui/components/conversation/event/divider/index.js\");\n/* harmony import */ var _event_translation__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./event/translation */ \"./src/javascripts/ui/components/conversation/event/translation.js\");\n/* harmony import */ var _event_participant__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./event/participant */ \"./src/javascripts/ui/components/conversation/event/participant.js\");\n/* harmony import */ var _event_upload__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./event/upload */ \"./src/javascripts/ui/components/conversation/event/upload.js\");\n/* harmony import */ var _event_cta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./event/cta */ \"./src/javascripts/ui/components/conversation/event/cta.js\");\n/* harmony import */ var _event_divider_variants_time_indicator__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./event/divider/variants/time-indicator */ \"./src/javascripts/ui/components/conversation/event/divider/variants/time-indicator.js\");\n/* harmony import */ var _event_carousel_message__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./event/carousel-message */ \"./src/javascripts/ui/components/conversation/event/carousel-message/index.js\");\n/* harmony import */ var _event_card_message__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./event/card-message */ \"./src/javascripts/ui/components/conversation/event/card-message.js\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! preact/jsx-runtime */ \"preact/jsx-runtime\");\n/* harmony import */ var preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15__);\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 eventTypeMapping = {\n message: {\n choice_prompt: _event_choice_prompt__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n text: _event_text__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n image: _event_image__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n video: _event_video__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n upload: _event_upload__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n cta: _event_cta__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n carousel: _event_carousel_message__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n card: _event_card_message__WEBPACK_IMPORTED_MODULE_14__[\"default\"]\n },\n info: {\n text: _event_text__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n divider: _event_divider__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n translation: _event_translation__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n timeIndicator: _event_divider_variants_time_indicator__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n participant: {\n participant: _event_participant__WEBPACK_IMPORTED_MODULE_9__[\"default\"]\n }\n};\n\nconst ComponentFilter = ({\n children\n}) => {\n const {\n customComponents\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_1__.useConfig)();\n const resolvedComponents = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n // Calculates a combined component mapping object based on the defaults with\n // user implementation component overrides where required.\n return Object.keys(eventTypeMapping).reduce((acc, key) => {\n return _objectSpread(_objectSpread({}, acc), {}, {\n [key]: _objectSpread(_objectSpread({}, eventTypeMapping[key]), customComponents ? customComponents[key] : {})\n });\n }, {\n fallback: _event_text__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n });\n }, [customComponents]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_15__.jsx)(_component_context__WEBPACK_IMPORTED_MODULE_2__[\"default\"].Provider, {\n value: resolvedComponents,\n children: children\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ComponentFilter);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/component-filter.js?");
664
1060
 
665
1061
  /***/ }),
666
1062
 
@@ -693,7 +1089,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
693
1089
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
694
1090
 
695
1091
  "use strict";
696
- 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 _lib_parse_body__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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\nconst CardComponent = ({\n id,\n action,\n buttonText,\n description,\n image,\n title\n}) => {\n const {\n sendMessage,\n sendAction,\n emitEvent\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyCommands)();\n const descriptionId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useGeneratedId)();\n const CardActionComponent = action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.navigate ? 'a' : 'button';\n const emitCardEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => emitEvent(`action.${_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.clickCard}`, {\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.clickCta,\n originMessage: id,\n action\n }), [emitEvent, id, action]);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n emitCardEvent();\n\n if (action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.ask) {\n sendMessage({\n body: action.ask\n });\n } else if (action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.topic) {\n const {\n topic: name,\n fallbackMessage\n } = action;\n sendAction({\n type: 'set_topic',\n body: {\n name,\n fallbackMessage\n }\n });\n }\n }, [sendMessage, action, sendAction, emitCardEvent]);\n const actionProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.navigate ? {\n href: action.link,\n rel: 'noopener noreferrer',\n target: action.newTab ? '_blank' : '_self',\n onClick: emitCardEvent\n } : {\n onClick: handleClick\n }, [action, handleClick, emitCardEvent]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__wrapper'),\n id: id,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"img\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__image'),\n src: image,\n alt: \"\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__content'),\n id: id,\n children: [title && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"h2\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__title'),\n children: title\n }), description && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__description'),\n dangerouslySetInnerHTML: {\n __html: (0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(description)\n }\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(CardActionComponent, _objectSpread(_objectSpread({\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--primary'),\n \"aria-describedby\": descriptionId\n }, actionProps), {}, {\n children: buttonText\n }))]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardComponent);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-component.js?");
1092
+ 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 _lib_parse_body__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../lib/parse-body */ \"./src/javascripts/lib/parse-body.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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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\nconst CardComponent = ({\n id,\n action,\n buttonText,\n description,\n hasFocus,\n image,\n title,\n isCarouselItem\n}) => {\n const cardRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n sendMessage,\n sendAction,\n emitEvent\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyCommands)();\n const descriptionId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useGeneratedId)();\n const isMounted = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n const CardActionComponent = action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.navigate ? 'a' : 'button';\n const emitCardEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => emitEvent(`action.${_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.clickCard}`, {\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.actionTypes.clickCta,\n originMessage: id,\n action\n }), [emitEvent, id, action]);\n const handleClick = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n emitCardEvent();\n\n if (action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.ask) {\n sendMessage({\n body: action.ask\n });\n } else if (action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.topic) {\n const {\n topic: name,\n fallbackMessage\n } = action;\n sendAction({\n type: 'set_topic',\n body: {\n name,\n fallbackMessage\n }\n });\n }\n }, [sendMessage, action, sendAction, emitCardEvent]);\n const actionProps = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => action.type === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.cardTypes.navigate ? {\n href: action.link,\n rel: 'noopener noreferrer',\n target: action.newTab ? '_blank' : '_self',\n onClick: emitCardEvent\n } : {\n onClick: handleClick\n }, [action, handleClick, emitCardEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isCarouselItem) {\n if (hasFocus && isMounted.current) {\n window.requestAnimationFrame(() => cardRef.current.focus());\n } else {\n cardRef.current.blur();\n }\n }\n\n isMounted.current = true;\n }, [hasFocus, isCarouselItem]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__wrapper'),\n id: id,\n tabIndex: \"-1\" // set tabIndex of -1 so card can be focussed\n ,\n ref: cardRef,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"img\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__image'),\n src: image,\n alt: \"\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__content'),\n id: id,\n children: [title && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"h2\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__title'),\n children: title\n }), description && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('card__description'),\n dangerouslySetInnerHTML: {\n __html: (0,_lib_parse_body__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(description)\n }\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(CardActionComponent, _objectSpread(_objectSpread({\n tabIndex: isCarouselItem && !hasFocus ? '-1' : undefined // disable to prevent tabbing through cards\n ,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--primary'),\n \"aria-describedby\": descriptionId\n }, actionProps), {}, {\n children: buttonText\n }))]\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CardComponent);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/card-component.js?");
697
1093
 
698
1094
  /***/ }),
699
1095
 
@@ -726,7 +1122,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
726
1122
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
727
1123
 
728
1124
  "use strict";
729
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselPagination)\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 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__);\n\n\n\nfunction CarouselPagination({\n items,\n currentIndex,\n onChange,\n getItemKey,\n getItemLabel\n}) {\n const itemCount = items.length;\n const handlePaginate = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(event => {\n const slideIndex = Number(event.target.dataset.item || '0');\n const nextIndex = Math.min(itemCount - 1, Math.max(0, slideIndex));\n\n if (nextIndex !== currentIndex) {\n onChange(nextIndex);\n }\n }, [itemCount, currentIndex, onChange]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination__wrapper'),\n role: \"group\",\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination'),\n children: items.map((item, idx) => {\n const isActive = currentIndex === idx;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination__item', isActive ? 'is-active' : undefined),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination__button'),\n type: \"button\",\n onClick: handlePaginate,\n \"data-item\": idx,\n \"aria-disabled\": isActive ? 'true' : undefined,\n \"aria-label\": getItemLabel(item, idx)\n })\n }, getItemKey(item, idx));\n })\n })\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-component/components/pagination.js?");
1125
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselPagination)\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 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__);\n\n\n\nfunction CarouselPagination({\n items,\n currentIndex,\n onChange,\n getItemKey,\n getItemLabel\n}) {\n const itemCount = items.length;\n const handlePaginate = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(event => {\n const slideIndex = Number(event.target.dataset.item || '0');\n const nextIndex = Math.min(itemCount - 1, Math.max(0, slideIndex));\n\n if (nextIndex !== currentIndex) {\n onChange(nextIndex);\n }\n }, [itemCount, currentIndex, onChange]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination__wrapper'),\n role: \"group\",\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"ul\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination'),\n children: items.map((item, idx) => {\n const isActive = currentIndex === idx;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"li\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination__item', isActive ? 'is-active' : undefined),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('carousel-pagination__button'),\n type: \"button\",\n onClick: handlePaginate,\n \"data-item\": idx,\n \"aria-disabled\": isActive ? 'true' : undefined,\n \"aria-label\": getItemLabel(item, idx)\n })\n }, getItemKey(item, idx, 'pagination-item-'));\n })\n })\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-component/components/pagination.js?");
730
1126
 
731
1127
  /***/ }),
732
1128
 
@@ -737,7 +1133,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
737
1133
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
738
1134
 
739
1135
  "use strict";
740
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselComponent)\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_utility_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _components_pagination__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/pagination */ \"./src/javascripts/ui/components/conversation/event/carousel-component/components/pagination.js\");\n/* harmony import */ var _components_controls__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/controls */ \"./src/javascripts/ui/components/conversation/event/carousel-component/components/controls.js\");\n/* harmony import */ var _carousel_message_components_slide__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../carousel-message/components/slide */ \"./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.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 defaultGetItemKey = (item, idx) => idx;\n\nconst defaultGetItemLabel = item => item.label;\n\nfunction CarouselComponent({\n currentIndex: originalIndex,\n onChange,\n getItemKey = defaultGetItemKey,\n getItemLabel = defaultGetItemLabel,\n items\n}) {\n const carouselItemsId = (0,_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_3__.useGeneratedId)();\n const itemCount = items.length;\n const [currentIndex, setCurrentIndex] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(Number(originalIndex || '0'));\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n setCurrentIndex(Number(originalIndex || '0'));\n }, [setCurrentIndex, originalIndex]);\n const slideRefs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)([]);\n slideRefs.current = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n return Array(itemCount).fill(1).map(() => (0,preact__WEBPACK_IMPORTED_MODULE_0__.createRef)());\n }, [itemCount]);\n const isMountRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(true);\n const onChangeRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)();\n onChangeRef.current = onChange;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (isMountRef.current) {\n isMountRef.current = false;\n return;\n }\n\n if (onChangeRef.current) {\n onChangeRef.current(currentIndex);\n }\n }, [currentIndex]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel'),\n role: \"group\",\n \"aria-roledescription\": \"carousel\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__slides-wrapper'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n id: carouselItemsId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__slides'),\n style: {\n width: `${itemCount * 100}%`,\n left: `${currentIndex * -100}%`\n },\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"false\",\n children: items.map((item, idx) => {\n const isActive = currentIndex === idx;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n ref: slideRefs.current[idx],\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__slide', isActive ? 'is-active' : undefined),\n \"aria-hidden\": !isActive ? 'true' : undefined,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_carousel_message_components_slide__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: item,\n items: items,\n currentIndex: currentIndex\n })\n }, idx);\n })\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__controls'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_components_controls__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n currentIndex: currentIndex,\n items: items,\n onChange: setCurrentIndex,\n controlId: carouselItemsId,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__pagination'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_components_pagination__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n currentIndex: currentIndex,\n items: items,\n onChange: setCurrentIndex,\n getItemKey: getItemKey,\n getItemLabel: getItemLabel\n })\n })\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-component/index.js?");
1136
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselComponent)\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_utility_hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../hooks/utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _components_pagination__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/pagination */ \"./src/javascripts/ui/components/conversation/event/carousel-component/components/pagination.js\");\n/* harmony import */ var _components_controls__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/controls */ \"./src/javascripts/ui/components/conversation/event/carousel-component/components/controls.js\");\n/* harmony import */ var _carousel_message_components_slide__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../carousel-message/components/slide */ \"./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.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 defaultGetItemKey = (item, idx, prefix) => `${prefix}${idx}`;\n\nconst defaultGetItemLabel = item => item.label;\n\nfunction CarouselComponent({\n currentIndex: originalIndex,\n onChange,\n getItemKey = defaultGetItemKey,\n getItemLabel = defaultGetItemLabel,\n items\n}) {\n const carouselItemsId = (0,_hooks_utility_hooks__WEBPACK_IMPORTED_MODULE_3__.useGeneratedId)();\n const itemCount = items.length;\n const [currentIndex, setCurrentIndex] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useState)(Number(originalIndex || '0'));\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n setCurrentIndex(Number(originalIndex || '0'));\n }, [setCurrentIndex, originalIndex]);\n const slideRefs = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)([]);\n slideRefs.current = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => {\n return Array(itemCount).fill(1).map(() => (0,preact__WEBPACK_IMPORTED_MODULE_0__.createRef)());\n }, [itemCount]);\n const isMountRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)(true);\n const onChangeRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useRef)();\n onChangeRef.current = onChange;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (isMountRef.current) {\n isMountRef.current = false;\n return;\n }\n\n if (onChangeRef.current) {\n onChangeRef.current(currentIndex);\n }\n }, [currentIndex]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel'),\n role: \"group\",\n \"aria-roledescription\": \"carousel\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__slides-wrapper'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n id: carouselItemsId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__slides'),\n style: {\n width: `${itemCount * 100}%`,\n left: `${currentIndex * -100}%`\n },\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"false\",\n children: items.map((item, idx) => {\n const isActive = currentIndex === idx;\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n ref: slideRefs.current[idx],\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__slide', isActive ? 'is-active' : undefined),\n \"aria-hidden\": !isActive ? 'true' : undefined,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_carousel_message_components_slide__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n item: item,\n items: items,\n currentIndex: currentIndex,\n isActive: isActive\n })\n }, getItemKey(item, idx, 'item-'));\n })\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__controls'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_components_controls__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n currentIndex: currentIndex,\n items: items,\n onChange: setCurrentIndex,\n controlId: carouselItemsId,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('carousel__pagination'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_components_pagination__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n currentIndex: currentIndex,\n items: items,\n onChange: setCurrentIndex,\n getItemKey: getItemKey,\n getItemLabel: getItemLabel\n })\n })\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-component/index.js?");
741
1137
 
742
1138
  /***/ }),
743
1139
 
@@ -748,7 +1144,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
748
1144
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
749
1145
 
750
1146
  "use strict";
751
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselMessageSlide)\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_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _card_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.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__);\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\nfunction CarouselMessageSlide({\n item: slide,\n items,\n currentIndex\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('carousel-item', `carousel-item--${slide.type}`),\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": t('carousel.slide.label', {\n index: currentIndex + 1,\n total: items.length\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_card_component__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _objectSpread({}, slide))\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js?");
1147
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CarouselMessageSlide)\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_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _card_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../card-component */ \"./src/javascripts/ui/components/conversation/event/card-component.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__);\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\nfunction CarouselMessageSlide({\n item: slide,\n items,\n currentIndex,\n isActive\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('carousel-item', `carousel-item--${slide.type}`),\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": t('carousel.slide.label', {\n index: currentIndex + 1,\n total: items.length\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_card_component__WEBPACK_IMPORTED_MODULE_2__[\"default\"], _objectSpread(_objectSpread({}, slide), {}, {\n isCarouselItem: true,\n hasFocus: isActive\n }))\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js?");
752
1148
 
753
1149
  /***/ }),
754
1150
 
@@ -759,7 +1155,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
759
1155
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
760
1156
 
761
1157
  "use strict";
762
- 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 => item.title;\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?");
1158
+ 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?");
763
1159
 
764
1160
  /***/ }),
765
1161
 
@@ -814,7 +1210,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
814
1210
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
815
1211
 
816
1212
  "use strict";
817
- 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 _event_divider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../../lib/css */ \"./src/javascripts/lib/css.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__);\n\n\n\n\n\n\n\n\nconst NewTranslationDivider = ({\n event\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n translationEnabled,\n translationLocale,\n text\n } = event.payload.body;\n const {\n enableTranslations,\n languages\n } = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n const languageName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n var _languages$find;\n\n return languages === null || languages === void 0 ? void 0 : (_languages$find = languages.find(lang => lang.locale === translationLocale)) === null || _languages$find === void 0 ? void 0 : _languages$find.nativeName;\n }, [languages, translationLocale]);\n\n const handleRestartButtonclick = () => {\n enableTranslations(translationLocale);\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_event_divider__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n iconName: \"newTranslation\",\n dividerType: \"newtranslation\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('divider__title'),\n children: t(translationEnabled ? 'translations.divider.startText' : 'translations.divider.stopText', languageName)\n }), translationEnabled ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n children: text\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--secondary'),\n onClick: handleRestartButtonclick,\n children: t('translations.divider.restartButtonText')\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NewTranslationDivider);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js?");
1213
+ 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 _event_divider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../event-divider */ \"./src/javascripts/ui/components/conversation/event-divider.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../../../lib/css */ \"./src/javascripts/lib/css.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__);\n\n\n\n\n\n\n\n\nconst NewTranslationDivider = ({\n event\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n translationEnabled,\n translationLocale,\n text\n } = event.payload.body;\n const {\n enableTranslations,\n languages\n } = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n const languageName = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n var _languages$find;\n\n return languages === null || languages === void 0 ? void 0 : (_languages$find = languages.find(lang => lang.locale === translationLocale)) === null || _languages$find === void 0 ? void 0 : _languages$find.nativeName;\n }, [languages, translationLocale]);\n\n const handleRestartButtonclick = () => {\n enableTranslations(translationLocale);\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_event_divider__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n iconName: \"newTranslation\",\n dividerType: \"newtranslation\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('divider__title'),\n children: t(translationEnabled ? 'translations.divider.startText' : 'translations.divider.stopText', {\n language: languageName\n })\n }), translationEnabled ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"p\", {\n children: text\n }) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('button', 'button--secondary'),\n onClick: handleRestartButtonclick,\n children: t('translations.divider.restartButtonText')\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NewTranslationDivider);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js?");
818
1214
 
819
1215
  /***/ }),
820
1216
 
@@ -836,7 +1232,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
836
1232
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
837
1233
 
838
1234
  "use strict";
839
- 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 _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 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__);\n\n\n\n\nconst EventParticipant = ({\n eventPayload\n}) => {\n const {\n fromClient,\n participant: participantId\n } = eventPayload;\n const participant = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyParticipant)(participantId) || {};\n const {\n messages,\n defaults\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyConfig)();\n const participantName = participant && participant.name;\n const {\n showAvatar,\n showName\n } = messages[fromClient ? 'user' : 'agent'] || {};\n const {\n userName\n } = defaults || {};\n\n if (!showAvatar && !showName) {\n return null;\n }\n\n const authorInfo = [];\n\n if (showAvatar && participantName && participant.avatar) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('message__avatar'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"img\", {\n src: participant.avatar,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('avatar'),\n alt: \"\"\n })\n }));\n }\n\n const authorName = fromClient ? userName || participantName : participantName;\n\n if (showName && authorName) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('message__author-name'),\n children: authorName\n }));\n }\n\n return authorInfo.length > 0 && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('message__author'),\n children: authorInfo\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventParticipant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/event-participant.js?");
1235
+ 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 _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 _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../domains/config */ \"./src/javascripts/domains/config/index.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 EventParticipant = ({\n eventPayload\n}) => {\n const {\n fromClient,\n participant: participantId\n } = eventPayload;\n const participant = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyParticipant)(participantId) || {};\n const {\n messages,\n defaults\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const participantName = participant && participant.name;\n const {\n showAvatar,\n showName\n } = messages[fromClient ? 'user' : 'agent'] || {};\n const {\n userName\n } = defaults || {};\n\n if (!showAvatar && !showName) {\n return null;\n }\n\n const authorInfo = [];\n\n if (showAvatar && participantName && participant.avatar) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('message__avatar'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"img\", {\n src: participant.avatar,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('avatar'),\n alt: \"\"\n })\n }));\n }\n\n const authorName = fromClient ? userName || participantName : participantName;\n\n if (showName && authorName) {\n authorInfo.push((0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('message__author-name'),\n children: authorName\n }));\n }\n\n return authorInfo.length > 0 && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('message__author'),\n children: authorInfo\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventParticipant);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/event-participant.js?");
840
1236
 
841
1237
  /***/ }),
842
1238
 
@@ -869,7 +1265,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
869
1265
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
870
1266
 
871
1267
  "use strict";
872
- 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 _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.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\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConfig)();\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_2__.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?");
1268
+ 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?");
873
1269
 
874
1270
  /***/ }),
875
1271
 
@@ -913,7 +1309,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
913
1309
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
914
1310
 
915
1311
  "use strict";
916
- 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 mustache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mustache */ \"./node_modules/mustache/mustache.mjs\");\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 _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.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__);\n\n\n\n\n\n\n\n\nconst Participant = ({\n event\n}) => {\n const {\n agentIcon\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyConfig)().defaults || {};\n const {\n participant\n } = event.payload;\n const [introduction] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const intro = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return introduction ? mustache__WEBPACK_IMPORTED_MODULE_1__[\"default\"].render((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?");
1312
+ 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 mustache__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mustache */ \"./node_modules/mustache/mustache.mjs\");\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 ? mustache__WEBPACK_IMPORTED_MODULE_1__[\"default\"].render((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?");
917
1313
 
918
1314
  /***/ }),
919
1315
 
@@ -946,7 +1342,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
946
1342
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
947
1343
 
948
1344
  "use strict";
949
- 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_icon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../layout/icon */ \"./src/javascripts/ui/components/layout/icon.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 _utils_general_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.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\n\nconst UploadContent = ({\n children,\n url,\n target\n}) => url ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"a\", {\n href: url,\n download: true,\n target: target || undefined,\n children: children\n}) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n children: children\n});\n\nconst Upload = _ref => {\n let {\n event\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const {\n fromClient\n } = event.payload;\n const {\n deleteAt,\n filename,\n url\n } = body;\n const deleted = url && !!deleteAt && (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_3__.microsecondsToMilliseconds)(deleteAt) < Date.now();\n\n const getSrText = () => {\n if (url) {\n if (deleted) {\n return t('fileUpload.srFileUnavailableText', filename);\n } else {\n return t('fileUpload.srFileDownloadText', filename);\n }\n } else {\n return t('fileUpload.srFileUploadedText', filename);\n }\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"upload\",\n modifiers: deleted && 'deleted',\n info: deleted ? t('fileUpload.fileUnavailableText') : undefined\n }, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('download'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n name: \"download\",\n size: \"16\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(UploadContent, {\n url: !deleted && url,\n target: !fromClient ? '_blank' : undefined,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n \"aria-hidden\": \"true\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('file-download'),\n children: filename\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('visually-hidden'),\n children: getSrText()\n })]\n })]\n })\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Upload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/upload.js?");
1345
+ 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 _domains_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.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\n\nconst UploadContent = ({\n children,\n url,\n target\n}) => url ? (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"a\", {\n href: url,\n download: true,\n target: target || undefined,\n children: children\n}) : (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n children: children\n});\n\nconst Upload = _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 [body] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_5__.useTranslatedEventData)(event);\n const {\n fromClient\n } = event.payload;\n const {\n filename,\n url\n } = body;\n const srText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => url ? t('fileUpload.srFileDownloadText', {\n fileName: filename\n }) : t('fileUpload.srFileUploadedText', {\n fileName: filename\n }), [url, filename, t]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_message_container__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _objectSpread(_objectSpread({\n event: event,\n type: \"upload\"\n }, props), {}, {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('download'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"download\",\n size: \"16\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(UploadContent, {\n url: url,\n target: !fromClient ? '_blank' : undefined,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n \"aria-hidden\": \"true\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('file-download'),\n children: filename\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('visually-hidden'),\n children: srText\n })]\n })]\n })\n }));\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Upload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/conversation/event/upload.js?");
950
1346
 
951
1347
  /***/ }),
952
1348
 
@@ -1001,7 +1397,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1001
1397
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1002
1398
 
1003
1399
  "use strict";
1004
- 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 _seamly_activity_event_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-activity-event-context */ \"./src/javascripts/ui/components/core/seamly-activity-event-context.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 _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config */ \"./src/javascripts/config.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 SeamlyActivityMonitor = ({\n children\n}) => {\n const prevSendTimestamp = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const {\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const {\n hasCountdown,\n isActive,\n stopCountdown\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIdleDetachCountdown)();\n const onActivityHandler = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const timeStamp = new Date().getTime();\n\n const sendActive = () => {\n sendAction({\n type: 'interactivity_update'\n });\n prevSendTimestamp.current = timeStamp;\n };\n\n if (hasCountdown && isActive) {\n sendActive();\n stopCountdown();\n }\n\n if (timeStamp - prevSendTimestamp.current > _config__WEBPACK_IMPORTED_MODULE_3__.activitySendDelay) {\n sendActive();\n }\n }, [sendAction, hasCountdown, isActive, stopCountdown]); // It is important to use keyUp here as focus may be set from outside the\n // chat container via keyboard. In this case the keyDown handler would not\n // be fired inside the container on the initial focus event.\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n tabIndex: \"-1\",\n onMouseDown: onActivityHandler,\n onKeyUp: onActivityHandler,\n onTouchStart: onActivityHandler,\n onMouseMove: onActivityHandler,\n onWheel: onActivityHandler,\n onPointerDown: onActivityHandler,\n onPointerMove: onActivityHandler,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_seamly_activity_event_context__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Provider, {\n value: onActivityHandler,\n children: children\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyActivityMonitor);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-activity-monitor.js?");
1400
+ 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 _seamly_activity_event_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-activity-event-context */ \"./src/javascripts/ui/components/core/seamly-activity-event-context.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 _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.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 SeamlyActivityMonitor = ({\n children\n}) => {\n const prevSendTimestamp = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const {\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const {\n hasCountdown,\n isActive,\n stopCountdown\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIdleDetachCountdown)();\n const onActivityHandler = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n const timeStamp = new Date().getTime();\n\n const sendActive = () => {\n sendAction({\n type: 'interactivity_update'\n });\n prevSendTimestamp.current = timeStamp;\n };\n\n if (hasCountdown && isActive) {\n sendActive();\n stopCountdown();\n }\n\n if (timeStamp - prevSendTimestamp.current > _config__WEBPACK_IMPORTED_MODULE_3__.activitySendDelay) {\n sendActive();\n }\n }, [sendAction, hasCountdown, isActive, stopCountdown]); // It is important to use keyUp here as focus may be set from outside the\n // chat container via keyboard. In this case the keyDown handler would not\n // be fired inside the container on the initial focus event.\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('activity-monitor'),\n tabIndex: \"-1\",\n onMouseDown: onActivityHandler,\n onKeyUp: onActivityHandler,\n onTouchStart: onActivityHandler,\n onMouseMove: onActivityHandler,\n onWheel: onActivityHandler,\n onPointerDown: onActivityHandler,\n onPointerMove: onActivityHandler,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_seamly_activity_event_context__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Provider, {\n value: onActivityHandler,\n children: children\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyActivityMonitor);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-activity-monitor.js?");
1005
1401
 
1006
1402
  /***/ }),
1007
1403
 
@@ -1016,17 +1412,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1016
1412
 
1017
1413
  /***/ }),
1018
1414
 
1019
- /***/ "./src/javascripts/ui/components/core/seamly-api.js":
1020
- /*!**********************************************************!*\
1021
- !*** ./src/javascripts/ui/components/core/seamly-api.js ***!
1022
- \**********************************************************/
1023
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1024
-
1025
- "use strict";
1026
- 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 _seamly_api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.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_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../api */ \"./src/javascripts/api/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 SeamlyApi = ({\n children\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const [seamlyApi, setSeamlyApi] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n const {\n namespace,\n api: apiConfig\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyConfig)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyDispatchContext)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const bootStrap = async () => {\n const api = new _api__WEBPACK_IMPORTED_MODULE_4__.API({\n namespace,\n config: apiConfig\n });\n setSeamlyApi(api);\n };\n\n if (namespace && apiConfig.key) {\n bootStrap();\n }\n }, [dispatch, apiConfig, namespace, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n if (seamlyApi.disconnect) {\n seamlyApi.disconnect();\n }\n };\n }, [seamlyApi]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__.SeamlyApiContext.Provider, {\n value: seamlyApi,\n children: children\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyApi);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-api.js?");
1027
-
1028
- /***/ }),
1029
-
1030
1415
  /***/ "./src/javascripts/ui/components/core/seamly-core.js":
1031
1416
  /*!***********************************************************!*\
1032
1417
  !*** ./src/javascripts/ui/components/core/seamly-core.js ***!
@@ -1034,7 +1419,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1034
1419
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1035
1420
 
1036
1421
  "use strict";
1037
- 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 _seamly_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-api */ \"./src/javascripts/ui/components/core/seamly-api.js\");\n/* harmony import */ var _seamly_instance_functions_loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-instance-functions-loader */ \"./src/javascripts/ui/components/core/seamly-instance-functions-loader.js\");\n/* harmony import */ var _seamly_read_state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-read-state */ \"./src/javascripts/ui/components/core/seamly-read-state.js\");\n/* harmony import */ var _seamly_new_notifications__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./seamly-new-notifications */ \"./src/javascripts/ui/components/core/seamly-new-notifications.js\");\n/* harmony import */ var _seamly_live_region__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-live-region */ \"./src/javascripts/ui/components/core/seamly-live-region.js\");\n/* harmony import */ var _seamly_idle_detach_counter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./seamly-idle-detach-counter */ \"./src/javascripts/ui/components/core/seamly-idle-detach-counter.js\");\n/* harmony import */ var _seamly_activity_monitor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./seamly-activity-monitor */ \"./src/javascripts/ui/components/core/seamly-activity-monitor.js\");\n/* harmony import */ var _seamly_initializer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./seamly-initializer */ \"./src/javascripts/ui/components/core/seamly-initializer.js\");\n/* harmony import */ var _seamly_event_subscriber__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./seamly-event-subscriber */ \"./src/javascripts/ui/components/core/seamly-event-subscriber.js\");\n/* harmony import */ var _seamly_file_upload__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./seamly-file-upload */ \"./src/javascripts/ui/components/core/seamly-file-upload.js\");\n/* harmony import */ var _seamly_api_context__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../store */ \"./src/javascripts/ui/store/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__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SeamlyCore = ({\n children,\n config,\n eventBus\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_store__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n translations: config.translations,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_10__.SeamlyEventBusContext.Provider, {\n value: eventBus,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_api__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(_seamly_live_region__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_initializer__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n config: config\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_event_subscriber__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n eventBus: eventBus\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_read_state__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_new_notifications__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_idle_detach_counter__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(_seamly_activity_monitor__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_instance_functions_loader__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_seamly_file_upload__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n children: children\n })]\n })]\n })\n })\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyCore);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-core.js?");
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 _seamly_instance_functions_loader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-instance-functions-loader */ \"./src/javascripts/ui/components/core/seamly-instance-functions-loader.js\");\n/* harmony import */ var _seamly_read_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-read-state */ \"./src/javascripts/ui/components/core/seamly-read-state.js\");\n/* harmony import */ var _seamly_new_notifications__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-new-notifications */ \"./src/javascripts/ui/components/core/seamly-new-notifications.js\");\n/* harmony import */ var _seamly_live_region__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./seamly-live-region */ \"./src/javascripts/ui/components/core/seamly-live-region.js\");\n/* harmony import */ var _seamly_idle_detach_counter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-idle-detach-counter */ \"./src/javascripts/ui/components/core/seamly-idle-detach-counter.js\");\n/* harmony import */ var _seamly_activity_monitor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./seamly-activity-monitor */ \"./src/javascripts/ui/components/core/seamly-activity-monitor.js\");\n/* harmony import */ var _seamly_initializer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./seamly-initializer */ \"./src/javascripts/ui/components/core/seamly-initializer.js\");\n/* harmony import */ var _seamly_event_subscriber__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./seamly-event-subscriber */ \"./src/javascripts/ui/components/core/seamly-event-subscriber.js\");\n/* harmony import */ var _seamly_file_upload__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./seamly-file-upload */ \"./src/javascripts/ui/components/core/seamly-file-upload.js\");\n/* harmony import */ var _seamly_api_context__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _domains_redux__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../domains/redux */ \"./src/javascripts/domains/redux/index.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\nconst SeamlyCore = ({\n store,\n children,\n config,\n eventBus,\n api\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_domains_redux__WEBPACK_IMPORTED_MODULE_10__.StoreProvider, {\n store: store,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_9__.SeamlyEventBusContext.Provider, {\n value: eventBus,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_9__.SeamlyApiContext.Provider, {\n value: api,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_seamly_live_region__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_initializer__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n config: config\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_event_subscriber__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n eventBus: eventBus\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_read_state__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_new_notifications__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_idle_detach_counter__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_seamly_activity_monitor__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_instance_functions_loader__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_seamly_file_upload__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n children: children\n })]\n })]\n })\n })\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyCore);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-core.js?");
1038
1423
 
1039
1424
  /***/ }),
1040
1425
 
@@ -1045,7 +1430,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1045
1430
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1046
1431
 
1047
1432
  "use strict";
1048
- 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\nconst _excluded = [\"serviceSettings\"];\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 {\n ADD_EVENT,\n ACK_EVENT,\n SET_IS_LOADING,\n SET_PARTICIPANT,\n SET_HEADER_SUB_TITLE,\n CLEAR_INTERRUPT,\n SET_ACTIVE_SERVICE,\n INIT_RESUME_CONVERSATION_PROMPT,\n CLEAR_EVENTS,\n SET_SERVICE_DATA_ITEM,\n SET_FEATURE_ENABLED_STATE,\n SET_SERVICE_ENTRY_METADATA,\n SET_HISTORY\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions;\nconst EMITTABLE_MESSAGE_TYPES = ['text', 'choice_prompt', 'image', 'video'];\n\nconst SeamlyEventSubscriber = ({\n eventBus\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyApiContext)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyDispatchContext)();\n const events = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useEvents)();\n const prevEmittedEventId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n setInterrupt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyInterrupt)();\n const {\n setUserSelectedOption\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n initCountdown,\n endCountdown\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyIdleDetachCountdown)();\n const {\n emitEvent\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyCommands)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n const updateParticipant = event => {\n const {\n payload\n } = event;\n\n if (!payload || !payload.participant) {\n return;\n }\n\n const {\n fromClient,\n participant\n } = payload;\n\n if (!fromClient && participant.name) {\n dispatch({\n type: SET_HEADER_SUB_TITLE,\n title: participant.name\n });\n }\n\n dispatch({\n type: SET_PARTICIPANT,\n participant,\n fromClient\n });\n\n if (participant.introduction) {\n dispatch({\n type: ADD_EVENT,\n event\n });\n }\n };\n\n api.stream().subscribe({\n next: event => {\n const {\n type,\n payload\n } = event;\n\n switch (type) {\n case 'ui':\n if (payload.state && payload.state.hasOwnProperty('loading')) {\n dispatch({\n type: SET_IS_LOADING,\n isLoading: payload.state.loading\n });\n }\n\n switch (payload.type) {\n case 'idle_detach_countdown':\n initCountdown(payload.body.duration);\n break;\n\n case 'idle_detach_countdown_elapsed':\n endCountdown(undefined, true);\n break;\n\n case 'resume_conversation_prompt':\n dispatch({\n type: INIT_RESUME_CONVERSATION_PROMPT\n });\n break;\n\n case 'user_first_response':\n eventBus.emit('system.userFirstResponse', payload.body);\n break;\n }\n\n break;\n\n case 'message':\n updateParticipant(payload);\n\n switch (payload.type) {\n case 'text':\n case 'choice_prompt':\n case 'image':\n case 'upload':\n case 'video':\n case 'cta':\n case 'custom':\n case 'carousel':\n case 'card':\n if (payload.service && payload.service.serviceSessionId) {\n dispatch({\n type: SET_ACTIVE_SERVICE,\n activeServiceSessionId: payload.service.serviceSessionId\n });\n }\n\n dispatch({\n type: ADD_EVENT,\n event\n });\n break;\n }\n\n break;\n\n case 'participant':\n updateParticipant(event);\n break;\n\n case 'service_data':\n if (payload.persist) {\n dispatch({\n type: SET_SERVICE_DATA_ITEM,\n payload\n });\n }\n\n break;\n\n case 'ack':\n dispatch({\n type: ACK_EVENT,\n event\n });\n break;\n\n case 'system':\n if (payload.type === 'service_changed') {\n const {\n serviceSettings\n } = payload,\n eventPayload = _objectWithoutProperties(payload, _excluded);\n\n const {\n cobrowsing,\n uploads,\n entry\n } = serviceSettings;\n dispatch({\n type: SET_FEATURE_ENABLED_STATE,\n key: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.cobrowsing,\n enabled: !!(cobrowsing && cobrowsing.enabled)\n });\n dispatch({\n type: SET_FEATURE_ENABLED_STATE,\n key: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.uploads,\n enabled: !!(uploads && uploads.enabled)\n });\n setUserSelectedOption(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.cobrowsing, false);\n dispatch({\n type: SET_SERVICE_ENTRY_METADATA,\n entryMeta: entry\n });\n dispatch({\n type: SET_ACTIVE_SERVICE,\n activeServiceSessionId: payload.serviceSessionId\n });\n emitEvent('system.serviceChanged', eventPayload);\n }\n\n break;\n\n case 'info':\n if (payload.type === 'divider' || payload.type === 'text' || payload.type === 'translation') {\n dispatch({\n type: ADD_EVENT,\n event\n });\n }\n\n break;\n\n case 'error':\n switch (payload.type) {\n case 'find_conversation_erred':\n setInterrupt(new _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"]());\n break;\n\n case 'seamly_offline':\n setInterrupt(new _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__[\"default\"]());\n dispatch({\n type: CLEAR_EVENTS\n });\n break;\n\n default:\n setInterrupt(new _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"]());\n break;\n }\n\n break;\n\n case 'socket_opened':\n dispatch({\n type: CLEAR_INTERRUPT\n });\n break;\n }\n }\n });\n api.stream().filter(e => e.type === 'message' && EMITTABLE_MESSAGE_TYPES.includes(e.payload.type)).subscribe({\n next: ({\n payload\n }) => {\n // This check dedupes the sending of messages via\n // the bus if a duplicate connection exists in an\n // error situation.\n if (payload.id !== prevEmittedEventId.current) {\n eventBus.emit('message', payload);\n }\n\n prevEmittedEventId.current = payload.id;\n }\n });\n }\n }, [dispatch, api, eventBus, t, setInterrupt, setUserSelectedOption, initCountdown, endCountdown, emitEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const subscribe = () => {\n return api.stream().filter(e => e.type === 'sync').subscribe({\n next: event => {\n const {\n payload\n } = event;\n const lastEvent = events[events.length - 1];\n const {\n id: payloadLastEventId\n } = payload.lastEvent;\n\n if (lastEvent && payloadLastEventId === lastEvent.payload.id) {\n return;\n }\n\n api.getConversation().then(history => {\n if (!history) {\n return;\n }\n\n dispatch({\n type: SET_HISTORY,\n history\n });\n }).catch(error => {\n setInterrupt(error);\n });\n }\n });\n };\n\n if (api.stream) {\n const subscription = subscribe();\n return () => {\n subscription.unsubscribe();\n };\n }\n\n return () => {};\n }, [api, events, dispatch, setInterrupt]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyEventSubscriber);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-event-subscriber.js?");
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 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\nconst _excluded = [\"serviceSettings\"];\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\nconst {\n ADD_EVENT,\n ACK_EVENT,\n SET_IS_LOADING,\n SET_PARTICIPANT,\n SET_HEADER_SUB_TITLE,\n SET_ACTIVE_SERVICE,\n INIT_RESUME_CONVERSATION_PROMPT,\n CLEAR_EVENTS,\n SET_SERVICE_DATA_ITEM,\n SET_FEATURE_ENABLED_STATE,\n SET_SERVICE_ENTRY_METADATA,\n SET_HISTORY\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions;\nconst EMITTABLE_MESSAGE_TYPES = ['text', 'choice_prompt', 'image', 'video'];\n\nconst SeamlyEventSubscriber = ({\n eventBus\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyApiContext)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyDispatchContext)();\n const events = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useEvents)();\n const prevEmittedEventId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n setUserSelectedOption\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n initCountdown,\n endCountdown\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyIdleDetachCountdown)();\n const {\n emitEvent\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyCommands)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.connectionInfo) {\n const updateParticipant = event => {\n const {\n payload\n } = event;\n\n if (!payload || !payload.participant) {\n return;\n }\n\n const {\n fromClient,\n participant\n } = payload;\n\n if (!fromClient && participant.name) {\n dispatch({\n type: SET_HEADER_SUB_TITLE,\n title: participant.name\n });\n }\n\n dispatch({\n type: SET_PARTICIPANT,\n participant,\n fromClient\n });\n\n if (participant.introduction) {\n dispatch({\n type: ADD_EVENT,\n event\n });\n }\n };\n\n api.stream().subscribe({\n next: event => {\n const {\n type,\n payload\n } = event;\n\n switch (type) {\n case 'ui':\n if (payload.state && payload.state.hasOwnProperty('loading')) {\n dispatch({\n type: SET_IS_LOADING,\n isLoading: payload.state.loading\n });\n }\n\n switch (payload.type) {\n case 'idle_detach_countdown':\n initCountdown(payload.body.duration);\n break;\n\n case 'idle_detach_countdown_elapsed':\n endCountdown(undefined, true);\n break;\n\n case 'resume_conversation_prompt':\n dispatch({\n type: INIT_RESUME_CONVERSATION_PROMPT\n });\n break;\n\n case 'user_first_response':\n dispatch(_domains_app__WEBPACK_IMPORTED_MODULE_8__.Actions.setHasResponded(true));\n eventBus.emit('system.userFirstResponse', payload.body);\n break;\n }\n\n break;\n\n case 'message':\n updateParticipant(payload);\n\n switch (payload.type) {\n case 'text':\n case 'choice_prompt':\n case 'image':\n case 'upload':\n case 'video':\n case 'cta':\n case 'custom':\n case 'carousel':\n case 'card':\n if (payload.service && payload.service.serviceSessionId) {\n dispatch({\n type: SET_ACTIVE_SERVICE,\n activeServiceSessionId: payload.service.serviceSessionId\n });\n }\n\n dispatch({\n type: ADD_EVENT,\n event\n });\n break;\n }\n\n break;\n\n case 'participant':\n updateParticipant(event);\n break;\n\n case 'service_data':\n if (payload.persist) {\n dispatch({\n type: SET_SERVICE_DATA_ITEM,\n payload\n });\n }\n\n break;\n\n case 'ack':\n dispatch({\n type: ACK_EVENT,\n event\n });\n break;\n\n case 'system':\n if (payload.type === 'service_changed') {\n const {\n serviceSettings\n } = payload,\n eventPayload = _objectWithoutProperties(payload, _excluded);\n\n const {\n cobrowsing,\n uploads,\n entry\n } = serviceSettings;\n dispatch({\n type: SET_FEATURE_ENABLED_STATE,\n key: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.cobrowsing,\n enabled: !!(cobrowsing && cobrowsing.enabled)\n });\n dispatch({\n type: SET_FEATURE_ENABLED_STATE,\n key: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.uploads,\n enabled: !!(uploads && uploads.enabled)\n });\n setUserSelectedOption(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.featureKeys.cobrowsing, false);\n dispatch({\n type: SET_SERVICE_ENTRY_METADATA,\n entryMeta: entry\n });\n dispatch({\n type: SET_ACTIVE_SERVICE,\n activeServiceSessionId: payload.serviceSessionId\n });\n emitEvent('system.serviceChanged', eventPayload);\n }\n\n break;\n\n case 'info':\n if (payload.type === 'divider' || payload.type === 'text' || payload.type === 'translation') {\n dispatch({\n type: ADD_EVENT,\n event\n });\n }\n\n break;\n\n case 'error':\n switch (payload.type) {\n case 'find_conversation_erred':\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_7__.Actions.set(new _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"]()));\n break;\n\n case 'seamly_offline':\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_7__.Actions.set(new _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__[\"default\"]()));\n dispatch({\n type: CLEAR_EVENTS\n });\n break;\n\n default:\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_7__.Actions.set(new _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_4__[\"default\"]()));\n break;\n }\n\n break;\n\n case 'socket_opened':\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_7__.Actions.clear());\n break;\n }\n }\n });\n api.stream().filter(e => e.type === 'message' && EMITTABLE_MESSAGE_TYPES.includes(e.payload.type)).subscribe({\n next: ({\n payload\n }) => {\n // This check dedupes the sending of messages via\n // the bus if a duplicate connection exists in an\n // error situation.\n if (payload.id !== prevEmittedEventId.current) {\n eventBus.emit('message', payload);\n }\n\n prevEmittedEventId.current = payload.id;\n }\n });\n }\n }, [dispatch, api, eventBus, t, setUserSelectedOption, initCountdown, endCountdown, emitEvent]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const subscribe = () => {\n return api.stream().filter(e => e.type === 'sync').subscribe({\n next: event => {\n const {\n payload\n } = event;\n const lastEvent = events[events.length - 1];\n const {\n id: payloadLastEventId\n } = payload.lastEvent;\n\n if (lastEvent && payloadLastEventId === lastEvent.payload.id) {\n return;\n }\n\n api.getConversation().then(history => {\n if (!history) {\n return;\n }\n\n dispatch({\n type: SET_HISTORY,\n history\n });\n }).catch(error => {\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_7__.Actions.set(error));\n });\n }\n });\n };\n\n if (api.stream) {\n const subscription = subscribe();\n return () => {\n subscription.unsubscribe();\n };\n }\n\n return () => {};\n }, [api, events, dispatch]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyEventSubscriber);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-event-subscriber.js?");
1049
1434
 
1050
1435
  /***/ }),
1051
1436
 
@@ -1067,7 +1452,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1067
1452
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1068
1453
 
1069
1454
  "use strict";
1070
- 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 _seamly_file_upload_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-file-upload-context */ \"./src/javascripts/ui/components/core/seamly-file-upload-context.js\");\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_id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/id */ \"./src/javascripts/lib/id.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 _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\nconst {\n REGISTER_UPLOAD,\n SET_UPLOAD_PROGRESS,\n SET_UPLOAD_ERROR,\n SET_UPLOAD_COMPLETE\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.seamlyActions;\n\nconst SeamlyFileUpload = ({\n children\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyDispatchContext)();\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyApiContext)();\n const {\n addUploadBubble\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyCommands)();\n\n const onUploadFileHandler = file => {\n const fileId = (0,_lib_id__WEBPACK_IMPORTED_MODULE_2__.randomId)();\n const uploadHandle = api.uploadFile(file, p => {\n dispatch({\n type: SET_UPLOAD_PROGRESS,\n fileId,\n progress: Math.ceil(p)\n });\n }, result => {\n const {\n id,\n transactionId,\n occurredAt,\n body: {\n contentType,\n deleteAt,\n filename,\n filesize,\n url\n }\n } = result.body;\n dispatch({\n type: SET_UPLOAD_COMPLETE,\n fileId\n });\n addUploadBubble(id, transactionId, occurredAt, contentType, deleteAt, filename, filesize, url);\n }, err => {\n const errorKey = err && err.body ? err.body.error : '';\n let errorText;\n\n switch (errorKey) {\n case 'file_uploads_are_disabled':\n errorText = t('fileUpload.errors.unavailable');\n break;\n\n case 'request_entity_too_large':\n errorText = t('fileUpload.errors.tooLarge');\n break;\n\n case 'file_has_invalid_mime_type':\n errorText = t('fileUpload.errors.wrongType');\n break;\n\n case 'virus_found':\n errorText = t('fileUpload.errors.virusFound');\n break;\n\n default:\n errorText = t('fileUpload.errors.general');\n }\n\n dispatch({\n type: SET_UPLOAD_ERROR,\n fileId,\n errorText\n });\n });\n dispatch({\n type: REGISTER_UPLOAD,\n fileId,\n fileName: file.name,\n uploadHandle\n });\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_seamly_file_upload_context__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Provider, {\n value: onUploadFileHandler,\n children: children\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyFileUpload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-file-upload.js?");
1455
+ 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 _seamly_file_upload_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-file-upload-context */ \"./src/javascripts/ui/components/core/seamly-file-upload-context.js\");\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_id__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../lib/id */ \"./src/javascripts/lib/id.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 _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\nconst {\n REGISTER_UPLOAD,\n SET_UPLOAD_PROGRESS,\n SET_UPLOAD_ERROR,\n SET_UPLOAD_COMPLETE\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.seamlyActions;\n\nconst SeamlyFileUpload = ({\n children\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyDispatchContext)();\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyApiContext)();\n const {\n addUploadBubble\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyCommands)();\n\n const onUploadFileHandler = file => {\n const fileId = (0,_lib_id__WEBPACK_IMPORTED_MODULE_2__.randomId)();\n const uploadHandle = api.uploadFile(file, p => {\n dispatch({\n type: SET_UPLOAD_PROGRESS,\n fileId,\n progress: Math.ceil(p)\n });\n }, result => {\n const {\n id,\n transactionId,\n occurredAt,\n body: {\n contentType,\n filename,\n filesize,\n url\n }\n } = result.body;\n dispatch({\n type: SET_UPLOAD_COMPLETE,\n fileId\n });\n addUploadBubble(id, transactionId, occurredAt, contentType, filename, filesize, url);\n }, err => {\n const errorKey = err && err.body ? err.body.error : '';\n let errorText;\n\n switch (errorKey) {\n case 'file_uploads_are_disabled':\n errorText = t('fileUpload.errors.unavailable');\n break;\n\n case 'request_entity_too_large':\n errorText = t('fileUpload.errors.tooLarge');\n break;\n\n case 'file_has_invalid_mime_type':\n errorText = t('fileUpload.errors.wrongType');\n break;\n\n case 'virus_found':\n errorText = t('fileUpload.errors.virusFound');\n break;\n\n default:\n errorText = t('fileUpload.errors.general');\n }\n\n dispatch({\n type: SET_UPLOAD_ERROR,\n fileId,\n errorText\n });\n });\n dispatch({\n type: REGISTER_UPLOAD,\n fileId,\n fileName: file.name,\n uploadHandle\n });\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_seamly_file_upload_context__WEBPACK_IMPORTED_MODULE_0__[\"default\"].Provider, {\n value: onUploadFileHandler,\n children: children\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyFileUpload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-file-upload.js?");
1071
1456
 
1072
1457
  /***/ }),
1073
1458
 
@@ -1089,7 +1474,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1089
1474
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1090
1475
 
1091
1476
  "use strict";
1092
- 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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\n\n\n\nconst {\n UPDATE_CONFIG,\n SET_INITIAL_STATE,\n SET_SHOW_DISCLAIMER,\n SET_HEADER_SUB_TITLE,\n SET_FEATURES\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions;\n\nconst SeamlyInitializer = ({\n config\n}) => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyDispatchContext)();\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyApiContext)();\n const {\n initUserSelectedOptions\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyOptions)();\n const {\n setInterrupt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyInterrupt)();\n const seamlyInitialized = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n setVisibility\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyVisibility)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const seamlyConfig = (0,_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.getSeamlyConfig)(config);\n const {\n showDisclaimer\n } = config;\n const {\n agentName\n } = config.defaults || {};\n dispatch({\n type: UPDATE_CONFIG,\n config: seamlyConfig\n });\n dispatch({\n type: SET_SHOW_DISCLAIMER,\n showDisclaimer\n });\n\n if (agentName) {\n dispatch({\n type: SET_HEADER_SUB_TITLE,\n title: agentName\n });\n }\n }, [dispatch, config]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const initSeamly = async () => {\n seamlyInitialized.current = true;\n initUserSelectedOptions();\n setVisibility(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.visibilityStates.initialize);\n\n try {\n const {\n accountConfig = {},\n initialState = {}\n } = await api.getConfig();\n const {\n features\n } = accountConfig || {};\n dispatch({\n type: SET_FEATURES,\n features\n });\n dispatch({\n type: SET_INITIAL_STATE,\n initialState\n });\n } catch (error) {\n setInterrupt(error);\n }\n };\n\n if (api.connectionInfo && !seamlyInitialized.current) {\n initSeamly();\n }\n }, [api, dispatch, t, setInterrupt, initUserSelectedOptions, setVisibility]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyInitializer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-initializer.js?");
1477
+ 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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\n\n\n\n\nconst SeamlyInitializer = () => {\n const {\n initUserSelectedOptions\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyOptions)();\n const seamlyInitialized = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const {\n setVisibility\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyVisibility)();\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_3__.useConfig)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (config.api && !seamlyInitialized.current) {\n seamlyInitialized.current = true;\n initUserSelectedOptions();\n setVisibility(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.visibilityStates.initialize);\n }\n }, [initUserSelectedOptions, config, setVisibility]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyInitializer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-initializer.js?");
1093
1478
 
1094
1479
  /***/ }),
1095
1480
 
@@ -1100,7 +1485,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1100
1485
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1101
1486
 
1102
1487
  "use strict";
1103
- 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _seamly_api_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/index.js\");\n\n\n\n\n\n\nfunction useSeamlyInstanceFunction(functionName, fn, deps = []) {\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__.SeamlyEventBusContext);\n const callbackRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n callbackRef.current = fn;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!deps.every(Boolean)) {\n return undefined;\n }\n\n const callback = (...args) => {\n var _callbackRef$current;\n\n return (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef, ...args);\n };\n\n eventBus.emit('function.register', functionName, callback);\n return () => eventBus.emit('function.unregister', functionName, callback); // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [eventBus, functionName, ...deps]);\n}\n\nconst SeamlyInstanceFunctionsLoader = () => {\n const config = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConfig)();\n const {\n sendMessage,\n sendContext,\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const {\n setVisibility,\n visible\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\n const currentVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(visible);\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__.SeamlyEventBusContext);\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n const unreadCount = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const previousUnreadCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const previousVisibilityState = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n isInline,\n isResolving\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyLayoutMode)();\n const {\n hasInterrupt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyInterrupt)();\n const currentConversationUrl = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl)();\n const prevConversationUrl = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const onActivityHandler = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyActivityEventHandler)();\n const {\n enableTranslations,\n disableTranslations\n } = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n currentVisibility.current = visible;\n }, [visible]);\n useSeamlyInstanceFunction('askText', text => {\n sendMessage({\n body: text\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('setLocale', locale => {\n sendContext({\n locale\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('setVariables', variables => {\n sendContext({\n variables\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('getVisibility', callback => {\n if (callback) {\n callback(currentVisibility.current);\n } else {\n console.warn('A callback function is required for the getVisibility action.');\n }\n });\n useSeamlyInstanceFunction('setVisibility', visibilityState => {\n if (!Object.values(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates).includes(visibilityState)) {\n console.error('Requested visibility states should be \"open\", \"minimized\" ,\"hidden\" or null.');\n return;\n }\n\n onActivityHandler();\n\n if (config.layoutMode === 'inline' && visibilityState === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.minimized) {\n console.warn('Inline chat windows cannot be minimized.');\n } else {\n setVisibility(visibilityState);\n }\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('sendCustomAction', (actionType, body) => {\n sendAction({\n type: 'custom',\n body: {\n type: actionType,\n body\n }\n });\n }, [api.send]);\n useSeamlyInstanceFunction('setTopic', ({\n name,\n fallbackMessage\n }) => {\n if (name && fallbackMessage) {\n sendAction({\n type: 'set_topic',\n body: {\n name,\n fallbackMessage\n }\n });\n } else {\n console.warn('A name and a fallbackMessage are required for the setTopic action.');\n }\n }, [api.send]);\n useSeamlyInstanceFunction('setTranslation', ({\n enabled,\n locale\n }) => {\n if (enabled) {\n enableTranslations(locale);\n } else {\n disableTranslations();\n }\n }, [api.send]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isResolving && !hasInterrupt) {\n // Check for app reset\n if (prevConversationUrl.current && prevConversationUrl.current !== currentConversationUrl) {\n eventBus.emit('unreadMessageCount', unreadCount);\n } // Broadcast once on window open\n\n\n if (visible === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.open && visible !== previousVisibilityState.current) {\n if (previousUnreadCount.current !== 0) {\n eventBus.emit('unreadMessageCount', 0);\n }\n }\n\n if (visible !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.open && unreadCount !== previousUnreadCount.current) {\n eventBus.emit('unreadMessageCount', unreadCount);\n }\n\n previousVisibilityState.current = visible;\n previousUnreadCount.current = unreadCount;\n prevConversationUrl.current = currentConversationUrl;\n }\n }, [unreadCount, visible, eventBus, isInline, isResolving, hasInterrupt, currentConversationUrl]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyInstanceFunctionsLoader);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-instance-functions-loader.js?");
1488
+ 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _seamly_api_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.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 _domains_config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n\n\n\n\n\n\n\n\nfunction useSeamlyInstanceFunction(functionName, fn, deps = []) {\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__.SeamlyEventBusContext);\n const callbackRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n callbackRef.current = fn;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!deps.every(Boolean)) {\n return undefined;\n }\n\n const callback = (...args) => {\n var _callbackRef$current;\n\n return (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef, ...args);\n };\n\n eventBus.emit('function.register', functionName, callback);\n return () => eventBus.emit('function.unregister', functionName, callback); // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [eventBus, functionName, ...deps]);\n}\n\nconst SeamlyInstanceFunctionsLoader = () => {\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_6__.useConfig)();\n const {\n sendMessage,\n sendContext,\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const {\n setVisibility,\n visible\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\n const currentVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(visible);\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_seamly_api_context__WEBPACK_IMPORTED_MODULE_3__.SeamlyEventBusContext);\n const api = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n const unreadCount = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const previousUnreadCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const previousVisibilityState = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n isInline,\n isResolving\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyLayoutMode)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_5__.useInterrupt)();\n const currentConversationUrl = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl)();\n const prevConversationUrl = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const onActivityHandler = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyActivityEventHandler)();\n const {\n enableTranslations,\n disableTranslations\n } = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_4__.useTranslations)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n currentVisibility.current = visible;\n }, [visible]);\n useSeamlyInstanceFunction('askText', text => {\n sendMessage({\n body: text\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('setVariables', variables => {\n sendContext({\n variables\n });\n }, [api === null || api === void 0 ? void 0 : api.send]);\n useSeamlyInstanceFunction('getVisibility', callback => {\n if (callback) {\n callback(currentVisibility.current);\n } else {\n console.warn('A callback function is required for the getVisibility action.');\n }\n });\n useSeamlyInstanceFunction('setVisibility', visibilityState => {\n if (!Object.values(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates).includes(visibilityState)) {\n console.error('Requested visibility states should be \"open\", \"minimized\" ,\"hidden\" or null.');\n return;\n }\n\n onActivityHandler();\n\n if (config.layoutMode === 'inline' && visibilityState === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.minimized) {\n console.warn('Inline chat windows cannot be minimized.');\n } else {\n setVisibility(visibilityState);\n }\n }, [config === null || config === void 0 ? void 0 : config.api]);\n useSeamlyInstanceFunction('sendCustomAction', (actionType, body) => {\n sendAction({\n type: 'custom',\n body: {\n type: actionType,\n body\n }\n });\n }, [api.send]);\n useSeamlyInstanceFunction('setTopic', ({\n name,\n fallbackMessage\n }) => {\n if (name && fallbackMessage) {\n sendAction({\n type: 'set_topic',\n body: {\n name,\n fallbackMessage\n }\n });\n } else {\n console.warn('A name and a fallbackMessage are required for the setTopic action.');\n }\n }, [api.send]);\n useSeamlyInstanceFunction('setTranslation', ({\n enabled,\n locale\n }) => {\n if (enabled) {\n enableTranslations(locale);\n } else {\n disableTranslations();\n }\n }, [api.send]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isResolving && !hasInterrupt) {\n // Check for app reset\n if (prevConversationUrl.current && prevConversationUrl.current !== currentConversationUrl) {\n eventBus.emit('unreadMessageCount', unreadCount);\n } // Broadcast once on window open\n\n\n if (visible === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.open && visible !== previousVisibilityState.current) {\n if (previousUnreadCount.current !== 0) {\n eventBus.emit('unreadMessageCount', 0);\n }\n }\n\n if (visible !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_2__.visibilityStates.open && unreadCount !== previousUnreadCount.current) {\n eventBus.emit('unreadMessageCount', unreadCount);\n }\n\n previousVisibilityState.current = visible;\n previousUnreadCount.current = unreadCount;\n prevConversationUrl.current = currentConversationUrl;\n }\n }, [unreadCount, visible, eventBus, isInline, isResolving, hasInterrupt, currentConversationUrl]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyInstanceFunctionsLoader);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-instance-functions-loader.js?");
1104
1489
 
1105
1490
  /***/ }),
1106
1491
 
@@ -1133,7 +1518,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1133
1518
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1134
1519
 
1135
1520
  "use strict";
1136
- 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 _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config */ \"./src/javascripts/config.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\n\n\n\n\n\nconst SeamlyNewNotifications = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const events = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useEvents)();\n const previousEventCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const previousServerEventCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const isHistoryLoaded = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIsHistoryLoaded)();\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const {\n isOpen\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyVisibility)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const debounceFunc = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const notifyUnread = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)(eventArray => {\n const serverEventCount = eventArray.filter(({\n payload\n }) => !payload.fromClient && !payload.fromHistory).length;\n\n if (serverEventCount > previousServerEventCount.current) {\n sendPolite(t('message.srNewEventCount', {\n newCount: serverEventCount - previousServerEventCount.current\n }));\n previousServerEventCount.current = serverEventCount;\n }\n }, _config__WEBPACK_IMPORTED_MODULE_3__.newMessageScreenReaderWait), [sendPolite]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (events.length > previousEventCount.current) {\n if (isOpen) {\n debounceFunc.current = notifyUnread(events);\n }\n\n previousEventCount.current = events.length;\n }\n }, [events, notifyUnread, isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevIsOpen.current && !isOpen && debounceFunc.current) {\n debounceFunc.current(true);\n debounceFunc.current = null;\n }\n }, [isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isHistoryLoaded) {\n // Ensure that the live region has stabilised if this is\n // an effect of setting this on page load.\n setTimeout(() => {\n sendPolite(t('window.srTexts.onHistoryLoad'));\n }, 500);\n }\n }, [isHistoryLoaded, t, sendPolite]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyNewNotifications);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-new-notifications.js?");
1521
+ 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 _hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../hooks/seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config */ \"./src/javascripts/config.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\n\n\n\n\n\nconst SeamlyNewNotifications = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const events = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useEvents)();\n const previousEventCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const previousServerEventCount = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n const isHistoryLoaded = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIsHistoryLoaded)();\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const {\n isOpen\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyVisibility)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const debounceFunc = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const notifyUnread = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)(eventArray => {\n const serverEventCount = eventArray.filter(({\n payload\n }) => !payload.fromClient && !payload.fromHistory).length;\n\n if (serverEventCount > previousServerEventCount.current) {\n sendPolite(t('message.srNewEventCount', {\n newCount: serverEventCount - previousServerEventCount.current\n }));\n previousServerEventCount.current = serverEventCount;\n }\n }, _config__WEBPACK_IMPORTED_MODULE_3__.newMessageScreenReaderWait);\n }, [sendPolite, t]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (events.length > previousEventCount.current) {\n if (isOpen) {\n debounceFunc.current = notifyUnread(events);\n }\n\n previousEventCount.current = events.length;\n }\n }, [events, notifyUnread, isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevIsOpen.current && !isOpen && debounceFunc.current) {\n debounceFunc.current(true);\n debounceFunc.current = null;\n }\n }, [isOpen]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isHistoryLoaded) {\n // Ensure that the live region has stabilised if this is\n // an effect of setting this on page load.\n setTimeout(() => {\n sendPolite(t('window.srTexts.onHistoryLoad'));\n }, 500);\n }\n }, [isHistoryLoaded, t, sendPolite]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyNewNotifications);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-new-notifications.js?");
1137
1522
 
1138
1523
  /***/ }),
1139
1524
 
@@ -1144,7 +1529,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1144
1529
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1145
1530
 
1146
1531
  "use strict";
1147
- 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_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.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 _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../config */ \"./src/javascripts/config.js\");\n\n\n\n\n\n\nconst {\n SET_EVENTS_READ\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.seamlyActions;\n\nconst SeamlyReadState = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const events = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useEvents)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyDispatchContext)();\n const {\n isOpen,\n isVisible\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\n const {\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const unreadCount = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useLiveRegion)();\n const sendLive = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)(sendPolite, _config__WEBPACK_IMPORTED_MODULE_5__.unreadScreenReaderWait), [sendPolite]);\n const prevIsVisible = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const cancelSend = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isOpen) {\n return;\n }\n\n const unread = events.filter(event => {\n return (0,_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.isUnreadMessage)(event) && event.payload.messageStatus === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.readStates.received;\n }).map(event => event.payload.id);\n\n if (unread.length > 0) {\n dispatch({\n type: SET_EVENTS_READ,\n ids: unread\n });\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.read,\n events: unread\n });\n }\n }, [events, dispatch, isOpen, sendAction]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevIsVisible.current !== isVisible && !isVisible && cancelSend.current) {\n cancelSend.current();\n }\n\n if (unreadCount !== 0 && !isOpen && isVisible) {\n cancelSend.current = sendLive(t('message.srTextUnreadCount', {\n unreadCount\n }));\n }\n\n prevIsVisible.current = isVisible;\n }, [unreadCount, isOpen, isVisible, sendLive, t]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyReadState);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-read-state.js?");
1532
+ 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_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.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 _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../config */ \"./src/javascripts/config.js\");\n\n\n\n\n\n\nconst {\n SET_EVENTS_READ\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.seamlyActions;\n\nconst SeamlyReadState = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const events = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useEvents)();\n const dispatch = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyDispatchContext)();\n const {\n isOpen,\n isVisible\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\n const {\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCommands)();\n const unreadCount = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useLiveRegion)();\n const sendLive = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)(sendPolite, _config__WEBPACK_IMPORTED_MODULE_5__.unreadScreenReaderWait), [sendPolite]);\n const prevIsVisible = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const cancelSend = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isOpen) {\n return;\n }\n\n const unread = events.filter(event => {\n return (0,_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.isUnreadMessage)(event) && event.payload.messageStatus === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.readStates.received;\n }).map(event => event.payload.id);\n\n if (unread.length > 0) {\n dispatch({\n type: SET_EVENTS_READ,\n ids: unread\n });\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_3__.actionTypes.read,\n events: unread\n });\n }\n }, [events, dispatch, isOpen, sendAction]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevIsVisible.current !== isVisible && !isVisible && cancelSend.current) {\n cancelSend.current();\n }\n\n if (unreadCount !== 0 && !isOpen && isVisible) {\n cancelSend.current = sendLive(t('message.srTextUnreadCount', {\n unreadCount\n }));\n }\n\n prevIsVisible.current = isVisible;\n }, [unreadCount, isOpen, isVisible, sendLive, t]);\n return null;\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SeamlyReadState);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/core/seamly-read-state.js?");
1148
1533
 
1149
1534
  /***/ }),
1150
1535
 
@@ -1155,7 +1540,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1155
1540
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1156
1541
 
1157
1542
  "use strict";
1158
- 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 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__);\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\nconst EntryContainer = () => {\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyConfig)();\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_10__.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_10__.jsx)(_warnings_idle_detach_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}), showResumeConversationPrompt && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_warnings_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.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 && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_upload_toggle__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.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?");
1543
+ 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 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__);\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 EntryContainer = () => {\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_11__.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_11__.jsx)(_warnings_idle_detach_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {}), showResumeConversationPrompt && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_warnings_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.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 && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_upload_toggle__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.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?");
1159
1544
 
1160
1545
  /***/ }),
1161
1546
 
@@ -1166,7 +1551,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1166
1551
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1167
1552
 
1168
1553
  "use strict";
1169
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useCharacterLimit\": () => (/* binding */ useCharacterLimit)\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 _hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.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 _utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n\n\n\n\n\n\n\nfunction useCharacterLimit(controlName) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n sendAssertive\n } = (0,_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const {\n hasLimit,\n limit\n } = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_3__.useEntryTextLimit)();\n const debouncedSendAssertive = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)(sendAssertive, _config__WEBPACK_IMPORTED_MODULE_5__.maxCharacterSrDebounceDelay), [sendAssertive]);\n const validateLimit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)((_reachedCharacterWarning, _remainingChars) => {\n if (_reachedCharacterWarning) {\n debouncedSendAssertive(t('input.srCharacterLimitText', _remainingChars));\n }\n }, _config__WEBPACK_IMPORTED_MODULE_5__.maxCharacterSrDebounceDelay);\n }, [debouncedSendAssertive, t]);\n const [{\n value\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_6__.useFormControl)(controlName);\n const remainingChars = hasLimit && value ? limit - value.length : limit;\n const reachedCharacterWarning = hasLimit ? remainingChars <= _config__WEBPACK_IMPORTED_MODULE_5__.maxCharacterWarningLimit : false;\n const reachedCharacterLimit = hasLimit ? remainingChars < 0 : false;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n validateLimit(reachedCharacterWarning, remainingChars);\n }, [reachedCharacterWarning, remainingChars, validateLimit]);\n return {\n hasCharacterLimit: hasLimit,\n characterLimit: limit,\n reachedCharacterWarning,\n reachedCharacterLimit,\n remainingChars\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/text-entry/hooks.js?");
1554
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useCharacterLimit\": () => (/* binding */ useCharacterLimit)\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 _hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.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 _utils_general_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n\n\n\n\n\n\n\nfunction useCharacterLimit(controlName) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n sendAssertive\n } = (0,_hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const {\n hasLimit,\n limit\n } = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_3__.useEntryTextLimit)();\n const debouncedSendAssertive = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)(sendAssertive, _config__WEBPACK_IMPORTED_MODULE_5__.maxCharacterSrDebounceDelay), [sendAssertive]);\n const validateLimit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n return (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_4__.debounce)((_reachedCharacterWarning, _remainingChars) => {\n if (_reachedCharacterWarning) {\n debouncedSendAssertive(t('input.srCharacterLimitText', {\n limit: _remainingChars\n }));\n }\n }, _config__WEBPACK_IMPORTED_MODULE_5__.maxCharacterSrDebounceDelay);\n }, [debouncedSendAssertive, t]);\n const [{\n value\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_6__.useFormControl)(controlName);\n const remainingChars = hasLimit && value ? limit - value.length : limit;\n const reachedCharacterWarning = hasLimit ? remainingChars <= _config__WEBPACK_IMPORTED_MODULE_5__.maxCharacterWarningLimit : false;\n const reachedCharacterLimit = hasLimit ? remainingChars < 0 : false;\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n validateLimit(reachedCharacterWarning, remainingChars);\n }, [reachedCharacterWarning, remainingChars, validateLimit]);\n return {\n hasCharacterLimit: hasLimit,\n characterLimit: limit,\n reachedCharacterWarning,\n reachedCharacterLimit,\n remainingChars\n };\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/text-entry/hooks.js?");
1170
1555
 
1171
1556
  /***/ }),
1172
1557
 
@@ -1188,7 +1573,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1188
1573
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1189
1574
 
1190
1575
  "use strict";
1191
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TextEntryForm)\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 _layout_icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _form_controls_form__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _form_controls_input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../form-controls/input */ \"./src/javascripts/ui/components/form-controls/input.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/ui/components/entry/text-entry/hooks.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/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\nfunction TextEntryForm({\n controlName,\n skipLinkId\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_8__.useI18n)();\n const {\n sendAssertive\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const {\n emitEvent\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const handleKeyUp = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyTyping)();\n const {\n setBlockAutoEntrySwitch\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyEntry)(); // TODO: Standardize the validation on form fields\n\n const {\n hasCharacterLimit,\n characterLimit,\n reachedCharacterWarning,\n reachedCharacterLimit,\n remainingChars\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useCharacterLimit)(controlName);\n const [{\n value\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_4__.useFormControl)(controlName);\n const hasValue = !!value;\n const handleFocus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (reachedCharacterWarning) {\n sendAssertive(t('input.srCharacterLimitText', remainingChars));\n }\n\n emitEvent('ui.inputFocus');\n }, [t, sendAssertive, reachedCharacterWarning, remainingChars, emitEvent]);\n const placeholder = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => t('input.inputPlaceholder', hasCharacterLimit ? characterLimit : null), [t, hasCharacterLimit, characterLimit]);\n const labelText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => t('input.inputLabel', hasCharacterLimit ? characterLimit : null), [t, hasCharacterLimit, characterLimit]); // When the input holds a value, the component should be blocked from switching\n // to file upload form.\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n setBlockAutoEntrySwitch(hasValue);\n return () => {\n setBlockAutoEntrySwitch(false);\n };\n }, [setBlockAutoEntrySwitch, hasValue]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(_form_controls_form__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('input', 'input--text'),\n noValidate: \"true\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['input--text__container', ...(reachedCharacterWarning && !reachedCharacterLimit ? ['character-warning'] : []), ...(reachedCharacterLimit ? ['character-exceeded'] : [])]),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_form_controls_input__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n id: skipLinkId,\n type: \"text\",\n name: controlName,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('input__text'),\n autocomplete: \"off\",\n placeholder: placeholder,\n labelText: labelText,\n labelClass: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('visually-hidden'),\n \"aria-invalid\": hasCharacterLimit ? reachedCharacterLimit : null,\n onKeyUp: handleKeyUp,\n onFocus: handleFocus\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('character-count'),\n children: reachedCharacterWarning && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n children: remainingChars\n })\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'input__submit'),\n type: \"submit\",\n disabled: !hasValue || reachedCharacterLimit,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"send\",\n size: \"32\",\n alt: t('input.sendMessage')\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/text-entry/text-entry-form.js?");
1576
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TextEntryForm)\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 _layout_icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _form_controls_form__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _form_controls_input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../form-controls/input */ \"./src/javascripts/ui/components/form-controls/input.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./hooks */ \"./src/javascripts/ui/components/entry/text-entry/hooks.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/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\nfunction TextEntryForm({\n controlName,\n skipLinkId\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_8__.useI18n)();\n const {\n sendAssertive\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const {\n emitEvent\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const handleKeyUp = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyTyping)();\n const {\n setBlockAutoEntrySwitch\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyEntry)(); // TODO: Standardize the validation on form fields\n\n const {\n hasCharacterLimit,\n characterLimit,\n reachedCharacterWarning,\n reachedCharacterLimit,\n remainingChars\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_7__.useCharacterLimit)(controlName);\n const [{\n value\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_4__.useFormControl)(controlName);\n const hasValue = !!value;\n const handleFocus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (reachedCharacterWarning) {\n sendAssertive(t('input.srCharacterLimitText', {\n limit: remainingChars\n }));\n }\n\n emitEvent('ui.inputFocus');\n }, [t, sendAssertive, reachedCharacterWarning, remainingChars, emitEvent]);\n const placeholder = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => t('input.inputPlaceholder', {\n hasLimit: hasCharacterLimit,\n limit: hasCharacterLimit ? characterLimit : null\n }), [t, hasCharacterLimit, characterLimit]);\n const labelText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => t('input.inputLabel', {\n hasLimit: hasCharacterLimit,\n limit: hasCharacterLimit ? characterLimit : null\n }), [t, hasCharacterLimit, characterLimit]); // When the input holds a value, the component should be blocked from switching\n // to file upload form.\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n setBlockAutoEntrySwitch(hasValue);\n return () => {\n setBlockAutoEntrySwitch(false);\n };\n }, [setBlockAutoEntrySwitch, hasValue]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(_form_controls_form__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('input', 'input--text'),\n noValidate: \"true\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['input--text__container', ...(reachedCharacterWarning && !reachedCharacterLimit ? ['character-warning'] : []), ...(reachedCharacterLimit ? ['character-exceeded'] : [])]),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_form_controls_input__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n id: skipLinkId,\n type: \"text\",\n name: controlName,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('input__text'),\n autocomplete: \"off\",\n placeholder: placeholder,\n labelText: labelText,\n labelClass: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('visually-hidden'),\n \"aria-invalid\": hasCharacterLimit ? reachedCharacterLimit : null,\n onKeyUp: handleKeyUp,\n onFocus: handleFocus\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('character-count'),\n children: reachedCharacterWarning && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"span\", {\n children: remainingChars\n })\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'input__submit'),\n type: \"submit\",\n disabled: !hasValue || reachedCharacterLimit,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"send\",\n size: \"32\",\n alt: t('input.sendMessage')\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/text-entry/text-entry-form.js?");
1192
1577
 
1193
1578
  /***/ }),
1194
1579
 
@@ -1199,7 +1584,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1199
1584
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1200
1585
 
1201
1586
  "use strict";
1202
- 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 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\n\nconst ToggleButton = ({\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyVisibility)();\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 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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyInterrupt)();\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 onMouseUpHandler = () => {\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 };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n id: titleId,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.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_4__.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_4__.jsx)(\"button\", {\n type: \"button\",\n \"aria-labelledby\": titleId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button__button'),\n onClick: onOpenChat,\n ref: buttonRef,\n onMouseUp: onMouseUpHandler\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ToggleButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/toggle-button.js?");
1587
+ 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 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 ToggleButton = ({\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyVisibility)();\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_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('toggle-button'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n id: titleId,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.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_5__.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_5__.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__ = (ToggleButton);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/toggle-button.js?");
1203
1588
 
1204
1589
  /***/ }),
1205
1590
 
@@ -1221,7 +1606,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1221
1606
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1222
1607
 
1223
1608
  "use strict";
1224
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FileInputForm)\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 _form_controls_form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _form_controls_file_input__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../form-controls/file-input */ \"./src/javascripts/ui/components/form-controls/file-input.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_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/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\nfunction FileInputForm({\n skiplinkId,\n controlName,\n accept,\n contentHint,\n isUploading,\n isComplete,\n onClickCancel\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const [{\n value: fileList\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_4__.useFormControl)(controlName);\n const selectedFileName = fileList && fileList.length > 0 ? fileList[0].name : '';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_form_controls_form__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('input', 'input--file'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_form_controls_file_input__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: controlName,\n id: skiplinkId,\n accept: accept,\n labelText: t('fileUpload.labelText'),\n outputText: t('fileUpload.selectedText', selectedFileName),\n contentHint: contentHint\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('upload__button-container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n id: isUploading || !isComplete ? skiplinkId : undefined,\n type: \"button\",\n onClick: onClickCancel,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--secondary', 'upload__cancel'),\n children: t('fileUpload.cancelButtonText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary'),\n type: \"submit\",\n children: t('fileUpload.uploadButtonText')\n })]\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/upload/file-upload-form.js?");
1609
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FileInputForm)\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 _form_controls_form__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _form_controls_file_input__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../form-controls/file-input */ \"./src/javascripts/ui/components/form-controls/file-input.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_forms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/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\nfunction FileInputForm({\n skiplinkId,\n controlName,\n accept,\n contentHint,\n isUploading,\n isComplete,\n onClickCancel\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const [{\n value: fileList\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_4__.useFormControl)(controlName);\n const hasFile = fileList && fileList.length > 0;\n const selectedFileName = hasFile ? fileList[0].name : '';\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_form_controls_form__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('input', 'input--file'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_form_controls_file_input__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: controlName,\n id: skiplinkId,\n accept: accept,\n labelText: t('fileUpload.labelText'),\n outputText: t('fileUpload.selectedText', {\n hasFile,\n filename: selectedFileName\n }),\n contentHint: contentHint\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('upload__button-container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n id: isUploading || !isComplete ? skiplinkId : undefined,\n type: \"button\",\n onClick: onClickCancel,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--secondary', 'upload__cancel'),\n children: t('fileUpload.cancelButtonText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"button\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary'),\n type: \"submit\",\n children: t('fileUpload.uploadButtonText')\n })]\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/upload/file-upload-form.js?");
1225
1610
 
1226
1611
  /***/ }),
1227
1612
 
@@ -1232,7 +1617,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1232
1617
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1233
1618
 
1234
1619
  "use strict";
1235
- 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 _hooks_use_single_file_upload__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../hooks/use-single-file-upload */ \"./src/javascripts/ui/hooks/use-single-file-upload.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 _utils_general_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _widgets_upload_progress__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../widgets/upload-progress */ \"./src/javascripts/ui/components/widgets/upload-progress.js\");\n/* harmony import */ var _file_upload_form__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./file-upload-form */ \"./src/javascripts/ui/components/entry/upload/file-upload-form.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _utils_form_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../utils/form-utils */ \"./src/javascripts/ui/utils/form-utils.js\");\n/* harmony import */ var _utils_validations__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../utils/validations */ \"./src/javascripts/ui/utils/validations.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\nconst formName = 'fileListForm';\nconst fileInputName = 'fileList';\n\nconst Upload = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const {\n sendPolite,\n sendAssertive\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const skiplinkTargetId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplink)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing)(); // This hook should be refactored at some point\n\n const {\n serviceAllowsUploads,\n allowedMimeTypes,\n maxSize\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useFileUploadMeta)();\n const cancelButtonRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const canUpload = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(serviceAllowsUploads);\n const {\n cancelEntrySelection\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyEntry)();\n const {\n uploadFile,\n clearUploads,\n isUploading,\n isComplete\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useFileUploads)();\n const hasError = false;\n const {\n selectedFileName,\n uploadHandle,\n hasServerError,\n progress\n } = (0,_hooks_use_single_file_upload__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(formName, fileInputName);\n const notificationId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const prevIsComplete = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(true);\n const contentHintText = t('fileUpload.contentHint', (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_5__.formatBytes)(maxSize));\n const prevContentHintText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)('');\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevContentHintText.current && containerRef.current.contains(document.activeElement) && document.activeElement.tagName === 'INPUT') {\n sendAssertive(contentHintText);\n }\n\n prevContentHintText.current = contentHintText;\n }, [contentHintText, sendAssertive]); // a11y\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (progress > 0) {\n switch (progress) {\n case 1:\n sendPolite(t('fileUpload.srStartedText'));\n break;\n\n default:\n sendPolite(`${progress}%`);\n }\n }\n }, [progress, sendPolite, t]); // reset form when uploads are complete\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!prevIsComplete.current && !isUploading && isComplete) {\n clearUploads();\n cancelEntrySelection();\n focusSkiplinkTarget(); // This timeout is set as testing in VoiceOver revealed that 300 ms is needed for\n // the live region to resolve in this case.\n\n setTimeout(() => {\n sendPolite(t('fileUpload.srCompleteText'));\n }, 300);\n }\n\n prevIsComplete.current = isComplete;\n }, [isUploading, isComplete, clearUploads, cancelEntrySelection, focusSkiplinkTarget, sendPolite, t]);\n const handleSubmit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n fileList\n }) => {\n uploadFile(fileList[0]);\n\n if (!hasError) {\n focusSkiplinkTarget();\n }\n }, [uploadFile, hasError, focusSkiplinkTarget]);\n const handleOnClickCancel = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (uploadHandle) {\n uploadHandle.abort();\n }\n\n clearUploads();\n cancelEntrySelection();\n focusSkiplinkTarget();\n }, [uploadHandle, clearUploads, cancelEntrySelection, focusSkiplinkTarget]);\n const validationSchema = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n [fileInputName]: [// For now this is fine, but this shouldn't be a validation on the field itself\n (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_9__.getValidator)(() => serviceAllowsUploads, t('fileUpload.errors.unavailable')), (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_9__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_10__.fileListObjectIsNotEmpty, t('fileUpload.errors.noFile')), (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_9__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_10__.validateFileSize, t('fileUpload.errors.tooLarge'), maxSize)]\n }), [maxSize, serviceAllowsUploads, t]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['upload', ...(hasError || hasServerError ? ['upload--error'] : [])]),\n ref: containerRef,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_domains_forms__WEBPACK_IMPORTED_MODULE_8__.FormProvider, {\n formId: formName,\n persistData: true,\n onSubmit: handleSubmit,\n validationSchema: validationSchema,\n children: [(isUploading || !isComplete) && (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_upload_progress__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__button-container'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"button\", {\n id: isUploading || !isComplete ? skiplinkTargetId : undefined,\n type: \"button\",\n onClick: handleOnClickCancel,\n ref: cancelButtonRef,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary', 'upload__cancel'),\n children: t('fileUpload.cancelButtonText')\n })\n })]\n }), !isUploading && isComplete && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_file_upload_form__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n controlName: fileInputName,\n skiplinkId: skiplinkTargetId,\n accept: allowedMimeTypes.join(', '),\n contentHint: contentHintText,\n isComplete: isComplete,\n isUploading: isUploading,\n outputText: t('fileUpload.selectedText', selectedFileName),\n onClickCancel: handleOnClickCancel\n }), !canUpload.current && (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)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('notification'),\n id: notificationId,\n children: t('fileUpload.unavailableText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__button-container'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"button\", {\n id: isUploading || !isComplete ? skiplinkTargetId : undefined,\n type: \"button\",\n onClick: handleOnClickCancel,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary', 'upload__cancel'),\n children: t('fileUpload.cancelButtonText')\n })\n })]\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Upload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/upload/index.js?");
1620
+ 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 _hooks_use_single_file_upload__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../hooks/use-single-file-upload */ \"./src/javascripts/ui/hooks/use-single-file-upload.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 _utils_general_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _widgets_upload_progress__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../widgets/upload-progress */ \"./src/javascripts/ui/components/widgets/upload-progress.js\");\n/* harmony import */ var _file_upload_form__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./file-upload-form */ \"./src/javascripts/ui/components/entry/upload/file-upload-form.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _utils_form_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../utils/form-utils */ \"./src/javascripts/ui/utils/form-utils.js\");\n/* harmony import */ var _utils_validations__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../utils/validations */ \"./src/javascripts/ui/utils/validations.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\nconst formName = 'fileListForm';\nconst fileInputName = 'fileList';\n\nconst Upload = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.useI18n)();\n const {\n sendPolite,\n sendAssertive\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const skiplinkTargetId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplink)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing)(); // This hook should be refactored at some point\n\n const {\n serviceAllowsUploads,\n allowedMimeTypes,\n maxSize\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useFileUploadMeta)();\n const cancelButtonRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const canUpload = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(serviceAllowsUploads);\n const {\n cancelEntrySelection\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyEntry)();\n const {\n uploadFile,\n clearUploads,\n isUploading,\n isComplete\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useFileUploads)();\n const hasError = false;\n const {\n hasFile,\n selectedFileName,\n uploadHandle,\n hasServerError,\n progress\n } = (0,_hooks_use_single_file_upload__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(formName, fileInputName);\n const notificationId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const prevIsComplete = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(true);\n const contentHintText = t('fileUpload.contentHint', {\n size: (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_5__.formatBytes)(maxSize)\n });\n const prevContentHintText = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)('');\n const containerRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (prevContentHintText.current && containerRef.current.contains(document.activeElement) && document.activeElement.tagName === 'INPUT') {\n sendAssertive(contentHintText);\n }\n\n prevContentHintText.current = contentHintText;\n }, [contentHintText, sendAssertive]); // a11y\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (progress > 0) {\n switch (progress) {\n case 1:\n sendPolite(t('fileUpload.srStartedText'));\n break;\n\n default:\n sendPolite(`${progress}%`);\n }\n }\n }, [progress, sendPolite, t]); // reset form when uploads are complete\n\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!prevIsComplete.current && !isUploading && isComplete) {\n clearUploads();\n cancelEntrySelection();\n focusSkiplinkTarget(); // This timeout is set as testing in VoiceOver revealed that 300 ms is needed for\n // the live region to resolve in this case.\n\n setTimeout(() => {\n sendPolite(t('fileUpload.srCompleteText'));\n }, 300);\n }\n\n prevIsComplete.current = isComplete;\n }, [isUploading, isComplete, clearUploads, cancelEntrySelection, focusSkiplinkTarget, sendPolite, t]);\n const handleSubmit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n fileList\n }) => {\n uploadFile(fileList[0]);\n\n if (!hasError) {\n focusSkiplinkTarget();\n }\n }, [uploadFile, hasError, focusSkiplinkTarget]);\n const handleOnClickCancel = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (uploadHandle) {\n uploadHandle.abort();\n }\n\n clearUploads();\n cancelEntrySelection();\n focusSkiplinkTarget();\n }, [uploadHandle, clearUploads, cancelEntrySelection, focusSkiplinkTarget]);\n const validationSchema = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n [fileInputName]: [// For now this is fine, but this shouldn't be a validation on the field itself\n (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_9__.getValidator)(() => serviceAllowsUploads, t('fileUpload.errors.unavailable')), (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_9__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_10__.fileListObjectIsNotEmpty, t('fileUpload.errors.noFile')), (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_9__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_10__.validateFileSize, t('fileUpload.errors.tooLarge'), maxSize)]\n }), [maxSize, serviceAllowsUploads, t]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['upload', ...(hasError || hasServerError ? ['upload--error'] : [])]),\n ref: containerRef,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsxs)(_domains_forms__WEBPACK_IMPORTED_MODULE_8__.FormProvider, {\n formId: formName,\n persistData: true,\n onSubmit: handleSubmit,\n validationSchema: validationSchema,\n children: [(isUploading || !isComplete) && (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_upload_progress__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__button-container'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"button\", {\n id: isUploading || !isComplete ? skiplinkTargetId : undefined,\n type: \"button\",\n onClick: handleOnClickCancel,\n ref: cancelButtonRef,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary', 'upload__cancel'),\n children: t('fileUpload.cancelButtonText')\n })\n })]\n }), !isUploading && isComplete && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(_file_upload_form__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n controlName: fileInputName,\n skiplinkId: skiplinkTargetId,\n accept: allowedMimeTypes.join(', '),\n contentHint: contentHintText,\n isComplete: isComplete,\n isUploading: isUploading,\n outputText: t('fileUpload.selectedText', {\n hasFile,\n filename: selectedFileName\n }),\n onClickCancel: handleOnClickCancel\n }), !canUpload.current && (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)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('notification'),\n id: notificationId,\n children: t('fileUpload.unavailableText')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__button-container'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_11__.jsx)(\"button\", {\n id: isUploading || !isComplete ? skiplinkTargetId : undefined,\n type: \"button\",\n onClick: handleOnClickCancel,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--secondary', 'upload__cancel'),\n children: t('fileUpload.cancelButtonText')\n })\n })]\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Upload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/entry/upload/index.js?");
1236
1621
 
1237
1622
  /***/ }),
1238
1623
 
@@ -1243,7 +1628,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1243
1628
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1244
1629
 
1245
1630
  "use strict";
1246
- 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_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../hooks/seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _hooks_live_region_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _hooks_use_seamly_interrupt__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../hooks/use-seamly-interrupt */ \"./src/javascripts/ui/hooks/use-seamly-interrupt.js\");\n/* harmony import */ var _hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_12__ = __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_13__ = __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_14__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../widgets/in-out-transition */ \"./src/javascripts/ui/components/widgets/in-out-transition.js\");\n/* harmony import */ var _domains_translations__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../domains/translations */ \"./src/javascripts/domains/translations/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_14__.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_10__.useLiveRegion)();\n const {\n hasInterrupt\n } = (0,_hooks_use_seamly_interrupt__WEBPACK_IMPORTED_MODULE_11__[\"default\"])();\n const {\n hasCountdown,\n endCountdown\n } = (0,_hooks_use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_12__[\"default\"])();\n const {\n hasPrompt,\n continueChat\n } = (0,_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_13__[\"default\"])();\n const lastFaqEventPayload = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_6__.useSeamlyServiceData)('suggestion');\n const [eventBody] = (0,_domains_translations__WEBPACK_IMPORTED_MODULE_16__.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,_hooks_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyHasUserResponded)();\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_15__[\"default\"], {\n isActive: showFaqContainer,\n transitionStartState: _widgets_in_out_transition__WEBPACK_IMPORTED_MODULE_15__.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?");
1631
+ 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?");
1632
+
1633
+ /***/ }),
1634
+
1635
+ /***/ "./src/javascripts/ui/components/form-controls/error.js":
1636
+ /*!**************************************************************!*\
1637
+ !*** ./src/javascripts/ui/components/form-controls/error.js ***!
1638
+ \**************************************************************/
1639
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1640
+
1641
+ "use strict";
1642
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Error)\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 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\nfunction Error({\n id,\n error\n}) {\n const [isAvailable, setIsAvailable] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const timerId = setTimeout(() => setIsAvailable(true), 300); // 300 = magic number, could be less or more\n\n return () => clearTimeout(timerId); // clear timer if error is mounted+unmounted within 300\n }, []);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n \"aria-live\": \"assertive\",\n \"aria-atomic\": \"true\",\n children: isAvailable && error && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"span\", {\n id: id,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('error'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n name: \"error\",\n size: \"16\"\n }), error]\n })\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/form-controls/error.js?");
1247
1643
 
1248
1644
  /***/ }),
1249
1645
 
@@ -1254,7 +1650,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1254
1650
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1255
1651
 
1256
1652
  "use strict";
1257
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FileInput)\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_forms__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _layout_icon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.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\nfunction FileInput({\n id,\n name,\n labelText,\n contentHint,\n outputText,\n accept\n}) {\n const {\n isSubmitted\n } = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_3__.useFormContext)();\n const [focusWithin, setFocusWithin] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [{\n onInput,\n onBlur\n }, {\n error\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_3__.useFormControl)(name);\n const errorId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const contentHintId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const outputId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const hasError = isSubmitted && error;\n const describedByIds = [outputId];\n\n if (contentHint) {\n describedByIds.push(contentHintId);\n }\n\n if (hasError) {\n describedByIds.push(errorId);\n }\n\n const handleFocus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n setFocusWithin(true);\n }, [setFocusWithin]);\n const handleBlur = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n setFocusWithin(false);\n onBlur();\n }, [setFocusWithin, onBlur]);\n const handleChange = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {\n const customEvent = {\n target: {\n value: e.target.files\n }\n };\n onInput(customEvent);\n }, [onInput]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__container'),\n children: [contentHint && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__content-hint'),\n id: contentHintId,\n children: contentHint\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n \"aria-live\": \"assertive\",\n \"aria-atomic\": \"true\",\n children: hasError && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"span\", {\n id: errorId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('error'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n name: \"error\",\n size: \"16\"\n }), error]\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['file-upload', ...(focusWithin ? ['focus-within'] : [])]),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"label\", {\n htmlFor: id,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__label'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n name: \"upload\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"div\", {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['upload__label--text']),\n children: labelText\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"input\", {\n id: id,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__input'),\n type: \"file\",\n name: name,\n onChange: handleChange,\n \"aria-invalid\": hasError ? 'true' : 'false',\n \"aria-describedby\": describedByIds.join(' '),\n accept: accept || null,\n onFocus: handleFocus,\n onBlur: handleBlur\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__output'),\n \"aria-hidden\": \"true\",\n id: outputId,\n children: outputText\n })]\n })]\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/form-controls/file-input.js?");
1653
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FileInput)\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_forms__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _layout_icon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.js\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./error */ \"./src/javascripts/ui/components/form-controls/error.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\nfunction FileInput({\n id,\n name,\n labelText,\n contentHint,\n outputText,\n accept\n}) {\n const {\n isSubmitted\n } = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_3__.useFormContext)();\n const [focusWithin, setFocusWithin] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n const [{\n onInput,\n onBlur\n }, {\n error\n }] = (0,_domains_forms__WEBPACK_IMPORTED_MODULE_3__.useFormControl)(name);\n const errorId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const contentHintId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const outputId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const hasError = isSubmitted && error;\n const describedByIds = [outputId];\n\n if (contentHint) {\n describedByIds.push(contentHintId);\n }\n\n if (hasError) {\n describedByIds.push(errorId);\n }\n\n const handleFocus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n setFocusWithin(true);\n }, [setFocusWithin]);\n const handleBlur = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n setFocusWithin(false);\n onBlur();\n }, [setFocusWithin, onBlur]);\n const handleChange = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {\n const customEvent = {\n target: {\n value: e.target.files\n }\n };\n onInput(customEvent);\n }, [onInput]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__container'),\n children: [contentHint && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__content-hint'),\n id: contentHintId,\n children: contentHint\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_error__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n id: errorId,\n error: hasError && error\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['file-upload', ...(focusWithin ? ['focus-within'] : [])]),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"label\", {\n htmlFor: id,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__label'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n name: \"upload\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(['upload__label--text']),\n children: labelText\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"input\", {\n id: id,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__input'),\n type: \"file\",\n name: name,\n onChange: handleChange,\n \"aria-invalid\": hasError ? 'true' : 'false',\n \"aria-describedby\": describedByIds.join(' '),\n accept: accept || null,\n onFocus: handleFocus,\n onBlur: handleBlur\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('upload__output'),\n \"aria-hidden\": \"true\",\n id: outputId,\n children: outputText\n })]\n })]\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/form-controls/file-input.js?");
1258
1654
 
1259
1655
  /***/ }),
1260
1656
 
@@ -1298,7 +1694,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1298
1694
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1299
1695
 
1300
1696
  "use strict";
1301
- 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_icon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.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__);\n\n\n\n\n\n\nconst FormControlWrapper = ({\n contentHint,\n id,\n labelText,\n labelClass = (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('label'),\n validity,\n errorText,\n children\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"label\", {\n htmlFor: id,\n className: labelClass,\n children: labelText\n }), contentHint && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"span\", {\n id: `${id}-content-hint`,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('input__content-hint'),\n children: contentHint\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"div\", {\n \"aria-live\": \"assertive\",\n \"aria-atomic\": \"true\",\n children: !validity && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)(\"span\", {\n id: `${id}-error`,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('error'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n name: \"error\",\n size: \"16\"\n }), errorText]\n })\n }), children]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormControlWrapper);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/form-controls/wrapper.js?");
1697
+ 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 _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ \"./src/javascripts/ui/components/form-controls/error.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__);\n\n\n\n\n\n\nconst FormControlWrapper = ({\n contentHint,\n id,\n labelText,\n labelClass = (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('label'),\n validity,\n errorText,\n children\n}) => {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"label\", {\n htmlFor: id,\n className: labelClass,\n children: labelText\n }), contentHint && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(\"span\", {\n id: `${id}-content-hint`,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('input__content-hint'),\n children: contentHint\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_error__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: `${id}-error`,\n error: !validity && errorText\n }), children]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormControlWrapper);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/form-controls/wrapper.js?");
1302
1698
 
1303
1699
  /***/ }),
1304
1700
 
@@ -1309,7 +1705,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1309
1705
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1310
1706
 
1311
1707
  "use strict";
1312
- 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 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\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\n const currentAgent = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyCurrentAgent)();\n const {\n hasInterrupt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyInterrupt)();\n const {\n defaults\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConfig)();\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_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.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_4__.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_4__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.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_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.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_4__.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?");
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 _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 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 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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\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_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.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_6__.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_6__.jsx)(_icon__WEBPACK_IMPORTED_MODULE_0__[\"default\"], {\n name: \"avatar\",\n size: \"32\"\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.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_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_2__.className)('agent-info__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.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_6__.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?");
1313
1709
 
1314
1710
  /***/ }),
1315
1711
 
@@ -1320,7 +1716,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1320
1716
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1321
1717
 
1322
1718
  "use strict";
1323
- 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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 AppFrame = ({\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyVisibility)();\n const {\n context,\n zIndex,\n showFaq\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyConfig)();\n const {\n isModal,\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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyHasUserResponded)();\n const [blockLang, setBlockLang] = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useState)(undefined);\n const {\n locale\n } = context || {};\n const containerElementRef = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(container => {\n setSeamlyContainerElement(container);\n }, [setSeamlyContainerElement]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (locale) {\n const htmlElementLang = document.querySelector('html').getAttribute('lang');\n if (!htmlElementLang || htmlElementLang !== locale) setBlockLang(locale);\n }\n }, [locale]);\n const classNames = ['app', ...appContainerClassNames];\n\n if (!isOpen) {\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(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.minimized);\n }\n };\n\n const onClickHandler = e => {\n if (isModal) {\n e.stopPropagation();\n }\n };\n\n return isVisible && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(\"section\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)(classNames),\n onKeyDown: onKeyDownHandler,\n onClick: onClickHandler,\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_5__.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_5__.jsx)(_faq_faq__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {})]\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?");
1719
+ 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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.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_app__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n/* harmony import */ var _domains_i18n__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/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}) => {\n const [, setSeamlyContainerElement] = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyContainerElement)();\n const {\n isOpen,\n isVisible,\n setVisibility\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyVisibility)();\n const {\n zIndex,\n showFaq\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_5__.useConfig)();\n const {\n isModal,\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_6__.useUserHasResponded)();\n const {\n locale\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_7__.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', ...appContainerClassNames];\n\n if (!isOpen) {\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(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_4__.visibilityStates.minimized);\n }\n };\n\n const onClickHandler = e => {\n if (isModal) {\n e.stopPropagation();\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 onClick: onClickHandler,\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__ = (AppFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/app-frame.js?");
1324
1720
 
1325
1721
  /***/ }),
1326
1722
 
@@ -1331,7 +1727,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1331
1727
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1332
1728
 
1333
1729
  "use strict";
1334
- 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 _warnings_cobrowsing_active_frame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../warnings/cobrowsing-active-frame */ \"./src/javascripts/ui/components/warnings/cobrowsing-active-frame.js\");\n/* harmony import */ var _app_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../app-options */ \"./src/javascripts/ui/components/app-options/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 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,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyInterrupt)();\n const {\n isOpen\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\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)(_warnings_cobrowsing_active_frame__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_domains_translations__WEBPACK_IMPORTED_MODULE_4__.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_3__[\"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?");
1730
+ 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 _warnings_cobrowsing_active_frame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../warnings/cobrowsing-active-frame */ \"./src/javascripts/ui/components/warnings/cobrowsing-active-frame.js\");\n/* harmony import */ var _app_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../app-options */ \"./src/javascripts/ui/components/app-options/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 _domains_interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../domains/interrupt */ \"./src/javascripts/domains/interrupt/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__);\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\nfunction ChatFrame({\n children,\n interruptComponent: InterruptComponent\n}) {\n const {\n hasInterrupt,\n meta\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_5__.useInterrupt)();\n const {\n isOpen\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyVisibility)();\n\n const getContent = () => {\n if (hasInterrupt) {\n if (isOpen) {\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.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_6__.jsxs)(preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment, {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_warnings_cobrowsing_active_frame__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_domains_translations__WEBPACK_IMPORTED_MODULE_4__.ChatStatus, {}), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.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_6__.jsx)(_app_options__WEBPACK_IMPORTED_MODULE_3__[\"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?");
1335
1731
 
1336
1732
  /***/ }),
1337
1733
 
@@ -1342,7 +1738,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1342
1738
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1343
1739
 
1344
1740
  "use strict";
1345
- 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 isOpen\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyVisibility)();\n const prevIsOpen = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const closeButton = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const focusIfContained = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useFocusIfSeamlyContainedFocus)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n // Because we can open 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 && prevIsOpen.current === false) {\n focusIfContained(closeButton.current);\n }\n\n prevIsOpen.current = isOpen;\n }, [isOpen, focusIfContained]);\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 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?");
1741
+ 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?");
1346
1742
 
1347
1743
  /***/ }),
1348
1744
 
@@ -1364,7 +1760,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1364
1760
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1365
1761
 
1366
1762
  "use strict";
1367
- 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 _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.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\n\nconst Interrupt = ({\n originalError,\n title,\n message,\n buttonText,\n action,\n srText\n}) => {\n const seamlyCommands = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const headingId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing)();\n const isExpiredError = originalError instanceof _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isExpiredError) {\n seamlyCommands[action]();\n } else if (srText) {\n // Wait for live regions to stabilise in case this occurs\n // at an initial render\n setTimeout(() => {\n sendPolite(srText);\n }, 200);\n }\n }, [sendPolite, seamlyCommands, srText, isExpiredError, action]);\n\n const onClickHandler = () => {\n seamlyCommands[action]();\n focusSkiplinkTarget();\n };\n\n return !isExpiredError && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"section\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt'),\n \"aria-labelledby\": headingId,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"h2\", {\n id: headingId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__title'),\n children: title\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__message'),\n children: message\n }), buttonText && action && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__actions'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--primary'),\n onClick: onClickHandler,\n children: buttonText\n })\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Interrupt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/interrupt.js?");
1763
+ 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 _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.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\n\nconst Interrupt = ({\n originalError,\n title,\n message,\n buttonText,\n action,\n srText\n}) => {\n const seamlyCommands = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCommands)();\n const headingId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useGeneratedId)();\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n const focusSkiplinkTarget = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplinkTargetFocusing)();\n const isExpiredError = originalError instanceof _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (isExpiredError) {\n seamlyCommands[action]();\n }\n }, [action, seamlyCommands, isExpiredError]);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!isExpiredError && srText) {\n // Wait for live regions to stabilise in case this occurs\n // at an initial render\n setTimeout(() => {\n sendPolite(srText);\n }, 200);\n }\n }, [sendPolite, srText, isExpiredError]);\n\n const onClickHandler = () => {\n seamlyCommands[action]();\n focusSkiplinkTarget();\n };\n\n return !isExpiredError && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"section\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt'),\n \"aria-labelledby\": headingId,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__body'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"h2\", {\n id: headingId,\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__title'),\n children: title\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__message'),\n children: message\n }), buttonText && action && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('interrupt__actions'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_1__.className)('button', 'button--primary'),\n onClick: onClickHandler,\n children: buttonText\n })\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Interrupt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/interrupt.js?");
1368
1764
 
1369
1765
  /***/ }),
1370
1766
 
@@ -1386,7 +1782,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1386
1782
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1387
1783
 
1388
1784
  "use strict";
1389
- 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_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.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\n\nconst PrivacyDisclaimer = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const showDisclaimer = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyDisclaimerState)();\n return showDisclaimer && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('disclaimer'),\n tabIndex: \"0\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"h2\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('disclaimer__title'),\n children: t('disclaimer.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('disclaimer__message'),\n dangerouslySetInnerHTML: {\n __html: t('disclaimer.content')\n }\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PrivacyDisclaimer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/privacy-disclaimer.js?");
1785
+ 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 _domains_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/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 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\n\nconst PrivacyDisclaimer = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n showDisclaimer\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n return showDisclaimer && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('disclaimer'),\n tabIndex: \"0\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"h2\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('disclaimer__title'),\n children: t('disclaimer.title')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('disclaimer__message'),\n dangerouslySetInnerHTML: {\n __html: t('disclaimer.content')\n }\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PrivacyDisclaimer);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/layout/privacy-disclaimer.js?");
1390
1786
 
1391
1787
  /***/ }),
1392
1788
 
@@ -1452,7 +1848,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1452
1848
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1453
1849
 
1454
1850
  "use strict";
1455
- 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 _options_frame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../options-frame */ \"./src/javascripts/ui/components/options/options-frame.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _transcript_form__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transcript-form */ \"./src/javascripts/ui/components/options/transcript/transcript-form.js\");\n/* harmony import */ var _utils_form_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../utils/form-utils */ \"./src/javascripts/ui/utils/form-utils.js\");\n/* harmony import */ var _utils_validations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../utils/validations */ \"./src/javascripts/ui/utils/validations.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\nconst formId = 'sendTranscript';\nconst controlName = 'email';\n\nconst Transcript = () => {\n const {\n hideOption\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyOptions)();\n const {\n focusButton\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useOptionButton)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const transcriptDescriptionId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useGeneratedId)();\n const {\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyCommands)();\n const validationSchema = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n [controlName]: [(0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_8__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_9__.isNotEmptyString, t('options.sendTranscript.noEmailText')), (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_8__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_9__.isEmailString, t('options.sendTranscript.invalidEmailText'))]\n }), [t]);\n const handleSubmit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(values => {\n const emailAddress = values[controlName];\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__.actionTypes.sendTranscript,\n body: {\n emailAddress\n }\n });\n hideOption();\n focusButton();\n }, [sendAction, hideOption, focusButton]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(_options_frame__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n headingText: t('options.sendTranscript.title'),\n cancelButtonText: t('options.cancelButtonText'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('options__description'),\n id: transcriptDescriptionId,\n children: t('options.sendTranscript.description')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_domains_forms__WEBPACK_IMPORTED_MODULE_6__.FormProvider, {\n formId: formId,\n onSubmit: handleSubmit,\n validationSchema: validationSchema,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_transcript_form__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n controlName: controlName,\n describedById: transcriptDescriptionId\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Transcript);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/transcript/index.js?");
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 _domains_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _options_frame__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../options-frame */ \"./src/javascripts/ui/components/options/options-frame.js\");\n/* harmony import */ var _lib_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../lib/css */ \"./src/javascripts/lib/css.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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n/* harmony import */ var _transcript_form__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transcript-form */ \"./src/javascripts/ui/components/options/transcript/transcript-form.js\");\n/* harmony import */ var _utils_form_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../utils/form-utils */ \"./src/javascripts/ui/utils/form-utils.js\");\n/* harmony import */ var _utils_validations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../utils/validations */ \"./src/javascripts/ui/utils/validations.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\nconst formId = 'sendTranscript';\nconst controlName = 'email';\n\nconst Transcript = () => {\n const {\n hideOption\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyOptions)();\n const {\n focusButton\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useOptionButton)();\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const transcriptDescriptionId = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useGeneratedId)();\n const {\n sendAction\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyCommands)();\n const validationSchema = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n [controlName]: [(0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_8__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_9__.isNotEmptyString, t('options.sendTranscript.noEmailText')), (0,_utils_form_utils__WEBPACK_IMPORTED_MODULE_8__.getValidator)(_utils_validations__WEBPACK_IMPORTED_MODULE_9__.isEmailString, t('options.sendTranscript.invalidEmailText'))]\n }), [t]);\n const handleSubmit = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(values => {\n const emailAddress = values[controlName].trim();\n sendAction({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__.actionTypes.sendTranscript,\n body: {\n emailAddress\n }\n });\n hideOption();\n focusButton();\n }, [sendAction, hideOption, focusButton]);\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(_options_frame__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n headingText: t('options.sendTranscript.title'),\n cancelButtonText: t('options.cancelButtonText'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(\"p\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_3__.className)('options__description'),\n id: transcriptDescriptionId,\n children: t('options.sendTranscript.description')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_domains_forms__WEBPACK_IMPORTED_MODULE_6__.FormProvider, {\n formId: formId,\n onSubmit: handleSubmit,\n validationSchema: validationSchema,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_transcript_form__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n controlName: controlName,\n describedById: transcriptDescriptionId\n })\n })]\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Transcript);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/transcript/index.js?");
1456
1852
 
1457
1853
  /***/ }),
1458
1854
 
@@ -1463,7 +1859,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1463
1859
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1464
1860
 
1465
1861
  "use strict";
1466
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TranscriptForm)\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_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _form_controls_form__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _form_controls_input__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../form-controls/input */ \"./src/javascripts/ui/components/form-controls/input.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 TranscriptForm({\n controlName,\n describedById\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_form_controls_form__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n noValidate: \"true\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_form_controls_input__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: controlName,\n type: \"text\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('transcript__input'),\n \"aria-describedby\": describedById,\n labelClass: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('label'),\n labelText: t('options.sendTranscript.label')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('options__actions'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"button\", {\n type: \"submit\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary', 'options__submit'),\n children: t('options.sendTranscript.sendButtonText')\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/transcript/transcript-form.js?");
1862
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TranscriptForm)\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_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _form_controls_form__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../form-controls/form */ \"./src/javascripts/ui/components/form-controls/form.js\");\n/* harmony import */ var _form_controls_input__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../form-controls/input */ \"./src/javascripts/ui/components/form-controls/input.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 TranscriptForm({\n controlName,\n describedById\n}) {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(_form_controls_form__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n noValidate: \"true\",\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_form_controls_input__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: controlName,\n type: \"email\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('transcript__input'),\n \"aria-describedby\": describedById,\n labelClass: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('label'),\n labelText: t('options.sendTranscript.label')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('options__actions'),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"button\", {\n type: \"submit\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary', 'options__submit'),\n children: t('options.sendTranscript.sendButtonText')\n })\n })]\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/options/transcript/transcript-form.js?");
1467
1863
 
1468
1864
  /***/ }),
1469
1865
 
@@ -1474,7 +1870,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1474
1870
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1475
1871
 
1476
1872
  "use strict";
1477
- 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 _cobrowsing_active__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cobrowsing-active */ \"./src/javascripts/ui/components/warnings/cobrowsing-active.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_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/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\nconst CobrowsingActiveFrame = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n userSelectedOptions\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyOptions)();\n const {\n hasInterrupt\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyInterrupt)();\n const {\n cobrowsing\n } = userSelectedOptions;\n const prevCobrowsing = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(cobrowsing);\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!cobrowsing && prevCobrowsing.current) {\n // This timeout is required as the live announce may be swallowed due to other\n // announcements around cobrowsing.\n setTimeout(() => {\n sendPolite(t('options.cobrowsing.srStoppedCobrowsingText'));\n }, 300);\n }\n\n prevCobrowsing.current = cobrowsing;\n }, [cobrowsing, t, sendPolite]);\n return cobrowsing && !hasInterrupt && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_cobrowsing_active__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {});\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CobrowsingActiveFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/warnings/cobrowsing-active-frame.js?");
1873
+ 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 _cobrowsing_active__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cobrowsing-active */ \"./src/javascripts/ui/components/warnings/cobrowsing-active.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_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 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 CobrowsingActiveFrame = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_3__.useI18n)();\n const {\n userSelectedOptions\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyOptions)();\n const {\n hasInterrupt\n } = (0,_domains_interrupt__WEBPACK_IMPORTED_MODULE_4__.useInterrupt)();\n const {\n cobrowsing\n } = userSelectedOptions;\n const prevCobrowsing = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(cobrowsing);\n const {\n sendPolite\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_2__.useLiveRegion)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!cobrowsing && prevCobrowsing.current) {\n // This timeout is required as the live announce may be swallowed due to other\n // announcements around cobrowsing.\n setTimeout(() => {\n sendPolite(t('options.cobrowsing.srStoppedCobrowsingText'));\n }, 300);\n }\n\n prevCobrowsing.current = cobrowsing;\n }, [cobrowsing, t, sendPolite]);\n return cobrowsing && !hasInterrupt && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_cobrowsing_active__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {});\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CobrowsingActiveFrame);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/warnings/cobrowsing-active-frame.js?");
1478
1874
 
1479
1875
  /***/ }),
1480
1876
 
@@ -1518,7 +1914,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1518
1914
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1519
1915
 
1520
1916
  "use strict";
1521
- 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 _domains_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _prompt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prompt */ \"./src/javascripts/ui/components/warnings/prompt.js\");\n/* harmony import */ var _hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_3__ = __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_activity_event_handler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/use-seamly-activity-event-handler */ \"./src/javascripts/ui/hooks/use-seamly-activity-event-handler.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.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 ResumeConversationPrompt = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const sendActivity = (0,_hooks_use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_4__[\"default\"])();\n const {\n name: currentAgentName\n } = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyCurrentAgent)() || {};\n const {\n continueChat,\n restartChat\n } = (0,_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n\n const continueChatHandler = () => {\n sendActivity();\n continueChat();\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_prompt__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n baseClassName: \"prompt\",\n title: t('resumeConversationPrompt.title', currentAgentName),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('prompt__options'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary'),\n onClick: continueChatHandler,\n children: t('resumeConversationPrompt.continueButton')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary'),\n onClick: restartChat,\n children: t('resumeConversationPrompt.detachButton')\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ResumeConversationPrompt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/warnings/resume-conversation-prompt.js?");
1917
+ 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 _domains_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _prompt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./prompt */ \"./src/javascripts/ui/components/warnings/prompt.js\");\n/* harmony import */ var _hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_3__ = __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_activity_event_handler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../hooks/use-seamly-activity-event-handler */ \"./src/javascripts/ui/hooks/use-seamly-activity-event-handler.js\");\n/* harmony import */ var _hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.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 ResumeConversationPrompt = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const sendActivity = (0,_hooks_use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_4__[\"default\"])();\n const {\n name: currentAgentName\n } = (0,_hooks_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyCurrentAgent)() || {};\n const {\n continueChat,\n restartChat\n } = (0,_hooks_use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n\n const continueChatHandler = () => {\n sendActivity();\n continueChat();\n };\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_prompt__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n baseClassName: \"prompt\",\n title: t('resumeConversationPrompt.title', {\n name: currentAgentName\n }),\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('prompt__options'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary'),\n onClick: continueChatHandler,\n children: t('resumeConversationPrompt.continueButton')\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('button', 'button--primary'),\n onClick: restartChat,\n children: t('resumeConversationPrompt.detachButton')\n })]\n })\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ResumeConversationPrompt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/warnings/resume-conversation-prompt.js?");
1522
1918
 
1523
1919
  /***/ }),
1524
1920
 
@@ -1540,7 +1936,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1540
1936
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1541
1937
 
1542
1938
  "use strict";
1543
- 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 _modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modal */ \"./src/javascripts/ui/components/widgets/modal.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 _lib_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.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 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 Lightbox = ({\n url,\n description,\n onClose: onCloseHandler\n}) => {\n const {\n zIndex\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyConfig)();\n const onActivityHandler = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyActivityEventHandler)();\n const appContainerClassNames = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyAppContainerClassNames)();\n const focusContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const classNames = ['modal', ...appContainerClassNames];\n\n const onFrameClickHandler = e => {\n e.stopPropagation();\n };\n\n const onFloatClickHandler = () => {\n onCloseHandler();\n };\n\n const style = zIndex ? {\n zIndex: zIndex + 1\n } : undefined;\n\n const getModalContent = onClose => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)(classNames),\n onClick: onFloatClickHandler,\n style: style,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__float'),\n tabIndex: \"-1\",\n onMouseDown: onActivityHandler,\n onKeyDown: onActivityHandler,\n onTouchStart: onActivityHandler,\n onMouseMove: onActivityHandler,\n onWheel: onActivityHandler,\n onPointerDown: onActivityHandler,\n onPointerMove: onActivityHandler,\n ref: focusContainer,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__inner'),\n onClick: onFrameClickHandler,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\"img\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__image'),\n src: url,\n alt: description\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__close'),\n onClick: onClose,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"close\",\n size: \"16\"\n }), t('lightbox.closeLabel')]\n })]\n })\n });\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n onClose: onCloseHandler,\n \"aria-label\": t('lightbox.heading'),\n fallBackFocusRef: focusContainer,\n children: ({\n onClose,\n modalRenderFn\n }) => modalRenderFn(getModalContent(onClose))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Lightbox);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/widgets/lightbox.js?");
1939
+ 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 _modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modal */ \"./src/javascripts/ui/components/widgets/modal.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 _lib_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../lib/css */ \"./src/javascripts/lib/css.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 _domains_config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../domains/config */ \"./src/javascripts/domains/config/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 Lightbox = ({\n url,\n description,\n onClose: onCloseHandler\n}) => {\n const {\n zIndex\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_6__.useConfig)();\n const onActivityHandler = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyActivityEventHandler)();\n const appContainerClassNames = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_3__.useSeamlyAppContainerClassNames)();\n const focusContainer = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const classNames = ['modal', ...appContainerClassNames];\n\n const onFrameClickHandler = e => {\n e.stopPropagation();\n };\n\n const onFloatClickHandler = () => {\n onCloseHandler();\n };\n\n const style = zIndex ? {\n zIndex: zIndex + 1\n } : undefined;\n\n const getModalContent = onClose => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)(classNames),\n onClick: onFloatClickHandler,\n style: style,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__float'),\n tabIndex: \"-1\",\n onMouseDown: onActivityHandler,\n onKeyDown: onActivityHandler,\n onTouchStart: onActivityHandler,\n onMouseMove: onActivityHandler,\n onWheel: onActivityHandler,\n onPointerDown: onActivityHandler,\n onPointerMove: onActivityHandler,\n ref: focusContainer,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__inner'),\n onClick: onFrameClickHandler,\n children: (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(\"img\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__image'),\n src: url,\n alt: description\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(\"button\", {\n type: \"button\",\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_4__.className)('modal__close'),\n onClick: onClose,\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n name: \"close\",\n size: \"16\"\n }), t('lightbox.closeLabel')]\n })]\n })\n });\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(_modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n onClose: onCloseHandler,\n \"aria-label\": t('lightbox.heading'),\n fallBackFocusRef: focusContainer,\n children: ({\n onClose,\n modalRenderFn\n }) => modalRenderFn(getModalContent(onClose))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Lightbox);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/widgets/lightbox.js?");
1544
1940
 
1545
1941
  /***/ }),
1546
1942
 
@@ -1562,7 +1958,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1562
1958
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1563
1959
 
1564
1960
  "use strict";
1565
- 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_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _layout_icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../layout/icon */ \"./src/javascripts/ui/components/layout/icon.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\n\nconst UploadProgress = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n currentUploads\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useFileUploads)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress'),\n children: currentUploads.map(({\n id,\n name,\n progress,\n uploading,\n error\n }) => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress_container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__text'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__text--file-name'),\n children: name\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__text--percentage'),\n children: `${progress}%`\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('error'),\n \"aria-live\": \"assertive\",\n \"aria-atomic\": \"true\",\n children: error && (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"span\", {\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_layout_icon__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n name: \"error\",\n size: \"16\"\n }), error]\n })\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"progress\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__bar'),\n role: \"progressbar\",\n \"aria-valuemin\": \"0\",\n \"aria-valuemax\": \"100\",\n \"aria-label\": t('fileUpload.srProgressLabel', name),\n max: \"100\",\n \"aria-valuenow\": progress,\n value: progress,\n \"aria-busy\": uploading,\n children: `${progress}%`\n })]\n }, id))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (UploadProgress);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/widgets/upload-progress.js?");
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 _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_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _form_controls_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../form-controls/error */ \"./src/javascripts/ui/components/form-controls/error.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\n\nconst UploadProgress = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_2__.useI18n)();\n const {\n currentUploads\n } = (0,_hooks_seamly_hooks__WEBPACK_IMPORTED_MODULE_1__.useFileUploads)();\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress'),\n children: currentUploads.map(({\n id,\n name,\n progress,\n uploading,\n error\n }) => (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress_container'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxs)(\"div\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__text'),\n children: [(0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__text--file-name'),\n children: name\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"span\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__text--percentage'),\n children: `${progress}%`\n })]\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(_form_controls_error__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n error: error\n }), (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_4__.jsx)(\"progress\", {\n className: (0,_lib_css__WEBPACK_IMPORTED_MODULE_0__.className)('progress__bar'),\n role: \"progressbar\",\n \"aria-valuemin\": \"0\",\n \"aria-valuemax\": \"100\",\n \"aria-label\": t('fileUpload.srProgressLabel', {\n fileName: name\n }),\n max: \"100\",\n \"aria-valuenow\": progress,\n value: progress,\n \"aria-busy\": uploading,\n children: `${progress}%`\n })]\n }, id))\n });\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (UploadProgress);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/components/widgets/upload-progress.js?");
1566
1962
 
1567
1963
  /***/ }),
1568
1964
 
@@ -1573,7 +1969,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1573
1969
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1574
1970
 
1575
1971
  "use strict";
1576
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyAppContainerClassNames\": () => (/* binding */ useSeamlyAppContainerClassNames),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* binding */ useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useCobrowsingContainer\": () => (/* binding */ useCobrowsingContainer)\n/* harmony export */ });\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n\n\nconst useSeamlyAppContainerClassNames = () => {\n const config = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyConfig)();\n const {\n appContainerClassNames\n } = config;\n\n if (!appContainerClassNames) {\n return [];\n }\n\n switch (typeof config.appContainerClassNames) {\n case 'function':\n return config.appContainerClassNames(config);\n\n default:\n return config.appContainerClassNames;\n }\n};\nconst useSeamlyMessageContainerClassNames = event => {\n const {\n fromClient\n } = event.payload;\n const classNames = ['message'];\n\n if (event.type === 'info') {\n classNames.push('message--source-info');\n } else if (!fromClient) {\n classNames.push('message--source-agent');\n } else {\n classNames.push('message--source-user');\n }\n\n return classNames;\n};\nconst useCobrowsingContainer = () => {\n const {\n cobrowsingContainerId: id\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyStateContext)();\n const focusContainer = (0,_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_1__.useElementFocusingById)(id);\n return {\n id,\n focusContainer\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/component-helper-hooks.js?");
1972
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyAppContainerClassNames\": () => (/* binding */ useSeamlyAppContainerClassNames),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* binding */ useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useCobrowsingContainer\": () => (/* binding */ useCobrowsingContainer)\n/* harmony export */ });\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.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 useSeamlyAppContainerClassNames = () => {\n return (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)().appContainerClassNames;\n};\nconst useSeamlyMessageContainerClassNames = event => {\n const {\n fromClient\n } = event.payload;\n const classNames = ['message'];\n\n if (event.type === 'info') {\n classNames.push('message--source-info');\n } else if (!fromClient) {\n classNames.push('message--source-agent');\n } else {\n classNames.push('message--source-user');\n }\n\n return classNames;\n};\nconst useCobrowsingContainer = () => {\n const {\n cobrowsingContainerId: id\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_0__.useSeamlyStateContext)();\n const focusContainer = (0,_focus_helper_hooks__WEBPACK_IMPORTED_MODULE_1__.useElementFocusingById)(id);\n return {\n id,\n focusContainer\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/component-helper-hooks.js?");
1577
1973
 
1578
1974
  /***/ }),
1579
1975
 
@@ -1617,7 +2013,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1617
2013
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1618
2014
 
1619
2015
  "use strict";
1620
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyApiContext\": () => (/* binding */ useSeamlyApiContext),\n/* harmony export */ \"useSeamlyObjectStore\": () => (/* binding */ useSeamlyObjectStore),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* binding */ useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyHasConversation\": () => (/* binding */ useSeamlyHasConversation),\n/* harmony export */ \"useSeamlyHasUserResponded\": () => (/* binding */ useSeamlyHasUserResponded)\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 _components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n\n\nconst useSeamlyApiContext = () => (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__.SeamlyApiContext);\nconst useSeamlyObjectStore = () => {\n const api = useSeamlyApiContext();\n return api.store || {};\n};\nconst useSeamlyConversationUrl = () => {\n const {\n get\n } = useSeamlyObjectStore();\n\n if (get) {\n return get('conversationUrl');\n }\n\n return null;\n};\nconst useSeamlyHasConversation = () => {\n const url = useSeamlyConversationUrl();\n return !!url;\n};\nconst useSeamlyHasUserResponded = () => {\n const {\n get\n } = useSeamlyObjectStore();\n return get ? !!get('userResponded') : false;\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-api-hooks.js?");
2016
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyApiContext\": () => (/* binding */ useSeamlyApiContext),\n/* harmony export */ \"useSeamlyObjectStore\": () => (/* binding */ useSeamlyObjectStore),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* binding */ useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyHasConversation\": () => (/* binding */ useSeamlyHasConversation)\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 _components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n\n\nconst useSeamlyApiContext = () => (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_1__.SeamlyApiContext);\nconst useSeamlyObjectStore = () => {\n const api = useSeamlyApiContext();\n return api.store || {};\n};\nconst useSeamlyConversationUrl = () => {\n const {\n get\n } = useSeamlyObjectStore();\n\n if (get) {\n return get('conversationUrl');\n }\n\n return null;\n};\nconst useSeamlyHasConversation = () => {\n const url = useSeamlyConversationUrl();\n return !!url;\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-api-hooks.js?");
1621
2017
 
1622
2018
  /***/ }),
1623
2019
 
@@ -1628,7 +2024,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1628
2024
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1629
2025
 
1630
2026
  "use strict";
1631
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyTyping\": () => (/* binding */ useSeamlyTyping),\n/* harmony export */ \"useSeamlyEntry\": () => (/* binding */ useSeamlyEntry)\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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.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 {\n SET_BLOCK_AUTO_ENTRY_SWITCH,\n SET_ACTIVE_ENTRY_TYPE,\n SET_USER_ENTRY_TYPE\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions;\nconst useSeamlyTyping = () => {\n const {\n sendAction\n } = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const {\n typing: typingConfig\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyConfig)();\n const {\n features\n } = (0,_seamly_option_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyOptions)();\n const {\n typingPeekahead\n } = features || {};\n const typingTimeout = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const sendEndTypingTimeout = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const isTyping = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const typingInterval = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n clearInterval(typingInterval.current);\n clearTimeout(typingTimeout.current);\n clearTimeout(sendEndTypingTimeout.current);\n };\n }, []);\n\n const sendTypingState = (state, currentMessage) => {\n sendAction(_objectSpread({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.actionTypes.typing,\n state\n }, typingPeekahead && typingPeekahead.enabled ? {\n body: {\n currentMessage\n }\n } : {}));\n };\n\n return e => {\n if (e.code && e.code === 'Enter' || e.keyCode === 13) {\n return;\n }\n\n if (!typingConfig) {\n return;\n }\n\n isTyping.current = true;\n\n if (!typingInterval.current) {\n sendTypingState(true, e.target.value);\n typingInterval.current = setInterval(() => {\n if (!isTyping.current) {\n clearInterval(typingInterval.current);\n typingInterval.current = null;\n } else if (typingPeekahead && typingPeekahead.enabled) {\n sendTypingState(true, e.target.value);\n }\n }, typingConfig.timeout);\n }\n\n clearTimeout(typingTimeout.current);\n clearTimeout(sendEndTypingTimeout.current);\n typingTimeout.current = setTimeout(() => {\n isTyping.current = false;\n }, 300);\n sendEndTypingTimeout.current = setTimeout(() => {\n sendTypingState(false, e.target.value);\n }, typingConfig.timeout);\n };\n};\nconst useSeamlyEntry = () => {\n const {\n default: defaultEntry,\n active,\n userSelected,\n options: entryOptions\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext)().entryMeta;\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const activeEntry = userSelected || active || defaultEntry;\n const activeEntryOptions = entryOptions[activeEntry] || {};\n const setBlockAutoEntrySwitch = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(value => {\n dispatch({\n type: SET_BLOCK_AUTO_ENTRY_SWITCH,\n value\n });\n }, [dispatch]);\n const setActiveEntryType = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(entryType => {\n dispatch({\n type: SET_ACTIVE_ENTRY_TYPE,\n entryType\n });\n }, [dispatch]);\n const setUserEntryType = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(entryType => {\n dispatch({\n type: SET_USER_ENTRY_TYPE,\n entryType\n });\n }, [dispatch]);\n const cancelEntrySelection = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (userSelected) {\n setUserEntryType(null);\n } else {\n setActiveEntryType(defaultEntry);\n }\n }, [userSelected, defaultEntry, setUserEntryType, setActiveEntryType]);\n return {\n activeEntry,\n activeEntryOptions,\n setActiveEntryType,\n setUserEntryType,\n cancelEntrySelection,\n setBlockAutoEntrySwitch\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-entry-hooks.js?");
2027
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useSeamlyTyping\": () => (/* binding */ useSeamlyTyping),\n/* harmony export */ \"useSeamlyEntry\": () => (/* binding */ useSeamlyEntry)\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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../config */ \"./src/javascripts/config.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\nconst {\n SET_BLOCK_AUTO_ENTRY_SWITCH,\n SET_ACTIVE_ENTRY_TYPE,\n SET_USER_ENTRY_TYPE\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyActions;\nconst useSeamlyTyping = () => {\n const {\n sendAction\n } = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const {\n features\n } = (0,_seamly_option_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyOptions)();\n const {\n typingPeekahead\n } = features || {};\n const typingTimerId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const sendEndTypingTimerId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const isTyping = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n const typingIntervalId = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n return () => {\n clearInterval(typingIntervalId.current);\n clearTimeout(typingTimerId.current);\n clearTimeout(sendEndTypingTimerId.current);\n };\n }, []);\n\n const sendTypingState = (state, currentMessage) => {\n sendAction(_objectSpread({\n type: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.actionTypes.typing,\n state\n }, typingPeekahead && typingPeekahead.enabled ? {\n body: {\n currentMessage\n }\n } : {}));\n };\n\n return e => {\n if (e.code && e.code === 'Enter' || e.keyCode === 13) {\n return;\n }\n\n isTyping.current = true;\n\n if (!typingIntervalId.current) {\n sendTypingState(true, e.target.value);\n typingIntervalId.current = setInterval(() => {\n if (!isTyping.current) {\n clearInterval(typingIntervalId.current);\n typingIntervalId.current = null;\n } else if (typingPeekahead && typingPeekahead.enabled) {\n sendTypingState(true, e.target.value);\n }\n }, _config__WEBPACK_IMPORTED_MODULE_6__.typingTimeout);\n }\n\n clearTimeout(typingTimerId.current);\n clearTimeout(sendEndTypingTimerId.current);\n typingTimerId.current = setTimeout(() => {\n isTyping.current = false;\n }, 300);\n sendEndTypingTimerId.current = setTimeout(() => {\n sendTypingState(false, e.target.value);\n }, _config__WEBPACK_IMPORTED_MODULE_6__.typingTimeout);\n };\n};\nconst useSeamlyEntry = () => {\n const {\n default: defaultEntry,\n active,\n userSelected,\n options: entryOptions\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext)().entryMeta;\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const activeEntry = userSelected || active || defaultEntry;\n const activeEntryOptions = entryOptions[activeEntry] || {};\n const setBlockAutoEntrySwitch = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(value => {\n dispatch({\n type: SET_BLOCK_AUTO_ENTRY_SWITCH,\n value\n });\n }, [dispatch]);\n const setActiveEntryType = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(entryType => {\n dispatch({\n type: SET_ACTIVE_ENTRY_TYPE,\n entryType\n });\n }, [dispatch]);\n const setUserEntryType = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(entryType => {\n dispatch({\n type: SET_USER_ENTRY_TYPE,\n entryType\n });\n }, [dispatch]);\n const cancelEntrySelection = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (userSelected) {\n setUserEntryType(null);\n } else {\n setActiveEntryType(defaultEntry);\n }\n }, [userSelected, defaultEntry, setUserEntryType, setActiveEntryType]);\n return {\n activeEntry,\n activeEntryOptions,\n setActiveEntryType,\n setUserEntryType,\n cancelEntrySelection,\n setBlockAutoEntrySwitch\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-entry-hooks.js?");
1632
2028
 
1633
2029
  /***/ }),
1634
2030
 
@@ -1639,7 +2035,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1639
2035
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1640
2036
 
1641
2037
  "use strict";
1642
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useLastMessageEventId\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useLastMessageEventId),\n/* harmony export */ \"useEntryTextLimit\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useEntryTextLimit),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCurrentAgent),\n/* harmony export */ \"useSeamlyConfig\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyConfig),\n/* harmony export */ \"useSeamlyDisclaimerState\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyDisclaimerState),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useEvents),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyLayoutMode),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyParticipant),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyServiceData),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyServiceInfo),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplink),\n/* harmony export */ \"useSeamlyApiContext\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyHasUserResponded\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyHasUserResponded),\n/* harmony export */ \"useSeamlyDispatchContext\": () => (/* reexport safe */ _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"useSeamlyAppContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyAppContainerClassNames),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useCobrowsingContainer\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useCobrowsingContainer),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyOptions),\n/* harmony export */ \"useOptionButton\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_5__.useOptionButton),\n/* harmony export */ \"useSeamlyInterrupt\": () => (/* reexport safe */ _use_seamly_interrupt__WEBPACK_IMPORTED_MODULE_6__[\"default\"]),\n/* harmony export */ \"useFileUploadMeta\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_7__.useFileUploadMeta),\n/* harmony export */ \"useFileUploads\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_7__.useFileUploads),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _use_seamly_commands__WEBPACK_IMPORTED_MODULE_8__[\"default\"]),\n/* harmony export */ \"useLiveRegion\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_9__.useLiveRegion),\n/* harmony export */ \"useSeamlyLiveRegionContext\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_9__.useSeamlyLiveRegionContext),\n/* harmony export */ \"useSeamlyActivityEventHandler\": () => (/* reexport safe */ _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_10__[\"default\"]),\n/* harmony export */ \"useSeamlyTyping\": () => (/* reexport safe */ _seamly_entry_hooks__WEBPACK_IMPORTED_MODULE_11__.useSeamlyTyping),\n/* harmony export */ \"useSeamlyEntry\": () => (/* reexport safe */ _seamly_entry_hooks__WEBPACK_IMPORTED_MODULE_11__.useSeamlyEntry),\n/* harmony export */ \"useForceUpdate\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_12__.useForceUpdate),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_12__.useGeneratedId),\n/* harmony export */ \"useStableCallback\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_12__.useStableCallback),\n/* harmony export */ \"useElementFocusingById\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_13__.useElementFocusingById),\n/* harmony export */ \"useSkiplinkTargetFocusing\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_13__.useSkiplinkTargetFocusing),\n/* harmony export */ \"useFocusIfSeamlyContainedFocus\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_13__.useFocusIfSeamlyContainedFocus),\n/* harmony export */ \"useSeamlyContainerElement\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_13__.useSeamlyContainerElement),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _use_seamly_chat__WEBPACK_IMPORTED_MODULE_14__[\"default\"]),\n/* harmony export */ \"useSeamlyStoredVisibility\": () => (/* reexport safe */ _use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"useSeamlyVisibility\": () => (/* reexport safe */ _use_seamly_visibility__WEBPACK_IMPORTED_MODULE_16__[\"default\"]),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_17__[\"default\"]),\n/* harmony export */ \"useSeamlyResumeConversationPrompt\": () => (/* reexport safe */ _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_18__[\"default\"]),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* binding */ useSeamlyEventStream)\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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _use_seamly_interrupt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./use-seamly-interrupt */ \"./src/javascripts/ui/hooks/use-seamly-interrupt.js\");\n/* harmony import */ var _file_upload_hooks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./file-upload-hooks */ \"./src/javascripts/ui/hooks/file-upload-hooks.js\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _live_region_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./use-seamly-activity-event-handler */ \"./src/javascripts/ui/hooks/use-seamly-activity-event-handler.js\");\n/* harmony import */ var _seamly_entry_hooks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./seamly-entry-hooks */ \"./src/javascripts/ui/hooks/seamly-entry-hooks.js\");\n/* harmony import */ var _utility_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _use_seamly_chat__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.js\");\n/* harmony import */ var _use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./use-seamly-stored-visibility */ \"./src/javascripts/ui/hooks/use-seamly-stored-visibility.js\");\n/* harmony import */ var _use_seamly_visibility__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./use-seamly-visibility */ \"./src/javascripts/ui/hooks/use-seamly-visibility.js\");\n/* harmony import */ var _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n // Import extracted hooks here for use inside this file\n\n // Export extracted hooks here,\n// although this is a redundant, it prevents a bazillion code changes for now.\n// TODO: Remove exports and import them from the correct files\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // This hook isn't used within the core\n// But it is used in implementations\n// and imported directly from this file\n// Please do not remove\n\nconst useSeamlyEventStream = (nextFn, filterFn) => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.stream) {\n if (filterFn) {\n api.stream().filter(filterFn).subscribe({\n next: nextFn\n });\n } else {\n api.stream().subscribe({\n next: nextFn\n });\n }\n }\n }, [api, nextFn, filterFn]);\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-hooks.js?");
2038
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useLastMessageEventId\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useLastMessageEventId),\n/* harmony export */ \"useEntryTextLimit\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useEntryTextLimit),\n/* harmony export */ \"useSeamlyCurrentAgent\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyCurrentAgent),\n/* harmony export */ \"useEvents\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useEvents),\n/* harmony export */ \"useSeamlyHeaderData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyHeaderData),\n/* harmony export */ \"useSeamlyIsHistoryLoaded\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIsHistoryLoaded),\n/* harmony export */ \"useSeamlyIsLoading\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyIsLoading),\n/* harmony export */ \"useSeamlyLayoutMode\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyLayoutMode),\n/* harmony export */ \"useSeamlyParticipant\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyParticipant),\n/* harmony export */ \"useSeamlyServiceData\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyServiceData),\n/* harmony export */ \"useSeamlyServiceInfo\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyServiceInfo),\n/* harmony export */ \"useSeamlyStateContext\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext),\n/* harmony export */ \"useSeamlyUnreadCount\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyUnreadCount),\n/* harmony export */ \"useSkiplink\": () => (/* reexport safe */ _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSkiplink),\n/* harmony export */ \"useSeamlyApiContext\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext),\n/* harmony export */ \"useSeamlyConversationUrl\": () => (/* reexport safe */ _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConversationUrl),\n/* harmony export */ \"useSeamlyDispatchContext\": () => (/* reexport safe */ _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"useSeamlyAppContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyAppContainerClassNames),\n/* harmony export */ \"useSeamlyMessageContainerClassNames\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyMessageContainerClassNames),\n/* harmony export */ \"useCobrowsingContainer\": () => (/* reexport safe */ _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__.useCobrowsingContainer),\n/* harmony export */ \"useSeamlyOptions\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_5__.useSeamlyOptions),\n/* harmony export */ \"useOptionButton\": () => (/* reexport safe */ _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_5__.useOptionButton),\n/* harmony export */ \"useFileUploadMeta\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_6__.useFileUploadMeta),\n/* harmony export */ \"useFileUploads\": () => (/* reexport safe */ _file_upload_hooks__WEBPACK_IMPORTED_MODULE_6__.useFileUploads),\n/* harmony export */ \"useSeamlyCommands\": () => (/* reexport safe */ _use_seamly_commands__WEBPACK_IMPORTED_MODULE_7__[\"default\"]),\n/* harmony export */ \"useLiveRegion\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_8__.useLiveRegion),\n/* harmony export */ \"useSeamlyLiveRegionContext\": () => (/* reexport safe */ _live_region_hooks__WEBPACK_IMPORTED_MODULE_8__.useSeamlyLiveRegionContext),\n/* harmony export */ \"useSeamlyActivityEventHandler\": () => (/* reexport safe */ _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_9__[\"default\"]),\n/* harmony export */ \"useSeamlyTyping\": () => (/* reexport safe */ _seamly_entry_hooks__WEBPACK_IMPORTED_MODULE_10__.useSeamlyTyping),\n/* harmony export */ \"useSeamlyEntry\": () => (/* reexport safe */ _seamly_entry_hooks__WEBPACK_IMPORTED_MODULE_10__.useSeamlyEntry),\n/* harmony export */ \"useForceUpdate\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_11__.useForceUpdate),\n/* harmony export */ \"useGeneratedId\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_11__.useGeneratedId),\n/* harmony export */ \"useStableCallback\": () => (/* reexport safe */ _utility_hooks__WEBPACK_IMPORTED_MODULE_11__.useStableCallback),\n/* harmony export */ \"useElementFocusingById\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_12__.useElementFocusingById),\n/* harmony export */ \"useSkiplinkTargetFocusing\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_12__.useSkiplinkTargetFocusing),\n/* harmony export */ \"useFocusIfSeamlyContainedFocus\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_12__.useFocusIfSeamlyContainedFocus),\n/* harmony export */ \"useSeamlyContainerElement\": () => (/* reexport safe */ _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_12__.useSeamlyContainerElement),\n/* harmony export */ \"useSeamlyChat\": () => (/* reexport safe */ _use_seamly_chat__WEBPACK_IMPORTED_MODULE_13__[\"default\"]),\n/* harmony export */ \"useSeamlyStoredVisibility\": () => (/* reexport safe */ _use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_14__[\"default\"]),\n/* harmony export */ \"useSeamlyVisibility\": () => (/* reexport safe */ _use_seamly_visibility__WEBPACK_IMPORTED_MODULE_15__[\"default\"]),\n/* harmony export */ \"useSeamlyIdleDetachCountdown\": () => (/* reexport safe */ _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_16__[\"default\"]),\n/* harmony export */ \"useSeamlyResumeConversationPrompt\": () => (/* reexport safe */ _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_17__[\"default\"]),\n/* harmony export */ \"useSeamlyEventStream\": () => (/* binding */ useSeamlyEventStream)\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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _component_helper_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./component-helper-hooks */ \"./src/javascripts/ui/hooks/component-helper-hooks.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _file_upload_hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./file-upload-hooks */ \"./src/javascripts/ui/hooks/file-upload-hooks.js\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _live_region_hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./live-region-hooks */ \"./src/javascripts/ui/hooks/live-region-hooks.js\");\n/* harmony import */ var _use_seamly_activity_event_handler__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./use-seamly-activity-event-handler */ \"./src/javascripts/ui/hooks/use-seamly-activity-event-handler.js\");\n/* harmony import */ var _seamly_entry_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./seamly-entry-hooks */ \"./src/javascripts/ui/hooks/seamly-entry-hooks.js\");\n/* harmony import */ var _utility_hooks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _focus_helper_hooks__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./focus-helper-hooks */ \"./src/javascripts/ui/hooks/focus-helper-hooks.js\");\n/* harmony import */ var _use_seamly_chat__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./use-seamly-chat */ \"./src/javascripts/ui/hooks/use-seamly-chat.js\");\n/* harmony import */ var _use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./use-seamly-stored-visibility */ \"./src/javascripts/ui/hooks/use-seamly-stored-visibility.js\");\n/* harmony import */ var _use_seamly_visibility__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./use-seamly-visibility */ \"./src/javascripts/ui/hooks/use-seamly-visibility.js\");\n/* harmony import */ var _use_seamly_idle_detach_countdown__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./use-seamly-idle-detach-countdown */ \"./src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js\");\n/* harmony import */ var _use_seamly_resume_conversation_prompt__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./use-seamly-resume-conversation-prompt */ \"./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js\");\n // Import extracted hooks here for use inside this file\n\n // Export extracted hooks here,\n// although this is a redundant, it prevents a bazillion code changes for now.\n// TODO: Remove exports and import them from the correct files\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // This hook isn't used within the core\n// But it is used in implementations\n// and imported directly from this file\n// Please do not remove\n\nconst useSeamlyEventStream = (nextFn, filterFn) => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (api.stream) {\n if (filterFn) {\n api.stream().filter(filterFn).subscribe({\n next: nextFn\n });\n } else {\n api.stream().subscribe({\n next: nextFn\n });\n }\n }\n }, [api, nextFn, filterFn]);\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-hooks.js?");
1643
2039
 
1644
2040
  /***/ }),
1645
2041
 
@@ -1661,7 +2057,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1661
2057
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1662
2058
 
1663
2059
  "use strict";
1664
- 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 */ \"selectConfig\": () => (/* binding */ selectConfig),\n/* harmony export */ \"useSeamlyConfig\": () => (/* binding */ useSeamlyConfig),\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 */ \"useSeamlyDisclaimerState\": () => (/* binding */ useSeamlyDisclaimerState),\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\");\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 selectState = state => state.state;\nconst useSeamlyStateContext = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectState);\nconst selectConfig = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectState, ({\n config\n}) => config || {});\nconst useSeamlyConfig = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectConfig);\nconst selectEvents = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectState, selectConfig, ({\n events\n}, 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 useSeamlyDisclaimerState = () => useSeamlyStateContext().showDisclaimer;\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 } = useSeamlyConfig();\n return {\n isInline: layoutMode === 'inline',\n isModal: layoutMode === 'modal',\n isWindow: layoutMode === 'window',\n isResolving: !layoutMode\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-state-hooks.js?");
2060
+ 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 */ \"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__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../domains/config */ \"./src/javascripts/domains/config/index.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\nconst selectState = state => state.state;\nconst useSeamlyStateContext = () => (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(selectState);\nconst selectEvents = (0,reselect__WEBPACK_IMPORTED_MODULE_0__.createSelector)(selectState, _domains_config__WEBPACK_IMPORTED_MODULE_3__.Selectors.selectConfig, ({\n events\n}, 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__WEBPACK_IMPORTED_MODULE_3__.useConfig)();\n return {\n isInline: layoutMode === 'inline',\n isModal: layoutMode === 'modal',\n isWindow: layoutMode === 'window',\n isResolving: !layoutMode\n };\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/seamly-state-hooks.js?");
1665
2061
 
1666
2062
  /***/ }),
1667
2063
 
@@ -1716,7 +2112,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1716
2112
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1717
2113
 
1718
2114
  "use strict";
1719
- 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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _use_seamly_interrupt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./use-seamly-interrupt */ \"./src/javascripts/ui/hooks/use-seamly-interrupt.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config */ \"./src/javascripts/config.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 _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _utility_hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utility-hooks */ \"./src/javascripts/ui/hooks/utility-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\n\n\n\n\n\nconst {\n ADD_EVENT,\n CLEAR_EVENTS,\n CLEAR_INTERRUPT,\n SET_IS_LOADING,\n CLEAR_PARTICIPANTS,\n SET_HEADER_SUB_TITLE,\n SET_INITIAL_STATE,\n CLEAR_FEATURES,\n SET_FEATURES,\n RESET_UPLOAD_STATE,\n RESET_ENTRY_STATE\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__.seamlyActions;\n\nconst useSeamlyCommands = () => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n const seamlyState = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext)();\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_4__.SeamlyEventBusContext);\n const {\n setInterrupt\n } = (0,_use_seamly_interrupt__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const hasResponded = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyHasUserResponded)();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyHasConversation)();\n const {\n visible: visibility\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext)();\n const unreadMessageCount = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyUnreadCount)();\n const {\n config: appConfig\n } = seamlyState;\n const emitEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((...args) => {\n eventBus.emit(...args);\n }, [eventBus]);\n const start = (0,_utility_hooks__WEBPACK_IMPORTED_MODULE_10__.useStableCallback)(() => {\n api.sendContext(appConfig.context || {});\n emitEvent('ui.beforeStart', {\n visibility,\n hasConversation,\n hasResponded,\n unreadMessageCount\n });\n api.send('start');\n emitEvent('ui.start', {\n visibility,\n hasConversation,\n hasResponded,\n unreadMessageCount\n });\n }, [api, appConfig, emitEvent, hasResponded, hasConversation, visibility, unreadMessageCount]);\n const reset = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n dispatch({\n type: CLEAR_EVENTS\n });\n dispatch({\n type: CLEAR_INTERRUPT\n });\n dispatch({\n type: SET_IS_LOADING,\n isLoading: true\n });\n dispatch({\n type: CLEAR_PARTICIPANTS\n });\n dispatch({\n type: RESET_UPLOAD_STATE\n });\n dispatch({\n type: RESET_ENTRY_STATE\n });\n dispatch({\n type: CLEAR_FEATURES\n });\n const {\n agentName\n } = appConfig.defaults || {};\n dispatch({\n type: SET_HEADER_SUB_TITLE,\n title: agentName || ''\n });\n\n try {\n const {\n accountConfig = {},\n initialState = {}\n } = await api.reset();\n const {\n features\n } = accountConfig || {};\n dispatch({\n type: SET_FEATURES,\n features\n });\n dispatch({\n type: SET_INITIAL_STATE,\n initialState\n });\n } catch (error) {\n setInterrupt(error);\n }\n }, [api, dispatch, appConfig, setInterrupt]);\n const getMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(type => {\n const {\n events\n } = seamlyState;\n return {\n type,\n id: (0,_lib_id__WEBPACK_IMPORTED_MODULE_6__.randomId)(),\n transactionId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_6__.randomId)(),\n participant: _config__WEBPACK_IMPORTED_MODULE_7__.userParticipantId,\n fromClient: true,\n // We add a timestamp of 1 greater than the previous timestamp in the\n // events array to ensure proper sorting should a history fetch be done\n // prior to receipt of the related ACK.\n occurredAt: events.length > 0 ? events[events.length - 1].payload.occurredAt + 1 : Date.now(),\n meta: {}\n };\n }, [seamlyState]);\n const getTextMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(bodyText => {\n const base = getMessageBase('text');\n return _objectSpread(_objectSpread({}, base), {}, {\n body: {\n text: bodyText\n }\n });\n }, [getMessageBase]);\n const sendMessage = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n body,\n config = {}\n }) => {\n if (body.trim() === '') {\n return;\n }\n\n const message = _objectSpread(_objectSpread({}, getTextMessageBase(body)), config);\n\n const sanitizedText = (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_8__.sanitizeText)(body);\n\n const sanitizedMessage = _objectSpread(_objectSpread({}, message), {}, {\n body: {\n text: sanitizedText\n }\n });\n\n api.send('message', message);\n emitEvent('message', message);\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'message',\n payload: sanitizedMessage\n }\n });\n }, [api, dispatch, emitEvent, getTextMessageBase]);\n const addMessageBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(text => {\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'message',\n payload: getTextMessageBase(text)\n }\n });\n }, [dispatch, getTextMessageBase]);\n const addUploadBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((id, transactionId, occurredAt, contentType, deleteAt, filename, filesize, url) => {\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'message',\n payload: {\n type: 'upload',\n id,\n transactionId,\n participant: _config__WEBPACK_IMPORTED_MODULE_7__.userParticipantId,\n fromClient: true,\n occurredAt,\n meta: {},\n body: {\n contentType,\n deleteAt,\n filename,\n filesize,\n url\n }\n }\n }\n });\n }, [dispatch]);\n const addDivider = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(subtype => {\n const payload = {\n body: {\n subtype,\n type: 'divider'\n },\n fromClient: false,\n fromHistory: true,\n id: (0,_lib_id__WEBPACK_IMPORTED_MODULE_6__.randomId)(),\n transactionId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_6__.randomId)(),\n type: 'divider'\n };\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'info',\n payload\n }\n });\n }, [dispatch]);\n const sendInfo = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n type,\n subtype\n }) => {\n const info = {\n type,\n subtype,\n id: (0,_lib_id__WEBPACK_IMPORTED_MODULE_6__.randomId)(),\n transactionId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_6__.randomId)(),\n participant: _config__WEBPACK_IMPORTED_MODULE_7__.userParticipantId,\n fromClient: true\n };\n api.send('info', info);\n }, [api]);\n const sendAction = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(body => {\n if (!body) {\n return;\n }\n\n api.send('action', body);\n const {\n type\n } = body;\n\n if (type !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__.actionTypes.typing && type !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_9__.actionTypes.read) {\n emitEvent(`action.${type}`, body);\n }\n }, [api, emitEvent]);\n const sendContext = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(context => {\n api.sendContext(context);\n }, [api]);\n const connect = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (api.connected) {\n return Promise.reject(new Error('The API is already connected'));\n }\n\n return api.connect().then(initialState => {\n if (initialState) {\n dispatch({\n type: SET_INITIAL_STATE,\n initialState\n });\n }\n }).catch(error => {\n setInterrupt(error);\n });\n }, [api, dispatch, setInterrupt]);\n return {\n connect,\n start,\n sendMessage,\n sendInfo,\n sendAction,\n sendContext,\n reset,\n emitEvent,\n addMessageBubble,\n addUploadBubble,\n addDivider,\n apiConfigReady: api.configReady\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyCommands);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-commands.js?");
2115
+ 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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/core/seamly-api-context */ \"./src/javascripts/ui/components/core/seamly-api-context.js\");\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _utils_general_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _utility_hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utility-hooks */ \"./src/javascripts/ui/hooks/utility-hooks.js\");\n/* harmony import */ var _domains_interrupt__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../domains/interrupt */ \"./src/javascripts/domains/interrupt/index.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../domains/app */ \"./src/javascripts/domains/app/index.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\nconst {\n ADD_EVENT,\n CLEAR_EVENTS,\n SET_IS_LOADING,\n CLEAR_PARTICIPANTS,\n SET_HEADER_SUB_TITLE,\n SET_INITIAL_STATE,\n CLEAR_FEATURES,\n SET_FEATURES,\n RESET_UPLOAD_STATE,\n RESET_ENTRY_STATE\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_8__.seamlyActions;\n\nconst useSeamlyCommands = () => {\n const api = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyApiContext)();\n const appConfig = (0,_domains_config__WEBPACK_IMPORTED_MODULE_11__.useConfig)();\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const eventBus = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useContext)(_components_core_seamly_api_context__WEBPACK_IMPORTED_MODULE_4__.SeamlyEventBusContext);\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_12__.useUserHasResponded)();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyHasConversation)();\n const {\n visible: visibility\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext)();\n const unreadMessageCount = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyUnreadCount)();\n const emitEvent = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((...args) => {\n eventBus.emit(...args);\n }, [eventBus]);\n const start = (0,_utility_hooks__WEBPACK_IMPORTED_MODULE_9__.useStableCallback)(() => {\n api.sendContext(appConfig.context || {});\n emitEvent('ui.beforeStart', {\n visibility,\n hasConversation,\n hasResponded,\n unreadMessageCount\n });\n api.send('start');\n emitEvent('ui.start', {\n visibility,\n hasConversation,\n hasResponded,\n unreadMessageCount\n });\n }, [api, appConfig, emitEvent, hasResponded, hasConversation, visibility, unreadMessageCount]);\n const reset = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_10__.Actions.clear());\n dispatch({\n type: CLEAR_EVENTS\n });\n dispatch({\n type: SET_IS_LOADING,\n isLoading: true\n });\n dispatch({\n type: CLEAR_PARTICIPANTS\n });\n dispatch({\n type: RESET_UPLOAD_STATE\n });\n dispatch({\n type: RESET_ENTRY_STATE\n });\n dispatch({\n type: CLEAR_FEATURES\n });\n const {\n agentName\n } = appConfig.defaults || {};\n dispatch({\n type: SET_HEADER_SUB_TITLE,\n title: agentName || ''\n });\n\n try {\n const {\n features\n } = await api.reset();\n dispatch({\n type: SET_FEATURES,\n features\n });\n dispatch({\n type: SET_INITIAL_STATE,\n initialState: {}\n });\n } catch (error) {\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_10__.Actions.set(error));\n }\n }, [api, dispatch, appConfig]);\n const getMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(type => ({\n type,\n id: (0,_lib_id__WEBPACK_IMPORTED_MODULE_5__.randomId)(),\n transactionId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_5__.randomId)(),\n participant: _config__WEBPACK_IMPORTED_MODULE_6__.userParticipantId,\n fromClient: true,\n occurredAt: Date.now() * 1000,\n meta: {}\n }), []);\n const getTextMessageBase = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(bodyText => {\n const base = getMessageBase('text');\n return _objectSpread(_objectSpread({}, base), {}, {\n body: {\n text: bodyText\n }\n });\n }, [getMessageBase]);\n const sendMessage = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n body,\n config = {}\n }) => {\n if (body.trim() === '') {\n return;\n }\n\n const message = _objectSpread(_objectSpread({}, getTextMessageBase(body)), config);\n\n const sanitizedText = (0,_utils_general_utils__WEBPACK_IMPORTED_MODULE_7__.sanitizeText)(body);\n\n const sanitizedMessage = _objectSpread(_objectSpread({}, message), {}, {\n body: {\n text: sanitizedText\n }\n });\n\n api.send('message', message);\n emitEvent('message', message);\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'message',\n payload: sanitizedMessage\n }\n });\n }, [api, dispatch, emitEvent, getTextMessageBase]);\n const addMessageBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(text => {\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'message',\n payload: getTextMessageBase(text)\n }\n });\n }, [dispatch, getTextMessageBase]);\n const addUploadBubble = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)((id, transactionId, occurredAt, contentType, filename, filesize, url) => {\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'message',\n payload: {\n type: 'upload',\n id,\n transactionId,\n participant: _config__WEBPACK_IMPORTED_MODULE_6__.userParticipantId,\n fromClient: true,\n occurredAt,\n meta: {},\n body: {\n contentType,\n filename,\n filesize,\n url\n }\n }\n }\n });\n }, [dispatch]);\n const addDivider = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(subtype => {\n const payload = {\n body: {\n subtype,\n type: 'divider'\n },\n fromClient: false,\n fromHistory: true,\n id: (0,_lib_id__WEBPACK_IMPORTED_MODULE_5__.randomId)(),\n transactionId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_5__.randomId)(),\n type: 'divider'\n };\n dispatch({\n type: ADD_EVENT,\n event: {\n type: 'info',\n payload\n }\n });\n }, [dispatch]);\n const sendInfo = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n type,\n subtype\n }) => {\n const info = {\n type,\n subtype,\n id: (0,_lib_id__WEBPACK_IMPORTED_MODULE_5__.randomId)(),\n transactionId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_5__.randomId)(),\n participant: _config__WEBPACK_IMPORTED_MODULE_6__.userParticipantId,\n fromClient: true\n };\n api.send('info', info);\n }, [api]);\n const sendAction = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(body => {\n if (!body) {\n return;\n }\n\n api.send('action', body);\n const {\n type\n } = body;\n\n if (type !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_8__.actionTypes.typing && type !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_8__.actionTypes.read) {\n emitEvent(`action.${type}`, body);\n }\n }, [api, emitEvent]);\n const sendContext = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(context => {\n api.sendContext(context);\n }, [api]);\n const connect = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (api.connected) {\n return Promise.reject(new Error('The API is already connected'));\n }\n\n return api.connect().then(initialState => {\n if (initialState) {\n dispatch({\n type: SET_INITIAL_STATE,\n initialState\n });\n }\n }).catch(error => {\n dispatch(_domains_interrupt__WEBPACK_IMPORTED_MODULE_10__.Actions.set(error));\n });\n }, [api, dispatch]);\n return {\n connect,\n start,\n sendMessage,\n sendInfo,\n sendAction,\n sendContext,\n reset,\n emitEvent,\n addMessageBubble,\n addUploadBubble,\n addDivider,\n apiConfigReady: api.configReady\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyCommands);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-commands.js?");
1720
2116
 
1721
2117
  /***/ }),
1722
2118
 
@@ -1742,17 +2138,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1742
2138
 
1743
2139
  /***/ }),
1744
2140
 
1745
- /***/ "./src/javascripts/ui/hooks/use-seamly-interrupt.js":
1746
- /*!**********************************************************!*\
1747
- !*** ./src/javascripts/ui/hooks/use-seamly-interrupt.js ***!
1748
- \**********************************************************/
1749
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1750
-
1751
- "use strict";
1752
- 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 _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _seamly_option_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-option-hooks */ \"./src/javascripts/ui/hooks/seamly-option-hooks.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../api/errors/seamly-offline-error */ \"./src/javascripts/api/errors/seamly-offline-error.js\");\n/* harmony import */ var _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../api/errors/seamly-general-error */ \"./src/javascripts/api/errors/seamly-general-error.js\");\n/* harmony import */ var _api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../api/errors/seamly-configuration-error */ \"./src/javascripts/api/errors/seamly-configuration-error.js\");\n/* harmony import */ var _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../api/errors/seamly-session-expired-error */ \"./src/javascripts/api/errors/seamly-session-expired-error.js\");\n/* harmony import */ var _api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../api/errors/seamly-unauthorized-error */ \"./src/javascripts/api/errors/seamly-unauthorized-error.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\nconst {\n SET_INTERRUPT\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__.seamlyActions;\n\nconst useSeamlyInterrupt = () => {\n const {\n t\n } = (0,_domains_i18n__WEBPACK_IMPORTED_MODULE_1__.useI18n)();\n const {\n hasInterrupt,\n meta\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyStateContext)().interrupt;\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const {\n setUserSelectedOption\n } = (0,_seamly_option_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyOptions)();\n const setInterrupt = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(error => {\n if (!(error instanceof _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__[\"default\"])) {\n setUserSelectedOption(_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_5__.featureKeys.cobrowsing, false);\n }\n\n if (error instanceof _api_errors_seamly_general_error__WEBPACK_IMPORTED_MODULE_7__[\"default\"] || error instanceof _api_errors_seamly_configuration_error__WEBPACK_IMPORTED_MODULE_8__[\"default\"] || error instanceof _api_errors_seamly_session_expired_error__WEBPACK_IMPORTED_MODULE_9__[\"default\"] || error instanceof _api_errors_seamly_offline_error__WEBPACK_IMPORTED_MODULE_6__[\"default\"] || error instanceof _api_errors_seamly_unauthorized_error__WEBPACK_IMPORTED_MODULE_10__[\"default\"]) {\n const {\n langKey,\n action\n } = error;\n const title = t(`${langKey}.title`);\n const message = t(`${langKey}.message`);\n const srText = t(`${langKey}.srText`);\n const buttonText = t(`${langKey}.buttonText`);\n dispatch({\n type: SET_INTERRUPT,\n interrupt: _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, langKey ? {\n title,\n message,\n srText\n } : {}), action ? {\n action\n } : {}), action && langKey ? {\n buttonText\n } : {}), {}, {\n originalError: error\n })\n });\n } else {\n throw error;\n }\n }, [dispatch, t, setUserSelectedOption]);\n return {\n hasInterrupt,\n meta,\n setInterrupt\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyInterrupt);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-interrupt.js?");
1753
-
1754
- /***/ }),
1755
-
1756
2141
  /***/ "./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js":
1757
2142
  /*!***************************************************************************!*\
1758
2143
  !*** ./src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js ***!
@@ -1771,7 +2156,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1771
2156
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1772
2157
 
1773
2158
  "use strict";
1774
- 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 _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-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\nconst useSeamlyStoredVisibility = () => {\n const {\n layoutMode\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConfig)();\n const key = 'visibility';\n const {\n get,\n set\n } = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_2__.useSeamlyObjectStore)();\n let storedVisibilityObj = {};\n const savedVisibility = get ? get(key) : {};\n\n if (savedVisibility) {\n storedVisibilityObj = savedVisibility;\n }\n\n const setStoredVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(state => {\n const saved = get ? get(key) : {};\n set(key, _objectSpread(_objectSpread({}, saved), {}, {\n [layoutMode]: state\n }));\n }, [set, get, layoutMode]);\n return [layoutMode ? storedVisibilityObj[layoutMode] : null, set && layoutMode ? setStoredVisibility : null];\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyStoredVisibility);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-stored-visibility.js?");
2159
+ 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 _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../domains/config */ \"./src/javascripts/domains/config/index.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\nconst useSeamlyStoredVisibility = () => {\n const {\n layoutMode\n } = (0,_domains_config__WEBPACK_IMPORTED_MODULE_2__.useConfig)();\n const key = 'visibility';\n const {\n get,\n set\n } = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyObjectStore)();\n let storedVisibilityObj = {};\n const savedVisibility = get ? get(key) : {};\n\n if (savedVisibility) {\n storedVisibilityObj = savedVisibility;\n }\n\n const setStoredVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(state => {\n const saved = get ? get(key) : {};\n set(key, _objectSpread(_objectSpread({}, saved), {}, {\n [layoutMode]: state\n }));\n }, [set, get, layoutMode]);\n return [layoutMode ? storedVisibilityObj[layoutMode] : null, set && layoutMode ? setStoredVisibility : null];\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyStoredVisibility);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-stored-visibility.js?");
1775
2160
 
1776
2161
  /***/ }),
1777
2162
 
@@ -1782,7 +2167,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1782
2167
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1783
2168
 
1784
2169
  "use strict";
1785
- 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 _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./use-seamly-stored-visibility */ \"./src/javascripts/ui/hooks/use-seamly-stored-visibility.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n\n\n\n\n\n\n\nconst {\n SET_VISIBILITY\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.seamlyActions;\n\nconst useSeamlyVisibility = () => {\n const config = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyConfig)();\n const {\n layoutMode,\n visibilityCallback\n } = config;\n const {\n visible\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyStateContext)();\n const {\n emitEvent\n } = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__[\"default\"])();\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const [storedVisibility, setStoredVisibility] = (0,_use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const hasResponded = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyHasUserResponded)();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyHasConversation)();\n const unreadMessageCount = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const isVisible = visible ? visible !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.hidden : false;\n const isOpen = visible && layoutMode ? visible === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.open || layoutMode === 'inline' && visible !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.hidden : false;\n const setVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(visibility => {\n const visibilityFn = visibilityCallback || _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.calculateVisibility;\n const requestedVisibility = visibilityFn({\n hasConversation,\n hasResponded,\n previousVisibility: storedVisibility || null,\n requestedVisibility: visibility,\n config\n });\n\n if (![_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.open, _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.minimized, _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.hidden].includes(requestedVisibility)) {\n console.error('The visibilityCallback function should return \"open\", \"minimized\" or \"hidden\".');\n return;\n }\n\n if (requestedVisibility !== visible) {\n if (setStoredVisibility) {\n setStoredVisibility(requestedVisibility);\n } // Don't broadcast the init visibility state\n\n\n if (visibility) {\n emitEvent('ui.visible', requestedVisibility, {\n visibility: requestedVisibility,\n hasConversation,\n hasResponded,\n unreadMessageCount\n });\n }\n\n dispatch({\n type: SET_VISIBILITY,\n visible: requestedVisibility\n });\n }\n }, [visible, emitEvent, dispatch, hasConversation, hasResponded, storedVisibility, visibilityCallback, config, setStoredVisibility, unreadMessageCount]);\n return {\n isVisible,\n isOpen,\n visible,\n setVisibility\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyVisibility);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-visibility.js?");
2170
+ 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 _seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seamly-state-hooks */ \"./src/javascripts/ui/hooks/seamly-state-hooks.js\");\n/* harmony import */ var _use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./use-seamly-commands */ \"./src/javascripts/ui/hooks/use-seamly-commands.js\");\n/* harmony import */ var _use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./use-seamly-dispatch */ \"./src/javascripts/ui/hooks/use-seamly-dispatch.js\");\n/* harmony import */ var _seamly_api_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./seamly-api-hooks */ \"./src/javascripts/ui/hooks/seamly-api-hooks.js\");\n/* harmony import */ var _use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./use-seamly-stored-visibility */ \"./src/javascripts/ui/hooks/use-seamly-stored-visibility.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n/* harmony import */ var _domains_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../domains/config */ \"./src/javascripts/domains/config/index.js\");\n/* harmony import */ var _domains_app__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../domains/app */ \"./src/javascripts/domains/app/index.js\");\n\n\n\n\n\n\n\n\n\nconst {\n SET_VISIBILITY\n} = _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.seamlyActions;\n\nconst useSeamlyVisibility = () => {\n const config = (0,_domains_config__WEBPACK_IMPORTED_MODULE_7__.useConfig)();\n const {\n layoutMode,\n visibilityCallback\n } = config;\n const {\n visible\n } = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyStateContext)();\n const {\n emitEvent\n } = (0,_use_seamly_commands__WEBPACK_IMPORTED_MODULE_2__[\"default\"])();\n const dispatch = (0,_use_seamly_dispatch__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n const [storedVisibility, setStoredVisibility] = (0,_use_seamly_stored_visibility__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n const hasResponded = (0,_domains_app__WEBPACK_IMPORTED_MODULE_8__.useUserHasResponded)();\n const hasConversation = (0,_seamly_api_hooks__WEBPACK_IMPORTED_MODULE_4__.useSeamlyHasConversation)();\n const unreadMessageCount = (0,_seamly_state_hooks__WEBPACK_IMPORTED_MODULE_1__.useSeamlyUnreadCount)();\n const isVisible = visible ? visible !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.hidden : false;\n const isOpen = visible && layoutMode ? visible === _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.open || layoutMode === 'inline' && visible !== _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.hidden : false;\n const setVisibility = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useCallback)(visibility => {\n const visibilityFn = visibilityCallback || _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.calculateVisibility;\n const requestedVisibility = visibilityFn({\n hasConversation,\n hasResponded,\n previousVisibility: storedVisibility || null,\n requestedVisibility: visibility,\n config\n });\n\n if (![_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.open, _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.minimized, _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_6__.visibilityStates.hidden].includes(requestedVisibility)) {\n console.error('The visibilityCallback function should return \"open\", \"minimized\" or \"hidden\".');\n return;\n }\n\n if (requestedVisibility !== visible) {\n if (setStoredVisibility) {\n setStoredVisibility(requestedVisibility);\n } // Don't broadcast the init visibility state\n\n\n if (visibility) {\n emitEvent('ui.visible', requestedVisibility, {\n visibility: requestedVisibility,\n hasConversation,\n hasResponded,\n unreadMessageCount\n });\n }\n\n dispatch({\n type: SET_VISIBILITY,\n visible: requestedVisibility\n });\n }\n }, [visible, emitEvent, dispatch, hasConversation, hasResponded, storedVisibility, visibilityCallback, config, setStoredVisibility, unreadMessageCount]);\n return {\n isVisible,\n isOpen,\n visible,\n setVisibility\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSeamlyVisibility);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-seamly-visibility.js?");
1786
2171
 
1787
2172
  /***/ }),
1788
2173
 
@@ -1793,7 +2178,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1793
2178
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1794
2179
 
1795
2180
  "use strict";
1796
- 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 _seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.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 _domains_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n\n\n\n\nconst useSingleFileUpload = (formId, name) => {\n const fileList = (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelectorWithProps)(_domains_forms__WEBPACK_IMPORTED_MODULE_2__.Selectors.getControlValueByName, {\n formId,\n name\n }, [formId, name]); // This hook acts as a helper as the data model is built to handle multiple\n // file uploads but currently Seamly only supports single file uploads.\n // This hook HAS to be used inside the FormBoundary of the file upload.\n\n const {\n currentUploads\n } = (0,_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useFileUploads)();\n let uploadHandle = null;\n let hasServerError = false;\n let progress = 0;\n\n if (currentUploads && currentUploads.length > 0) {\n const currentUpload = currentUploads[0];\n uploadHandle = currentUpload.uploadHandle;\n hasServerError = !!currentUpload.error;\n progress = currentUpload.progress;\n }\n\n return {\n selectedFileName: fileList && fileList.length > 0 ? fileList[0].name : '',\n uploadHandle,\n hasServerError,\n progress\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSingleFileUpload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-single-file-upload.js?");
2181
+ 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 _seamly_hooks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seamly-hooks */ \"./src/javascripts/ui/hooks/seamly-hooks.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 _domains_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../domains/forms */ \"./src/javascripts/domains/forms/index.js\");\n\n\n\n\nconst useSingleFileUpload = (formId, name) => {\n const fileList = (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.useSelectorWithProps)(_domains_forms__WEBPACK_IMPORTED_MODULE_2__.Selectors.getControlValueByName, {\n formId,\n name\n }, [formId, name]); // This hook acts as a helper as the data model is built to handle multiple\n // file uploads but currently Seamly only supports single file uploads.\n // This hook HAS to be used inside the FormBoundary of the file upload.\n\n const {\n currentUploads\n } = (0,_seamly_hooks__WEBPACK_IMPORTED_MODULE_0__.useFileUploads)();\n const hasFile = fileList && fileList.length > 0;\n let uploadHandle = null;\n let hasServerError = false;\n let progress = 0;\n\n if (currentUploads && currentUploads.length > 0) {\n const currentUpload = currentUploads[0];\n uploadHandle = currentUpload.uploadHandle;\n hasServerError = !!currentUpload.error;\n progress = currentUpload.progress;\n }\n\n return {\n hasFile,\n selectedFileName: hasFile ? fileList[0].name : '',\n uploadHandle,\n hasServerError,\n progress\n };\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSingleFileUpload);\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/hooks/use-single-file-upload.js?");
1797
2182
 
1798
2183
  /***/ }),
1799
2184
 
@@ -1808,28 +2193,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1808
2193
 
1809
2194
  /***/ }),
1810
2195
 
1811
- /***/ "./src/javascripts/ui/store/index.js":
1812
- /*!*******************************************!*\
1813
- !*** ./src/javascripts/ui/store/index.js ***!
1814
- \*******************************************/
1815
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1816
-
1817
- "use strict";
1818
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Provider)\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_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../domains/redux */ \"./src/javascripts/domains/redux/index.js\");\n/* harmony import */ var _domains_forms__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../domains/forms */ \"./src/javascripts/domains/forms/index.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_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../domains/i18n */ \"./src/javascripts/domains/i18n/index.js\");\n/* harmony import */ var _state_reducer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./state-reducer */ \"./src/javascripts/ui/store/state-reducer.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 Provider({\n store: providedStore,\n children,\n translations: overrides\n}) {\n /* eslint-disable react-hooks/exhaustive-deps */\n const store = (0,preact_hooks__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n // if a store is provided, we use that\n if (providedStore) {\n return providedStore;\n } // initialization code fore store\n // ideally, this gets lifted outside of the rendering context\n // as the provide the \"store\" from app-initialization\n // for now, we provide a fallback\n\n\n const newStore = (0,_domains_redux__WEBPACK_IMPORTED_MODULE_1__.createReduxStore)({\n state: _state_reducer__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n [String(_domains_forms__WEBPACK_IMPORTED_MODULE_2__.Reducer)]: _domains_forms__WEBPACK_IMPORTED_MODULE_2__.Reducer,\n [String(_domains_translations__WEBPACK_IMPORTED_MODULE_3__.Reducer)]: _domains_translations__WEBPACK_IMPORTED_MODULE_3__.Reducer,\n [String(_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.Reducer)]: _domains_i18n__WEBPACK_IMPORTED_MODULE_4__.Reducer\n });\n newStore.dispatch((0,_domains_i18n__WEBPACK_IMPORTED_MODULE_4__.initI18n)(overrides));\n return newStore;\n }, [providedStore]);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n return (0,preact_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_domains_redux__WEBPACK_IMPORTED_MODULE_1__.StoreProvider, {\n value: store,\n children: children\n });\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/store/index.js?");
1819
-
1820
- /***/ }),
1821
-
1822
- /***/ "./src/javascripts/ui/store/state-reducer.js":
1823
- /*!***************************************************!*\
1824
- !*** ./src/javascripts/ui/store/state-reducer.js ***!
1825
- \***************************************************/
1826
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1827
-
1828
- "use strict";
1829
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ stateReducer)\n/* harmony export */ });\n/* harmony import */ var _lib_id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/id */ \"./src/javascripts/lib/id.js\");\n/* harmony import */ var _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/seamly-utils */ \"./src/javascripts/ui/utils/seamly-utils.js\");\n\n\nconst initialState = {\n events: [],\n config: {\n hideOnNoUserResponse: false\n },\n initialState: {},\n unreadEvents: 0,\n isLoading: false,\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false\n },\n resumeConversationPrompt: false,\n visible: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.visibilityStates.hidden,\n serviceInfo: {\n activeServiceSessionId: ''\n },\n participantInfo: {\n participants: {},\n currentAgent: ''\n },\n headerTitles: {\n title: null,\n subTitle: ''\n },\n interrupt: {\n hasInterrupt: false,\n meta: {}\n },\n historyLoaded: false,\n skiplinkTargetId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n optionsButtonId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n cobrowsingContainerId: (0,_lib_id__WEBPACK_IMPORTED_MODULE_0__.randomId)(),\n showDisclaimer: false,\n serviceData: {},\n options: {\n features: {},\n panelActive: false,\n optionActive: '',\n userSelectedOptions: {}\n },\n showFileUpload: false,\n currentUploads: [],\n entryMeta: {\n default: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n active: _utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.entryTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {}\n },\n seamlyContainerElement: null\n};\nfunction stateReducer(state = initialState, action) {\n return (0,_utils_seamly_utils__WEBPACK_IMPORTED_MODULE_1__.seamlyStateReducer)(state, action);\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/store/state-reducer.js?");
1830
-
1831
- /***/ }),
1832
-
1833
2196
  /***/ "./src/javascripts/ui/utils/form-utils.js":
1834
2197
  /*!************************************************!*\
1835
2198
  !*** ./src/javascripts/ui/utils/form-utils.js ***!
@@ -1848,7 +2211,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1848
2211
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1849
2212
 
1850
2213
  "use strict";
1851
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"elementMatch\": () => (/* binding */ elementMatch),\n/* harmony export */ \"closestElement\": () => (/* binding */ closestElement),\n/* harmony export */ \"createAriaHider\": () => (/* binding */ createAriaHider),\n/* harmony export */ \"propIsTrue\": () => (/* binding */ propIsTrue),\n/* harmony export */ \"millisecondsToSeconds\": () => (/* binding */ millisecondsToSeconds),\n/* harmony export */ \"microsecondsToMilliseconds\": () => (/* binding */ microsecondsToMilliseconds),\n/* harmony export */ \"sanitizeText\": () => (/* binding */ sanitizeText),\n/* harmony export */ \"getTimeFromSeconds\": () => (/* binding */ getTimeFromSeconds),\n/* harmony export */ \"formatBytes\": () => (/* binding */ formatBytes),\n/* harmony export */ \"getUrlParams\": () => (/* binding */ getUrlParams),\n/* harmony export */ \"getUrlSearchString\": () => (/* binding */ getUrlSearchString),\n/* harmony export */ \"keyCodes\": () => (/* binding */ keyCodes),\n/* harmony export */ \"keyNames\": () => (/* binding */ keyNames),\n/* harmony export */ \"getKey\": () => (/* binding */ getKey),\n/* harmony export */ \"focusElement\": () => (/* binding */ focusElement),\n/* harmony export */ \"runIfElementContainsOrHasFocus\": () => (/* binding */ runIfElementContainsOrHasFocus),\n/* harmony export */ \"getRelativeDate\": () => (/* binding */ getRelativeDate),\n/* harmony export */ \"flattenObject\": () => (/* binding */ flattenObject)\n/* harmony export */ });\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\nconst debounce = (func, wait) => {\n let timeout;\n return function (...args) {\n const context = this;\n let isCancelled = false;\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n timeout = null;\n\n if (!isCancelled) {\n func.apply(context, args);\n }\n\n isCancelled = false;\n }, wait);\n return runInstant => {\n isCancelled = true;\n\n if (runInstant) {\n func.apply(context, args);\n }\n };\n };\n};\nconst elementMatch = (el, match) => {\n if (el.matches) {\n el.matches(match);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(match);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(match);\n }\n\n return false;\n};\nconst closestElement = (el, match) => {\n if (el.closest) {\n return el.closest(match);\n }\n\n let foundElement = el;\n\n do {\n if (elementMatch(foundElement, match)) {\n break;\n }\n\n foundElement = foundElement.parentElement || foundElement.parentNode;\n } while (foundElement !== null && foundElement.nodeType === 1);\n\n return foundElement !== null && foundElement.nodeType === 1 ? foundElement : null;\n};\nconst createAriaHider = () => {\n const originalValues = [];\n const rootNodes = [];\n document.querySelectorAll('body > *:not([role=\"dialog\"])').forEach(node => {\n const attr = node.getAttribute('aria-hidden');\n const alreadyHidden = attr !== null && attr !== 'false';\n\n if (alreadyHidden) {\n return;\n }\n\n originalValues.push(attr);\n rootNodes.push(node);\n node.setAttribute('aria-hidden', 'true');\n });\n return () => {\n rootNodes.forEach((node, index) => {\n const originalValue = originalValues[index];\n\n if (originalValue === null) {\n node.removeAttribute('aria-hidden');\n } else {\n node.setAttribute('aria-hidden', originalValue);\n }\n });\n };\n};\nconst propIsTrue = prop => prop === 'true' || prop === true;\nconst millisecondsToSeconds = milliseconds => {\n return Math.ceil(milliseconds / 1000);\n};\nconst microsecondsToMilliseconds = microseconds => {\n return Math.ceil(microseconds / 1000);\n};\nconst sanitizeText = text => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/\\//g, '&#x2F;');\nconst getTimeFromSeconds = seconds => {\n const minutes = Math.floor(seconds / 60);\n const secondsPartial = seconds - minutes * 60;\n return {\n minutes,\n seconds: secondsPartial\n };\n};\nconst formatBytes = (bytes, decimals = 2) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\nconst getUrlParams = () => {\n const {\n search\n } = window.location;\n\n if (!search) {\n return {};\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n return hashes.reduce((acc, hash) => {\n const [key, val] = hash.split('=');\n return _objectSpread(_objectSpread({}, acc), {}, {\n [key]: decodeURIComponent(val)\n });\n }, {});\n};\nconst getUrlSearchString = params => {\n return Object.keys(params).reduce((search, key) => `${search}${search ? '&' : ''}${key}=${encodeURIComponent(params[key])}`, '');\n};\nconst keyCodes = {\n 27: 'Escape',\n 35: 'End',\n 36: 'Home',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown'\n};\nconst keyNames = {\n Escape: 'Escape',\n End: 'End',\n Home: 'Home',\n ArrowLeft: 'ArrowLeft',\n ArrowUp: 'ArrowUp',\n ArrowRight: 'ArrowRight',\n ArrowDown: 'ArrowDown'\n};\nconst getKey = e => e.code ? keyNames[e.code] : keyCodes[e.keyCode];\nconst focusElement = el => {\n if (el) {\n el.focus();\n }\n};\nconst runIfElementContainsOrHasFocus = (el, callback) => {\n if (el && (el.contains(document.activeElement) || el === document.activeElement)) {\n callback();\n }\n}; // Compare two dates to decide which relative date to return\n\nconst getRelativeDate = (date, currentDate) => {\n const msMidnightToday = new Date(currentDate).setHours(0, 0, 0, 0);\n const msDate = date.getTime();\n const dayInMs = 86400000;\n\n if (msDate >= msMidnightToday + dayInMs) {\n // Future date\n return date;\n } else if (msDate > msMidnightToday) {\n // Today\n return 'today';\n } else if (msDate > msMidnightToday - dayInMs) {\n // Yesterday\n return 'yesterday';\n } else {\n // Older date\n return date;\n }\n};\nconst flattenObject = (obj, prefix = '') => Object.keys(obj).reduce((acc, k) => {\n const pre = prefix.length ? `${prefix}.` : '';\n if (typeof obj[k] === 'object' && obj[k] !== null && Object.keys(obj[k]).length > 0) Object.assign(acc, flattenObject(obj[k], pre + k));else acc[pre + k] = obj[k];\n return acc;\n}, {});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/general-utils.js?");
2214
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"elementMatch\": () => (/* binding */ elementMatch),\n/* harmony export */ \"closestElement\": () => (/* binding */ closestElement),\n/* harmony export */ \"createAriaHider\": () => (/* binding */ createAriaHider),\n/* harmony export */ \"propIsTrue\": () => (/* binding */ propIsTrue),\n/* harmony export */ \"millisecondsToSeconds\": () => (/* binding */ millisecondsToSeconds),\n/* harmony export */ \"microsecondsToMilliseconds\": () => (/* binding */ microsecondsToMilliseconds),\n/* harmony export */ \"sanitizeText\": () => (/* binding */ sanitizeText),\n/* harmony export */ \"getTimeFromSeconds\": () => (/* binding */ getTimeFromSeconds),\n/* harmony export */ \"formatBytes\": () => (/* binding */ formatBytes),\n/* harmony export */ \"getUrlParams\": () => (/* binding */ getUrlParams),\n/* harmony export */ \"getUrlSearchString\": () => (/* binding */ getUrlSearchString),\n/* harmony export */ \"keyCodes\": () => (/* binding */ keyCodes),\n/* harmony export */ \"keyNames\": () => (/* binding */ keyNames),\n/* harmony export */ \"getKey\": () => (/* binding */ getKey),\n/* harmony export */ \"focusElement\": () => (/* binding */ focusElement),\n/* harmony export */ \"runIfElementContainsOrHasFocus\": () => (/* binding */ runIfElementContainsOrHasFocus),\n/* harmony export */ \"getRelativeDate\": () => (/* binding */ getRelativeDate),\n/* harmony export */ \"pick\": () => (/* binding */ pick),\n/* harmony export */ \"omit\": () => (/* binding */ omit)\n/* harmony export */ });\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\nconst debounce = (func, wait) => {\n let timeout;\n return function (...args) {\n const context = this;\n let isCancelled = false;\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n timeout = null;\n\n if (!isCancelled) {\n func.apply(context, args);\n }\n\n isCancelled = false;\n }, wait);\n return runInstant => {\n isCancelled = true;\n\n if (runInstant) {\n func.apply(context, args);\n }\n };\n };\n};\nconst elementMatch = (el, match) => {\n if (el.matches) {\n el.matches(match);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(match);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(match);\n }\n\n return false;\n};\nconst closestElement = (el, match) => {\n if (el.closest) {\n return el.closest(match);\n }\n\n let foundElement = el;\n\n do {\n if (elementMatch(foundElement, match)) {\n break;\n }\n\n foundElement = foundElement.parentElement || foundElement.parentNode;\n } while (foundElement !== null && foundElement.nodeType === 1);\n\n return foundElement !== null && foundElement.nodeType === 1 ? foundElement : null;\n};\nconst createAriaHider = () => {\n const originalValues = [];\n const rootNodes = [];\n document.querySelectorAll('body > *:not([role=\"dialog\"])').forEach(node => {\n const attr = node.getAttribute('aria-hidden');\n const alreadyHidden = attr !== null && attr !== 'false';\n\n if (alreadyHidden) {\n return;\n }\n\n originalValues.push(attr);\n rootNodes.push(node);\n node.setAttribute('aria-hidden', 'true');\n });\n return () => {\n rootNodes.forEach((node, index) => {\n const originalValue = originalValues[index];\n\n if (originalValue === null) {\n node.removeAttribute('aria-hidden');\n } else {\n node.setAttribute('aria-hidden', originalValue);\n }\n });\n };\n};\nconst propIsTrue = prop => prop === 'true' || prop === true;\nconst millisecondsToSeconds = milliseconds => {\n return Math.ceil(milliseconds / 1000);\n};\nconst microsecondsToMilliseconds = microseconds => {\n return Math.ceil(microseconds / 1000);\n};\nconst sanitizeText = text => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/\\//g, '&#x2F;');\nconst getTimeFromSeconds = seconds => {\n const minutes = Math.floor(seconds / 60);\n const secondsPartial = seconds - minutes * 60;\n return {\n minutes,\n seconds: secondsPartial\n };\n};\nconst formatBytes = (bytes, decimals = 2) => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\nconst getUrlParams = () => {\n const {\n search\n } = window.location;\n\n if (!search) {\n return {};\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n return hashes.reduce((acc, hash) => {\n const [key, val] = hash.split('=');\n return _objectSpread(_objectSpread({}, acc), {}, {\n [key]: decodeURIComponent(val)\n });\n }, {});\n};\nconst getUrlSearchString = params => {\n return Object.keys(params).reduce((search, key) => `${search}${search ? '&' : ''}${key}=${encodeURIComponent(params[key])}`, '');\n};\nconst keyCodes = {\n 27: 'Escape',\n 35: 'End',\n 36: 'Home',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown'\n};\nconst keyNames = {\n Escape: 'Escape',\n End: 'End',\n Home: 'Home',\n ArrowLeft: 'ArrowLeft',\n ArrowUp: 'ArrowUp',\n ArrowRight: 'ArrowRight',\n ArrowDown: 'ArrowDown'\n};\nconst getKey = e => e.code ? keyNames[e.code] : keyCodes[e.keyCode];\nconst focusElement = el => {\n if (el) {\n el.focus();\n }\n};\nconst runIfElementContainsOrHasFocus = (el, callback) => {\n if (el && (el.contains(document.activeElement) || el === document.activeElement)) {\n callback();\n }\n}; // Compare two dates to decide which relative date to return\n\nconst getRelativeDate = (date, currentDate) => {\n const msMidnightToday = new Date(currentDate).setHours(0, 0, 0, 0);\n const msDate = date.getTime();\n const dayInMs = 86400000;\n\n if (msDate >= msMidnightToday + dayInMs) {\n // Future date\n return date;\n } else if (msDate > msMidnightToday) {\n // Today\n return 'today';\n } else if (msDate > msMidnightToday - dayInMs) {\n // Yesterday\n return 'yesterday';\n } else {\n // Older date\n return date;\n }\n};\nconst pick = (obj, keys) => keys.reduce((accum, key) => {\n if (key in obj) accum[key] = obj[key];\n return accum;\n}, {});\nconst omit = (obj, keys) => Object.keys(obj).reduce((accum, key) => {\n if (!keys.includes(key)) accum[key] = obj[key];\n return accum;\n}, {});\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/general-utils.js?");
1852
2215
 
1853
2216
  /***/ }),
1854
2217
 
@@ -1859,7 +2222,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1859
2222
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1860
2223
 
1861
2224
  "use strict";
1862
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"eventTypes\": () => (/* binding */ eventTypes),\n/* harmony export */ \"payloadTypes\": () => (/* binding */ payloadTypes),\n/* harmony export */ \"entryTypes\": () => (/* binding */ entryTypes),\n/* harmony export */ \"visibilityStates\": () => (/* binding */ visibilityStates),\n/* harmony export */ \"readStates\": () => (/* binding */ readStates),\n/* harmony export */ \"actionTypes\": () => (/* binding */ actionTypes),\n/* harmony export */ \"dismissTypes\": () => (/* binding */ dismissTypes),\n/* harmony export */ \"ariaLiveLevels\": () => (/* binding */ ariaLiveLevels),\n/* harmony export */ \"dividerKeys\": () => (/* binding */ dividerKeys),\n/* harmony export */ \"featureKeys\": () => (/* binding */ featureKeys),\n/* harmony export */ \"seamlyActions\": () => (/* binding */ seamlyActions),\n/* harmony export */ \"cardTypes\": () => (/* binding */ cardTypes),\n/* harmony export */ \"isUnreadMessage\": () => (/* binding */ isUnreadMessage),\n/* harmony export */ \"mergeHistory\": () => (/* binding */ mergeHistory),\n/* harmony export */ \"seamlyStateReducer\": () => (/* binding */ seamlyStateReducer),\n/* harmony export */ \"getSeamlyConfig\": () => (/* binding */ getSeamlyConfig),\n/* harmony export */ \"calculateVisibility\": () => (/* binding */ calculateVisibility)\n/* harmony export */ });\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config */ \"./src/javascripts/config.js\");\n/* harmony import */ var _general_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./general-utils */ \"./src/javascripts/ui/utils/general-utils.js\");\nconst _excluded = [\"messages\", \"typing\"],\n _excluded2 = [\"messages\"];\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\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\nconst eventTypes = {\n info: 'info',\n message: 'message',\n participant: 'participant',\n system: 'system'\n};\nconst payloadTypes = {\n choicePrompt: 'choice_prompt',\n text: 'text',\n image: 'image',\n video: 'video',\n participant: 'participant',\n divider: 'divider',\n translation: 'translation',\n message: 'message',\n countdown: 'countdown',\n upload: 'upload',\n cta: 'cta'\n};\nconst entryTypes = {\n text: 'text',\n upload: 'upload'\n};\nconst visibilityStates = {\n hidden: 'hidden',\n minimized: 'minimized',\n open: 'open',\n initialize: null\n};\nconst readStates = {\n received: 'received',\n read: 'read'\n};\nconst actionTypes = {\n pickChoice: 'pick_choice',\n navigate: 'navigate',\n custom: 'custom',\n typing: 'typing',\n read: 'read',\n detachService: 'detach_service',\n interactivityUpdate: 'interactivity_update',\n dismiss: 'dismiss',\n sendTranscript: 'send_transcript',\n setTranslation: 'set_translation',\n clickCta: 'click_cta',\n clickCard: 'click_card'\n};\nconst dismissTypes = {\n resumeConversationPrompt: 'resume_conversation_prompt'\n};\nconst ariaLiveLevels = {\n assertive: 'assertive',\n polite: 'polite'\n};\nconst dividerKeys = {\n new_topic: 'newTopic',\n new_translation: 'newTranslation'\n};\nconst featureKeys = {\n cobrowsing: 'cobrowsing',\n sendTranscript: 'sendTranscript',\n typingPeekahead: 'typingPeekahead',\n uploads: 'uploads'\n};\nconst seamlyActions = {\n ADD_EVENT: 'ADD_EVENT',\n CLEAR_EVENTS: 'CLEAR_EVENTS',\n SET_HISTORY: 'SET_HISTORY',\n SET_EVENTS_READ: 'SET_EVENTS_READ',\n ACK_EVENT: 'ACK_EVENT',\n SET_IS_LOADING: 'SET_IS_LOADING',\n CLEAR_PARTICIPANTS: 'CLEAR_PARTICIPANTS',\n SET_PARTICIPANT: 'SET_PARTICIPANT',\n SET_HEADER_TITLE: 'SET_HEADER_TITLE',\n SET_HEADER_SUB_TITLE: 'SET_HEADER_SUB_TITLE',\n SET_INTERRUPT: ' SET_INTERRUPT',\n CLEAR_INTERRUPT: 'CLEAR_INTERRUPT',\n SET_VISIBILITY: 'SET_VISIBILITY',\n RESET_HISTORY_LOADED_FLAG: 'RESET_HISTORY_LOADED_FLAG',\n SET_ACTIVE_SERVICE: 'SET_ACTIVE_SERVICE',\n SET_SHOW_DISCLAIMER: 'SET_SHOW_DISCLAIMER',\n INIT_IDLE_DETACH_COUNTDOWN: 'INIT_IDLE_DETACH_COUNTDOWN',\n DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER: 'DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER',\n STOP_IDLE_DETACH_COUNTDOWN_COUNTER: 'STOP_IDLE_DETACH_COUNTDOWN_COUNTER',\n CLEAR_IDLE_DETACH_COUNTDOWN: 'CLEAR_IDLE_DETACH_COUNTDOWN',\n INIT_RESUME_CONVERSATION_PROMPT: 'INIT_RESUME_CONVERSATION_PROMPT',\n CLEAR_RESUME_CONVERSATION_PROMPT: 'CLEAR_RESUME_CONVERSATION_PROMPT',\n SET_SERVICE_DATA_ITEM: 'SET_SERVICE_DATA_ITEM',\n UPDATE_CONFIG: 'UPDATE_CONFIG',\n SET_FEATURES: 'SET_FEATURES',\n SET_FEATURE_ENABLED_STATE: 'SET_FEATURE_ENABLED_STATE',\n CLEAR_FEATURES: 'CLEAR_FEATURES',\n SET_INITIAL_STATE: 'SET_INITIAL_STATE',\n SET_USER_SELECTED_OPTIONS: 'SET_USER_SELECTED_OPTIONS',\n SET_USER_SELECTED_OPTION: 'SET_USER_SELECTED_OPTION',\n SHOW_OPTION: 'SHOW_OPTION',\n HIDE_OPTION: 'HIDE_OPTION',\n SET_SERVICE_ENTRY_METADATA: 'SET_SERVICE_ENTRY_METADATA',\n SET_BLOCK_AUTO_ENTRY_SWITCH: 'SET_BLOCK_AUTO_ENTRY_SWITCH',\n SET_ACTIVE_ENTRY_TYPE: 'SET_ACTIVE_ENTRY_TYPE',\n SET_USER_ENTRY_TYPE: 'SET_USER_ENTRY_TYPE',\n REGISTER_UPLOAD: 'REGISTER_UPLOAD',\n SET_UPLOAD_PROGRESS: 'SET_UPLOAD_PROGRESS',\n SET_UPLOAD_COMPLETE: 'SET_UPLOAD_COMPLETE',\n SET_UPLOAD_ERROR: 'SET_UPLOAD_ERROR',\n CLEAR_UPLOAD: 'CLEAR_UPLOAD',\n CLEAR_ALL_UPLOADS: 'CLEAR_ALL_UPLOADS',\n RESET_UPLOAD_STATE: 'RESET_UPLOAD_STATE',\n RESET_ENTRY_STATE: 'RESET_ENTRY_STATE',\n SET_SEAMLY_CONTAINER_ELEMENT: 'SET_SEAMLY_CONTAINER_ELEMENT'\n};\nconst cardTypes = {\n ask: 'ask',\n navigate: 'navigate',\n topic: 'topic'\n};\nconst {\n ADD_EVENT,\n CLEAR_EVENTS,\n SET_HISTORY,\n SET_EVENTS_READ,\n ACK_EVENT,\n SET_IS_LOADING,\n CLEAR_PARTICIPANTS,\n SET_PARTICIPANT,\n SET_HEADER_TITLE,\n SET_HEADER_SUB_TITLE,\n SET_INTERRUPT,\n CLEAR_INTERRUPT,\n SET_VISIBILITY,\n RESET_HISTORY_LOADED_FLAG,\n SET_ACTIVE_SERVICE,\n SET_SHOW_DISCLAIMER,\n INIT_IDLE_DETACH_COUNTDOWN,\n DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER,\n STOP_IDLE_DETACH_COUNTDOWN_COUNTER,\n CLEAR_IDLE_DETACH_COUNTDOWN,\n INIT_RESUME_CONVERSATION_PROMPT,\n CLEAR_RESUME_CONVERSATION_PROMPT,\n SET_SERVICE_DATA_ITEM,\n UPDATE_CONFIG,\n SET_FEATURES,\n SET_FEATURE_ENABLED_STATE,\n CLEAR_FEATURES,\n SET_INITIAL_STATE,\n SET_USER_SELECTED_OPTION,\n SET_USER_SELECTED_OPTIONS,\n SHOW_OPTION,\n HIDE_OPTION,\n SET_BLOCK_AUTO_ENTRY_SWITCH,\n SET_USER_ENTRY_TYPE,\n SET_ACTIVE_ENTRY_TYPE,\n SET_SERVICE_ENTRY_METADATA,\n REGISTER_UPLOAD,\n SET_UPLOAD_PROGRESS,\n SET_UPLOAD_COMPLETE,\n SET_UPLOAD_ERROR,\n CLEAR_UPLOAD,\n CLEAR_ALL_UPLOADS,\n RESET_UPLOAD_STATE,\n RESET_ENTRY_STATE,\n SET_SEAMLY_CONTAINER_ELEMENT\n} = seamlyActions;\nconst isUnreadMessage = ({\n type,\n payload\n}) => type === eventTypes.message && !payload.fromClient || type === eventTypes.info && payload.type === payloadTypes.text;\n\nconst orderHistory = events => {\n return events.sort(({\n payload: {\n occurredAt: occurredAtA\n }\n }, {\n payload: {\n occurredAt: occurredAtB\n }\n }) => occurredAtA - occurredAtB);\n};\n\nconst mergeHistory = (stateEvents, historyEvents) => {\n const newHistoryEvents = historyEvents.filter(historyEvent => // Deduplicate the event streams\n !stateEvents.find(stateEvent => stateEvent.payload.id === historyEvent.payload.id) && // Remove all non displayable participant messages\n !(historyEvent.type === 'participant' && !historyEvent.payload.participant.introduction)) // Reverse is done here because the server sends the history in the order\n // newest to oldest. In the case of exactly the same occurredAt timestamps\n // these messages will be shown in the wrong order if not reversed. For\n // the normal merging logic there is no added effect.\n .reverse();\n return orderHistory([...newHistoryEvents, ...stateEvents]);\n};\n\nconst participantReducer = (state, action) => {\n switch (action.type) {\n case CLEAR_PARTICIPANTS:\n return {\n participants: {},\n currentAgent: ''\n };\n\n case SET_PARTICIPANT:\n const {\n participants\n } = state;\n const {\n id,\n avatar,\n name,\n introduction\n } = action.participant;\n const oldParticipant = participants[id];\n\n const newParticipants = _objectSpread(_objectSpread({}, participants), {}, {\n [id]: oldParticipant ? _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, oldParticipant), avatar ? {\n avatar\n } : {}), name ? {\n name\n } : {}), introduction ? {\n introduction\n } : {}) : action.participant\n });\n\n return _objectSpread(_objectSpread({}, state), {}, {\n participants: newParticipants,\n currentAgent: state.currentAgent !== id && !action.fromClient ? id : state.currentAgent\n });\n\n default:\n return state;\n }\n};\n\nconst headerTitlesReducer = (state, action) => {\n switch (action.type) {\n case SET_HEADER_TITLE:\n return _objectSpread(_objectSpread({}, state), {}, {\n title: action.title\n });\n\n case SET_HEADER_SUB_TITLE:\n return _objectSpread(_objectSpread({}, state), {}, {\n subTitle: action.title\n });\n\n default:\n return state;\n }\n};\n\nconst interruptReducer = (state, action) => {\n switch (action.type) {\n case SET_INTERRUPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n hasInterrupt: true,\n meta: _objectSpread({}, action.interrupt)\n });\n\n case CLEAR_INTERRUPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n hasInterrupt: false,\n meta: {}\n });\n\n default:\n return state;\n }\n};\n\nconst calculateNewEntryMeta = (entryMeta, payload) => {\n const {\n entry\n } = payload;\n const {\n blockAutoEntrySwitch\n } = entryMeta;\n\n if (!entry) {\n return _objectSpread(_objectSpread({}, entryMeta), {}, {\n optionsOverride: {}\n });\n }\n\n const {\n type,\n options\n } = entry;\n let newActive = entryMeta.active;\n\n if (!blockAutoEntrySwitch && type !== entryMeta.userSelected) {\n newActive = type;\n }\n\n return _objectSpread(_objectSpread({}, entryMeta), {}, {\n active: newActive,\n optionsOverride: _objectSpread(_objectSpread({}, entryMeta.optionsOverride), {}, {\n [type]: options || {}\n })\n });\n};\n\nconst seamlyStateReducer = (state, action) => {\n switch (action.type) {\n case ADD_EVENT:\n const {\n type: eventType,\n payload\n } = action.event;\n const accountHasUploads = state.options.features.hasOwnProperty(featureKeys.uploads);\n const newEntryMeta = calculateNewEntryMeta(state.entryMeta, payload);\n\n let newOptions = _objectSpread({}, state.options); // This enabled override of the service enabled value for uploads.\n // If a message is sent with entry of type upload it will temporarily\n // override service value and enable uploads.\n\n\n if (accountHasUploads && (eventType === eventTypes.message || eventType === eventTypes.participant) && !payload.fromClient) {\n const {\n type: entryType\n } = payload.entry || {};\n newOptions = _objectSpread(_objectSpread({}, newOptions), {}, {\n features: _objectSpread(_objectSpread({}, newOptions.features), {}, {\n uploads: _objectSpread(_objectSpread({}, newOptions.features.uploads), {}, {\n enabledFromEntry: entryType === entryTypes.upload\n })\n })\n });\n }\n\n const incrementUnread = isUnreadMessage(action.event); // We check for duplicated and ignore them as in some error of the websocket\n // a duplicate join can be active for a while until the server connection\n // times out.\n\n const eventExists = state.events.find(e => e.payload.id === payload.id);\n\n if (eventExists) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: !accountHasUploads && newEntryMeta.active === entryTypes.upload ? _objectSpread({}, state.entryMeta) : newEntryMeta,\n options: newOptions,\n unreadEvents: incrementUnread ? state.unreadEvents + 1 : state.unreadEvents,\n events: [...state.events, _objectSpread(_objectSpread({}, action.event), {}, {\n // The payload spread should be done after adding the message\n // status to enable overriding the status when setting\n // event optimistically.\n payload: _objectSpread(_objectSpread({}, incrementUnread && {\n messageStatus: payload.fromClient ? readStates.read : readStates.received\n }), payload)\n })]\n });\n\n case ACK_EVENT:\n // If any ACKs are sent without transactionID the conversation crashes.\n // Ensure that this edge case is handled gracefully.\n if (!action.event.payload.transactionId) {\n console.warn('ACK received without transaction ID.');\n return state;\n }\n\n const matchedEvent = state.events.find(m => m.payload.transactionId === action.event.payload.transactionId);\n const {\n id,\n occurredAt\n } = action.event.payload;\n return matchedEvent ? _objectSpread(_objectSpread({}, state), {}, {\n events: orderHistory(state.events.map(m => m.payload.id === matchedEvent.payload.id ? _objectSpread(_objectSpread({}, m), {}, {\n payload: _objectSpread(_objectSpread({}, m.payload), {}, {\n id,\n occurredAt\n })\n }) : m))\n }) : state;\n\n case CLEAR_EVENTS:\n return _objectSpread(_objectSpread({}, state), {}, {\n unreadEvents: 0,\n events: []\n });\n\n case SET_EVENTS_READ:\n return _objectSpread(_objectSpread({}, state), {}, {\n unreadEvents: 0,\n events: state.events.map(event => {\n if (action.ids.indexOf(event.payload.id) !== -1) {\n return _objectSpread(_objectSpread({}, event), {}, {\n payload: _objectSpread(_objectSpread({}, event.payload), event.payload.messageStatus === readStates.received && {\n messageStatus: readStates.read\n })\n });\n }\n\n return event;\n })\n });\n\n case SET_HISTORY:\n const {\n events: history,\n participants,\n activeServiceSessionId,\n activeServiceSettings = {},\n serviceData,\n resumeConversationPrompt\n } = action.history;\n const events = mergeHistory(state.events, history);\n\n const mergedParticipants = _objectSpread(_objectSpread({}, state.participantInfo.participants), participants);\n\n const lastParticipantEvent = events.slice().reverse().find(m => (m.type === 'message' || m.type === 'participant') && !m.payload.fromClient);\n let lastParticipantId = null;\n\n if (lastParticipantEvent) {\n if (lastParticipantEvent.type === 'message') {\n lastParticipantId = lastParticipantEvent.payload.participant;\n }\n\n if (lastParticipantEvent.type === 'participant') {\n lastParticipantId = lastParticipantEvent.payload.participant.id;\n }\n }\n\n const {\n cobrowsing,\n entry,\n uploads\n } = activeServiceSettings;\n const historyNewEntryMeta = calculateNewEntryMeta(_objectSpread(_objectSpread(_objectSpread({}, state.entryMeta), entry), {}, {\n active: entry.default || payloadTypes.text,\n options: _objectSpread({}, entry && entry.options ? entry.options : {})\n }), events[events.length - 1].payload);\n\n let newFeatures = _objectSpread({}, state.options.features); // Only set cobrowsing if it was initialised by the account config.\n\n\n if (newFeatures.hasOwnProperty(featureKeys.cobrowsing)) {\n newFeatures = _objectSpread(_objectSpread({}, newFeatures), {}, {\n cobrowsing: {\n enabled: !!(cobrowsing && cobrowsing.enabled)\n }\n });\n }\n\n const newFeaturesHasUpload = newFeatures.hasOwnProperty(featureKeys.uploads); // Only set uploads if it was initialised by the account config.\n\n if (newFeaturesHasUpload) {\n const {\n payload: lastParticipantEventPayload\n } = lastParticipantEvent;\n const {\n type: entryType\n } = lastParticipantEventPayload.entry || {};\n newFeatures = _objectSpread(_objectSpread({}, newFeatures), {}, {\n uploads: {\n enabled: !!(uploads && uploads.enabled),\n enabledFromEntry: entryType === entryTypes.upload\n }\n });\n }\n\n const returnState = _objectSpread(_objectSpread({}, state), {}, {\n unreadEvents: events.filter(event => event.type === 'message' && event.payload.messageStatus === readStates.received).length,\n events: events.filter(e => e.type !== 'participant' || !!e.payload.participant.introduction),\n participantInfo: _objectSpread(_objectSpread(_objectSpread({}, state.participantInfo), lastParticipantId ? participantReducer(state.participantInfo, {\n type: SET_PARTICIPANT,\n participant: mergedParticipants[lastParticipantId]\n }) : {}), {}, {\n participants: mergedParticipants\n }),\n historyLoaded: true,\n serviceInfo: _objectSpread(_objectSpread({}, state.serviceInfo), {}, {\n activeServiceSessionId\n }),\n serviceData: serviceData || {},\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: newFeatures\n }),\n entryMeta: !newFeaturesHasUpload && historyNewEntryMeta.active === entryTypes.upload ? _objectSpread({}, state.entryMeta) : historyNewEntryMeta,\n resumeConversationPrompt: resumeConversationPrompt || false\n });\n\n if (lastParticipantId) {\n returnState.headerTitles = headerTitlesReducer(state.headerTitles, {\n type: SET_HEADER_SUB_TITLE,\n title: mergedParticipants[lastParticipantId].name\n });\n }\n\n return returnState;\n\n case RESET_HISTORY_LOADED_FLAG:\n return _objectSpread(_objectSpread({}, state), {}, {\n historyLoaded: false\n });\n\n case SET_IS_LOADING:\n return _objectSpread(_objectSpread({}, state), {}, {\n isLoading: action.isLoading\n });\n\n case INIT_IDLE_DETACH_COUNTDOWN:\n const {\n delaySeconds,\n delayTime\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: {\n hasCountdown: true,\n isActive: true,\n wasStopped: false,\n count: delaySeconds,\n remaining: delaySeconds,\n timer: delayTime\n }\n });\n\n case DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER:\n const {\n idleDetachCountdown\n } = state;\n const {\n remaining: prevRemaining\n } = idleDetachCountdown;\n const remaining = prevRemaining - 1;\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: _objectSpread(_objectSpread({}, state.idleDetachCountdown), {}, {\n remaining,\n timer: (0,_general_utils__WEBPACK_IMPORTED_MODULE_1__.getTimeFromSeconds)(remaining)\n })\n });\n\n case STOP_IDLE_DETACH_COUNTDOWN_COUNTER:\n {\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: _objectSpread(_objectSpread({}, state.idleDetachCountdown), {}, {\n isActive: false,\n wasStopped: true\n })\n });\n }\n\n case CLEAR_IDLE_DETACH_COUNTDOWN:\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false\n }\n });\n\n case INIT_RESUME_CONVERSATION_PROMPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n resumeConversationPrompt: true\n });\n\n case CLEAR_RESUME_CONVERSATION_PROMPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n resumeConversationPrompt: false\n });\n\n case SET_VISIBILITY:\n return _objectSpread(_objectSpread({}, state), {}, {\n visible: action.visible\n });\n\n case SET_PARTICIPANT:\n case CLEAR_PARTICIPANTS:\n return _objectSpread(_objectSpread({}, state), {}, {\n participantInfo: participantReducer(state.participantInfo, action)\n });\n\n case SET_ACTIVE_SERVICE:\n if (state.serviceInfo.activeServiceSessionId !== action.activeServiceSessionId) {\n return _objectSpread(_objectSpread({}, state), {}, {\n serviceInfo: _objectSpread(_objectSpread({}, state.serviceInfo), {}, {\n activeServiceSessionId: action.activeServiceSessionId\n })\n });\n }\n\n return state;\n\n case SET_HEADER_TITLE:\n case SET_HEADER_SUB_TITLE:\n return _objectSpread(_objectSpread({}, state), {}, {\n headerTitles: headerTitlesReducer(state.headerTitles, action)\n });\n\n case SET_INTERRUPT:\n case CLEAR_INTERRUPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n interrupt: interruptReducer(state.interrupt, action)\n });\n\n case SET_SHOW_DISCLAIMER:\n return _objectSpread(_objectSpread({}, state), {}, {\n showDisclaimer: action.showDisclaimer\n });\n\n case UPDATE_CONFIG:\n return _objectSpread(_objectSpread({}, state), {}, {\n config: _objectSpread(_objectSpread({}, state.config), action.config)\n });\n\n case SET_INITIAL_STATE:\n return _objectSpread(_objectSpread({}, state), {}, {\n initialState: action.initialState\n });\n\n case SET_SERVICE_DATA_ITEM:\n return _objectSpread(_objectSpread({}, state), {}, {\n serviceData: _objectSpread(_objectSpread({}, state.serviceData), {}, {\n [action.payload.type]: action.payload\n })\n });\n\n case SET_FEATURES:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: action.features\n })\n });\n\n case SET_FEATURE_ENABLED_STATE:\n // Only set cobrowsing if it already exists in the object.\n // Otherwise we may set if for accounts not allowing it at all.\n return state.options.features.hasOwnProperty(action.key) ? _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: _objectSpread(_objectSpread({}, state.options.features), {}, {\n [action.key]: _objectSpread(_objectSpread({}, state.options.features[action.key] || {}), {}, {\n enabled: action.enabled\n })\n })\n })\n }) : state;\n\n case CLEAR_FEATURES:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: {}\n })\n });\n\n case SHOW_OPTION:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n panelActive: true,\n optionActive: action.optionName\n })\n });\n\n case HIDE_OPTION:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n panelActive: false,\n optionActive: ''\n })\n });\n\n case SET_USER_SELECTED_OPTIONS:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n userSelectedOptions: action.options\n })\n });\n\n case SET_USER_SELECTED_OPTION:\n const {\n option,\n value\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n userSelectedOptions: _objectSpread(_objectSpread({}, state.options.userSelectedOptions), {}, {\n [option]: value\n })\n })\n });\n\n case SET_BLOCK_AUTO_ENTRY_SWITCH:\n const {\n value: blockAutoEntrySwitch\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread({}, state.entryMeta), {}, {\n blockAutoEntrySwitch\n })\n });\n\n case SET_SERVICE_ENTRY_METADATA:\n const {\n entryMeta\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread(_objectSpread({}, state.entryMeta), entryMeta), {}, {\n active: entryMeta.default,\n options: _objectSpread({}, entryMeta.options || {}),\n overrideOptions: {}\n })\n });\n\n case SET_ACTIVE_ENTRY_TYPE:\n const {\n entryType: active\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread({}, state.entryMeta), {}, {\n active\n })\n });\n\n case SET_USER_ENTRY_TYPE:\n const {\n entryType: userSelected\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread({}, state.entryMeta), {}, {\n userSelected\n })\n });\n\n case REGISTER_UPLOAD:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: [...state.currentUploads, {\n id: action.fileId,\n name: action.fileName,\n progress: 1,\n uploading: true,\n complete: false,\n error: '',\n uploadHandle: action.uploadHandle\n }]\n });\n\n case SET_UPLOAD_PROGRESS:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.map(fileUpload => {\n if (fileUpload.id === action.fileId) {\n return _objectSpread(_objectSpread({}, fileUpload), {}, {\n progress: action.progress,\n uploading: action.progress !== 100,\n uploadHandle: action.progress === 100 ? null : fileUpload.uploadHandle\n });\n }\n\n return fileUpload;\n })\n });\n\n case SET_UPLOAD_ERROR:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.map(fileUpload => {\n if (fileUpload.id === action.fileId) {\n return _objectSpread(_objectSpread({}, fileUpload), {}, {\n error: action.errorText,\n progress: 0,\n uploading: false,\n uploadHandle: null\n });\n }\n\n return fileUpload;\n })\n });\n\n case SET_UPLOAD_COMPLETE:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.map(fileUpload => {\n if (fileUpload.id === action.fileId) {\n return _objectSpread(_objectSpread({}, fileUpload), {}, {\n complete: true\n });\n }\n\n return fileUpload;\n })\n });\n\n case CLEAR_UPLOAD:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.filter(fileUpload => fileUpload.id !== action.fileId)\n });\n\n case CLEAR_ALL_UPLOADS:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: []\n });\n\n case RESET_UPLOAD_STATE:\n return _objectSpread(_objectSpread({}, state), {}, {\n showFileUpload: false,\n currentUploads: []\n });\n\n case RESET_ENTRY_STATE:\n {\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: {\n default: payloadTypes.text,\n active: payloadTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {}\n }\n });\n }\n\n case SET_SEAMLY_CONTAINER_ELEMENT:\n {\n return _objectSpread(_objectSpread({}, state), {}, {\n seamlyContainerElement: action.element\n });\n }\n\n default:\n return state;\n }\n};\nconst getSeamlyConfig = config => {\n const {\n messages: messagesConfig,\n typing\n } = config,\n rest = _objectWithoutProperties(config, _excluded);\n\n const {\n messages: defaultMessagesConfig\n } = _config__WEBPACK_IMPORTED_MODULE_0__.defaultConfig,\n defaultRest = _objectWithoutProperties(_config__WEBPACK_IMPORTED_MODULE_0__.defaultConfig, _excluded2);\n\n return _objectSpread(_objectSpread({}, defaultRest), {}, {\n namespace: 'default',\n visible: config.layoutMode && config.layoutMode === 'inline' ? visibilityStates.open : visibilityStates.minimized,\n layoutMode: _config__WEBPACK_IMPORTED_MODULE_0__.layoutMode,\n appContainerClassNames: _config__WEBPACK_IMPORTED_MODULE_0__.appContainerClassNames,\n messages: _objectSpread(_objectSpread({}, defaultMessagesConfig), messagesConfig),\n typing: _objectSpread(_objectSpread({}, _config__WEBPACK_IMPORTED_MODULE_0__.typing), typing)\n }, rest);\n};\nconst calculateVisibility = ({\n hasResponded,\n previousVisibility,\n requestedVisibility,\n config\n}) => {\n const {\n defaults,\n layoutMode,\n hideOnNoUserResponse\n } = config;\n const {\n visible: defaultVisibility\n } = defaults || {}; // Requesting open should override the responded check.\n\n if (layoutMode === 'window' && hideOnNoUserResponse && requestedVisibility !== visibilityStates.open) {\n return hasResponded ? requestedVisibility || previousVisibility || visibilityStates.open : visibilityStates.hidden;\n }\n\n const baseVisibility = layoutMode === 'inline' ? visibilityStates.open : visibilityStates.minimized;\n return requestedVisibility || previousVisibility || defaultVisibility || baseVisibility;\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/seamly-utils.js?");
2225
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"eventTypes\": () => (/* binding */ eventTypes),\n/* harmony export */ \"payloadTypes\": () => (/* binding */ payloadTypes),\n/* harmony export */ \"entryTypes\": () => (/* binding */ entryTypes),\n/* harmony export */ \"visibilityStates\": () => (/* binding */ visibilityStates),\n/* harmony export */ \"readStates\": () => (/* binding */ readStates),\n/* harmony export */ \"actionTypes\": () => (/* binding */ actionTypes),\n/* harmony export */ \"dismissTypes\": () => (/* binding */ dismissTypes),\n/* harmony export */ \"ariaLiveLevels\": () => (/* binding */ ariaLiveLevels),\n/* harmony export */ \"dividerKeys\": () => (/* binding */ dividerKeys),\n/* harmony export */ \"featureKeys\": () => (/* binding */ featureKeys),\n/* harmony export */ \"seamlyActions\": () => (/* binding */ seamlyActions),\n/* harmony export */ \"cardTypes\": () => (/* binding */ cardTypes),\n/* harmony export */ \"isUnreadMessage\": () => (/* binding */ isUnreadMessage),\n/* harmony export */ \"mergeHistory\": () => (/* binding */ mergeHistory),\n/* harmony export */ \"seamlyStateReducer\": () => (/* binding */ seamlyStateReducer),\n/* harmony export */ \"calculateVisibility\": () => (/* binding */ calculateVisibility)\n/* harmony export */ });\n/* harmony import */ var _general_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./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\nconst eventTypes = {\n info: 'info',\n message: 'message',\n participant: 'participant',\n system: 'system'\n};\nconst payloadTypes = {\n choicePrompt: 'choice_prompt',\n text: 'text',\n image: 'image',\n video: 'video',\n participant: 'participant',\n divider: 'divider',\n translation: 'translation',\n message: 'message',\n countdown: 'countdown',\n upload: 'upload',\n cta: 'cta'\n};\nconst entryTypes = {\n text: 'text',\n upload: 'upload'\n};\nconst visibilityStates = {\n hidden: 'hidden',\n minimized: 'minimized',\n open: 'open',\n initialize: null\n};\nconst readStates = {\n received: 'received',\n read: 'read'\n};\nconst actionTypes = {\n pickChoice: 'pick_choice',\n navigate: 'navigate',\n custom: 'custom',\n typing: 'typing',\n read: 'read',\n detachService: 'detach_service',\n interactivityUpdate: 'interactivity_update',\n dismiss: 'dismiss',\n sendTranscript: 'send_transcript',\n setTranslation: 'set_translation',\n clickCta: 'click_cta',\n clickCard: 'click_card'\n};\nconst dismissTypes = {\n resumeConversationPrompt: 'resume_conversation_prompt'\n};\nconst ariaLiveLevels = {\n assertive: 'assertive',\n polite: 'polite'\n};\nconst dividerKeys = {\n new_topic: 'newTopic',\n new_translation: 'newTranslation'\n};\nconst featureKeys = {\n cobrowsing: 'cobrowsing',\n sendTranscript: 'sendTranscript',\n typingPeekahead: 'typingPeekahead',\n uploads: 'uploads'\n};\nconst seamlyActions = {\n ADD_EVENT: 'ADD_EVENT',\n CLEAR_EVENTS: 'CLEAR_EVENTS',\n SET_HISTORY: 'SET_HISTORY',\n SET_EVENTS_READ: 'SET_EVENTS_READ',\n ACK_EVENT: 'ACK_EVENT',\n SET_IS_LOADING: 'SET_IS_LOADING',\n CLEAR_PARTICIPANTS: 'CLEAR_PARTICIPANTS',\n SET_PARTICIPANT: 'SET_PARTICIPANT',\n SET_HEADER_TITLE: 'SET_HEADER_TITLE',\n SET_HEADER_SUB_TITLE: 'SET_HEADER_SUB_TITLE',\n SET_VISIBILITY: 'SET_VISIBILITY',\n RESET_HISTORY_LOADED_FLAG: 'RESET_HISTORY_LOADED_FLAG',\n SET_ACTIVE_SERVICE: 'SET_ACTIVE_SERVICE',\n INIT_IDLE_DETACH_COUNTDOWN: 'INIT_IDLE_DETACH_COUNTDOWN',\n DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER: 'DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER',\n STOP_IDLE_DETACH_COUNTDOWN_COUNTER: 'STOP_IDLE_DETACH_COUNTDOWN_COUNTER',\n CLEAR_IDLE_DETACH_COUNTDOWN: 'CLEAR_IDLE_DETACH_COUNTDOWN',\n INIT_RESUME_CONVERSATION_PROMPT: 'INIT_RESUME_CONVERSATION_PROMPT',\n CLEAR_RESUME_CONVERSATION_PROMPT: 'CLEAR_RESUME_CONVERSATION_PROMPT',\n SET_SERVICE_DATA_ITEM: 'SET_SERVICE_DATA_ITEM',\n SET_FEATURES: 'SET_FEATURES',\n SET_FEATURE_ENABLED_STATE: 'SET_FEATURE_ENABLED_STATE',\n CLEAR_FEATURES: 'CLEAR_FEATURES',\n SET_INITIAL_STATE: 'SET_INITIAL_STATE',\n SET_USER_SELECTED_OPTIONS: 'SET_USER_SELECTED_OPTIONS',\n SET_USER_SELECTED_OPTION: 'SET_USER_SELECTED_OPTION',\n SHOW_OPTION: 'SHOW_OPTION',\n HIDE_OPTION: 'HIDE_OPTION',\n SET_SERVICE_ENTRY_METADATA: 'SET_SERVICE_ENTRY_METADATA',\n SET_BLOCK_AUTO_ENTRY_SWITCH: 'SET_BLOCK_AUTO_ENTRY_SWITCH',\n SET_ACTIVE_ENTRY_TYPE: 'SET_ACTIVE_ENTRY_TYPE',\n SET_USER_ENTRY_TYPE: 'SET_USER_ENTRY_TYPE',\n REGISTER_UPLOAD: 'REGISTER_UPLOAD',\n SET_UPLOAD_PROGRESS: 'SET_UPLOAD_PROGRESS',\n SET_UPLOAD_COMPLETE: 'SET_UPLOAD_COMPLETE',\n SET_UPLOAD_ERROR: 'SET_UPLOAD_ERROR',\n CLEAR_UPLOAD: 'CLEAR_UPLOAD',\n CLEAR_ALL_UPLOADS: 'CLEAR_ALL_UPLOADS',\n RESET_UPLOAD_STATE: 'RESET_UPLOAD_STATE',\n RESET_ENTRY_STATE: 'RESET_ENTRY_STATE',\n SET_SEAMLY_CONTAINER_ELEMENT: 'SET_SEAMLY_CONTAINER_ELEMENT'\n};\nconst cardTypes = {\n ask: 'ask',\n navigate: 'navigate',\n topic: 'topic'\n};\nconst {\n ADD_EVENT,\n CLEAR_EVENTS,\n SET_HISTORY,\n SET_EVENTS_READ,\n ACK_EVENT,\n SET_IS_LOADING,\n CLEAR_PARTICIPANTS,\n SET_PARTICIPANT,\n SET_HEADER_TITLE,\n SET_HEADER_SUB_TITLE,\n SET_VISIBILITY,\n RESET_HISTORY_LOADED_FLAG,\n SET_ACTIVE_SERVICE,\n INIT_IDLE_DETACH_COUNTDOWN,\n DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER,\n STOP_IDLE_DETACH_COUNTDOWN_COUNTER,\n CLEAR_IDLE_DETACH_COUNTDOWN,\n INIT_RESUME_CONVERSATION_PROMPT,\n CLEAR_RESUME_CONVERSATION_PROMPT,\n SET_SERVICE_DATA_ITEM,\n SET_FEATURES,\n SET_FEATURE_ENABLED_STATE,\n CLEAR_FEATURES,\n SET_INITIAL_STATE,\n SET_USER_SELECTED_OPTION,\n SET_USER_SELECTED_OPTIONS,\n SHOW_OPTION,\n HIDE_OPTION,\n SET_BLOCK_AUTO_ENTRY_SWITCH,\n SET_USER_ENTRY_TYPE,\n SET_ACTIVE_ENTRY_TYPE,\n SET_SERVICE_ENTRY_METADATA,\n REGISTER_UPLOAD,\n SET_UPLOAD_PROGRESS,\n SET_UPLOAD_COMPLETE,\n SET_UPLOAD_ERROR,\n CLEAR_UPLOAD,\n CLEAR_ALL_UPLOADS,\n RESET_UPLOAD_STATE,\n RESET_ENTRY_STATE,\n SET_SEAMLY_CONTAINER_ELEMENT\n} = seamlyActions;\nconst isUnreadMessage = ({\n type,\n payload\n}) => type === eventTypes.message && !payload.fromClient || type === eventTypes.info && payload.type === payloadTypes.text;\n\nconst orderHistory = events => {\n return events.sort(({\n payload: {\n occurredAt: occurredAtA\n }\n }, {\n payload: {\n occurredAt: occurredAtB\n }\n }) => occurredAtA - occurredAtB);\n};\n\nconst mergeHistory = (stateEvents, historyEvents) => {\n const newHistoryEvents = historyEvents.filter(historyEvent => // Deduplicate the event streams\n !stateEvents.find(stateEvent => stateEvent.payload.id === historyEvent.payload.id) && // Remove all non displayable participant messages\n !(historyEvent.type === 'participant' && !historyEvent.payload.participant.introduction)) // Reverse is done here because the server sends the history in the order\n // newest to oldest. In the case of exactly the same occurredAt timestamps\n // these messages will be shown in the wrong order if not reversed. For\n // the normal merging logic there is no added effect.\n .reverse();\n return orderHistory([...newHistoryEvents, ...stateEvents]);\n};\n\nconst participantReducer = (state, action) => {\n switch (action.type) {\n case CLEAR_PARTICIPANTS:\n return {\n participants: {},\n currentAgent: ''\n };\n\n case SET_PARTICIPANT:\n const {\n participants\n } = state;\n const {\n id,\n avatar,\n name,\n introduction\n } = action.participant;\n const oldParticipant = participants[id];\n\n const newParticipants = _objectSpread(_objectSpread({}, participants), {}, {\n [id]: oldParticipant ? _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, oldParticipant), avatar ? {\n avatar\n } : {}), name ? {\n name\n } : {}), introduction ? {\n introduction\n } : {}) : action.participant\n });\n\n return _objectSpread(_objectSpread({}, state), {}, {\n participants: newParticipants,\n currentAgent: state.currentAgent !== id && !action.fromClient ? id : state.currentAgent\n });\n\n default:\n return state;\n }\n};\n\nconst headerTitlesReducer = (state, action) => {\n switch (action.type) {\n case SET_HEADER_TITLE:\n return _objectSpread(_objectSpread({}, state), {}, {\n title: action.title\n });\n\n case SET_HEADER_SUB_TITLE:\n return _objectSpread(_objectSpread({}, state), {}, {\n subTitle: action.title\n });\n\n default:\n return state;\n }\n};\n\nconst calculateNewEntryMeta = (entryMeta, payload) => {\n const {\n entry\n } = payload;\n const {\n blockAutoEntrySwitch\n } = entryMeta;\n\n if (!entry) {\n return _objectSpread(_objectSpread({}, entryMeta), {}, {\n optionsOverride: {}\n });\n }\n\n const {\n type,\n options\n } = entry;\n let newActive = entryMeta.active;\n\n if (!blockAutoEntrySwitch && type !== entryMeta.userSelected) {\n newActive = type;\n }\n\n return _objectSpread(_objectSpread({}, entryMeta), {}, {\n active: newActive,\n optionsOverride: _objectSpread(_objectSpread({}, entryMeta.optionsOverride), {}, {\n [type]: options || {}\n })\n });\n};\n\nconst seamlyStateReducer = (state, action) => {\n switch (action.type) {\n case ADD_EVENT:\n const {\n type: eventType,\n payload\n } = action.event;\n const accountHasUploads = state.options.features.hasOwnProperty(featureKeys.uploads);\n const newEntryMeta = calculateNewEntryMeta(state.entryMeta, payload);\n\n let newOptions = _objectSpread({}, state.options); // This enabled override of the service enabled value for uploads.\n // If a message is sent with entry of type upload it will temporarily\n // override service value and enable uploads.\n\n\n if (accountHasUploads && (eventType === eventTypes.message || eventType === eventTypes.participant) && !payload.fromClient) {\n const {\n type: entryType\n } = payload.entry || {};\n newOptions = _objectSpread(_objectSpread({}, newOptions), {}, {\n features: _objectSpread(_objectSpread({}, newOptions.features), {}, {\n uploads: _objectSpread(_objectSpread({}, newOptions.features.uploads), {}, {\n enabledFromEntry: entryType === entryTypes.upload\n })\n })\n });\n }\n\n const incrementUnread = isUnreadMessage(action.event); // We check for duplicated and ignore them as in some error of the websocket\n // a duplicate join can be active for a while until the server connection\n // times out.\n\n const eventExists = state.events.find(e => e.payload.id === payload.id);\n\n if (eventExists) {\n return state;\n }\n\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: !accountHasUploads && newEntryMeta.active === entryTypes.upload ? _objectSpread({}, state.entryMeta) : newEntryMeta,\n options: newOptions,\n unreadEvents: incrementUnread ? state.unreadEvents + 1 : state.unreadEvents,\n events: [...state.events, _objectSpread(_objectSpread({}, action.event), {}, {\n // The payload spread should be done after adding the message\n // status to enable overriding the status when setting\n // event optimistically.\n payload: _objectSpread(_objectSpread({}, incrementUnread && {\n messageStatus: payload.fromClient ? readStates.read : readStates.received\n }), payload)\n })]\n });\n\n case ACK_EVENT:\n // If any ACKs are sent without transactionID the conversation crashes.\n // Ensure that this edge case is handled gracefully.\n if (!action.event.payload.transactionId) {\n console.warn('ACK received without transaction ID.');\n return state;\n }\n\n const matchedEvent = state.events.find(m => m.payload.transactionId === action.event.payload.transactionId);\n const {\n id,\n occurredAt\n } = action.event.payload;\n return matchedEvent ? _objectSpread(_objectSpread({}, state), {}, {\n events: orderHistory(state.events.map(m => m.payload.id === matchedEvent.payload.id ? _objectSpread(_objectSpread({}, m), {}, {\n payload: _objectSpread(_objectSpread({}, m.payload), {}, {\n id,\n occurredAt\n })\n }) : m))\n }) : state;\n\n case CLEAR_EVENTS:\n return _objectSpread(_objectSpread({}, state), {}, {\n unreadEvents: 0,\n events: []\n });\n\n case SET_EVENTS_READ:\n return _objectSpread(_objectSpread({}, state), {}, {\n unreadEvents: 0,\n events: state.events.map(event => {\n if (action.ids.indexOf(event.payload.id) !== -1) {\n return _objectSpread(_objectSpread({}, event), {}, {\n payload: _objectSpread(_objectSpread({}, event.payload), event.payload.messageStatus === readStates.received && {\n messageStatus: readStates.read\n })\n });\n }\n\n return event;\n })\n });\n\n case SET_HISTORY:\n const {\n events: history,\n participants,\n activeServiceSessionId,\n activeServiceSettings = {},\n serviceData,\n resumeConversationPrompt\n } = action.history;\n const events = mergeHistory(state.events, history);\n\n const mergedParticipants = _objectSpread(_objectSpread({}, state.participantInfo.participants), participants);\n\n const lastParticipantEvent = events.slice().reverse().find(m => (m.type === 'message' || m.type === 'participant') && !m.payload.fromClient);\n let lastParticipantId = null;\n\n if (lastParticipantEvent) {\n if (lastParticipantEvent.type === 'message') {\n lastParticipantId = lastParticipantEvent.payload.participant;\n }\n\n if (lastParticipantEvent.type === 'participant') {\n lastParticipantId = lastParticipantEvent.payload.participant.id;\n }\n }\n\n const {\n cobrowsing,\n entry,\n uploads\n } = activeServiceSettings;\n const historyNewEntryMeta = calculateNewEntryMeta(_objectSpread(_objectSpread(_objectSpread({}, state.entryMeta), entry), {}, {\n active: entry.default || payloadTypes.text,\n options: _objectSpread({}, entry && entry.options ? entry.options : {})\n }), events[events.length - 1].payload);\n\n let newFeatures = _objectSpread({}, state.options.features); // Only set cobrowsing if it was initialised by the account config.\n\n\n if (newFeatures.hasOwnProperty(featureKeys.cobrowsing)) {\n newFeatures = _objectSpread(_objectSpread({}, newFeatures), {}, {\n cobrowsing: {\n enabled: !!(cobrowsing && cobrowsing.enabled)\n }\n });\n }\n\n const newFeaturesHasUpload = newFeatures.hasOwnProperty(featureKeys.uploads); // Only set uploads if it was initialised by the account config.\n\n if (newFeaturesHasUpload) {\n const {\n payload: lastParticipantEventPayload\n } = lastParticipantEvent;\n const {\n type: entryType\n } = lastParticipantEventPayload.entry || {};\n newFeatures = _objectSpread(_objectSpread({}, newFeatures), {}, {\n uploads: {\n enabled: !!(uploads && uploads.enabled),\n enabledFromEntry: entryType === entryTypes.upload\n }\n });\n }\n\n const returnState = _objectSpread(_objectSpread({}, state), {}, {\n unreadEvents: events.filter(event => event.type === 'message' && event.payload.messageStatus === readStates.received).length,\n events: events.filter(e => e.type !== 'participant' || !!e.payload.participant.introduction),\n participantInfo: _objectSpread(_objectSpread(_objectSpread({}, state.participantInfo), lastParticipantId ? participantReducer(state.participantInfo, {\n type: SET_PARTICIPANT,\n participant: mergedParticipants[lastParticipantId]\n }) : {}), {}, {\n participants: mergedParticipants\n }),\n historyLoaded: true,\n serviceInfo: _objectSpread(_objectSpread({}, state.serviceInfo), {}, {\n activeServiceSessionId\n }),\n serviceData: serviceData || {},\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: newFeatures\n }),\n entryMeta: !newFeaturesHasUpload && historyNewEntryMeta.active === entryTypes.upload ? _objectSpread({}, state.entryMeta) : historyNewEntryMeta,\n resumeConversationPrompt: resumeConversationPrompt || false\n });\n\n if (lastParticipantId) {\n returnState.headerTitles = headerTitlesReducer(state.headerTitles, {\n type: SET_HEADER_SUB_TITLE,\n title: mergedParticipants[lastParticipantId].name\n });\n }\n\n return returnState;\n\n case RESET_HISTORY_LOADED_FLAG:\n return _objectSpread(_objectSpread({}, state), {}, {\n historyLoaded: false\n });\n\n case SET_IS_LOADING:\n return _objectSpread(_objectSpread({}, state), {}, {\n isLoading: action.isLoading\n });\n\n case INIT_IDLE_DETACH_COUNTDOWN:\n const {\n delaySeconds,\n delayTime\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: {\n hasCountdown: true,\n isActive: true,\n wasStopped: false,\n count: delaySeconds,\n remaining: delaySeconds,\n timer: delayTime\n }\n });\n\n case DECREMENT_IDLE_DETACH_COUNTDOWN_COUNTER:\n const {\n idleDetachCountdown\n } = state;\n const {\n remaining: prevRemaining\n } = idleDetachCountdown;\n const remaining = prevRemaining - 1;\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: _objectSpread(_objectSpread({}, state.idleDetachCountdown), {}, {\n remaining,\n timer: (0,_general_utils__WEBPACK_IMPORTED_MODULE_0__.getTimeFromSeconds)(remaining)\n })\n });\n\n case STOP_IDLE_DETACH_COUNTDOWN_COUNTER:\n {\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: _objectSpread(_objectSpread({}, state.idleDetachCountdown), {}, {\n isActive: false,\n wasStopped: true\n })\n });\n }\n\n case CLEAR_IDLE_DETACH_COUNTDOWN:\n return _objectSpread(_objectSpread({}, state), {}, {\n idleDetachCountdown: {\n hasCountdown: false,\n isActive: false\n }\n });\n\n case INIT_RESUME_CONVERSATION_PROMPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n resumeConversationPrompt: true\n });\n\n case CLEAR_RESUME_CONVERSATION_PROMPT:\n return _objectSpread(_objectSpread({}, state), {}, {\n resumeConversationPrompt: false\n });\n\n case SET_VISIBILITY:\n return _objectSpread(_objectSpread({}, state), {}, {\n visible: action.visible\n });\n\n case SET_PARTICIPANT:\n case CLEAR_PARTICIPANTS:\n return _objectSpread(_objectSpread({}, state), {}, {\n participantInfo: participantReducer(state.participantInfo, action)\n });\n\n case SET_ACTIVE_SERVICE:\n if (state.serviceInfo.activeServiceSessionId !== action.activeServiceSessionId) {\n return _objectSpread(_objectSpread({}, state), {}, {\n serviceInfo: _objectSpread(_objectSpread({}, state.serviceInfo), {}, {\n activeServiceSessionId: action.activeServiceSessionId\n })\n });\n }\n\n return state;\n\n case SET_HEADER_TITLE:\n case SET_HEADER_SUB_TITLE:\n return _objectSpread(_objectSpread({}, state), {}, {\n headerTitles: headerTitlesReducer(state.headerTitles, action)\n });\n\n case SET_INITIAL_STATE:\n return _objectSpread(_objectSpread({}, state), {}, {\n initialState: action.initialState\n });\n\n case SET_SERVICE_DATA_ITEM:\n return _objectSpread(_objectSpread({}, state), {}, {\n serviceData: _objectSpread(_objectSpread({}, state.serviceData), {}, {\n [action.payload.type]: action.payload\n })\n });\n\n case SET_FEATURES:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: action.features\n })\n });\n\n case SET_FEATURE_ENABLED_STATE:\n // Only set cobrowsing if it already exists in the object.\n // Otherwise we may set if for accounts not allowing it at all.\n return state.options.features.hasOwnProperty(action.key) ? _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: _objectSpread(_objectSpread({}, state.options.features), {}, {\n [action.key]: _objectSpread(_objectSpread({}, state.options.features[action.key] || {}), {}, {\n enabled: action.enabled\n })\n })\n })\n }) : state;\n\n case CLEAR_FEATURES:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n features: {}\n })\n });\n\n case SHOW_OPTION:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n panelActive: true,\n optionActive: action.optionName\n })\n });\n\n case HIDE_OPTION:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n panelActive: false,\n optionActive: ''\n })\n });\n\n case SET_USER_SELECTED_OPTIONS:\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n userSelectedOptions: action.options\n })\n });\n\n case SET_USER_SELECTED_OPTION:\n const {\n option,\n value\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n options: _objectSpread(_objectSpread({}, state.options), {}, {\n userSelectedOptions: _objectSpread(_objectSpread({}, state.options.userSelectedOptions), {}, {\n [option]: value\n })\n })\n });\n\n case SET_BLOCK_AUTO_ENTRY_SWITCH:\n const {\n value: blockAutoEntrySwitch\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread({}, state.entryMeta), {}, {\n blockAutoEntrySwitch\n })\n });\n\n case SET_SERVICE_ENTRY_METADATA:\n const {\n entryMeta\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread(_objectSpread({}, state.entryMeta), entryMeta), {}, {\n active: entryMeta.default,\n options: _objectSpread({}, entryMeta.options || {}),\n overrideOptions: {}\n })\n });\n\n case SET_ACTIVE_ENTRY_TYPE:\n const {\n entryType: active\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread({}, state.entryMeta), {}, {\n active\n })\n });\n\n case SET_USER_ENTRY_TYPE:\n const {\n entryType: userSelected\n } = action;\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: _objectSpread(_objectSpread({}, state.entryMeta), {}, {\n userSelected\n })\n });\n\n case REGISTER_UPLOAD:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: [...state.currentUploads, {\n id: action.fileId,\n name: action.fileName,\n progress: 1,\n uploading: true,\n complete: false,\n error: '',\n uploadHandle: action.uploadHandle\n }]\n });\n\n case SET_UPLOAD_PROGRESS:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.map(fileUpload => {\n if (fileUpload.id === action.fileId) {\n return _objectSpread(_objectSpread({}, fileUpload), {}, {\n progress: action.progress,\n uploading: action.progress !== 100,\n uploadHandle: action.progress === 100 ? null : fileUpload.uploadHandle\n });\n }\n\n return fileUpload;\n })\n });\n\n case SET_UPLOAD_ERROR:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.map(fileUpload => {\n if (fileUpload.id === action.fileId) {\n return _objectSpread(_objectSpread({}, fileUpload), {}, {\n error: action.errorText,\n progress: 0,\n uploading: false,\n uploadHandle: null\n });\n }\n\n return fileUpload;\n })\n });\n\n case SET_UPLOAD_COMPLETE:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.map(fileUpload => {\n if (fileUpload.id === action.fileId) {\n return _objectSpread(_objectSpread({}, fileUpload), {}, {\n complete: true\n });\n }\n\n return fileUpload;\n })\n });\n\n case CLEAR_UPLOAD:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: state.currentUploads.filter(fileUpload => fileUpload.id !== action.fileId)\n });\n\n case CLEAR_ALL_UPLOADS:\n return _objectSpread(_objectSpread({}, state), {}, {\n currentUploads: []\n });\n\n case RESET_UPLOAD_STATE:\n return _objectSpread(_objectSpread({}, state), {}, {\n showFileUpload: false,\n currentUploads: []\n });\n\n case RESET_ENTRY_STATE:\n {\n return _objectSpread(_objectSpread({}, state), {}, {\n entryMeta: {\n default: payloadTypes.text,\n active: payloadTypes.text,\n userSelected: null,\n blockAutoEntrySwitch: false,\n options: {},\n optionsOverride: {}\n }\n });\n }\n\n case SET_SEAMLY_CONTAINER_ELEMENT:\n {\n return _objectSpread(_objectSpread({}, state), {}, {\n seamlyContainerElement: action.element\n });\n }\n\n default:\n return state;\n }\n};\nconst calculateVisibility = ({\n hasResponded,\n previousVisibility,\n requestedVisibility,\n config\n}) => {\n const {\n defaults,\n layoutMode,\n hideOnNoUserResponse\n } = config;\n const {\n visible: defaultVisibility\n } = defaults || {}; // Requesting open should override the responded check.\n\n if (layoutMode === 'window' && hideOnNoUserResponse && requestedVisibility !== visibilityStates.open) {\n return hasResponded ? requestedVisibility || previousVisibility || visibilityStates.open : visibilityStates.hidden;\n }\n\n const baseVisibility = layoutMode === 'inline' ? visibilityStates.open : visibilityStates.minimized;\n return requestedVisibility || previousVisibility || defaultVisibility || baseVisibility;\n};\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/seamly-utils.js?");
1863
2226
 
1864
2227
  /***/ }),
1865
2228
 
@@ -1870,18 +2233,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1870
2233
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1871
2234
 
1872
2235
  "use strict";
1873
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"validateFileSize\": () => (/* binding */ validateFileSize),\n/* harmony export */ \"fileListObjectIsNotEmpty\": () => (/* binding */ fileListObjectIsNotEmpty),\n/* harmony export */ \"isEmailString\": () => (/* binding */ isEmailString),\n/* harmony export */ \"isNotEmptyString\": () => (/* binding */ isNotEmptyString)\n/* harmony export */ });\nconst validateFileSize = (fileList, maxSize) => {\n let isValid = true;\n\n for (let i = 0; i < fileList.length; i++) {\n if (fileList[i].size > maxSize) {\n isValid = false;\n }\n }\n\n return isValid;\n};\nconst fileListObjectIsNotEmpty = fileListObj => !!(fileListObj !== null && fileListObj !== void 0 && fileListObj.length) > 0;\nconst isEmailString = val => {\n /* eslint-disable-next-line no-control-regex */\n const regex = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\n return !!(val && val.match(regex));\n};\nconst isNotEmptyString = val => !!val;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/validations.js?");
1874
-
1875
- /***/ }),
1876
-
1877
- /***/ "./translations/en.js":
1878
- /*!****************************!*\
1879
- !*** ./translations/en.js ***!
1880
- \****************************/
1881
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1882
-
1883
- "use strict";
1884
- 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// Please note: All texts containing the string 'srText' are short for\n// Screen Reader Text. These texts are invisible on screen but broadcast\n// to screen readers. Avoid undue verbosity, but ensure that a user who cannot\n// see the screen will get both the message content as well as the context\n// in which the message occurred if not already clear from the current\n// position of the keyboard focus.\n// Example: An error occurs in the chat window and this error has an 'srText'\n// entry. Because the error could occur while the user is NOT chatting in the window,\n// add context such as \"Something went wrong with the chat session\" as just saying\n// \"Something went wrong\" would not be clear enough for users who cannot see the\n// source of the error on screen.\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n 'carousel.controls.next': 'Next',\n 'carousel.controls.previous': 'Previous',\n 'carousel.slide.label': ({\n index,\n total\n }) => `${index} of ${total}`,\n 'dateTime.srText': ({\n date,\n time\n }) => `Messages starting ${date} at ${time}:`,\n 'dateTime.today': 'Today',\n 'dateTime.yesterday': 'Yesterday',\n 'disclaimer.content': 'This chat session will be saved to help us improve our service delivery.',\n 'disclaimer.title': 'Privacy disclaimer',\n 'dividerKeys.newTopic': 'New topic started.',\n 'errors.configError.message': 'We are sorry this happened, please retry at a later time.',\n 'errors.configError.srText': 'A chat configuration error occurred. Our apologies, please retry at a later time.',\n 'errors.configError.title': 'Chat configuration error.',\n 'errors.general.buttonText': 'Restart chat',\n 'errors.general.message': 'Do you want to start a new chat session?',\n 'errors.general.srText': 'Something went wrong with the chat session. You can restart the chat.',\n 'errors.general.title': 'Something went wrong',\n 'errors.seamlyOffline.message': 'There might be a problem with your or our network connection. The chat session should resume as soon the connection is available again.',\n 'errors.seamlyOffline.srText': 'The chat has connection issues. There might be a problem with your or our network connection. The chat session should resume as soon as the connection is available again.',\n 'errors.seamlyOffline.title': 'Connection issues',\n 'faq.headingText': 'Suggested topics',\n 'faq.srAvailableText': 'Suggested topics are available in the chat.',\n 'faq.srUnavailableText': 'Suggested topics are no longer available in the chat.',\n 'faq.srUpdatedText': 'There are new suggested topics in the chat.',\n 'fileUpload.cancelButtonText': 'Cancel upload',\n 'fileUpload.contentHint': size => `Select a file of maximum ${size}`,\n 'fileUpload.errors.general': 'Something went wrong with the upload. Please cancel the upload and try again.',\n 'fileUpload.errors.noFile': 'Please select a file to upload',\n 'fileUpload.errors.tooLarge': 'The selected file is too large, please upload a smaller file',\n 'fileUpload.errors.unavailable': 'Uploading files is no longer possible. Please cancel the upload and try again later.',\n 'fileUpload.errors.virusFound': 'The selected file is unsafe, please upload a different file.',\n 'fileUpload.errors.wrongType': 'The selected file type is not supported. Please cancel the upload and upload a different file.',\n 'fileUpload.fileUnavailableText': 'This download link has expired',\n 'fileUpload.labelText': 'Select file',\n 'fileUpload.selectedText': fileName => {\n if (fileName) {\n return fileName;\n } else {\n return 'No file selected';\n }\n },\n 'fileUpload.srAvailableText': 'File uploads are now available in the chat.',\n 'fileUpload.srCompleteText': 'Upload complete.',\n 'fileUpload.srFileDownloadText': fileName => `Download file ${fileName}.`,\n 'fileUpload.srFileUnavailableText': fileName => `Download for ${fileName} has expired.`,\n 'fileUpload.srFileUploadedText': fileName => `Uploaded file ${fileName}.`,\n 'fileUpload.srProgressLabel': fileName => `${fileName} upload progress status`,\n 'fileUpload.srStartedText': 'Upload started.',\n 'fileUpload.srUnavailableText': 'File uploads in the chat are no longer available.',\n 'fileUpload.toggleButtonText': 'Upload files',\n 'fileUpload.uploadButtonText': 'Upload file',\n 'header.collapseApp': 'collapse chat',\n 'header.title': 'You\\'re talking to',\n 'idleDetachWarning.continueButton': 'Continue conversation',\n 'idleDetachWarning.countdownText': 'Your conversation will automatically end in:',\n 'idleDetachWarning.countdownTimer': ({\n minutes,\n seconds\n }) => {\n switch (minutes) {\n case 1:\n switch (seconds) {\n case 1:\n return '1 minute, 1 second';\n\n case 0:\n return '1 minute';\n\n default:\n return `1 minute, ${seconds} seconds`;\n }\n\n case 0:\n switch (seconds) {\n case 1:\n return '1 second';\n\n case 0:\n default:\n return `${seconds} seconds`;\n }\n\n default:\n switch (seconds) {\n case 1:\n return `${minutes} minutes, 1 second`;\n\n case 0:\n return `${minutes} minutes`;\n\n default:\n return `${minutes} minutes, ${seconds} seconds`;\n }\n\n }\n },\n 'idleDetachWarning.countdownTitle': 'Are you still there?',\n 'idleDetachWarning.detachButton': 'End conversation',\n 'idleDetachWarning.notifyTransferText': 'Your conversation is being ended.',\n 'idleDetachWarning.srCountDownStoppedText': 'Automatic conversation ending prevented. Welcome back.',\n 'info.cobrowsing.cobrowsingEnded': 'Screen sharing has ended',\n 'info.cobrowsing.cobrowsingStarted': 'Screen sharing is now enabled. The agent can see the page you\\'re currently on',\n 'info.sendTranscript.accepted': ({\n emailAddress\n }) => `A transcript will be sent to ${emailAddress}`,\n 'input.inputLabel': limit => {\n if (limit) {\n return `Your message (max. ${limit} characters)`;\n }\n\n return 'Your message';\n },\n 'input.inputPlaceholder': limit => {\n if (limit) {\n return `Your message (max. ${limit} characters)`;\n }\n\n return 'Your message';\n },\n 'input.sendMessage': 'Send',\n 'input.srCharacterLimitText': limit => {\n switch (limit) {\n case 1:\n return '1 character remaining.';\n\n case 0:\n default:\n return `${limit} characters remaining.`;\n }\n },\n 'lightbox.closeLabel': 'Close',\n 'lightbox.heading': 'Enlarged chat image',\n 'message.choicePrompts.cancelChooseAgain': 'Cancel choice change',\n 'message.choicePrompts.chooseAgain': 'Change your choice',\n 'message.image.srTextEnlargeButtonLabel': ({\n description\n }) => `Enlarge ${description}`,\n 'message.srNewEventCount': ({\n newCount\n }) => {\n switch (newCount) {\n case 1:\n return `There is 1 new chat message.`;\n\n case 0:\n default:\n return `There are ${newCount} new chat messages.`;\n }\n },\n 'message.srTextUnreadCount': ({\n unreadCount\n }) => {\n switch (unreadCount) {\n case 1:\n return `There is 1 new unread chat message.`;\n\n case 0:\n default:\n return `There are ${unreadCount} new unread chat messages.`;\n }\n },\n 'options.cancelButtonText': 'Cancel',\n 'options.cobrowsing.cobrowsingActiveText': 'Sharing screen',\n 'options.cobrowsing.cobrowsingUnavailable': 'Screen sharing is currently unavailable.',\n 'options.cobrowsing.description': 'This allows the agent to see the page you\\'re currently on. Nothing else is shared.',\n 'options.cobrowsing.labelTurnOff': 'Turn screen sharing off',\n 'options.cobrowsing.labelTurnOn': 'Turn screen sharing on',\n 'options.cobrowsing.menuTitle': 'Screen sharing',\n 'options.cobrowsing.srCobrowsingAvailable': 'Screen sharing is now available.',\n 'options.cobrowsing.srStartedCobrowsingText': 'Screen sharing has been started.',\n 'options.cobrowsing.srStopCobrowsingText': 'Stop screen sharing',\n 'options.cobrowsing.srStoppedCobrowsingText': 'Screen sharing has been stopped.',\n 'options.cobrowsing.stopCobrowsingText': 'Stop',\n 'options.cobrowsing.title': 'Share my screen',\n 'options.openButtonText': 'Options',\n 'options.saveButtonText': 'Save',\n 'options.sendTranscript.description': 'Enter the email address you would like to send the chat transcript to.',\n 'options.sendTranscript.invalidEmailText': 'Please enter a valid email address',\n 'options.sendTranscript.label': 'Email address',\n 'options.sendTranscript.menuTitle': 'Send transcript',\n 'options.sendTranscript.noEmailText': 'Please enter an email address',\n 'options.sendTranscript.sendButtonText': 'Send',\n 'options.sendTranscript.title': 'Send chat transcript',\n 'options.unavailableText': 'unavailable',\n 'resumeConversationPrompt.continueButton': 'Resume conversation',\n 'resumeConversationPrompt.detachButton': 'Ask new question',\n 'resumeConversationPrompt.title': name => `Would you like to continue the conversation with ${name}?`,\n skiplinkText: 'Skip to chat input',\n 'toggleButton.resumeTitle': 'Resume chat with',\n 'toggleButton.subtitle': 'Start a chat with us',\n 'toggleButton.title': 'Have a question?',\n 'translations.divider.restartButtonText': 'Start again',\n 'translations.divider.startText': language => `Translating to ${language}`,\n 'translations.divider.stopText': language => `Translating to ${language} ended`,\n 'translations.settings.cancelButtonText': 'Cancel',\n 'translations.settings.currentTranslationLabel': 'Currently translating to',\n 'translations.settings.defaultOptionLabel': 'Choose language',\n 'translations.settings.description': 'Automatic translations might contain errors.',\n 'translations.settings.endButtonText': 'Stop translating',\n 'translations.settings.inputLabel': 'Translate chat to',\n 'translations.settings.noLocaleText': 'Choose a language to translate to',\n 'translations.settings.openButtonText': 'Translation',\n 'translations.settings.startButtonText': 'Start translating',\n 'translations.settings.title': 'Translation',\n 'translations.status.label': language => `Translating to ${language}`,\n 'translations.status.srStopText': 'Stop translating',\n 'translations.status.stopText': 'Stop',\n 'translations.toggle.hideButtonText': 'Show original',\n 'translations.toggle.showButtonText': 'Show translation',\n 'window.srModalLayoutLabel': 'Chat window',\n 'window.srTexts.onClose': 'The chat is closed.',\n 'window.srTexts.onHistoryLoad': 'Chat history has been loaded.',\n 'window.srTexts.onLoad': 'Chat is available on this page.',\n 'window.srTexts.onOpen': 'The chat is opened.'\n});\n\n//# sourceURL=webpack://@seamly/web-ui/./translations/en.js?");
2236
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"validateFileSize\": () => (/* binding */ validateFileSize),\n/* harmony export */ \"fileListObjectIsNotEmpty\": () => (/* binding */ fileListObjectIsNotEmpty),\n/* harmony export */ \"isEmailString\": () => (/* binding */ isEmailString),\n/* harmony export */ \"isNotEmptyString\": () => (/* binding */ isNotEmptyString)\n/* harmony export */ });\nconst validateFileSize = (fileList, maxSize) => {\n let isValid = true;\n\n for (let i = 0; i < fileList.length; i++) {\n if (fileList[i].size > maxSize) {\n isValid = false;\n }\n }\n\n return isValid;\n};\nconst fileListObjectIsNotEmpty = fileListObj => !!(fileListObj !== null && fileListObj !== void 0 && fileListObj.length) > 0;\n/* eslint-disable no-control-regex */\n\nconst isEmailString = val => {\n const regex = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\n const trimmedVal = val && val.trim();\n return !!(trimmedVal && trimmedVal.match(regex));\n};\n/* eslint-enable no-control-regex */\n\nconst isNotEmptyString = val => !!val;\n\n//# sourceURL=webpack://@seamly/web-ui/./src/javascripts/ui/utils/validations.js?");
1885
2237
 
1886
2238
  /***/ }),
1887
2239
 
@@ -1945,7 +2297,7 @@ eval("module.exports = stringify\nstringify.default = stringify\nstringify.stabl
1945
2297
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1946
2298
 
1947
2299
  "use strict";
1948
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createFocusTrap\": () => (/* binding */ createFocusTrap)\n/* harmony export */ });\n/* harmony import */ var tabbable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tabbable */ \"./node_modules/tabbable/dist/index.esm.js\");\n/*!\n* focus-trap 6.6.1\n* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE\n*/\n\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nvar activeFocusTraps = function () {\n var trapQueue = [];\n return {\n activateTrap: function activateTrap(trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var trapIndex = trapQueue.indexOf(trap);\n\n if (trapIndex === -1) {\n trapQueue.push(trap);\n } else {\n // move this existing trap to the front of the queue\n trapQueue.splice(trapIndex, 1);\n trapQueue.push(trap);\n }\n },\n deactivateTrap: function deactivateTrap(trap) {\n var trapIndex = trapQueue.indexOf(trap);\n\n if (trapIndex !== -1) {\n trapQueue.splice(trapIndex, 1);\n }\n\n if (trapQueue.length > 0) {\n trapQueue[trapQueue.length - 1].unpause();\n }\n }\n };\n}();\n\nvar isSelectableInput = function isSelectableInput(node) {\n return node.tagName && node.tagName.toLowerCase() === 'input' && typeof node.select === 'function';\n};\n\nvar isEscapeEvent = function isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n};\n\nvar isTabEvent = function isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n};\n\nvar delay = function delay(fn) {\n return setTimeout(fn, 0);\n}; // Array.find/findIndex() are not supported on IE; this replicates enough\n// of Array.findIndex() for our needs\n\n\nvar findIndex = function findIndex(arr, fn) {\n var idx = -1;\n arr.every(function (value, i) {\n if (fn(value)) {\n idx = i;\n return false; // break\n }\n\n return true; // next\n });\n return idx;\n};\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n * the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\n\n\nvar valueOrHandler = function valueOrHandler(value) {\n for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n params[_key - 1] = arguments[_key];\n }\n\n return typeof value === 'function' ? value.apply(void 0, params) : value;\n};\n\nvar createFocusTrap = function createFocusTrap(elements, userOptions) {\n var doc = document;\n\n var config = _objectSpread2({\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true\n }, userOptions);\n\n var state = {\n // @type {Array<HTMLElement>}\n containers: [],\n // list of objects identifying the first and last tabbable nodes in all containers/groups in\n // the trap\n // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n // is active, but the trap should never get to a state where there isn't at least one group\n // with at least one tabbable node in it (that would lead to an error condition that would\n // result in an error being thrown)\n // @type {Array<{ container: HTMLElement, firstTabbableNode: HTMLElement|null, lastTabbableNode: HTMLElement|null }>}\n tabbableGroups: [],\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n // timer ID for when delayInitialFocus is true and initial focus in this trap\n // has been delayed during activation\n delayInitialFocusTimer: undefined\n };\n var trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n var getOption = function getOption(configOverrideOptions, optionName, configOptionName) {\n return configOverrideOptions && configOverrideOptions[optionName] !== undefined ? configOverrideOptions[optionName] : config[configOptionName || optionName];\n };\n\n var containersContain = function containersContain(element) {\n return state.containers.some(function (container) {\n return container.contains(element);\n });\n };\n\n var getNodeForOption = function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n\n if (!optionValue) {\n return null;\n }\n\n var node = optionValue;\n\n if (typeof optionValue === 'string') {\n node = doc.querySelector(optionValue);\n\n if (!node) {\n throw new Error(\"`\".concat(optionName, \"` refers to no known node\"));\n }\n }\n\n if (typeof optionValue === 'function') {\n node = optionValue();\n\n if (!node) {\n throw new Error(\"`\".concat(optionName, \"` did not return a node\"));\n }\n }\n\n return node;\n };\n\n var getInitialFocusNode = function getInitialFocusNode() {\n var node; // false indicates we want no initialFocus at all\n\n if (getOption({}, 'initialFocus') === false) {\n return false;\n }\n\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (containersContain(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n var firstTabbableGroup = state.tabbableGroups[0];\n var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode;\n node = firstTabbableNode || getNodeForOption('fallbackFocus');\n }\n\n if (!node) {\n throw new Error('Your focus-trap needs to have at least one focusable element');\n }\n\n return node;\n };\n\n var updateTabbableNodes = function updateTabbableNodes() {\n state.tabbableGroups = state.containers.map(function (container) {\n var tabbableNodes = (0,tabbable__WEBPACK_IMPORTED_MODULE_0__.tabbable)(container);\n\n if (tabbableNodes.length > 0) {\n return {\n container: container,\n firstTabbableNode: tabbableNodes[0],\n lastTabbableNode: tabbableNodes[tabbableNodes.length - 1]\n };\n }\n\n return undefined;\n }).filter(function (group) {\n return !!group;\n }); // remove groups with no tabbable nodes\n // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n\n if (state.tabbableGroups.length <= 0 && !getNodeForOption('fallbackFocus')) {\n throw new Error('Your focus-trap must have at least one container with at least one tabbable node in it at all times');\n }\n };\n\n var tryFocus = function tryFocus(node) {\n if (node === false) {\n return;\n }\n\n if (node === doc.activeElement) {\n return;\n }\n\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n\n node.focus({\n preventScroll: !!config.preventScroll\n });\n state.mostRecentlyFocusedNode = node;\n\n if (isSelectableInput(node)) {\n node.select();\n }\n };\n\n var getReturnFocusNode = function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\n return node ? node : previousActiveElement;\n }; // This needs to be done on mousedown and touchstart instead of click\n // so that it precedes the focus event.\n\n\n var checkPointerDown = function checkPointerDown(e) {\n if (containersContain(e.target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n // immediately deactivate the trap\n trap.deactivate({\n // if, on deactivation, we should return focus to the node originally-focused\n // when the trap was activated (or the configured `setReturnFocus` node),\n // then assume it's also OK to return focus to the outside node that was\n // just clicked, causing deactivation, as long as that node is focusable;\n // if it isn't focusable, then return focus to the original node focused\n // on activation (or the configured `setReturnFocus` node)\n // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n // which will result in the outside click setting focus to the node\n // that was clicked, whether it's focusable or not; by setting\n // `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n // on activation (or the configured `setReturnFocus` node)\n returnFocus: config.returnFocusOnDeactivate && !(0,tabbable__WEBPACK_IMPORTED_MODULE_0__.isFocusable)(e.target)\n });\n return;\n } // This is needed for mobile devices.\n // (If we'll only let `click` events through,\n // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n\n\n if (valueOrHandler(config.allowOutsideClick, e)) {\n // allow the click outside the trap to take place\n return;\n } // otherwise, prevent the click\n\n\n e.preventDefault();\n }; // In case focus escapes the trap for some strange reason, pull it back in.\n\n\n var checkFocusIn = function checkFocusIn(e) {\n var targetContained = containersContain(e.target); // In Firefox when you Tab out of an iframe the Document is briefly focused.\n\n if (targetContained || e.target instanceof Document) {\n if (targetContained) {\n state.mostRecentlyFocusedNode = e.target;\n }\n } else {\n // escaped! pull it back in to where it just left\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n }; // Hijack Tab events on the first and last focusable nodes of the trap,\n // in order to prevent focus from escaping. If it escapes for even a\n // moment it can end up scrolling the page and causing confusion so we\n // kind of need to capture the action at the keydown phase.\n\n\n var checkTab = function checkTab(e) {\n updateTabbableNodes();\n var destinationNode = null;\n\n if (state.tabbableGroups.length > 0) {\n // make sure the target is actually contained in a group\n // NOTE: the target may also be the container itself if it's tabbable\n // with tabIndex='-1' and was given initial focus\n var containerIndex = findIndex(state.tabbableGroups, function (_ref) {\n var container = _ref.container;\n return container.contains(e.target);\n });\n\n if (containerIndex < 0) {\n // target not found in any group: quite possible focus has escaped the trap,\n // so bring it back in to...\n if (e.shiftKey) {\n // ...the last node in the last group\n destinationNode = state.tabbableGroups[state.tabbableGroups.length - 1].lastTabbableNode;\n } else {\n // ...the first node in the first group\n destinationNode = state.tabbableGroups[0].firstTabbableNode;\n }\n } else if (e.shiftKey) {\n // REVERSE\n // is the target the first tabbable node in a group?\n var startOfGroupIndex = findIndex(state.tabbableGroups, function (_ref2) {\n var firstTabbableNode = _ref2.firstTabbableNode;\n return e.target === firstTabbableNode;\n });\n\n if (startOfGroupIndex < 0 && state.tabbableGroups[containerIndex].container === e.target) {\n // an exception case where the target is the container itself, in which\n // case, we should handle shift+tab as if focus were on the container's\n // first tabbable node, and go to the last tabbable node of the LAST group\n startOfGroupIndex = containerIndex;\n }\n\n if (startOfGroupIndex >= 0) {\n // YES: then shift+tab should go to the last tabbable node in the\n // previous group (and wrap around to the last tabbable node of\n // the LAST group if it's the first tabbable node of the FIRST group)\n var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;\n var destinationGroup = state.tabbableGroups[destinationGroupIndex];\n destinationNode = destinationGroup.lastTabbableNode;\n }\n } else {\n // FORWARD\n // is the target the last tabbable node in a group?\n var lastOfGroupIndex = findIndex(state.tabbableGroups, function (_ref3) {\n var lastTabbableNode = _ref3.lastTabbableNode;\n return e.target === lastTabbableNode;\n });\n\n if (lastOfGroupIndex < 0 && state.tabbableGroups[containerIndex].container === e.target) {\n // an exception case where the target is the container itself, in which\n // case, we should handle tab as if focus were on the container's\n // last tabbable node, and go to the first tabbable node of the FIRST group\n lastOfGroupIndex = containerIndex;\n }\n\n if (lastOfGroupIndex >= 0) {\n // YES: then tab should go to the first tabbable node in the next\n // group (and wrap around to the first tabbable node of the FIRST\n // group if it's the last tabbable node of the LAST group)\n var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;\n\n var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];\n destinationNode = _destinationGroup.firstTabbableNode;\n }\n }\n } else {\n destinationNode = getNodeForOption('fallbackFocus');\n }\n\n if (destinationNode) {\n e.preventDefault();\n tryFocus(destinationNode);\n } // else, let the browser take care of [shift+]tab and move the focus\n\n };\n\n var checkKey = function checkKey(e) {\n if (isEscapeEvent(e) && valueOrHandler(config.escapeDeactivates) !== false) {\n e.preventDefault();\n trap.deactivate();\n return;\n }\n\n if (isTabEvent(e)) {\n checkTab(e);\n return;\n }\n };\n\n var checkClick = function checkClick(e) {\n if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n return;\n }\n\n if (containersContain(e.target)) {\n return;\n }\n\n if (valueOrHandler(config.allowOutsideClick, e)) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n }; //\n // EVENT LISTENERS\n //\n\n\n var addListeners = function addListeners() {\n if (!state.active) {\n return;\n } // There can be only one listening focus trap at a time\n\n\n activeFocusTraps.activateTrap(trap); // Delay ensures that the focused element doesn't capture the event\n // that caused the focus trap activation.\n\n state.delayInitialFocusTimer = config.delayInitialFocus ? delay(function () {\n tryFocus(getInitialFocusNode());\n }) : tryFocus(getInitialFocusNode());\n doc.addEventListener('focusin', checkFocusIn, true);\n doc.addEventListener('mousedown', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('touchstart', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('click', checkClick, {\n capture: true,\n passive: false\n });\n doc.addEventListener('keydown', checkKey, {\n capture: true,\n passive: false\n });\n return trap;\n };\n\n var removeListeners = function removeListeners() {\n if (!state.active) {\n return;\n }\n\n doc.removeEventListener('focusin', checkFocusIn, true);\n doc.removeEventListener('mousedown', checkPointerDown, true);\n doc.removeEventListener('touchstart', checkPointerDown, true);\n doc.removeEventListener('click', checkClick, true);\n doc.removeEventListener('keydown', checkKey, true);\n return trap;\n }; //\n // TRAP DEFINITION\n //\n\n\n trap = {\n activate: function activate(activateOptions) {\n if (state.active) {\n return this;\n }\n\n var onActivate = getOption(activateOptions, 'onActivate');\n var onPostActivate = getOption(activateOptions, 'onPostActivate');\n var checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n if (!checkCanFocusTrap) {\n updateTabbableNodes();\n }\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n if (onActivate) {\n onActivate();\n }\n\n var finishActivation = function finishActivation() {\n if (checkCanFocusTrap) {\n updateTabbableNodes();\n }\n\n addListeners();\n\n if (onPostActivate) {\n onPostActivate();\n }\n };\n\n if (checkCanFocusTrap) {\n checkCanFocusTrap(state.containers.concat()).then(finishActivation, finishActivation);\n return this;\n }\n\n finishActivation();\n return this;\n },\n deactivate: function deactivate(deactivateOptions) {\n if (!state.active) {\n return this;\n }\n\n clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n\n state.delayInitialFocusTimer = undefined;\n removeListeners();\n state.active = false;\n state.paused = false;\n activeFocusTraps.deactivateTrap(trap);\n var onDeactivate = getOption(deactivateOptions, 'onDeactivate');\n var onPostDeactivate = getOption(deactivateOptions, 'onPostDeactivate');\n var checkCanReturnFocus = getOption(deactivateOptions, 'checkCanReturnFocus');\n\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus = getOption(deactivateOptions, 'returnFocus', 'returnFocusOnDeactivate');\n\n var finishDeactivation = function finishDeactivation() {\n delay(function () {\n if (returnFocus) {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n }\n\n if (onPostDeactivate) {\n onPostDeactivate();\n }\n });\n };\n\n if (returnFocus && checkCanReturnFocus) {\n checkCanReturnFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)).then(finishDeactivation, finishDeactivation);\n return this;\n }\n\n finishDeactivation();\n return this;\n },\n pause: function pause() {\n if (state.paused || !state.active) {\n return this;\n }\n\n state.paused = true;\n removeListeners();\n return this;\n },\n unpause: function unpause() {\n if (!state.paused || !state.active) {\n return this;\n }\n\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n return this;\n },\n updateContainerElements: function updateContainerElements(containerElements) {\n var elementsAsArray = [].concat(containerElements).filter(Boolean);\n state.containers = elementsAsArray.map(function (element) {\n return typeof element === 'string' ? doc.querySelector(element) : element;\n });\n\n if (state.active) {\n updateTabbableNodes();\n }\n\n return this;\n }\n }; // initialize container elements\n\n trap.updateContainerElements(elements);\n return trap;\n};\n\n\n//# sourceMappingURL=focus-trap.esm.js.map\n\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/focus-trap/dist/focus-trap.esm.js?");
2300
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createFocusTrap\": () => (/* binding */ createFocusTrap)\n/* harmony export */ });\n/* harmony import */ var tabbable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tabbable */ \"./node_modules/tabbable/dist/index.esm.js\");\n/*!\n* focus-trap 6.7.1\n* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE\n*/\n\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nvar activeFocusTraps = function () {\n var trapQueue = [];\n return {\n activateTrap: function activateTrap(trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var trapIndex = trapQueue.indexOf(trap);\n\n if (trapIndex === -1) {\n trapQueue.push(trap);\n } else {\n // move this existing trap to the front of the queue\n trapQueue.splice(trapIndex, 1);\n trapQueue.push(trap);\n }\n },\n deactivateTrap: function deactivateTrap(trap) {\n var trapIndex = trapQueue.indexOf(trap);\n\n if (trapIndex !== -1) {\n trapQueue.splice(trapIndex, 1);\n }\n\n if (trapQueue.length > 0) {\n trapQueue[trapQueue.length - 1].unpause();\n }\n }\n };\n}();\n\nvar isSelectableInput = function isSelectableInput(node) {\n return node.tagName && node.tagName.toLowerCase() === 'input' && typeof node.select === 'function';\n};\n\nvar isEscapeEvent = function isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n};\n\nvar isTabEvent = function isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n};\n\nvar delay = function delay(fn) {\n return setTimeout(fn, 0);\n}; // Array.find/findIndex() are not supported on IE; this replicates enough\n// of Array.findIndex() for our needs\n\n\nvar findIndex = function findIndex(arr, fn) {\n var idx = -1;\n arr.every(function (value, i) {\n if (fn(value)) {\n idx = i;\n return false; // break\n }\n\n return true; // next\n });\n return idx;\n};\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n * the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\n\n\nvar valueOrHandler = function valueOrHandler(value) {\n for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n params[_key - 1] = arguments[_key];\n }\n\n return typeof value === 'function' ? value.apply(void 0, params) : value;\n};\n\nvar getActualTarget = function getActualTarget(event) {\n // NOTE: If the trap is _inside_ a shadow DOM, event.target will always be the\n // shadow host. However, event.target.composedPath() will be an array of\n // nodes \"clicked\" from inner-most (the actual element inside the shadow) to\n // outer-most (the host HTML document). If we have access to composedPath(),\n // then use its first element; otherwise, fall back to event.target (and\n // this only works for an _open_ shadow DOM; otherwise,\n // composedPath()[0] === event.target always).\n return event.target.shadowRoot && typeof event.composedPath === 'function' ? event.composedPath()[0] : event.target;\n};\n\nvar createFocusTrap = function createFocusTrap(elements, userOptions) {\n var doc = (userOptions === null || userOptions === void 0 ? void 0 : userOptions.document) || document;\n\n var config = _objectSpread2({\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true\n }, userOptions);\n\n var state = {\n // @type {Array<HTMLElement>}\n containers: [],\n // list of objects identifying the first and last tabbable nodes in all containers/groups in\n // the trap\n // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n // is active, but the trap should never get to a state where there isn't at least one group\n // with at least one tabbable node in it (that would lead to an error condition that would\n // result in an error being thrown)\n // @type {Array<{ container: HTMLElement, firstTabbableNode: HTMLElement|null, lastTabbableNode: HTMLElement|null }>}\n tabbableGroups: [],\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n // timer ID for when delayInitialFocus is true and initial focus in this trap\n // has been delayed during activation\n delayInitialFocusTimer: undefined\n };\n var trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n var getOption = function getOption(configOverrideOptions, optionName, configOptionName) {\n return configOverrideOptions && configOverrideOptions[optionName] !== undefined ? configOverrideOptions[optionName] : config[configOptionName || optionName];\n };\n\n var containersContain = function containersContain(element) {\n return !!(element && state.containers.some(function (container) {\n return container.contains(element);\n }));\n };\n /**\n * Gets the node for the given option, which is expected to be an option that\n * can be either a DOM node, a string that is a selector to get a node, `false`\n * (if a node is explicitly NOT given), or a function that returns any of these\n * values.\n * @param {string} optionName\n * @returns {undefined | false | HTMLElement | SVGElement} Returns\n * `undefined` if the option is not specified; `false` if the option\n * resolved to `false` (node explicitly not given); otherwise, the resolved\n * DOM node.\n * @throws {Error} If the option is set, not `false`, and is not, or does not\n * resolve to a node.\n */\n\n\n var getNodeForOption = function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n\n if (typeof optionValue === 'function') {\n for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n params[_key2 - 1] = arguments[_key2];\n }\n\n optionValue = optionValue.apply(void 0, params);\n }\n\n if (!optionValue) {\n if (optionValue === undefined || optionValue === false) {\n return optionValue;\n } // else, empty string (invalid), null (invalid), 0 (invalid)\n\n\n throw new Error(\"`\".concat(optionName, \"` was specified but was not a node, or did not return a node\"));\n }\n\n var node = optionValue; // could be HTMLElement, SVGElement, or non-empty string at this point\n\n if (typeof optionValue === 'string') {\n node = doc.querySelector(optionValue); // resolve to node, or null if fails\n\n if (!node) {\n throw new Error(\"`\".concat(optionName, \"` as selector refers to no known node\"));\n }\n }\n\n return node;\n };\n\n var getInitialFocusNode = function getInitialFocusNode() {\n var node = getNodeForOption('initialFocus'); // false explicitly indicates we want no initialFocus at all\n\n if (node === false) {\n return false;\n }\n\n if (node === undefined) {\n // option not specified: use fallback options\n if (containersContain(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n var firstTabbableGroup = state.tabbableGroups[0];\n var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode; // NOTE: `fallbackFocus` option function cannot return `false` (not supported)\n\n node = firstTabbableNode || getNodeForOption('fallbackFocus');\n }\n }\n\n if (!node) {\n throw new Error('Your focus-trap needs to have at least one focusable element');\n }\n\n return node;\n };\n\n var updateTabbableNodes = function updateTabbableNodes() {\n state.tabbableGroups = state.containers.map(function (container) {\n var tabbableNodes = (0,tabbable__WEBPACK_IMPORTED_MODULE_0__.tabbable)(container);\n\n if (tabbableNodes.length > 0) {\n return {\n container: container,\n firstTabbableNode: tabbableNodes[0],\n lastTabbableNode: tabbableNodes[tabbableNodes.length - 1]\n };\n }\n\n return undefined;\n }).filter(function (group) {\n return !!group;\n }); // remove groups with no tabbable nodes\n // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n\n if (state.tabbableGroups.length <= 0 && !getNodeForOption('fallbackFocus') // returning false not supported for this option\n ) {\n throw new Error('Your focus-trap must have at least one container with at least one tabbable node in it at all times');\n }\n };\n\n var tryFocus = function tryFocus(node) {\n if (node === false) {\n return;\n }\n\n if (node === doc.activeElement) {\n return;\n }\n\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n\n node.focus({\n preventScroll: !!config.preventScroll\n });\n state.mostRecentlyFocusedNode = node;\n\n if (isSelectableInput(node)) {\n node.select();\n }\n };\n\n var getReturnFocusNode = function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus', previousActiveElement);\n return node ? node : node === false ? false : previousActiveElement;\n }; // This needs to be done on mousedown and touchstart instead of click\n // so that it precedes the focus event.\n\n\n var checkPointerDown = function checkPointerDown(e) {\n var target = getActualTarget(e);\n\n if (containersContain(target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n // immediately deactivate the trap\n trap.deactivate({\n // if, on deactivation, we should return focus to the node originally-focused\n // when the trap was activated (or the configured `setReturnFocus` node),\n // then assume it's also OK to return focus to the outside node that was\n // just clicked, causing deactivation, as long as that node is focusable;\n // if it isn't focusable, then return focus to the original node focused\n // on activation (or the configured `setReturnFocus` node)\n // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n // which will result in the outside click setting focus to the node\n // that was clicked, whether it's focusable or not; by setting\n // `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n // on activation (or the configured `setReturnFocus` node)\n returnFocus: config.returnFocusOnDeactivate && !(0,tabbable__WEBPACK_IMPORTED_MODULE_0__.isFocusable)(target)\n });\n return;\n } // This is needed for mobile devices.\n // (If we'll only let `click` events through,\n // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n\n\n if (valueOrHandler(config.allowOutsideClick, e)) {\n // allow the click outside the trap to take place\n return;\n } // otherwise, prevent the click\n\n\n e.preventDefault();\n }; // In case focus escapes the trap for some strange reason, pull it back in.\n\n\n var checkFocusIn = function checkFocusIn(e) {\n var target = getActualTarget(e);\n var targetContained = containersContain(target); // In Firefox when you Tab out of an iframe the Document is briefly focused.\n\n if (targetContained || target instanceof Document) {\n if (targetContained) {\n state.mostRecentlyFocusedNode = target;\n }\n } else {\n // escaped! pull it back in to where it just left\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n }; // Hijack Tab events on the first and last focusable nodes of the trap,\n // in order to prevent focus from escaping. If it escapes for even a\n // moment it can end up scrolling the page and causing confusion so we\n // kind of need to capture the action at the keydown phase.\n\n\n var checkTab = function checkTab(e) {\n var target = getActualTarget(e);\n updateTabbableNodes();\n var destinationNode = null;\n\n if (state.tabbableGroups.length > 0) {\n // make sure the target is actually contained in a group\n // NOTE: the target may also be the container itself if it's tabbable\n // with tabIndex='-1' and was given initial focus\n var containerIndex = findIndex(state.tabbableGroups, function (_ref) {\n var container = _ref.container;\n return container.contains(target);\n });\n\n if (containerIndex < 0) {\n // target not found in any group: quite possible focus has escaped the trap,\n // so bring it back in to...\n if (e.shiftKey) {\n // ...the last node in the last group\n destinationNode = state.tabbableGroups[state.tabbableGroups.length - 1].lastTabbableNode;\n } else {\n // ...the first node in the first group\n destinationNode = state.tabbableGroups[0].firstTabbableNode;\n }\n } else if (e.shiftKey) {\n // REVERSE\n // is the target the first tabbable node in a group?\n var startOfGroupIndex = findIndex(state.tabbableGroups, function (_ref2) {\n var firstTabbableNode = _ref2.firstTabbableNode;\n return target === firstTabbableNode;\n });\n\n if (startOfGroupIndex < 0 && state.tabbableGroups[containerIndex].container === target) {\n // an exception case where the target is the container itself, in which\n // case, we should handle shift+tab as if focus were on the container's\n // first tabbable node, and go to the last tabbable node of the LAST group\n startOfGroupIndex = containerIndex;\n }\n\n if (startOfGroupIndex >= 0) {\n // YES: then shift+tab should go to the last tabbable node in the\n // previous group (and wrap around to the last tabbable node of\n // the LAST group if it's the first tabbable node of the FIRST group)\n var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;\n var destinationGroup = state.tabbableGroups[destinationGroupIndex];\n destinationNode = destinationGroup.lastTabbableNode;\n }\n } else {\n // FORWARD\n // is the target the last tabbable node in a group?\n var lastOfGroupIndex = findIndex(state.tabbableGroups, function (_ref3) {\n var lastTabbableNode = _ref3.lastTabbableNode;\n return target === lastTabbableNode;\n });\n\n if (lastOfGroupIndex < 0 && state.tabbableGroups[containerIndex].container === target) {\n // an exception case where the target is the container itself, in which\n // case, we should handle tab as if focus were on the container's\n // last tabbable node, and go to the first tabbable node of the FIRST group\n lastOfGroupIndex = containerIndex;\n }\n\n if (lastOfGroupIndex >= 0) {\n // YES: then tab should go to the first tabbable node in the next\n // group (and wrap around to the first tabbable node of the FIRST\n // group if it's the last tabbable node of the LAST group)\n var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;\n\n var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];\n destinationNode = _destinationGroup.firstTabbableNode;\n }\n }\n } else {\n // NOTE: the fallbackFocus option does not support returning false to opt-out\n destinationNode = getNodeForOption('fallbackFocus');\n }\n\n if (destinationNode) {\n e.preventDefault();\n tryFocus(destinationNode);\n } // else, let the browser take care of [shift+]tab and move the focus\n\n };\n\n var checkKey = function checkKey(e) {\n if (isEscapeEvent(e) && valueOrHandler(config.escapeDeactivates, e) !== false) {\n e.preventDefault();\n trap.deactivate();\n return;\n }\n\n if (isTabEvent(e)) {\n checkTab(e);\n return;\n }\n };\n\n var checkClick = function checkClick(e) {\n if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n return;\n }\n\n var target = getActualTarget(e);\n\n if (containersContain(target)) {\n return;\n }\n\n if (valueOrHandler(config.allowOutsideClick, e)) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n }; //\n // EVENT LISTENERS\n //\n\n\n var addListeners = function addListeners() {\n if (!state.active) {\n return;\n } // There can be only one listening focus trap at a time\n\n\n activeFocusTraps.activateTrap(trap); // Delay ensures that the focused element doesn't capture the event\n // that caused the focus trap activation.\n\n state.delayInitialFocusTimer = config.delayInitialFocus ? delay(function () {\n tryFocus(getInitialFocusNode());\n }) : tryFocus(getInitialFocusNode());\n doc.addEventListener('focusin', checkFocusIn, true);\n doc.addEventListener('mousedown', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('touchstart', checkPointerDown, {\n capture: true,\n passive: false\n });\n doc.addEventListener('click', checkClick, {\n capture: true,\n passive: false\n });\n doc.addEventListener('keydown', checkKey, {\n capture: true,\n passive: false\n });\n return trap;\n };\n\n var removeListeners = function removeListeners() {\n if (!state.active) {\n return;\n }\n\n doc.removeEventListener('focusin', checkFocusIn, true);\n doc.removeEventListener('mousedown', checkPointerDown, true);\n doc.removeEventListener('touchstart', checkPointerDown, true);\n doc.removeEventListener('click', checkClick, true);\n doc.removeEventListener('keydown', checkKey, true);\n return trap;\n }; //\n // TRAP DEFINITION\n //\n\n\n trap = {\n activate: function activate(activateOptions) {\n if (state.active) {\n return this;\n }\n\n var onActivate = getOption(activateOptions, 'onActivate');\n var onPostActivate = getOption(activateOptions, 'onPostActivate');\n var checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n if (!checkCanFocusTrap) {\n updateTabbableNodes();\n }\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n if (onActivate) {\n onActivate();\n }\n\n var finishActivation = function finishActivation() {\n if (checkCanFocusTrap) {\n updateTabbableNodes();\n }\n\n addListeners();\n\n if (onPostActivate) {\n onPostActivate();\n }\n };\n\n if (checkCanFocusTrap) {\n checkCanFocusTrap(state.containers.concat()).then(finishActivation, finishActivation);\n return this;\n }\n\n finishActivation();\n return this;\n },\n deactivate: function deactivate(deactivateOptions) {\n if (!state.active) {\n return this;\n }\n\n clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n\n state.delayInitialFocusTimer = undefined;\n removeListeners();\n state.active = false;\n state.paused = false;\n activeFocusTraps.deactivateTrap(trap);\n var onDeactivate = getOption(deactivateOptions, 'onDeactivate');\n var onPostDeactivate = getOption(deactivateOptions, 'onPostDeactivate');\n var checkCanReturnFocus = getOption(deactivateOptions, 'checkCanReturnFocus');\n\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus = getOption(deactivateOptions, 'returnFocus', 'returnFocusOnDeactivate');\n\n var finishDeactivation = function finishDeactivation() {\n delay(function () {\n if (returnFocus) {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n }\n\n if (onPostDeactivate) {\n onPostDeactivate();\n }\n });\n };\n\n if (returnFocus && checkCanReturnFocus) {\n checkCanReturnFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)).then(finishDeactivation, finishDeactivation);\n return this;\n }\n\n finishDeactivation();\n return this;\n },\n pause: function pause() {\n if (state.paused || !state.active) {\n return this;\n }\n\n state.paused = true;\n removeListeners();\n return this;\n },\n unpause: function unpause() {\n if (!state.paused || !state.active) {\n return this;\n }\n\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n return this;\n },\n updateContainerElements: function updateContainerElements(containerElements) {\n var elementsAsArray = [].concat(containerElements).filter(Boolean);\n state.containers = elementsAsArray.map(function (element) {\n return typeof element === 'string' ? doc.querySelector(element) : element;\n });\n\n if (state.active) {\n updateTabbableNodes();\n }\n\n return this;\n }\n }; // initialize container elements\n\n trap.updateContainerElements(elements);\n return trap;\n};\n\n\n//# sourceMappingURL=focus-trap.esm.js.map\n\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/focus-trap/dist/focus-trap.esm.js?");
1949
2301
 
1950
2302
  /***/ }),
1951
2303
 
@@ -2397,6 +2749,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2397
2749
 
2398
2750
  /***/ }),
2399
2751
 
2752
+ /***/ "./node_modules/redux-thunk/es/index.js":
2753
+ /*!**********************************************!*\
2754
+ !*** ./node_modules/redux-thunk/es/index.js ***!
2755
+ \**********************************************/
2756
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2757
+
2758
+ "use strict";
2759
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction createThunkMiddleware(extraArgument) {\n return function (_ref) {\n var dispatch = _ref.dispatch,\n getState = _ref.getState;\n return function (next) {\n return function (action) {\n if (typeof action === 'function') {\n return action(dispatch, getState, extraArgument);\n }\n\n return next(action);\n };\n };\n };\n}\n\nvar thunk = createThunkMiddleware();\nthunk.withExtraArgument = createThunkMiddleware;\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (thunk);\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/redux-thunk/es/index.js?");
2760
+
2761
+ /***/ }),
2762
+
2400
2763
  /***/ "./node_modules/redux/es/redux.js":
2401
2764
  /*!****************************************!*\
2402
2765
  !*** ./node_modules/redux/es/redux.js ***!
@@ -2549,6 +2912,105 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2549
2912
 
2550
2913
  /***/ }),
2551
2914
 
2915
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js":
2916
+ /*!****************************************************************************************************************!*\
2917
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***!
2918
+ \****************************************************************************************************************/
2919
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2920
+
2921
+ "use strict";
2922
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _arrayLikeToArray)\n/* harmony export */ });\nfunction _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++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js?");
2923
+
2924
+ /***/ }),
2925
+
2926
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js":
2927
+ /*!**************************************************************************************************************!*\
2928
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***!
2929
+ \**************************************************************************************************************/
2930
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2931
+
2932
+ "use strict";
2933
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _arrayWithHoles)\n/* harmony export */ });\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js?");
2934
+
2935
+ /***/ }),
2936
+
2937
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/classCallCheck.js":
2938
+ /*!**************************************************************************************************************!*\
2939
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***!
2940
+ \**************************************************************************************************************/
2941
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2942
+
2943
+ "use strict";
2944
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _classCallCheck)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/classCallCheck.js?");
2945
+
2946
+ /***/ }),
2947
+
2948
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/createClass.js":
2949
+ /*!***********************************************************************************************************!*\
2950
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/createClass.js ***!
2951
+ \***********************************************************************************************************/
2952
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2953
+
2954
+ "use strict";
2955
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _createClass)\n/* harmony export */ });\nfunction _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\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/createClass.js?");
2956
+
2957
+ /***/ }),
2958
+
2959
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/defineProperty.js":
2960
+ /*!**************************************************************************************************************!*\
2961
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/defineProperty.js ***!
2962
+ \**************************************************************************************************************/
2963
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2964
+
2965
+ "use strict";
2966
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _defineProperty)\n/* harmony export */ });\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/defineProperty.js?");
2967
+
2968
+ /***/ }),
2969
+
2970
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js":
2971
+ /*!********************************************************************************************************************!*\
2972
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***!
2973
+ \********************************************************************************************************************/
2974
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2975
+
2976
+ "use strict";
2977
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _iterableToArrayLimit)\n/* harmony export */ });\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js?");
2978
+
2979
+ /***/ }),
2980
+
2981
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js":
2982
+ /*!***************************************************************************************************************!*\
2983
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***!
2984
+ \***************************************************************************************************************/
2985
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2986
+
2987
+ "use strict";
2988
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _nonIterableRest)\n/* harmony export */ });\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js?");
2989
+
2990
+ /***/ }),
2991
+
2992
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/slicedToArray.js":
2993
+ /*!*************************************************************************************************************!*\
2994
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***!
2995
+ \*************************************************************************************************************/
2996
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2997
+
2998
+ "use strict";
2999
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _slicedToArray)\n/* harmony export */ });\n/* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles.js */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\");\n/* harmony import */ var _iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit.js */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\");\n/* harmony import */ var _unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray.js */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest.js */ \"./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\");\n\n\n\n\nfunction _slicedToArray(arr, i) {\n return (0,_arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || (0,_iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr, i) || (0,_unsupportedIterableToArray_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr, i) || (0,_nonIterableRest_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack://@seamly/web-ui/./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/slicedToArray.js?");
3000
+
3001
+ /***/ }),
3002
+
3003
+ /***/ "./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js":
3004
+ /*!**************************************************************************************************************************!*\
3005
+ !*** ./node_modules/@ultraq/icu-message-formatter/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***!
3006
+ \**************************************************************************************************************************/
3007
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
3008
+
3009
+ "use strict";
3010
+ 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?");
3011
+
3012
+ /***/ }),
3013
+
2552
3014
  /***/ "./node_modules/mustache/mustache.mjs":
2553
3015
  /*!********************************************!*\
2554
3016
  !*** ./node_modules/mustache/mustache.mjs ***!