@gengage/assistant-fe 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +100 -0
  2. package/dist/assistant-fe.css +1 -1
  3. package/dist/chat/components/ChatDrawer.d.ts +8 -4
  4. package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
  5. package/dist/chat/index.d.ts +5 -0
  6. package/dist/chat/index.d.ts.map +1 -1
  7. package/dist/chat/types.d.ts +1 -1
  8. package/dist/chat.cjs +1 -1
  9. package/dist/chat.iife.js +16 -16
  10. package/dist/chat.iife.js.map +1 -1
  11. package/dist/chat.js +2 -2
  12. package/dist/common/events.d.ts.map +1 -1
  13. package/dist/common/index.d.ts +2 -0
  14. package/dist/common/index.d.ts.map +1 -1
  15. package/dist/common/native-webview.d.ts +61 -0
  16. package/dist/common/native-webview.d.ts.map +1 -0
  17. package/dist/common/overlay.d.ts +5 -0
  18. package/dist/common/overlay.d.ts.map +1 -1
  19. package/dist/common.cjs +1 -1
  20. package/dist/common.cjs.map +1 -1
  21. package/dist/common.js +197 -426
  22. package/dist/common.js.map +1 -1
  23. package/dist/index-1yPxOqAw.cjs +13 -0
  24. package/dist/index-1yPxOqAw.cjs.map +1 -0
  25. package/dist/index-BH-V2lWn.js +510 -0
  26. package/dist/index-BH-V2lWn.js.map +1 -0
  27. package/dist/index-BelS6Vnv.cjs +2 -0
  28. package/dist/index-BelS6Vnv.cjs.map +1 -0
  29. package/dist/index-CERWfDdF.js +4571 -0
  30. package/dist/index-CERWfDdF.js.map +1 -0
  31. package/dist/index.cjs +1 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +55 -50
  35. package/dist/index.js.map +1 -1
  36. package/dist/native/index.d.ts +3 -0
  37. package/dist/native/index.d.ts.map +1 -0
  38. package/dist/native.cjs +2 -0
  39. package/dist/native.cjs.map +1 -0
  40. package/dist/native.iife.js +97 -0
  41. package/dist/native.iife.js.map +1 -0
  42. package/dist/native.js +9 -0
  43. package/dist/native.js.map +1 -0
  44. package/dist/qna/components/TextInput.d.ts.map +1 -1
  45. package/dist/qna/components/renderUISpec.d.ts.map +1 -1
  46. package/dist/qna/index.d.ts +1 -0
  47. package/dist/qna/index.d.ts.map +1 -1
  48. package/dist/qna/types.d.ts +1 -1
  49. package/dist/qna/types.d.ts.map +1 -1
  50. package/dist/qna.cjs +1 -1
  51. package/dist/qna.cjs.map +1 -1
  52. package/dist/qna.css +1 -1
  53. package/dist/qna.iife.js +14 -14
  54. package/dist/qna.iife.js.map +1 -1
  55. package/dist/qna.js +92 -80
  56. package/dist/qna.js.map +1 -1
  57. package/dist/{schemas-DhaO7I0-.cjs → schemas-DHzfUzwA.cjs} +22 -22
  58. package/dist/schemas-DHzfUzwA.cjs.map +1 -0
  59. package/dist/{schemas-BlkBmaA5.js → schemas-yF4IOEUi.js} +807 -755
  60. package/dist/schemas-yF4IOEUi.js.map +1 -0
  61. package/dist/simrel/components/ProductCard.d.ts.map +1 -1
  62. package/dist/simrel.cjs +1 -1
  63. package/dist/simrel.cjs.map +1 -1
  64. package/dist/simrel.css +1 -1
  65. package/dist/simrel.iife.js +8 -8
  66. package/dist/simrel.iife.js.map +1 -1
  67. package/dist/simrel.js +218 -214
  68. package/dist/simrel.js.map +1 -1
  69. package/package.json +9 -2
  70. package/dist/index-B8EeSm-F.cjs +0 -13
  71. package/dist/index-B8EeSm-F.cjs.map +0 -1
  72. package/dist/index-BSpLCzAK.js +0 -4523
  73. package/dist/index-BSpLCzAK.js.map +0 -1
  74. package/dist/schemas-BlkBmaA5.js.map +0 -1
  75. package/dist/schemas-DhaO7I0-.cjs.map +0 -1
package/dist/qna.js CHANGED
@@ -1,6 +1,6 @@
1
- import { b as w, c as q, a as Q, r as x, o as g, s as p, u as L, d as R, _ as E, e as B, f as N, B as O, t as U, g as P, h as H, w as j, i as D, j as _, k as F, l as z, m as M, n as G } from "./schemas-BlkBmaA5.js";
1
+ import { b as q, c as w, a as x, r as Q, o as f, s as p, u as L, d as R, _ as C, e as B, f as N, B as P, t as O, g as H, h as U, w as j, i as D, j as m, k as F, l as z, m as M, n as G } from "./schemas-yF4IOEUi.js";
2
2
  async function W(n, e, t) {
3
- const i = w("launcher_action", e), o = { uiSpecs: [], actions: [] }, s = {
3
+ const i = q("launcher_action", e), o = { uiSpecs: [], actions: [] }, s = {
4
4
  method: "POST",
5
5
  headers: { "Content-Type": "application/json" },
6
6
  body: JSON.stringify(n)
@@ -10,10 +10,10 @@ async function W(n, e, t) {
10
10
  if (!a.ok)
11
11
  throw new Error(`HTTP ${a.status}: ${a.statusText}`);
12
12
  const r = {
13
- onEvent: (l) => {
14
- const c = Q(l);
15
- if (c && (c.type === "ui_spec" && o.uiSpecs.push(c.spec), c.type === "ui_spec" && c.spec.elements)) {
16
- for (const d of Object.values(c.spec.elements))
13
+ onEvent: (c) => {
14
+ const l = x(c);
15
+ if (l && (l.type === "ui_spec" && o.uiSpecs.push(l.spec), l.type === "ui_spec" && l.spec.elements)) {
16
+ for (const d of Object.values(l.spec.elements))
17
17
  if (d.type === "ActionButton" && d.props?.action) {
18
18
  const h = d.props.action;
19
19
  o.actions.push(h);
@@ -21,9 +21,9 @@ async function W(n, e, t) {
21
21
  }
22
22
  }
23
23
  };
24
- return t !== void 0 && (r.signal = t), await q(a, r), o;
24
+ return t !== void 0 && (r.signal = t), await w(a, r), o;
25
25
  }
26
- function A(n) {
26
+ function y(n) {
27
27
  const e = document.createElement("div");
28
28
  e.className = "gengage-qna-buttons", e.setAttribute("role", "group"), e.setAttribute("aria-label", n.quickQuestionsAriaLabel ?? "Quick questions"), n.orientation === "vertical" && (e.style.flexDirection = "column");
29
29
  for (const t of n.actions) {
@@ -60,21 +60,22 @@ function $(n) {
60
60
  }, 3e3));
61
61
  const r = document.createElement("button");
62
62
  r.className = "gengage-qna-send", r.type = "button", r.textContent = n.ctaLabel ?? n.sendButtonText ?? "Sor", r.setAttribute("aria-label", n.sendQuestionAriaLabel ?? "Send question");
63
- const l = () => {
64
- const c = t.value.trim();
65
- c && (n.onSubmit({
66
- title: c,
63
+ const c = () => {
64
+ const l = t.value.trim();
65
+ l && (n.onSubmit({
66
+ title: l,
67
67
  type: "user_message",
68
- payload: { text: c }
68
+ // Align with chat composer: user_message payload is plain string.
69
+ payload: l
69
70
  }), t.value = "");
70
71
  };
71
- return r.addEventListener("click", l), t.addEventListener("keydown", (c) => {
72
- c.key === "Enter" && (c.preventDefault(), l());
72
+ return r.addEventListener("click", c), t.addEventListener("keydown", (l) => {
73
+ l.key === "Enter" && (l.preventDefault(), c());
73
74
  }), e.appendChild(t), e.appendChild(r), e._cleanup = () => {
74
75
  s && clearInterval(s), a && clearTimeout(a);
75
76
  }, e;
76
77
  }
77
- function b(n, e) {
78
+ function _(n, e) {
78
79
  if (!n || typeof n != "object") return null;
79
80
  const t = n, i = t.type;
80
81
  if (typeof i != "string" || i.length === 0) return null;
@@ -83,66 +84,66 @@ function b(n, e) {
83
84
  const r = { title: a, type: i };
84
85
  return s !== void 0 && (r.payload = s), r;
85
86
  }
86
- function T(n) {
87
+ function A(n) {
87
88
  const e = {
88
89
  title: n.title,
89
90
  type: n.type
90
91
  };
91
92
  return n.payload !== void 0 && (e.payload = n.payload), e;
92
93
  }
93
- function C(n, e) {
94
+ function T(n, e) {
94
95
  const t = [], i = n.props?.actions;
95
96
  if (Array.isArray(i))
96
97
  for (const a of i) {
97
- const r = b(a);
98
+ const r = _(a);
98
99
  r && t.push(r);
99
100
  }
100
101
  const o = n.props?.buttons;
101
102
  if (Array.isArray(o))
102
103
  for (const a of o) {
103
104
  if (!a || typeof a != "object") continue;
104
- const r = a, l = typeof r.label == "string" ? r.label : void 0, c = b(r.action, l);
105
- c && t.push(c);
105
+ const r = a, c = typeof r.label == "string" ? r.label : void 0, l = _(r.action, c);
106
+ l && t.push(l);
106
107
  }
107
108
  if (n.children)
108
109
  for (const a of n.children) {
109
110
  const r = e.elements[a];
110
111
  if (!r || r.type !== "ActionButton") continue;
111
- const l = typeof r.props?.label == "string" ? r.props.label : void 0, c = b(r.props?.action, l);
112
- c && t.push(c);
112
+ const c = typeof r.props?.label == "string" ? r.props.label : void 0, l = _(r.props?.action, c);
113
+ l && t.push(l);
113
114
  }
114
115
  const s = /* @__PURE__ */ new Set();
115
116
  return t.filter((a) => s.has(a.title) ? !1 : (s.add(a.title), !0));
116
117
  }
117
- const v = {
118
+ const E = {
118
119
  ButtonRow: ({ element: n, spec: e, context: t }) => {
119
- const i = C(n, e).map(T), o = n.props?.orientation, s = {
120
+ const i = T(n, e).map(A), o = n.props?.orientation, s = {
120
121
  actions: i,
121
122
  onAction: t.onAction,
122
123
  defaultCtaText: t.i18n.defaultCtaText,
123
124
  quickQuestionsAriaLabel: t.i18n.quickQuestionsAriaLabel
124
125
  };
125
- return t.onOpenChat !== void 0 && (s.onOpenChat = t.onOpenChat), t.ctaText !== void 0 && (s.ctaText = t.ctaText), (o === "horizontal" || o === "vertical") && (s.orientation = o), A(s);
126
+ return t.onOpenChat !== void 0 && (s.onOpenChat = t.onOpenChat), t.ctaText !== void 0 && (s.ctaText = t.ctaText), (o === "horizontal" || o === "vertical") && (s.orientation = o), y(s);
126
127
  },
127
128
  ActionButtons: ({ element: n, spec: e, context: t }) => {
128
129
  const o = {
129
- actions: C(n, e).map(T),
130
+ actions: T(n, e).map(A),
130
131
  onAction: t.onAction,
131
132
  defaultCtaText: t.i18n.defaultCtaText,
132
133
  quickQuestionsAriaLabel: t.i18n.quickQuestionsAriaLabel
133
134
  };
134
- return t.onOpenChat !== void 0 && (o.onOpenChat = t.onOpenChat), t.ctaText !== void 0 && (o.ctaText = t.ctaText), A(o);
135
+ return t.onOpenChat !== void 0 && (o.onOpenChat = t.onOpenChat), t.ctaText !== void 0 && (o.ctaText = t.ctaText), y(o);
135
136
  },
136
137
  ActionButton: ({ element: n, context: e }) => {
137
138
  const t = document.createElement("button");
138
139
  t.className = "gengage-qna-button", t.type = "button";
139
140
  const i = n.props?.label;
140
141
  typeof i == "string" ? t.textContent = i : t.textContent = e.i18n.defaultCtaText;
141
- const o = b(n.props?.action, typeof i == "string" ? i : void 0);
142
+ const o = _(n.props?.action, typeof i == "string" ? i : void 0);
142
143
  return o && t.addEventListener("click", () => e.onAction(o)), t;
143
144
  },
144
145
  TextInput: ({ element: n, context: e }) => {
145
- const t = n.props?.placeholder, i = typeof t == "string" || Array.isArray(t) ? t : e.inputPlaceholder, o = typeof n.props?.ctaLabel == "string" ? n.props.ctaLabel : e.ctaText, s = {
146
+ const t = n.props?.placeholder, i = typeof t == "string" || Array.isArray(t) ? t : e.inputPlaceholder, o = typeof n.props?.ctaLabel == "string" ? n.props.ctaLabel : void 0, s = {
146
147
  onSubmit: e.onAction,
147
148
  askQuestionAriaLabel: e.i18n.askQuestionAriaLabel,
148
149
  defaultInputPlaceholder: e.i18n.defaultInputPlaceholder,
@@ -161,7 +162,7 @@ const v = {
161
162
  // Backend may send ProductCard but QNA intentionally skips it;
162
163
  // the product is shown once chat opens via openWithAction().
163
164
  ProductCard: () => null
164
- }, S = ({
165
+ }, I = ({
165
166
  element: n,
166
167
  renderElement: e
167
168
  }) => {
@@ -175,10 +176,10 @@ const v = {
175
176
  return t;
176
177
  };
177
178
  function V() {
178
- return { ...v };
179
+ return { ...E };
179
180
  }
180
- function J(n, e, t = v, i = S) {
181
- return x({
181
+ function J(n, e, t = E, i = I) {
182
+ return Q({
182
183
  spec: n,
183
184
  context: e,
184
185
  registry: t,
@@ -186,7 +187,7 @@ function J(n, e, t = v, i = S) {
186
187
  unknownRenderer: i
187
188
  });
188
189
  }
189
- const I = {
190
+ const S = {
190
191
  quickQuestionsAriaLabel: "Hızlı sorular",
191
192
  askQuestionAriaLabel: "Soru sorun",
192
193
  defaultInputPlaceholder: "Bir soru sorun...",
@@ -205,23 +206,23 @@ function K(n) {
205
206
  return n ? n.toLowerCase().split("-")[0] ?? "tr" : "tr";
206
207
  }
207
208
  function X(n) {
208
- return K(n) === "en" ? Y : I;
209
+ return K(n) === "en" ? Y : S;
209
210
  }
210
- const Z = g({
211
+ const Z = f({
211
212
  title: p(),
212
213
  type: p(),
213
214
  payload: B().optional()
214
- }), tt = g({
215
+ }), tt = f({
215
216
  label: p(),
216
217
  action: Z,
217
- variant: E(["primary", "outline", "ghost"]).optional()
218
- }), et = g({
219
- orientation: E(["horizontal", "vertical"]).optional(),
218
+ variant: C(["primary", "outline", "ghost"]).optional()
219
+ }), et = f({
220
+ orientation: C(["horizontal", "vertical"]).optional(),
220
221
  wrap: R().optional()
221
- }), nt = g({
222
+ }), nt = f({
222
223
  placeholder: L([p(), N(p())]).optional(),
223
224
  ctaLabel: p().optional()
224
- }), ot = g({
225
+ }), ot = f({
225
226
  text: p()
226
227
  }), ct = {
227
228
  components: {
@@ -243,14 +244,14 @@ const Z = g({
243
244
  }
244
245
  }
245
246
  };
246
- class it extends O {
247
+ class it extends P {
247
248
  constructor() {
248
- super(...arguments), this._abortController = null, this._debounceTimer = null, this._contentEl = null, this._i18n = I, this._actionHandler = this._handleAction.bind(this), this._openChatHandler = this._handleOpenChat.bind(this);
249
+ super(...arguments), this._abortController = null, this._debounceTimer = null, this._contentEl = null, this._i18n = S, this._actionHandler = this._handleAction.bind(this), this._openChatHandler = this._handleOpenChat.bind(this);
249
250
  }
250
251
  async onInit(e) {
251
252
  this._i18n = this._resolveI18n(e), this._contentEl = document.createElement("div"), this._contentEl.className = "gengage-qna-container", this.root.appendChild(this._contentEl);
252
253
  const t = e.pageContext?.sku;
253
- t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0, U("qna");
254
+ t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0, O("qna");
254
255
  }
255
256
  onUpdate(e) {
256
257
  const t = e.sku;
@@ -290,7 +291,7 @@ class it extends O {
290
291
  middlewareUrl: this.config.middlewareUrl
291
292
  }, o = crypto.randomUUID(), s = Date.now();
292
293
  this.track(
293
- P(this.analyticsContext(), {
294
+ H(this.analyticsContext(), {
294
295
  endpoint: "launcher_action",
295
296
  request_id: o,
296
297
  widget: "qna"
@@ -305,54 +306,41 @@ class it extends O {
305
306
  locale: this.config.locale ?? "tr"
306
307
  }, r = this.config.pageContext?.pageType;
307
308
  r !== void 0 && (a.page_type = r);
308
- const l = await W(a, i, this._abortController.signal);
309
+ const c = await W(a, i, this._abortController.signal);
309
310
  if (this.track(
310
- H(this.analyticsContext(), {
311
+ U(this.analyticsContext(), {
311
312
  request_id: o,
312
313
  latency_ms: Date.now() - s,
313
- chunk_count: l.actions.length,
314
+ chunk_count: c.actions.length,
314
315
  widget: "qna"
315
316
  })
316
317
  ), this.track(
317
318
  j(this.analyticsContext(), {
318
- message_count: l.actions.length,
319
+ message_count: c.actions.length,
319
320
  history_ref: o,
320
321
  redaction_level: "none",
321
322
  widget: "qna"
322
323
  })
323
324
  ), !this._contentEl) return;
324
- if (this._contentEl.innerHTML = "", !this._specIncludesType(l.uiSpecs, "QuestionHeading") && this.config.showStaticQuestion && this.config.staticQuestionText) {
325
+ if (this._contentEl.innerHTML = "", !this._specIncludesType(c.uiSpecs, "QuestionHeading") && this.config.showStaticQuestion && this.config.staticQuestionText) {
325
326
  const u = document.createElement("h3");
326
327
  u.className = "gengage-qna-heading", u.textContent = this.config.staticQuestionText, this._contentEl.appendChild(u);
327
328
  }
328
- const d = this.config.inputPlaceholder, h = l.actions.length > 0 && d === !0 ? l.actions.map((u) => u.title) : d === !0 ? this._i18n.defaultInputPlaceholder : d, f = {
329
+ const d = this.config.inputPlaceholder, h = c.actions.length > 0 && d === !0 ? c.actions.map((u) => u.title) : d === !0 ? this._i18n.defaultInputPlaceholder : d ?? this._i18n.defaultInputPlaceholder, g = {
329
330
  onAction: this._actionHandler,
330
- i18n: this._i18n
331
+ i18n: this._i18n,
332
+ onOpenChat: this._openChatHandler
331
333
  };
332
- d === void 0 && (f.onOpenChat = this._openChatHandler, this.config.ctaText !== void 0 && (f.ctaText = this.config.ctaText)), h !== void 0 && (f.inputPlaceholder = h);
333
- const k = this._buildFallbackActionsSpec(l.actions), m = (l.uiSpecs.length > 0 ? l.uiSpecs : [k]).filter((u) => Object.keys(u.elements).length > 0);
334
- for (const u of m) {
335
- const y = this._renderUISpec(u, f);
336
- this._contentEl.appendChild(y);
337
- }
338
- if (m.length > 0 && D("qna"), d !== void 0 && !this._specIncludesType(m, "TextInput")) {
339
- const u = {
340
- root: "root",
341
- elements: {
342
- root: {
343
- type: "TextInput",
344
- props: {
345
- placeholder: h,
346
- ctaLabel: this.config.ctaText
347
- }
348
- }
349
- }
350
- }, y = this._renderUISpec(u, f);
351
- this._contentEl.appendChild(y);
334
+ this.config.ctaText !== void 0 && (g.ctaText = this.config.ctaText), h !== void 0 && (g.inputPlaceholder = h);
335
+ const v = this._buildFallbackActionsSpec(c.actions), b = (c.uiSpecs.length > 0 ? c.uiSpecs : [v]).filter((u) => Object.keys(u.elements).length > 0);
336
+ for (const u of b) {
337
+ const k = this._renderUISpec(u, g);
338
+ this._contentEl.appendChild(k);
352
339
  }
340
+ b.length > 0 && D("qna"), !this._specIncludesType(b, "TextInput") && this._appendStandaloneInput(g, h);
353
341
  } catch (a) {
354
342
  if (a instanceof DOMException && a.name === "AbortError") return;
355
- _("gengage:global:error", {
343
+ if (m("gengage:global:error", {
356
344
  source: "qna",
357
345
  code: "FETCH_ERROR",
358
346
  message: F(this.config.locale)
@@ -363,7 +351,15 @@ class it extends O {
363
351
  error_message: a instanceof Error ? a.message : String(a),
364
352
  widget: "qna"
365
353
  })
366
- );
354
+ ), this._contentEl) {
355
+ this._cleanupTextInputTimers(), this._contentEl.innerHTML = "";
356
+ const r = this.config.inputPlaceholder === !0 ? this._i18n.defaultInputPlaceholder : this.config.inputPlaceholder ?? this._i18n.defaultInputPlaceholder, c = {
357
+ onAction: this._actionHandler,
358
+ i18n: this._i18n,
359
+ onOpenChat: this._openChatHandler
360
+ };
361
+ this.config.ctaText !== void 0 && (c.ctaText = this.config.ctaText), this._appendStandaloneInput(c, r);
362
+ }
367
363
  }
368
364
  }
369
365
  _createLoadingIndicator() {
@@ -383,7 +379,7 @@ class it extends O {
383
379
  return M(e, this.config.renderer?.registry);
384
380
  }
385
381
  _renderUISpec(e, t) {
386
- const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? S, s = (l, c) => J(l, c, i, o), a = this.config.renderer?.renderUISpec;
382
+ const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? I, s = (c, l) => J(c, l, i, o), a = this.config.renderer?.renderUISpec;
387
383
  return a ? a(e, t, {
388
384
  registry: i,
389
385
  unknownRenderer: o,
@@ -422,11 +418,27 @@ class it extends O {
422
418
  elements: t
423
419
  };
424
420
  }
421
+ _appendStandaloneInput(e, t) {
422
+ if (!this._contentEl) return;
423
+ const i = {
424
+ root: "root",
425
+ elements: {
426
+ root: {
427
+ type: "TextInput",
428
+ props: {
429
+ placeholder: t
430
+ }
431
+ }
432
+ }
433
+ }, o = this._renderUISpec(i, e);
434
+ this._contentEl.appendChild(o);
435
+ }
425
436
  _handleAction(e) {
426
- G(e.title, e.type), this.config.onActionSelected?.(e), _("gengage:qna:action", e);
437
+ G(e.title, e.type), this.config.onActionSelected?.(e), m("gengage:qna:action", e);
427
438
  }
428
439
  _handleOpenChat() {
429
- this.config.onOpenChat?.(), _("gengage:qna:open-chat", {});
440
+ const e = this._contentEl?.querySelector(".gengage-qna-input");
441
+ e && e.focus(), this.config.onOpenChat?.(), m("gengage:qna:open-chat", {});
430
442
  }
431
443
  }
432
444
  function lt() {
@@ -436,7 +448,7 @@ export {
436
448
  it as GengageQNA,
437
449
  V as createDefaultQnaUISpecRegistry,
438
450
  lt as createQNAWidget,
439
- S as defaultQnaUnknownUISpecRenderer,
451
+ I as defaultQnaUnknownUISpecRenderer,
440
452
  ct as qnaCatalog,
441
453
  J as renderQnaUISpec
442
454
  };
package/dist/qna.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"qna.js","sources":["../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/catalog.ts","../src/qna/index.ts"],"sourcesContent":["import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Başka bir şey sor';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Bir soru sorun...'];\n\n let placeholderIndex = 0;\n input.placeholder = placeholders[0] ?? '';\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n let fadeTimer: ReturnType<typeof setTimeout> | null = null;\n if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n fadeTimer = setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n input.placeholder = placeholders[placeholderIndex] ?? '';\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-send';\n sendBtn.type = 'button';\n sendBtn.textContent = options.ctaLabel ?? options.sendButtonText ?? 'Sor';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n payload: { text },\n });\n input.value = '';\n };\n\n sendBtn.addEventListener('click', submit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n });\n\n container.appendChild(input);\n container.appendChild(sendBtn);\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n if (fadeTimer) clearTimeout(fadeTimer);\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.type = 'button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : context.ctaText;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n // ProductCard: no-op — QNA renders only question pills + text input.\n // Backend may send ProductCard but QNA intentionally skips it;\n // the product is shown once chat opens via openWithAction().\n ProductCard: () => null,\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget — json-render catalog definition.\n *\n * Backend endpoint: POST /chat/launcher_action\n * Response format: NDJSON stream, each line a StreamEvent.\n *\n * The backend returns a `ui_spec` event whose elements are typed to the\n * component names defined below. The frontend renders them via ./registry.\n *\n * Customising:\n * Fork this repo and replace ./registry implementations with your own.\n * The catalog schema (component names + prop types) is the API contract\n * with the backend — do not rename components without a backend release.\n */\n\nimport { z } from 'zod';\n\nconst ActionPayloadSchema = z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n});\n\nexport const ActionButtonSchema = z.object({\n label: z.string(),\n action: ActionPayloadSchema,\n variant: z.enum(['primary', 'outline', 'ghost']).optional(),\n});\n\nexport const ButtonRowSchema = z.object({\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n wrap: z.boolean().optional(),\n});\n\nexport const TextInputSchema = z.object({\n placeholder: z.union([z.string(), z.array(z.string())]).optional(),\n ctaLabel: z.string().optional(),\n});\n\nexport const QuestionHeadingSchema = z.object({\n text: z.string(),\n});\n\nexport const qnaCatalog = {\n components: {\n ActionButton: {\n schema: ActionButtonSchema,\n description: 'A single clickable QNA action button.',\n },\n ButtonRow: {\n schema: ButtonRowSchema,\n description: 'Container for a group of QNA action buttons.',\n },\n TextInput: {\n schema: TextInputSchema,\n description: 'Free-text input with rotating placeholder and CTA button.',\n },\n QuestionHeading: {\n schema: QuestionHeadingSchema,\n description: 'A heading displayed above the QNA button group.',\n },\n },\n} as const;\n\nexport type QNACatalog = typeof qnaCatalog;\nexport type QNAComponentName = keyof QNACatalog['components'];\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport * as ga from '../common/ga-datalayer.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n this.isVisible = true;\n ga.trackInit('qna');\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n /** Clean up TextInput placeholder rotation timers to prevent interval leaks. */\n private _cleanupTextInputTimers(): void {\n if (!this._contentEl) return;\n const wrappers = this._contentEl.querySelectorAll('.gengage-qna-input-wrapper');\n for (const wrapper of wrappers) {\n (wrapper as HTMLElement & { _cleanup?: () => void })._cleanup?.();\n }\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n // Clean up TextInput timers before clearing DOM to prevent interval leaks\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n this._contentEl.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n const effectivePlaceholders =\n result.actions.length > 0 && cfgPlaceholders === true\n ? result.actions.map((a) => a.title)\n : cfgPlaceholders === true\n ? this._i18n.defaultInputPlaceholder\n : cfgPlaceholders;\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n };\n // When a standalone TextInput will be rendered (inputPlaceholder is set),\n // its submit button takes over the CTA role — don't duplicate in ButtonRow.\n if (cfgPlaceholders === undefined) {\n renderContext.onOpenChat = this._openChatHandler;\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n }\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const specsToRender = result.uiSpecs.length > 0 ? result.uiSpecs : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n this._contentEl.appendChild(rendered);\n }\n\n if (nonEmptySpecs.length > 0) {\n ga.trackShow('qna');\n }\n\n const shouldRenderStandaloneInput =\n cfgPlaceholders !== undefined && !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder: effectivePlaceholders,\n ctaLabel: this.config.ctaText,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, renderContext);\n this._contentEl.appendChild(renderedInput);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _handleAction(action: ActionPayload): void {\n ga.trackSuggestedQuestion(action.title, action.type);\n this.config.onActionSelected?.(action);\n dispatch('gengage:qna:action', action);\n }\n\n private _handleOpenChat(): void {\n this.config.onOpenChat?.();\n dispatch('gengage:qna:open-chat', {});\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n"],"names":["fetchLauncherActions","request","transport","signal","url","buildChatEndpointUrl","result","fetchInit","response","streamOpts","event","normalized","adaptV1Event","el","action","consumeStream","renderButtonRow","options","container","button","actionPayload","cta","renderTextInput","input","placeholders","placeholderIndex","rotateTimer","fadeTimer","sendBtn","submit","text","e","toActionPayload","raw","labelFallback","obj","type","titleRaw","payload","title","actionPayloadToRowAction","rowAction","collectButtonRowActions","element","spec","actions","directActions","rawAction","directButtons","rawButton","label","childId","child","seen","DEFAULT_QNA_UI_SPEC_REGISTRY","context","rowActions","orientation","placeholder","ctaLabel","heading","defaultQnaUnknownUISpecRenderer","renderElement","wrapper","rendered","createDefaultQnaUISpecRegistry","renderQnaUISpec","registry","unknownRenderer","renderUISpecWithRegistry","QNA_I18N_TR","QNA_I18N_EN","normalizeLocale","locale","resolveQnaLocale","ActionPayloadSchema","z.object","z.string","z.unknown","ActionButtonSchema","z.enum","ButtonRowSchema","z.boolean","TextInputSchema","z.union","z.array","QuestionHeadingSchema","qnaCatalog","GengageQNA","BaseWidget","config","sku","ga.trackInit","newSku","wrappers","loading","requestId","fetchStart","streamStartEvent","launcherReq","pageType","streamDoneEvent","widgetHistorySnapshotEvent","cfgPlaceholders","effectivePlaceholders","a","renderContext","fallbackSpec","nonEmptySpecs","ga.trackShow","inputSpec","renderedInput","err","dispatch","getGlobalErrorMessage","streamErrorEvent","i","dot","baseRegistry","mergeUISpecRegistry","defaultRender","inputContext","override","specs","elements","childIds","id","ga.trackSuggestedQuestion","createQNAWidget"],"mappings":"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"}
1
+ {"version":3,"file":"qna.js","sources":["../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/catalog.ts","../src/qna/index.ts"],"sourcesContent":["import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Başka bir şey sor';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Bir soru sorun...'];\n\n let placeholderIndex = 0;\n input.placeholder = placeholders[0] ?? '';\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n let fadeTimer: ReturnType<typeof setTimeout> | null = null;\n if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n fadeTimer = setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n input.placeholder = placeholders[placeholderIndex] ?? '';\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-send';\n sendBtn.type = 'button';\n sendBtn.textContent = options.ctaLabel ?? options.sendButtonText ?? 'Sor';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n // Align with chat composer: user_message payload is plain string.\n payload: text,\n });\n input.value = '';\n };\n\n sendBtn.addEventListener('click', submit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n });\n\n container.appendChild(input);\n container.appendChild(sendBtn);\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n if (fadeTimer) clearTimeout(fadeTimer);\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.type = 'button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n // Keep input submit label independent from the quick-question CTA text.\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : undefined;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n // ProductCard: no-op — QNA renders only question pills + text input.\n // Backend may send ProductCard but QNA intentionally skips it;\n // the product is shown once chat opens via openWithAction().\n ProductCard: () => null,\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget — json-render catalog definition.\n *\n * Backend endpoint: POST /chat/launcher_action\n * Response format: NDJSON stream, each line a StreamEvent.\n *\n * The backend returns a `ui_spec` event whose elements are typed to the\n * component names defined below. The frontend renders them via ./registry.\n *\n * Customising:\n * Fork this repo and replace ./registry implementations with your own.\n * The catalog schema (component names + prop types) is the API contract\n * with the backend — do not rename components without a backend release.\n */\n\nimport { z } from 'zod';\n\nconst ActionPayloadSchema = z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n});\n\nexport const ActionButtonSchema = z.object({\n label: z.string(),\n action: ActionPayloadSchema,\n variant: z.enum(['primary', 'outline', 'ghost']).optional(),\n});\n\nexport const ButtonRowSchema = z.object({\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n wrap: z.boolean().optional(),\n});\n\nexport const TextInputSchema = z.object({\n placeholder: z.union([z.string(), z.array(z.string())]).optional(),\n ctaLabel: z.string().optional(),\n});\n\nexport const QuestionHeadingSchema = z.object({\n text: z.string(),\n});\n\nexport const qnaCatalog = {\n components: {\n ActionButton: {\n schema: ActionButtonSchema,\n description: 'A single clickable QNA action button.',\n },\n ButtonRow: {\n schema: ButtonRowSchema,\n description: 'Container for a group of QNA action buttons.',\n },\n TextInput: {\n schema: TextInputSchema,\n description: 'Free-text input with rotating placeholder and CTA button.',\n },\n QuestionHeading: {\n schema: QuestionHeadingSchema,\n description: 'A heading displayed above the QNA button group.',\n },\n },\n} as const;\n\nexport type QNACatalog = typeof qnaCatalog;\nexport type QNAComponentName = keyof QNACatalog['components'];\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport * as ga from '../common/ga-datalayer.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n this.isVisible = true;\n ga.trackInit('qna');\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n /** Clean up TextInput placeholder rotation timers to prevent interval leaks. */\n private _cleanupTextInputTimers(): void {\n if (!this._contentEl) return;\n const wrappers = this._contentEl.querySelectorAll('.gengage-qna-input-wrapper');\n for (const wrapper of wrappers) {\n (wrapper as HTMLElement & { _cleanup?: () => void })._cleanup?.();\n }\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n // Clean up TextInput timers before clearing DOM to prevent interval leaks\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n this._contentEl.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n const effectivePlaceholders =\n result.actions.length > 0 && cfgPlaceholders === true\n ? result.actions.map((a) => a.title)\n : cfgPlaceholders === true\n ? this._i18n.defaultInputPlaceholder\n : (cfgPlaceholders ?? this._i18n.defaultInputPlaceholder);\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n onOpenChat: this._openChatHandler,\n };\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const specsToRender = result.uiSpecs.length > 0 ? result.uiSpecs : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n this._contentEl.appendChild(rendered);\n }\n\n if (nonEmptySpecs.length > 0) {\n ga.trackShow('qna');\n }\n\n const shouldRenderStandaloneInput = !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n this._appendStandaloneInput(renderContext, effectivePlaceholders);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n // Keep QNA usable during backend hiccups: render at least free-text input.\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n const fallbackPlaceholders =\n this.config.inputPlaceholder === true\n ? this._i18n.defaultInputPlaceholder\n : (this.config.inputPlaceholder ?? this._i18n.defaultInputPlaceholder);\n const fallbackContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n onOpenChat: this._openChatHandler,\n };\n if (this.config.ctaText !== undefined) fallbackContext.ctaText = this.config.ctaText;\n this._appendStandaloneInput(fallbackContext, fallbackPlaceholders);\n }\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _appendStandaloneInput(context: QNAUISpecRenderContext, placeholder?: string | string[]): void {\n if (!this._contentEl) return;\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, context);\n this._contentEl.appendChild(renderedInput);\n }\n\n private _handleAction(action: ActionPayload): void {\n ga.trackSuggestedQuestion(action.title, action.type);\n this.config.onActionSelected?.(action);\n dispatch('gengage:qna:action', action);\n }\n\n private _handleOpenChat(): void {\n // Couple CTA with the inline QNA text input when available.\n const input = this._contentEl?.querySelector<HTMLInputElement>('.gengage-qna-input');\n if (input) {\n input.focus();\n }\n this.config.onOpenChat?.();\n dispatch('gengage:qna:open-chat', {});\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n"],"names":["fetchLauncherActions","request","transport","signal","url","buildChatEndpointUrl","result","fetchInit","response","streamOpts","event","normalized","adaptV1Event","el","action","consumeStream","renderButtonRow","options","container","button","actionPayload","cta","renderTextInput","input","placeholders","placeholderIndex","rotateTimer","fadeTimer","sendBtn","submit","text","e","toActionPayload","raw","labelFallback","obj","type","titleRaw","payload","title","actionPayloadToRowAction","rowAction","collectButtonRowActions","element","spec","actions","directActions","rawAction","directButtons","rawButton","label","childId","child","seen","DEFAULT_QNA_UI_SPEC_REGISTRY","context","rowActions","orientation","placeholder","ctaLabel","heading","defaultQnaUnknownUISpecRenderer","renderElement","wrapper","rendered","createDefaultQnaUISpecRegistry","renderQnaUISpec","registry","unknownRenderer","renderUISpecWithRegistry","QNA_I18N_TR","QNA_I18N_EN","normalizeLocale","locale","resolveQnaLocale","ActionPayloadSchema","z.object","z.string","z.unknown","ActionButtonSchema","z.enum","ButtonRowSchema","z.boolean","TextInputSchema","z.union","z.array","QuestionHeadingSchema","qnaCatalog","GengageQNA","BaseWidget","config","sku","ga.trackInit","newSku","wrappers","loading","requestId","fetchStart","streamStartEvent","launcherReq","pageType","streamDoneEvent","widgetHistorySnapshotEvent","cfgPlaceholders","effectivePlaceholders","a","renderContext","fallbackSpec","nonEmptySpecs","ga.trackShow","err","dispatch","getGlobalErrorMessage","streamErrorEvent","fallbackPlaceholders","fallbackContext","i","dot","baseRegistry","mergeUISpecRegistry","defaultRender","inputSpec","inputContext","override","specs","elements","childIds","id","renderedInput","ga.trackSuggestedQuestion","createQNAWidget"],"mappings":"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"}