@uptrademedia/site-kit 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/analytics/index.d.mts +2 -2
  2. package/dist/analytics/index.d.ts +2 -2
  3. package/dist/analytics/index.js +6 -6
  4. package/dist/analytics/index.mjs +2 -2
  5. package/dist/{api-l44k92vp.d.mts → api-CWtoFJCO.d.mts} +1 -1
  6. package/dist/{api-l44k92vp.d.ts → api-CWtoFJCO.d.ts} +1 -1
  7. package/dist/blog/index.d.mts +2 -2
  8. package/dist/blog/index.d.ts +2 -2
  9. package/dist/blog/server.d.mts +1 -1
  10. package/dist/blog/server.d.ts +1 -1
  11. package/dist/{chunk-HEUULOSC.js → chunk-2MNLOYDD.js} +3 -3
  12. package/dist/{chunk-HEUULOSC.js.map → chunk-2MNLOYDD.js.map} +1 -1
  13. package/dist/{chunk-3LOFIO77.mjs → chunk-44OMJFCG.mjs} +187 -193
  14. package/dist/chunk-44OMJFCG.mjs.map +1 -0
  15. package/dist/{chunk-C5TQLU5U.js → chunk-6LBLKQ5Q.js} +132 -85
  16. package/dist/chunk-6LBLKQ5Q.js.map +1 -0
  17. package/dist/{chunk-VFJ3NNCY.js → chunk-DERI27QC.js} +187 -193
  18. package/dist/chunk-DERI27QC.js.map +1 -0
  19. package/dist/{chunk-HGTTGJVZ.js → chunk-LBHEVL6U.js} +3 -3
  20. package/dist/{chunk-HGTTGJVZ.js.map → chunk-LBHEVL6U.js.map} +1 -1
  21. package/dist/{chunk-YT5SBY5W.mjs → chunk-MLJXNFUO.mjs} +3 -3
  22. package/dist/{chunk-YT5SBY5W.mjs.map → chunk-MLJXNFUO.mjs.map} +1 -1
  23. package/dist/{chunk-OW2C3ATV.mjs → chunk-R6V7DQ24.mjs} +3 -3
  24. package/dist/{chunk-OW2C3ATV.mjs.map → chunk-R6V7DQ24.mjs.map} +1 -1
  25. package/dist/{chunk-RLO3QJ65.mjs → chunk-TJBXNQ2W.mjs} +131 -85
  26. package/dist/chunk-TJBXNQ2W.mjs.map +1 -0
  27. package/dist/cli/index.js +706 -706
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/cli/index.mjs +700 -700
  30. package/dist/cli/index.mjs.map +1 -1
  31. package/dist/commerce/index.d.mts +3 -3
  32. package/dist/commerce/index.d.ts +3 -3
  33. package/dist/commerce/server.d.mts +1 -1
  34. package/dist/commerce/server.d.ts +1 -1
  35. package/dist/engage/index.d.mts +2 -2
  36. package/dist/engage/index.d.ts +2 -2
  37. package/dist/engage/index.js +4 -4
  38. package/dist/engage/index.mjs +1 -1
  39. package/dist/images/index.d.mts +1 -1
  40. package/dist/images/index.d.ts +1 -1
  41. package/dist/index.d.mts +7 -7
  42. package/dist/index.d.ts +7 -7
  43. package/dist/index.js +4 -4
  44. package/dist/index.mjs +2 -2
  45. package/dist/llms/index.d.mts +2 -2
  46. package/dist/llms/index.d.ts +2 -2
  47. package/dist/{routing-D311WhuV.d.ts → routing-BI69sU8F.d.ts} +1 -1
  48. package/dist/{routing-bTjqOM8S.d.mts → routing-Bg1nr9N0.d.mts} +1 -1
  49. package/dist/{scanner-VNEXRTZF.mjs → scanner-7ZMUM2P5.mjs} +3 -3
  50. package/dist/{scanner-VNEXRTZF.mjs.map → scanner-7ZMUM2P5.mjs.map} +1 -1
  51. package/dist/{scanner-CVKYTPUO.js → scanner-OY7UF3WA.js} +14 -14
  52. package/dist/{scanner-CVKYTPUO.js.map → scanner-OY7UF3WA.js.map} +1 -1
  53. package/dist/seo/index.d.mts +3 -3
  54. package/dist/seo/index.d.ts +3 -3
  55. package/dist/seo/server.d.mts +2 -2
  56. package/dist/seo/server.d.ts +2 -2
  57. package/dist/setup/index.js +2 -2
  58. package/dist/setup/index.mjs +1 -1
  59. package/dist/setup/server.js +2 -2
  60. package/dist/setup/server.mjs +1 -1
  61. package/dist/sitemap/index.d.mts +1 -1
  62. package/dist/sitemap/index.d.ts +1 -1
  63. package/dist/{socket-loader-3FWQWPDQ.js → socket-loader-J26QHHOB.js} +2 -2
  64. package/dist/socket-loader-J26QHHOB.js.map +1 -0
  65. package/dist/{socket-loader-N5ETWMXW.mjs → socket-loader-R7S2YJ2J.mjs} +2 -2
  66. package/dist/socket-loader-R7S2YJ2J.mjs.map +1 -0
  67. package/dist/{types-C_pfGZhI.d.mts → types-Bsf5kX1n.d.mts} +1 -1
  68. package/dist/{types-C_pfGZhI.d.ts → types-Bsf5kX1n.d.ts} +1 -1
  69. package/dist/{types-DxhEH2tX.d.mts → types-CNZcDIoX.d.mts} +1 -1
  70. package/dist/{types-DxhEH2tX.d.ts → types-CNZcDIoX.d.ts} +1 -1
  71. package/dist/{types-Cl2SOKHd.d.mts → types-D8i7Alvv.d.mts} +1 -1
  72. package/dist/{types-Cl2SOKHd.d.ts → types-D8i7Alvv.d.ts} +1 -1
  73. package/dist/{types-DiZVgJKD.d.mts → types-DA_Kocle.d.mts} +1 -1
  74. package/dist/{types-DiZVgJKD.d.ts → types-DA_Kocle.d.ts} +1 -1
  75. package/dist/{types-CMNYdZwT.d.mts → types-DI0jnhjJ.d.mts} +1 -1
  76. package/dist/{types-CMNYdZwT.d.ts → types-DI0jnhjJ.d.ts} +1 -1
  77. package/dist/{types-BF2v5qX3.d.mts → types-wCtRFR0Y.d.mts} +1 -1
  78. package/dist/{types-BF2v5qX3.d.ts → types-wCtRFR0Y.d.ts} +1 -1
  79. package/dist/{useEventModal-x_RZRewW.d.mts → useEventModal-Bs0W9Iy_.d.mts} +2 -2
  80. package/dist/{useEventModal-5fIKdIaY.d.ts → useEventModal-Btu3uIjE.d.ts} +2 -2
  81. package/dist/{web-vitals-PW6MQOKS.js → web-vitals-444RLW3B.js} +3 -3
  82. package/dist/web-vitals-444RLW3B.js.map +1 -0
  83. package/dist/{web-vitals-YSIFBTH7.mjs → web-vitals-KPICZIEF.mjs} +3 -3
  84. package/dist/web-vitals-KPICZIEF.mjs.map +1 -0
  85. package/package.json +2 -1
  86. package/dist/chunk-3LOFIO77.mjs.map +0 -1
  87. package/dist/chunk-C5TQLU5U.js.map +0 -1
  88. package/dist/chunk-RLO3QJ65.mjs.map +0 -1
  89. package/dist/chunk-VFJ3NNCY.js.map +0 -1
  90. package/dist/socket-loader-3FWQWPDQ.js.map +0 -1
  91. package/dist/socket-loader-N5ETWMXW.mjs.map +0 -1
  92. package/dist/web-vitals-PW6MQOKS.js.map +0 -1
  93. package/dist/web-vitals-YSIFBTH7.mjs.map +0 -1
@@ -1,12 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  var React2 = require('react');
4
+ var ReactMarkdown = require('react-markdown');
4
5
  var jsxRuntime = require('react/jsx-runtime');
5
6
  var navigation = require('next/navigation');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
9
 
9
10
  var React2__default = /*#__PURE__*/_interopDefault(React2);
11
+ var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
10
12
 
11
13
  // src/engage/ChatWidget.tsx
12
14
  function getApiConfig() {
@@ -25,6 +27,19 @@ function generateVisitorId() {
25
27
  if (typeof localStorage !== "undefined") localStorage.setItem("engage_visitor_id", id);
26
28
  return id;
27
29
  }
30
+ function userRequestedHandoff(text) {
31
+ const lower = text.toLowerCase().trim();
32
+ const patterns = [
33
+ /\b(talk|speak)\s+(to|with)\s+(a\s+)?(person|human|agent|representative|someone)\b/,
34
+ /\b(real|live)\s+(person|human|agent|support)\b/,
35
+ /\bconnect\s+(me\s+)?(with|to)\s+(a\s+)?(person|human|agent)\b/,
36
+ /\b(need|want)\s+(to\s+)?(talk|speak)\s+(to|with)\s+(someone|a\s+person)\b/,
37
+ /\bhuman\s+(support|agent|help)\b/,
38
+ /\b(talk|speak)\s+to\s+(a\s+)?person\b/,
39
+ /\bget\s+(a\s+)?(person|human)\b/
40
+ ];
41
+ return patterns.some((p) => p.test(lower));
42
+ }
28
43
  function adjustColor(hex, amount) {
29
44
  const num = parseInt(hex.replace("#", ""), 16);
30
45
  const r = Math.min(255, Math.max(0, (num >> 16) + amount));
@@ -220,8 +235,9 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
220
235
  const data = json?.data ?? json;
221
236
  const aiContent = data?.content ?? data?.response ?? data?.message ?? "I'm sorry, I couldn't process that.";
222
237
  const suggestions = data?.suggestions;
238
+ const offerHandoff = data?.offerHandoff === true || data?.offer_handoff === true;
223
239
  const newConversationId = data?.conversationId ?? conversationId;
224
- return { content: aiContent, suggestions, conversationId: newConversationId };
240
+ return { content: aiContent, suggestions, offerHandoff, conversationId: newConversationId };
225
241
  },
226
242
  [signalUrl, projectId, visitorId, fetchSiteContext]
227
243
  );
@@ -280,7 +296,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
280
296
  socketRef.current.disconnect();
281
297
  socketRef.current = null;
282
298
  }
283
- const { createSocket } = await import('./socket-loader-3FWQWPDQ.js');
299
+ const { createSocket } = await import('./socket-loader-J26QHHOB.js');
284
300
  const namespaceUrl = `${baseUrl.replace(/\/$/, "")}/engage/chat`;
285
301
  const socket = await createSocket(namespaceUrl, {
286
302
  query: { projectId, visitorId, sessionId: currentSessionId },
@@ -427,7 +443,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
427
443
  { id: `u-${Date.now()}`, role: "user", content: pending, timestamp: /* @__PURE__ */ new Date() }
428
444
  ]);
429
445
  try {
430
- const { content: aiContent, suggestions } = await sendToSignalApi(pending, id);
446
+ const { content: aiContent, suggestions, offerHandoff } = await sendToSignalApi(pending, id);
447
+ const userWantsHandoff = userRequestedHandoff(pending);
431
448
  setMessages((prev) => [
432
449
  ...prev,
433
450
  {
@@ -435,7 +452,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
435
452
  role: "assistant",
436
453
  content: aiContent,
437
454
  timestamp: /* @__PURE__ */ new Date(),
438
- ...suggestions?.length ? { suggestions } : {}
455
+ ...suggestions?.length ? { suggestions } : {},
456
+ ...offerHandoff || userWantsHandoff ? { offerHandoff: true } : {}
439
457
  }
440
458
  ]);
441
459
  } catch (err) {
@@ -447,7 +465,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
447
465
  role: "assistant",
448
466
  content: "I apologize, but I encountered an error. Would you like to speak with a team member?",
449
467
  timestamp: /* @__PURE__ */ new Date(),
450
- suggestions: ["Talk to a person", "Try again"]
468
+ suggestions: ["Talk to a person", "Try again"],
469
+ offerHandoff: true
451
470
  }
452
471
  ]);
453
472
  } finally {
@@ -569,7 +588,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
569
588
  setIsLoading(true);
570
589
  if (widgetConfig?.signal_enabled && hasText) {
571
590
  try {
572
- const { content: aiContent, suggestions } = await sendToSignalApi(content, sessionId);
591
+ const { content: aiContent, suggestions, offerHandoff } = await sendToSignalApi(content, sessionId);
592
+ const lastUserContent = messages.filter((m) => m.role === "user").slice(-1)[0]?.content ?? "";
573
593
  setMessages((prev) => [
574
594
  ...prev,
575
595
  {
@@ -577,7 +597,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
577
597
  role: "assistant",
578
598
  content: aiContent,
579
599
  timestamp: /* @__PURE__ */ new Date(),
580
- ...suggestions?.length ? { suggestions } : {}
600
+ ...suggestions?.length ? { suggestions } : {},
601
+ ...offerHandoff || userRequestedHandoff(lastUserContent) ? { offerHandoff: true } : {}
581
602
  }
582
603
  ]);
583
604
  } catch (err) {
@@ -589,7 +610,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
589
610
  role: "assistant",
590
611
  content: "I apologize, but I encountered an error. Would you like to speak with a team member?",
591
612
  timestamp: /* @__PURE__ */ new Date(),
592
- suggestions: ["Talk to a person", "Try again"]
613
+ suggestions: ["Talk to a person", "Try again"],
614
+ offerHandoff: true
593
615
  }
594
616
  ]);
595
617
  } finally {
@@ -1001,82 +1023,105 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1001
1023
  {
1002
1024
  style: { flex: 1, overflowY: "auto", padding: 16, display: "flex", flexDirection: "column", gap: 12, backgroundColor: "#f9fafb" },
1003
1025
  children: [
1004
- messages.map((message) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", justifyContent: message.role === "user" ? "flex-end" : "flex-start" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
1005
- "div",
1006
- {
1007
- style: {
1008
- maxWidth: "80%",
1009
- padding: message.role === "system" ? "8px 12px" : "10px 14px",
1010
- borderRadius: message.role === "user" ? "16px 16px 4px 16px" : message.role === "system" ? "8px" : "16px 16px 16px 4px",
1011
- backgroundColor: message.role === "user" ? primaryColor : message.role === "system" ? "#e5e7eb" : "#ffffff",
1012
- color: message.role === "user" ? isLightColor(primaryColor) ? "#1a1a1a" : "white" : message.role === "system" ? "#6b7280" : "#111827",
1013
- boxShadow: message.role === "system" ? "none" : "0 1px 2px rgba(0,0,0,0.08)",
1014
- fontSize: message.role === "system" ? 13 : 14,
1015
- fontStyle: message.role === "system" ? "italic" : "normal",
1016
- lineHeight: 1.5,
1017
- whiteSpace: "pre-wrap",
1018
- wordBreak: "break-word"
1019
- },
1020
- children: [
1021
- message.agentName && message.role === "agent" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, opacity: 0.6, marginBottom: 4 }, children: message.agentName }),
1022
- message.content,
1023
- message.attachments?.length ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: message.attachments.map(
1024
- (att, i) => att.mimeType?.startsWith("image/") ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: att.url, target: "_blank", rel: "noopener noreferrer", style: { display: "block" }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: att.url, alt: att.name, style: { maxWidth: "100%", maxHeight: 200, borderRadius: 8, objectFit: "contain" } }) }, i) : /* @__PURE__ */ jsxRuntime.jsxs("a", { href: att.url, target: "_blank", rel: "noopener noreferrer", style: { fontSize: 13, wordBreak: "break-all" }, children: [
1025
- "\u{1F4CE} ",
1026
- att.name
1027
- ] }, i)
1028
- ) }) : null,
1029
- message.suggestions?.length ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: 6, marginTop: 8 }, children: message.suggestions.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx(
1030
- "button",
1031
- {
1032
- type: "button",
1033
- onClick: () => {
1034
- setInputValue(s);
1035
- inputRef.current?.focus();
1036
- },
1037
- style: {
1038
- padding: "6px 12px",
1039
- borderRadius: 16,
1040
- border: `1px solid ${primaryColor}`,
1041
- backgroundColor: `${primaryColor}10`,
1042
- color: primaryColor,
1043
- fontSize: 13,
1044
- cursor: "pointer"
1045
- },
1046
- children: s
1047
- },
1048
- i
1049
- )) }) : null,
1050
- message.sendFailed && lastFailedSend && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1051
- "button",
1052
- {
1053
- type: "button",
1054
- onClick: retryFailedSend,
1055
- style: { padding: "6px 12px", borderRadius: 6, border: "1px solid #ef4444", backgroundColor: "#fef2f2", color: "#dc2626", fontSize: 13, cursor: "pointer" },
1056
- children: "Retry send"
1057
- }
1058
- ) }),
1059
- widgetConfig?.signal_enabled && message.role === "assistant" && !message.suggestions?.length && widgetConfig?.handoff_enabled !== false && messages.filter((m) => m.role === "user").length >= 2 && message.id === messages.filter((m) => m.role === "assistant").slice(-1)[0]?.id && /* @__PURE__ */ jsxRuntime.jsx(
1060
- "button",
1061
- {
1062
- onClick: requestHandoff,
1063
- style: {
1064
- display: "inline-block",
1065
- marginTop: 8,
1066
- padding: "6px 12px",
1067
- borderRadius: 6,
1068
- border: `1px solid ${primaryColor}`,
1069
- backgroundColor: "transparent",
1070
- color: primaryColor,
1071
- fontSize: 13,
1072
- cursor: "pointer"
1026
+ messages.map((message) => {
1027
+ const isAssistant = message.role === "assistant" || message.role === "agent";
1028
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", justifyContent: message.role === "user" ? "flex-end" : "flex-start" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
1029
+ "div",
1030
+ {
1031
+ style: {
1032
+ maxWidth: "80%",
1033
+ padding: message.role === "system" ? "8px 12px" : isAssistant ? "12px 16px" : "10px 14px",
1034
+ borderRadius: message.role === "user" ? "16px 16px 4px 16px" : message.role === "system" ? "8px" : "16px 16px 16px 4px",
1035
+ backgroundColor: message.role === "user" ? primaryColor : message.role === "system" ? "#e5e7eb" : "#ffffff",
1036
+ color: message.role === "user" ? isLightColor(primaryColor) ? "#1a1a1a" : "white" : message.role === "system" ? "#6b7280" : "#111827",
1037
+ boxShadow: message.role === "system" ? "none" : "0 1px 2px rgba(0,0,0,0.08)",
1038
+ fontSize: message.role === "system" ? 13 : 14,
1039
+ fontStyle: message.role === "system" ? "italic" : "normal",
1040
+ lineHeight: isAssistant ? 1.6 : 1.5,
1041
+ whiteSpace: isAssistant ? "normal" : "pre-wrap",
1042
+ wordBreak: "break-word",
1043
+ textAlign: isAssistant ? "left" : void 0,
1044
+ borderLeft: isAssistant ? `3px solid ${primaryColor}33` : void 0
1045
+ },
1046
+ children: [
1047
+ message.agentName && message.role === "agent" && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, opacity: 0.6, marginBottom: 4 }, children: message.agentName }),
1048
+ isAssistant ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "chatMessageContent", children: /* @__PURE__ */ jsxRuntime.jsx(
1049
+ ReactMarkdown__default.default,
1050
+ {
1051
+ components: {
1052
+ p: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: "0 0 8px", lineHeight: 1.6 }, children }),
1053
+ strong: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("strong", { style: { fontWeight: 600 }, children }),
1054
+ ul: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("ul", { style: { margin: "4px 0 8px", paddingLeft: 20 }, children }),
1055
+ ol: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("ol", { style: { margin: "4px 0 8px", paddingLeft: 20 }, children }),
1056
+ li: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("li", { style: { marginBottom: 4 }, children }),
1057
+ h3: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { margin: "12px 0 6px", fontSize: 15, fontWeight: 600 }, children }),
1058
+ h4: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("h4", { style: { margin: "8px 0 4px", fontSize: 14, fontWeight: 600 }, children })
1059
+ },
1060
+ children: message.content
1061
+ }
1062
+ ) }) : message.content,
1063
+ message.attachments?.length ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8, display: "flex", flexDirection: "column", gap: 6 }, children: message.attachments.map(
1064
+ (att, i) => att.mimeType?.startsWith("image/") ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: att.url, target: "_blank", rel: "noopener noreferrer", style: { display: "block" }, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: att.url, alt: att.name, style: { maxWidth: "100%", maxHeight: 200, borderRadius: 8, objectFit: "contain" } }) }, i) : /* @__PURE__ */ jsxRuntime.jsxs("a", { href: att.url, target: "_blank", rel: "noopener noreferrer", style: { fontSize: 13, wordBreak: "break-all", display: "flex", alignItems: "center", gap: 6 }, children: [
1065
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48" }) }),
1066
+ att.name
1067
+ ] }, i)
1068
+ ) }) : null,
1069
+ message.suggestions?.length ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: 6, marginTop: 8 }, children: message.suggestions.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx(
1070
+ "button",
1071
+ {
1072
+ type: "button",
1073
+ onClick: () => {
1074
+ if (/talk\s+to\s+(a\s+)?person/i.test(s)) {
1075
+ requestHandoff();
1076
+ } else {
1077
+ setInputValue(s);
1078
+ inputRef.current?.focus();
1079
+ }
1080
+ },
1081
+ style: {
1082
+ padding: "6px 12px",
1083
+ borderRadius: 16,
1084
+ border: `1px solid ${primaryColor}`,
1085
+ backgroundColor: `${primaryColor}10`,
1086
+ color: primaryColor,
1087
+ fontSize: 13,
1088
+ cursor: "pointer"
1089
+ },
1090
+ children: s
1073
1091
  },
1074
- children: "Talk to a person"
1075
- }
1076
- )
1077
- ]
1078
- }
1079
- ) }, message.id)),
1092
+ i
1093
+ )) }) : null,
1094
+ message.sendFailed && lastFailedSend && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ jsxRuntime.jsx(
1095
+ "button",
1096
+ {
1097
+ type: "button",
1098
+ onClick: retryFailedSend,
1099
+ style: { padding: "6px 12px", borderRadius: 6, border: "1px solid #ef4444", backgroundColor: "#fef2f2", color: "#dc2626", fontSize: 13, cursor: "pointer" },
1100
+ children: "Retry send"
1101
+ }
1102
+ ) }),
1103
+ widgetConfig?.signal_enabled && message.role === "assistant" && widgetConfig?.handoff_enabled !== false && message.offerHandoff && !message.suggestions?.some((s) => /talk\s+to\s+(a\s+)?person/i.test(s)) && message.id === messages.filter((m) => m.role === "assistant").slice(-1)[0]?.id && /* @__PURE__ */ jsxRuntime.jsx(
1104
+ "button",
1105
+ {
1106
+ onClick: requestHandoff,
1107
+ style: {
1108
+ display: "inline-block",
1109
+ marginTop: 8,
1110
+ padding: "6px 12px",
1111
+ borderRadius: 6,
1112
+ border: `1px solid ${primaryColor}`,
1113
+ backgroundColor: "transparent",
1114
+ color: primaryColor,
1115
+ fontSize: 13,
1116
+ cursor: "pointer"
1117
+ },
1118
+ children: "Talk to a person"
1119
+ }
1120
+ )
1121
+ ]
1122
+ }
1123
+ ) }, message.id);
1124
+ }),
1080
1125
  (isLoading || agentTyping) && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", justifyContent: "flex-start" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
1081
1126
  "div",
1082
1127
  {
@@ -1206,6 +1251,8 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1206
1251
  from { transform: scaleX(0); }
1207
1252
  to { transform: scaleX(1); }
1208
1253
  }
1254
+ .chatMessageContent p:first-child { margin-top: 0; }
1255
+ .chatMessageContent p:last-child { margin-bottom: 0; }
1209
1256
  ` })
1210
1257
  ]
1211
1258
  }
@@ -1839,5 +1886,5 @@ function getDeviceType() {
1839
1886
  exports.ChatWidget = ChatWidget;
1840
1887
  exports.DesignRenderer = DesignRenderer;
1841
1888
  exports.EngageWidget = EngageWidget;
1842
- //# sourceMappingURL=chunk-C5TQLU5U.js.map
1843
- //# sourceMappingURL=chunk-C5TQLU5U.js.map
1889
+ //# sourceMappingURL=chunk-6LBLKQ5Q.js.map
1890
+ //# sourceMappingURL=chunk-6LBLKQ5Q.js.map