@tekibo/feedpulse-sdk 0.7.1 → 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 V, defineComponent as D, ref as x, computed as B, watch as U, createElementBlock as g, openBlock as r, createElementVNode as t, createCommentVNode as w, Fragment as _, renderList as L, normalizeStyle as T, toDisplayString as I, withDirectives as R, vModelText as O, onMounted as M, onBeforeUnmount as F, createBlock as N, createTextVNode as A, createStaticVNode as W, Teleport as J, vModelCheckbox as j, provide as G, renderSlot as K } 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 q = /* @__PURE__ */ Symbol("feedpulse");
5
- function Z() {
6
- return V(q, 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__ */ D({
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(d, { emit: a }) {
52
- const l = d, o = a, i = x({}), e = x([]), n = x(""), u = x(!1), y = x(!1), m = B(() => n.value.trim().length > 0 && !u.value && !l.unavailable && !y.value);
53
- function v() {
54
- return e.value.map((s) => ({
55
- role: s.role,
56
- content: s.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 b(s) {
60
- if (s.preventDefault(), !m.value)
83
+ async function v(S) {
84
+ if (S.preventDefault(), !k.value)
61
85
  return;
62
- const p = 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: p
96
+ content: c
67
97
  });
68
- const c = `assistant-${Date.now()}`;
69
- e.value.push({
70
- id: c,
98
+ const d = `assistant-${Date.now()}`;
99
+ t.value.push({
100
+ id: d,
71
101
  role: "assistant",
72
102
  content: ""
73
- }), u.value = !0, y.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: l.botSessionId,
80
- config: JSON.parse(JSON.stringify(l.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) {
116
+ if (w.status === 402) {
85
117
  y.value = !0;
86
- const k = e.value.find((z) => z.id === c);
87
- k && (k.content = "Service temporarily unavailable.");
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 f = !1;
97
- for (; !f; ) {
98
- const k = await $.read();
99
- if (f = k.done, k.value) {
100
- const z = h.decode(k.value, { stream: !f }), E = e.value.find((H) => H.id === c);
101
- E && (E.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 === c);
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
- u.value = !1;
130
+ b.value = !1;
109
131
  }
110
132
  }
111
- function C(s, p) {
112
- i.value[s] = p, o("helpful", p);
133
+ function z(S, c) {
134
+ l.value[S] = c, o("helpful", c);
113
135
  }
114
- function P() {
136
+ function M() {
115
137
  o("escalated");
116
138
  }
117
- return U(() => l.botSessionId, () => {
118
- i.value = {}, e.value = [], n.value = "", y.value = !1;
119
- }), (s, p) => (r(), g("div", ee, [
120
- t("div", te, [
121
- p[2] || (p[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: p[0] || (p[0] = (c) => o("close"))
170
+ onClick: c[0] || (c[0] = (n) => o("close"))
135
171
  }, " × ")
136
172
  ]),
137
- t("div", oe, [
138
- (r(!0), g(_, null, L(e.value, (c) => (r(), g("div", {
139
- key: c.id,
140
- style: T({
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: c.role === "user" ? "end" : "start",
178
+ justifyItems: n.role === "user" ? "end" : "start",
143
179
  gap: "6px"
144
180
  })
145
181
  }, [
146
- t("div", {
147
- style: T({
182
+ e("div", {
183
+ style: $({
148
184
  maxWidth: "85%",
149
185
  padding: "9px 11px",
150
- borderRadius: c.role === "user" ? "14px 14px 2px 14px" : "14px 14px 14px 2px",
151
- background: c.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
- }, I(c.content), 5),
158
- c.role === "assistant" ? (r(), g("div", ne, [
159
- t("button", {
160
- style: T({
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: i.value[c.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) => C(c.id, !0)
170
- }, " 👍 ", 12, ae),
171
- t("button", {
172
- style: T({
205
+ onClick: (d) => z(n.id, !0)
206
+ }, " 👍 ", 12, le),
207
+ e("button", {
208
+ style: $({
173
209
  border: "1px solid #334155",
174
- background: i.value[c.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) => C(c.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
- u.value ? (r(), g("div", se, [...p[3] || (p[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
- d.unavailable || y.value ? (r(), g("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: b
244
+ onSubmit: v
195
245
  }, [
196
- t("div", re, [
197
- R(t("input", {
198
- "onUpdate:modelValue": p[1] || (p[1] = (c) => n.value = c),
199
- disabled: u.value || d.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,34 +258,34 @@ const ee = { style: {
208
258
  outline: "none"
209
259
  },
210
260
  placeholder: "Ask a question..."
211
- }, null, 8, de), [
212
- [O, 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: T({
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
- d.config.escalateTo ? (r(), g("a", {
279
+ p.config.escalateTo ? (r(), f("a", {
230
280
  key: 0,
231
- href: d.config.escalateTo.url,
281
+ href: p.config.escalateTo.url,
232
282
  style: { color: "#c4b5fd", fontSize: "12px", textDecoration: "none" },
233
- onClick: P
234
- }, I(d.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__ */ D({
288
+ }), Be = /* @__PURE__ */ E({
239
289
  __name: "FeedPulseBot",
240
290
  props: {
241
291
  faq: {},
@@ -249,33 +299,34 @@ const ee = { style: {
249
299
  escalateTo: {},
250
300
  initialMessage: { default: "👋 Need help?" },
251
301
  position: { default: "bottom-right" },
252
- config: {}
302
+ config: {},
303
+ configId: {}
253
304
  },
254
- setup(d) {
255
- const a = d, l = new Y(), o = x(!1), i = x(!1), e = x(!1), n = x(!1), u = x(""), y = x(null), m = x(!1);
256
- let v = null, b = null;
257
- const C = B(() => a.config ?? {
258
- pageContext: a.pageContext,
259
- systemPrompt: a.systemPrompt,
260
- faq: a.faq,
261
- canNavigate: a.canNavigate,
262
- navigableElements: a.navigableElements,
263
- canHelpForms: a.canHelpForms,
264
- formGuide: a.formGuide,
265
- features: a.features,
266
- escalateTo: a.escalateTo,
267
- initialMessage: a.initialMessage
268
- }), P = 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(() => ({
269
320
  position: "fixed",
270
321
  bottom: "24px",
271
322
  zIndex: "10000",
272
- ...a.position === "bottom-left" ? { left: "24px" } : { right: "24px" }
323
+ ...s.position === "bottom-left" ? { left: "24px" } : { right: "24px" }
273
324
  }));
274
- function s() {
325
+ function z() {
275
326
  if (typeof document > "u" || document.getElementById("fp-bot-animations"))
276
327
  return;
277
- const h = document.createElement("style");
278
- h.id = "fp-bot-animations", h.textContent = `
328
+ const n = document.createElement("style");
329
+ n.id = "fp-bot-animations", n.textContent = `
279
330
  @keyframes fp-bubble-in {
280
331
  0% { opacity: 0; transform: scale(0.8) translateY(6px); }
281
332
  100% { opacity: 1; transform: scale(1) translateY(0); }
@@ -294,73 +345,73 @@ const ee = { style: {
294
345
  50% { opacity: 1; transform: translateY(-3px); }
295
346
  100% { opacity: 0.2; transform: translateY(0); }
296
347
  }
297
- `, document.head.appendChild(h);
348
+ `, document.head.appendChild(n);
298
349
  }
299
- async function p(h, f) {
300
- const k = l.getAllData(!0);
350
+ async function M(n, d) {
351
+ const w = a.getAllData(!0);
301
352
  try {
302
- const z = await fetch("/api/bot/session-proxy", {
353
+ const P = await fetch("/api/bot/session-proxy", {
303
354
  method: "POST",
304
355
  headers: { "content-type": "application/json" },
305
356
  body: JSON.stringify({
306
357
  page: window.location.pathname,
307
- triggerScore: h,
308
- triggerReasons: f,
309
- sessionId: k.sessionId,
310
- visitorId: k.userId,
358
+ triggerScore: n,
359
+ triggerReasons: d,
360
+ sessionId: w.sessionId,
361
+ visitorId: w.userId,
311
362
  device: navigator.userAgent
312
363
  })
313
364
  });
314
- if (!z.ok) {
315
- z.status === 402 && (n.value = !0);
365
+ if (!P.ok) {
366
+ P.status === 402 && (i.value = !0);
316
367
  return;
317
368
  }
318
- const E = await z.json().catch(() => null);
319
- E?.botSessionId && (u.value = E.botSessionId);
369
+ const I = await P.json().catch(() => null);
370
+ I?.botSessionId && (y.value = I.botSessionId);
320
371
  } catch {
321
372
  }
322
373
  }
323
- function c(h, f) {
324
- i.value = !0, o.value = !0, n.value = !1, y.value = null, m.value = !1, p(h, f), b && clearTimeout(b), b = 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(() => {
325
376
  o.value = !1;
326
377
  }, 8e3);
327
378
  }
328
379
  function S() {
329
- e.value = !0, o.value = !1;
380
+ t.value = !0, o.value = !1;
330
381
  }
331
- async function $() {
332
- if (e.value = !1, !!u.value)
382
+ async function c() {
383
+ if (t.value = !1, !!y.value)
333
384
  try {
334
385
  await fetch("/api/bot/session-end-proxy", {
335
386
  method: "POST",
336
387
  headers: { "content-type": "application/json" },
337
388
  body: JSON.stringify({
338
- botSessionId: u.value,
339
- wasHelpful: y.value,
340
- escalated: m.value
389
+ botSessionId: y.value,
390
+ wasHelpful: g.value,
391
+ escalated: x.value
341
392
  })
342
393
  });
343
394
  } catch {
344
395
  }
345
396
  }
346
- return M(() => {
347
- s(), v = new X({
348
- onTrigger: (h, f) => {
349
- c(h, f);
397
+ return N(() => {
398
+ z(), b.value = window.location.pathname, m = new te({
399
+ onTrigger: (n, d) => {
400
+ R(n, d);
350
401
  }
351
- }), v.start();
352
- }), F(() => {
353
- v?.stop(), b && clearTimeout(b);
354
- }), (h, f) => (r(), g("div", {
355
- style: T(P.value)
402
+ }), m.start();
403
+ }), Y(() => {
404
+ m?.stop(), k && clearTimeout(k);
405
+ }), (n, d) => (r(), f("div", {
406
+ style: $(v.value)
356
407
  }, [
357
- o.value && !e.value ? (r(), g("div", {
408
+ o.value && !t.value ? (r(), f("div", {
358
409
  key: 0,
359
- style: T({
410
+ style: $({
360
411
  position: "absolute",
361
412
  bottom: "62px",
362
- right: d.position === "bottom-right" ? "0" : "auto",
363
- left: d.position === "bottom-left" ? "0" : "auto",
413
+ right: p.position === "bottom-right" ? "0" : "auto",
414
+ left: p.position === "bottom-left" ? "0" : "auto",
364
415
  background: "#fff",
365
416
  border: "2px solid #6366f1",
366
417
  color: "#1f2937",
@@ -372,8 +423,8 @@ const ee = { style: {
372
423
  animation: "fp-bubble-in 300ms ease-out"
373
424
  })
374
425
  }, [
375
- A(I(C.value.initialMessage || d.initialMessage) + " ", 1),
376
- f[2] || (f[2] = t("span", { style: {
426
+ A(T(C.value.initialMessage || p.initialMessage) + " ", 1),
427
+ d[2] || (d[2] = e("span", { style: {
377
428
  position: "absolute",
378
429
  right: "10px",
379
430
  bottom: "-12px",
@@ -382,7 +433,7 @@ const ee = { style: {
382
433
  borderLeft: "10px solid transparent",
383
434
  borderTop: "12px solid #6366f1"
384
435
  } }, null, -1)),
385
- f[3] || (f[3] = t("span", { style: {
436
+ d[3] || (d[3] = e("span", { style: {
386
437
  position: "absolute",
387
438
  right: "11px",
388
439
  bottom: "-9px",
@@ -391,8 +442,8 @@ const ee = { style: {
391
442
  borderLeft: "9px solid transparent",
392
443
  borderTop: "11px solid #fff"
393
444
  } }, null, -1))
394
- ], 4)) : w("", !0),
395
- i.value && !e.value ? (r(), g("button", {
445
+ ], 4)) : h("", !0),
446
+ l.value && !t.value ? (r(), f("button", {
396
447
  key: 1,
397
448
  style: {
398
449
  width: "48px",
@@ -407,212 +458,214 @@ const ee = { style: {
407
458
  animation: "fp-bounce 600ms ease-out"
408
459
  },
409
460
  onClick: S
410
- }, [...f[4] || (f[4] = [
411
- 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)
412
- ])])) : w("", !0),
413
- e.value && u.value ? (r(), 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, {
414
465
  key: 2,
415
- "bot-session-id": u.value,
466
+ "bot-session-id": y.value,
416
467
  config: C.value,
417
- unavailable: n.value,
418
- onClose: $,
419
- onHelpful: f[0] || (f[0] = (k) => y.value = k),
420
- onEscalated: f[1] || (f[1] = (k) => m.value = !0)
421
- }, null, 8, ["bot-session-id", "config", "unavailable"])) : w("", !0)
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)
422
475
  ], 4));
423
476
  }
424
- }), fe = {
477
+ }), ke = {
425
478
  key: 0,
426
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" }
427
- }, xe = { style: { "max-width": "900px", margin: "0 auto" } }, ge = {
480
+ }, he = { style: { "max-width": "900px", margin: "0 auto" } }, we = {
428
481
  key: 0,
429
482
  style: { "margin-bottom": "12px", "font-size": "13px" }
430
- }, be = { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px" } }, ye = { style: { display: "flex", "align-items": "center", gap: "8px" } }, ve = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap", "align-items": "center" } }, me = /* @__PURE__ */ D({
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({
431
484
  __name: "consent-banner",
432
485
  emits: ["consent"],
433
- setup(d, { emit: a }) {
434
- const l = a, o = new Y(), i = x(!1), e = x(!1), n = x(!1), u = x(!1);
486
+ setup(p, { emit: s }) {
487
+ const a = s, o = new L(), l = u(!1), t = u(!1), i = u(!1), b = u(!1);
435
488
  function y() {
436
- i.value = !0, e.value = !0;
489
+ l.value = !0, t.value = !0;
437
490
  }
438
- M(() => {
439
- const P = o.getConsent();
440
- i.value = !P || o.isConsentExpired(), P && (n.value = P.analytics, u.value = P.marketing), typeof window < "u" && (window.addEventListener("feedpulse:open-consent", y), window.addEventListener("feedpulse:withdraw-consent", C));
491
+ N(() => {
492
+ const C = o.getConsent();
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));
441
494
  });
442
- function m() {
443
- o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), l("consent", { analytics: !0, marketing: !0, action: "accept_all" }), i.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;
444
497
  }
445
- function v() {
446
- o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), l("consent", { analytics: !1, marketing: !1, action: "reject_all" }), i.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;
447
500
  }
448
- function b() {
449
- o.setConsent({ analytics: n.value, marketing: u.value, version: "1.0" }), n.value || o.clearAnalyticsCookies(), l("consent", { analytics: n.value, marketing: u.value, action: "custom" }), i.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;
450
503
  }
451
- function C() {
452
- o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), n.value = !1, u.value = !1, l("consent", { analytics: !1, marketing: !1, action: "withdraw" }), i.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;
453
506
  }
454
- return F(() => {
455
- typeof window < "u" && (window.removeEventListener("feedpulse:open-consent", y), window.removeEventListener("feedpulse:withdraw-consent", C));
456
- }), (P, s) => (r(), N(J, { to: "body" }, [
457
- i.value ? (r(), g("div", fe, [
458
- t("div", xe, [
459
- s[6] || (s[6] = t("p", { style: { margin: "0 0 12px", "font-size": "14px", "line-height": "1.5" } }, [
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" } }, [
460
513
  A(" We use cookies to improve reliability and understand usage. "),
461
- t("a", {
514
+ e("a", {
462
515
  href: "/privacy",
463
516
  style: { color: "#818cf8" }
464
517
  }, "Privacy Policy")
465
518
  ], -1)),
466
- e.value ? (r(), g("div", ge, [
467
- s[5] || (s[5] = t("label", { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px", opacity: "0.75" } }, [
468
- 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", {
469
522
  type: "checkbox",
470
523
  checked: "",
471
524
  disabled: ""
472
525
  }),
473
526
  A(" Necessary (always on) ")
474
527
  ], -1)),
475
- t("label", be, [
476
- R(t("input", {
477
- "onUpdate:modelValue": s[0] || (s[0] = (p) => n.value = p),
528
+ e("label", Se, [
529
+ B(e("input", {
530
+ "onUpdate:modelValue": v[0] || (v[0] = (z) => i.value = z),
478
531
  type: "checkbox"
479
532
  }, null, 512), [
480
- [j, n.value]
533
+ [q, i.value]
481
534
  ]),
482
- s[3] || (s[3] = A(" Analytics ", -1))
535
+ v[3] || (v[3] = A(" Analytics ", -1))
483
536
  ]),
484
- t("label", ye, [
485
- R(t("input", {
486
- "onUpdate:modelValue": s[1] || (s[1] = (p) => u.value = p),
537
+ e("label", Ce, [
538
+ B(e("input", {
539
+ "onUpdate:modelValue": v[1] || (v[1] = (z) => b.value = z),
487
540
  type: "checkbox"
488
541
  }, null, 512), [
489
- [j, u.value]
542
+ [q, b.value]
490
543
  ]),
491
- s[4] || (s[4] = A(" Marketing ", -1))
544
+ v[4] || (v[4] = A(" Marketing ", -1))
492
545
  ])
493
- ])) : w("", !0),
494
- t("div", ve, [
495
- t("button", {
546
+ ])) : h("", !0),
547
+ e("div", ze, [
548
+ e("button", {
496
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" },
497
- onClick: m
550
+ onClick: g
498
551
  }, " Accept All "),
499
- t("button", {
552
+ e("button", {
500
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" },
501
- onClick: v
554
+ onClick: x
502
555
  }, " Reject All "),
503
- t("button", {
556
+ e("button", {
504
557
  style: { padding: "9px 16px", background: "transparent", color: "#aaa", border: "1px solid #333", "border-radius": "6px", "font-size": "13px", cursor: "pointer" },
505
- onClick: s[2] || (s[2] = (p) => e.value ? b() : e.value = !0)
506
- }, I(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)
507
560
  ])
508
561
  ])
509
- ])) : w("", !0)
562
+ ])) : h("", !0)
510
563
  ]));
511
564
  }
512
- }), Ee = /* @__PURE__ */ D({
565
+ }), Me = /* @__PURE__ */ E({
513
566
  __name: "FeedPulseProvider",
514
567
  props: {
515
568
  proxyEndpoint: { default: "/api/fp-proxy" },
516
569
  debug: { type: Boolean },
517
570
  consentRequired: { type: Boolean, default: !0 }
518
571
  },
519
- setup(d) {
520
- const a = d, l = new Y(), o = new Q({
521
- proxyEndpoint: a.proxyEndpoint,
522
- debug: a.debug
572
+ setup(p) {
573
+ const s = p, a = new L(), o = new ee({
574
+ proxyEndpoint: s.proxyEndpoint,
575
+ debug: s.debug
523
576
  });
524
- G(q, o);
525
- function i(e) {
526
- const n = l.setConsent({
527
- analytics: e.analytics,
528
- marketing: e.marketing,
577
+ Q(V, o);
578
+ function l(t) {
579
+ const i = a.setConsent({
580
+ analytics: t.analytics,
581
+ marketing: t.marketing,
529
582
  version: "1.0"
530
583
  });
531
- e.analytics || l.clearAnalyticsCookies(), o.updateCookieData(l.getAllData(e.analytics)), o.track("consent", "__consent__", {
532
- analytics: e.analytics,
533
- marketing: e.marketing,
534
- 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,
535
588
  userAgent: navigator.userAgent,
536
- version: n.version
589
+ version: i.version
537
590
  });
538
591
  }
539
- return M(() => {
540
- const e = l.getConsent();
541
- a.consentRequired === !1 ? (l.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), o.updateCookieData(l.getAllData(!0))) : e && !l.isConsentExpired() ? o.updateCookieData(l.getAllData(e.analytics)) : o.updateCookieData(l.getAllData(!1)), o.init();
542
- }), F(() => o.destroy()), (e, n) => (r(), g(_, null, [
543
- K(e.$slots, "default"),
544
- d.consentRequired !== !1 ? (r(), 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, {
545
598
  key: 0,
546
- onConsent: i
547
- })) : w("", !0)
599
+ onConsent: l
600
+ })) : h("", !0)
548
601
  ], 64));
549
602
  }
550
- }), he = {
603
+ }), $e = {
551
604
  key: 1,
552
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)" }
553
- }, 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 = {
554
607
  key: 1,
555
608
  style: { "text-align": "center", padding: "16px", color: "#111" }
556
- }, Ae = /* @__PURE__ */ D({
609
+ }, Fe = /* @__PURE__ */ E({
557
610
  __name: "FeedPulseWidget",
558
611
  props: {
559
612
  id: {},
560
613
  placeholder: {},
561
614
  position: { default: "bottom-right" }
562
615
  },
563
- setup(d) {
564
- const a = d, l = Z(), o = x(a.position === "inline"), i = x(null), e = x(""), n = x(!1);
565
- function u(m) {
566
- i.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;
567
620
  }
568
621
  function y() {
569
- !i.value && !e.value.trim() || (l?.trackFeedback(a.id ?? null, i.value, e.value || null), n.value = !0, setTimeout(() => {
570
- o.value = a.position === "inline", n.value = !1, i.value = null, e.value = "";
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 = "";
571
624
  }, 2e3));
572
625
  }
573
- return (m, v) => (r(), g("div", {
626
+ return (g, x) => (r(), f("div", {
574
627
  class: "feedpulse-widget",
575
- style: T(d.position !== "inline" ? `position:fixed; ${d.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;` : "")
576
629
  }, [
577
- d.position !== "inline" ? (r(), g("button", {
630
+ p.position !== "inline" ? (r(), f("button", {
578
631
  key: 0,
579
632
  style: { background: "#6366f1", color: "#fff", border: "none", "border-radius": "50%", width: "48px", height: "48px", "font-size": "20px", cursor: "pointer" },
580
- onClick: v[0] || (v[0] = (b) => o.value = !o.value)
581
- }, " 💬 ")) : w("", !0),
582
- o.value ? (r(), g("div", he, [
583
- n.value ? (r(), g("div", Ce, [...v[2] || (v[2] = [
584
- t("p", { style: { "font-size": "28px", margin: "0" } }, " 🎉 ", -1),
585
- t("p", { style: { margin: "8px 0 0", "font-weight": "600" } }, " Thanks for your feedback! ", -1)
586
- ])])) : (r(), g(_, { key: 0 }, [
587
- t("p", ke, I(d.placeholder ?? "How was your experience?"), 1),
588
- t("div", we, [
589
- (r(), g(_, null, L(5, (b) => t("button", {
590
- key: b,
591
- style: T({ background: "none", border: "none", cursor: "pointer", fontSize: "24px", opacity: i.value !== null && b <= i.value ? 1 : 0.3 }),
592
- onClick: (C) => u(b)
593
- }, " ⭐ ", 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))
594
647
  ]),
595
- R(t("textarea", {
596
- "onUpdate:modelValue": v[1] || (v[1] = (b) => e.value = b),
648
+ B(e("textarea", {
649
+ "onUpdate:modelValue": x[1] || (x[1] = (m) => t.value = m),
597
650
  placeholder: "Tell us more (optional)...",
598
651
  rows: "3",
599
652
  style: { width: "100%", padding: "8px", border: "1px solid #d1d5db", "border-radius": "8px", resize: "none", "font-size": "14px" }
600
653
  }, null, 512), [
601
- [O, e.value]
654
+ [H, t.value]
602
655
  ]),
603
- t("button", {
656
+ e("button", {
604
657
  style: { "margin-top": "10px", width: "100%", background: "#6366f1", color: "#fff", border: "none", "border-radius": "8px", padding: "10px", "font-weight": "600", cursor: "pointer" },
605
658
  onClick: y
606
659
  }, " Submit Feedback ")
607
660
  ], 64))
608
- ])) : w("", !0)
661
+ ])) : h("", !0)
609
662
  ], 4));
610
663
  }
611
664
  });
612
665
  export {
613
- me as ConsentBanner,
614
- $e as FeedPulseBot,
615
- Ee as FeedPulseProvider,
616
- Ae as FeedPulseWidget,
617
- Z as useFeedPulse
666
+ Pe as ConsentBanner,
667
+ Be as FeedPulseBot,
668
+ Me as FeedPulseProvider,
669
+ Fe as FeedPulseWidget,
670
+ oe as useFeedPulse
618
671
  };