@pocketping/widget 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -151,6 +151,7 @@ function styles(primaryColor, theme) {
151
151
  flex-direction: column;
152
152
  overflow: hidden;
153
153
  z-index: 9998;
154
+ transition: max-height 0.2s ease, bottom 0.2s ease;
154
155
  }
155
156
 
156
157
  .pp-window.pp-bottom-right {
@@ -167,13 +168,21 @@ function styles(primaryColor, theme) {
167
168
  .pp-window {
168
169
  width: calc(100vw - 20px);
169
170
  height: auto;
171
+ min-height: 300px;
170
172
  max-height: calc(100vh - 100px);
171
- max-height: calc(100dvh - 100px);
173
+ max-height: calc(100svh - 100px); /* svh = small viewport, excludes keyboard */
172
174
  bottom: 80px;
173
175
  right: 10px;
174
176
  left: 10px;
175
177
  border-radius: 12px;
176
178
  }
179
+
180
+ /* When keyboard is likely open (input focused), reduce height */
181
+ .pp-window:has(.pp-input:focus) {
182
+ max-height: calc(50vh - 20px);
183
+ max-height: calc(50svh - 20px);
184
+ bottom: 10px;
185
+ }
177
186
  }
178
187
 
179
188
  .pp-header {
@@ -964,17 +973,52 @@ function styles(primaryColor, theme) {
964
973
  text-overflow: ellipsis;
965
974
  }
966
975
 
976
+ /* Clickable reply quote */
977
+ .pp-reply-quote-clickable {
978
+ cursor: pointer;
979
+ transition: background 0.15s, transform 0.1s;
980
+ }
981
+
982
+ .pp-reply-quote-clickable:hover {
983
+ background: ${isDark ? "rgba(255,255,255,0.15)" : "rgba(0,0,0,0.08)"};
984
+ }
985
+
986
+ .pp-reply-quote-clickable:active {
987
+ transform: scale(0.98);
988
+ }
989
+
967
990
  /* Reply quote in visitor message bubble needs higher contrast */
968
991
  .pp-message-visitor .pp-reply-quote {
969
992
  background: rgba(255, 255, 255, 0.18);
970
993
  border-left-color: rgba(255, 255, 255, 0.7);
971
994
  }
972
995
 
996
+ .pp-message-visitor .pp-reply-quote-clickable:hover {
997
+ background: rgba(255, 255, 255, 0.25);
998
+ }
999
+
973
1000
  .pp-message-visitor .pp-reply-sender,
974
1001
  .pp-message-visitor .pp-reply-content {
975
1002
  color: rgba(255, 255, 255, 0.9);
976
1003
  }
977
1004
 
1005
+ /* Message highlight animation (when scrolling to a message) */
1006
+ .pp-message-highlight {
1007
+ animation: pp-highlight-pulse 1.5s ease-out;
1008
+ }
1009
+
1010
+ @keyframes pp-highlight-pulse {
1011
+ 0% {
1012
+ box-shadow: 0 0 0 0 ${primaryColor}80;
1013
+ }
1014
+ 30% {
1015
+ box-shadow: 0 0 0 6px ${primaryColor}40;
1016
+ }
1017
+ 100% {
1018
+ box-shadow: 0 0 0 0 ${primaryColor}00;
1019
+ }
1020
+ }
1021
+
978
1022
  /* Deleted Message */
979
1023
  .pp-message-deleted {
980
1024
  opacity: 0.6;
@@ -1273,6 +1317,16 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1273
1317
  document.addEventListener("click", handleClickOutside);
1274
1318
  return () => document.removeEventListener("click", handleClickOutside);
1275
1319
  }, [messageMenu]);
1320
+ const scrollToMessage = (messageId) => {
1321
+ const messageElement = document.getElementById(`pp-msg-${messageId}`);
1322
+ if (messageElement) {
1323
+ messageElement.scrollIntoView({ behavior: "smooth", block: "center" });
1324
+ messageElement.classList.add("pp-message-highlight");
1325
+ setTimeout(() => {
1326
+ messageElement.classList.remove("pp-message-highlight");
1327
+ }, 1500);
1328
+ }
1329
+ };
1276
1330
  const dragCounterRef = (0, import_hooks.useRef)(0);
1277
1331
  const handleDragEnter = (e) => {
1278
1332
  e.preventDefault();
@@ -1413,10 +1467,14 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1413
1467
  } else {
1414
1468
  const replyToMsg = messages.find((m) => m.id === msg.replyTo);
1415
1469
  if (replyToMsg) {
1470
+ const hasAttachment = !!(replyToMsg.attachments && replyToMsg.attachments.length > 0);
1416
1471
  replyData = {
1472
+ id: replyToMsg.id,
1417
1473
  sender: replyToMsg.sender,
1418
1474
  content: replyToMsg.content,
1419
- deleted: !!replyToMsg.deletedAt
1475
+ deleted: !!replyToMsg.deletedAt,
1476
+ hasAttachment,
1477
+ attachmentType: hasAttachment ? replyToMsg.attachments[0].mimeType : void 0
1420
1478
  };
1421
1479
  }
1422
1480
  }
@@ -1426,6 +1484,7 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1426
1484
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1427
1485
  "div",
1428
1486
  {
1487
+ id: `pp-msg-${msg.id}`,
1429
1488
  class: `pp-message pp-message-${msg.sender} ${isDeleted ? "pp-message-deleted" : ""}`,
1430
1489
  onContextMenu: (e) => handleMessageContextMenu(e, msg),
1431
1490
  onMouseEnter: () => setHoveredMessageId(msg.id),
@@ -1465,13 +1524,26 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1465
1524
  )
1466
1525
  ] })
1467
1526
  ] }),
1468
- replyData && replyData.content && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { class: "pp-reply-quote", children: [
1469
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-sender", children: replyData.sender === "visitor" ? "You" : "Support" }),
1470
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { class: "pp-reply-content", children: [
1471
- replyData.deleted ? "Message deleted" : (replyData.content || "").slice(0, 50),
1472
- (replyData.content || "").length > 50 ? "..." : ""
1473
- ] })
1474
- ] }),
1527
+ replyData && (replyData.content || replyData.hasAttachment) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1528
+ "div",
1529
+ {
1530
+ class: "pp-reply-quote pp-reply-quote-clickable",
1531
+ onClick: () => scrollToMessage(replyData.id),
1532
+ role: "button",
1533
+ tabIndex: 0,
1534
+ onKeyDown: (e) => e.key === "Enter" && scrollToMessage(replyData.id),
1535
+ children: [
1536
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-sender", children: replyData.sender === "visitor" ? "You" : "Support" }),
1537
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-content", children: replyData.deleted ? "Message deleted" : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
1538
+ replyData.hasAttachment && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-attachment-icon", children: replyData.attachmentType?.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
1539
+ replyData.content ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
1540
+ (replyData.content || "").slice(0, 50),
1541
+ (replyData.content || "").length > 50 ? "..." : ""
1542
+ ] }) : replyData.attachmentType?.startsWith("image/") ? "Photo" : "File"
1543
+ ] }) })
1544
+ ]
1545
+ }
1546
+ ),
1475
1547
  isDeleted ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { class: "pp-message-content pp-deleted-content", children: [
1476
1548
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-deleted-icon", children: "\u{1F5D1}\uFE0F" }),
1477
1549
  " Message deleted"
@@ -1543,8 +1615,11 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1543
1615
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { class: "pp-reply-preview-content", children: [
1544
1616
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-label", children: "Replying to" }),
1545
1617
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { class: "pp-reply-text", children: [
1546
- replyingTo.content.slice(0, 50),
1547
- replyingTo.content.length > 50 ? "..." : ""
1618
+ replyingTo.attachments && replyingTo.attachments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { class: "pp-reply-attachment-icon", children: replyingTo.attachments[0].mimeType.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
1619
+ replyingTo.content ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
1620
+ replyingTo.content.slice(0, 50),
1621
+ replyingTo.content.length > 50 ? "..." : ""
1622
+ ] }) : replyingTo.attachments?.[0]?.mimeType.startsWith("image/") ? "Photo" : "File"
1548
1623
  ] })
1549
1624
  ] }),
1550
1625
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { class: "pp-reply-cancel", onClick: handleCancelReply, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CloseIcon, {}) })
@@ -2120,12 +2195,12 @@ var PocketPingClient = class {
2120
2195
  if (!this.session) {
2121
2196
  throw new Error("Not connected");
2122
2197
  }
2123
- const response = await this.fetch(`/message/${messageId}`, {
2124
- method: "DELETE",
2125
- body: JSON.stringify({
2126
- sessionId: this.session.sessionId
2127
- })
2128
- });
2198
+ const response = await this.fetch(
2199
+ `/message/${messageId}?sessionId=${encodeURIComponent(this.session.sessionId)}`,
2200
+ {
2201
+ method: "DELETE"
2202
+ }
2203
+ );
2129
2204
  if (response.deleted) {
2130
2205
  const messageIndex = this.session.messages.findIndex((m) => m.id === messageId);
2131
2206
  if (messageIndex >= 0) {
package/dist/index.d.cts CHANGED
@@ -81,6 +81,10 @@ interface ReplyToData {
81
81
  content: string;
82
82
  sender: string;
83
83
  deleted?: boolean;
84
+ /** Indicates if the replied message has attachments (e.g., image) */
85
+ hasAttachment?: boolean;
86
+ /** MIME type of the first attachment (for icon display) */
87
+ attachmentType?: string;
84
88
  }
85
89
  interface Message {
86
90
  id: string;
package/dist/index.d.ts CHANGED
@@ -81,6 +81,10 @@ interface ReplyToData {
81
81
  content: string;
82
82
  sender: string;
83
83
  deleted?: boolean;
84
+ /** Indicates if the replied message has attachments (e.g., image) */
85
+ hasAttachment?: boolean;
86
+ /** MIME type of the first attachment (for icon display) */
87
+ attachmentType?: string;
84
88
  }
85
89
  interface Message {
86
90
  id: string;
package/dist/index.js CHANGED
@@ -110,6 +110,7 @@ function styles(primaryColor, theme) {
110
110
  flex-direction: column;
111
111
  overflow: hidden;
112
112
  z-index: 9998;
113
+ transition: max-height 0.2s ease, bottom 0.2s ease;
113
114
  }
114
115
 
115
116
  .pp-window.pp-bottom-right {
@@ -126,13 +127,21 @@ function styles(primaryColor, theme) {
126
127
  .pp-window {
127
128
  width: calc(100vw - 20px);
128
129
  height: auto;
130
+ min-height: 300px;
129
131
  max-height: calc(100vh - 100px);
130
- max-height: calc(100dvh - 100px);
132
+ max-height: calc(100svh - 100px); /* svh = small viewport, excludes keyboard */
131
133
  bottom: 80px;
132
134
  right: 10px;
133
135
  left: 10px;
134
136
  border-radius: 12px;
135
137
  }
138
+
139
+ /* When keyboard is likely open (input focused), reduce height */
140
+ .pp-window:has(.pp-input:focus) {
141
+ max-height: calc(50vh - 20px);
142
+ max-height: calc(50svh - 20px);
143
+ bottom: 10px;
144
+ }
136
145
  }
137
146
 
138
147
  .pp-header {
@@ -923,17 +932,52 @@ function styles(primaryColor, theme) {
923
932
  text-overflow: ellipsis;
924
933
  }
925
934
 
935
+ /* Clickable reply quote */
936
+ .pp-reply-quote-clickable {
937
+ cursor: pointer;
938
+ transition: background 0.15s, transform 0.1s;
939
+ }
940
+
941
+ .pp-reply-quote-clickable:hover {
942
+ background: ${isDark ? "rgba(255,255,255,0.15)" : "rgba(0,0,0,0.08)"};
943
+ }
944
+
945
+ .pp-reply-quote-clickable:active {
946
+ transform: scale(0.98);
947
+ }
948
+
926
949
  /* Reply quote in visitor message bubble needs higher contrast */
927
950
  .pp-message-visitor .pp-reply-quote {
928
951
  background: rgba(255, 255, 255, 0.18);
929
952
  border-left-color: rgba(255, 255, 255, 0.7);
930
953
  }
931
954
 
955
+ .pp-message-visitor .pp-reply-quote-clickable:hover {
956
+ background: rgba(255, 255, 255, 0.25);
957
+ }
958
+
932
959
  .pp-message-visitor .pp-reply-sender,
933
960
  .pp-message-visitor .pp-reply-content {
934
961
  color: rgba(255, 255, 255, 0.9);
935
962
  }
936
963
 
964
+ /* Message highlight animation (when scrolling to a message) */
965
+ .pp-message-highlight {
966
+ animation: pp-highlight-pulse 1.5s ease-out;
967
+ }
968
+
969
+ @keyframes pp-highlight-pulse {
970
+ 0% {
971
+ box-shadow: 0 0 0 0 ${primaryColor}80;
972
+ }
973
+ 30% {
974
+ box-shadow: 0 0 0 6px ${primaryColor}40;
975
+ }
976
+ 100% {
977
+ box-shadow: 0 0 0 0 ${primaryColor}00;
978
+ }
979
+ }
980
+
937
981
  /* Deleted Message */
938
982
  .pp-message-deleted {
939
983
  opacity: 0.6;
@@ -1232,6 +1276,16 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1232
1276
  document.addEventListener("click", handleClickOutside);
1233
1277
  return () => document.removeEventListener("click", handleClickOutside);
1234
1278
  }, [messageMenu]);
1279
+ const scrollToMessage = (messageId) => {
1280
+ const messageElement = document.getElementById(`pp-msg-${messageId}`);
1281
+ if (messageElement) {
1282
+ messageElement.scrollIntoView({ behavior: "smooth", block: "center" });
1283
+ messageElement.classList.add("pp-message-highlight");
1284
+ setTimeout(() => {
1285
+ messageElement.classList.remove("pp-message-highlight");
1286
+ }, 1500);
1287
+ }
1288
+ };
1235
1289
  const dragCounterRef = useRef(0);
1236
1290
  const handleDragEnter = (e) => {
1237
1291
  e.preventDefault();
@@ -1372,10 +1426,14 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1372
1426
  } else {
1373
1427
  const replyToMsg = messages.find((m) => m.id === msg.replyTo);
1374
1428
  if (replyToMsg) {
1429
+ const hasAttachment = !!(replyToMsg.attachments && replyToMsg.attachments.length > 0);
1375
1430
  replyData = {
1431
+ id: replyToMsg.id,
1376
1432
  sender: replyToMsg.sender,
1377
1433
  content: replyToMsg.content,
1378
- deleted: !!replyToMsg.deletedAt
1434
+ deleted: !!replyToMsg.deletedAt,
1435
+ hasAttachment,
1436
+ attachmentType: hasAttachment ? replyToMsg.attachments[0].mimeType : void 0
1379
1437
  };
1380
1438
  }
1381
1439
  }
@@ -1385,6 +1443,7 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1385
1443
  return /* @__PURE__ */ jsxs(
1386
1444
  "div",
1387
1445
  {
1446
+ id: `pp-msg-${msg.id}`,
1388
1447
  class: `pp-message pp-message-${msg.sender} ${isDeleted ? "pp-message-deleted" : ""}`,
1389
1448
  onContextMenu: (e) => handleMessageContextMenu(e, msg),
1390
1449
  onMouseEnter: () => setHoveredMessageId(msg.id),
@@ -1424,13 +1483,26 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1424
1483
  )
1425
1484
  ] })
1426
1485
  ] }),
1427
- replyData && replyData.content && /* @__PURE__ */ jsxs("div", { class: "pp-reply-quote", children: [
1428
- /* @__PURE__ */ jsx("span", { class: "pp-reply-sender", children: replyData.sender === "visitor" ? "You" : "Support" }),
1429
- /* @__PURE__ */ jsxs("span", { class: "pp-reply-content", children: [
1430
- replyData.deleted ? "Message deleted" : (replyData.content || "").slice(0, 50),
1431
- (replyData.content || "").length > 50 ? "..." : ""
1432
- ] })
1433
- ] }),
1486
+ replyData && (replyData.content || replyData.hasAttachment) && /* @__PURE__ */ jsxs(
1487
+ "div",
1488
+ {
1489
+ class: "pp-reply-quote pp-reply-quote-clickable",
1490
+ onClick: () => scrollToMessage(replyData.id),
1491
+ role: "button",
1492
+ tabIndex: 0,
1493
+ onKeyDown: (e) => e.key === "Enter" && scrollToMessage(replyData.id),
1494
+ children: [
1495
+ /* @__PURE__ */ jsx("span", { class: "pp-reply-sender", children: replyData.sender === "visitor" ? "You" : "Support" }),
1496
+ /* @__PURE__ */ jsx("span", { class: "pp-reply-content", children: replyData.deleted ? "Message deleted" : /* @__PURE__ */ jsxs(Fragment2, { children: [
1497
+ replyData.hasAttachment && /* @__PURE__ */ jsx("span", { class: "pp-reply-attachment-icon", children: replyData.attachmentType?.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
1498
+ replyData.content ? /* @__PURE__ */ jsxs(Fragment2, { children: [
1499
+ (replyData.content || "").slice(0, 50),
1500
+ (replyData.content || "").length > 50 ? "..." : ""
1501
+ ] }) : replyData.attachmentType?.startsWith("image/") ? "Photo" : "File"
1502
+ ] }) })
1503
+ ]
1504
+ }
1505
+ ),
1434
1506
  isDeleted ? /* @__PURE__ */ jsxs("div", { class: "pp-message-content pp-deleted-content", children: [
1435
1507
  /* @__PURE__ */ jsx("span", { class: "pp-deleted-icon", children: "\u{1F5D1}\uFE0F" }),
1436
1508
  " Message deleted"
@@ -1502,8 +1574,11 @@ function ChatWidget({ client: client2, config: initialConfig }) {
1502
1574
  /* @__PURE__ */ jsxs("div", { class: "pp-reply-preview-content", children: [
1503
1575
  /* @__PURE__ */ jsx("span", { class: "pp-reply-label", children: "Replying to" }),
1504
1576
  /* @__PURE__ */ jsxs("span", { class: "pp-reply-text", children: [
1505
- replyingTo.content.slice(0, 50),
1506
- replyingTo.content.length > 50 ? "..." : ""
1577
+ replyingTo.attachments && replyingTo.attachments.length > 0 && /* @__PURE__ */ jsx("span", { class: "pp-reply-attachment-icon", children: replyingTo.attachments[0].mimeType.startsWith("image/") ? "\u{1F4F7} " : "\u{1F4CE} " }),
1578
+ replyingTo.content ? /* @__PURE__ */ jsxs(Fragment2, { children: [
1579
+ replyingTo.content.slice(0, 50),
1580
+ replyingTo.content.length > 50 ? "..." : ""
1581
+ ] }) : replyingTo.attachments?.[0]?.mimeType.startsWith("image/") ? "Photo" : "File"
1507
1582
  ] })
1508
1583
  ] }),
1509
1584
  /* @__PURE__ */ jsx("button", { class: "pp-reply-cancel", onClick: handleCancelReply, children: /* @__PURE__ */ jsx(CloseIcon, {}) })
@@ -2079,12 +2154,12 @@ var PocketPingClient = class {
2079
2154
  if (!this.session) {
2080
2155
  throw new Error("Not connected");
2081
2156
  }
2082
- const response = await this.fetch(`/message/${messageId}`, {
2083
- method: "DELETE",
2084
- body: JSON.stringify({
2085
- sessionId: this.session.sessionId
2086
- })
2087
- });
2157
+ const response = await this.fetch(
2158
+ `/message/${messageId}?sessionId=${encodeURIComponent(this.session.sessionId)}`,
2159
+ {
2160
+ method: "DELETE"
2161
+ }
2162
+ );
2088
2163
  if (response.deleted) {
2089
2164
  const messageIndex = this.session.messages.findIndex((m) => m.id === messageId);
2090
2165
  if (messageIndex >= 0) {
@@ -1,4 +1,4 @@
1
- "use strict";var PocketPing=(()=>{var xe=Object.defineProperty;var tn=Object.getOwnPropertyDescriptor;var nn=Object.getOwnPropertyNames;var sn=Object.prototype.hasOwnProperty;var on=(t,e)=>{for(var n in e)xe(t,n,{get:e[n],enumerable:!0})},rn=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of nn(e))!sn.call(t,o)&&o!==n&&xe(t,o,{get:()=>e[o],enumerable:!(s=tn(e,o))||s.enumerable});return t};var an=t=>rn(xe({},"__esModule",{value:!0}),t);var In={};on(In,{close:()=>Pt,default:()=>Tn,destroy:()=>St,getIdentity:()=>Ft,getTrackedElements:()=>Rt,identify:()=>Lt,init:()=>Ae,offEvent:()=>Dt,on:()=>Nt,onEvent:()=>Ot,open:()=>Et,reset:()=>Ht,sendMessage:()=>It,setupTrackedElements:()=>At,toggle:()=>Tt,trigger:()=>$t,uploadFile:()=>Ct,uploadFiles:()=>Mt});var le,w,Je,ln,J,Ve,Xe,Ye,Ge,ke,ye,be,pn,Z={},Ke=[],cn=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,pe=Array.isArray;function V(t,e){for(var n in e)t[n]=e[n];return t}function Se(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Ee(t,e,n){var s,o,a,r={};for(a in e)a=="key"?s=e[a]:a=="ref"?o=e[a]:r[a]=e[a];if(arguments.length>2&&(r.children=arguments.length>3?le.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)r[a]===void 0&&(r[a]=t.defaultProps[a]);return ie(t,r,s,o,null)}function ie(t,e,n,s,o){var a={type:t,props:e,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++Je,__i:-1,__u:0};return o==null&&w.vnode!=null&&w.vnode(a),a}function D(t){return t.children}function re(t,e){this.props=t,this.context=e}function Y(t,e){if(e==null)return t.__?Y(t.__,t.__i+1):null;for(var n;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?Y(t):null}function Qe(t){var e,n;if((t=t.__)!=null&&t.__c!=null){for(t.__e=t.__c.base=null,e=0;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null){t.__e=t.__c.base=n.__e;break}return Qe(t)}}function je(t){(!t.__d&&(t.__d=!0)&&J.push(t)&&!ae.__r++||Ve!=w.debounceRendering)&&((Ve=w.debounceRendering)||Xe)(ae)}function ae(){for(var t,e,n,s,o,a,r,c=1;J.length;)J.length>c&&J.sort(Ye),t=J.shift(),c=J.length,t.__d&&(n=void 0,s=void 0,o=(s=(e=t).__v).__e,a=[],r=[],e.__P&&((n=V({},s)).__v=s.__v+1,w.vnode&&w.vnode(n),Pe(e.__P,n,s,e.__n,e.__P.namespaceURI,32&s.__u?[o]:null,a,o??Y(s),!!(32&s.__u),r),n.__v=s.__v,n.__.__k[n.__i]=n,tt(a,n,r),s.__e=s.__=null,n.__e!=o&&Qe(n)));ae.__r=0}function Ze(t,e,n,s,o,a,r,c,u,p,g){var l,h,f,S,A,k,_,b=s&&s.__k||Ke,L=e.length;for(u=dn(n,e,b,u,L),l=0;l<L;l++)(f=n.__k[l])!=null&&(h=f.__i==-1?Z:b[f.__i]||Z,f.__i=l,k=Pe(t,f,h,o,a,r,c,u,p,g),S=f.__e,f.ref&&h.ref!=f.ref&&(h.ref&&Te(h.ref,null,f),g.push(f.ref,f.__c||S,f)),A==null&&S!=null&&(A=S),(_=!!(4&f.__u))||h.__k===f.__k?u=et(f,u,t,_):typeof f.type=="function"&&k!==void 0?u=k:S&&(u=S.nextSibling),f.__u&=-7);return n.__e=A,u}function dn(t,e,n,s,o){var a,r,c,u,p,g=n.length,l=g,h=0;for(t.__k=new Array(o),a=0;a<o;a++)(r=e[a])!=null&&typeof r!="boolean"&&typeof r!="function"?(typeof r=="string"||typeof r=="number"||typeof r=="bigint"||r.constructor==String?r=t.__k[a]=ie(null,r,null,null,null):pe(r)?r=t.__k[a]=ie(D,{children:r},null,null,null):r.constructor===void 0&&r.__b>0?r=t.__k[a]=ie(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):t.__k[a]=r,u=a+h,r.__=t,r.__b=t.__b+1,c=null,(p=r.__i=un(r,n,u,l))!=-1&&(l--,(c=n[p])&&(c.__u|=2)),c==null||c.__v==null?(p==-1&&(o>g?h--:o<g&&h++),typeof r.type!="function"&&(r.__u|=4)):p!=u&&(p==u-1?h--:p==u+1?h++:(p>u?h--:h++,r.__u|=4))):t.__k[a]=null;if(l)for(a=0;a<g;a++)(c=n[a])!=null&&(2&c.__u)==0&&(c.__e==s&&(s=Y(c)),st(c,c));return s}function et(t,e,n,s){var o,a;if(typeof t.type=="function"){for(o=t.__k,a=0;o&&a<o.length;a++)o[a]&&(o[a].__=t,e=et(o[a],e,n,s));return e}t.__e!=e&&(s&&(e&&t.type&&!e.parentNode&&(e=Y(t)),n.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function un(t,e,n,s){var o,a,r,c=t.key,u=t.type,p=e[n],g=p!=null&&(2&p.__u)==0;if(p===null&&c==null||g&&c==p.key&&u==p.type)return n;if(s>(g?1:0)){for(o=n-1,a=n+1;o>=0||a<e.length;)if((p=e[r=o>=0?o--:a++])!=null&&(2&p.__u)==0&&c==p.key&&u==p.type)return r}return-1}function Be(t,e,n){e[0]=="-"?t.setProperty(e,n??""):t[e]=n==null?"":typeof n!="number"||cn.test(e)?n:n+"px"}function oe(t,e,n,s,o){var a,r;e:if(e=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof s=="string"&&(t.style.cssText=s=""),s)for(e in s)n&&e in n||Be(t.style,e,"");if(n)for(e in n)s&&n[e]==s[e]||Be(t.style,e,n[e])}else if(e[0]=="o"&&e[1]=="n")a=e!=(e=e.replace(Ge,"$1")),r=e.toLowerCase(),e=r in t||e=="onFocusOut"||e=="onFocusIn"?r.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+a]=n,n?s?n.u=s.u:(n.u=ke,t.addEventListener(e,a?be:ye,a)):t.removeEventListener(e,a?be:ye,a);else{if(o=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&n==1?"":n))}}function qe(t){return function(e){if(this.l){var n=this.l[e.type+t];if(e.t==null)e.t=ke++;else if(e.t<n.u)return;return n(w.event?w.event(e):e)}}}function Pe(t,e,n,s,o,a,r,c,u,p){var g,l,h,f,S,A,k,_,b,L,H,B,U,X,W,F,O,R=e.type;if(e.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),a=[c=e.__e=n.__e]),(g=w.__b)&&g(e);e:if(typeof R=="function")try{if(_=e.props,b="prototype"in R&&R.prototype.render,L=(g=R.contextType)&&s[g.__c],H=g?L?L.props.value:g.__:s,n.__c?k=(l=e.__c=n.__c).__=l.__E:(b?e.__c=l=new R(_,H):(e.__c=l=new re(_,H),l.constructor=R,l.render=hn),L&&L.sub(l),l.state||(l.state={}),l.__n=s,h=l.__d=!0,l.__h=[],l._sb=[]),b&&l.__s==null&&(l.__s=l.state),b&&R.getDerivedStateFromProps!=null&&(l.__s==l.state&&(l.__s=V({},l.__s)),V(l.__s,R.getDerivedStateFromProps(_,l.__s))),f=l.props,S=l.state,l.__v=e,h)b&&R.getDerivedStateFromProps==null&&l.componentWillMount!=null&&l.componentWillMount(),b&&l.componentDidMount!=null&&l.__h.push(l.componentDidMount);else{if(b&&R.getDerivedStateFromProps==null&&_!==f&&l.componentWillReceiveProps!=null&&l.componentWillReceiveProps(_,H),e.__v==n.__v||!l.__e&&l.shouldComponentUpdate!=null&&l.shouldComponentUpdate(_,l.__s,H)===!1){for(e.__v!=n.__v&&(l.props=_,l.state=l.__s,l.__d=!1),e.__e=n.__e,e.__k=n.__k,e.__k.some(function(z){z&&(z.__=e)}),B=0;B<l._sb.length;B++)l.__h.push(l._sb[B]);l._sb=[],l.__h.length&&r.push(l);break e}l.componentWillUpdate!=null&&l.componentWillUpdate(_,l.__s,H),b&&l.componentDidUpdate!=null&&l.__h.push(function(){l.componentDidUpdate(f,S,A)})}if(l.context=H,l.props=_,l.__P=t,l.__e=!1,U=w.__r,X=0,b){for(l.state=l.__s,l.__d=!1,U&&U(e),g=l.render(l.props,l.state,l.context),W=0;W<l._sb.length;W++)l.__h.push(l._sb[W]);l._sb=[]}else do l.__d=!1,U&&U(e),g=l.render(l.props,l.state,l.context),l.state=l.__s;while(l.__d&&++X<25);l.state=l.__s,l.getChildContext!=null&&(s=V(V({},s),l.getChildContext())),b&&!h&&l.getSnapshotBeforeUpdate!=null&&(A=l.getSnapshotBeforeUpdate(f,S)),F=g,g!=null&&g.type===D&&g.key==null&&(F=nt(g.props.children)),c=Ze(t,pe(F)?F:[F],e,n,s,o,a,r,c,u,p),l.base=e.__e,e.__u&=-161,l.__h.length&&r.push(l),k&&(l.__E=l.__=null)}catch(z){if(e.__v=null,u||a!=null)if(z.then){for(e.__u|=u?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;a[a.indexOf(c)]=null,e.__e=c}else{for(O=a.length;O--;)Se(a[O]);we(e)}else e.__e=n.__e,e.__k=n.__k,z.then||we(e);w.__e(z,e,n)}else a==null&&e.__v==n.__v?(e.__k=n.__k,e.__e=n.__e):c=e.__e=gn(n.__e,e,n,s,o,a,r,u,p);return(g=w.diffed)&&g(e),128&e.__u?void 0:c}function we(t){t&&t.__c&&(t.__c.__e=!0),t&&t.__k&&t.__k.forEach(we)}function tt(t,e,n){for(var s=0;s<n.length;s++)Te(n[s],n[++s],n[++s]);w.__c&&w.__c(e,t),t.some(function(o){try{t=o.__h,o.__h=[],t.some(function(a){a.call(o)})}catch(a){w.__e(a,o.__v)}})}function nt(t){return typeof t!="object"||t==null||t.__b&&t.__b>0?t:pe(t)?t.map(nt):V({},t)}function gn(t,e,n,s,o,a,r,c,u){var p,g,l,h,f,S,A,k=n.props||Z,_=e.props,b=e.type;if(b=="svg"?o="http://www.w3.org/2000/svg":b=="math"?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),a!=null){for(p=0;p<a.length;p++)if((f=a[p])&&"setAttribute"in f==!!b&&(b?f.localName==b:f.nodeType==3)){t=f,a[p]=null;break}}if(t==null){if(b==null)return document.createTextNode(_);t=document.createElementNS(o,b,_.is&&_),c&&(w.__m&&w.__m(e,a),c=!1),a=null}if(b==null)k===_||c&&t.data==_||(t.data=_);else{if(a=a&&le.call(t.childNodes),!c&&a!=null)for(k={},p=0;p<t.attributes.length;p++)k[(f=t.attributes[p]).name]=f.value;for(p in k)if(f=k[p],p!="children"){if(p=="dangerouslySetInnerHTML")l=f;else if(!(p in _)){if(p=="value"&&"defaultValue"in _||p=="checked"&&"defaultChecked"in _)continue;oe(t,p,null,f,o)}}for(p in _)f=_[p],p=="children"?h=f:p=="dangerouslySetInnerHTML"?g=f:p=="value"?S=f:p=="checked"?A=f:c&&typeof f!="function"||k[p]===f||oe(t,p,f,k[p],o);if(g)c||l&&(g.__html==l.__html||g.__html==t.innerHTML)||(t.innerHTML=g.__html),e.__k=[];else if(l&&(t.innerHTML=""),Ze(e.type=="template"?t.content:t,pe(h)?h:[h],e,n,s,b=="foreignObject"?"http://www.w3.org/1999/xhtml":o,a,r,a?a[0]:n.__k&&Y(n,0),c,u),a!=null)for(p=a.length;p--;)Se(a[p]);c||(p="value",b=="progress"&&S==null?t.removeAttribute("value"):S!=null&&(S!==t[p]||b=="progress"&&!S||b=="option"&&S!=k[p])&&oe(t,p,S,k[p],o),p="checked",A!=null&&A!=t[p]&&oe(t,p,A,k[p],o))}return t}function Te(t,e,n){try{if(typeof t=="function"){var s=typeof t.__u=="function";s&&t.__u(),s&&e==null||(t.__u=t(e))}else t.current=e}catch(o){w.__e(o,n)}}function st(t,e,n){var s,o;if(w.unmount&&w.unmount(t),(s=t.ref)&&(s.current&&s.current!=t.__e||Te(s,null,e)),(s=t.__c)!=null){if(s.componentWillUnmount)try{s.componentWillUnmount()}catch(a){w.__e(a,e)}s.base=s.__P=null}if(s=t.__k)for(o=0;o<s.length;o++)s[o]&&st(s[o],e,n||typeof t.type!="function");n||Se(t.__e),t.__c=t.__=t.__e=void 0}function hn(t,e,n){return this.constructor(t,n)}function Ie(t,e,n){var s,o,a,r;e==document&&(e=document.documentElement),w.__&&w.__(t,e),o=(s=typeof n=="function")?null:n&&n.__k||e.__k,a=[],r=[],Pe(e,t=(!s&&n||e).__k=Ee(D,null,[t]),o||Z,Z,e.namespaceURI,!s&&n?[n]:o?null:e.firstChild?le.call(e.childNodes):null,a,!s&&n?n:o?o.__e:e.firstChild,s,r),tt(a,t,r)}le=Ke.slice,w={__e:function(t,e,n,s){for(var o,a,r;e=e.__;)if((o=e.__c)&&!o.__)try{if((a=o.constructor)&&a.getDerivedStateFromError!=null&&(o.setState(a.getDerivedStateFromError(t)),r=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(t,s||{}),r=o.__d),r)return o.__E=o}catch(c){t=c}throw t}},Je=0,ln=function(t){return t!=null&&t.constructor===void 0},re.prototype.setState=function(t,e){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=V({},this.state),typeof t=="function"&&(t=t(V({},n),this.props)),t&&V(n,t),t!=null&&this.__v&&(e&&this._sb.push(e),je(this))},re.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),je(this))},re.prototype.render=D,J=[],Xe=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ye=function(t,e){return t.__v.__b-e.__v.__b},ae.__r=0,Ge=/(PointerCapture)$|Capture$/i,ke=0,ye=qe(!1),be=qe(!0),pn=0;var ee,C,Ce,ot,te=0,ut=[],M=w,it=M.__b,rt=M.__r,at=M.diffed,lt=M.__c,pt=M.unmount,ct=M.__;function $e(t,e){M.__h&&M.__h(C,t,te||e),te=0;var n=C.__H||(C.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function $(t){return te=1,fn(mt,t)}function fn(t,e,n){var s=$e(ee++,2);if(s.t=t,!s.__c&&(s.__=[n?n(e):mt(void 0,e),function(c){var u=s.__N?s.__N[0]:s.__[0],p=s.t(u,c);u!==p&&(s.__N=[p,s.__[1]],s.__c.setState({}))}],s.__c=C,!C.__f)){var o=function(c,u,p){if(!s.__c.__H)return!0;var g=s.__c.__H.__.filter(function(h){return!!h.__c});if(g.every(function(h){return!h.__N}))return!a||a.call(this,c,u,p);var l=s.__c.props!==c;return g.forEach(function(h){if(h.__N){var f=h.__[0];h.__=h.__N,h.__N=void 0,f!==h.__[0]&&(l=!0)}}),a&&a.call(this,c,u,p)||l};C.__f=!0;var a=C.shouldComponentUpdate,r=C.componentWillUpdate;C.componentWillUpdate=function(c,u,p){if(this.__e){var g=a;a=void 0,o(c,u,p),a=g}r&&r.call(this,c,u,p)},C.shouldComponentUpdate=o}return s.__N||s.__}function j(t,e){var n=$e(ee++,3);!M.__s&&ft(n.__H,e)&&(n.__=t,n.u=e,C.__H.__h.push(n))}function G(t){return te=5,gt(function(){return{current:t}},[])}function gt(t,e){var n=$e(ee++,7);return ft(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function ht(t,e){return te=8,gt(function(){return t},e)}function mn(){for(var t;t=ut.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(ce),t.__H.__h.forEach(Me),t.__H.__h=[]}catch(e){t.__H.__h=[],M.__e(e,t.__v)}}M.__b=function(t){C=null,it&&it(t)},M.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),ct&&ct(t,e)},M.__r=function(t){rt&&rt(t),ee=0;var e=(C=t.__c).__H;e&&(Ce===C?(e.__h=[],C.__h=[],e.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.forEach(ce),e.__h.forEach(Me),e.__h=[],ee=0)),Ce=C},M.diffed=function(t){at&&at(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(ut.push(e)!==1&&ot===M.requestAnimationFrame||((ot=M.requestAnimationFrame)||_n)(mn)),e.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Ce=C=null},M.__c=function(t,e){e.some(function(n){try{n.__h.forEach(ce),n.__h=n.__h.filter(function(s){return!s.__||Me(s)})}catch(s){e.some(function(o){o.__h&&(o.__h=[])}),e=[],M.__e(s,n.__v)}}),lt&&lt(t,e)},M.unmount=function(t){pt&&pt(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.forEach(function(s){try{ce(s)}catch(o){e=o}}),n.__H=void 0,e&&M.__e(e,n.__v))};var dt=typeof requestAnimationFrame=="function";function _n(t){var e,n=function(){clearTimeout(s),dt&&cancelAnimationFrame(e),setTimeout(t)},s=setTimeout(n,35);dt&&(e=requestAnimationFrame(n))}function ce(t){var e=C,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),C=e}function Me(t){var e=C;t.__c=t.__(),C=e}function ft(t,e){return!t||t.length!==e.length||e.some(function(n,s){return n!==t[s]})}function mt(t,e){return typeof e=="function"?e(t):e}function _t(t,e){let n=e==="dark",s={bg:n?"#1f2937":"#ffffff",bgSecondary:n?"#374151":"#f3f4f6",text:n?"#f9fafb":"#111827",textSecondary:n?"#9ca3af":"#6b7280",border:n?"#4b5563":"#e5e7eb",messageBg:n?"#374151":"#f3f4f6"};return`
1
+ "use strict";var PocketPing=(()=>{var xe=Object.defineProperty;var nn=Object.getOwnPropertyDescriptor;var sn=Object.getOwnPropertyNames;var on=Object.prototype.hasOwnProperty;var rn=(t,e)=>{for(var n in e)xe(t,n,{get:e[n],enumerable:!0})},an=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of sn(e))!on.call(t,i)&&i!==n&&xe(t,i,{get:()=>e[i],enumerable:!(s=nn(e,i))||s.enumerable});return t};var pn=t=>an(xe({},"__esModule",{value:!0}),t);var Mn={};rn(Mn,{close:()=>Tt,default:()=>In,destroy:()=>St,getIdentity:()=>Wt,getTrackedElements:()=>Ot,identify:()=>Ht,init:()=>Ae,offEvent:()=>Lt,on:()=>Nt,onEvent:()=>Dt,open:()=>Pt,reset:()=>Ft,sendMessage:()=>Mt,setupTrackedElements:()=>Rt,toggle:()=>It,trigger:()=>At,uploadFile:()=>Ct,uploadFiles:()=>$t});var pe,w,Xe,ln,J,je,Ye,Ge,Ke,ke,ye,be,cn,Z={},Qe=[],dn=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,le=Array.isArray;function V(t,e){for(var n in e)t[n]=e[n];return t}function Ee(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function Se(t,e,n){var s,i,a,r={};for(a in e)a=="key"?s=e[a]:a=="ref"?i=e[a]:r[a]=e[a];if(arguments.length>2&&(r.children=arguments.length>3?pe.call(arguments,2):n),typeof t=="function"&&t.defaultProps!=null)for(a in t.defaultProps)r[a]===void 0&&(r[a]=t.defaultProps[a]);return oe(t,r,s,i,null)}function oe(t,e,n,s,i){var a={type:t,props:e,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:i??++Xe,__i:-1,__u:0};return i==null&&w.vnode!=null&&w.vnode(a),a}function D(t){return t.children}function re(t,e){this.props=t,this.context=e}function Y(t,e){if(e==null)return t.__?Y(t.__,t.__i+1):null;for(var n;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null)return n.__e;return typeof t.type=="function"?Y(t):null}function Ze(t){var e,n;if((t=t.__)!=null&&t.__c!=null){for(t.__e=t.__c.base=null,e=0;e<t.__k.length;e++)if((n=t.__k[e])!=null&&n.__e!=null){t.__e=t.__c.base=n.__e;break}return Ze(t)}}function Be(t){(!t.__d&&(t.__d=!0)&&J.push(t)&&!ae.__r++||je!=w.debounceRendering)&&((je=w.debounceRendering)||Ye)(ae)}function ae(){for(var t,e,n,s,i,a,r,c=1;J.length;)J.length>c&&J.sort(Ge),t=J.shift(),c=J.length,t.__d&&(n=void 0,s=void 0,i=(s=(e=t).__v).__e,a=[],r=[],e.__P&&((n=V({},s)).__v=s.__v+1,w.vnode&&w.vnode(n),Pe(e.__P,n,s,e.__n,e.__P.namespaceURI,32&s.__u?[i]:null,a,i??Y(s),!!(32&s.__u),r),n.__v=s.__v,n.__.__k[n.__i]=n,nt(a,n,r),s.__e=s.__=null,n.__e!=i&&Ze(n)));ae.__r=0}function et(t,e,n,s,i,a,r,c,u,l,g){var p,h,f,E,A,k,x,b=s&&s.__k||Qe,H=e.length;for(u=un(n,e,b,u,H),p=0;p<H;p++)(f=n.__k[p])!=null&&(h=f.__i==-1?Z:b[f.__i]||Z,f.__i=p,k=Pe(t,f,h,i,a,r,c,u,l,g),E=f.__e,f.ref&&h.ref!=f.ref&&(h.ref&&Te(h.ref,null,f),g.push(f.ref,f.__c||E,f)),A==null&&E!=null&&(A=E),(x=!!(4&f.__u))||h.__k===f.__k?u=tt(f,u,t,x):typeof f.type=="function"&&k!==void 0?u=k:E&&(u=E.nextSibling),f.__u&=-7);return n.__e=A,u}function un(t,e,n,s,i){var a,r,c,u,l,g=n.length,p=g,h=0;for(t.__k=new Array(i),a=0;a<i;a++)(r=e[a])!=null&&typeof r!="boolean"&&typeof r!="function"?(typeof r=="string"||typeof r=="number"||typeof r=="bigint"||r.constructor==String?r=t.__k[a]=oe(null,r,null,null,null):le(r)?r=t.__k[a]=oe(D,{children:r},null,null,null):r.constructor===void 0&&r.__b>0?r=t.__k[a]=oe(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):t.__k[a]=r,u=a+h,r.__=t,r.__b=t.__b+1,c=null,(l=r.__i=gn(r,n,u,p))!=-1&&(p--,(c=n[l])&&(c.__u|=2)),c==null||c.__v==null?(l==-1&&(i>g?h--:i<g&&h++),typeof r.type!="function"&&(r.__u|=4)):l!=u&&(l==u-1?h--:l==u+1?h++:(l>u?h--:h++,r.__u|=4))):t.__k[a]=null;if(p)for(a=0;a<g;a++)(c=n[a])!=null&&(2&c.__u)==0&&(c.__e==s&&(s=Y(c)),it(c,c));return s}function tt(t,e,n,s){var i,a;if(typeof t.type=="function"){for(i=t.__k,a=0;i&&a<i.length;a++)i[a]&&(i[a].__=t,e=tt(i[a],e,n,s));return e}t.__e!=e&&(s&&(e&&t.type&&!e.parentNode&&(e=Y(t)),n.insertBefore(t.__e,e||null)),e=t.__e);do e=e&&e.nextSibling;while(e!=null&&e.nodeType==8);return e}function gn(t,e,n,s){var i,a,r,c=t.key,u=t.type,l=e[n],g=l!=null&&(2&l.__u)==0;if(l===null&&c==null||g&&c==l.key&&u==l.type)return n;if(s>(g?1:0)){for(i=n-1,a=n+1;i>=0||a<e.length;)if((l=e[r=i>=0?i--:a++])!=null&&(2&l.__u)==0&&c==l.key&&u==l.type)return r}return-1}function qe(t,e,n){e[0]=="-"?t.setProperty(e,n??""):t[e]=n==null?"":typeof n!="number"||dn.test(e)?n:n+"px"}function ie(t,e,n,s,i){var a,r;e:if(e=="style")if(typeof n=="string")t.style.cssText=n;else{if(typeof s=="string"&&(t.style.cssText=s=""),s)for(e in s)n&&e in n||qe(t.style,e,"");if(n)for(e in n)s&&n[e]==s[e]||qe(t.style,e,n[e])}else if(e[0]=="o"&&e[1]=="n")a=e!=(e=e.replace(Ke,"$1")),r=e.toLowerCase(),e=r in t||e=="onFocusOut"||e=="onFocusIn"?r.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+a]=n,n?s?n.u=s.u:(n.u=ke,t.addEventListener(e,a?be:ye,a)):t.removeEventListener(e,a?be:ye,a);else{if(i=="http://www.w3.org/2000/svg")e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!="width"&&e!="height"&&e!="href"&&e!="list"&&e!="form"&&e!="tabIndex"&&e!="download"&&e!="rowSpan"&&e!="colSpan"&&e!="role"&&e!="popover"&&e in t)try{t[e]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&e[4]!="-"?t.removeAttribute(e):t.setAttribute(e,e=="popover"&&n==1?"":n))}}function Je(t){return function(e){if(this.l){var n=this.l[e.type+t];if(e.t==null)e.t=ke++;else if(e.t<n.u)return;return n(w.event?w.event(e):e)}}}function Pe(t,e,n,s,i,a,r,c,u,l){var g,p,h,f,E,A,k,x,b,H,R,B,N,X,U,F,L,O=e.type;if(e.constructor!==void 0)return null;128&n.__u&&(u=!!(32&n.__u),a=[c=e.__e=n.__e]),(g=w.__b)&&g(e);e:if(typeof O=="function")try{if(x=e.props,b="prototype"in O&&O.prototype.render,H=(g=O.contextType)&&s[g.__c],R=g?H?H.props.value:g.__:s,n.__c?k=(p=e.__c=n.__c).__=p.__E:(b?e.__c=p=new O(x,R):(e.__c=p=new re(x,R),p.constructor=O,p.render=fn),H&&H.sub(p),p.state||(p.state={}),p.__n=s,h=p.__d=!0,p.__h=[],p._sb=[]),b&&p.__s==null&&(p.__s=p.state),b&&O.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=V({},p.__s)),V(p.__s,O.getDerivedStateFromProps(x,p.__s))),f=p.props,E=p.state,p.__v=e,h)b&&O.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),b&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(b&&O.getDerivedStateFromProps==null&&x!==f&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(x,R),e.__v==n.__v||!p.__e&&p.shouldComponentUpdate!=null&&p.shouldComponentUpdate(x,p.__s,R)===!1){for(e.__v!=n.__v&&(p.props=x,p.state=p.__s,p.__d=!1),e.__e=n.__e,e.__k=n.__k,e.__k.some(function(z){z&&(z.__=e)}),B=0;B<p._sb.length;B++)p.__h.push(p._sb[B]);p._sb=[],p.__h.length&&r.push(p);break e}p.componentWillUpdate!=null&&p.componentWillUpdate(x,p.__s,R),b&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(f,E,A)})}if(p.context=R,p.props=x,p.__P=t,p.__e=!1,N=w.__r,X=0,b){for(p.state=p.__s,p.__d=!1,N&&N(e),g=p.render(p.props,p.state,p.context),U=0;U<p._sb.length;U++)p.__h.push(p._sb[U]);p._sb=[]}else do p.__d=!1,N&&N(e),g=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++X<25);p.state=p.__s,p.getChildContext!=null&&(s=V(V({},s),p.getChildContext())),b&&!h&&p.getSnapshotBeforeUpdate!=null&&(A=p.getSnapshotBeforeUpdate(f,E)),F=g,g!=null&&g.type===D&&g.key==null&&(F=st(g.props.children)),c=et(t,le(F)?F:[F],e,n,s,i,a,r,c,u,l),p.base=e.__e,e.__u&=-161,p.__h.length&&r.push(p),k&&(p.__E=p.__=null)}catch(z){if(e.__v=null,u||a!=null)if(z.then){for(e.__u|=u?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;a[a.indexOf(c)]=null,e.__e=c}else{for(L=a.length;L--;)Ee(a[L]);we(e)}else e.__e=n.__e,e.__k=n.__k,z.then||we(e);w.__e(z,e,n)}else a==null&&e.__v==n.__v?(e.__k=n.__k,e.__e=n.__e):c=e.__e=hn(n.__e,e,n,s,i,a,r,u,l);return(g=w.diffed)&&g(e),128&e.__u?void 0:c}function we(t){t&&t.__c&&(t.__c.__e=!0),t&&t.__k&&t.__k.forEach(we)}function nt(t,e,n){for(var s=0;s<n.length;s++)Te(n[s],n[++s],n[++s]);w.__c&&w.__c(e,t),t.some(function(i){try{t=i.__h,i.__h=[],t.some(function(a){a.call(i)})}catch(a){w.__e(a,i.__v)}})}function st(t){return typeof t!="object"||t==null||t.__b&&t.__b>0?t:le(t)?t.map(st):V({},t)}function hn(t,e,n,s,i,a,r,c,u){var l,g,p,h,f,E,A,k=n.props||Z,x=e.props,b=e.type;if(b=="svg"?i="http://www.w3.org/2000/svg":b=="math"?i="http://www.w3.org/1998/Math/MathML":i||(i="http://www.w3.org/1999/xhtml"),a!=null){for(l=0;l<a.length;l++)if((f=a[l])&&"setAttribute"in f==!!b&&(b?f.localName==b:f.nodeType==3)){t=f,a[l]=null;break}}if(t==null){if(b==null)return document.createTextNode(x);t=document.createElementNS(i,b,x.is&&x),c&&(w.__m&&w.__m(e,a),c=!1),a=null}if(b==null)k===x||c&&t.data==x||(t.data=x);else{if(a=a&&pe.call(t.childNodes),!c&&a!=null)for(k={},l=0;l<t.attributes.length;l++)k[(f=t.attributes[l]).name]=f.value;for(l in k)if(f=k[l],l!="children"){if(l=="dangerouslySetInnerHTML")p=f;else if(!(l in x)){if(l=="value"&&"defaultValue"in x||l=="checked"&&"defaultChecked"in x)continue;ie(t,l,null,f,i)}}for(l in x)f=x[l],l=="children"?h=f:l=="dangerouslySetInnerHTML"?g=f:l=="value"?E=f:l=="checked"?A=f:c&&typeof f!="function"||k[l]===f||ie(t,l,f,k[l],i);if(g)c||p&&(g.__html==p.__html||g.__html==t.innerHTML)||(t.innerHTML=g.__html),e.__k=[];else if(p&&(t.innerHTML=""),et(e.type=="template"?t.content:t,le(h)?h:[h],e,n,s,b=="foreignObject"?"http://www.w3.org/1999/xhtml":i,a,r,a?a[0]:n.__k&&Y(n,0),c,u),a!=null)for(l=a.length;l--;)Ee(a[l]);c||(l="value",b=="progress"&&E==null?t.removeAttribute("value"):E!=null&&(E!==t[l]||b=="progress"&&!E||b=="option"&&E!=k[l])&&ie(t,l,E,k[l],i),l="checked",A!=null&&A!=t[l]&&ie(t,l,A,k[l],i))}return t}function Te(t,e,n){try{if(typeof t=="function"){var s=typeof t.__u=="function";s&&t.__u(),s&&e==null||(t.__u=t(e))}else t.current=e}catch(i){w.__e(i,n)}}function it(t,e,n){var s,i;if(w.unmount&&w.unmount(t),(s=t.ref)&&(s.current&&s.current!=t.__e||Te(s,null,e)),(s=t.__c)!=null){if(s.componentWillUnmount)try{s.componentWillUnmount()}catch(a){w.__e(a,e)}s.base=s.__P=null}if(s=t.__k)for(i=0;i<s.length;i++)s[i]&&it(s[i],e,n||typeof t.type!="function");n||Ee(t.__e),t.__c=t.__=t.__e=void 0}function fn(t,e,n){return this.constructor(t,n)}function Ie(t,e,n){var s,i,a,r;e==document&&(e=document.documentElement),w.__&&w.__(t,e),i=(s=typeof n=="function")?null:n&&n.__k||e.__k,a=[],r=[],Pe(e,t=(!s&&n||e).__k=Se(D,null,[t]),i||Z,Z,e.namespaceURI,!s&&n?[n]:i?null:e.firstChild?pe.call(e.childNodes):null,a,!s&&n?n:i?i.__e:e.firstChild,s,r),nt(a,t,r)}pe=Qe.slice,w={__e:function(t,e,n,s){for(var i,a,r;e=e.__;)if((i=e.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(t)),r=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(t,s||{}),r=i.__d),r)return i.__E=i}catch(c){t=c}throw t}},Xe=0,ln=function(t){return t!=null&&t.constructor===void 0},re.prototype.setState=function(t,e){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=V({},this.state),typeof t=="function"&&(t=t(V({},n),this.props)),t&&V(n,t),t!=null&&this.__v&&(e&&this._sb.push(e),Be(this))},re.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),Be(this))},re.prototype.render=D,J=[],Ye=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ge=function(t,e){return t.__v.__b-e.__v.__b},ae.__r=0,Ke=/(PointerCapture)$|Capture$/i,ke=0,ye=Je(!1),be=Je(!0),cn=0;var ee,M,Me,ot,te=0,gt=[],C=w,rt=C.__b,at=C.__r,pt=C.diffed,lt=C.__c,ct=C.unmount,dt=C.__;function $e(t,e){C.__h&&C.__h(M,t,te||e),te=0;var n=M.__H||(M.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function $(t){return te=1,mn(_t,t)}function mn(t,e,n){var s=$e(ee++,2);if(s.t=t,!s.__c&&(s.__=[n?n(e):_t(void 0,e),function(c){var u=s.__N?s.__N[0]:s.__[0],l=s.t(u,c);u!==l&&(s.__N=[l,s.__[1]],s.__c.setState({}))}],s.__c=M,!M.__f)){var i=function(c,u,l){if(!s.__c.__H)return!0;var g=s.__c.__H.__.filter(function(h){return!!h.__c});if(g.every(function(h){return!h.__N}))return!a||a.call(this,c,u,l);var p=s.__c.props!==c;return g.forEach(function(h){if(h.__N){var f=h.__[0];h.__=h.__N,h.__N=void 0,f!==h.__[0]&&(p=!0)}}),a&&a.call(this,c,u,l)||p};M.__f=!0;var a=M.shouldComponentUpdate,r=M.componentWillUpdate;M.componentWillUpdate=function(c,u,l){if(this.__e){var g=a;a=void 0,i(c,u,l),a=g}r&&r.call(this,c,u,l)},M.shouldComponentUpdate=i}return s.__N||s.__}function j(t,e){var n=$e(ee++,3);!C.__s&&mt(n.__H,e)&&(n.__=t,n.u=e,M.__H.__h.push(n))}function G(t){return te=5,ht(function(){return{current:t}},[])}function ht(t,e){var n=$e(ee++,7);return mt(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function ft(t,e){return te=8,ht(function(){return t},e)}function _n(){for(var t;t=gt.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(ce),t.__H.__h.forEach(Ce),t.__H.__h=[]}catch(e){t.__H.__h=[],C.__e(e,t.__v)}}C.__b=function(t){M=null,rt&&rt(t)},C.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),dt&&dt(t,e)},C.__r=function(t){at&&at(t),ee=0;var e=(M=t.__c).__H;e&&(Me===M?(e.__h=[],M.__h=[],e.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(e.__h.forEach(ce),e.__h.forEach(Ce),e.__h=[],ee=0)),Me=M},C.diffed=function(t){pt&&pt(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(gt.push(e)!==1&&ot===C.requestAnimationFrame||((ot=C.requestAnimationFrame)||vn)(_n)),e.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),Me=M=null},C.__c=function(t,e){e.some(function(n){try{n.__h.forEach(ce),n.__h=n.__h.filter(function(s){return!s.__||Ce(s)})}catch(s){e.some(function(i){i.__h&&(i.__h=[])}),e=[],C.__e(s,n.__v)}}),lt&&lt(t,e)},C.unmount=function(t){ct&&ct(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.forEach(function(s){try{ce(s)}catch(i){e=i}}),n.__H=void 0,e&&C.__e(e,n.__v))};var ut=typeof requestAnimationFrame=="function";function vn(t){var e,n=function(){clearTimeout(s),ut&&cancelAnimationFrame(e),setTimeout(t)},s=setTimeout(n,35);ut&&(e=requestAnimationFrame(n))}function ce(t){var e=M,n=t.__c;typeof n=="function"&&(t.__c=void 0,n()),M=e}function Ce(t){var e=M;t.__c=t.__(),M=e}function mt(t,e){return!t||t.length!==e.length||e.some(function(n,s){return n!==t[s]})}function _t(t,e){return typeof e=="function"?e(t):e}function vt(t,e){let n=e==="dark",s={bg:n?"#1f2937":"#ffffff",bgSecondary:n?"#374151":"#f3f4f6",text:n?"#f9fafb":"#111827",textSecondary:n?"#9ca3af":"#6b7280",border:n?"#4b5563":"#e5e7eb",messageBg:n?"#374151":"#f3f4f6"};return`
2
2
  #pocketping-container {
3
3
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
4
4
  font-size: 14px;
@@ -92,6 +92,7 @@
92
92
  flex-direction: column;
93
93
  overflow: hidden;
94
94
  z-index: 9998;
95
+ transition: max-height 0.2s ease, bottom 0.2s ease;
95
96
  }
96
97
 
97
98
  .pp-window.pp-bottom-right {
@@ -108,13 +109,21 @@
108
109
  .pp-window {
109
110
  width: calc(100vw - 20px);
110
111
  height: auto;
112
+ min-height: 300px;
111
113
  max-height: calc(100vh - 100px);
112
- max-height: calc(100dvh - 100px);
114
+ max-height: calc(100svh - 100px); /* svh = small viewport, excludes keyboard */
113
115
  bottom: 80px;
114
116
  right: 10px;
115
117
  left: 10px;
116
118
  border-radius: 12px;
117
119
  }
120
+
121
+ /* When keyboard is likely open (input focused), reduce height */
122
+ .pp-window:has(.pp-input:focus) {
123
+ max-height: calc(50vh - 20px);
124
+ max-height: calc(50svh - 20px);
125
+ bottom: 10px;
126
+ }
118
127
  }
119
128
 
120
129
  .pp-header {
@@ -905,17 +914,52 @@
905
914
  text-overflow: ellipsis;
906
915
  }
907
916
 
917
+ /* Clickable reply quote */
918
+ .pp-reply-quote-clickable {
919
+ cursor: pointer;
920
+ transition: background 0.15s, transform 0.1s;
921
+ }
922
+
923
+ .pp-reply-quote-clickable:hover {
924
+ background: ${n?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.08)"};
925
+ }
926
+
927
+ .pp-reply-quote-clickable:active {
928
+ transform: scale(0.98);
929
+ }
930
+
908
931
  /* Reply quote in visitor message bubble needs higher contrast */
909
932
  .pp-message-visitor .pp-reply-quote {
910
933
  background: rgba(255, 255, 255, 0.18);
911
934
  border-left-color: rgba(255, 255, 255, 0.7);
912
935
  }
913
936
 
937
+ .pp-message-visitor .pp-reply-quote-clickable:hover {
938
+ background: rgba(255, 255, 255, 0.25);
939
+ }
940
+
914
941
  .pp-message-visitor .pp-reply-sender,
915
942
  .pp-message-visitor .pp-reply-content {
916
943
  color: rgba(255, 255, 255, 0.9);
917
944
  }
918
945
 
946
+ /* Message highlight animation (when scrolling to a message) */
947
+ .pp-message-highlight {
948
+ animation: pp-highlight-pulse 1.5s ease-out;
949
+ }
950
+
951
+ @keyframes pp-highlight-pulse {
952
+ 0% {
953
+ box-shadow: 0 0 0 0 ${t}80;
954
+ }
955
+ 30% {
956
+ box-shadow: 0 0 0 6px ${t}40;
957
+ }
958
+ 100% {
959
+ box-shadow: 0 0 0 0 ${t}00;
960
+ }
961
+ }
962
+
919
963
  /* Deleted Message */
920
964
  .pp-message-deleted {
921
965
  opacity: 0.6;
@@ -940,7 +984,7 @@
940
984
  margin-left: 4px;
941
985
  font-style: italic;
942
986
  }
943
- `}var vn=0;function i(t,e,n,s,o,a){e||(e={});var r,c,u=e;if("ref"in u)for(c in u={},e)c=="ref"?r=e[c]:u[c]=e[c];var p={type:t,props:u,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--vn,__i:-1,__u:0,__source:o,__self:a};if(typeof t=="function"&&(r=t.defaultProps))for(c in r)u[c]===void 0&&(u[c]=r[c]);return w.vnode&&w.vnode(p),p}function wt({client:t,config:e}){let[n,s]=$(!1),[o,a]=$([]),[r,c]=$(""),[u,p]=$(!1),[g,l]=$(!1),[h,f]=$(!1),[S,A]=$(0),[k,_]=$([]),[b,L]=$(!1),[H,B]=$(null),[U,X]=$(null),[W,F]=$(""),[O,R]=$(null),[z,ge]=$(!1),[Ut,Re]=$(null),[Oe,De]=$(null),[N,he]=$(e),fe=G(null),me=G(null),Le=G(null),Wt=G(null);j(()=>{let d=t.on("openChange",s),v=t.on("message",()=>{a([...t.getMessages()])}),P=t.on("typing",m=>{p(m.isTyping)}),x=t.on("presence",m=>{l(m.online)}),E=t.on("connect",()=>{f(!0),a(t.getMessages()),l(t.getSession()?.operatorOnline??!1),he(t.getConfig())}),T=t.on("configUpdate",()=>{he(t.getConfig())});return t.isConnected()&&(f(!0),a(t.getMessages()),l(t.getSession()?.operatorOnline??!1),he(t.getConfig())),()=>{d(),v(),P(),x(),E(),T()}},[t]),j(()=>{n&&fe.current?.scrollIntoView({behavior:"smooth"})},[o,n]),j(()=>{n&&(setTimeout(()=>{fe.current?.scrollIntoView({behavior:"auto"})},50),me.current?.focus(),A(0))},[n]),j(()=>{if(!n&&o.length>0){let d=o.filter(v=>v.sender!=="visitor"&&v.status!=="read").length;A(d)}},[o,n]);let se=ht(()=>{if(!n||!h)return;let d=o.filter(v=>v.sender!=="visitor"&&v.status!=="read");if(d.length>0){let v=d.map(P=>P.id);t.sendReadStatus(v,"read")}},[n,h,o,t]);if(j(()=>{if(!n||!h)return;let d=setTimeout(()=>{se()},1e3);return()=>clearTimeout(d)},[n,h,o,se]),j(()=>{let d=()=>{document.visibilityState==="visible"&&n&&se()};return document.addEventListener("visibilitychange",d),()=>document.removeEventListener("visibilitychange",d)},[n,se]),j(()=>{let d=t.on("read",()=>{a([...t.getMessages()])});return()=>d()},[t]),!xn(N))return null;let zt=async d=>{d.preventDefault();let v=r.trim().length>0,P=k.filter(m=>m.status==="ready"&&m.attachment);if(!v&&P.length===0)return;let x=r,E=P.map(m=>m.attachment.id),T=H?.id;c(""),_([]),B(null);try{await t.sendMessage(x,E,T)}catch(m){console.error("[PocketPing] Failed to send message:",m)}},Vt=d=>{let v=d.target;c(v.value),t.sendTyping(!0)},jt=async d=>{let v=d.target,P=v.files;if(!P||P.length===0)return;let x=[];for(let E=0;E<P.length;E++){let T=P[E],m=`pending-${Date.now()}-${E}`,I;T.type.startsWith("image/")&&(I=URL.createObjectURL(T)),x.push({id:m,file:T,preview:I,progress:0,status:"pending"})}_(E=>[...E,...x]),v.value="",L(!0);for(let E of x)try{_(m=>m.map(I=>I.id===E.id?{...I,status:"uploading"}:I));let T=await t.uploadFile(E.file,m=>{_(I=>I.map(ve=>ve.id===E.id?{...ve,progress:m}:ve))});_(m=>m.map(I=>I.id===E.id?{...I,status:"ready",progress:100,attachment:T}:I))}catch(T){console.error("[PocketPing] Failed to upload file:",T),_(m=>m.map(I=>I.id===E.id?{...I,status:"error",error:"Upload failed"}:I))}L(!1)},Bt=d=>{_(v=>{let P=v.find(x=>x.id===d);return P?.preview&&URL.revokeObjectURL(P.preview),v.filter(x=>x.id!==d)})},He=d=>{B(d),R(null),me.current?.focus()},qt=()=>{B(null)},Fe=d=>{d.sender==="visitor"&&(X(d),F(d.content),R(null))},Ne=()=>{X(null),F("")},Jt=async()=>{if(!(!U||!W.trim()))try{await t.editMessage(U.id,W.trim()),X(null),F("")}catch(d){console.error("[PocketPing] Failed to edit message:",d)}},Ue=async d=>{if(d.sender==="visitor"&&(R(null),confirm("Delete this message?")))try{await t.deleteMessage(d.id)}catch(v){console.error("[PocketPing] Failed to delete message:",v)}},Xt=(d,v)=>{d.preventDefault();let P=d;R({message:v,x:P.clientX,y:P.clientY})},Yt=d=>{let v=setTimeout(()=>{navigator.vibrate&&navigator.vibrate(50),R({message:d,x:window.innerWidth/2-60,y:window.innerHeight/2-50})},500);De(v)},We=()=>{Oe&&(clearTimeout(Oe),De(null))};j(()=>{if(!O)return;let d=()=>R(null);return document.addEventListener("click",d),()=>document.removeEventListener("click",d)},[O]);let K=G(0),Gt=d=>{d.preventDefault(),d.stopPropagation(),K.current++,K.current===1&&ge(!0)},Kt=d=>{d.preventDefault(),d.stopPropagation()},Qt=d=>{d.preventDefault(),d.stopPropagation(),K.current--,K.current===0&&ge(!1)},Zt=async d=>{d.preventDefault(),d.stopPropagation(),K.current=0,ge(!1);let v=d.dataTransfer?.files;if(!v||v.length===0)return;let P=[];for(let x=0;x<v.length;x++){let E=v[x],T=`pending-${Date.now()}-${x}`,m;E.type.startsWith("image/")&&(m=URL.createObjectURL(E)),P.push({id:T,file:E,preview:m,progress:0,status:"pending"})}_(x=>[...x,...P]),L(!0);for(let x of P)try{_(T=>T.map(m=>m.id===x.id?{...m,status:"uploading"}:m));let E=await t.uploadFile(x.file,T=>{_(m=>m.map(I=>I.id===x.id?{...I,progress:T}:I))});_(T=>T.map(m=>m.id===x.id?{...m,status:"ready",progress:100,attachment:E}:m))}catch(E){console.error("[PocketPing] Failed to upload dropped file:",E),_(T=>T.map(m=>m.id===x.id?{...m,status:"error",error:"Upload failed"}:m))}L(!1)},ze=N.position??"bottom-right",_e=yn(N.theme??"auto"),en=N.primaryColor??"#6366f1",Q=_e==="dark"?"#9ca3af":"#6b7280";return i(D,{children:[i("style",{children:_t(en,_e)}),i("button",{class:`pp-toggle pp-${ze}`,onClick:()=>t.toggleOpen(),"aria-label":n?"Close chat":"Open chat",children:[n?i(ne,{}):i(wn,{}),!n&&S>0&&i("span",{class:"pp-unread-badge",children:S>9?"9+":S}),!n&&S===0&&g&&i("span",{class:"pp-online-dot"})]}),n&&i("div",{class:`pp-window pp-${ze} pp-theme-${_e} ${z?"pp-dragging":""}`,onDragEnter:Gt,onDragOver:Kt,onDragLeave:Qt,onDrop:Zt,children:[z&&i("div",{class:"pp-drop-overlay",children:[i("div",{class:"pp-drop-icon",children:i(vt,{})}),i("div",{class:"pp-drop-text",children:"Drop files to upload"})]}),i("div",{class:"pp-header",children:[i("div",{class:"pp-header-info",children:[N.operatorAvatar&&i("img",{src:N.operatorAvatar,alt:"",class:"pp-avatar"}),i("div",{children:[i("div",{class:"pp-header-title",children:N.operatorName??"Support"}),i("div",{class:"pp-header-status",children:g?i(D,{children:[i("span",{class:"pp-status-dot pp-online"})," Online"]}):i(D,{children:[i("span",{class:"pp-status-dot"})," Away"]})})]})]}),i("button",{class:"pp-close-btn",onClick:()=>t.setOpen(!1),"aria-label":"Close chat",children:i(ne,{})})]}),i("div",{class:"pp-messages",ref:Wt,children:[N.welcomeMessage&&o.length===0&&i("div",{class:"pp-welcome",children:N.welcomeMessage}),o.map(d=>{let v=!!d.deletedAt,P=!!d.editedAt,x=null;if(d.replyTo)if(typeof d.replyTo=="object")x=d.replyTo;else{let m=o.find(I=>I.id===d.replyTo);m&&(x={sender:m.sender,content:m.content,deleted:!!m.deletedAt})}let T=Ut===d.id&&!v;return i("div",{class:`pp-message pp-message-${d.sender} ${v?"pp-message-deleted":""}`,onContextMenu:m=>Xt(m,d),onMouseEnter:()=>Re(d.id),onMouseLeave:()=>Re(null),onTouchStart:()=>Yt(d),onTouchEnd:We,onTouchCancel:We,children:[T&&i("div",{class:`pp-message-actions ${d.sender==="visitor"?"pp-actions-left":"pp-actions-right"}`,children:[i("button",{class:"pp-action-btn",onClick:()=>He(d),title:"Reply",children:i(xt,{color:Q})}),d.sender==="visitor"&&i(D,{children:[i("button",{class:"pp-action-btn",onClick:()=>Fe(d),title:"Edit",children:i(yt,{color:Q})}),i("button",{class:"pp-action-btn pp-action-delete",onClick:()=>Ue(d),title:"Delete",children:i(bt,{color:Q})})]})]}),x&&x.content&&i("div",{class:"pp-reply-quote",children:[i("span",{class:"pp-reply-sender",children:x.sender==="visitor"?"You":"Support"}),i("span",{class:"pp-reply-content",children:[x.deleted?"Message deleted":(x.content||"").slice(0,50),(x.content||"").length>50?"...":""]})]}),v?i("div",{class:"pp-message-content pp-deleted-content",children:[i("span",{class:"pp-deleted-icon",children:"\u{1F5D1}\uFE0F"})," Message deleted"]}):i(D,{children:[d.content&&i("div",{class:"pp-message-content",children:d.content}),d.attachments&&d.attachments.length>0&&i("div",{class:"pp-message-attachments",children:d.attachments.map(m=>i(En,{attachment:m},m.id))})]}),i("div",{class:"pp-message-time",children:[bn(d.timestamp),P&&!v&&i("span",{class:"pp-edited-badge",children:"edited"}),d.sender==="ai"&&i("span",{class:"pp-ai-badge",children:"AI"}),d.sender==="visitor"&&!v&&i("span",{class:`pp-status pp-status-${d.status??"sent"}`,children:i(Sn,{status:d.status})})]})]},d.id)}),u&&i("div",{class:"pp-message pp-message-operator pp-typing",children:[i("span",{}),i("span",{}),i("span",{})]}),i("div",{ref:fe})]}),O&&i("div",{class:"pp-message-menu",style:{top:`${O.y}px`,left:`${O.x}px`},children:[i("button",{onClick:()=>He(O.message),children:[i(xt,{color:Q})," Reply"]}),O.message.sender==="visitor"&&!O.message.deletedAt&&i(D,{children:[i("button",{onClick:()=>Fe(O.message),children:[i(yt,{color:Q})," Edit"]}),i("button",{class:"pp-menu-delete",onClick:()=>Ue(O.message),children:[i(bt,{color:"#ef4444"})," Delete"]})]})]}),U&&i("div",{class:"pp-edit-modal",children:[i("div",{class:"pp-edit-header",children:[i("span",{children:"Edit message"}),i("button",{onClick:Ne,children:i(ne,{})})]}),i("textarea",{class:"pp-edit-input",value:W,onInput:d=>F(d.target.value),autoFocus:!0}),i("div",{class:"pp-edit-actions",children:[i("button",{class:"pp-edit-cancel",onClick:Ne,children:"Cancel"}),i("button",{class:"pp-edit-save",onClick:Jt,disabled:!W.trim(),children:"Save"})]})]}),H&&i("div",{class:"pp-reply-preview",children:[i("div",{class:"pp-reply-preview-content",children:[i("span",{class:"pp-reply-label",children:"Replying to"}),i("span",{class:"pp-reply-text",children:[H.content.slice(0,50),H.content.length>50?"...":""]})]}),i("button",{class:"pp-reply-cancel",onClick:qt,children:i(ne,{})})]}),k.length>0&&i("div",{class:"pp-attachments-preview",children:k.map(d=>i("div",{class:`pp-attachment-preview pp-attachment-${d.status}`,children:[d.preview?i("img",{src:d.preview,alt:d.file.name,class:"pp-preview-img"}):i("div",{class:"pp-preview-file",children:i(kt,{mimeType:d.file.type})}),i("button",{class:"pp-remove-attachment",onClick:()=>Bt(d.id),"aria-label":"Remove attachment",type:"button",children:i(ne,{})}),d.status==="uploading"&&i("div",{class:"pp-upload-progress",style:{width:`${d.progress}%`}}),d.status==="error"&&i("div",{class:"pp-upload-error",title:d.error,children:"!"})]},d.id))}),i("form",{class:"pp-input-form",onSubmit:zt,children:[i("input",{ref:d=>{Le.current=d,d&&(d.onchange=jt)},type:"file",class:"pp-file-input",accept:"image/*,audio/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.txt",multiple:!0}),i("button",{type:"button",class:"pp-attach-btn",onClick:()=>Le.current?.click(),disabled:!h||b,"aria-label":"Attach file",children:i(vt,{})}),i("input",{ref:me,type:"text",class:"pp-input",placeholder:N.placeholder??"Type a message...",value:r,onInput:Vt,disabled:!h}),i("button",{type:"submit",class:"pp-send-btn",disabled:!r.trim()&&k.filter(d=>d.status==="ready").length===0||!h||b,"aria-label":"Send message",children:i(kn,{})})]}),i("div",{class:"pp-footer",children:["Powered by ",i("a",{href:"https://pocketping.io",target:"_blank",rel:"noopener",children:"PocketPing"})]})]})]})}function xn(t){let e=window.location.pathname;return t.hideOnPages?.some(n=>new RegExp(n).test(e))?!1:t.showOnPages?.length?t.showOnPages.some(n=>new RegExp(n).test(e)):!0}function yn(t){return t==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":t}function bn(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function wn(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:i("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function ne(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),i("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function kn(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),i("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]})}function Sn({status:t}){return!t||t==="sending"||t==="sent"?i("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check",children:i("polyline",{points:"3 8 7 12 13 4"})}):t==="delivered"?i("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double",children:[i("polyline",{points:"1 8 5 12 11 4"}),i("polyline",{points:"7 8 11 12 17 4"})]}):t==="read"?i("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double pp-check-read",children:[i("polyline",{points:"1 8 5 12 11 4"}),i("polyline",{points:"7 8 11 12 17 4"})]}):null}function vt(){return i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:i("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"})})}function xt({color:t,size:e=16}){return i("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[i("polyline",{points:"9 17 4 12 9 7"}),i("path",{d:"M20 18v-2a4 4 0 0 0-4-4H4"})]})}function yt({color:t,size:e=16}){return i("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:i("path",{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"})})}function bt({color:t,size:e=16}){return i("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[i("polyline",{points:"3 6 5 6 21 6"}),i("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})]})}function kt({mimeType:t}){return t==="application/pdf"?i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),i("polyline",{points:"14 2 14 8 20 8"}),i("path",{d:"M9 15h6"}),i("path",{d:"M9 11h6"})]}):t.startsWith("audio/")?i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("path",{d:"M9 18V5l12-2v13"}),i("circle",{cx:"6",cy:"18",r:"3"}),i("circle",{cx:"18",cy:"16",r:"3"})]}):t.startsWith("video/")?i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("rect",{x:"2",y:"2",width:"20",height:"20",rx:"2.18",ry:"2.18"}),i("line",{x1:"7",y1:"2",x2:"7",y2:"22"}),i("line",{x1:"17",y1:"2",x2:"17",y2:"22"}),i("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),i("line",{x1:"2",y1:"7",x2:"7",y2:"7"}),i("line",{x1:"2",y1:"17",x2:"7",y2:"17"}),i("line",{x1:"17",y1:"17",x2:"22",y2:"17"}),i("line",{x1:"17",y1:"7",x2:"22",y2:"7"})]}):i("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[i("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),i("polyline",{points:"14 2 14 8 20 8"})]})}function En({attachment:t}){let e=t.mimeType.startsWith("image/"),n=t.mimeType.startsWith("audio/"),s=t.mimeType.startsWith("video/"),o=a=>a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`;return e?i("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-image",children:i("img",{src:t.thumbnailUrl||t.url,alt:t.filename})}):n?i("div",{class:"pp-attachment pp-attachment-audio",children:[i("audio",{controls:!0,preload:"metadata",children:i("source",{src:t.url,type:t.mimeType})}),i("span",{class:"pp-attachment-name",children:t.filename})]}):s?i("div",{class:"pp-attachment pp-attachment-video",children:i("video",{controls:!0,preload:"metadata",children:i("source",{src:t.url,type:t.mimeType})})}):i("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-file",children:[i(kt,{mimeType:t.mimeType}),i("div",{class:"pp-attachment-info",children:[i("span",{class:"pp-attachment-name",children:t.filename}),i("span",{class:"pp-attachment-size",children:o(t.size)})]})]})}var de="0.3.6";var ue=class{constructor(e){this.session=null;this.ws=null;this.sse=null;this.isOpen=!1;this.listeners=new Map;this.customEventHandlers=new Map;this.reconnectAttempts=0;this.maxReconnectAttempts=5;this.reconnectTimeout=null;this.pollingTimeout=null;this.pollingFailures=0;this.maxPollingFailures=10;this.wsConnectedAt=0;this.quickFailureThreshold=2e3;this.connectionMode="none";this.trackedElementCleanups=[];this.currentTrackedElements=[];this.inspectorMode=!1;this.inspectorCleanup=null;this.config=e}async connect(){let e=this.getOrCreateVisitorId(),n=this.getStoredSessionId(),s=this.getStoredIdentity(),a=new URLSearchParams(window.location.search).get("pp_inspector"),r=await this.fetch("/connect",{method:"POST",body:JSON.stringify({visitorId:e,sessionId:n,inspectorToken:a||void 0,metadata:{url:window.location.href,referrer:document.referrer||void 0,pageTitle:document.title||void 0,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,language:navigator.language,screenResolution:`${window.screen.width}x${window.screen.height}`},identity:s||void 0})});return this.session={sessionId:r.sessionId,visitorId:r.visitorId,operatorOnline:r.operatorOnline??!1,messages:r.messages??[],identity:r.identity||s||void 0},r.operatorName&&(this.config.operatorName=r.operatorName),r.operatorAvatar&&(this.config.operatorAvatar=r.operatorAvatar),r.primaryColor&&(this.config.primaryColor=r.primaryColor),r.welcomeMessage&&(this.config.welcomeMessage=r.welcomeMessage),this.emit("configUpdate",{operatorName:this.config.operatorName,operatorAvatar:this.config.operatorAvatar,primaryColor:this.config.primaryColor,welcomeMessage:this.config.welcomeMessage}),this.storeSessionId(r.sessionId),this.connectRealtime(),r.inspectorMode?this.enableInspectorMode():r.trackedElements?.length&&this.setupTrackedElements(r.trackedElements),this.emit("connect",this.session),this.config.onConnect?.(r.sessionId),this.session}disconnect(){this.ws&&(this.ws.onclose=null,this.ws.onmessage=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null),this.sse&&(this.sse.close(),this.sse=null),this.session=null,this.connectionMode="none",this.reconnectTimeout&&clearTimeout(this.reconnectTimeout),this.stopPolling(),this.cleanupTrackedElements(),this.disableInspectorMode()}async sendMessage(e,n,s){if(!this.session)throw new Error("Not connected");let o=`temp-${this.generateId()}`,a={id:o,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:new Date().toISOString(),status:"sending",replyTo:s};this.session.messages.push(a),this.emit("message",a);try{let r=await this.fetch("/message",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,content:e,sender:"visitor",attachmentIds:n||[],replyTo:s})}),c=this.session.messages.findIndex(p=>p.id===o);c>=0&&(this.session.messages[c].id=r.messageId,this.session.messages[c].timestamp=r.timestamp,this.session.messages[c].status="sent",r.attachments&&r.attachments.length>0&&(this.session.messages[c].attachments=r.attachments),this.emit("message",this.session.messages[c]));let u=this.session.messages[c]||{id:r.messageId,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:r.timestamp,status:"sent",attachments:r.attachments};return this.config.onMessage?.(u),u}catch(r){let c=this.session.messages.findIndex(u=>u.id===o);throw c>=0&&(this.session.messages.splice(c,1),this.emit("message",a)),r}}async uploadFile(e,n){if(!this.session)throw new Error("Not connected");this.emit("uploadStart",{filename:e.name,size:e.size});try{let s=await this.fetch("/upload",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,filename:e.name,mimeType:e.type||"application/octet-stream",size:e.size})});n?.(10),this.emit("uploadProgress",{filename:e.name,progress:10}),await this.uploadToPresignedUrl(s.uploadUrl,e,a=>{let r=10+a*.8;n?.(r),this.emit("uploadProgress",{filename:e.name,progress:r})});let o=await this.fetch("/upload/complete",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,attachmentId:s.attachmentId})});return n?.(100),this.emit("uploadComplete",o),{id:o.id,filename:o.filename,mimeType:o.mimeType,size:o.size,url:o.url,thumbnailUrl:o.thumbnailUrl,status:o.status}}catch(s){throw this.emit("uploadError",{filename:e.name,error:s}),s}}async uploadFiles(e,n){let s=[],o=e.length;for(let a=0;a<o;a++){let r=e[a],c=a/o*100,u=100/o,p=await this.uploadFile(r,g=>{let l=c+g/100*u;n?.(l)});s.push(p)}return s}uploadToPresignedUrl(e,n,s){return new Promise((o,a)=>{let r=new XMLHttpRequest;r.upload.addEventListener("progress",c=>{if(c.lengthComputable){let u=c.loaded/c.total*100;s?.(u)}}),r.addEventListener("load",()=>{r.status>=200&&r.status<300?o():a(new Error(`Upload failed with status ${r.status}`))}),r.addEventListener("error",()=>{a(new Error("Upload failed"))}),r.open("PUT",e),r.setRequestHeader("Content-Type",n.type||"application/octet-stream"),r.send(n)})}async fetchMessages(e){if(!this.session)throw new Error("Not connected");let n=new URLSearchParams({sessionId:this.session.sessionId});return e&&n.set("after",e),(await this.fetch(`/messages?${n}`,{method:"GET"})).messages}async sendTyping(e=!0){this.session&&await this.fetch("/typing",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,sender:"visitor",isTyping:e})})}async sendReadStatus(e,n){if(!(!this.session||e.length===0))try{await this.fetch("/read",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,messageIds:e,status:n})});for(let s of this.session.messages)e.includes(s.id)&&(s.status=n,n==="delivered"?s.deliveredAt=new Date().toISOString():n==="read"&&(s.readAt=new Date().toISOString()));this.emit("readStatusSent",{messageIds:e,status:n})}catch(s){console.error("[PocketPing] Failed to send read status:",s)}}async editMessage(e,n){if(!this.session)throw new Error("Not connected");let s=await this.fetch(`/message/${e}`,{method:"PATCH",body:JSON.stringify({sessionId:this.session.sessionId,content:n})}),o=this.session.messages.findIndex(a=>a.id===e);return o>=0&&(this.session.messages[o].content=s.message.content,this.session.messages[o].editedAt=s.message.editedAt,this.emit("messageEdited",this.session.messages[o])),this.session.messages[o]}async deleteMessage(e){if(!this.session)throw new Error("Not connected");let n=await this.fetch(`/message/${e}`,{method:"DELETE",body:JSON.stringify({sessionId:this.session.sessionId})});if(n.deleted){let s=this.session.messages.findIndex(o=>o.id===e);s>=0&&(this.session.messages[s].deletedAt=new Date().toISOString(),this.session.messages[s].content="",this.emit("messageDeleted",this.session.messages[s]))}return n.deleted}async getPresence(){return this.fetch("/presence",{method:"GET"})}async identify(e){if(!e?.id)throw new Error("[PocketPing] identity.id is required");if(this.storeIdentity(e),this.session)try{await this.fetch("/identify",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,identity:e})}),this.session.identity=e,this.emit("identify",e)}catch(n){throw console.error("[PocketPing] Failed to identify:",n),n}}async reset(e){this.clearIdentity(),this.session&&(this.session.identity=void 0),e?.newSession&&(localStorage.removeItem("pocketping_session_id"),localStorage.removeItem("pocketping_visitor_id"),this.disconnect(),await this.connect()),this.emit("reset",null)}getIdentity(){return this.session?.identity||this.getStoredIdentity()}getSession(){return this.session}getMessages(){return this.session?.messages??[]}isConnected(){return this.session!==null}isWidgetOpen(){return this.isOpen}getConfig(){return this.config}setOpen(e){this.isOpen=e,this.emit("openChange",e),e?this.config.onOpen?.():this.config.onClose?.()}toggleOpen(){this.setOpen(!this.isOpen)}on(e,n){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(n),()=>{this.listeners.get(e)?.delete(n)}}emit(e,n){this.listeners.get(e)?.forEach(s=>s(n))}trigger(e,n,s){if(!this.ws||this.ws.readyState!==WebSocket.OPEN){console.warn("[PocketPing] Cannot trigger event: WebSocket not connected");return}let o={name:e,data:n,timestamp:new Date().toISOString()};this.ws.send(JSON.stringify({type:"event",data:o})),this.emit(`event:${e}`,o),s?.widgetMessage&&(this.setOpen(!0),this.emit("triggerMessage",{message:s.widgetMessage,eventName:e}))}onEvent(e,n){return this.customEventHandlers.has(e)||this.customEventHandlers.set(e,new Set),this.customEventHandlers.get(e).add(n),()=>{this.customEventHandlers.get(e)?.delete(n)}}offEvent(e,n){this.customEventHandlers.get(e)?.delete(n)}emitCustomEvent(e){let n=this.customEventHandlers.get(e.name);n&&n.forEach(s=>s(e.data,e)),this.emit("event",e),this.emit(`event:${e.name}`,e)}setupTrackedElements(e){this.cleanupTrackedElements(),this.currentTrackedElements=e;for(let n of e){let s=n.event||"click",o=r=>{let c={...n.data,selector:n.selector,elementText:r.target?.textContent?.trim().slice(0,100),url:window.location.href};this.trigger(n.name,c,{widgetMessage:n.widgetMessage})},a=r=>{r.target?.closest(n.selector)&&o(r)};document.addEventListener(s,a,!0),this.trackedElementCleanups.push(()=>{document.removeEventListener(s,a,!0)})}e.length>0&&console.info(`[PocketPing] Tracking ${e.length} element(s)`)}cleanupTrackedElements(){for(let e of this.trackedElementCleanups)e();this.trackedElementCleanups=[],this.currentTrackedElements=[]}getTrackedElements(){return[...this.currentTrackedElements]}enableInspectorMode(){if(this.inspectorMode)return;this.inspectorMode=!0,console.info("[PocketPing] \u{1F50D} Inspector mode active - click on any element to select it");let e=document.createElement("div");e.id="pp-inspector-overlay",e.innerHTML=`
987
+ `}var xn=0;function o(t,e,n,s,i,a){e||(e={});var r,c,u=e;if("ref"in u)for(c in u={},e)c=="ref"?r=e[c]:u[c]=e[c];var l={type:t,props:u,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--xn,__i:-1,__u:0,__source:i,__self:a};if(typeof t=="function"&&(r=t.defaultProps))for(c in r)u[c]===void 0&&(u[c]=r[c]);return w.vnode&&w.vnode(l),l}function kt({client:t,config:e}){let[n,s]=$(!1),[i,a]=$([]),[r,c]=$(""),[u,l]=$(!1),[g,p]=$(!1),[h,f]=$(!1),[E,A]=$(0),[k,x]=$([]),[b,H]=$(!1),[R,B]=$(null),[N,X]=$(null),[U,F]=$(""),[L,O]=$(null),[z,ge]=$(!1),[Ut,Re]=$(null),[Oe,De]=$(null),[W,he]=$(e),fe=G(null),me=G(null),Le=G(null),zt=G(null);j(()=>{let d=t.on("openChange",s),_=t.on("message",()=>{a([...t.getMessages()])}),T=t.on("typing",m=>{l(m.isTyping)}),v=t.on("presence",m=>{p(m.online)}),S=t.on("connect",()=>{f(!0),a(t.getMessages()),p(t.getSession()?.operatorOnline??!1),he(t.getConfig())}),I=t.on("configUpdate",()=>{he(t.getConfig())});return t.isConnected()&&(f(!0),a(t.getMessages()),p(t.getSession()?.operatorOnline??!1),he(t.getConfig())),()=>{d(),_(),T(),v(),S(),I()}},[t]),j(()=>{n&&fe.current?.scrollIntoView({behavior:"smooth"})},[i,n]),j(()=>{n&&(setTimeout(()=>{fe.current?.scrollIntoView({behavior:"auto"})},50),me.current?.focus(),A(0))},[n]),j(()=>{if(!n&&i.length>0){let d=i.filter(_=>_.sender!=="visitor"&&_.status!=="read").length;A(d)}},[i,n]);let se=ft(()=>{if(!n||!h)return;let d=i.filter(_=>_.sender!=="visitor"&&_.status!=="read");if(d.length>0){let _=d.map(T=>T.id);t.sendReadStatus(_,"read")}},[n,h,i,t]);if(j(()=>{if(!n||!h)return;let d=setTimeout(()=>{se()},1e3);return()=>clearTimeout(d)},[n,h,i,se]),j(()=>{let d=()=>{document.visibilityState==="visible"&&n&&se()};return document.addEventListener("visibilitychange",d),()=>document.removeEventListener("visibilitychange",d)},[n,se]),j(()=>{let d=t.on("read",()=>{a([...t.getMessages()])});return()=>d()},[t]),!yn(W))return null;let Vt=async d=>{d.preventDefault();let _=r.trim().length>0,T=k.filter(m=>m.status==="ready"&&m.attachment);if(!_&&T.length===0)return;let v=r,S=T.map(m=>m.attachment.id),I=R?.id;c(""),x([]),B(null);try{await t.sendMessage(v,S,I)}catch(m){console.error("[PocketPing] Failed to send message:",m)}},jt=d=>{let _=d.target;c(_.value),t.sendTyping(!0)},Bt=async d=>{let _=d.target,T=_.files;if(!T||T.length===0)return;let v=[];for(let S=0;S<T.length;S++){let I=T[S],m=`pending-${Date.now()}-${S}`,P;I.type.startsWith("image/")&&(P=URL.createObjectURL(I)),v.push({id:m,file:I,preview:P,progress:0,status:"pending"})}x(S=>[...S,...v]),_.value="",H(!0);for(let S of v)try{x(m=>m.map(P=>P.id===S.id?{...P,status:"uploading"}:P));let I=await t.uploadFile(S.file,m=>{x(P=>P.map(ve=>ve.id===S.id?{...ve,progress:m}:ve))});x(m=>m.map(P=>P.id===S.id?{...P,status:"ready",progress:100,attachment:I}:P))}catch(I){console.error("[PocketPing] Failed to upload file:",I),x(m=>m.map(P=>P.id===S.id?{...P,status:"error",error:"Upload failed"}:P))}H(!1)},qt=d=>{x(_=>{let T=_.find(v=>v.id===d);return T?.preview&&URL.revokeObjectURL(T.preview),_.filter(v=>v.id!==d)})},He=d=>{B(d),O(null),me.current?.focus()},Jt=()=>{B(null)},Fe=d=>{d.sender==="visitor"&&(X(d),F(d.content),O(null))},We=()=>{X(null),F("")},Xt=async()=>{if(!(!N||!U.trim()))try{await t.editMessage(N.id,U.trim()),X(null),F("")}catch(d){console.error("[PocketPing] Failed to edit message:",d)}},Ne=async d=>{if(d.sender==="visitor"&&(O(null),confirm("Delete this message?")))try{await t.deleteMessage(d.id)}catch(_){console.error("[PocketPing] Failed to delete message:",_)}},Yt=(d,_)=>{d.preventDefault();let T=d;O({message:_,x:T.clientX,y:T.clientY})},Gt=d=>{let _=setTimeout(()=>{navigator.vibrate&&navigator.vibrate(50),O({message:d,x:window.innerWidth/2-60,y:window.innerHeight/2-50})},500);De(_)},Ue=()=>{Oe&&(clearTimeout(Oe),De(null))};j(()=>{if(!L)return;let d=()=>O(null);return document.addEventListener("click",d),()=>document.removeEventListener("click",d)},[L]);let ze=d=>{let _=document.getElementById(`pp-msg-${d}`);_&&(_.scrollIntoView({behavior:"smooth",block:"center"}),_.classList.add("pp-message-highlight"),setTimeout(()=>{_.classList.remove("pp-message-highlight")},1500))},K=G(0),Kt=d=>{d.preventDefault(),d.stopPropagation(),K.current++,K.current===1&&ge(!0)},Qt=d=>{d.preventDefault(),d.stopPropagation()},Zt=d=>{d.preventDefault(),d.stopPropagation(),K.current--,K.current===0&&ge(!1)},en=async d=>{d.preventDefault(),d.stopPropagation(),K.current=0,ge(!1);let _=d.dataTransfer?.files;if(!_||_.length===0)return;let T=[];for(let v=0;v<_.length;v++){let S=_[v],I=`pending-${Date.now()}-${v}`,m;S.type.startsWith("image/")&&(m=URL.createObjectURL(S)),T.push({id:I,file:S,preview:m,progress:0,status:"pending"})}x(v=>[...v,...T]),H(!0);for(let v of T)try{x(I=>I.map(m=>m.id===v.id?{...m,status:"uploading"}:m));let S=await t.uploadFile(v.file,I=>{x(m=>m.map(P=>P.id===v.id?{...P,progress:I}:P))});x(I=>I.map(m=>m.id===v.id?{...m,status:"ready",progress:100,attachment:S}:m))}catch(S){console.error("[PocketPing] Failed to upload dropped file:",S),x(I=>I.map(m=>m.id===v.id?{...m,status:"error",error:"Upload failed"}:m))}H(!1)},Ve=W.position??"bottom-right",_e=bn(W.theme??"auto"),tn=W.primaryColor??"#6366f1",Q=_e==="dark"?"#9ca3af":"#6b7280";return o(D,{children:[o("style",{children:vt(tn,_e)}),o("button",{class:`pp-toggle pp-${Ve}`,onClick:()=>t.toggleOpen(),"aria-label":n?"Close chat":"Open chat",children:[n?o(ne,{}):o(kn,{}),!n&&E>0&&o("span",{class:"pp-unread-badge",children:E>9?"9+":E}),!n&&E===0&&g&&o("span",{class:"pp-online-dot"})]}),n&&o("div",{class:`pp-window pp-${Ve} pp-theme-${_e} ${z?"pp-dragging":""}`,onDragEnter:Kt,onDragOver:Qt,onDragLeave:Zt,onDrop:en,children:[z&&o("div",{class:"pp-drop-overlay",children:[o("div",{class:"pp-drop-icon",children:o(xt,{})}),o("div",{class:"pp-drop-text",children:"Drop files to upload"})]}),o("div",{class:"pp-header",children:[o("div",{class:"pp-header-info",children:[W.operatorAvatar&&o("img",{src:W.operatorAvatar,alt:"",class:"pp-avatar"}),o("div",{children:[o("div",{class:"pp-header-title",children:W.operatorName??"Support"}),o("div",{class:"pp-header-status",children:g?o(D,{children:[o("span",{class:"pp-status-dot pp-online"})," Online"]}):o(D,{children:[o("span",{class:"pp-status-dot"})," Away"]})})]})]}),o("button",{class:"pp-close-btn",onClick:()=>t.setOpen(!1),"aria-label":"Close chat",children:o(ne,{})})]}),o("div",{class:"pp-messages",ref:zt,children:[W.welcomeMessage&&i.length===0&&o("div",{class:"pp-welcome",children:W.welcomeMessage}),i.map(d=>{let _=!!d.deletedAt,T=!!d.editedAt,v=null;if(d.replyTo)if(typeof d.replyTo=="object")v=d.replyTo;else{let m=i.find(P=>P.id===d.replyTo);if(m){let P=!!(m.attachments&&m.attachments.length>0);v={id:m.id,sender:m.sender,content:m.content,deleted:!!m.deletedAt,hasAttachment:P,attachmentType:P?m.attachments[0].mimeType:void 0}}}let I=Ut===d.id&&!_;return o("div",{id:`pp-msg-${d.id}`,class:`pp-message pp-message-${d.sender} ${_?"pp-message-deleted":""}`,onContextMenu:m=>Yt(m,d),onMouseEnter:()=>Re(d.id),onMouseLeave:()=>Re(null),onTouchStart:()=>Gt(d),onTouchEnd:Ue,onTouchCancel:Ue,children:[I&&o("div",{class:`pp-message-actions ${d.sender==="visitor"?"pp-actions-left":"pp-actions-right"}`,children:[o("button",{class:"pp-action-btn",onClick:()=>He(d),title:"Reply",children:o(yt,{color:Q})}),d.sender==="visitor"&&o(D,{children:[o("button",{class:"pp-action-btn",onClick:()=>Fe(d),title:"Edit",children:o(bt,{color:Q})}),o("button",{class:"pp-action-btn pp-action-delete",onClick:()=>Ne(d),title:"Delete",children:o(wt,{color:Q})})]})]}),v&&(v.content||v.hasAttachment)&&o("div",{class:"pp-reply-quote pp-reply-quote-clickable",onClick:()=>ze(v.id),role:"button",tabIndex:0,onKeyDown:m=>m.key==="Enter"&&ze(v.id),children:[o("span",{class:"pp-reply-sender",children:v.sender==="visitor"?"You":"Support"}),o("span",{class:"pp-reply-content",children:v.deleted?"Message deleted":o(D,{children:[v.hasAttachment&&o("span",{class:"pp-reply-attachment-icon",children:v.attachmentType?.startsWith("image/")?"\u{1F4F7} ":"\u{1F4CE} "}),v.content?o(D,{children:[(v.content||"").slice(0,50),(v.content||"").length>50?"...":""]}):v.attachmentType?.startsWith("image/")?"Photo":"File"]})})]}),_?o("div",{class:"pp-message-content pp-deleted-content",children:[o("span",{class:"pp-deleted-icon",children:"\u{1F5D1}\uFE0F"})," Message deleted"]}):o(D,{children:[d.content&&o("div",{class:"pp-message-content",children:d.content}),d.attachments&&d.attachments.length>0&&o("div",{class:"pp-message-attachments",children:d.attachments.map(m=>o(Pn,{attachment:m},m.id))})]}),o("div",{class:"pp-message-time",children:[wn(d.timestamp),T&&!_&&o("span",{class:"pp-edited-badge",children:"edited"}),d.sender==="ai"&&o("span",{class:"pp-ai-badge",children:"AI"}),d.sender==="visitor"&&!_&&o("span",{class:`pp-status pp-status-${d.status??"sent"}`,children:o(Sn,{status:d.status})})]})]},d.id)}),u&&o("div",{class:"pp-message pp-message-operator pp-typing",children:[o("span",{}),o("span",{}),o("span",{})]}),o("div",{ref:fe})]}),L&&o("div",{class:"pp-message-menu",style:{top:`${L.y}px`,left:`${L.x}px`},children:[o("button",{onClick:()=>He(L.message),children:[o(yt,{color:Q})," Reply"]}),L.message.sender==="visitor"&&!L.message.deletedAt&&o(D,{children:[o("button",{onClick:()=>Fe(L.message),children:[o(bt,{color:Q})," Edit"]}),o("button",{class:"pp-menu-delete",onClick:()=>Ne(L.message),children:[o(wt,{color:"#ef4444"})," Delete"]})]})]}),N&&o("div",{class:"pp-edit-modal",children:[o("div",{class:"pp-edit-header",children:[o("span",{children:"Edit message"}),o("button",{onClick:We,children:o(ne,{})})]}),o("textarea",{class:"pp-edit-input",value:U,onInput:d=>F(d.target.value),autoFocus:!0}),o("div",{class:"pp-edit-actions",children:[o("button",{class:"pp-edit-cancel",onClick:We,children:"Cancel"}),o("button",{class:"pp-edit-save",onClick:Xt,disabled:!U.trim(),children:"Save"})]})]}),R&&o("div",{class:"pp-reply-preview",children:[o("div",{class:"pp-reply-preview-content",children:[o("span",{class:"pp-reply-label",children:"Replying to"}),o("span",{class:"pp-reply-text",children:[R.attachments&&R.attachments.length>0&&o("span",{class:"pp-reply-attachment-icon",children:R.attachments[0].mimeType.startsWith("image/")?"\u{1F4F7} ":"\u{1F4CE} "}),R.content?o(D,{children:[R.content.slice(0,50),R.content.length>50?"...":""]}):R.attachments?.[0]?.mimeType.startsWith("image/")?"Photo":"File"]})]}),o("button",{class:"pp-reply-cancel",onClick:Jt,children:o(ne,{})})]}),k.length>0&&o("div",{class:"pp-attachments-preview",children:k.map(d=>o("div",{class:`pp-attachment-preview pp-attachment-${d.status}`,children:[d.preview?o("img",{src:d.preview,alt:d.file.name,class:"pp-preview-img"}):o("div",{class:"pp-preview-file",children:o(Et,{mimeType:d.file.type})}),o("button",{class:"pp-remove-attachment",onClick:()=>qt(d.id),"aria-label":"Remove attachment",type:"button",children:o(ne,{})}),d.status==="uploading"&&o("div",{class:"pp-upload-progress",style:{width:`${d.progress}%`}}),d.status==="error"&&o("div",{class:"pp-upload-error",title:d.error,children:"!"})]},d.id))}),o("form",{class:"pp-input-form",onSubmit:Vt,children:[o("input",{ref:d=>{Le.current=d,d&&(d.onchange=Bt)},type:"file",class:"pp-file-input",accept:"image/*,audio/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,.txt",multiple:!0}),o("button",{type:"button",class:"pp-attach-btn",onClick:()=>Le.current?.click(),disabled:!h||b,"aria-label":"Attach file",children:o(xt,{})}),o("input",{ref:me,type:"text",class:"pp-input",placeholder:W.placeholder??"Type a message...",value:r,onInput:jt,disabled:!h}),o("button",{type:"submit",class:"pp-send-btn",disabled:!r.trim()&&k.filter(d=>d.status==="ready").length===0||!h||b,"aria-label":"Send message",children:o(En,{})})]}),o("div",{class:"pp-footer",children:["Powered by ",o("a",{href:"https://pocketping.io",target:"_blank",rel:"noopener",children:"PocketPing"})]})]})]})}function yn(t){let e=window.location.pathname;return t.hideOnPages?.some(n=>new RegExp(n).test(e))?!1:t.showOnPages?.length?t.showOnPages.some(n=>new RegExp(n).test(e)):!0}function bn(t){return t==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":t}function wn(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function kn(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:o("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function ne(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),o("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function En(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),o("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]})}function Sn({status:t}){return!t||t==="sending"||t==="sent"?o("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check",children:o("polyline",{points:"3 8 7 12 13 4"})}):t==="delivered"?o("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double",children:[o("polyline",{points:"1 8 5 12 11 4"}),o("polyline",{points:"7 8 11 12 17 4"})]}):t==="read"?o("svg",{viewBox:"0 0 20 16",fill:"none",stroke:"currentColor","stroke-width":"2",class:"pp-check-double pp-check-read",children:[o("polyline",{points:"1 8 5 12 11 4"}),o("polyline",{points:"7 8 11 12 17 4"})]}):null}function xt(){return o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:o("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"})})}function yt({color:t,size:e=16}){return o("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[o("polyline",{points:"9 17 4 12 9 7"}),o("path",{d:"M20 18v-2a4 4 0 0 0-4-4H4"})]})}function bt({color:t,size:e=16}){return o("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:o("path",{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"})})}function wt({color:t,size:e=16}){return o("svg",{viewBox:"0 0 24 24",fill:"none","stroke-width":"2",style:{stroke:t||"currentColor",width:`${e}px`,minWidth:`${e}px`,height:`${e}px`,display:"block",flexShrink:0},children:[o("polyline",{points:"3 6 5 6 21 6"}),o("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})]})}function Et({mimeType:t}){return t==="application/pdf"?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),o("polyline",{points:"14 2 14 8 20 8"}),o("path",{d:"M9 15h6"}),o("path",{d:"M9 11h6"})]}):t.startsWith("audio/")?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("path",{d:"M9 18V5l12-2v13"}),o("circle",{cx:"6",cy:"18",r:"3"}),o("circle",{cx:"18",cy:"16",r:"3"})]}):t.startsWith("video/")?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("rect",{x:"2",y:"2",width:"20",height:"20",rx:"2.18",ry:"2.18"}),o("line",{x1:"7",y1:"2",x2:"7",y2:"22"}),o("line",{x1:"17",y1:"2",x2:"17",y2:"22"}),o("line",{x1:"2",y1:"12",x2:"22",y2:"12"}),o("line",{x1:"2",y1:"7",x2:"7",y2:"7"}),o("line",{x1:"2",y1:"17",x2:"7",y2:"17"}),o("line",{x1:"17",y1:"17",x2:"22",y2:"17"}),o("line",{x1:"17",y1:"7",x2:"22",y2:"7"})]}):o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",children:[o("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),o("polyline",{points:"14 2 14 8 20 8"})]})}function Pn({attachment:t}){let e=t.mimeType.startsWith("image/"),n=t.mimeType.startsWith("audio/"),s=t.mimeType.startsWith("video/"),i=a=>a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`;return e?o("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-image",children:o("img",{src:t.thumbnailUrl||t.url,alt:t.filename})}):n?o("div",{class:"pp-attachment pp-attachment-audio",children:[o("audio",{controls:!0,preload:"metadata",children:o("source",{src:t.url,type:t.mimeType})}),o("span",{class:"pp-attachment-name",children:t.filename})]}):s?o("div",{class:"pp-attachment pp-attachment-video",children:o("video",{controls:!0,preload:"metadata",children:o("source",{src:t.url,type:t.mimeType})})}):o("a",{href:t.url,target:"_blank",rel:"noopener",class:"pp-attachment pp-attachment-file",children:[o(Et,{mimeType:t.mimeType}),o("div",{class:"pp-attachment-info",children:[o("span",{class:"pp-attachment-name",children:t.filename}),o("span",{class:"pp-attachment-size",children:i(t.size)})]})]})}var de="0.3.6";var ue=class{constructor(e){this.session=null;this.ws=null;this.sse=null;this.isOpen=!1;this.listeners=new Map;this.customEventHandlers=new Map;this.reconnectAttempts=0;this.maxReconnectAttempts=5;this.reconnectTimeout=null;this.pollingTimeout=null;this.pollingFailures=0;this.maxPollingFailures=10;this.wsConnectedAt=0;this.quickFailureThreshold=2e3;this.connectionMode="none";this.trackedElementCleanups=[];this.currentTrackedElements=[];this.inspectorMode=!1;this.inspectorCleanup=null;this.config=e}async connect(){let e=this.getOrCreateVisitorId(),n=this.getStoredSessionId(),s=this.getStoredIdentity(),a=new URLSearchParams(window.location.search).get("pp_inspector"),r=await this.fetch("/connect",{method:"POST",body:JSON.stringify({visitorId:e,sessionId:n,inspectorToken:a||void 0,metadata:{url:window.location.href,referrer:document.referrer||void 0,pageTitle:document.title||void 0,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,language:navigator.language,screenResolution:`${window.screen.width}x${window.screen.height}`},identity:s||void 0})});return this.session={sessionId:r.sessionId,visitorId:r.visitorId,operatorOnline:r.operatorOnline??!1,messages:r.messages??[],identity:r.identity||s||void 0},r.operatorName&&(this.config.operatorName=r.operatorName),r.operatorAvatar&&(this.config.operatorAvatar=r.operatorAvatar),r.primaryColor&&(this.config.primaryColor=r.primaryColor),r.welcomeMessage&&(this.config.welcomeMessage=r.welcomeMessage),this.emit("configUpdate",{operatorName:this.config.operatorName,operatorAvatar:this.config.operatorAvatar,primaryColor:this.config.primaryColor,welcomeMessage:this.config.welcomeMessage}),this.storeSessionId(r.sessionId),this.connectRealtime(),r.inspectorMode?this.enableInspectorMode():r.trackedElements?.length&&this.setupTrackedElements(r.trackedElements),this.emit("connect",this.session),this.config.onConnect?.(r.sessionId),this.session}disconnect(){this.ws&&(this.ws.onclose=null,this.ws.onmessage=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null),this.sse&&(this.sse.close(),this.sse=null),this.session=null,this.connectionMode="none",this.reconnectTimeout&&clearTimeout(this.reconnectTimeout),this.stopPolling(),this.cleanupTrackedElements(),this.disableInspectorMode()}async sendMessage(e,n,s){if(!this.session)throw new Error("Not connected");let i=`temp-${this.generateId()}`,a={id:i,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:new Date().toISOString(),status:"sending",replyTo:s};this.session.messages.push(a),this.emit("message",a);try{let r=await this.fetch("/message",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,content:e,sender:"visitor",attachmentIds:n||[],replyTo:s})}),c=this.session.messages.findIndex(l=>l.id===i);c>=0&&(this.session.messages[c].id=r.messageId,this.session.messages[c].timestamp=r.timestamp,this.session.messages[c].status="sent",r.attachments&&r.attachments.length>0&&(this.session.messages[c].attachments=r.attachments),this.emit("message",this.session.messages[c]));let u=this.session.messages[c]||{id:r.messageId,sessionId:this.session.sessionId,content:e,sender:"visitor",timestamp:r.timestamp,status:"sent",attachments:r.attachments};return this.config.onMessage?.(u),u}catch(r){let c=this.session.messages.findIndex(u=>u.id===i);throw c>=0&&(this.session.messages.splice(c,1),this.emit("message",a)),r}}async uploadFile(e,n){if(!this.session)throw new Error("Not connected");this.emit("uploadStart",{filename:e.name,size:e.size});try{let s=await this.fetch("/upload",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,filename:e.name,mimeType:e.type||"application/octet-stream",size:e.size})});n?.(10),this.emit("uploadProgress",{filename:e.name,progress:10}),await this.uploadToPresignedUrl(s.uploadUrl,e,a=>{let r=10+a*.8;n?.(r),this.emit("uploadProgress",{filename:e.name,progress:r})});let i=await this.fetch("/upload/complete",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,attachmentId:s.attachmentId})});return n?.(100),this.emit("uploadComplete",i),{id:i.id,filename:i.filename,mimeType:i.mimeType,size:i.size,url:i.url,thumbnailUrl:i.thumbnailUrl,status:i.status}}catch(s){throw this.emit("uploadError",{filename:e.name,error:s}),s}}async uploadFiles(e,n){let s=[],i=e.length;for(let a=0;a<i;a++){let r=e[a],c=a/i*100,u=100/i,l=await this.uploadFile(r,g=>{let p=c+g/100*u;n?.(p)});s.push(l)}return s}uploadToPresignedUrl(e,n,s){return new Promise((i,a)=>{let r=new XMLHttpRequest;r.upload.addEventListener("progress",c=>{if(c.lengthComputable){let u=c.loaded/c.total*100;s?.(u)}}),r.addEventListener("load",()=>{r.status>=200&&r.status<300?i():a(new Error(`Upload failed with status ${r.status}`))}),r.addEventListener("error",()=>{a(new Error("Upload failed"))}),r.open("PUT",e),r.setRequestHeader("Content-Type",n.type||"application/octet-stream"),r.send(n)})}async fetchMessages(e){if(!this.session)throw new Error("Not connected");let n=new URLSearchParams({sessionId:this.session.sessionId});return e&&n.set("after",e),(await this.fetch(`/messages?${n}`,{method:"GET"})).messages}async sendTyping(e=!0){this.session&&await this.fetch("/typing",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,sender:"visitor",isTyping:e})})}async sendReadStatus(e,n){if(!(!this.session||e.length===0))try{await this.fetch("/read",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,messageIds:e,status:n})});for(let s of this.session.messages)e.includes(s.id)&&(s.status=n,n==="delivered"?s.deliveredAt=new Date().toISOString():n==="read"&&(s.readAt=new Date().toISOString()));this.emit("readStatusSent",{messageIds:e,status:n})}catch(s){console.error("[PocketPing] Failed to send read status:",s)}}async editMessage(e,n){if(!this.session)throw new Error("Not connected");let s=await this.fetch(`/message/${e}`,{method:"PATCH",body:JSON.stringify({sessionId:this.session.sessionId,content:n})}),i=this.session.messages.findIndex(a=>a.id===e);return i>=0&&(this.session.messages[i].content=s.message.content,this.session.messages[i].editedAt=s.message.editedAt,this.emit("messageEdited",this.session.messages[i])),this.session.messages[i]}async deleteMessage(e){if(!this.session)throw new Error("Not connected");let n=await this.fetch(`/message/${e}?sessionId=${encodeURIComponent(this.session.sessionId)}`,{method:"DELETE"});if(n.deleted){let s=this.session.messages.findIndex(i=>i.id===e);s>=0&&(this.session.messages[s].deletedAt=new Date().toISOString(),this.session.messages[s].content="",this.emit("messageDeleted",this.session.messages[s]))}return n.deleted}async getPresence(){return this.fetch("/presence",{method:"GET"})}async identify(e){if(!e?.id)throw new Error("[PocketPing] identity.id is required");if(this.storeIdentity(e),this.session)try{await this.fetch("/identify",{method:"POST",body:JSON.stringify({sessionId:this.session.sessionId,identity:e})}),this.session.identity=e,this.emit("identify",e)}catch(n){throw console.error("[PocketPing] Failed to identify:",n),n}}async reset(e){this.clearIdentity(),this.session&&(this.session.identity=void 0),e?.newSession&&(localStorage.removeItem("pocketping_session_id"),localStorage.removeItem("pocketping_visitor_id"),this.disconnect(),await this.connect()),this.emit("reset",null)}getIdentity(){return this.session?.identity||this.getStoredIdentity()}getSession(){return this.session}getMessages(){return this.session?.messages??[]}isConnected(){return this.session!==null}isWidgetOpen(){return this.isOpen}getConfig(){return this.config}setOpen(e){this.isOpen=e,this.emit("openChange",e),e?this.config.onOpen?.():this.config.onClose?.()}toggleOpen(){this.setOpen(!this.isOpen)}on(e,n){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(n),()=>{this.listeners.get(e)?.delete(n)}}emit(e,n){this.listeners.get(e)?.forEach(s=>s(n))}trigger(e,n,s){if(!this.ws||this.ws.readyState!==WebSocket.OPEN){console.warn("[PocketPing] Cannot trigger event: WebSocket not connected");return}let i={name:e,data:n,timestamp:new Date().toISOString()};this.ws.send(JSON.stringify({type:"event",data:i})),this.emit(`event:${e}`,i),s?.widgetMessage&&(this.setOpen(!0),this.emit("triggerMessage",{message:s.widgetMessage,eventName:e}))}onEvent(e,n){return this.customEventHandlers.has(e)||this.customEventHandlers.set(e,new Set),this.customEventHandlers.get(e).add(n),()=>{this.customEventHandlers.get(e)?.delete(n)}}offEvent(e,n){this.customEventHandlers.get(e)?.delete(n)}emitCustomEvent(e){let n=this.customEventHandlers.get(e.name);n&&n.forEach(s=>s(e.data,e)),this.emit("event",e),this.emit(`event:${e.name}`,e)}setupTrackedElements(e){this.cleanupTrackedElements(),this.currentTrackedElements=e;for(let n of e){let s=n.event||"click",i=r=>{let c={...n.data,selector:n.selector,elementText:r.target?.textContent?.trim().slice(0,100),url:window.location.href};this.trigger(n.name,c,{widgetMessage:n.widgetMessage})},a=r=>{r.target?.closest(n.selector)&&i(r)};document.addEventListener(s,a,!0),this.trackedElementCleanups.push(()=>{document.removeEventListener(s,a,!0)})}e.length>0&&console.info(`[PocketPing] Tracking ${e.length} element(s)`)}cleanupTrackedElements(){for(let e of this.trackedElementCleanups)e();this.trackedElementCleanups=[],this.currentTrackedElements=[]}getTrackedElements(){return[...this.currentTrackedElements]}enableInspectorMode(){if(this.inspectorMode)return;this.inspectorMode=!0,console.info("[PocketPing] \u{1F50D} Inspector mode active - click on any element to select it");let e=document.createElement("div");e.id="pp-inspector-overlay",e.innerHTML=`
944
988
  <style>
945
989
  #pp-inspector-overlay {
946
990
  position: fixed;
@@ -1023,9 +1067,9 @@
1023
1067
  <button id="pp-inspector-exit">Exit</button>
1024
1068
  </div>
1025
1069
  <div id="pp-inspector-tooltip"></div>
1026
- `,document.body.appendChild(e);let n=document.getElementById("pp-inspector-tooltip"),s=null,o=u=>{if(u.id&&!u.id.startsWith("pp-"))return`#${CSS.escape(u.id)}`;let p=Array.from(u.classList).filter(h=>!h.startsWith("pp-"));if(p.length>0){let h="."+p.map(f=>CSS.escape(f)).join(".");if(document.querySelectorAll(h).length===1)return h}for(let h of Array.from(u.attributes))if(h.name.startsWith("data-")&&h.value){let f=`[${h.name}="${CSS.escape(h.value)}"]`;if(document.querySelectorAll(f).length===1)return f}let g=[],l=u;for(;l&&l!==document.body;){let h=l.tagName.toLowerCase();if(l.id&&!l.id.startsWith("pp-")){h=`#${CSS.escape(l.id)}`,g.unshift(h);break}let f=l.parentElement;if(f){let S=l.tagName,A=Array.from(f.children).filter(k=>k.tagName===S);if(A.length>1){let k=A.indexOf(l)+1;h+=`:nth-of-type(${k})`}}g.unshift(h),l=f}return g.join(" > ")},a=u=>{let p=u.target;if(p.closest("#pp-inspector-overlay")||p.closest("#pocketping-widget"))return;s&&s.classList.remove("pp-inspector-highlight"),p.classList.add("pp-inspector-highlight"),s=p;let g=o(p);n.textContent=g,n.style.display="block",n.style.left=`${u.clientX+15}px`,n.style.top=`${u.clientY+15}px`;let l=n.getBoundingClientRect();l.right>window.innerWidth&&(n.style.left=`${u.clientX-l.width-15}px`),l.bottom>window.innerHeight&&(n.style.top=`${u.clientY-l.height-15}px`)},r=u=>{let p=u.target;p.closest("#pp-inspector-overlay")||(p.classList.remove("pp-inspector-highlight"),n.style.display="none")},c=u=>{let p=u.target;if(p.id==="pp-inspector-exit"){this.disableInspectorMode();return}if(p.closest("#pp-inspector-overlay")||p.closest("#pocketping-widget"))return;u.preventDefault(),u.stopPropagation();let g=o(p);this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"inspector_select",data:{selector:g,tagName:p.tagName.toLowerCase(),text:p.textContent?.trim().slice(0,50)||"",url:window.location.href}})),this.emit("inspectorSelect",{selector:g,element:p}),p.classList.remove("pp-inspector-highlight"),p.classList.add("pp-inspector-highlight"),setTimeout(()=>{p.classList.remove("pp-inspector-highlight")},500);let l=document.getElementById("pp-inspector-banner");if(l){let h=l.innerHTML;l.innerHTML=`
1070
+ `,document.body.appendChild(e);let n=document.getElementById("pp-inspector-tooltip"),s=null,i=u=>{if(u.id&&!u.id.startsWith("pp-"))return`#${CSS.escape(u.id)}`;let l=Array.from(u.classList).filter(h=>!h.startsWith("pp-"));if(l.length>0){let h="."+l.map(f=>CSS.escape(f)).join(".");if(document.querySelectorAll(h).length===1)return h}for(let h of Array.from(u.attributes))if(h.name.startsWith("data-")&&h.value){let f=`[${h.name}="${CSS.escape(h.value)}"]`;if(document.querySelectorAll(f).length===1)return f}let g=[],p=u;for(;p&&p!==document.body;){let h=p.tagName.toLowerCase();if(p.id&&!p.id.startsWith("pp-")){h=`#${CSS.escape(p.id)}`,g.unshift(h);break}let f=p.parentElement;if(f){let E=p.tagName,A=Array.from(f.children).filter(k=>k.tagName===E);if(A.length>1){let k=A.indexOf(p)+1;h+=`:nth-of-type(${k})`}}g.unshift(h),p=f}return g.join(" > ")},a=u=>{let l=u.target;if(l.closest("#pp-inspector-overlay")||l.closest("#pocketping-widget"))return;s&&s.classList.remove("pp-inspector-highlight"),l.classList.add("pp-inspector-highlight"),s=l;let g=i(l);n.textContent=g,n.style.display="block",n.style.left=`${u.clientX+15}px`,n.style.top=`${u.clientY+15}px`;let p=n.getBoundingClientRect();p.right>window.innerWidth&&(n.style.left=`${u.clientX-p.width-15}px`),p.bottom>window.innerHeight&&(n.style.top=`${u.clientY-p.height-15}px`)},r=u=>{let l=u.target;l.closest("#pp-inspector-overlay")||(l.classList.remove("pp-inspector-highlight"),n.style.display="none")},c=u=>{let l=u.target;if(l.id==="pp-inspector-exit"){this.disableInspectorMode();return}if(l.closest("#pp-inspector-overlay")||l.closest("#pocketping-widget"))return;u.preventDefault(),u.stopPropagation();let g=i(l);this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"inspector_select",data:{selector:g,tagName:l.tagName.toLowerCase(),text:l.textContent?.trim().slice(0,50)||"",url:window.location.href}})),this.emit("inspectorSelect",{selector:g,element:l}),l.classList.remove("pp-inspector-highlight"),l.classList.add("pp-inspector-highlight"),setTimeout(()=>{l.classList.remove("pp-inspector-highlight")},500);let p=document.getElementById("pp-inspector-banner");if(p){let h=p.innerHTML;p.innerHTML=`
1027
1071
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1028
1072
  <polyline points="20 6 9 17 4 12"/>
1029
1073
  </svg>
1030
1074
  <span>Selector captured: <code style="background:rgba(255,255,255,0.2);padding:2px 6px;border-radius:4px;font-family:monospace;">${g}</code></span>
1031
- `,setTimeout(()=>{l&&this.inspectorMode&&(l.innerHTML=h,document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()}))},2e3)}console.info(`[PocketPing] \u{1F4CC} Selector captured: ${g}`)};document.addEventListener("mouseover",a,!0),document.addEventListener("mouseout",r,!0),document.addEventListener("click",c,!0),this.inspectorCleanup=()=>{document.removeEventListener("mouseover",a,!0),document.removeEventListener("mouseout",r,!0),document.removeEventListener("click",c,!0),e.remove(),s&&s.classList.remove("pp-inspector-highlight")},document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()})}disableInspectorMode(){this.inspectorMode&&(this.inspectorMode=!1,this.inspectorCleanup&&(this.inspectorCleanup(),this.inspectorCleanup=null),console.info("[PocketPing] Inspector mode disabled"),this.emit("inspectorDisabled",null))}isInspectorModeActive(){return this.inspectorMode}connectRealtime(){if(this.session){if(this.connectionMode==="polling"){this.startPolling();return}if(this.connectionMode==="sse"){this.connectSSE();return}this.connectWebSocket()}}connectWebSocket(){if(!this.session)return;let e=this.config.endpoint.replace(/^http/,"ws").replace(/\/$/,"")+`/stream?sessionId=${this.session.sessionId}`;try{this.ws=new WebSocket(e),this.wsConnectedAt=Date.now();let n=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F WebSocket timeout - trying SSE"),this.ws&&this.ws.readyState!==WebSocket.OPEN&&(this.ws.onclose=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null,this.connectSSE())},5e3);this.ws.onopen=()=>{clearTimeout(n),this.connectionMode="ws",this.reconnectAttempts=0,this.wsConnectedAt=Date.now(),this.emit("wsConnected",null)},this.ws.onmessage=s=>{try{let o=JSON.parse(s.data);this.handleRealtimeEvent(o)}catch(o){console.error("[PocketPing] Failed to parse WS message:",o)}},this.ws.onclose=()=>{clearTimeout(n),this.emit("wsDisconnected",null),this.handleWsFailure()},this.ws.onerror=()=>{clearTimeout(n)}}catch{console.warn("[PocketPing] WebSocket unavailable - trying SSE"),this.connectSSE()}}connectSSE(){if(!this.session)return;let e=new URLSearchParams({sessionId:this.session.sessionId}),n=this.getLastEventTimestamp();n&&e.set("after",n);let s=this.config.endpoint.replace(/\/$/,"")+`/stream?${e.toString()}`;try{this.sse=new EventSource(s);let o=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F SSE timeout - falling back to polling"),this.sse&&this.sse.readyState!==EventSource.OPEN&&(this.sse.close(),this.sse=null,this.connectionMode="polling",this.startPolling())},5e3);this.sse.onopen=()=>{clearTimeout(o),this.connectionMode="sse",this.emit("sseConnected",null)},this.sse.addEventListener("message",a=>{try{let r=JSON.parse(a.data);this.handleRealtimeEvent(r)}catch(r){console.error("[PocketPing] Failed to parse SSE message:",r)}}),this.sse.addEventListener("connected",()=>{}),this.sse.onerror=()=>{clearTimeout(o),console.warn("[PocketPing] \u274C SSE error - falling back to polling"),this.sse&&(this.sse.close(),this.sse=null),this.connectionMode="polling",this.startPolling()}}catch{console.warn("[PocketPing] SSE unavailable - falling back to polling"),this.connectionMode="polling",this.startPolling()}}handleWsFailure(){if(Date.now()-this.wsConnectedAt<this.quickFailureThreshold){console.info("[PocketPing] WebSocket failed quickly - trying SSE"),this.connectSSE();return}this.scheduleReconnect()}handleRealtimeEvent(e){this.handleWebSocketEvent(e)}getLastEventTimestamp(){if(!this.session)return null;let e=null;for(let n of this.session.messages){let s=[n.timestamp,n.editedAt,n.deletedAt,n.deliveredAt,n.readAt].filter(Boolean).map(o=>new Date(o)).filter(o=>!isNaN(o.getTime()));for(let o of s)(!e||o>e)&&(e=o)}return e?e.toISOString():null}handleWebSocketEvent(e){switch(e.type){case"message":let n=e.data;if(this.session){let u=this.session.messages.findIndex(p=>p.id===n.id);if(u<0&&n.sender==="visitor"&&(u=this.session.messages.findIndex(p=>p.id.startsWith("temp-")&&p.content===n.content&&p.sender==="visitor"),u>=0&&(this.session.messages[u].id=n.id)),u<0&&n.sender!=="visitor"){let p=new Date(n.timestamp).getTime();u=this.session.messages.findIndex(g=>g.sender===n.sender&&g.content===n.content&&Math.abs(new Date(g.timestamp).getTime()-p)<2e3)}if(u>=0){let p=this.session.messages[u],g=!1;n.status&&n.status!==p.status&&(p.status=n.status,g=!0,n.deliveredAt&&(p.deliveredAt=n.deliveredAt),n.readAt&&(p.readAt=n.readAt),this.emit("read",{messageIds:[n.id],status:n.status})),n.content!==void 0&&n.content!==p.content&&(p.content=n.content,g=!0),n.editedAt!==void 0&&n.editedAt!==p.editedAt&&(p.editedAt=n.editedAt,g=!0),n.deletedAt!==void 0&&n.deletedAt!==p.deletedAt&&(p.deletedAt=n.deletedAt,g=!0),n.replyTo!==void 0&&(p.replyTo=n.replyTo,g=!0),n.attachments!==void 0&&(p.attachments=n.attachments,g=!0),g&&this.emit("message",p)}else this.session.messages.push(n),this.emit("message",n),this.config.onMessage?.(n)}n.sender!=="visitor"&&this.emit("typing",{isTyping:!1});break;case"typing":let s=e.data;s.sender!=="visitor"&&this.emit("typing",{isTyping:s.isTyping});break;case"presence":this.session&&(this.session.operatorOnline=e.data.online),this.emit("presence",e.data);break;case"ai_takeover":this.emit("aiTakeover",e.data);break;case"read":let o=e.data;if(this.session)for(let u of this.session.messages)o.messageIds.includes(u.id)&&(u.status=o.status,o.deliveredAt&&(u.deliveredAt=o.deliveredAt),o.readAt&&(u.readAt=o.readAt));this.emit("read",o);break;case"message_edited":if(this.session){let u=e.data,p=this.session.messages.findIndex(g=>g.id===u.messageId);if(p>=0){let g=this.session.messages[p];g.content=u.content,g.editedAt=u.editedAt??new Date().toISOString(),this.emit("message",g)}}break;case"message_deleted":if(this.session){let u=e.data,p=this.session.messages.findIndex(g=>g.id===u.messageId);if(p>=0){let g=this.session.messages[p];g.deletedAt=u.deletedAt??new Date().toISOString(),this.emit("message",g)}}break;case"event":let a=e.data;this.emitCustomEvent(a);break;case"version_warning":let r=e.data;this.handleVersionWarning(r);break;case"config_update":let c=e.data;c.trackedElements&&(this.setupTrackedElements(c.trackedElements),this.emit("configUpdate",c));break}}handleVersionWarning(e){let n="[PocketPing]",s=e.upgradeUrl?` Upgrade: ${e.upgradeUrl}`:" Update your widget to the latest version.";switch(e.severity){case"error":console.error(`${n} \u{1F6A8} VERSION ERROR: ${e.message}${s}`),console.error(`${n} Current: ${e.currentVersion}, Required: ${e.minVersion||"unknown"}`);break;case"warning":console.warn(`${n} \u26A0\uFE0F VERSION WARNING: ${e.message}${s}`),console.warn(`${n} Current: ${e.currentVersion}, Latest: ${e.latestVersion||"unknown"}`);break;case"info":console.info(`${n} \u2139\uFE0F ${e.message}`);break}this.emit("versionWarning",e),this.config.onVersionWarning?.(e),e.canContinue||(console.error(`${n} Widget is incompatible with backend. Please update immediately.`),this.disconnect())}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){console.warn("[PocketPing] Max reconnect attempts reached, trying SSE"),this.connectSSE();return}let e=Math.min(1e3*Math.pow(2,this.reconnectAttempts),3e4);this.reconnectAttempts++,this.reconnectTimeout=setTimeout(()=>{this.connectWebSocket()},e)}startPolling(){let e=async()=>{if(this.session){try{let n=this.getLastEventTimestamp(),s=await this.fetchMessages(n??void 0);this.pollingFailures=0;for(let o of s){let a=this.session.messages.findIndex(r=>r.id===o.id);if(a>=0){let r=this.session.messages[a],c=!1;o.status&&o.status!==r.status&&(r.status=o.status,c=!0,o.deliveredAt&&(r.deliveredAt=o.deliveredAt),o.readAt&&(r.readAt=o.readAt),this.emit("read",{messageIds:[o.id],status:o.status})),o.content!==void 0&&o.content!==r.content&&(r.content=o.content,c=!0),o.editedAt!==void 0&&o.editedAt!==r.editedAt&&(r.editedAt=o.editedAt,c=!0),o.deletedAt!==void 0&&o.deletedAt!==r.deletedAt&&(r.deletedAt=o.deletedAt,c=!0),o.replyTo!==void 0&&(r.replyTo=o.replyTo,c=!0),o.attachments!==void 0&&(r.attachments=o.attachments,c=!0),c&&this.emit("message",r)}else this.session.messages.push(o),this.emit("message",o),this.config.onMessage?.(o)}}catch(n){if(this.pollingFailures++,console.error("[PocketPing] \u274C Polling error:",n),(this.pollingFailures<=3||this.pollingFailures%3===0)&&console.warn(`[PocketPing] Polling failed (${this.pollingFailures}/${this.maxPollingFailures})`),this.pollingFailures>=this.maxPollingFailures){console.error("[PocketPing] Polling disabled after too many failures. Real-time updates unavailable."),this.emit("pollingDisabled",{failures:this.pollingFailures});return}}if(this.session){let n=this.pollingFailures>0?Math.min(2e3*Math.pow(2,this.pollingFailures-1),3e4):2e3;this.pollingTimeout=setTimeout(e,n)}}};this.pollingTimeout=setTimeout(e,500)}stopPolling(){this.pollingTimeout&&(clearTimeout(this.pollingTimeout),this.pollingTimeout=null),this.pollingFailures=0}async fetch(e,n){let s=this.config.endpoint.replace(/\/$/,"")+e,o=await fetch(s,{...n,headers:{"Content-Type":"application/json","X-PocketPing-Version":de,...n.headers}});if(this.checkVersionHeaders(o),!o.ok){let a=await o.text();throw new Error(`PocketPing API error: ${o.status} ${a}`)}return o.json()}checkVersionHeaders(e){let n=e.headers.get("X-PocketPing-Version-Status"),s=e.headers.get("X-PocketPing-Min-Version"),o=e.headers.get("X-PocketPing-Latest-Version"),a=e.headers.get("X-PocketPing-Version-Message");if(!n||n==="ok")return;let r="info",c=!0;n==="deprecated"?r="warning":n==="unsupported"?(r="error",c=!1):n==="outdated"&&(r="info");let u={severity:r,message:a||`Widget version ${de} is ${n}`,currentVersion:de,minVersion:s||void 0,latestVersion:o||void 0,canContinue:c,upgradeUrl:"https://docs.pocketping.io/widget/installation"};this.handleVersionWarning(u)}getOrCreateVisitorId(){let e="pocketping_visitor_id",n=localStorage.getItem(e);return n||(n=this.generateId(),localStorage.setItem(e,n)),n}getStoredSessionId(){return localStorage.getItem("pocketping_session_id")}storeSessionId(e){localStorage.setItem("pocketping_session_id",e)}getStoredIdentity(){try{let e=localStorage.getItem("pocketping_user_identity");return e?JSON.parse(e):null}catch{return null}}storeIdentity(e){localStorage.setItem("pocketping_user_identity",JSON.stringify(e))}clearIdentity(){localStorage.removeItem("pocketping_user_identity")}generateId(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}};var y=null,q=null,Pn="https://app.pocketping.io/api/widget";function Ae(t){if(y)return console.warn("[PocketPing] Already initialized"),y;let e=t.endpoint;if(!e&&t.projectId&&(e=`${Pn}/${t.projectId}`),!e)throw new Error("[PocketPing] endpoint or projectId is required");let n={...t,endpoint:e};return y=new ue(n),q=document.createElement("div"),q.id="pocketping-container",document.body.appendChild(q),Ie(Ee(wt,{client:y,config:t}),q),y.connect().catch(s=>{console.error("[PocketPing] Failed to connect:",s)}),y}function St(){q&&(Ie(null,q),q.remove(),q=null),y&&(y.disconnect(),y=null)}function Et(){y?.setOpen(!0)}function Pt(){y?.setOpen(!1)}function Tt(){y?.toggleOpen()}function It(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.sendMessage(t,e)}async function Ct(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFile(t,e)}async function Mt(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFiles(t,e)}function $t(t,e,n){if(!y){console.warn("[PocketPing] Not initialized, cannot trigger event");return}y.trigger(t,e,n)}function At(t){if(!y){console.warn("[PocketPing] Not initialized, cannot setup tracked elements");return}y.setupTrackedElements(t)}function Rt(){return y?.getTrackedElements()||[]}function Ot(t,e){return y?y.onEvent(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}function Dt(t,e){y?.offEvent(t,e)}async function Lt(t){if(!y)throw new Error("[PocketPing] Not initialized");return y.identify(t)}async function Ht(t){if(!y){console.warn("[PocketPing] Not initialized");return}return y.reset(t)}function Ft(){return y?.getIdentity()||null}function Nt(t,e){return y?y.on(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}if(typeof document<"u"){let t=document.currentScript;if(t){let e=t.dataset.projectId,n=t.dataset.endpoint;(e||n)&&Ae({projectId:e,endpoint:n,theme:t.dataset.theme||"auto",position:t.dataset.position||"bottom-right"})}}var Tn={init:Ae,destroy:St,open:Et,close:Pt,toggle:Tt,sendMessage:It,uploadFile:Ct,uploadFiles:Mt,trigger:$t,onEvent:Ot,offEvent:Dt,on:Nt,identify:Lt,reset:Ht,getIdentity:Ft,setupTrackedElements:At,getTrackedElements:Rt};return an(In);})();
1075
+ `,setTimeout(()=>{p&&this.inspectorMode&&(p.innerHTML=h,document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()}))},2e3)}console.info(`[PocketPing] \u{1F4CC} Selector captured: ${g}`)};document.addEventListener("mouseover",a,!0),document.addEventListener("mouseout",r,!0),document.addEventListener("click",c,!0),this.inspectorCleanup=()=>{document.removeEventListener("mouseover",a,!0),document.removeEventListener("mouseout",r,!0),document.removeEventListener("click",c,!0),e.remove(),s&&s.classList.remove("pp-inspector-highlight")},document.getElementById("pp-inspector-exit")?.addEventListener("click",()=>{this.disableInspectorMode()})}disableInspectorMode(){this.inspectorMode&&(this.inspectorMode=!1,this.inspectorCleanup&&(this.inspectorCleanup(),this.inspectorCleanup=null),console.info("[PocketPing] Inspector mode disabled"),this.emit("inspectorDisabled",null))}isInspectorModeActive(){return this.inspectorMode}connectRealtime(){if(this.session){if(this.connectionMode==="polling"){this.startPolling();return}if(this.connectionMode==="sse"){this.connectSSE();return}this.connectWebSocket()}}connectWebSocket(){if(!this.session)return;let e=this.config.endpoint.replace(/^http/,"ws").replace(/\/$/,"")+`/stream?sessionId=${this.session.sessionId}`;try{this.ws=new WebSocket(e),this.wsConnectedAt=Date.now();let n=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F WebSocket timeout - trying SSE"),this.ws&&this.ws.readyState!==WebSocket.OPEN&&(this.ws.onclose=null,this.ws.onerror=null,this.ws.onopen=null,this.ws.close(),this.ws=null,this.connectSSE())},5e3);this.ws.onopen=()=>{clearTimeout(n),this.connectionMode="ws",this.reconnectAttempts=0,this.wsConnectedAt=Date.now(),this.emit("wsConnected",null)},this.ws.onmessage=s=>{try{let i=JSON.parse(s.data);this.handleRealtimeEvent(i)}catch(i){console.error("[PocketPing] Failed to parse WS message:",i)}},this.ws.onclose=()=>{clearTimeout(n),this.emit("wsDisconnected",null),this.handleWsFailure()},this.ws.onerror=()=>{clearTimeout(n)}}catch{console.warn("[PocketPing] WebSocket unavailable - trying SSE"),this.connectSSE()}}connectSSE(){if(!this.session)return;let e=new URLSearchParams({sessionId:this.session.sessionId}),n=this.getLastEventTimestamp();n&&e.set("after",n);let s=this.config.endpoint.replace(/\/$/,"")+`/stream?${e.toString()}`;try{this.sse=new EventSource(s);let i=setTimeout(()=>{console.warn("[PocketPing] \u23F1\uFE0F SSE timeout - falling back to polling"),this.sse&&this.sse.readyState!==EventSource.OPEN&&(this.sse.close(),this.sse=null,this.connectionMode="polling",this.startPolling())},5e3);this.sse.onopen=()=>{clearTimeout(i),this.connectionMode="sse",this.emit("sseConnected",null)},this.sse.addEventListener("message",a=>{try{let r=JSON.parse(a.data);this.handleRealtimeEvent(r)}catch(r){console.error("[PocketPing] Failed to parse SSE message:",r)}}),this.sse.addEventListener("connected",()=>{}),this.sse.onerror=()=>{clearTimeout(i),console.warn("[PocketPing] \u274C SSE error - falling back to polling"),this.sse&&(this.sse.close(),this.sse=null),this.connectionMode="polling",this.startPolling()}}catch{console.warn("[PocketPing] SSE unavailable - falling back to polling"),this.connectionMode="polling",this.startPolling()}}handleWsFailure(){if(Date.now()-this.wsConnectedAt<this.quickFailureThreshold){console.info("[PocketPing] WebSocket failed quickly - trying SSE"),this.connectSSE();return}this.scheduleReconnect()}handleRealtimeEvent(e){this.handleWebSocketEvent(e)}getLastEventTimestamp(){if(!this.session)return null;let e=null;for(let n of this.session.messages){let s=[n.timestamp,n.editedAt,n.deletedAt,n.deliveredAt,n.readAt].filter(Boolean).map(i=>new Date(i)).filter(i=>!isNaN(i.getTime()));for(let i of s)(!e||i>e)&&(e=i)}return e?e.toISOString():null}handleWebSocketEvent(e){switch(e.type){case"message":let n=e.data;if(this.session){let u=this.session.messages.findIndex(l=>l.id===n.id);if(u<0&&n.sender==="visitor"&&(u=this.session.messages.findIndex(l=>l.id.startsWith("temp-")&&l.content===n.content&&l.sender==="visitor"),u>=0&&(this.session.messages[u].id=n.id)),u<0&&n.sender!=="visitor"){let l=new Date(n.timestamp).getTime();u=this.session.messages.findIndex(g=>g.sender===n.sender&&g.content===n.content&&Math.abs(new Date(g.timestamp).getTime()-l)<2e3)}if(u>=0){let l=this.session.messages[u],g=!1;n.status&&n.status!==l.status&&(l.status=n.status,g=!0,n.deliveredAt&&(l.deliveredAt=n.deliveredAt),n.readAt&&(l.readAt=n.readAt),this.emit("read",{messageIds:[n.id],status:n.status})),n.content!==void 0&&n.content!==l.content&&(l.content=n.content,g=!0),n.editedAt!==void 0&&n.editedAt!==l.editedAt&&(l.editedAt=n.editedAt,g=!0),n.deletedAt!==void 0&&n.deletedAt!==l.deletedAt&&(l.deletedAt=n.deletedAt,g=!0),n.replyTo!==void 0&&(l.replyTo=n.replyTo,g=!0),n.attachments!==void 0&&(l.attachments=n.attachments,g=!0),g&&this.emit("message",l)}else this.session.messages.push(n),this.emit("message",n),this.config.onMessage?.(n)}n.sender!=="visitor"&&this.emit("typing",{isTyping:!1});break;case"typing":let s=e.data;s.sender!=="visitor"&&this.emit("typing",{isTyping:s.isTyping});break;case"presence":this.session&&(this.session.operatorOnline=e.data.online),this.emit("presence",e.data);break;case"ai_takeover":this.emit("aiTakeover",e.data);break;case"read":let i=e.data;if(this.session)for(let u of this.session.messages)i.messageIds.includes(u.id)&&(u.status=i.status,i.deliveredAt&&(u.deliveredAt=i.deliveredAt),i.readAt&&(u.readAt=i.readAt));this.emit("read",i);break;case"message_edited":if(this.session){let u=e.data,l=this.session.messages.findIndex(g=>g.id===u.messageId);if(l>=0){let g=this.session.messages[l];g.content=u.content,g.editedAt=u.editedAt??new Date().toISOString(),this.emit("message",g)}}break;case"message_deleted":if(this.session){let u=e.data,l=this.session.messages.findIndex(g=>g.id===u.messageId);if(l>=0){let g=this.session.messages[l];g.deletedAt=u.deletedAt??new Date().toISOString(),this.emit("message",g)}}break;case"event":let a=e.data;this.emitCustomEvent(a);break;case"version_warning":let r=e.data;this.handleVersionWarning(r);break;case"config_update":let c=e.data;c.trackedElements&&(this.setupTrackedElements(c.trackedElements),this.emit("configUpdate",c));break}}handleVersionWarning(e){let n="[PocketPing]",s=e.upgradeUrl?` Upgrade: ${e.upgradeUrl}`:" Update your widget to the latest version.";switch(e.severity){case"error":console.error(`${n} \u{1F6A8} VERSION ERROR: ${e.message}${s}`),console.error(`${n} Current: ${e.currentVersion}, Required: ${e.minVersion||"unknown"}`);break;case"warning":console.warn(`${n} \u26A0\uFE0F VERSION WARNING: ${e.message}${s}`),console.warn(`${n} Current: ${e.currentVersion}, Latest: ${e.latestVersion||"unknown"}`);break;case"info":console.info(`${n} \u2139\uFE0F ${e.message}`);break}this.emit("versionWarning",e),this.config.onVersionWarning?.(e),e.canContinue||(console.error(`${n} Widget is incompatible with backend. Please update immediately.`),this.disconnect())}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){console.warn("[PocketPing] Max reconnect attempts reached, trying SSE"),this.connectSSE();return}let e=Math.min(1e3*Math.pow(2,this.reconnectAttempts),3e4);this.reconnectAttempts++,this.reconnectTimeout=setTimeout(()=>{this.connectWebSocket()},e)}startPolling(){let e=async()=>{if(this.session){try{let n=this.getLastEventTimestamp(),s=await this.fetchMessages(n??void 0);this.pollingFailures=0;for(let i of s){let a=this.session.messages.findIndex(r=>r.id===i.id);if(a>=0){let r=this.session.messages[a],c=!1;i.status&&i.status!==r.status&&(r.status=i.status,c=!0,i.deliveredAt&&(r.deliveredAt=i.deliveredAt),i.readAt&&(r.readAt=i.readAt),this.emit("read",{messageIds:[i.id],status:i.status})),i.content!==void 0&&i.content!==r.content&&(r.content=i.content,c=!0),i.editedAt!==void 0&&i.editedAt!==r.editedAt&&(r.editedAt=i.editedAt,c=!0),i.deletedAt!==void 0&&i.deletedAt!==r.deletedAt&&(r.deletedAt=i.deletedAt,c=!0),i.replyTo!==void 0&&(r.replyTo=i.replyTo,c=!0),i.attachments!==void 0&&(r.attachments=i.attachments,c=!0),c&&this.emit("message",r)}else this.session.messages.push(i),this.emit("message",i),this.config.onMessage?.(i)}}catch(n){if(this.pollingFailures++,console.error("[PocketPing] \u274C Polling error:",n),(this.pollingFailures<=3||this.pollingFailures%3===0)&&console.warn(`[PocketPing] Polling failed (${this.pollingFailures}/${this.maxPollingFailures})`),this.pollingFailures>=this.maxPollingFailures){console.error("[PocketPing] Polling disabled after too many failures. Real-time updates unavailable."),this.emit("pollingDisabled",{failures:this.pollingFailures});return}}if(this.session){let n=this.pollingFailures>0?Math.min(2e3*Math.pow(2,this.pollingFailures-1),3e4):2e3;this.pollingTimeout=setTimeout(e,n)}}};this.pollingTimeout=setTimeout(e,500)}stopPolling(){this.pollingTimeout&&(clearTimeout(this.pollingTimeout),this.pollingTimeout=null),this.pollingFailures=0}async fetch(e,n){let s=this.config.endpoint.replace(/\/$/,"")+e,i=await fetch(s,{...n,headers:{"Content-Type":"application/json","X-PocketPing-Version":de,...n.headers}});if(this.checkVersionHeaders(i),!i.ok){let a=await i.text();throw new Error(`PocketPing API error: ${i.status} ${a}`)}return i.json()}checkVersionHeaders(e){let n=e.headers.get("X-PocketPing-Version-Status"),s=e.headers.get("X-PocketPing-Min-Version"),i=e.headers.get("X-PocketPing-Latest-Version"),a=e.headers.get("X-PocketPing-Version-Message");if(!n||n==="ok")return;let r="info",c=!0;n==="deprecated"?r="warning":n==="unsupported"?(r="error",c=!1):n==="outdated"&&(r="info");let u={severity:r,message:a||`Widget version ${de} is ${n}`,currentVersion:de,minVersion:s||void 0,latestVersion:i||void 0,canContinue:c,upgradeUrl:"https://docs.pocketping.io/widget/installation"};this.handleVersionWarning(u)}getOrCreateVisitorId(){let e="pocketping_visitor_id",n=localStorage.getItem(e);return n||(n=this.generateId(),localStorage.setItem(e,n)),n}getStoredSessionId(){return localStorage.getItem("pocketping_session_id")}storeSessionId(e){localStorage.setItem("pocketping_session_id",e)}getStoredIdentity(){try{let e=localStorage.getItem("pocketping_user_identity");return e?JSON.parse(e):null}catch{return null}}storeIdentity(e){localStorage.setItem("pocketping_user_identity",JSON.stringify(e))}clearIdentity(){localStorage.removeItem("pocketping_user_identity")}generateId(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,11)}`}};var y=null,q=null,Tn="https://app.pocketping.io/api/widget";function Ae(t){if(y)return console.warn("[PocketPing] Already initialized"),y;let e=t.endpoint;if(!e&&t.projectId&&(e=`${Tn}/${t.projectId}`),!e)throw new Error("[PocketPing] endpoint or projectId is required");let n={...t,endpoint:e};return y=new ue(n),q=document.createElement("div"),q.id="pocketping-container",document.body.appendChild(q),Ie(Se(kt,{client:y,config:t}),q),y.connect().catch(s=>{console.error("[PocketPing] Failed to connect:",s)}),y}function St(){q&&(Ie(null,q),q.remove(),q=null),y&&(y.disconnect(),y=null)}function Pt(){y?.setOpen(!0)}function Tt(){y?.setOpen(!1)}function It(){y?.toggleOpen()}function Mt(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.sendMessage(t,e)}async function Ct(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFile(t,e)}async function $t(t,e){if(!y)throw new Error("[PocketPing] Not initialized");return y.uploadFiles(t,e)}function At(t,e,n){if(!y){console.warn("[PocketPing] Not initialized, cannot trigger event");return}y.trigger(t,e,n)}function Rt(t){if(!y){console.warn("[PocketPing] Not initialized, cannot setup tracked elements");return}y.setupTrackedElements(t)}function Ot(){return y?.getTrackedElements()||[]}function Dt(t,e){return y?y.onEvent(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}function Lt(t,e){y?.offEvent(t,e)}async function Ht(t){if(!y)throw new Error("[PocketPing] Not initialized");return y.identify(t)}async function Ft(t){if(!y){console.warn("[PocketPing] Not initialized");return}return y.reset(t)}function Wt(){return y?.getIdentity()||null}function Nt(t,e){return y?y.on(t,e):(console.warn("[PocketPing] Not initialized, cannot subscribe to event"),()=>{})}if(typeof document<"u"){let t=document.currentScript;if(t){let e=t.dataset.projectId,n=t.dataset.endpoint;(e||n)&&Ae({projectId:e,endpoint:n,theme:t.dataset.theme||"auto",position:t.dataset.position||"bottom-right"})}}var In={init:Ae,destroy:St,open:Pt,close:Tt,toggle:It,sendMessage:Mt,uploadFile:Ct,uploadFiles:$t,trigger:At,onEvent:Dt,offEvent:Lt,on:Nt,identify:Ht,reset:Ft,getIdentity:Wt,setupTrackedElements:Rt,getTrackedElements:Ot};return pn(Mn);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pocketping/widget",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "type": "module",
5
5
  "description": "Embeddable chat widget for PocketPing",
6
6
  "main": "dist/index.cjs",