@paramms/chat-widget 1.0.38 → 1.0.39

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.
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
- var be = Object.defineProperty;
2
- var xe = (o, e, i) => e in o ? be(o, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : o[e] = i;
3
- var v = (o, e, i) => xe(o, typeof e != "symbol" ? e + "" : e, i);
4
- import { p as ge, r as me, a as ve } from "./codec.js";
5
- import { h as We } from "./codec.js";
6
- import { P as ye, C as ke, b as Ce } from "./outbox.js";
7
- import { e as Ke } from "./outbox.js";
8
- import { E2ESession as Te, extractX3DHInit as Ie } from "./e2e.js";
9
- const ae = "http://www.w3.org/2000/svg", Se = 8e3;
10
- class ze {
1
+ var Pe = Object.defineProperty;
2
+ var Le = (t, e, i) => e in t ? Pe(t, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : t[e] = i;
3
+ var y = (t, e, i) => Le(t, typeof e != "symbol" ? e + "" : e, i);
4
+ import { p as je, r as Ae, a as $e } from "./codec.js";
5
+ import { h as st } from "./codec.js";
6
+ import { P as Be, C as Me, b as Re } from "./outbox.js";
7
+ import { e as at } from "./outbox.js";
8
+ import { E2ESession as qe, extractX3DHInit as Oe } from "./e2e.js";
9
+ const xe = "http://www.w3.org/2000/svg", De = 8e3;
10
+ class He {
11
11
  constructor() {
12
- v(this, "svg", null);
13
- v(this, "timers", /* @__PURE__ */ new Set());
12
+ y(this, "svg", null);
13
+ y(this, "timers", /* @__PURE__ */ new Set());
14
14
  }
15
15
  /** Feed every server frame; the overlay reacts to annotation frames only. */
16
16
  apply(e) {
@@ -23,7 +23,7 @@ class ze {
23
23
  ensureSvg() {
24
24
  var i;
25
25
  if ((i = this.svg) != null && i.isConnected) return this.svg;
26
- const e = document.createElementNS(ae, "svg");
26
+ const e = document.createElementNS(xe, "svg");
27
27
  return e.setAttribute("data-relay-annotations", ""), e.setAttribute("aria-hidden", "true"), e.setAttribute(
28
28
  "style",
29
29
  "position:fixed;inset:0;width:100vw;height:100vh;pointer-events:none;z-index:2147483000;"
@@ -32,15 +32,15 @@ class ze {
32
32
  draw(e) {
33
33
  var b;
34
34
  if (typeof document > "u" || !((b = e.points) != null && b.length)) return;
35
- const i = this.ensureSvg(), s = window.innerWidth, a = window.innerHeight, r = document.createElementNS(ae, "polyline");
36
- r.setAttribute("points", e.points.map((d) => `${(d.x * s).toFixed(1)},${(d.y * a).toFixed(1)}`).join(" ")), r.setAttribute("fill", "none"), r.setAttribute("stroke", e.color || "#ff3b30"), r.setAttribute("stroke-width", String(e.width || 3)), r.setAttribute("stroke-linecap", "round"), r.setAttribute("stroke-linejoin", "round"), r.setAttribute("data-stroke-id", e.id), i.append(r);
35
+ const i = this.ensureSvg(), s = window.innerWidth, r = window.innerHeight, a = document.createElementNS(xe, "polyline");
36
+ a.setAttribute("points", e.points.map((d) => `${(d.x * s).toFixed(1)},${(d.y * r).toFixed(1)}`).join(" ")), a.setAttribute("fill", "none"), a.setAttribute("stroke", e.color || "#ff3b30"), a.setAttribute("stroke-width", String(e.width || 3)), a.setAttribute("stroke-linecap", "round"), a.setAttribute("stroke-linejoin", "round"), a.setAttribute("data-stroke-id", e.id), i.append(a);
37
37
  const f = setTimeout(() => {
38
- r.style.transition = "opacity 600ms", r.style.opacity = "0";
38
+ a.style.transition = "opacity 600ms", a.style.opacity = "0";
39
39
  const d = setTimeout(() => {
40
- r.remove(), this.timers.delete(d);
40
+ a.remove(), this.timers.delete(d);
41
41
  }, 650);
42
42
  this.timers.add(d), this.timers.delete(f);
43
- }, Se);
43
+ }, De);
44
44
  this.timers.add(f);
45
45
  }
46
46
  clear() {
@@ -53,7 +53,7 @@ class ze {
53
53
  this.timers.clear(), (e = this.svg) == null || e.remove(), this.svg = null;
54
54
  }
55
55
  }
56
- const re = "objectchat-widget-styles", Ee = ["👍", "❤️", "😂", "😮", "😢", "🙏"], Pe = 400, Le = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M22 2 11 13M22 2l-7 20-4-9-9-4 20-7z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', je = `
56
+ const me = "objectchat-widget-styles", Ne = ["👍", "❤️", "😂", "😮", "😢", "🙏"], _e = 400, Fe = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M22 2 11 13M22 2l-7 20-4-9-9-4 20-7z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', Ue = `
57
57
  .ocw { --ocw-accent:#4F63F5; --ocw-bg:#f3efe9; --ocw-card:#fff; --ocw-line:#ececec; --ocw-ink:#1c1b1a; --ocw-mut:#9b9690;
58
58
  position:relative;
59
59
  display:flex; flex-direction:column; height:100%; min-height:320px; background:var(--ocw-bg);
@@ -244,147 +244,147 @@ const re = "objectchat-widget-styles", Ee = ["👍", "❤️", "😂", "😮", "
244
244
  .ocw-bubble-wrap:hover .ocw-translate-btn { opacity:1; }
245
245
  .ocw-translated-tag { font-size:10px; color:var(--ocw-mut); margin-top:2px; }
246
246
  `;
247
- function Ae() {
248
- if (typeof document > "u" || document.getElementById(re)) return;
249
- const o = document.createElement("style");
250
- o.id = re, o.textContent = je, document.head.appendChild(o);
247
+ function We() {
248
+ if (typeof document > "u" || document.getElementById(me)) return;
249
+ const t = document.createElement("style");
250
+ t.id = me, t.textContent = Ue, document.head.appendChild(t);
251
251
  }
252
- function t(o, e, i) {
253
- const s = document.createElement(o);
252
+ function o(t, e, i) {
253
+ const s = document.createElement(t);
254
254
  return e && (s.className = e), i !== void 0 && (s.textContent = i), s;
255
255
  }
256
- function $e(o) {
256
+ function Ve(t) {
257
257
  try {
258
- return new Date(o).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
258
+ return new Date(t).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
259
259
  } catch {
260
260
  return "";
261
261
  }
262
262
  }
263
- function X(o) {
263
+ function ie(t) {
264
264
  var e;
265
- switch (o.kind) {
265
+ switch (t.kind) {
266
266
  case "text":
267
- return o.text;
267
+ return t.text;
268
268
  case "system":
269
- return typeof ((e = o.data) == null ? void 0 : e.message) == "string" ? String(o.data.message) : o.event;
269
+ return typeof ((e = t.data) == null ? void 0 : e.message) == "string" ? String(t.data.message) : t.event;
270
270
  case "card":
271
- return [o.title, o.body].filter(Boolean).join(" — ");
271
+ return [t.title, t.body].filter(Boolean).join(" — ");
272
272
  case "attachment":
273
- return o.name ?? o.url;
273
+ return t.name ?? t.url;
274
274
  case "form":
275
- return o.prompt;
275
+ return t.prompt;
276
276
  case "appointment":
277
- return `📅 ${o.title} — ${new Date(o.startIso).toLocaleString()}`;
277
+ return `📅 ${t.title} — ${new Date(t.startIso).toLocaleString()}`;
278
278
  }
279
279
  }
280
- class Be {
280
+ class Ye {
281
281
  /** Last seq the guest has seen per conversationId — used to compute unread badges. */
282
- constructor(e, i, s, a = {}) {
283
- v(this, "scroll");
284
- v(this, "chips");
285
- v(this, "typing");
286
- v(this, "quick");
287
- v(this, "formHost");
288
- v(this, "csatPanel");
289
- v(this, "offlinePanel");
290
- v(this, "preChatPanel");
291
- v(this, "deflectPanel");
292
- v(this, "preChatBuilt", !1);
293
- v(this, "preChatDone", !1);
294
- v(this, "footer");
295
- v(this, "input");
296
- v(this, "subjectCard");
297
- v(this, "e2eBadge");
298
- v(this, "statusBadge");
299
- v(this, "headerName");
300
- v(this, "connStatus");
301
- v(this, "typingTimer", null);
302
- v(this, "csatSubmitted", !1);
303
- v(this, "sendBtn");
282
+ constructor(e, i, s, r = {}) {
283
+ y(this, "scroll");
284
+ y(this, "chips");
285
+ y(this, "typing");
286
+ y(this, "quick");
287
+ y(this, "formHost");
288
+ y(this, "csatPanel");
289
+ y(this, "offlinePanel");
290
+ y(this, "preChatPanel");
291
+ y(this, "deflectPanel");
292
+ y(this, "preChatBuilt", !1);
293
+ y(this, "preChatDone", !1);
294
+ y(this, "footer");
295
+ y(this, "input");
296
+ y(this, "subjectCard");
297
+ y(this, "e2eBadge");
298
+ y(this, "statusBadge");
299
+ y(this, "headerName");
300
+ y(this, "connStatus");
301
+ y(this, "typingTimer", null);
302
+ y(this, "csatSubmitted", !1);
303
+ y(this, "sendBtn");
304
304
  /** Container-driven responsive sizing — toggles .ocw-compact (see CSS note). */
305
- v(this, "compactObserver", null);
305
+ y(this, "compactObserver", null);
306
306
  // ── Co-browsing (shared whiteboard) ─────────────────────────────────────
307
- v(this, "cobrowseBtn");
308
- v(this, "cobrowseCanvas");
309
- v(this, "cobrowseToolbar");
310
- v(this, "cobrowseHint");
311
- v(this, "cobrowseActive", !1);
312
- v(this, "cobrowseColor", "#f5713c");
313
- v(this, "lastAnnotationVersion", -1);
314
- v(this, "storeRef", null);
315
- v(this, "scrollCleanup", null);
307
+ y(this, "cobrowseBtn");
308
+ y(this, "cobrowseCanvas");
309
+ y(this, "cobrowseToolbar");
310
+ y(this, "cobrowseHint");
311
+ y(this, "cobrowseActive", !1);
312
+ y(this, "cobrowseColor", "#f5713c");
313
+ y(this, "lastAnnotationVersion", -1);
314
+ y(this, "storeRef", null);
315
+ y(this, "scrollCleanup", null);
316
316
  // ── Live translation ──────────────────────────────────────────────────-
317
- v(this, "translationCache", /* @__PURE__ */ new Map());
318
- v(this, "showingTranslation", /* @__PURE__ */ new Set());
317
+ y(this, "translationCache", /* @__PURE__ */ new Map());
318
+ y(this, "showingTranslation", /* @__PURE__ */ new Set());
319
319
  /** Whether the subject card (server Subject entity, mount config fallback)
320
320
  * has been built — built once when data first arrives. */
321
- v(this, "subjectBuilt", !1);
322
- var k, E, I, A, $, z, q, C, j, D;
323
- this.root = e, this.me = i, this.h = s, this.cfg = a, Ae(), e.replaceChildren(), e.classList.add("ocw"), a.accent && e.style.setProperty("--ocw-accent", a.accent);
324
- const r = t("div", "ocw-head");
321
+ y(this, "subjectBuilt", !1);
322
+ var k, I, j, C, R, A, O, U, T, B;
323
+ this.root = e, this.me = i, this.h = s, this.cfg = r, We(), e.replaceChildren(), e.classList.add("ocw"), r.accent && e.style.setProperty("--ocw-accent", r.accent);
324
+ const a = o("div", "ocw-head");
325
325
  if (this.h.onBack) {
326
- const x = t("button", "ocw-back", "‹");
327
- x.type = "button", x.setAttribute("aria-label", "Back"), x.addEventListener("click", () => this.h.onBack()), r.append(x);
326
+ const m = o("button", "ocw-back", "‹");
327
+ m.type = "button", m.setAttribute("aria-label", "Back"), m.addEventListener("click", () => this.h.onBack()), a.append(m);
328
328
  }
329
- const f = t("div", "ocw-avatar");
330
- if ((k = a.userInfo) != null && k.avatar) {
331
- const x = document.createElement("img");
332
- x.src = a.userInfo.avatar, x.alt = a.userInfo.name ?? "You", x.style.cssText = "width:100%;height:100%;border-radius:50%;object-fit:cover", f.append(x);
329
+ const f = o("div", "ocw-avatar");
330
+ if ((k = r.userInfo) != null && k.avatar) {
331
+ const m = document.createElement("img");
332
+ m.src = r.userInfo.avatar, m.alt = r.userInfo.name ?? "You", m.style.cssText = "width:100%;height:100%;border-radius:50%;object-fit:cover", f.append(m);
333
333
  } else
334
- f.textContent = (E = a.userInfo) != null && E.name ? a.userInfo.name[0].toUpperCase() : "🧑";
335
- r.append(f);
336
- const b = t("div", "ocw-head-main");
337
- this.headerName = t("div", "ocw-head-name", ((I = a.subject) == null ? void 0 : I.ownerLabel) ?? ((A = a.subject) == null ? void 0 : A.title) ?? ""), b.append(this.headerName), ($ = a.subject) != null && $.subtitle && b.append(t("div", "ocw-head-meta", a.subject.subtitle)), r.append(b), this.statusBadge = t("span", "ocw-badge", ((z = a.subject) == null ? void 0 : z.status) ?? ""), (q = a.subject) != null && q.status || (this.statusBadge.style.display = "none"), r.append(this.statusBadge), this.e2eBadge = t("span", "ocw-e2e", "🔒 E2E"), this.e2eBadge.style.display = "none", r.append(this.e2eBadge), this.connStatus = t("span", "ocw-conn-status"), this.connStatus.style.display = "none", r.append(this.connStatus), this.cobrowseBtn = t("button", "ocw-menu ocw-cobrowse-btn", "🖍"), this.cobrowseBtn.title = "Shared whiteboard — draw to point things out together", this.cobrowseBtn.addEventListener("click", () => {
334
+ f.textContent = (I = r.userInfo) != null && I.name ? r.userInfo.name[0].toUpperCase() : "🧑";
335
+ a.append(f);
336
+ const b = o("div", "ocw-head-main");
337
+ this.headerName = o("div", "ocw-head-name", ((j = r.subject) == null ? void 0 : j.ownerLabel) ?? ((C = r.subject) == null ? void 0 : C.title) ?? ""), b.append(this.headerName), (R = r.subject) != null && R.subtitle && b.append(o("div", "ocw-head-meta", r.subject.subtitle)), a.append(b), this.statusBadge = o("span", "ocw-badge", ((A = r.subject) == null ? void 0 : A.status) ?? ""), (O = r.subject) != null && O.status || (this.statusBadge.style.display = "none"), a.append(this.statusBadge), this.e2eBadge = o("span", "ocw-e2e", "🔒 E2E"), this.e2eBadge.style.display = "none", a.append(this.e2eBadge), this.connStatus = o("span", "ocw-conn-status"), this.connStatus.style.display = "none", a.append(this.connStatus), this.cobrowseBtn = o("button", "ocw-menu ocw-cobrowse-btn", "🖍"), this.cobrowseBtn.title = "Shared whiteboard — draw to point things out together", this.cobrowseBtn.addEventListener("click", () => {
338
338
  this.cobrowseActive = !this.cobrowseActive, this.updateCobrowseUI();
339
- }), r.append(this.cobrowseBtn), r.append(t("button", "ocw-menu", "⋯")), this.chips = t("div", "ocw-chiprow"), this.scroll = t("div", "ocw-scroll"), this.subjectCard = t("div", "ocw-subject"), this.typing = t("div", "ocw-typing");
340
- const d = t("div", "ocw-typing-bubble");
341
- d.append(t("div", "ocw-typing-dot"), t("div", "ocw-typing-dot"), t("div", "ocw-typing-dot")), this.typing.append(t("div", "ocw-dot", "🧑"), d), this.quick = t("div", "ocw-quick");
342
- for (const x of a.quickReplies ?? []) {
343
- const S = t("button", void 0, x);
339
+ }), a.append(this.cobrowseBtn), a.append(o("button", "ocw-menu", "⋯")), this.chips = o("div", "ocw-chiprow"), this.scroll = o("div", "ocw-scroll"), this.subjectCard = o("div", "ocw-subject"), this.typing = o("div", "ocw-typing");
340
+ const d = o("div", "ocw-typing-bubble");
341
+ d.append(o("div", "ocw-typing-dot"), o("div", "ocw-typing-dot"), o("div", "ocw-typing-dot")), this.typing.append(o("div", "ocw-dot", "🧑"), d), this.quick = o("div", "ocw-quick");
342
+ for (const m of r.quickReplies ?? []) {
343
+ const S = o("button", void 0, m);
344
344
  S.addEventListener("click", () => {
345
- this.h.onSend(x), this.quick.style.display = "none";
345
+ this.h.onSend(m), this.quick.style.display = "none";
346
346
  }), this.quick.append(S);
347
347
  }
348
- this.formHost = t("div", "ocw-form-host"), this.csatPanel = t("div", "ocw-csat"), this.csatPanel.style.display = "none", this.offlinePanel = t("div", "ocw-offline"), this.offlinePanel.style.display = "none", this.preChatPanel = t("div", "ocw-prechat"), this.preChatPanel.style.display = "none", this.deflectPanel = t("div", "ocw-deflect"), this.deflectPanel.style.display = "none", this.input = t("textarea", void 0), this.input.rows = 1, this.input.placeholder = ((C = a.i18n) == null ? void 0 : C.placeholder) ?? "Message…";
349
- const h = t("button", "ocw-sendbtn");
348
+ this.formHost = o("div", "ocw-form-host"), this.csatPanel = o("div", "ocw-csat"), this.csatPanel.style.display = "none", this.offlinePanel = o("div", "ocw-offline"), this.offlinePanel.style.display = "none", this.preChatPanel = o("div", "ocw-prechat"), this.preChatPanel.style.display = "none", this.deflectPanel = o("div", "ocw-deflect"), this.deflectPanel.style.display = "none", this.input = o("textarea", void 0), this.input.rows = 1, this.input.placeholder = ((U = r.i18n) == null ? void 0 : U.placeholder) ?? "Message…";
349
+ const h = o("button", "ocw-sendbtn");
350
350
  h.type = "button";
351
- const y = (j = a.i18n) == null ? void 0 : j.send;
352
- y ? (h.textContent = y, h.classList.add("ocw-sendbtn-label"), h.setAttribute("aria-label", y)) : (h.innerHTML = Le, h.setAttribute("aria-label", "Send message")), h.disabled = !0, this.sendBtn = h, h.addEventListener("click", () => this.flushSend()), this.input.addEventListener("input", () => {
353
- var x, S;
354
- this.sendBtn.disabled = this.input.value.trim().length === 0, this.autoGrowInput(), this.storeRef && !this.storeRef.messages().some((M) => M.senderRole === "guest") ? (S = (x = this.h).onDeflectQuery) == null || S.call(x, this.input.value) : this.hideDeflection();
355
- }), this.input.addEventListener("keydown", (x) => {
356
- x.isComposing || x.keyCode === 229 || (x.key === "Enter" && !x.shiftKey ? (x.preventDefault(), this.flushSend()) : this.signalTyping());
351
+ const v = (T = r.i18n) == null ? void 0 : T.send;
352
+ v ? (h.textContent = v, h.classList.add("ocw-sendbtn-label"), h.setAttribute("aria-label", v)) : (h.innerHTML = Fe, h.setAttribute("aria-label", "Send message")), h.disabled = !0, this.sendBtn = h, h.addEventListener("click", () => this.flushSend()), this.input.addEventListener("input", () => {
353
+ var m, S;
354
+ this.sendBtn.disabled = this.input.value.trim().length === 0, this.autoGrowInput(), this.storeRef && !this.storeRef.messages().some((q) => q.senderRole === "guest") ? (S = (m = this.h).onDeflectQuery) == null || S.call(m, this.input.value) : this.hideDeflection();
355
+ }), this.input.addEventListener("keydown", (m) => {
356
+ m.isComposing || m.keyCode === 229 || (m.key === "Enter" && !m.shiftKey ? (m.preventDefault(), this.flushSend()) : this.signalTyping());
357
357
  });
358
- const c = t("button", "ocw-attach", "📎");
358
+ const c = o("button", "ocw-attach", "📎");
359
359
  c.title = "Attach image or file";
360
360
  const u = document.createElement("input");
361
361
  u.type = "file", u.accept = "image/*,.pdf,.txt,.doc,.docx", u.style.display = "none", c.addEventListener("click", () => u.click()), u.addEventListener("change", () => {
362
- var x;
363
- (x = u.files) != null && x[0] && this.h.onAttach && this.h.onAttach(u.files[0]), u.value = "";
362
+ var m;
363
+ (m = u.files) != null && m[0] && this.h.onAttach && this.h.onAttach(u.files[0]), u.value = "";
364
364
  });
365
- const l = t("div", "ocw-input");
365
+ const l = o("div", "ocw-input");
366
366
  l.append(c, u, this.input, h);
367
- const T = t("div", "ocw-footer");
368
- ((D = a.i18n) == null ? void 0 : D.poweredBy) !== void 0 ? T.textContent = a.i18n.poweredBy : T.innerHTML = 'Powered by <a href="https://relay.paramms.com" target="_blank" rel="noopener">Relay</a>', this.footer = T, e.append(r, this.chips, this.scroll, this.typing, this.quick, this.formHost, this.csatPanel, this.offlinePanel, this.preChatPanel, this.deflectPanel, l, this.footer), this.cobrowseCanvas = t("canvas", "ocw-cobrowse-canvas"), this.cobrowseToolbar = t("div", "ocw-cobrowse-toolbar");
369
- for (const x of ["#f5713c", "#1c1b1a", "#2563eb", "#16a34a", "#dc2626"]) {
370
- const S = t("button", "ocw-cobrowse-swatch");
371
- S.style.background = x, S.type = "button", x === this.cobrowseColor && S.classList.add("sel"), S.addEventListener("click", () => {
372
- this.cobrowseColor = x;
373
- for (const M of this.cobrowseToolbar.querySelectorAll(".ocw-cobrowse-swatch")) M.classList.remove("sel");
367
+ const E = o("div", "ocw-footer");
368
+ ((B = r.i18n) == null ? void 0 : B.poweredBy) !== void 0 ? E.textContent = r.i18n.poweredBy : E.innerHTML = 'Powered by <a href="https://relay.paramms.com" target="_blank" rel="noopener">Relay</a>', this.footer = E, e.append(a, this.chips, this.scroll, this.typing, this.quick, this.formHost, this.csatPanel, this.offlinePanel, this.preChatPanel, this.deflectPanel, l, this.footer), this.cobrowseCanvas = o("canvas", "ocw-cobrowse-canvas"), this.cobrowseToolbar = o("div", "ocw-cobrowse-toolbar");
369
+ for (const m of ["#f5713c", "#1c1b1a", "#2563eb", "#16a34a", "#dc2626"]) {
370
+ const S = o("button", "ocw-cobrowse-swatch");
371
+ S.style.background = m, S.type = "button", m === this.cobrowseColor && S.classList.add("sel"), S.addEventListener("click", () => {
372
+ this.cobrowseColor = m;
373
+ for (const q of this.cobrowseToolbar.querySelectorAll(".ocw-cobrowse-swatch")) q.classList.remove("sel");
374
374
  S.classList.add("sel");
375
375
  }), this.cobrowseToolbar.append(S);
376
376
  }
377
- const m = t("button", "ocw-cobrowse-clear", "Clear");
378
- m.addEventListener("click", () => {
379
- var x, S;
380
- return (S = (x = this.h).onAnnotateClear) == null ? void 0 : S.call(x);
381
- }), this.cobrowseToolbar.append(m), this.cobrowseHint = t("div", "ocw-cobrowse-hint", "🖍 Draw to point things out — visible to both sides"), e.append(this.cobrowseCanvas, this.cobrowseToolbar, this.cobrowseHint), this.bindCobrowsePointerEvents();
382
- const w = (x) => {
383
- e.classList.toggle("ocw-compact", x > 0 && x < Pe);
377
+ const g = o("button", "ocw-cobrowse-clear", "Clear");
378
+ g.addEventListener("click", () => {
379
+ var m, S;
380
+ return (S = (m = this.h).onAnnotateClear) == null ? void 0 : S.call(m);
381
+ }), this.cobrowseToolbar.append(g), this.cobrowseHint = o("div", "ocw-cobrowse-hint", "🖍 Draw to point things out — visible to both sides"), e.append(this.cobrowseCanvas, this.cobrowseToolbar, this.cobrowseHint), this.bindCobrowsePointerEvents();
382
+ const w = (m) => {
383
+ e.classList.toggle("ocw-compact", m > 0 && m < _e);
384
384
  };
385
- w(e.clientWidth), typeof ResizeObserver < "u" && (this.compactObserver = new ResizeObserver((x) => {
386
- var M;
387
- const S = ((M = x[0]) == null ? void 0 : M.contentRect.width) ?? e.clientWidth;
385
+ w(e.clientWidth), typeof ResizeObserver < "u" && (this.compactObserver = new ResizeObserver((m) => {
386
+ var q;
387
+ const S = ((q = m[0]) == null ? void 0 : q.contentRect.width) ?? e.clientWidth;
388
388
  w(S);
389
389
  }), this.compactObserver.observe(e));
390
390
  }
@@ -420,7 +420,7 @@ class Be {
420
420
  this.h.onTyping(!0, e), this.typingTimer && clearTimeout(this.typingTimer), this.typingTimer = setTimeout(() => this.h.onTyping(!1), 2e3);
421
421
  }
422
422
  render(e) {
423
- var c, u, l, T, m;
423
+ var c, u, l, E, g;
424
424
  if (this.storeRef = e, this.cobrowseBtn.classList.toggle("show", !!e.subject), !e.subject && this.cobrowseActive && (this.cobrowseActive = !1, this.updateCobrowseUI()), this.cobrowseActive && e.annotationVersion !== this.lastAnnotationVersion && (this.lastAnnotationVersion = e.annotationVersion, this.resizeCobrowseCanvas(), this.redrawCobrowse()), e.accent && this.root.style.setProperty("--ocw-accent", e.accent), this.e2eBadge.style.display = e.e2e ? "inline-flex" : "none", this.buildSubjectCard(e), e.subject) {
425
425
  const w = (c = this.cfg.subject) == null ? void 0 : c.ownerLabel;
426
426
  w && (this.headerName.textContent = w);
@@ -429,23 +429,23 @@ class Be {
429
429
  const i = e.visibleActions();
430
430
  this.chips.style.display = i.length ? "flex" : "none";
431
431
  for (const w of i) this.chips.append(this.chipEl(w));
432
- const s = this.scroll.scrollHeight, a = this.scroll.scrollTop;
432
+ const s = this.scroll.scrollHeight, r = this.scroll.scrollTop;
433
433
  if (this.scroll.replaceChildren(), this.subjectCard.childNodes.length && this.scroll.append(this.subjectCard), e.hasMoreHistory) {
434
- const w = t("div", "ocw-load-more");
434
+ const w = o("div", "ocw-load-more");
435
435
  w.textContent = "↑ Loading earlier messages…", w.style.pointerEvents = "none", this.scroll.append(w);
436
436
  }
437
- let r = 0;
437
+ let a = 0;
438
438
  for (const w of e.messages())
439
- this.scroll.append(this.messageEl(w, e)), w.senderId !== this.me && w.seq > r && (r = w.seq);
440
- a > 20 ? this.scroll.scrollTop = this.scroll.scrollHeight - s + a : this.scroll.scrollTop = this.scroll.scrollHeight, r > 0 && this.h.onReadUpTo(r);
439
+ this.scroll.append(this.messageEl(w, e)), w.senderId !== this.me && w.seq > a && (a = w.seq);
440
+ r > 20 ? this.scroll.scrollTop = this.scroll.scrollHeight - s + r : this.scroll.scrollTop = this.scroll.scrollHeight, a > 0 && this.h.onReadUpTo(a);
441
441
  const f = [...e.typing];
442
442
  this.typing.classList.toggle("active", f.length > 0);
443
443
  const b = this.typing.querySelector(".ocw-typing-bubble");
444
444
  b && b.setAttribute("aria-label", f.length ? "typing" : ""), this.footer.style.display = e.whiteLabel ? "none" : "block";
445
445
  const d = e.messages().some((w) => w.senderRole === "guest");
446
- !!((u = e.preChat) != null && u.enabled) && !this.preChatDone && !d && (e.preChat.showWhen !== "offline" || e.offline) ? (this.preChatBuilt || this.buildPreChatPanel(e.preChat), this.preChatPanel.style.display = "block", this.offlinePanel.style.display = "none", (l = this.root.querySelector(".ocw-input")) == null || l.style.setProperty("display", "none")) : (this.preChatPanel.style.display = "none", e.offline ? (this.offlinePanel.style.display === "none" && this.buildOfflinePanel(e.offlineMessage), this.offlinePanel.style.display = "block", (T = this.root.querySelector(".ocw-input")) == null || T.style.setProperty("display", "none")) : (this.offlinePanel.style.display = "none", (m = this.root.querySelector(".ocw-input")) == null || m.style.removeProperty("display")));
447
- const y = ["resolved", "closed", "sold", "issued", "checked_out"];
448
- this.h.onCsat && !this.csatSubmitted && y.includes(e.state) && e.messages().length > 0 && (this.csatPanel.style.display === "none" && this.buildCsatPanel(), this.csatPanel.style.display = "block");
446
+ !!((u = e.preChat) != null && u.enabled) && !this.preChatDone && !d && (e.preChat.showWhen !== "offline" || e.offline) ? (this.preChatBuilt || this.buildPreChatPanel(e.preChat), this.preChatPanel.style.display = "block", this.offlinePanel.style.display = "none", (l = this.root.querySelector(".ocw-input")) == null || l.style.setProperty("display", "none")) : (this.preChatPanel.style.display = "none", e.offline ? (this.offlinePanel.style.display === "none" && this.buildOfflinePanel(e.offlineMessage), this.offlinePanel.style.display = "block", (E = this.root.querySelector(".ocw-input")) == null || E.style.setProperty("display", "none")) : (this.offlinePanel.style.display = "none", (g = this.root.querySelector(".ocw-input")) == null || g.style.removeProperty("display")));
447
+ const v = ["resolved", "closed", "sold", "issued", "checked_out"];
448
+ this.h.onCsat && !this.csatSubmitted && v.includes(e.state) && e.messages().length > 0 && (this.csatPanel.style.display === "none" && this.buildCsatPanel(), this.csatPanel.style.display = "block");
449
449
  }
450
450
  setConnStatus(e, i) {
451
451
  if (e === "open") {
@@ -458,68 +458,68 @@ class Be {
458
458
  }
459
459
  buildOfflinePanel(e) {
460
460
  var b;
461
- this.offlinePanel.replaceChildren(), this.offlinePanel.append(t("div", "ocw-offline-icon", "🌙")), this.offlinePanel.append(t("div", "ocw-offline-title", ((b = this.cfg.i18n) == null ? void 0 : b.offline) ?? "We're offline right now")), this.offlinePanel.append(t("div", "ocw-offline-msg", e || "Leave your details and we'll get back to you soon."));
462
- const i = t("div", "ocw-offline-form"), s = t("input", "ocw-offline-input");
461
+ this.offlinePanel.replaceChildren(), this.offlinePanel.append(o("div", "ocw-offline-icon", "🌙")), this.offlinePanel.append(o("div", "ocw-offline-title", ((b = this.cfg.i18n) == null ? void 0 : b.offline) ?? "We're offline right now")), this.offlinePanel.append(o("div", "ocw-offline-msg", e || "Leave your details and we'll get back to you soon."));
462
+ const i = o("div", "ocw-offline-form"), s = o("input", "ocw-offline-input");
463
463
  s.placeholder = "Your name", s.type = "text";
464
- const a = t("input", "ocw-offline-input");
465
- a.placeholder = "Your email", a.type = "email";
466
- const r = t("textarea", "ocw-offline-input");
467
- r.placeholder = "Your message", r.rows = 3;
468
- const f = t("button", "ocw-offline-submit", "Send message");
464
+ const r = o("input", "ocw-offline-input");
465
+ r.placeholder = "Your email", r.type = "email";
466
+ const a = o("textarea", "ocw-offline-input");
467
+ a.placeholder = "Your message", a.rows = 3;
468
+ const f = o("button", "ocw-offline-submit", "Send message");
469
469
  f.type = "button", f.addEventListener("click", () => {
470
- !a.value.trim() || !r.value.trim() || (f.disabled = !0, this.h.onSend(`[Offline form]
470
+ !r.value.trim() || !a.value.trim() || (f.disabled = !0, this.h.onSend(`[Offline form]
471
471
  Name: ${s.value || "Anonymous"}
472
- Email: ${a.value}
473
- Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-thanks", "✓ Message sent! We'll reply to your email.")));
474
- }), i.append(s, a, r, f), this.offlinePanel.append(i);
472
+ Email: ${r.value}
473
+ Message: ${a.value}`), this.offlinePanel.replaceChildren(o("div", "ocw-offline-thanks", "✓ Message sent! We'll reply to your email.")));
474
+ }), i.append(s, r, a, f), this.offlinePanel.append(i);
475
475
  }
476
476
  buildPreChatPanel(e) {
477
477
  var d;
478
- this.preChatBuilt = !0, this.preChatPanel.replaceChildren(), this.preChatPanel.append(t("div", "ocw-prechat-title", e.title ?? "Before we start…"));
479
- const i = t("div", "ocw-offline-form"), s = {};
478
+ this.preChatBuilt = !0, this.preChatPanel.replaceChildren(), this.preChatPanel.append(o("div", "ocw-prechat-title", e.title ?? "Before we start…"));
479
+ const i = o("div", "ocw-offline-form"), s = {};
480
480
  for (const h of e.fields ?? ["name", "email"]) {
481
- const y = t("input", "ocw-offline-input");
482
- y.type = h === "email" ? "email" : h === "phone" ? "tel" : "text", y.placeholder = h === "name" ? "Your name" : h === "email" ? "Your email" : "Your phone number", s[h] = y, i.append(y);
481
+ const v = o("input", "ocw-offline-input");
482
+ v.type = h === "email" ? "email" : h === "phone" ? "tel" : "text", v.placeholder = h === "name" ? "Your name" : h === "email" ? "Your email" : "Your phone number", s[h] = v, i.append(v);
483
483
  }
484
- let a = null;
484
+ let r = null;
485
485
  if ((d = e.topics) != null && d.length) {
486
- a = t("select", void 0);
486
+ r = o("select", void 0);
487
487
  const h = document.createElement("option");
488
- h.value = "", h.textContent = "What is this about?", a.append(h);
489
- for (const y of e.topics) {
488
+ h.value = "", h.textContent = "What is this about?", r.append(h);
489
+ for (const v of e.topics) {
490
490
  const c = document.createElement("option");
491
- c.value = y, c.textContent = y, a.append(c);
491
+ c.value = v, c.textContent = v, r.append(c);
492
492
  }
493
- i.append(a);
493
+ i.append(r);
494
494
  }
495
- let r = null, f = null;
495
+ let a = null, f = null;
496
496
  if (e.callbackOption) {
497
- const h = t("label", "ocw-prechat-cb");
498
- r = document.createElement("input"), r.type = "checkbox", h.append(r, document.createTextNode("📞 Request a call back")), i.append(h), s.phone || (f = t("input", "ocw-offline-input"), f.type = "tel", f.placeholder = "Phone number for the call", f.style.display = "none", r.addEventListener("change", () => f.style.setProperty("display", r.checked ? "block" : "none")), i.append(f));
497
+ const h = o("label", "ocw-prechat-cb");
498
+ a = document.createElement("input"), a.type = "checkbox", h.append(a, document.createTextNode("📞 Request a call back")), i.append(h), s.phone || (f = o("input", "ocw-offline-input"), f.type = "tel", f.placeholder = "Phone number for the call", f.style.display = "none", a.addEventListener("change", () => f.style.setProperty("display", a.checked ? "block" : "none")), i.append(f));
499
499
  }
500
- const b = t("button", "ocw-offline-submit", "Start chat");
500
+ const b = o("button", "ocw-offline-submit", "Start chat");
501
501
  b.type = "button", b.addEventListener("click", () => {
502
- var u, l, T, m, w, k, E;
502
+ var u, l, E, g, w, k, I;
503
503
  const h = (u = s.email) == null ? void 0 : u.value.trim();
504
504
  if (s.email && (!h || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(h))) {
505
505
  s.email.focus();
506
506
  return;
507
507
  }
508
- const y = !!(r != null && r.checked), c = (((l = s.phone) == null ? void 0 : l.value) ?? (f == null ? void 0 : f.value) ?? "").trim();
509
- if (y && !c) {
510
- (T = s.phone ?? f) == null || T.focus();
508
+ const v = !!(a != null && a.checked), c = (((l = s.phone) == null ? void 0 : l.value) ?? (f == null ? void 0 : f.value) ?? "").trim();
509
+ if (v && !c) {
510
+ (E = s.phone ?? f) == null || E.focus();
511
511
  return;
512
512
  }
513
- if (a && ((m = e.topics) != null && m.length) && !a.value) {
514
- a.focus();
513
+ if (r && ((g = e.topics) != null && g.length) && !r.value) {
514
+ r.focus();
515
515
  return;
516
516
  }
517
- b.disabled = !0, this.completePreChat(), (E = (k = this.h).onPreChat) == null || E.call(k, {
517
+ b.disabled = !0, this.completePreChat(), (I = (k = this.h).onPreChat) == null || I.call(k, {
518
518
  ...(w = s.name) != null && w.value.trim() ? { name: s.name.value.trim() } : {},
519
519
  ...h ? { email: h } : {},
520
520
  ...c ? { phone: c } : {},
521
- ...a != null && a.value ? { topic: a.value } : {},
522
- ...y ? { callback: !0 } : {}
521
+ ...r != null && r.value ? { topic: r.value } : {},
522
+ ...v ? { callback: !0 } : {}
523
523
  });
524
524
  }), i.append(b), this.preChatPanel.append(i);
525
525
  }
@@ -530,10 +530,10 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
530
530
  /** KB deflection results ("was this your question?") above the composer. */
531
531
  showDeflection(e) {
532
532
  if (!e.length) return this.hideDeflection();
533
- this.deflectPanel.replaceChildren(), this.deflectPanel.append(t("div", "ocw-deflect-hint", "Instant answers — tap to expand"));
533
+ this.deflectPanel.replaceChildren(), this.deflectPanel.append(o("div", "ocw-deflect-hint", "Instant answers — tap to expand"));
534
534
  for (const i of e.slice(0, 3)) {
535
- const s = t("button", "ocw-deflect-card");
536
- s.append(t("div", "ocw-deflect-q", i.title), t("div", "ocw-deflect-a", i.answer)), s.addEventListener("click", () => s.classList.toggle("open")), this.deflectPanel.append(s);
535
+ const s = o("button", "ocw-deflect-card");
536
+ s.append(o("div", "ocw-deflect-q", i.title), o("div", "ocw-deflect-a", i.answer)), s.addEventListener("click", () => s.classList.toggle("open")), this.deflectPanel.append(s);
537
537
  }
538
538
  this.deflectPanel.style.display = "flex";
539
539
  }
@@ -541,14 +541,14 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
541
541
  this.deflectPanel.style.display = "none", this.deflectPanel.replaceChildren();
542
542
  }
543
543
  buildCsatPanel() {
544
- this.csatPanel.replaceChildren(), this.csatPanel.append(t("div", "ocw-csat-title", "How did we do?"));
545
- const e = t("div", "ocw-csat-stars"), i = [];
544
+ this.csatPanel.replaceChildren(), this.csatPanel.append(o("div", "ocw-csat-title", "How did we do?"));
545
+ const e = o("div", "ocw-csat-stars"), i = [];
546
546
  for (let s = 1; s <= 5; s++) {
547
- const a = t("button", "ocw-csat-star", "★");
548
- a.dataset.score = String(s), a.addEventListener("mouseenter", () => i.forEach((r, f) => r.classList.toggle("lit", f < s))), a.addEventListener("mouseleave", () => i.forEach((r) => r.classList.remove("lit"))), a.addEventListener("click", () => {
549
- var r, f;
550
- this.csatSubmitted = !0, this.csatPanel.replaceChildren(t("div", "ocw-csat-done", `Thanks for your ${s}★ rating!`)), (f = (r = this.h).onCsat) == null || f.call(r, s);
551
- }), i.push(a), e.append(a);
547
+ const r = o("button", "ocw-csat-star", "★");
548
+ r.dataset.score = String(s), r.addEventListener("mouseenter", () => i.forEach((a, f) => a.classList.toggle("lit", f < s))), r.addEventListener("mouseleave", () => i.forEach((a) => a.classList.remove("lit"))), r.addEventListener("click", () => {
549
+ var a, f;
550
+ this.csatSubmitted = !0, this.csatPanel.replaceChildren(o("div", "ocw-csat-done", `Thanks for your ${s}★ rating!`)), (f = (a = this.h).onCsat) == null || f.call(a, s);
551
+ }), i.push(r), e.append(r);
552
552
  }
553
553
  this.csatPanel.append(e);
554
554
  }
@@ -564,9 +564,9 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
564
564
  drawStroke(e) {
565
565
  const i = this.cobrowseCanvas.getContext("2d");
566
566
  if (!i || e.points.length < 2) return;
567
- const s = this.cobrowseCanvas.width, a = this.cobrowseCanvas.height;
568
- i.strokeStyle = e.color, i.lineWidth = Math.max(1, e.width * Math.min(s, a)), i.lineJoin = "round", i.lineCap = "round", i.beginPath(), i.moveTo(e.points[0].x * s, e.points[0].y * a);
569
- for (const r of e.points.slice(1)) i.lineTo(r.x * s, r.y * a);
567
+ const s = this.cobrowseCanvas.width, r = this.cobrowseCanvas.height;
568
+ i.strokeStyle = e.color, i.lineWidth = Math.max(1, e.width * Math.min(s, r)), i.lineJoin = "round", i.lineCap = "round", i.beginPath(), i.moveTo(e.points[0].x * s, e.points[0].y * r);
569
+ for (const a of e.points.slice(1)) i.lineTo(a.x * s, a.y * r);
570
570
  i.stroke();
571
571
  }
572
572
  redrawCobrowse() {
@@ -582,38 +582,38 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
582
582
  const s = (f) => {
583
583
  const b = this.cobrowseCanvas.getBoundingClientRect(), d = b.width > 0 ? (f.clientX - b.left) / b.width : 0, h = b.height > 0 ? (f.clientY - b.top) / b.height : 0;
584
584
  return { x: Math.min(1, Math.max(0, d)), y: Math.min(1, Math.max(0, h)) };
585
- }, a = 6e-3;
585
+ }, r = 6e-3;
586
586
  this.cobrowseCanvas.addEventListener("pointerdown", (f) => {
587
587
  this.cobrowseActive && (e = !0, i = [s(f)], this.cobrowseCanvas.setPointerCapture(f.pointerId));
588
588
  }), this.cobrowseCanvas.addEventListener("pointermove", (f) => {
589
- e && (i.push(s(f)), this.redrawCobrowse(), this.drawStroke({ points: i, color: this.cobrowseColor, width: a }));
589
+ e && (i.push(s(f)), this.redrawCobrowse(), this.drawStroke({ points: i, color: this.cobrowseColor, width: r }));
590
590
  });
591
- const r = (f) => {
591
+ const a = (f) => {
592
592
  var b, d;
593
593
  if (e) {
594
- e = !1, i.length > 1 && ((d = (b = this.h).onAnnotate) == null || d.call(b, { id: `an_${Date.now()}_${Math.random().toString(36).slice(2)}`, points: i, color: this.cobrowseColor, width: a })), i = [];
594
+ e = !1, i.length > 1 && ((d = (b = this.h).onAnnotate) == null || d.call(b, { id: `an_${Date.now()}_${Math.random().toString(36).slice(2)}`, points: i, color: this.cobrowseColor, width: r })), i = [];
595
595
  try {
596
596
  this.cobrowseCanvas.releasePointerCapture(f.pointerId);
597
597
  } catch {
598
598
  }
599
599
  }
600
600
  };
601
- this.cobrowseCanvas.addEventListener("pointerup", r), this.cobrowseCanvas.addEventListener("pointercancel", r);
601
+ this.cobrowseCanvas.addEventListener("pointerup", a), this.cobrowseCanvas.addEventListener("pointercancel", a);
602
602
  }
603
603
  buildSubjectCard(e) {
604
604
  if (this.subjectBuilt) return;
605
- const i = e.subject, s = this.cfg.subject, a = (i == null ? void 0 : i.title) ?? (s == null ? void 0 : s.title);
606
- if (!a) return;
607
- this.subjectBuilt = !0, this.subjectCard.replaceChildren(), this.subjectCard.append(t("div", "ocw-subject-title", a)), s != null && s.subtitle && this.subjectCard.append(t("div", "ocw-subject-sub", s.subtitle));
608
- const r = t("div", "ocw-tags");
609
- if (i) for (const [b, d] of Object.entries(i.fields)) r.append(t("span", "ocw-tag", `${b}: ${d}`));
610
- else for (const b of (s == null ? void 0 : s.tags) ?? []) r.append(t("span", "ocw-tag", b));
611
- r.childNodes.length && this.subjectCard.append(r);
605
+ const i = e.subject, s = this.cfg.subject, r = (i == null ? void 0 : i.title) ?? (s == null ? void 0 : s.title);
606
+ if (!r) return;
607
+ this.subjectBuilt = !0, this.subjectCard.replaceChildren(), this.subjectCard.append(o("div", "ocw-subject-title", r)), s != null && s.subtitle && this.subjectCard.append(o("div", "ocw-subject-sub", s.subtitle));
608
+ const a = o("div", "ocw-tags");
609
+ if (i) for (const [b, d] of Object.entries(i.fields)) a.append(o("span", "ocw-tag", `${b}: ${d}`));
610
+ else for (const b of (s == null ? void 0 : s.tags) ?? []) a.append(o("span", "ocw-tag", b));
611
+ a.childNodes.length && this.subjectCard.append(a);
612
612
  const f = (i == null ? void 0 : i.state) ?? (s == null ? void 0 : s.status);
613
613
  f && (this.statusBadge.textContent = f, this.statusBadge.style.display = "inline-flex");
614
614
  }
615
615
  chipEl(e) {
616
- const i = t("button", "ocw-chip", e.icon ? `${e.icon} ${e.label}` : e.label);
616
+ const i = o("button", "ocw-chip", e.icon ? `${e.icon} ${e.label}` : e.label);
617
617
  return i.dataset.actionId = e.id, i.addEventListener("click", async () => {
618
618
  var s;
619
619
  e.confirm && !await this.confirm(e.label) || ((s = e.input) != null && s.length ? this.openForm(e) : this.h.onInvoke(e.id));
@@ -622,14 +622,14 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
622
622
  /** In-widget confirmation modal (replaces window.confirm). */
623
623
  confirm(e) {
624
624
  return new Promise((i) => {
625
- const s = t("div", "ocw-modal"), a = t("div", "ocw-modal-card");
626
- a.append(t("div", "ocw-modal-title", e)), a.append(t("div", "ocw-modal-body", `Confirm “${e}”?`));
627
- const r = t("div", "ocw-modal-actions"), f = t("button", "ocw-modal-cancel", "Cancel"), b = t("button", "ocw-modal-ok", "Confirm"), d = (h) => {
625
+ const s = o("div", "ocw-modal"), r = o("div", "ocw-modal-card");
626
+ r.append(o("div", "ocw-modal-title", e)), r.append(o("div", "ocw-modal-body", `Confirm “${e}”?`));
627
+ const a = o("div", "ocw-modal-actions"), f = o("button", "ocw-modal-cancel", "Cancel"), b = o("button", "ocw-modal-ok", "Confirm"), d = (h) => {
628
628
  s.remove(), i(h);
629
629
  };
630
630
  f.addEventListener("click", () => d(!1)), b.addEventListener("click", () => d(!0)), s.addEventListener("click", (h) => {
631
631
  h.target === s && d(!1);
632
- }), r.append(f, b), a.append(r), s.append(a), this.root.append(s), b.focus();
632
+ }), a.append(f, b), r.append(a), s.append(r), this.root.append(s), b.focus();
633
633
  });
634
634
  }
635
635
  /** Inline form for a form-effect action: typed inputs (date picker, number,
@@ -637,54 +637,54 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
637
637
  openForm(e) {
638
638
  var b, d;
639
639
  this.formHost.replaceChildren();
640
- const i = t("div", "ocw-form");
641
- i.append(t("div", "ocw-form-title", e.icon ? `${e.icon} ${e.label}` : e.label));
640
+ const i = o("div", "ocw-form");
641
+ i.append(o("div", "ocw-form-title", e.icon ? `${e.icon} ${e.label}` : e.label));
642
642
  const s = /* @__PURE__ */ new Map();
643
643
  for (const h of e.input ?? []) {
644
- const y = t("label", "ocw-form-row");
645
- if (y.append(t("span", "ocw-form-lbl", h.label)), h.type === "select" && ((b = h.options) != null && b.length)) {
646
- const c = t("select", "ocw-form-input");
647
- h.required || c.append(t("option", void 0, "— select —"));
644
+ const v = o("label", "ocw-form-row");
645
+ if (v.append(o("span", "ocw-form-lbl", h.label)), h.type === "select" && ((b = h.options) != null && b.length)) {
646
+ const c = o("select", "ocw-form-input");
647
+ h.required || c.append(o("option", void 0, "— select —"));
648
648
  for (const u of h.options) {
649
- const l = t("option");
649
+ const l = o("option");
650
650
  l.value = u, l.textContent = u, c.append(l);
651
651
  }
652
- h.required && (c.required = !0), y.append(c), s.set(h.name, c);
652
+ h.required && (c.required = !0), v.append(c), s.set(h.name, c);
653
653
  } else {
654
- const c = t("input", "ocw-form-input");
655
- c.type = h.type === "number" ? "number" : h.type === "date" ? "datetime-local" : "text", h.required && (c.required = !0), y.append(c), s.set(h.name, c);
654
+ const c = o("input", "ocw-form-input");
655
+ c.type = h.type === "number" ? "number" : h.type === "date" ? "datetime-local" : "text", h.required && (c.required = !0), v.append(c), s.set(h.name, c);
656
656
  }
657
- i.append(y);
657
+ i.append(v);
658
658
  }
659
- const a = t("div", "ocw-form-actions"), r = t("button", "ocw-form-cancel", "Cancel"), f = t("button", "ocw-form-submit", "Send");
660
- r.addEventListener("click", () => this.formHost.replaceChildren()), f.addEventListener("click", () => {
659
+ const r = o("div", "ocw-form-actions"), a = o("button", "ocw-form-cancel", "Cancel"), f = o("button", "ocw-form-submit", "Send");
660
+ a.addEventListener("click", () => this.formHost.replaceChildren()), f.addEventListener("click", () => {
661
661
  const h = {};
662
- for (const [y, c] of s) {
662
+ for (const [v, c] of s) {
663
663
  if (c.required && !c.value) {
664
664
  c.style.borderColor = "#e5484d";
665
665
  return;
666
666
  }
667
- h[y] = c.type === "number" ? Number(c.value) : c.value;
667
+ h[v] = c.type === "number" ? Number(c.value) : c.value;
668
668
  }
669
669
  this.formHost.replaceChildren(), this.h.onInvoke(e.id, h);
670
- }), a.append(r, f), i.append(a), this.formHost.append(i), (d = s.values().next().value) == null || d.focus();
670
+ }), r.append(a, f), i.append(r), this.formHost.append(i), (d = s.values().next().value) == null || d.focus();
671
671
  }
672
672
  messageEl(e, i) {
673
673
  var c;
674
674
  if (e.senderRole === "system") {
675
- const u = t("div", "ocw-sys");
676
- return u.textContent = e.deletedAt ? "message deleted" : X(e.content), u;
675
+ const u = o("div", "ocw-sys");
676
+ return u.textContent = e.deletedAt ? "message deleted" : ie(e.content), u;
677
677
  }
678
- const s = e.senderId === this.me, a = !!e.internal, r = t("div", `ocw-row ${a ? "ocw-note mine" : s ? "mine" : "theirs"} ${e.senderRole === "bot" ? "ocw-bot" : ""}`);
679
- !s && !a && r.append(t("div", "ocw-dot", e.senderRole === "bot" ? "🤖" : "🧑"));
680
- const f = t("div"), b = t("div", "ocw-bubble-wrap");
678
+ const s = e.senderId === this.me, r = !!e.internal, a = o("div", `ocw-row ${r ? "ocw-note mine" : s ? "mine" : "theirs"} ${e.senderRole === "bot" ? "ocw-bot" : ""}`);
679
+ !s && !r && a.append(o("div", "ocw-dot", e.senderRole === "bot" ? "🤖" : "🧑"));
680
+ const f = o("div"), b = o("div", "ocw-bubble-wrap");
681
681
  if (e.replyToId) {
682
- const u = t("div", "ocw-reply-to", "↩ replying to a message");
682
+ const u = o("div", "ocw-reply-to", "↩ replying to a message");
683
683
  u.style.cssText = "font-size:11px;color:var(--ocw-mut);margin-bottom:2px;font-style:italic", f.append(u);
684
684
  }
685
- const d = t("div", "ocw-bubble");
685
+ const d = o("div", "ocw-bubble");
686
686
  let h = null;
687
- if (e.deletedAt) d.append(t("span", "ocw-deleted", "message deleted"));
687
+ if (e.deletedAt) d.append(o("span", "ocw-deleted", "message deleted"));
688
688
  else if (e.content.kind === "attachment") {
689
689
  const u = e.content;
690
690
  if ((c = u.mime) != null && c.startsWith("image/")) {
@@ -692,29 +692,29 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
692
692
  l.src = u.url, l.alt = u.name ?? "image", l.style.cssText = "max-width:220px;max-height:160px;border-radius:10px;display:block;cursor:pointer", l.addEventListener("click", () => window.open(u.url, "_blank")), d.append(l);
693
693
  } else {
694
694
  const l = document.createElement("a");
695
- l.href = u.url, l.target = "_blank", l.rel = "noopener", l.style.cssText = "display:flex;align-items:center;gap:8px;color:inherit;text-decoration:none", l.append(t("span", void 0, "📄"), t("span", void 0, u.name ?? "file")), d.append(l);
695
+ l.href = u.url, l.target = "_blank", l.rel = "noopener", l.style.cssText = "display:flex;align-items:center;gap:8px;color:inherit;text-decoration:none", l.append(o("span", void 0, "📄"), o("span", void 0, u.name ?? "file")), d.append(l);
696
696
  }
697
697
  } else if (e.content.kind === "appointment") {
698
- const u = e.content, l = t("div", "ocw-appt");
699
- l.append(t("div", "ocw-appt-title", `📅 ${u.title}`)), l.append(t("div", "ocw-appt-time", new Date(u.startIso).toLocaleString() + " – " + new Date(u.endIso).toLocaleTimeString())), u.location && l.append(t("div", "ocw-appt-loc", `📍 ${u.location}`)), u.description && l.append(t("div", "ocw-appt-desc", u.description));
700
- const T = t("div", "ocw-appt-links"), m = document.createElement("a");
701
- m.href = u.googleUrl, m.target = "_blank", m.rel = "noopener", m.className = "ocw-appt-btn", m.textContent = "📅 Add to Google Calendar";
698
+ const u = e.content, l = o("div", "ocw-appt");
699
+ l.append(o("div", "ocw-appt-title", `📅 ${u.title}`)), l.append(o("div", "ocw-appt-time", new Date(u.startIso).toLocaleString() + " – " + new Date(u.endIso).toLocaleTimeString())), u.location && l.append(o("div", "ocw-appt-loc", `📍 ${u.location}`)), u.description && l.append(o("div", "ocw-appt-desc", u.description));
700
+ const E = o("div", "ocw-appt-links"), g = document.createElement("a");
701
+ g.href = u.googleUrl, g.target = "_blank", g.rel = "noopener", g.className = "ocw-appt-btn", g.textContent = "📅 Add to Google Calendar";
702
702
  const w = document.createElement("a");
703
- w.href = u.icalUrl, w.download = `${u.title}.ics`, w.className = "ocw-appt-btn ocw-appt-btn-sec", w.textContent = "🍎 Apple / iCal", T.append(m, w), l.append(T), d.append(l);
703
+ w.href = u.icalUrl, w.download = `${u.title}.ics`, w.className = "ocw-appt-btn ocw-appt-btn-sec", w.textContent = "🍎 Apple / iCal", E.append(g, w), l.append(E), d.append(l);
704
704
  } else
705
- h = document.createTextNode(X(e.content)), d.append(h), e.editedAt && d.append(t("span", "ocw-edited", "(edited)"));
706
- if (b.append(d), !s && !a && this.h.onTranslate && e.content.kind === "text" && !e.deletedAt && e.seq > 0 && h) {
705
+ h = document.createTextNode(ie(e.content)), d.append(h), e.editedAt && d.append(o("span", "ocw-edited", "(edited)"));
706
+ if (b.append(d), !s && !r && this.h.onTranslate && e.content.kind === "text" && !e.deletedAt && e.seq > 0 && h) {
707
707
  const u = e.content.text;
708
708
  if (u.trim()) {
709
- const l = t("button", "ocw-translate-btn", "🌐");
710
- l.type = "button", l.title = "Translate", l.addEventListener("click", (T) => {
711
- if (T.stopPropagation(), this.showingTranslation.has(e.id)) {
709
+ const l = o("button", "ocw-translate-btn", "🌐");
710
+ l.type = "button", l.title = "Translate", l.addEventListener("click", (E) => {
711
+ if (E.stopPropagation(), this.showingTranslation.has(e.id)) {
712
712
  this.showingTranslation.delete(e.id), h.textContent = u, l.textContent = "🌐", l.title = "Translate";
713
713
  return;
714
714
  }
715
- const m = this.translationCache.get(e.id);
716
- if (m !== void 0) {
717
- this.showingTranslation.add(e.id), h.textContent = m, l.textContent = "↩", l.title = "Show original";
715
+ const g = this.translationCache.get(e.id);
716
+ if (g !== void 0) {
717
+ this.showingTranslation.add(e.id), h.textContent = g, l.textContent = "↩", l.title = "Show original";
718
718
  return;
719
719
  }
720
720
  l.textContent = "⏳", this.h.onTranslate(u).then((w) => {
@@ -730,76 +730,76 @@ Message: ${r.value}`), this.offlinePanel.replaceChildren(t("div", "ocw-offline-t
730
730
  }
731
731
  }
732
732
  if (s && !e.deletedAt && e.seq > 0 && (this.h.onEdit ?? this.h.onDelete)) {
733
- const u = t("div", "ocw-msg-menu");
733
+ const u = o("div", "ocw-msg-menu");
734
734
  if (this.h.onEdit) {
735
- const l = t("button", void 0, "✏️");
736
- l.title = "Edit", l.addEventListener("click", (T) => {
737
- T.stopPropagation();
738
- const m = X(e.content), w = document.createElement("textarea");
739
- w.value = m, w.rows = Math.min(4, Math.ceil(m.length / 40) + 1), w.style.cssText = "width:100%;resize:vertical;border:1px solid var(--ocw-accent);border-radius:8px;padding:6px 10px;font:inherit;font-size:14px;background:#fff;color:#1c1b1a;box-sizing:border-box";
740
- const k = t("button", "ocw-form-submit", "Save");
735
+ const l = o("button", void 0, "✏️");
736
+ l.title = "Edit", l.addEventListener("click", (E) => {
737
+ E.stopPropagation();
738
+ const g = ie(e.content), w = document.createElement("textarea");
739
+ w.value = g, w.rows = Math.min(4, Math.ceil(g.length / 40) + 1), w.style.cssText = "width:100%;resize:vertical;border:1px solid var(--ocw-accent);border-radius:8px;padding:6px 10px;font:inherit;font-size:14px;background:#fff;color:#1c1b1a;box-sizing:border-box";
740
+ const k = o("button", "ocw-form-submit", "Save");
741
741
  k.style.cssText = "margin-top:6px;padding:5px 14px;font-size:13px";
742
- const E = t("button", "ocw-form-cancel", "Cancel");
743
- E.style.cssText = "margin-top:6px;padding:5px 10px;font-size:13px";
744
- const I = t("div");
745
- I.style.cssText = "display:flex;gap:6px;justify-content:flex-end", I.append(E, k);
746
- const A = t("div");
747
- A.append(w, I), d.replaceChildren(A), w.focus(), w.select();
748
- const $ = () => d.replaceChildren(h ?? document.createTextNode(m));
749
- E.addEventListener("click", $), k.addEventListener("click", () => {
750
- const z = w.value.trim();
751
- z && z !== m && this.h.onEdit(e.id, z), $();
752
- }), w.addEventListener("keydown", (z) => {
753
- z.key === "Enter" && !z.shiftKey && (z.preventDefault(), k.click()), z.key === "Escape" && $();
742
+ const I = o("button", "ocw-form-cancel", "Cancel");
743
+ I.style.cssText = "margin-top:6px;padding:5px 10px;font-size:13px";
744
+ const j = o("div");
745
+ j.style.cssText = "display:flex;gap:6px;justify-content:flex-end", j.append(I, k);
746
+ const C = o("div");
747
+ C.append(w, j), d.replaceChildren(C), w.focus(), w.select();
748
+ const R = () => d.replaceChildren(h ?? document.createTextNode(g));
749
+ I.addEventListener("click", R), k.addEventListener("click", () => {
750
+ const A = w.value.trim();
751
+ A && A !== g && this.h.onEdit(e.id, A), R();
752
+ }), w.addEventListener("keydown", (A) => {
753
+ A.key === "Enter" && !A.shiftKey && (A.preventDefault(), k.click()), A.key === "Escape" && R();
754
754
  });
755
755
  }), u.append(l);
756
756
  }
757
757
  if (this.h.onDelete) {
758
- const l = t("button", "del", "🗑");
759
- l.title = "Delete", l.addEventListener("click", (T) => {
760
- T.stopPropagation(), this.h.onDelete(e.id);
758
+ const l = o("button", "del", "🗑");
759
+ l.title = "Delete", l.addEventListener("click", (E) => {
760
+ E.stopPropagation(), this.h.onDelete(e.id);
761
761
  }), u.append(l);
762
762
  }
763
763
  b.append(u);
764
764
  }
765
765
  if (f.append(b), this.h.onReact && !e.deletedAt && e.seq > 0) {
766
- const u = t("div", "ocw-react-wrap"), l = t("div", "ocw-react");
766
+ const u = o("div", "ocw-react-wrap"), l = o("div", "ocw-react");
767
767
  if (e.reactions && Object.keys(e.reactions).length)
768
768
  for (const [w, k] of Object.entries(e.reactions)) {
769
- const E = t("button", `ocw-react-pill${k.includes(this.me) ? " mine" : ""}`, `${w} ${k.length}`);
770
- E.addEventListener("click", () => {
771
- var I, A;
772
- return (A = (I = this.h).onReact) == null ? void 0 : A.call(I, e.id, w, k.includes(this.me));
773
- }), l.append(E);
769
+ const I = o("button", `ocw-react-pill${k.includes(this.me) ? " mine" : ""}`, `${w} ${k.length}`);
770
+ I.addEventListener("click", () => {
771
+ var j, C;
772
+ return (C = (j = this.h).onReact) == null ? void 0 : C.call(j, e.id, w, k.includes(this.me));
773
+ }), l.append(I);
774
774
  }
775
- const T = t("button", "ocw-react-btn", "+"), m = t("div", "ocw-react-picker");
776
- for (const w of Ee) {
777
- const k = t("button", void 0, w);
778
- k.addEventListener("click", (E) => {
779
- var A, $, z, q;
780
- E.stopPropagation();
781
- const I = ($ = (A = e.reactions) == null ? void 0 : A[w]) == null ? void 0 : $.includes(this.me);
782
- (q = (z = this.h).onReact) == null || q.call(z, e.id, w, !!I), m.style.display = "none";
783
- }), m.append(k);
775
+ const E = o("button", "ocw-react-btn", "+"), g = o("div", "ocw-react-picker");
776
+ for (const w of Ne) {
777
+ const k = o("button", void 0, w);
778
+ k.addEventListener("click", (I) => {
779
+ var C, R, A, O;
780
+ I.stopPropagation();
781
+ const j = (R = (C = e.reactions) == null ? void 0 : C[w]) == null ? void 0 : R.includes(this.me);
782
+ (O = (A = this.h).onReact) == null || O.call(A, e.id, w, !!j), g.style.display = "none";
783
+ }), g.append(k);
784
784
  }
785
- m.style.display = "none", T.addEventListener("click", (w) => {
785
+ g.style.display = "none", E.addEventListener("click", (w) => {
786
786
  w.stopPropagation();
787
- const k = m.style.display === "none";
788
- m.style.display = k ? "flex" : "none", k && document.addEventListener("click", () => {
789
- m.style.display = "none";
787
+ const k = g.style.display === "none";
788
+ g.style.display = k ? "flex" : "none", k && document.addEventListener("click", () => {
789
+ g.style.display = "none";
790
790
  }, { once: !0 });
791
- }), l.append(T), u.append(l, m), f.append(u);
792
- } else e.reactions && Object.keys(e.reactions).length && f.append(t("div", "ocw-react", Object.entries(e.reactions).map(([u, l]) => `${u}${l.length}`).join(" ")));
793
- const y = t("div", "ocw-time ocw-meta", $e(e.ts));
791
+ }), l.append(E), u.append(l, g), f.append(u);
792
+ } else e.reactions && Object.keys(e.reactions).length && f.append(o("div", "ocw-react", Object.entries(e.reactions).map(([u, l]) => `${u}${l.length}`).join(" ")));
793
+ const v = o("div", "ocw-time ocw-meta", Ve(e.ts));
794
794
  if (s && e.status) {
795
- const u = t("span", `ocw-tick${e.status === "read" ? " read" : e.status === "delivered" ? " delivered" : ""}`, Me(e.status));
796
- y.append(u);
795
+ const u = o("span", `ocw-tick${e.status === "read" ? " read" : e.status === "delivered" ? " delivered" : ""}`, Ke(e.status));
796
+ v.append(u);
797
797
  }
798
- return s && e.seq > 0 && i.lastReadByOthers >= e.seq && y.append(t("span", "ocw-seen", " · Seen")), f.append(y), r.append(f), r;
798
+ return s && e.seq > 0 && i.lastReadByOthers >= e.seq && v.append(o("span", "ocw-seen", " · Seen")), f.append(v), a.append(f), a;
799
799
  }
800
800
  }
801
- function Me(o) {
802
- switch (o) {
801
+ function Ke(t) {
802
+ switch (t) {
803
803
  case "read":
804
804
  return "✓✓";
805
805
  case "delivered":
@@ -810,40 +810,40 @@ function Me(o) {
810
810
  return "🕓";
811
811
  }
812
812
  }
813
- const O = /* @__PURE__ */ new WeakMap(), W = /* @__PURE__ */ new Map();
814
- function ce(o) {
815
- return `relay-launcher::${o.profileId}::${o.subjectId ?? ""}`;
813
+ const H = /* @__PURE__ */ new WeakMap(), X = /* @__PURE__ */ new Map();
814
+ function ge(t) {
815
+ return `relay-launcher::${t.profileId}::${t.subjectId ?? ""}`;
816
816
  }
817
- let N = null;
818
- function Re() {
819
- if (N && N.state !== "closed") return N;
817
+ let F = null;
818
+ function Ge() {
819
+ if (F && F.state !== "closed") return F;
820
820
  try {
821
- return N = new AudioContext(), N;
821
+ return F = new AudioContext(), F;
822
822
  } catch {
823
823
  return null;
824
824
  }
825
825
  }
826
- function Ne(o) {
826
+ function tt(t) {
827
827
  var e;
828
- (e = O.get(o)) == null || e.close(), O.delete(o);
828
+ (e = H.get(t)) == null || e.close(), H.delete(t);
829
829
  }
830
- function _e(o) {
831
- var ee, te, oe, ne, ie;
832
- O.has(o.el) && (O.get(o.el).close(), O.delete(o.el)), o.launcher && ((ee = W.get(ce(o))) == null || ee.close());
833
- const e = ge();
830
+ function ot(t) {
831
+ var le, de, pe, he, ue;
832
+ H.has(t.el) && (H.get(t.el).close(), H.delete(t.el)), t.launcher && ((le = X.get(ge(t))) == null || le.close());
833
+ const e = je();
834
834
  let i, s = !1;
835
- const a = o.token ?? o.userId ?? e, r = a !== e ? e : void 0, { wsUrl: f, httpBase: b } = me(o.url, o.apiUrl);
836
- let d = new ke(a);
837
- const h = o.subjectId ? `${a}::${o.subjectId}` : a, y = new ye(h);
838
- let c, u = !1, l = null, T = null, m = null;
839
- !o.launcher && !o.el.style.height && o.el.clientHeight === 0 && (o.el.style.width = o.el.style.width || "100%", o.el.style.height = "600px");
840
- for (const n of y.load()) d.addOptimistic(n.clientMsgId, n.content);
841
- let w = null, k = null, E = 0, I = !o.launcher;
842
- if (o.launcher) {
843
- const p = (o.position ?? "bottom-right").includes("right");
844
- w = document.createElement("div"), w.style.cssText = `position:fixed;${p ? "right:20px" : "left:20px"};bottom:20px;z-index:9999;display:flex;flex-direction:column;align-items:${p ? "flex-end" : "flex-start"};gap:12px`;
845
- const g = document.createElement("div"), P = typeof window < "u" && typeof window.matchMedia == "function" ? window.matchMedia("(max-width: 479px)") : null, U = (R) => {
846
- o.el.classList.toggle("ocw-fs", R), g.style.cssText = R ? [
835
+ const r = t.token ?? t.userId ?? e, a = r !== e ? e : void 0, { wsUrl: f, httpBase: b } = Ae(t.url, t.apiUrl);
836
+ let d = new Me(r);
837
+ const h = t.subjectId ? `${r}::${t.subjectId}` : r, v = new Be(h);
838
+ let c, u = !1, l = null, E = null, g = null, w = null;
839
+ !t.launcher && !t.el.style.height && t.el.clientHeight === 0 && (t.el.style.width = t.el.style.width || "100%", t.el.style.height = "600px");
840
+ for (const n of v.load()) d.addOptimistic(n.clientMsgId, n.content);
841
+ let k = null, I = null, j = 0, C = !t.launcher;
842
+ if (t.launcher) {
843
+ const p = (t.position ?? "bottom-right").includes("right");
844
+ k = document.createElement("div"), k.style.cssText = `position:fixed;${p ? "right:20px" : "left:20px"};bottom:20px;z-index:9999;display:flex;flex-direction:column;align-items:${p ? "flex-end" : "flex-start"};gap:12px`;
845
+ const x = document.createElement("div"), L = typeof window < "u" && typeof window.matchMedia == "function" ? window.matchMedia("(max-width: 479px)") : null, V = (P) => {
846
+ t.el.classList.toggle("ocw-fs", P), x.style.cssText = P ? [
847
847
  "position:fixed",
848
848
  "inset:0",
849
849
  "width:100%",
@@ -872,126 +872,190 @@ function _e(o) {
872
872
  "transform:scale(.95)"
873
873
  ].join(";");
874
874
  };
875
- U((P == null ? void 0 : P.matches) ?? !1);
876
- const F = (R) => U(R.matches);
877
- P == null || P.addEventListener("change", F), l = P, T = F, o.el.style.cssText = "width:100%;height:100%;overflow:hidden", g.append(o.el);
878
- const K = '<svg viewBox="0 0 24 24" width="26" height="26" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', Y = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', B = document.createElement("button");
879
- B.type = "button", B.style.cssText = [
875
+ V((L == null ? void 0 : L.matches) ?? !1);
876
+ const Y = (P) => V(P.matches);
877
+ L == null || L.addEventListener("change", Y), l = L, E = Y, t.el.style.cssText = "width:100%;height:100%;overflow:hidden", x.append(t.el);
878
+ const Q = '<svg viewBox="0 0 24 24" width="26" height="26" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', Z = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', M = document.createElement("button");
879
+ M.type = "button", M.style.cssText = [
880
880
  "width:56px;height:56px;border-radius:50%",
881
- `background:${o.accent ?? "#4F63F5"}`,
881
+ `background:${t.accent ?? "#4F63F5"}`,
882
882
  "color:#fff;border:none;cursor:pointer",
883
883
  "box-shadow:0 4px 16px rgba(0,0,0,.25)",
884
884
  "position:relative;flex:none",
885
885
  "display:flex;align-items:center;justify-content:center",
886
886
  "transition:transform .15s"
887
- ].join(";"), B.onmouseenter = () => {
888
- B.style.transform = "scale(1.08)";
889
- }, B.onmouseleave = () => {
890
- B.style.transform = "scale(1)";
891
- }, k = document.createElement("span"), k.style.cssText = "position:absolute;top:-4px;right:-4px;background:#ef4444;color:#fff;border-radius:50%;width:20px;height:20px;font-size:11px;font-weight:700;display:none;align-items:center;justify-content:center";
892
- const G = () => {
893
- B.innerHTML = I ? Y : K, B.setAttribute("aria-label", I ? "Close chat" : "Open chat"), B.setAttribute("aria-expanded", String(I)), B.append(k);
887
+ ].join(";"), M.onmouseenter = () => {
888
+ M.style.transform = "scale(1.08)";
889
+ }, M.onmouseleave = () => {
890
+ M.style.transform = "scale(1)";
891
+ }, I = document.createElement("span"), I.style.cssText = "position:absolute;top:-4px;right:-4px;background:#ef4444;color:#fff;border-radius:50%;width:20px;height:20px;font-size:11px;font-weight:700;display:none;align-items:center;justify-content:center";
892
+ const K = () => {
893
+ M.innerHTML = C ? Z : Q, M.setAttribute("aria-label", C ? "Close chat" : "Open chat"), M.setAttribute("aria-expanded", String(C)), M.append(I);
894
+ };
895
+ K(), k.append(x, M), document.body.append(k);
896
+ const ee = `ocw-teaser-dismissed::${t.profileId}`, G = typeof t.launcherMessage == "string" ? { title: t.launcherMessage } : t.launcherMessage;
897
+ let z = null;
898
+ const Se = () => {
899
+ try {
900
+ return sessionStorage.getItem(ee) === "1";
901
+ } catch {
902
+ return !1;
903
+ }
904
+ }, ze = '<svg viewBox="0 0 24 24" width="15" height="15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', fe = () => {
905
+ const P = G != null && G.title ? G : d.launcherMessage ?? void 0;
906
+ if (!(!!(P != null && P.title) && !C && !Se())) {
907
+ z && (z.remove(), z = null);
908
+ return;
909
+ }
910
+ if (z) return;
911
+ z = document.createElement("div"), z.setAttribute("role", "button"), z.setAttribute("tabindex", "0"), z.setAttribute("aria-label", P.title), z.style.cssText = [
912
+ "max-width:280px",
913
+ "background:#fff",
914
+ "border-radius:14px",
915
+ "box-shadow:0 6px 28px rgba(0,0,0,.16)",
916
+ "padding:14px 40px 14px 16px",
917
+ "position:relative",
918
+ "cursor:pointer",
919
+ "font-family:inherit",
920
+ `align-self:${p ? "flex-end" : "flex-start"}`,
921
+ "animation:ocw-teaser-in .22s ease-out"
922
+ ].join(";");
923
+ const oe = document.createElement("div");
924
+ if (oe.textContent = P.title, oe.style.cssText = "font-size:15px;font-weight:600;color:#111;line-height:1.35", z.append(oe), P.subtitle) {
925
+ const D = document.createElement("div");
926
+ D.style.cssText = "display:flex;align-items:center;gap:6px;margin-top:6px;font-size:13px;color:#6b7280";
927
+ const ne = document.createElement("span");
928
+ ne.innerHTML = ze, ne.style.cssText = `color:${t.accent ?? "#4F63F5"};display:inline-flex`;
929
+ const be = document.createElement("span");
930
+ be.textContent = P.subtitle, D.append(ne, be), z.append(D);
931
+ }
932
+ const N = document.createElement("button");
933
+ N.type = "button", N.setAttribute("aria-label", "Dismiss"), N.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', N.style.cssText = "position:absolute;top:8px;right:8px;width:24px;height:24px;border:none;border-radius:50%;background:#f3f4f6;color:#6b7280;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0", N.addEventListener("click", (D) => {
934
+ D.stopPropagation();
935
+ try {
936
+ sessionStorage.setItem(ee, "1");
937
+ } catch {
938
+ }
939
+ z && (z.remove(), z = null);
940
+ }), z.append(N);
941
+ const we = () => {
942
+ C || (C = !0, te(!0), K(), j = 0, I && (I.style.display = "none"), z && (z.remove(), z = null));
943
+ };
944
+ z.addEventListener("click", we), z.addEventListener("keydown", (D) => {
945
+ (D.key === "Enter" || D.key === " ") && (D.preventDefault(), we());
946
+ }), k.insertBefore(z, M);
894
947
  };
895
- G(), w.append(g, B), document.body.append(w);
896
- const se = (R) => {
897
- R ? (g.style.display = "flex", requestAnimationFrame(() => {
898
- g.style.opacity = "1", g.style.transform = "scale(1)";
899
- })) : (g.style.opacity = "0", g.style.transform = "scale(.95)", setTimeout(() => {
900
- I || (g.style.display = "none");
948
+ if (!document.getElementById("ocw-teaser-style")) {
949
+ const P = document.createElement("style");
950
+ P.id = "ocw-teaser-style", P.textContent = "@keyframes ocw-teaser-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}", document.head.append(P);
951
+ }
952
+ w = fe, fe();
953
+ const te = (P) => {
954
+ P ? (x.style.display = "flex", requestAnimationFrame(() => {
955
+ x.style.opacity = "1", x.style.transform = "scale(1)";
956
+ })) : (x.style.opacity = "0", x.style.transform = "scale(.95)", setTimeout(() => {
957
+ C || (x.style.display = "none");
901
958
  }, 180));
902
959
  };
903
- B.addEventListener("click", () => {
904
- I = !I, se(I), G(), I && (E = 0, k && (k.style.display = "none"));
905
- }), m = (R) => {
906
- R.key === "Escape" && I && (I = !1, se(!1), G());
907
- }, document.addEventListener("keydown", m);
960
+ M.addEventListener("click", () => {
961
+ if (C = !C, te(C), K(), C) {
962
+ j = 0, I && (I.style.display = "none");
963
+ try {
964
+ sessionStorage.setItem(ee, "1");
965
+ } catch {
966
+ }
967
+ }
968
+ w == null || w();
969
+ }), g = (P) => {
970
+ P.key === "Escape" && C && (C = !1, te(!1), K());
971
+ }, document.addEventListener("keydown", g);
908
972
  }
909
- const A = () => {
910
- I || (E++, k && (k.textContent = String(E), k.style.display = "flex"));
911
- }, $ = () => {
973
+ const R = () => {
974
+ C || (j++, I && (I.textContent = String(j), I.style.display = "flex"));
975
+ }, A = () => {
912
976
  try {
913
- const n = Re();
977
+ const n = Ge();
914
978
  if (!n) return;
915
979
  n.state === "suspended" && n.resume().catch(() => {
916
980
  });
917
- const p = n.createOscillator(), g = n.createGain();
918
- p.connect(g), g.connect(n.destination), p.frequency.setValueAtTime(880, n.currentTime), p.frequency.exponentialRampToValueAtTime(440, n.currentTime + 0.15), g.gain.setValueAtTime(0.3, n.currentTime), g.gain.exponentialRampToValueAtTime(1e-3, n.currentTime + 0.3), p.start(), p.stop(n.currentTime + 0.3);
981
+ const p = n.createOscillator(), x = n.createGain();
982
+ p.connect(x), x.connect(n.destination), p.frequency.setValueAtTime(880, n.currentTime), p.frequency.exponentialRampToValueAtTime(440, n.currentTime + 0.15), x.gain.setValueAtTime(0.3, n.currentTime), x.gain.exponentialRampToValueAtTime(1e-3, n.currentTime + 0.3), p.start(), p.stop(n.currentTime + 0.3);
919
983
  } catch {
920
984
  }
921
- }, z = [], q = (n) => {
922
- for (; z.length; ) {
923
- const p = z.shift();
924
- y.add({ clientMsgId: p.clientMsgId, content: p.content, ts: Date.now() }), C.send({ type: "send", conversationId: n, clientMsgId: p.clientMsgId, content: p.content });
985
+ }, O = [], U = (n) => {
986
+ for (; O.length; ) {
987
+ const p = O.shift();
988
+ v.add({ clientMsgId: p.clientMsgId, content: p.content, ts: Date.now() }), T.send({ type: "send", conversationId: n, clientMsgId: p.clientMsgId, content: p.content });
925
989
  }
926
990
  };
927
- let C;
928
- const j = new Te(`ocw-e2e-${o.profileId}`);
929
- let D = !1;
930
- const x = [], S = [];
931
- let M = !1;
932
- const V = (n, p) => {
933
- j.sealText(p).then((g) => {
934
- c && C.send({ type: "send", conversationId: c, clientMsgId: n, content: g });
991
+ let T;
992
+ const B = new qe(`ocw-e2e-${t.profileId}`);
993
+ let m = !1;
994
+ const S = [], q = [];
995
+ let se = !1;
996
+ const J = (n, p) => {
997
+ B.sealText(p).then((x) => {
998
+ c && T.send({ type: "send", conversationId: c, clientMsgId: n, content: x });
935
999
  });
936
- }, le = (n, p, g) => {
937
- j.sealText(p, g).then((P) => {
938
- c && C.send({ type: "send", conversationId: c, clientMsgId: n, content: P });
1000
+ }, ye = (n, p, x) => {
1001
+ B.sealText(p, x).then((L) => {
1002
+ c && T.send({ type: "send", conversationId: c, clientMsgId: n, content: L });
939
1003
  });
940
- }, de = () => {
941
- for (; x.length; ) {
942
- const n = x.shift();
943
- V(n.clientMsgId, n.text);
944
- }
1004
+ }, ve = () => {
945
1005
  for (; S.length; ) {
946
1006
  const n = S.shift();
947
- V(n.clientMsgId, n.text);
1007
+ J(n.clientMsgId, n.text);
1008
+ }
1009
+ for (; q.length; ) {
1010
+ const n = q.shift();
1011
+ J(n.clientMsgId, n.text);
948
1012
  }
949
- }, pe = (n) => {
950
- C.send({ type: "fetchPrekey", targetUserId: n });
951
- }, he = o.i18n ?? {}, ue = ["ar", "he", "fa", "ur"], fe = typeof navigator < "u" ? (navigator.language ?? "").slice(0, 2).toLowerCase() : "";
952
- ue.includes(fe) && !o.el.dir && (o.el.dir = "rtl", o.el.style.fontFamily = o.el.style.fontFamily || "Tahoma,Arial,system-ui,sans-serif");
953
- const J = new ze(), Q = `oc_prechat_${o.profileId}_${a.slice(-8)}`, L = new Be(o.el, a, {
1013
+ }, ke = (n) => {
1014
+ T.send({ type: "fetchPrekey", targetUserId: n });
1015
+ }, Ce = t.i18n ?? {}, Te = ["ar", "he", "fa", "ur"], Ee = typeof navigator < "u" ? (navigator.language ?? "").slice(0, 2).toLowerCase() : "";
1016
+ Te.includes(Ee) && !t.el.dir && (t.el.dir = "rtl", t.el.style.fontFamily = t.el.style.fontFamily || "Tahoma,Arial,system-ui,sans-serif");
1017
+ const re = new He(), ae = `oc_prechat_${t.profileId}_${r.slice(-8)}`, $ = new Ye(t.el, r, {
954
1018
  onSend(n) {
955
- const p = `cm_${Math.random().toString(36).slice(2)}`, g = { kind: "text", text: n };
956
- d.addOptimistic(p, g), L.render(d), d.e2e ? j.ready ? V(p, n) : M ? S.push({ clientMsgId: p, text: n }) : (x.push({ clientMsgId: p, text: n }), d.assignedAgentId && pe(d.assignedAgentId)) : c ? (y.add({ clientMsgId: p, content: g, ts: Date.now() }), C.send({ type: "send", conversationId: c, clientMsgId: p, content: g })) : z.push({ clientMsgId: p, content: g });
1019
+ const p = `cm_${Math.random().toString(36).slice(2)}`, x = { kind: "text", text: n };
1020
+ d.addOptimistic(p, x), $.render(d), d.e2e ? B.ready ? J(p, n) : se ? q.push({ clientMsgId: p, text: n }) : (S.push({ clientMsgId: p, text: n }), d.assignedAgentId && ke(d.assignedAgentId)) : c ? (v.add({ clientMsgId: p, content: x, ts: Date.now() }), T.send({ type: "send", conversationId: c, clientMsgId: p, content: x })) : O.push({ clientMsgId: p, content: x });
957
1021
  },
958
1022
  async onAttach(n) {
959
1023
  if (!c) return;
960
- const p = `${b}/upload?name=${encodeURIComponent(n.name)}`, g = `cm_${Math.random().toString(36).slice(2)}`;
961
- d.addOptimistic(g, { kind: "text", text: `📎 Uploading ${n.name}…` }), L.render(d);
1024
+ const p = `${b}/upload?name=${encodeURIComponent(n.name)}`, x = `cm_${Math.random().toString(36).slice(2)}`;
1025
+ d.addOptimistic(x, { kind: "text", text: `📎 Uploading ${n.name}…` }), $.render(d);
962
1026
  try {
963
- const P = await fetch(p, {
1027
+ const L = await fetch(p, {
964
1028
  method: "POST",
965
1029
  // Use the resolved connection token (a signed JWT, an explicit userId,
966
1030
  // or the anonymous persistent uid) — NOT just opts.token. The server
967
1031
  // requires an Authorization header, and the verifier accepts an
968
1032
  // anonymous id as a guest; keying off opts.token alone meant anonymous
969
1033
  // visitors (the common case) sent no auth and every upload 401'd.
970
- headers: { "content-type": n.type, authorization: `Bearer ${a}` },
1034
+ headers: { "content-type": n.type, authorization: `Bearer ${r}` },
971
1035
  body: n
972
1036
  });
973
- if (!P.ok) throw new Error(`Upload failed: ${P.status}`);
974
- const { url: U, name: F, mime: K, size: Y } = await P.json();
975
- C.send({ type: "send", conversationId: c, clientMsgId: g, content: { kind: "attachment", url: U, name: F, mime: K, size: Y } });
976
- } catch (P) {
977
- d.addOptimistic(g, { kind: "text", text: `⚠️ Upload failed: ${P.message}` }), L.render(d);
1037
+ if (!L.ok) throw new Error(`Upload failed: ${L.status}`);
1038
+ const { url: V, name: Y, mime: Q, size: Z } = await L.json();
1039
+ T.send({ type: "send", conversationId: c, clientMsgId: x, content: { kind: "attachment", url: V, name: Y, mime: Q, size: Z } });
1040
+ } catch (L) {
1041
+ d.addOptimistic(x, { kind: "text", text: `⚠️ Upload failed: ${L.message}` }), $.render(d);
978
1042
  }
979
1043
  },
980
1044
  onInvoke(n, p) {
981
- c && C.send({ type: "invoke", conversationId: c, actionId: n, clientInvokeId: `iv_${Math.random().toString(36).slice(2)}`, ...p ? { inputs: p } : {} });
1045
+ c && T.send({ type: "invoke", conversationId: c, actionId: n, clientInvokeId: `iv_${Math.random().toString(36).slice(2)}`, ...p ? { inputs: p } : {} });
982
1046
  },
983
1047
  onTyping(n, p) {
984
- c && C.send({ type: "typing", conversationId: c, isTyping: n, ...p ? { preview: p } : {} });
1048
+ c && T.send({ type: "typing", conversationId: c, isTyping: n, ...p ? { preview: p } : {} });
985
1049
  },
986
1050
  onPreChat(n) {
987
1051
  try {
988
- localStorage.setItem(Q, "1");
1052
+ localStorage.setItem(ae, "1");
989
1053
  } catch {
990
1054
  }
991
- C.send({
1055
+ T.send({
992
1056
  type: "open",
993
- profileId: o.profileId,
994
- ...o.subjectId ? { subjectId: o.subjectId } : {},
1057
+ profileId: t.profileId,
1058
+ ...t.subjectId ? { subjectId: t.subjectId } : {},
995
1059
  userInfo: {
996
1060
  ...n.name ? { name: n.name } : {},
997
1061
  ...n.email ? { email: n.email } : {},
@@ -1002,168 +1066,168 @@ function _e(o) {
1002
1066
  }
1003
1067
  });
1004
1068
  const p = n.callback ? `📞 Call-back requested${n.phone ? `: ${n.phone}` : ""}${n.topic ? ` — ${n.topic}` : ""}` : n.topic ? `Topic: ${n.topic}` : "";
1005
- p && c && !d.e2e && C.send({ type: "send", conversationId: c, clientMsgId: `pc_${Math.random().toString(36).slice(2, 12)}`, content: { kind: "text", text: p } });
1069
+ p && c && !d.e2e && T.send({ type: "send", conversationId: c, clientMsgId: `pc_${Math.random().toString(36).slice(2, 12)}`, content: { kind: "text", text: p } });
1006
1070
  },
1007
1071
  onDeflectQuery(n) {
1008
1072
  if (s) return;
1009
1073
  clearTimeout(i);
1010
1074
  const p = n.trim();
1011
1075
  if (p.length < 3) {
1012
- L.hideDeflection();
1076
+ $.hideDeflection();
1013
1077
  return;
1014
1078
  }
1015
1079
  i = setTimeout(() => {
1016
- fetch(`${b}/kb/search?profileId=${encodeURIComponent(o.profileId)}&q=${encodeURIComponent(p.slice(0, 200))}`).then((g) => g.ok ? g.json() : { articles: [] }).then((g) => L.showDeflection(g.articles ?? [])).catch(() => L.hideDeflection());
1080
+ fetch(`${b}/kb/search?profileId=${encodeURIComponent(t.profileId)}&q=${encodeURIComponent(p.slice(0, 200))}`).then((x) => x.ok ? x.json() : { articles: [] }).then((x) => $.showDeflection(x.articles ?? [])).catch(() => $.hideDeflection());
1017
1081
  }, 350);
1018
1082
  },
1019
1083
  onReadUpTo(n) {
1020
- c && C.send({ type: "read", conversationId: c, seq: n });
1084
+ c && T.send({ type: "read", conversationId: c, seq: n });
1021
1085
  },
1022
1086
  onLoadMore() {
1023
1087
  if (!c || !d.e2e) return;
1024
1088
  const n = d.messages()[0];
1025
- n && C.send({ type: "history", conversationId: c, beforeSeq: n.seq, limit: 20 });
1089
+ n && T.send({ type: "history", conversationId: c, beforeSeq: n.seq, limit: 20 });
1026
1090
  },
1027
1091
  onEdit(n, p) {
1028
- c && C.send({ type: "edit", conversationId: c, messageId: n, content: { kind: "text", text: p } });
1092
+ c && T.send({ type: "edit", conversationId: c, messageId: n, content: { kind: "text", text: p } });
1029
1093
  },
1030
1094
  onDelete(n) {
1031
- c && C.send({ type: "delete", conversationId: c, messageId: n });
1095
+ c && T.send({ type: "delete", conversationId: c, messageId: n });
1032
1096
  },
1033
- onReact(n, p, g) {
1034
- c && C.send({ type: "react", conversationId: c, messageId: n, emoji: p, remove: g });
1097
+ onReact(n, p, x) {
1098
+ c && T.send({ type: "react", conversationId: c, messageId: n, emoji: p, remove: x });
1035
1099
  },
1036
1100
  onCsat(n) {
1037
1101
  c && fetch(`${b}/conversations/${c}/csat`, {
1038
1102
  method: "POST",
1039
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${a}` },
1103
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${r}` },
1040
1104
  body: JSON.stringify({ score: n })
1041
1105
  }).catch(() => {
1042
1106
  });
1043
1107
  },
1044
1108
  onAnnotate(n) {
1045
- c && C.send({ type: "annotate", conversationId: c, stroke: n });
1109
+ c && T.send({ type: "annotate", conversationId: c, stroke: n });
1046
1110
  },
1047
1111
  onAnnotateClear() {
1048
- c && C.send({ type: "annotate_clear", conversationId: c });
1112
+ c && T.send({ type: "annotate_clear", conversationId: c });
1049
1113
  },
1050
- ...o.translateLang ? {
1114
+ ...t.translateLang ? {
1051
1115
  async onTranslate(n) {
1052
1116
  try {
1053
1117
  const p = await fetch(`${b}/translate`, {
1054
1118
  method: "POST",
1055
- headers: { "content-type": "application/json", authorization: `Bearer ${a}` },
1056
- body: JSON.stringify({ text: n, targetLang: o.translateLang })
1119
+ headers: { "content-type": "application/json", authorization: `Bearer ${r}` },
1120
+ body: JSON.stringify({ text: n, targetLang: t.translateLang })
1057
1121
  });
1058
1122
  if (!p.ok) return null;
1059
- const { translated: g } = await p.json();
1060
- return g;
1123
+ const { translated: x } = await p.json();
1124
+ return x;
1061
1125
  } catch {
1062
1126
  return null;
1063
1127
  }
1064
1128
  }
1065
1129
  } : {},
1066
- ...o.onBack ? { onBack: o.onBack } : {}
1130
+ ...t.onBack ? { onBack: t.onBack } : {}
1067
1131
  }, {
1068
- ...o.subject ? { subject: o.subject } : {},
1069
- ...o.quickReplies ? { quickReplies: o.quickReplies } : {},
1070
- ...o.accent ? { accent: o.accent } : {},
1071
- ...(te = o.user) != null && te.name || (oe = o.user) != null && oe.avatar ? { userInfo: { ...o.user.name ? { name: o.user.name } : {}, ...o.user.avatar ? { avatar: o.user.avatar } : {} } } : {},
1072
- i18n: he
1132
+ ...t.subject ? { subject: t.subject } : {},
1133
+ ...t.quickReplies ? { quickReplies: t.quickReplies } : {},
1134
+ ...t.accent ? { accent: t.accent } : {},
1135
+ ...(de = t.user) != null && de.name || (pe = t.user) != null && pe.avatar ? { userInfo: { ...t.user.name ? { name: t.user.name } : {}, ...t.user.avatar ? { avatar: t.user.avatar } : {} } } : {},
1136
+ i18n: Ce
1073
1137
  });
1074
1138
  try {
1075
- localStorage.getItem(Q) && L.completePreChat();
1139
+ localStorage.getItem(ae) && $.completePreChat();
1076
1140
  } catch {
1077
1141
  }
1078
- const Z = o.user && (o.user.name || o.user.email || o.user.avatar || o.user.meta) ? {
1079
- ...o.user.name ? { name: o.user.name } : {},
1080
- ...o.user.email ? { email: o.user.email } : {},
1081
- ...o.user.avatar ? { avatar: o.user.avatar } : {},
1082
- ...o.user.meta ? { meta: o.user.meta } : {}
1083
- } : void 0, we = {
1142
+ const ce = t.user && (t.user.name || t.user.email || t.user.avatar || t.user.meta) ? {
1143
+ ...t.user.name ? { name: t.user.name } : {},
1144
+ ...t.user.email ? { email: t.user.email } : {},
1145
+ ...t.user.avatar ? { avatar: t.user.avatar } : {},
1146
+ ...t.user.meta ? { meta: t.user.meta } : {}
1147
+ } : void 0, Ie = {
1084
1148
  type: "open",
1085
- profileId: o.profileId,
1149
+ profileId: t.profileId,
1086
1150
  // Direct conversations use the kind/peerId pair; the dm:… subject key is
1087
1151
  // server-derived and owner-keyed, so passing it as subjectId from the
1088
1152
  // NON-owner side would find-or-create a junk duplicate thread.
1089
- ...o.kind === "direct" && o.peerId ? { kind: "direct", peerId: o.peerId } : o.subjectId ? { subjectId: o.subjectId } : {},
1090
- ...r ? { linkFrom: r } : {},
1091
- ...Z ? { userInfo: Z } : {},
1153
+ ...t.kind === "direct" && t.peerId ? { kind: "direct", peerId: t.peerId } : t.subjectId ? { subjectId: t.subjectId } : {},
1154
+ ...a ? { linkFrom: a } : {},
1155
+ ...ce ? { userInfo: ce } : {},
1092
1156
  ...typeof location < "u" ? { pageUrl: location.href } : {},
1093
1157
  ...typeof document < "u" && document.title ? { pageTitle: document.title } : {},
1094
1158
  // Pass subject display info so the server can persist it to the Subject record.
1095
1159
  // This is how listingTitle and listingMeta get saved without a separate API call.
1096
- ...(ne = o.subject) != null && ne.title ? { subjectTitle: o.subject.title } : {},
1097
- ...(ie = o.subject) != null && ie.subtitle ? { subjectMeta: o.subject.subtitle } : {}
1160
+ ...(he = t.subject) != null && he.title ? { subjectTitle: t.subject.title } : {},
1161
+ ...(ue = t.subject) != null && ue.subtitle ? { subjectMeta: t.subject.subtitle } : {}
1098
1162
  };
1099
- C = new Ce({
1100
- ...o.refreshToken ? { refreshToken: o.refreshToken } : {},
1163
+ T = new Re({
1164
+ ...t.refreshToken ? { refreshToken: t.refreshToken } : {},
1101
1165
  url: f,
1102
- token: a,
1103
- open: we,
1166
+ token: r,
1167
+ open: Ie,
1104
1168
  getCursor: () => d.highestSeq(),
1105
- onStatusChange: (n, p) => L.setConnStatus(n, p),
1169
+ onStatusChange: (n, p) => $.setConnStatus(n, p),
1106
1170
  onFrame(n) {
1107
- if (J.apply(n), n.type === "opened") {
1171
+ if (re.apply(n), n.type === "opened") {
1108
1172
  if (c = n.conversation.id, !u) {
1109
1173
  u = !0;
1110
- for (const p of y.load())
1111
- C.send({ type: "send", conversationId: c, clientMsgId: p.clientMsgId, content: p.content });
1174
+ for (const p of v.load())
1175
+ T.send({ type: "send", conversationId: c, clientMsgId: p.clientMsgId, content: p.content });
1112
1176
  }
1113
- ve(f, a, c, d, L, b), z.length && q(c);
1177
+ $e(f, r, c, d, $, b), O.length && U(c);
1114
1178
  }
1115
- if (n.type === "ack" && y.remove(n.clientMsgId), n.type === "prekeyBundle") {
1116
- n.bundle && (M = !0, j.x3dhSendTo(n.bundle).then((p) => {
1117
- const g = [...x.splice(0), ...S.splice(0)];
1118
- for (const P of g) le(P.clientMsgId, P.text, p);
1119
- L.render(d);
1179
+ if (n.type === "ack" && v.remove(n.clientMsgId), n.type === "prekeyBundle") {
1180
+ n.bundle && (se = !0, B.x3dhSendTo(n.bundle).then((p) => {
1181
+ const x = [...S.splice(0), ...q.splice(0)];
1182
+ for (const L of x) ye(L.clientMsgId, L.text, p);
1183
+ $.render(d);
1120
1184
  }));
1121
1185
  return;
1122
1186
  }
1123
1187
  if (n.type === "message" && d.e2e) {
1124
- const p = Ie(n.message.content);
1125
- if (p && !j.ready) {
1126
- j.x3dhReceiveFrom(p.x3dhIK, p.x3dhEK, p.x3dhSPK).then(async () => {
1127
- await j.openFrame(n), d.apply(n), L.render(d);
1188
+ const p = Oe(n.message.content);
1189
+ if (p && !B.ready) {
1190
+ B.x3dhReceiveFrom(p.x3dhIK, p.x3dhEK, p.x3dhSPK).then(async () => {
1191
+ await B.openFrame(n), d.apply(n), $.render(d);
1128
1192
  });
1129
1193
  return;
1130
1194
  }
1131
1195
  }
1132
1196
  if (n.type === "peerkey") {
1133
- j.onPeerKey(n.key).then(() => {
1134
- de(), L.render(d);
1197
+ B.onPeerKey(n.key).then(() => {
1198
+ ve(), $.render(d);
1135
1199
  });
1136
1200
  return;
1137
1201
  }
1138
1202
  (async () => {
1139
- if (d.e2e && await j.openFrame(n), d.apply(n), n.type === "message" && n.message.senderId !== a && !n.message.internal && (A(), $()), d.e2e && c && !D) {
1140
- D = !0;
1141
- const p = await j.initX3DH();
1142
- C.send({ type: "uploadPrekeys", ...p });
1143
- const g = await j.begin();
1144
- C.send({ type: "pubkey", conversationId: c, key: g });
1203
+ if (d.e2e && await B.openFrame(n), d.apply(n), n.type === "manifest" && (w == null || w()), n.type === "message" && n.message.senderId !== r && !n.message.internal && (R(), A()), d.e2e && c && !m) {
1204
+ m = !0;
1205
+ const p = await B.initX3DH();
1206
+ T.send({ type: "uploadPrekeys", ...p });
1207
+ const x = await B.begin();
1208
+ T.send({ type: "pubkey", conversationId: c, key: x });
1145
1209
  }
1146
- L.render(d);
1210
+ $.render(d);
1147
1211
  })();
1148
1212
  }
1149
- }), C.connect(), L.render(d);
1150
- const H = o.launcher ? ce(o) : null, _ = { close: () => {
1151
- s = !0, clearTimeout(i), C.close(), w == null || w.remove(), L.destroy(), J.destroy(), l && T && l.removeEventListener("change", T), m && (document.removeEventListener("keydown", m), m = null), O.delete(o.el), H && W.get(H) === _ && W.delete(H);
1213
+ }), T.connect(), $.render(d);
1214
+ const _ = t.launcher ? ge(t) : null, W = { close: () => {
1215
+ s = !0, clearTimeout(i), T.close(), k == null || k.remove(), $.destroy(), re.destroy(), l && E && l.removeEventListener("change", E), g && (document.removeEventListener("keydown", g), g = null), H.delete(t.el), _ && X.get(_) === W && X.delete(_);
1152
1216
  } };
1153
- return O.set(o.el, _), H && W.set(H, _), _;
1217
+ return H.set(t.el, W), _ && X.set(_, W), W;
1154
1218
  }
1155
1219
  export {
1156
- ke as ChatStore,
1157
- Ce as ConnectionManager,
1158
- Te as E2ESession,
1159
- ye as PersistentOutbox,
1160
- Be as Renderer,
1161
- Ke as asConversationId,
1162
- Ie as extractX3DHInit,
1163
- We as httpBaseFromWsUrl,
1164
- _e as mount,
1165
- me as resolveRelayUrls,
1166
- ve as restoreHistory,
1167
- Ne as unmount
1220
+ Me as ChatStore,
1221
+ Re as ConnectionManager,
1222
+ qe as E2ESession,
1223
+ Be as PersistentOutbox,
1224
+ Ye as Renderer,
1225
+ at as asConversationId,
1226
+ Oe as extractX3DHInit,
1227
+ st as httpBaseFromWsUrl,
1228
+ ot as mount,
1229
+ Ae as resolveRelayUrls,
1230
+ $e as restoreHistory,
1231
+ tt as unmount
1168
1232
  };
1169
1233
  //# sourceMappingURL=index.js.map