@locdo.tech/botiq-chat-sdk 0.3.4 → 0.4.0

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/sdk/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./npm-BHJnX0sn.js";
1
+ import { t as e } from "./npm-DV43YS-n.js";
2
2
  export { e as init };
@@ -160,30 +160,68 @@ async function S(e, t, n, r, i, a) {
160
160
  return a.errorMessage;
161
161
  }
162
162
  }
163
+ var C = {
164
+ messages: [],
165
+ hasMore: !1
166
+ };
167
+ function w(e) {
168
+ if (!e || typeof e != "object") return !1;
169
+ let t = e;
170
+ return typeof t.id == "string" && (t.role === "user" || t.role === "assistant") && typeof t.content == "string";
171
+ }
172
+ async function T(e, t, n, r, i) {
173
+ try {
174
+ let a = new URLSearchParams({
175
+ sessionId: n,
176
+ limit: String(i)
177
+ });
178
+ r && a.set("before", r);
179
+ let o = await fetch(`${e}/widget/messages?${a.toString()}`, {
180
+ method: "GET",
181
+ headers: { "X-Api-Key": t },
182
+ referrerPolicy: "no-referrer-when-downgrade"
183
+ });
184
+ if (!o.ok) return C;
185
+ let s = await o.json();
186
+ return {
187
+ messages: Array.isArray(s.messages) ? s.messages.filter(w) : [],
188
+ hasMore: s.hasMore === !0
189
+ };
190
+ } catch {
191
+ return C;
192
+ }
193
+ }
194
+ function ee(e, t, n, r) {
195
+ return T(e, t, n, void 0, r);
196
+ }
197
+ function te(e, t, n, r, i) {
198
+ return T(e, t, n, r, i);
199
+ }
163
200
  //#endregion
164
201
  //#region src/core/state.ts
165
- var C = {
202
+ var E = {
166
203
  messages: [],
167
204
  isLoading: !1,
168
- isOpen: !1
169
- }, w = /* @__PURE__ */ new Set();
170
- function T() {
171
- return C;
172
- }
173
- function E(e) {
174
- Object.assign(C, e);
205
+ isOpen: !1,
206
+ loadingOlder: !1
207
+ }, D = /* @__PURE__ */ new Set();
208
+ function O() {
209
+ return E;
210
+ }
211
+ function k(e) {
212
+ Object.assign(E, e);
175
213
  let t = {
176
- ...C,
177
- messages: [...C.messages]
214
+ ...E,
215
+ messages: [...E.messages]
178
216
  };
179
- w.forEach((e) => e(t));
217
+ D.forEach((e) => e(t));
180
218
  }
181
- function D(e) {
182
- return w.add(e), () => w.delete(e);
219
+ function A(e) {
220
+ return D.add(e), () => D.delete(e);
183
221
  }
184
222
  //#endregion
185
223
  //#region src/core/styles.ts
186
- var O = {
224
+ var j = {
187
225
  inter: {
188
226
  url: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap",
189
227
  family: "'Inter', system-ui, -apple-system, sans-serif"
@@ -192,45 +230,33 @@ var O = {
192
230
  url: "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600&display=swap",
193
231
  family: "'Plus Jakarta Sans', system-ui, -apple-system, sans-serif"
194
232
  },
195
- poppins: {
196
- url: "https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap",
197
- family: "'Poppins', system-ui, -apple-system, sans-serif"
198
- },
199
233
  nunito: {
200
234
  url: "https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600&display=swap",
201
235
  family: "'Nunito', system-ui, -apple-system, sans-serif"
202
236
  },
203
- "dm-sans": {
204
- url: "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&display=swap",
205
- family: "'DM Sans', system-ui, -apple-system, sans-serif"
206
- },
207
237
  raleway: {
208
238
  url: "https://fonts.googleapis.com/css2?family=Raleway:wght@400;500;600&display=swap",
209
239
  family: "'Raleway', system-ui, -apple-system, sans-serif"
210
240
  },
211
- lato: {
212
- url: "https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap",
213
- family: "'Lato', system-ui, -apple-system, sans-serif"
214
- },
215
241
  playfair: {
216
242
  url: "https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600&display=swap",
217
243
  family: "'Playfair Display', Georgia, serif"
218
244
  }
219
245
  };
220
- function k(e, t) {
246
+ function M(e, t) {
221
247
  if (!t) return e;
222
248
  let n = t.angle ?? 135;
223
249
  return t.type === "linear" ? `linear-gradient(${n}deg, ${t.from}, ${t.to})` : `radial-gradient(circle, ${t.from}, ${t.to})`;
224
250
  }
225
- function A(e) {
251
+ function ne(e) {
226
252
  return e.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\\[0-9a-fA-F]{1,6}\s?/g, "x").replace(/@import\b[^;]*;?/gi, "").replace(/url\s*\(\s*["']?\s*(?!data:)[^)]*["']?\s*\)/gi, "url(\"\")").replace(/expression\s*\(/gi, "expression_(").replace(/javascript\s*:/gi, "blocked:").replace(/-moz-binding\s*:/gi, "").replace(/\bbehavior\s*:/gi, "");
227
253
  }
228
- function j(e) {
254
+ function N(e) {
229
255
  let t = e?.bubbleOpen ?? "none", n = e?.typingIndicator ?? "dots-bounce";
230
256
  return [t === "fade" ? "@keyframes biq-open-fade { from { opacity: 0; } to { opacity: 1; } }\n.chat-window.open { animation: biq-open-fade .22s ease forwards; }" : t === "slide-up" ? "@keyframes biq-open-slide { from { opacity: 0; transform: scale(1) translateY(20px); } to { opacity: 1; transform: scale(1) translateY(0); } }\n.chat-window.open { animation: biq-open-slide .25s cubic-bezier(.22,1,.36,1) forwards; }" : t === "bounce" ? "@keyframes biq-open-bounce { 0% { opacity: 0; transform: scale(.85) translateY(8px); } 60% { transform: scale(1.03) translateY(-3px); } 100% { opacity: 1; transform: scale(1) translateY(0); } }\n.chat-window.open { animation: biq-open-bounce .35s cubic-bezier(.34,1.56,.64,1) forwards; }" : "", n === "dots-pulse" ? "@keyframes biq-pulse { 0%, 100% { opacity: 0.3; transform: scale(1); } 50% { opacity: 1; transform: scale(1.3); } }\n.typing span { animation: biq-pulse 1.2s infinite ease-in-out; }" : n === "bar" ? ".typing { gap: 3px; align-items: flex-end; }\n.typing span { width: 3px; height: 14px; border-radius: 2px; animation: biq-bar 1s infinite ease-in-out; }\n.typing span:nth-child(1) { animation-delay: 0s; }\n.typing span:nth-child(2) { animation-delay: .15s; height: 20px; }\n.typing span:nth-child(3) { animation-delay: .3s; }\n@keyframes biq-bar { 0%, 100% { transform: scaleY(.4); opacity: .5; } 50% { transform: scaleY(1); opacity: 1; } }" : ""].filter(Boolean).join("\n");
231
257
  }
232
- function M(e) {
233
- let { colors: t, layout: n, font: r, gradient: i, animation: a, customCSS: o, whiteLabel: s } = e, c = O[r] ?? O.inter, l = n.buttonShape === "square" ? "14px" : "50%", u = n.position === "bottom-left" ? "right: auto; left: 24px;" : "right: 24px;", d = n.position === "bottom-left" ? "bottom left" : "bottom right", f = n.position === "bottom-left" ? "right: auto; left: 0;" : "right: 0;", p = k(t.primary, i), m = k(t.header, i), h = k(t.userBubble, i), g = s ? ".botiq-badge { display: none !important; }" : "";
258
+ function P(e) {
259
+ let { colors: t, layout: n, font: r, gradient: i, animation: a, customCSS: o, whiteLabel: s } = e, c = j[r] ?? j.inter, l = n.buttonShape === "square" ? "14px" : "50%", u = n.position === "bottom-left" ? "right: auto; left: 24px;" : "right: 24px;", d = n.position === "bottom-left" ? "bottom left" : "bottom right", f = n.position === "bottom-left" ? "right: auto; left: 0;" : "right: 0;", p = M(t.primary, i), m = M(t.header, i), h = M(t.userBubble, i), g = s ? ".botiq-badge { display: none !important; }" : "";
234
260
  return `
235
261
  @import url('${c.url}');
236
262
 
@@ -407,6 +433,37 @@ function M(e) {
407
433
  background: rgba(255,255,255,.1);
408
434
  white-space: pre-wrap;
409
435
  }
436
+ .message-bubble del { text-decoration: line-through; opacity: .7; }
437
+
438
+ /* ── Markdown headings ───────────────────────────────── */
439
+ /* Kept modest — the chat bubble is small, so headings are only slightly
440
+ larger than body text, never document-sized. */
441
+ .message-bubble h1,
442
+ .message-bubble h2,
443
+ .message-bubble h3,
444
+ .message-bubble h4,
445
+ .message-bubble h5,
446
+ .message-bubble h6 {
447
+ margin: 8px 0 4px;
448
+ font-weight: 600;
449
+ line-height: 1.3;
450
+ color: #fff;
451
+ }
452
+ .message-bubble h1 { font-size: 16px; }
453
+ .message-bubble h2 { font-size: 15px; }
454
+ .message-bubble h3 { font-size: 14px; }
455
+ .message-bubble h4,
456
+ .message-bubble h5,
457
+ .message-bubble h6 { font-size: 13px; }
458
+ .message-bubble :first-child { margin-top: 0; }
459
+
460
+ /* ── Markdown horizontal rule ────────────────────────── */
461
+ .message-bubble hr {
462
+ border: 0;
463
+ height: 1px;
464
+ background: rgba(255,255,255,.15);
465
+ margin: 8px 0;
466
+ }
410
467
 
411
468
  /* ── Markdown tables ─────────────────────────────────── */
412
469
  .message-bubble table {
@@ -586,144 +643,192 @@ function M(e) {
586
643
  .send-btn svg { width: 18px; height: 18px; fill: #fff; }
587
644
 
588
645
  ${g}
589
- ${j(a)}
590
- ${o ? A(o) : ""}
646
+ ${N(a)}
647
+ ${o ? ne(o) : ""}
591
648
  `;
592
649
  }
593
650
  //#endregion
594
651
  //#region src/core/assets.ts
595
- var N = "data:image/png;base64,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", P = "https://bot-q-frontend.vercel.app/", F = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 2H4a2 2 0 00-2 2v18l4-4h14a2 2 0 002-2V4a2 2 0 00-2-2z\"/>\n</svg>", I = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n</svg>", L = `<img src="${N}" alt="" style="width:100%;height:100%;object-fit:cover;border-radius:50%" />`, R = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/>\n</svg>", z = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 2H4a2 2 0 00-2 2v18l4-4h14a2 2 0 002-2V4a2 2 0 00-2-2zm-2 10H6v-2h12v2zm0-3H6V7h12v2z\"/>\n</svg>";
596
- function B(e) {
597
- if (!e || e.type === "icon") return L;
598
- if (e.type === "emoji") return `<span style="font-size:22px;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%">${V(e.value)}</span>`;
652
+ var F = "data:image/png;base64,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";
653
+ //#endregion
654
+ //#region src/core/history-pager.ts
655
+ function I() {
656
+ return {
657
+ oldestCursor: null,
658
+ hasMore: !1,
659
+ cursorReady: !1
660
+ };
661
+ }
662
+ function L(e) {
663
+ return {
664
+ oldestCursor: e.messages[0]?.id ?? null,
665
+ hasMore: e.hasMore,
666
+ cursorReady: e.messages.length > 0
667
+ };
668
+ }
669
+ function R(e, t) {
670
+ return {
671
+ oldestCursor: t.messages[0]?.id ?? e.oldestCursor,
672
+ hasMore: t.hasMore,
673
+ cursorReady: e.cursorReady
674
+ };
675
+ }
676
+ function z(e, t) {
677
+ return e.cursorReady && e.hasMore && !t && e.oldestCursor !== null;
678
+ }
679
+ function B(e, t, n) {
680
+ return e + (n - t);
681
+ }
682
+ //#endregion
683
+ //#region src/core/ui.ts
684
+ var V = "https://bot-q-frontend.vercel.app/", H = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 2H4a2 2 0 00-2 2v18l4-4h14a2 2 0 002-2V4a2 2 0 00-2-2z\"/>\n</svg>", U = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n</svg>", W = `<img src="${F}" alt="" style="width:100%;height:100%;object-fit:cover;border-radius:50%" />`, G = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/>\n</svg>", K = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 2H4a2 2 0 00-2 2v18l4-4h14a2 2 0 002-2V4a2 2 0 00-2-2zm-2 10H6v-2h12v2zm0-3H6V7h12v2z\"/>\n</svg>";
685
+ function q(e) {
686
+ if (!e || e.type === "icon") return W;
687
+ if (e.type === "emoji") return `<span style="font-size:22px;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%">${J(e.value)}</span>`;
599
688
  if (e.type === "initials") {
600
689
  let t = e.bgColor ?? "#F97316";
601
- return `<div style="width:100%;height:100%;border-radius:50%;background:${/^#[0-9A-Fa-f]{3,6}$/.test(t) ? t : "#F97316"};display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;color:#fff">${V(e.value.slice(0, 2).toUpperCase())}</div>`;
690
+ return `<div style="width:100%;height:100%;border-radius:50%;background:${/^#[0-9A-Fa-f]{3,6}$/.test(t) ? t : "#F97316"};display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;color:#fff">${J(e.value.slice(0, 2).toUpperCase())}</div>`;
602
691
  }
603
- return e.type === "image" ? `<img src="${V(e.value)}" style="width:100%;height:100%;object-fit:cover;border-radius:50%" alt="" />` : L;
692
+ return e.type === "image" ? `<img src="${J(e.value)}" style="width:100%;height:100%;object-fit:cover;border-radius:50%" alt="" />` : W;
604
693
  }
605
- function V(e) {
694
+ function J(e) {
606
695
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#x27;");
607
696
  }
608
- function H(e) {
697
+ function Y(e) {
609
698
  let t = [];
610
- return e = e.replace(/`([^`]+)`/g, (e, n) => (t.push(`<code>${n}</code>`), `\x00CODE${t.length - 1}\x00`)), e = e.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>"), e = e.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>"), e = e.replace(/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g, "<em>$1</em>"), e = e.replace(/\[([^\]]+)\]\(([^()]*(?:\([^()]*\))*[^()]*)\)/g, (e, t, n) => /^https?:\/\//.test(n) ? `<a href="${n}" target="_blank" rel="noopener noreferrer">${t}</a>` : t), e = e.replace(/\x00CODE(\d+)\x00/g, (e, n) => t[Number(n)]), e;
699
+ return e = e.replace(/`([^`]+)`/g, (e, n) => (t.push(`<code>${n}</code>`), `\x00CODE${t.length - 1}\x00`)), e = e.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>"), e = e.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>"), e = e.replace(/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g, "<em>$1</em>"), e = e.replace(/~~(.+?)~~/g, "<del>$1</del>"), e = e.replace(/__(.+?)__/g, "<strong>$1</strong>"), e = e.replace(/(^|\s)_(?!_)(.+?)_(?!_)(?=\s|$)/g, "$1<em>$2</em>"), e = e.replace(/\[([^\]]+)\]\(([^()]*(?:\([^()]*\))*[^()]*)\)/g, (e, t, n) => /^https?:\/\//.test(n) ? `<a href="${n}" target="_blank" rel="noopener noreferrer">${t}</a>` : t), e = e.replace(/\x00CODE(\d+)\x00/g, (e, n) => t[Number(n)]), e;
611
700
  }
612
- function U(e) {
701
+ function X(e) {
613
702
  return /^\|[\s\-:|]+\|$/.test(e);
614
703
  }
615
- function W(e) {
704
+ function Z(e) {
616
705
  return e.replace(/^\|/, "").replace(/\|$/, "").split("|").map((e) => e.trim());
617
706
  }
618
- function G(e) {
619
- let t = V(e).replace(/\x00/g, "").split("\n"), n = [], r = 0;
707
+ function re(e) {
708
+ let t = J(e).replace(/\x00/g, "").split("\n"), n = [], r = 0;
620
709
  for (; r < t.length;) {
621
710
  let e = t[r].trim();
622
711
  if (e.startsWith("|") && e.endsWith("|")) {
623
712
  let e = [];
624
713
  for (; r < t.length && t[r].trim().startsWith("|") && t[r].trim().endsWith("|");) e.push(t[r].trim()), r++;
625
- let i = e.findIndex(U), a = i > 0 ? e.slice(0, i) : [], o = i >= 0 ? e.slice(i + 1) : e, s = "<table>";
626
- a.length > 0 && (s += "<thead>" + a.map((e) => "<tr>" + W(e).map((e) => `<th>${H(e)}</th>`).join("") + "</tr>").join("") + "</thead>"), o.length > 0 && (s += "<tbody>" + o.map((e) => "<tr>" + W(e).map((e) => `<td>${H(e)}</td>`).join("") + "</tr>").join("") + "</tbody>"), s += "</table>", n.push(s);
714
+ let i = e.findIndex(X), a = i > 0 ? e.slice(0, i) : [], o = i >= 0 ? e.slice(i + 1) : e, s = "<table>";
715
+ a.length > 0 && (s += "<thead>" + a.map((e) => "<tr>" + Z(e).map((e) => `<th>${Y(e)}</th>`).join("") + "</tr>").join("") + "</thead>"), o.length > 0 && (s += "<tbody>" + o.map((e) => "<tr>" + Z(e).map((e) => `<td>${Y(e)}</td>`).join("") + "</tr>").join("") + "</tbody>"), s += "</table>", n.push(s);
716
+ continue;
717
+ }
718
+ if (/^-{3,}$/.test(e)) {
719
+ n.push("<hr>"), r++;
720
+ continue;
721
+ }
722
+ let i = e.match(/^(#{1,6})\s+(.*)$/);
723
+ if (i) {
724
+ let e = i[1].length;
725
+ n.push(`<h${e}>${Y(i[2])}</h${e}>`), r++;
627
726
  continue;
628
727
  }
629
728
  if (/^[-*]\s/.test(e)) {
630
729
  let e = [];
631
730
  for (; r < t.length && /^\s*[-*]\s/.test(t[r]);) e.push(t[r].trim().replace(/^[-*]\s+/, "")), r++;
632
- n.push("<ul>" + e.map((e) => `<li>${H(e)}</li>`).join("") + "</ul>");
731
+ n.push("<ul>" + e.map((e) => `<li>${Y(e)}</li>`).join("") + "</ul>");
633
732
  continue;
634
733
  }
635
734
  if (/^\d+\.\s/.test(e)) {
636
735
  let e = [];
637
736
  for (; r < t.length && /^\s*\d+\.\s/.test(t[r]);) e.push(t[r].trim().replace(/^\d+\.\s+/, "")), r++;
638
- n.push("<ol>" + e.map((e) => `<li>${H(e)}</li>`).join("") + "</ol>");
737
+ n.push("<ol>" + e.map((e) => `<li>${Y(e)}</li>`).join("") + "</ol>");
639
738
  continue;
640
739
  }
641
740
  if (e === "") {
642
741
  n.push("<br>"), r++;
643
742
  continue;
644
743
  }
645
- n.push(H(e)), n.push("<br>"), r++;
744
+ n.push(Y(e)), n.push("<br>"), r++;
646
745
  }
647
746
  for (; n.length > 0 && n[n.length - 1] === "<br>";) n.pop();
648
747
  return n.join("");
649
748
  }
650
- function K(e, t, n, r, i) {
651
- let { name: a, design: o } = t, s, c, l, u, d, f, { content: p } = o;
652
- function m(e) {
653
- e.setAttribute("data-position", o.layout.position), s = e.attachShadow({ mode: "closed" });
749
+ function ie(e, t, n, r, i, a) {
750
+ let { name: o, design: s } = t, c, l, u, d, f, p, { content: m } = s;
751
+ function h(e) {
752
+ e.setAttribute("data-position", s.layout.position), c = e.attachShadow({ mode: "closed" });
654
753
  let t = document.createElement("style");
655
- t.textContent = M(o), s.appendChild(t), c = document.createElement("button"), c.className = "bubble", c.setAttribute("aria-label", n.ariaOpenChat), c.innerHTML = `
656
- <span class="icon-chat">${F}</span>
657
- <span class="icon-close">${I}</span>
658
- `, c.addEventListener("click", i), s.appendChild(c), l = document.createElement("div"), l.className = "chat-window", l.setAttribute("role", "dialog"), l.setAttribute("aria-label", `${a} chat`), l.innerHTML = `
754
+ t.textContent = P(s), c.appendChild(t), l = document.createElement("button"), l.className = "bubble", l.setAttribute("aria-label", n.ariaOpenChat), l.innerHTML = `
755
+ <span class="icon-chat">${H}</span>
756
+ <span class="icon-close">${U}</span>
757
+ `, l.addEventListener("click", i), c.appendChild(l), u = document.createElement("div"), u.className = "chat-window", u.setAttribute("role", "dialog"), u.setAttribute("aria-label", `${o} chat`), u.innerHTML = `
659
758
  <div class="chat-header">
660
- <div class="avatar">${B(o.avatar)}</div>
759
+ <div class="avatar">${q(s.avatar)}</div>
661
760
  <div class="header-text">
662
- <span class="bot-name">${V(a)}</span>
663
- <span class="bot-status">${V(n.statusOnline)}</span>
761
+ <span class="bot-name">${J(o)}</span>
762
+ <span class="bot-status">${J(n.statusOnline)}</span>
664
763
  </div>
665
- <button class="close-btn" aria-label="${V(n.ariaCloseChat)}">×</button>
764
+ <button class="close-btn" aria-label="${J(n.ariaCloseChat)}">×</button>
666
765
  </div>
667
766
  <div class="messages" id="messages-container" role="log" aria-live="polite" aria-atomic="false"></div>
668
767
  <div class="chat-footer">
669
768
  <div class="input-row">
670
769
  <textarea
671
770
  class="input"
672
- placeholder="${V(p.placeholder || n.inputPlaceholder)}"
771
+ placeholder="${J(m.placeholder || n.inputPlaceholder)}"
673
772
  rows="1"
674
773
  maxlength="2000"
675
774
  aria-label="Message input"
676
775
  ></textarea>
677
- <button class="send-btn" aria-label="${V(n.ariaSendMessage)}">
678
- ${R}
776
+ <button class="send-btn" aria-label="${J(n.ariaSendMessage)}">
777
+ ${G}
679
778
  </button>
680
779
  </div>
681
- <a class="botiq-badge" href="${P}" target="_blank" rel="noopener noreferrer">
682
- ${V(n.poweredBy)} <span class="botiq-badge-name">BotIQ</span>
780
+ <a class="botiq-badge" href="${V}" target="_blank" rel="noopener noreferrer">
781
+ ${J(n.poweredBy)} <span class="botiq-badge-name">BotIQ</span>
683
782
  </a>
684
783
  </div>
685
- `, l.querySelector(".close-btn").addEventListener("click", i), u = l.querySelector("#messages-container"), d = l.querySelector(".input"), f = l.querySelector(".send-btn"), d.addEventListener("input", () => {
686
- d.style.height = "auto", d.style.height = Math.min(d.scrollHeight, 100) + "px";
687
- }), d.addEventListener("keydown", (e) => {
688
- e.key === "Enter" && !e.shiftKey && (e.preventDefault(), h());
689
- }), f.addEventListener("click", h), s.appendChild(l);
784
+ `, u.querySelector(".close-btn").addEventListener("click", i), d = u.querySelector("#messages-container");
785
+ let r = null;
786
+ d.addEventListener("scroll", () => {
787
+ d.scrollTop <= 48 && !r && (r = setTimeout(() => {
788
+ r = null;
789
+ }, 150), a());
790
+ }), f = u.querySelector(".input"), p = u.querySelector(".send-btn"), f.addEventListener("input", () => {
791
+ f.style.height = "auto", f.style.height = Math.min(f.scrollHeight, 100) + "px";
792
+ }), f.addEventListener("keydown", (e) => {
793
+ e.key === "Enter" && !e.shiftKey && (e.preventDefault(), g());
794
+ }), p.addEventListener("click", g), c.appendChild(u);
690
795
  }
691
- function h() {
692
- let e = d.value.trim();
693
- !e || f.disabled || (d.value = "", d.style.height = "auto", r(e));
796
+ function g() {
797
+ let e = f.value.trim();
798
+ !e || p.disabled || (f.value = "", f.style.height = "auto", r(e));
694
799
  }
695
- function g(e) {
800
+ function _(e) {
696
801
  if (e.messages.length === 0 && !e.isLoading) {
697
- let e = p.suggestionChips.length > 0 ? `<div class="chips">${p.suggestionChips.map((e) => `<button class="chip">${V(e)}</button>`).join("")}</div>` : "";
698
- u.innerHTML = `
802
+ let e = m.suggestionChips.length > 0 ? `<div class="chips">${m.suggestionChips.map((e) => `<button class="chip">${J(e)}</button>`).join("")}</div>` : "";
803
+ d.innerHTML = `
699
804
  <div class="empty-state">
700
- ${z}
701
- <span class="greeting">${V(p.greeting || n.defaultGreeting)}</span>
805
+ ${K}
806
+ <span class="greeting">${J(m.greeting || n.defaultGreeting)}</span>
702
807
  ${e}
703
808
  </div>
704
- `, u.querySelectorAll(".chip").forEach((e) => {
809
+ `, d.querySelectorAll(".chip").forEach((e) => {
705
810
  e.addEventListener("click", () => r(e.textContent ?? ""));
706
811
  });
707
812
  return;
708
813
  }
709
814
  let t = e.messages.map((e) => `
710
815
  <div class="message ${e.role}">
711
- <div class="message-bubble">${e.role === "assistant" ? G(e.content) : V(e.content)}</div>
816
+ <div class="message-bubble">${e.role === "assistant" ? re(e.content) : J(e.content)}</div>
712
817
  </div>
713
- `).join(""), i = e.isLoading ? "<div class=\"typing\"><span></span><span></span><span></span></div>" : "";
714
- u.innerHTML = t + i, u.scrollTop = u.scrollHeight;
818
+ `).join(""), i = e.loadingOlder ? "<div class=\"typing\"><span></span><span></span><span></span></div>" : "", a = e.isLoading ? "<div class=\"typing\"><span></span><span></span><span></span></div>" : "", o = d.scrollHeight - d.scrollTop - d.clientHeight < 80, s = d.scrollTop, c = d.scrollHeight;
819
+ d.innerHTML = i + t + a, o ? d.scrollTop = d.scrollHeight : d.scrollTop = B(s, c, d.scrollHeight);
715
820
  }
716
- function _(e) {
717
- e.isOpen ? (l.classList.add("open"), c.classList.add("open"), c.setAttribute("aria-label", n.ariaCloseChat), requestAnimationFrame(() => d.focus())) : (l.classList.remove("open"), c.classList.remove("open"), c.setAttribute("aria-label", n.ariaOpenChat)), f.disabled = e.isLoading, g(e);
821
+ function v(e) {
822
+ e.isOpen ? (u.classList.add("open"), l.classList.add("open"), l.setAttribute("aria-label", n.ariaCloseChat), requestAnimationFrame(() => f.focus())) : (u.classList.remove("open"), l.classList.remove("open"), l.setAttribute("aria-label", n.ariaOpenChat)), p.disabled = e.isLoading, _(e);
718
823
  }
719
824
  return {
720
- mount: m,
721
- update: _
825
+ mount: h,
826
+ update: v
722
827
  };
723
828
  }
724
829
  //#endregion
725
830
  //#region src/i18n/vi.ts
726
- var q = {
831
+ var ae = {
727
832
  statusOnline: "Trực tuyến",
728
833
  inputPlaceholder: "Nhắn tin...",
729
834
  defaultGreeting: "Xin chào! Tôi có thể giúp gì cho bạn?",
@@ -739,7 +844,7 @@ var q = {
739
844
  ariaOpenChat: "Mở khung chat",
740
845
  ariaCloseChat: "Đóng khung chat",
741
846
  ariaSendMessage: "Gửi tin nhắn"
742
- }, J = {
847
+ }, oe = {
743
848
  statusOnline: "Online",
744
849
  inputPlaceholder: "Type a message...",
745
850
  defaultGreeting: "Hello! How can I help you?",
@@ -758,59 +863,81 @@ var q = {
758
863
  };
759
864
  //#endregion
760
865
  //#region src/i18n/index.ts
761
- function Y(e) {
762
- return e === "en" ? J : q;
866
+ function Q(e) {
867
+ return e === "en" ? oe : ae;
763
868
  }
764
869
  //#endregion
765
870
  //#region src/builds/npm/index.ts
766
- function X(e) {
871
+ var $ = 10;
872
+ function se(e) {
767
873
  if (!e.apiKey) return console.warn("[BotIQ] apiKey is required"), () => void 0;
768
874
  let t = p(e);
769
875
  v();
770
- let n = t.apiKey.slice(-16), r = y(n);
771
- E({ messages: b(n, r) });
772
- let i = document.createElement("div");
773
- document.body.appendChild(i);
774
- let a = () => void 0, o = !1, s = Y(void 0);
876
+ let n = t.apiKey.slice(-16), r = y(n), i = b(n, r);
877
+ k({ messages: i });
878
+ let a = I(), o = document.createElement("div");
879
+ document.body.appendChild(o);
880
+ let s = () => void 0, c = !1, l = Q(void 0);
775
881
  f(t.apiKey, t.apiUrl).then((e) => {
776
- if (o) return;
882
+ if (c) return;
777
883
  if (e === null) {
778
- console.warn("[BotIQ] Widget not authorised on this origin — skipped mount"), i.remove();
884
+ console.warn("[BotIQ] Widget not authorised on this origin — skipped mount"), o.remove();
779
885
  return;
780
886
  }
781
- s = Y(e.widgetLanguage);
782
- let n = K(t, e, s, c, l);
783
- n.mount(i), a = D((e) => n.update(e)), n.update(T());
887
+ l = Q(e.widgetLanguage);
888
+ let n = ie(t, e, l, h, g, m);
889
+ n.mount(o), s = A((e) => n.update(e)), n.update(O()), i.length > 0 && d();
784
890
  });
785
- function c(e) {
786
- let i = T();
891
+ function u(e) {
892
+ return {
893
+ role: e.role,
894
+ content: e.content
895
+ };
896
+ }
897
+ async function d() {
898
+ let e = await ee(t.apiUrl, t.apiKey, r, $);
899
+ e.messages.length > 0 && (a = L(e), k({ messages: e.messages.map(u) }));
900
+ }
901
+ async function m() {
902
+ if (z(a, O().loadingOlder)) {
903
+ k({ loadingOlder: !0 });
904
+ try {
905
+ let e = await te(t.apiUrl, t.apiKey, r, a.oldestCursor, $);
906
+ e.messages.length > 0 && k({ messages: [...e.messages.map(u), ...O().messages] }), a = R(a, e);
907
+ } finally {
908
+ k({ loadingOlder: !1 });
909
+ }
910
+ }
911
+ }
912
+ function h(e) {
913
+ let i = O();
787
914
  if (i.isLoading) return;
788
915
  let a = {
789
916
  role: "user",
790
917
  content: e
791
918
  };
792
- E({
919
+ k({
793
920
  messages: [...i.messages, a],
794
921
  isLoading: !0
795
- }), S(t.apiUrl, t.apiKey, r, e, i.messages, s).then((e) => {
922
+ }), S(t.apiUrl, t.apiKey, r, e, i.messages, l).then((e) => {
796
923
  let t = {
797
924
  role: "assistant",
798
925
  content: e
799
926
  };
800
- E({
801
- messages: [...T().messages, t],
927
+ k({
928
+ messages: [...O().messages, t],
802
929
  isLoading: !1
803
930
  }), x(n, r, [a, t]);
804
931
  }).catch(() => {
805
- E({ isLoading: !1 });
932
+ k({ isLoading: !1 });
806
933
  });
807
934
  }
808
- function l() {
809
- E({ isOpen: !T().isOpen });
935
+ function g() {
936
+ k({ isOpen: !O().isOpen });
810
937
  }
811
938
  return () => {
812
- o = !0, a(), i.remove();
939
+ c = !0, s(), o.remove();
813
940
  };
814
941
  }
815
942
  //#endregion
816
- export { X as t };
943
+ export { se as t };
package/dist/sdk/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./npm-BHJnX0sn.js";
1
+ import { t as e } from "./npm-DV43YS-n.js";
2
2
  import { useEffect as t } from "react";
3
3
  //#region src/builds/npm/react.tsx
4
4
  function n(n) {
package/dist/sdk/vue.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./npm-BHJnX0sn.js";
1
+ import { t as e } from "./npm-DV43YS-n.js";
2
2
  import { defineComponent as t, onMounted as n, onUnmounted as r } from "vue";
3
3
  //#region src/builds/npm/vue.ts
4
4
  var i = t({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@locdo.tech/botiq-chat-sdk",
3
- "version": "0.3.4",
3
+ "version": "0.4.0",
4
4
  "description": "BotIQ chat widget SDK — embed AI chatbot into any website with vanilla JS, React, or Vue.",
5
5
  "keywords": [
6
6
  "botiq",