@tekibo/feedpulse-sdk 0.7.0 → 0.7.3

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/nuxt.mjs CHANGED
@@ -1,11 +1,11 @@
1
- import { inject as O, defineComponent as E, ref as f, computed as B, watch as U, createElementBlock as b, openBlock as l, createElementVNode as t, createCommentVNode as w, Fragment as _, renderList as L, normalizeStyle as P, toDisplayString as D, withDirectives as R, vModelText as q, onMounted as F, onBeforeUnmount as M, createBlock as N, createTextVNode as I, createStaticVNode as W, Teleport as J, vModelCheckbox as j, provide as K, renderSlot as G } from "vue";
2
- import { CookieManager as Y, FeedPulseTracker as Q } from "./index.mjs";
3
- import { S as X } from "./struggle-detector-BqTHgw95.mjs";
4
- const H = /* @__PURE__ */ Symbol("feedpulse");
5
- function Z() {
6
- return O(H, null);
1
+ import { inject as U, defineComponent as E, ref as u, computed as F, watch as J, createElementBlock as f, openBlock as r, createElementVNode as e, createCommentVNode as h, Fragment as D, renderList as O, normalizeStyle as $, toDisplayString as T, withDirectives as B, vModelText as H, onMounted as N, onBeforeUnmount as Y, createBlock as j, createTextVNode as A, createStaticVNode as G, Teleport as K, vModelCheckbox as q, provide as Q, renderSlot as X } from "vue";
2
+ import { CursorActor as Z, CookieManager as L, FeedPulseTracker as ee } from "./index.mjs";
3
+ import { S as te } from "./struggle-detector-BqTHgw95.mjs";
4
+ const V = /* @__PURE__ */ Symbol("feedpulse");
5
+ function oe() {
6
+ return U(V, null);
7
7
  }
8
- const ee = { style: {
8
+ const ne = { style: {
9
9
  width: "360px",
10
10
  height: "520px",
11
11
  background: "#111827",
@@ -17,20 +17,20 @@ const ee = { style: {
17
17
  flexDirection: "column",
18
18
  overflow: "hidden",
19
19
  animation: "fp-panel-open 300ms ease-out"
20
- } }, te = { style: {
20
+ } }, ae = { style: {
21
21
  display: "flex",
22
22
  justifyContent: "space-between",
23
23
  alignItems: "center",
24
24
  padding: "12px 14px",
25
25
  borderBottom: "1px solid #374151",
26
26
  background: "#0f172a"
27
- } }, oe = { style: { flex: 1, overflowY: "auto", padding: "12px", display: "grid", gap: "10px" } }, ne = {
27
+ } }, ie = { style: { flex: 1, overflowY: "auto", padding: "12px", display: "grid", gap: "10px" } }, se = {
28
28
  key: 0,
29
29
  style: { display: "flex", gap: "8px" }
30
- }, ae = ["onClick"], ie = ["onClick"], se = {
30
+ }, le = ["onClick"], re = ["onClick"], de = {
31
31
  key: 0,
32
32
  style: { display: "flex", alignItems: "center", gap: "5px", padding: "4px 0" }
33
- }, le = {
33
+ }, ue = {
34
34
  key: 1,
35
35
  style: {
36
36
  border: "1px solid #f59e0b",
@@ -40,89 +40,125 @@ const ee = { style: {
40
40
  padding: "10px",
41
41
  fontSize: "12px"
42
42
  }
43
- }, re = { style: { display: "flex", gap: "8px" } }, de = ["disabled"], ue = ["disabled"], pe = ["href"], ce = /* @__PURE__ */ E({
43
+ }, pe = {
44
+ key: 2,
45
+ style: {
46
+ margin: "8px 0",
47
+ padding: "12px",
48
+ background: "#f0f0ff",
49
+ border: "1px solid #c7d2fe",
50
+ borderRadius: "10px",
51
+ fontSize: "13px",
52
+ color: "#111827"
53
+ }
54
+ }, ce = { style: { margin: "0 0 8px", fontWeight: "600" } }, fe = { style: { display: "flex", gap: "8px" } }, xe = {
55
+ key: 3,
56
+ style: {
57
+ margin: "0 0 8px",
58
+ padding: "10px",
59
+ background: "#ecfdf5",
60
+ border: "1px solid #6ee7b7",
61
+ borderRadius: "8px",
62
+ fontSize: "13px",
63
+ color: "#065f46"
64
+ }
65
+ }, ge = { style: { display: "flex", gap: "8px" } }, ve = ["disabled"], be = ["disabled"], ye = ["href"], me = /* @__PURE__ */ E({
44
66
  __name: "BotPanel",
45
67
  props: {
46
68
  botSessionId: {},
47
69
  config: {},
70
+ configId: {},
71
+ page: {},
48
72
  unavailable: { type: Boolean }
49
73
  },
50
74
  emits: ["close", "helpful", "escalated"],
51
- setup(r, { emit: x }) {
52
- const s = r, o = x, a = f({}), e = f([]), n = f(""), d = f(!1), g = f(!1), m = B(() => n.value.trim().length > 0 && !d.value && !s.unavailable && !g.value);
53
- function v() {
54
- return e.value.map((i) => ({
55
- role: i.role,
56
- content: i.content
75
+ setup(p, { emit: s }) {
76
+ const a = p, o = s, l = u({}), t = u([]), i = u(""), b = u(!1), y = u(!1), g = u(null), x = u(null), m = new Z(), k = F(() => i.value.trim().length > 0 && !b.value && !a.unavailable && !y.value);
77
+ function C() {
78
+ return t.value.map((S) => ({
79
+ role: S.role,
80
+ content: S.content
57
81
  }));
58
82
  }
59
- async function y(i) {
60
- if (i.preventDefault(), !m.value)
83
+ async function v(S) {
84
+ if (S.preventDefault(), !k.value)
61
85
  return;
62
- const u = n.value.trim();
63
- n.value = "", e.value.push({
86
+ const c = i.value.trim(), n = [
87
+ ...C(),
88
+ {
89
+ role: "user",
90
+ content: c
91
+ }
92
+ ];
93
+ i.value = "", t.value.push({
64
94
  id: `user-${Date.now()}`,
65
95
  role: "user",
66
- content: u
96
+ content: c
67
97
  });
68
- const p = `assistant-${Date.now()}`;
69
- e.value.push({
70
- id: p,
98
+ const d = `assistant-${Date.now()}`;
99
+ t.value.push({
100
+ id: d,
71
101
  role: "assistant",
72
102
  content: ""
73
- }), d.value = !0, g.value = !1;
103
+ }), b.value = !0, y.value = !1;
74
104
  try {
75
- const S = await fetch("/api/bot/chat-proxy", {
105
+ const w = await fetch("/api/bot/chat-proxy", {
76
106
  method: "POST",
77
107
  headers: { "content-type": "application/json" },
78
108
  body: JSON.stringify({
79
- botSessionId: s.botSessionId,
80
- config: s.config,
81
- messages: v()
109
+ botSessionId: a.botSessionId,
110
+ config: JSON.parse(JSON.stringify(a.config)),
111
+ configId: a.configId,
112
+ page: a.page,
113
+ messages: n
82
114
  })
83
115
  });
84
- if (S.status === 402) {
85
- g.value = !0;
86
- const k = e.value.find((z) => z.id === p);
87
- k && (k.content = "Service temporarily unavailable.");
116
+ if (w.status === 402) {
117
+ y.value = !0;
118
+ const _ = t.value.find((W) => W.id === d);
119
+ _ && (_.content = "Service temporarily unavailable.");
88
120
  return;
89
121
  }
90
- if (!S.ok)
122
+ if (!w.ok)
91
123
  throw new Error("Chat request failed");
92
- const $ = S.body?.getReader();
93
- if (!$)
94
- throw new Error("Missing stream");
95
- const h = new TextDecoder();
96
- let c = !1;
97
- for (; !c; ) {
98
- const k = await $.read();
99
- if (c = k.done, k.value) {
100
- const z = h.decode(k.value, { stream: !c }), A = e.value.find((V) => V.id === p);
101
- A && (A.content += z);
102
- }
103
- }
124
+ const P = await w.json(), I = t.value.find((_) => _.id === d);
125
+ I && (I.content = P.text || ""), P.action && (g.value = P.action);
104
126
  } catch {
105
- const S = e.value.find(($) => $.id === p);
106
- S && !S.content && (S.content = "Sorry, I couldn't process that. Please try again.");
127
+ const w = t.value.find((P) => P.id === d);
128
+ w && !w.content && (w.content = "Sorry, I couldn't process that. Please try again.");
107
129
  } finally {
108
- d.value = !1;
130
+ b.value = !1;
109
131
  }
110
132
  }
111
- function T(i, u) {
112
- a.value[i] = u, o("helpful", u);
133
+ function z(S, c) {
134
+ l.value[S] = c, o("helpful", c);
113
135
  }
114
- function C() {
136
+ function M() {
115
137
  o("escalated");
116
138
  }
117
- return U(() => s.botSessionId, () => {
118
- a.value = {}, e.value = [], n.value = "", g.value = !1;
119
- }), (i, u) => (l(), b("div", ee, [
120
- t("div", te, [
121
- u[2] || (u[2] = t("div", { style: { display: "grid", gap: "2px" } }, [
122
- t("strong", { style: { fontSize: "14px", color: "#fff" } }, "Pulse Bot"),
123
- t("span", { style: { fontSize: "11px", color: "#94a3b8" } }, "Powered by FeedPulse AI")
139
+ async function R(S) {
140
+ if (!g.value)
141
+ return;
142
+ if (!S) {
143
+ g.value = null, x.value = "No problem! Let me know if you need anything else.";
144
+ return;
145
+ }
146
+ const c = g.value;
147
+ g.value = null;
148
+ const n = await m.perform(c);
149
+ x.value = n.message, setTimeout(() => {
150
+ x.value = null;
151
+ }, 3e3);
152
+ }
153
+ return J(() => a.botSessionId, () => {
154
+ l.value = {}, t.value = [], i.value = "", y.value = !1, g.value = null, x.value = null;
155
+ }), (S, c) => (r(), f("div", ne, [
156
+ e("div", ae, [
157
+ c[4] || (c[4] = e("div", { style: { display: "grid", gap: "2px" } }, [
158
+ e("strong", { style: { fontSize: "14px", color: "#fff" } }, "Pulse Bot"),
159
+ e("span", { style: { fontSize: "11px", color: "#94a3b8" } }, "Powered by FeedPulse AI")
124
160
  ], -1)),
125
- t("button", {
161
+ e("button", {
126
162
  style: {
127
163
  border: "none",
128
164
  background: "transparent",
@@ -131,72 +167,86 @@ const ee = { style: {
131
167
  fontSize: "18px",
132
168
  lineHeight: "1"
133
169
  },
134
- onClick: u[0] || (u[0] = (p) => o("close"))
170
+ onClick: c[0] || (c[0] = (n) => o("close"))
135
171
  }, " × ")
136
172
  ]),
137
- t("div", oe, [
138
- (l(!0), b(_, null, L(e.value, (p) => (l(), b("div", {
139
- key: p.id,
140
- style: P({
173
+ e("div", ie, [
174
+ (r(!0), f(D, null, O(t.value, (n) => (r(), f("div", {
175
+ key: n.id,
176
+ style: $({
141
177
  display: "grid",
142
- justifyItems: p.role === "user" ? "end" : "start",
178
+ justifyItems: n.role === "user" ? "end" : "start",
143
179
  gap: "6px"
144
180
  })
145
181
  }, [
146
- t("div", {
147
- style: P({
182
+ e("div", {
183
+ style: $({
148
184
  maxWidth: "85%",
149
185
  padding: "9px 11px",
150
- borderRadius: p.role === "user" ? "14px 14px 2px 14px" : "14px 14px 14px 2px",
151
- background: p.role === "user" ? "#4f46e5" : "#1f2937",
186
+ borderRadius: n.role === "user" ? "14px 14px 2px 14px" : "14px 14px 14px 2px",
187
+ background: n.role === "user" ? "#4f46e5" : "#1f2937",
152
188
  color: "#fff",
153
189
  fontSize: "13px",
154
190
  lineHeight: "1.4",
155
191
  whiteSpace: "pre-wrap"
156
192
  })
157
- }, D(p.content), 5),
158
- p.role === "assistant" ? (l(), b("div", ne, [
159
- t("button", {
160
- style: P({
193
+ }, T(n.content), 5),
194
+ n.role === "assistant" ? (r(), f("div", se, [
195
+ e("button", {
196
+ style: $({
161
197
  border: "1px solid #334155",
162
- background: a.value[p.id] === !0 ? "#16a34a" : "#0f172a",
198
+ background: l.value[n.id] === !0 ? "#16a34a" : "#0f172a",
163
199
  color: "#e2e8f0",
164
200
  borderRadius: "8px",
165
201
  fontSize: "12px",
166
202
  padding: "4px 8px",
167
203
  cursor: "pointer"
168
204
  }),
169
- onClick: (S) => T(p.id, !0)
170
- }, " 👍 ", 12, ae),
171
- t("button", {
172
- style: P({
205
+ onClick: (d) => z(n.id, !0)
206
+ }, " 👍 ", 12, le),
207
+ e("button", {
208
+ style: $({
173
209
  border: "1px solid #334155",
174
- background: a.value[p.id] === !1 ? "#dc2626" : "#0f172a",
210
+ background: l.value[n.id] === !1 ? "#dc2626" : "#0f172a",
175
211
  color: "#e2e8f0",
176
212
  borderRadius: "8px",
177
213
  fontSize: "12px",
178
214
  padding: "4px 8px",
179
215
  cursor: "pointer"
180
216
  }),
181
- onClick: (S) => T(p.id, !1)
182
- }, " 👎 ", 12, ie)
183
- ])) : w("", !0)
217
+ onClick: (d) => z(n.id, !1)
218
+ }, " 👎 ", 12, re)
219
+ ])) : h("", !0)
184
220
  ], 4))), 128)),
185
- d.value ? (l(), b("div", se, [...u[3] || (u[3] = [
186
- t("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 0ms" } }, null, -1),
187
- t("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 160ms" } }, null, -1),
188
- t("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 320ms" } }, null, -1)
189
- ])])) : w("", !0),
190
- r.unavailable || g.value ? (l(), b("div", le, " Service temporarily unavailable. ")) : w("", !0)
221
+ b.value ? (r(), f("div", de, [...c[5] || (c[5] = [
222
+ e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 0ms" } }, null, -1),
223
+ e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 160ms" } }, null, -1),
224
+ e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 320ms" } }, null, -1)
225
+ ])])) : h("", !0),
226
+ p.unavailable || y.value ? (r(), f("div", ue, " Service temporarily unavailable. ")) : h("", !0),
227
+ g.value ? (r(), f("div", pe, [
228
+ e("p", ce, " Want me to " + T(g.value.type) + ' "' + T(g.value.label) + '"? ', 1),
229
+ e("div", fe, [
230
+ e("button", {
231
+ style: { padding: "6px 16px", background: "#6366f1", color: "#fff", border: "none", borderRadius: "6px", cursor: "pointer", fontSize: "12px" },
232
+ onClick: c[1] || (c[1] = (n) => R(!0))
233
+ }, " ✓ Yes, do it "),
234
+ e("button", {
235
+ style: { padding: "6px 16px", background: "transparent", border: "1px solid #c7d2fe", borderRadius: "6px", cursor: "pointer", fontSize: "12px", color: "#111827" },
236
+ onClick: c[2] || (c[2] = (n) => R(!1))
237
+ }, " No thanks ")
238
+ ])
239
+ ])) : h("", !0),
240
+ x.value ? (r(), f("div", xe, T(x.value), 1)) : h("", !0)
191
241
  ]),
192
- t("form", {
242
+ e("form", {
193
243
  style: { padding: "10px", borderTop: "1px solid #374151", display: "grid", gap: "8px" },
194
- onSubmit: y
244
+ onSubmit: v
195
245
  }, [
196
- t("div", re, [
197
- R(t("input", {
198
- "onUpdate:modelValue": u[1] || (u[1] = (p) => n.value = p),
199
- disabled: d.value || r.unavailable,
246
+ e("div", ge, [
247
+ B(e("input", {
248
+ "onUpdate:modelValue": c[3] || (c[3] = (n) => i.value = n),
249
+ disabled: b.value || p.unavailable,
200
250
  style: {
201
251
  flex: 1,
202
252
  borderRadius: "10px",
@@ -208,66 +258,75 @@ const ee = { style: {
208
258
  outline: "none"
209
259
  },
210
260
  placeholder: "Ask a question..."
211
- }, null, 8, de), [
212
- [q, n.value]
261
+ }, null, 8, ve), [
262
+ [H, i.value]
213
263
  ]),
214
- t("button", {
264
+ e("button", {
215
265
  type: "submit",
216
- disabled: !m.value,
217
- style: P({
266
+ disabled: !k.value,
267
+ style: $({
218
268
  border: "none",
219
269
  borderRadius: "10px",
220
- background: m.value ? "#6366f1" : "#334155",
270
+ background: k.value ? "#6366f1" : "#334155",
221
271
  color: "#fff",
222
272
  fontWeight: "600",
223
273
  fontSize: "12px",
224
274
  padding: "0 14px",
225
- cursor: m.value ? "pointer" : "not-allowed"
275
+ cursor: k.value ? "pointer" : "not-allowed"
226
276
  })
227
- }, " Send ", 12, ue)
277
+ }, " Send ", 12, be)
228
278
  ]),
229
- r.config.escalateTo ? (l(), b("a", {
279
+ p.config.escalateTo ? (r(), f("a", {
230
280
  key: 0,
231
- href: r.config.escalateTo.url,
281
+ href: p.config.escalateTo.url,
232
282
  style: { color: "#c4b5fd", fontSize: "12px", textDecoration: "none" },
233
- onClick: C
234
- }, D(r.config.escalateTo.label), 9, pe)) : w("", !0)
283
+ onClick: M
284
+ }, T(p.config.escalateTo.label), 9, ye)) : h("", !0)
235
285
  ], 32)
236
286
  ]));
237
287
  }
238
- }), $e = /* @__PURE__ */ E({
288
+ }), Be = /* @__PURE__ */ E({
239
289
  __name: "FeedPulseBot",
240
290
  props: {
241
291
  faq: {},
242
292
  pageContext: {},
243
293
  systemPrompt: {},
244
294
  canNavigate: { type: Boolean },
295
+ navigableElements: {},
245
296
  canHelpForms: { type: Boolean },
297
+ formGuide: {},
298
+ features: {},
246
299
  escalateTo: {},
247
300
  initialMessage: { default: "👋 Need help?" },
248
- position: { default: "bottom-right" }
301
+ position: { default: "bottom-right" },
302
+ config: {},
303
+ configId: {}
249
304
  },
250
- setup(r) {
251
- const x = r, s = new Y(), o = f(!1), a = f(!1), e = f(!1), n = f(!1), d = f(""), g = f(null), m = f(!1);
252
- let v = null, y = null;
253
- const T = B(() => ({
254
- faq: x.faq || [],
255
- pageContext: x.pageContext || "",
256
- systemPrompt: x.systemPrompt || "",
257
- canNavigate: x.canNavigate ?? !1,
258
- canHelpForms: x.canHelpForms ?? !1,
259
- escalateTo: x.escalateTo
260
- })), C = B(() => ({
305
+ setup(p) {
306
+ const s = p, a = new L(), o = u(!1), l = u(!1), t = u(!1), i = u(!1), b = u(""), y = u(""), g = u(null), x = u(!1);
307
+ let m = null, k = null;
308
+ const C = F(() => s.config ?? {
309
+ pageContext: s.pageContext,
310
+ systemPrompt: s.systemPrompt,
311
+ faq: s.faq,
312
+ canNavigate: s.canNavigate,
313
+ navigableElements: s.navigableElements,
314
+ canHelpForms: s.canHelpForms,
315
+ formGuide: s.formGuide,
316
+ features: s.features,
317
+ escalateTo: s.escalateTo,
318
+ initialMessage: s.initialMessage
319
+ }), v = F(() => ({
261
320
  position: "fixed",
262
321
  bottom: "24px",
263
322
  zIndex: "10000",
264
- ...x.position === "bottom-left" ? { left: "24px" } : { right: "24px" }
323
+ ...s.position === "bottom-left" ? { left: "24px" } : { right: "24px" }
265
324
  }));
266
- function i() {
325
+ function z() {
267
326
  if (typeof document > "u" || document.getElementById("fp-bot-animations"))
268
327
  return;
269
- const h = document.createElement("style");
270
- h.id = "fp-bot-animations", h.textContent = `
328
+ const n = document.createElement("style");
329
+ n.id = "fp-bot-animations", n.textContent = `
271
330
  @keyframes fp-bubble-in {
272
331
  0% { opacity: 0; transform: scale(0.8) translateY(6px); }
273
332
  100% { opacity: 1; transform: scale(1) translateY(0); }
@@ -286,73 +345,73 @@ const ee = { style: {
286
345
  50% { opacity: 1; transform: translateY(-3px); }
287
346
  100% { opacity: 0.2; transform: translateY(0); }
288
347
  }
289
- `, document.head.appendChild(h);
348
+ `, document.head.appendChild(n);
290
349
  }
291
- async function u(h, c) {
292
- const k = s.getAllData(!0);
350
+ async function M(n, d) {
351
+ const w = a.getAllData(!0);
293
352
  try {
294
- const z = await fetch("/api/bot/session-proxy", {
353
+ const P = await fetch("/api/bot/session-proxy", {
295
354
  method: "POST",
296
355
  headers: { "content-type": "application/json" },
297
356
  body: JSON.stringify({
298
357
  page: window.location.pathname,
299
- triggerScore: h,
300
- triggerReasons: c,
301
- sessionId: k.sessionId,
302
- visitorId: k.userId,
358
+ triggerScore: n,
359
+ triggerReasons: d,
360
+ sessionId: w.sessionId,
361
+ visitorId: w.userId,
303
362
  device: navigator.userAgent
304
363
  })
305
364
  });
306
- if (!z.ok) {
307
- z.status === 402 && (n.value = !0);
365
+ if (!P.ok) {
366
+ P.status === 402 && (i.value = !0);
308
367
  return;
309
368
  }
310
- const A = await z.json().catch(() => null);
311
- A?.botSessionId && (d.value = A.botSessionId);
369
+ const I = await P.json().catch(() => null);
370
+ I?.botSessionId && (y.value = I.botSessionId);
312
371
  } catch {
313
372
  }
314
373
  }
315
- function p(h, c) {
316
- a.value = !0, o.value = !0, n.value = !1, g.value = null, m.value = !1, u(h, c), y && clearTimeout(y), y = setTimeout(() => {
374
+ function R(n, d) {
375
+ l.value = !0, o.value = !0, i.value = !1, g.value = null, x.value = !1, M(n, d), k && clearTimeout(k), k = setTimeout(() => {
317
376
  o.value = !1;
318
377
  }, 8e3);
319
378
  }
320
379
  function S() {
321
- e.value = !0, o.value = !1;
380
+ t.value = !0, o.value = !1;
322
381
  }
323
- async function $() {
324
- if (e.value = !1, !!d.value)
382
+ async function c() {
383
+ if (t.value = !1, !!y.value)
325
384
  try {
326
385
  await fetch("/api/bot/session-end-proxy", {
327
386
  method: "POST",
328
387
  headers: { "content-type": "application/json" },
329
388
  body: JSON.stringify({
330
- botSessionId: d.value,
389
+ botSessionId: y.value,
331
390
  wasHelpful: g.value,
332
- escalated: m.value
391
+ escalated: x.value
333
392
  })
334
393
  });
335
394
  } catch {
336
395
  }
337
396
  }
338
- return F(() => {
339
- i(), v = new X({
340
- onTrigger: (h, c) => {
341
- p(h, c);
397
+ return N(() => {
398
+ z(), b.value = window.location.pathname, m = new te({
399
+ onTrigger: (n, d) => {
400
+ R(n, d);
342
401
  }
343
- }), v.start();
344
- }), M(() => {
345
- v?.stop(), y && clearTimeout(y);
346
- }), (h, c) => (l(), b("div", {
347
- style: P(C.value)
402
+ }), m.start();
403
+ }), Y(() => {
404
+ m?.stop(), k && clearTimeout(k);
405
+ }), (n, d) => (r(), f("div", {
406
+ style: $(v.value)
348
407
  }, [
349
- o.value && !e.value ? (l(), b("div", {
408
+ o.value && !t.value ? (r(), f("div", {
350
409
  key: 0,
351
- style: P({
410
+ style: $({
352
411
  position: "absolute",
353
412
  bottom: "62px",
354
- right: r.position === "bottom-right" ? "0" : "auto",
355
- left: r.position === "bottom-left" ? "0" : "auto",
413
+ right: p.position === "bottom-right" ? "0" : "auto",
414
+ left: p.position === "bottom-left" ? "0" : "auto",
356
415
  background: "#fff",
357
416
  border: "2px solid #6366f1",
358
417
  color: "#1f2937",
@@ -364,8 +423,8 @@ const ee = { style: {
364
423
  animation: "fp-bubble-in 300ms ease-out"
365
424
  })
366
425
  }, [
367
- I(D(r.initialMessage) + " ", 1),
368
- c[2] || (c[2] = t("span", { style: {
426
+ A(T(C.value.initialMessage || p.initialMessage) + " ", 1),
427
+ d[2] || (d[2] = e("span", { style: {
369
428
  position: "absolute",
370
429
  right: "10px",
371
430
  bottom: "-12px",
@@ -374,7 +433,7 @@ const ee = { style: {
374
433
  borderLeft: "10px solid transparent",
375
434
  borderTop: "12px solid #6366f1"
376
435
  } }, null, -1)),
377
- c[3] || (c[3] = t("span", { style: {
436
+ d[3] || (d[3] = e("span", { style: {
378
437
  position: "absolute",
379
438
  right: "11px",
380
439
  bottom: "-9px",
@@ -383,8 +442,8 @@ const ee = { style: {
383
442
  borderLeft: "9px solid transparent",
384
443
  borderTop: "11px solid #fff"
385
444
  } }, null, -1))
386
- ], 4)) : w("", !0),
387
- a.value && !e.value ? (l(), b("button", {
445
+ ], 4)) : h("", !0),
446
+ l.value && !t.value ? (r(), f("button", {
388
447
  key: 1,
389
448
  style: {
390
449
  width: "48px",
@@ -399,212 +458,214 @@ const ee = { style: {
399
458
  animation: "fp-bounce 600ms ease-out"
400
459
  },
401
460
  onClick: S
402
- }, [...c[4] || (c[4] = [
403
- W('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2"><rect x="3" y="8" width="18" height="13" rx="2"></rect><path d="M12 8V5"></path><circle cx="12" cy="4" r="1"></circle><circle cx="8" cy="13" r="1.5" fill="white" stroke="none"></circle><circle cx="16" cy="13" r="1.5" fill="white" stroke="none"></circle><path d="M9 17h6" stroke-linecap="round"></path></svg>', 1)
404
- ])])) : w("", !0),
405
- e.value && d.value ? (l(), N(ce, {
461
+ }, [...d[4] || (d[4] = [
462
+ G('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2"><rect x="3" y="8" width="18" height="13" rx="2"></rect><path d="M12 8V5"></path><circle cx="12" cy="4" r="1"></circle><circle cx="8" cy="13" r="1.5" fill="white" stroke="none"></circle><circle cx="16" cy="13" r="1.5" fill="white" stroke="none"></circle><path d="M9 17h6" stroke-linecap="round"></path></svg>', 1)
463
+ ])])) : h("", !0),
464
+ t.value && y.value ? (r(), j(me, {
406
465
  key: 2,
407
- "bot-session-id": d.value,
408
- config: T.value,
409
- unavailable: n.value,
410
- onClose: $,
411
- onHelpful: c[0] || (c[0] = (k) => g.value = k),
412
- onEscalated: c[1] || (c[1] = (k) => m.value = !0)
413
- }, null, 8, ["bot-session-id", "config", "unavailable"])) : w("", !0)
466
+ "bot-session-id": y.value,
467
+ config: C.value,
468
+ "config-id": p.configId,
469
+ page: b.value,
470
+ unavailable: i.value,
471
+ onClose: c,
472
+ onHelpful: d[0] || (d[0] = (w) => g.value = w),
473
+ onEscalated: d[1] || (d[1] = (w) => x.value = !0)
474
+ }, null, 8, ["bot-session-id", "config", "config-id", "page", "unavailable"])) : h("", !0)
414
475
  ], 4));
415
476
  }
416
- }), fe = {
477
+ }), ke = {
417
478
  key: 0,
418
479
  style: { position: "fixed", bottom: "0", left: "0", right: "0", "z-index": "99999", background: "#1a1a1a", color: "#fff", padding: "20px 24px", "border-top": "1px solid #333", "font-family": "sans-serif" }
419
- }, xe = { style: { "max-width": "900px", margin: "0 auto" } }, be = {
480
+ }, he = { style: { "max-width": "900px", margin: "0 auto" } }, we = {
420
481
  key: 0,
421
482
  style: { "margin-bottom": "12px", "font-size": "13px" }
422
- }, ye = { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px" } }, ge = { style: { display: "flex", "align-items": "center", gap: "8px" } }, ve = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap", "align-items": "center" } }, me = /* @__PURE__ */ E({
483
+ }, Se = { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px" } }, Ce = { style: { display: "flex", "align-items": "center", gap: "8px" } }, ze = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap", "align-items": "center" } }, Pe = /* @__PURE__ */ E({
423
484
  __name: "consent-banner",
424
485
  emits: ["consent"],
425
- setup(r, { emit: x }) {
426
- const s = x, o = new Y(), a = f(!1), e = f(!1), n = f(!1), d = f(!1);
427
- function g() {
428
- a.value = !0, e.value = !0;
486
+ setup(p, { emit: s }) {
487
+ const a = s, o = new L(), l = u(!1), t = u(!1), i = u(!1), b = u(!1);
488
+ function y() {
489
+ l.value = !0, t.value = !0;
429
490
  }
430
- F(() => {
491
+ N(() => {
431
492
  const C = o.getConsent();
432
- a.value = !C || o.isConsentExpired(), C && (n.value = C.analytics, d.value = C.marketing), typeof window < "u" && (window.addEventListener("feedpulse:open-consent", g), window.addEventListener("feedpulse:withdraw-consent", T));
493
+ l.value = !C || o.isConsentExpired(), C && (i.value = C.analytics, b.value = C.marketing), typeof window < "u" && (window.addEventListener("feedpulse:open-consent", y), window.addEventListener("feedpulse:withdraw-consent", k));
433
494
  });
434
- function m() {
435
- o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), s("consent", { analytics: !0, marketing: !0, action: "accept_all" }), a.value = !1;
495
+ function g() {
496
+ o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), a("consent", { analytics: !0, marketing: !0, action: "accept_all" }), l.value = !1;
436
497
  }
437
- function v() {
438
- o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), s("consent", { analytics: !1, marketing: !1, action: "reject_all" }), a.value = !1;
498
+ function x() {
499
+ o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), a("consent", { analytics: !1, marketing: !1, action: "reject_all" }), l.value = !1;
439
500
  }
440
- function y() {
441
- o.setConsent({ analytics: n.value, marketing: d.value, version: "1.0" }), n.value || o.clearAnalyticsCookies(), s("consent", { analytics: n.value, marketing: d.value, action: "custom" }), a.value = !1;
501
+ function m() {
502
+ o.setConsent({ analytics: i.value, marketing: b.value, version: "1.0" }), i.value || o.clearAnalyticsCookies(), a("consent", { analytics: i.value, marketing: b.value, action: "custom" }), l.value = !1;
442
503
  }
443
- function T() {
444
- o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), n.value = !1, d.value = !1, s("consent", { analytics: !1, marketing: !1, action: "withdraw" }), a.value = !0;
504
+ function k() {
505
+ o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), i.value = !1, b.value = !1, a("consent", { analytics: !1, marketing: !1, action: "withdraw" }), l.value = !0;
445
506
  }
446
- return M(() => {
447
- typeof window < "u" && (window.removeEventListener("feedpulse:open-consent", g), window.removeEventListener("feedpulse:withdraw-consent", T));
448
- }), (C, i) => (l(), N(J, { to: "body" }, [
449
- a.value ? (l(), b("div", fe, [
450
- t("div", xe, [
451
- i[6] || (i[6] = t("p", { style: { margin: "0 0 12px", "font-size": "14px", "line-height": "1.5" } }, [
452
- I(" We use cookies to improve reliability and understand usage. "),
453
- t("a", {
507
+ return Y(() => {
508
+ typeof window < "u" && (window.removeEventListener("feedpulse:open-consent", y), window.removeEventListener("feedpulse:withdraw-consent", k));
509
+ }), (C, v) => (r(), j(K, { to: "body" }, [
510
+ l.value ? (r(), f("div", ke, [
511
+ e("div", he, [
512
+ v[6] || (v[6] = e("p", { style: { margin: "0 0 12px", "font-size": "14px", "line-height": "1.5" } }, [
513
+ A(" We use cookies to improve reliability and understand usage. "),
514
+ e("a", {
454
515
  href: "/privacy",
455
516
  style: { color: "#818cf8" }
456
517
  }, "Privacy Policy")
457
518
  ], -1)),
458
- e.value ? (l(), b("div", be, [
459
- i[5] || (i[5] = t("label", { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px", opacity: "0.75" } }, [
460
- t("input", {
519
+ t.value ? (r(), f("div", we, [
520
+ v[5] || (v[5] = e("label", { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px", opacity: "0.75" } }, [
521
+ e("input", {
461
522
  type: "checkbox",
462
523
  checked: "",
463
524
  disabled: ""
464
525
  }),
465
- I(" Necessary (always on) ")
526
+ A(" Necessary (always on) ")
466
527
  ], -1)),
467
- t("label", ye, [
468
- R(t("input", {
469
- "onUpdate:modelValue": i[0] || (i[0] = (u) => n.value = u),
528
+ e("label", Se, [
529
+ B(e("input", {
530
+ "onUpdate:modelValue": v[0] || (v[0] = (z) => i.value = z),
470
531
  type: "checkbox"
471
532
  }, null, 512), [
472
- [j, n.value]
533
+ [q, i.value]
473
534
  ]),
474
- i[3] || (i[3] = I(" Analytics ", -1))
535
+ v[3] || (v[3] = A(" Analytics ", -1))
475
536
  ]),
476
- t("label", ge, [
477
- R(t("input", {
478
- "onUpdate:modelValue": i[1] || (i[1] = (u) => d.value = u),
537
+ e("label", Ce, [
538
+ B(e("input", {
539
+ "onUpdate:modelValue": v[1] || (v[1] = (z) => b.value = z),
479
540
  type: "checkbox"
480
541
  }, null, 512), [
481
- [j, d.value]
542
+ [q, b.value]
482
543
  ]),
483
- i[4] || (i[4] = I(" Marketing ", -1))
544
+ v[4] || (v[4] = A(" Marketing ", -1))
484
545
  ])
485
- ])) : w("", !0),
486
- t("div", ve, [
487
- t("button", {
546
+ ])) : h("", !0),
547
+ e("div", ze, [
548
+ e("button", {
488
549
  style: { width: "130px", padding: "9px 12px", background: "#4f46e5", color: "#fff", border: "1px solid #4f46e5", "border-radius": "6px", "font-size": "13px", "font-weight": "600", cursor: "pointer" },
489
- onClick: m
550
+ onClick: g
490
551
  }, " Accept All "),
491
- t("button", {
552
+ e("button", {
492
553
  style: { width: "130px", padding: "9px 12px", background: "transparent", color: "#fff", border: "1px solid #555", "border-radius": "6px", "font-size": "13px", "font-weight": "600", cursor: "pointer" },
493
- onClick: v
554
+ onClick: x
494
555
  }, " Reject All "),
495
- t("button", {
556
+ e("button", {
496
557
  style: { padding: "9px 16px", background: "transparent", color: "#aaa", border: "1px solid #333", "border-radius": "6px", "font-size": "13px", cursor: "pointer" },
497
- onClick: i[2] || (i[2] = (u) => e.value ? y() : e.value = !0)
498
- }, D(e.value ? "Save Preferences" : "Customize"), 1)
558
+ onClick: v[2] || (v[2] = (z) => t.value ? m() : t.value = !0)
559
+ }, T(t.value ? "Save Preferences" : "Customize"), 1)
499
560
  ])
500
561
  ])
501
- ])) : w("", !0)
562
+ ])) : h("", !0)
502
563
  ]));
503
564
  }
504
- }), Ae = /* @__PURE__ */ E({
565
+ }), Me = /* @__PURE__ */ E({
505
566
  __name: "FeedPulseProvider",
506
567
  props: {
507
568
  proxyEndpoint: { default: "/api/fp-proxy" },
508
569
  debug: { type: Boolean },
509
570
  consentRequired: { type: Boolean, default: !0 }
510
571
  },
511
- setup(r) {
512
- const x = r, s = new Y(), o = new Q({
513
- proxyEndpoint: x.proxyEndpoint,
514
- debug: x.debug
572
+ setup(p) {
573
+ const s = p, a = new L(), o = new ee({
574
+ proxyEndpoint: s.proxyEndpoint,
575
+ debug: s.debug
515
576
  });
516
- K(H, o);
517
- function a(e) {
518
- const n = s.setConsent({
519
- analytics: e.analytics,
520
- marketing: e.marketing,
577
+ Q(V, o);
578
+ function l(t) {
579
+ const i = a.setConsent({
580
+ analytics: t.analytics,
581
+ marketing: t.marketing,
521
582
  version: "1.0"
522
583
  });
523
- e.analytics || s.clearAnalyticsCookies(), o.updateCookieData(s.getAllData(e.analytics)), o.track("consent", "__consent__", {
524
- analytics: e.analytics,
525
- marketing: e.marketing,
526
- action: e.action,
584
+ t.analytics || a.clearAnalyticsCookies(), o.updateCookieData(a.getAllData(t.analytics)), o.track("consent", "__consent__", {
585
+ analytics: t.analytics,
586
+ marketing: t.marketing,
587
+ action: t.action,
527
588
  userAgent: navigator.userAgent,
528
- version: n.version
589
+ version: i.version
529
590
  });
530
591
  }
531
- return F(() => {
532
- const e = s.getConsent();
533
- x.consentRequired === !1 ? (s.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), o.updateCookieData(s.getAllData(!0))) : e && !s.isConsentExpired() ? o.updateCookieData(s.getAllData(e.analytics)) : o.updateCookieData(s.getAllData(!1)), o.init();
534
- }), M(() => o.destroy()), (e, n) => (l(), b(_, null, [
535
- G(e.$slots, "default"),
536
- r.consentRequired !== !1 ? (l(), N(me, {
592
+ return N(() => {
593
+ const t = a.getConsent();
594
+ s.consentRequired === !1 ? (a.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), o.updateCookieData(a.getAllData(!0))) : t && !a.isConsentExpired() ? o.updateCookieData(a.getAllData(t.analytics)) : o.updateCookieData(a.getAllData(!1)), o.init();
595
+ }), Y(() => o.destroy()), (t, i) => (r(), f(D, null, [
596
+ X(t.$slots, "default"),
597
+ p.consentRequired !== !1 ? (r(), j(Pe, {
537
598
  key: 0,
538
- onConsent: a
539
- })) : w("", !0)
599
+ onConsent: l
600
+ })) : h("", !0)
540
601
  ], 64));
541
602
  }
542
- }), he = {
603
+ }), $e = {
543
604
  key: 1,
544
605
  style: { background: "#fff", border: "1px solid #e5e7eb", "border-radius": "12px", padding: "16px", width: "280px", "box-shadow": "0 10px 25px rgba(0,0,0,0.15)" }
545
- }, ke = { style: { margin: "0 0 12px", "font-weight": "600", color: "#111" } }, we = { style: { display: "flex", gap: "6px", "margin-bottom": "12px" } }, Se = ["onClick"], Ce = {
606
+ }, Te = { style: { margin: "0 0 12px", "font-weight": "600", color: "#111" } }, Ie = { style: { display: "flex", gap: "6px", "margin-bottom": "12px" } }, Ae = ["onClick"], Ee = {
546
607
  key: 1,
547
608
  style: { "text-align": "center", padding: "16px", color: "#111" }
548
- }, Ie = /* @__PURE__ */ E({
609
+ }, Fe = /* @__PURE__ */ E({
549
610
  __name: "FeedPulseWidget",
550
611
  props: {
551
612
  id: {},
552
613
  placeholder: {},
553
614
  position: { default: "bottom-right" }
554
615
  },
555
- setup(r) {
556
- const x = r, s = Z(), o = f(x.position === "inline"), a = f(null), e = f(""), n = f(!1);
557
- function d(m) {
558
- a.value = m;
616
+ setup(p) {
617
+ const s = p, a = oe(), o = u(s.position === "inline"), l = u(null), t = u(""), i = u(!1);
618
+ function b(g) {
619
+ l.value = g;
559
620
  }
560
- function g() {
561
- !a.value && !e.value.trim() || (s?.trackFeedback(x.id ?? null, a.value, e.value || null), n.value = !0, setTimeout(() => {
562
- o.value = x.position === "inline", n.value = !1, a.value = null, e.value = "";
621
+ function y() {
622
+ !l.value && !t.value.trim() || (a?.trackFeedback(s.id ?? null, l.value, t.value || null), i.value = !0, setTimeout(() => {
623
+ o.value = s.position === "inline", i.value = !1, l.value = null, t.value = "";
563
624
  }, 2e3));
564
625
  }
565
- return (m, v) => (l(), b("div", {
626
+ return (g, x) => (r(), f("div", {
566
627
  class: "feedpulse-widget",
567
- style: P(r.position !== "inline" ? `position:fixed; ${r.position === "bottom-right" ? "right:24px" : "left:24px"}; bottom:24px; z-index:9999;` : "")
628
+ style: $(p.position !== "inline" ? `position:fixed; ${p.position === "bottom-right" ? "right:24px" : "left:24px"}; bottom:24px; z-index:9999;` : "")
568
629
  }, [
569
- r.position !== "inline" ? (l(), b("button", {
630
+ p.position !== "inline" ? (r(), f("button", {
570
631
  key: 0,
571
632
  style: { background: "#6366f1", color: "#fff", border: "none", "border-radius": "50%", width: "48px", height: "48px", "font-size": "20px", cursor: "pointer" },
572
- onClick: v[0] || (v[0] = (y) => o.value = !o.value)
573
- }, " 💬 ")) : w("", !0),
574
- o.value ? (l(), b("div", he, [
575
- n.value ? (l(), b("div", Ce, [...v[2] || (v[2] = [
576
- t("p", { style: { "font-size": "28px", margin: "0" } }, " 🎉 ", -1),
577
- t("p", { style: { margin: "8px 0 0", "font-weight": "600" } }, " Thanks for your feedback! ", -1)
578
- ])])) : (l(), b(_, { key: 0 }, [
579
- t("p", ke, D(r.placeholder ?? "How was your experience?"), 1),
580
- t("div", we, [
581
- (l(), b(_, null, L(5, (y) => t("button", {
582
- key: y,
583
- style: P({ background: "none", border: "none", cursor: "pointer", fontSize: "24px", opacity: a.value !== null && y <= a.value ? 1 : 0.3 }),
584
- onClick: (T) => d(y)
585
- }, " ⭐ ", 12, Se)), 64))
633
+ onClick: x[0] || (x[0] = (m) => o.value = !o.value)
634
+ }, " 💬 ")) : h("", !0),
635
+ o.value ? (r(), f("div", $e, [
636
+ i.value ? (r(), f("div", Ee, [...x[2] || (x[2] = [
637
+ e("p", { style: { "font-size": "28px", margin: "0" } }, " 🎉 ", -1),
638
+ e("p", { style: { margin: "8px 0 0", "font-weight": "600" } }, " Thanks for your feedback! ", -1)
639
+ ])])) : (r(), f(D, { key: 0 }, [
640
+ e("p", Te, T(p.placeholder ?? "How was your experience?"), 1),
641
+ e("div", Ie, [
642
+ (r(), f(D, null, O(5, (m) => e("button", {
643
+ key: m,
644
+ style: $({ background: "none", border: "none", cursor: "pointer", fontSize: "24px", opacity: l.value !== null && m <= l.value ? 1 : 0.3 }),
645
+ onClick: (k) => b(m)
646
+ }, " ⭐ ", 12, Ae)), 64))
586
647
  ]),
587
- R(t("textarea", {
588
- "onUpdate:modelValue": v[1] || (v[1] = (y) => e.value = y),
648
+ B(e("textarea", {
649
+ "onUpdate:modelValue": x[1] || (x[1] = (m) => t.value = m),
589
650
  placeholder: "Tell us more (optional)...",
590
651
  rows: "3",
591
652
  style: { width: "100%", padding: "8px", border: "1px solid #d1d5db", "border-radius": "8px", resize: "none", "font-size": "14px" }
592
653
  }, null, 512), [
593
- [q, e.value]
654
+ [H, t.value]
594
655
  ]),
595
- t("button", {
656
+ e("button", {
596
657
  style: { "margin-top": "10px", width: "100%", background: "#6366f1", color: "#fff", border: "none", "border-radius": "8px", padding: "10px", "font-weight": "600", cursor: "pointer" },
597
- onClick: g
658
+ onClick: y
598
659
  }, " Submit Feedback ")
599
660
  ], 64))
600
- ])) : w("", !0)
661
+ ])) : h("", !0)
601
662
  ], 4));
602
663
  }
603
664
  });
604
665
  export {
605
- me as ConsentBanner,
606
- $e as FeedPulseBot,
607
- Ae as FeedPulseProvider,
608
- Ie as FeedPulseWidget,
609
- Z as useFeedPulse
666
+ Pe as ConsentBanner,
667
+ Be as FeedPulseBot,
668
+ Me as FeedPulseProvider,
669
+ Fe as FeedPulseWidget,
670
+ oe as useFeedPulse
610
671
  };