@gengage/assistant-fe 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +2 -2
  3. package/dist/assistant-fe.css +1 -1
  4. package/dist/chat/api.d.ts +12 -2
  5. package/dist/chat/api.d.ts.map +1 -1
  6. package/dist/chat/catalog.d.ts +246 -896
  7. package/dist/chat/catalog.d.ts.map +1 -1
  8. package/dist/chat/components/AIGroupingCards.d.ts.map +1 -1
  9. package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -1
  10. package/dist/chat/components/AITopPicks.d.ts.map +1 -1
  11. package/dist/chat/components/CategoriesContainer.d.ts.map +1 -1
  12. package/dist/chat/components/ChatDrawer.d.ts +16 -3
  13. package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
  14. package/dist/chat/components/ComparisonTable.d.ts +9 -0
  15. package/dist/chat/components/ComparisonTable.d.ts.map +1 -1
  16. package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -1
  17. package/dist/chat/components/HandoffNotice.d.ts +5 -0
  18. package/dist/chat/components/HandoffNotice.d.ts.map +1 -0
  19. package/dist/chat/components/KvkkBanner.d.ts +1 -0
  20. package/dist/chat/components/KvkkBanner.d.ts.map +1 -1
  21. package/dist/chat/components/ProactivePopup.d.ts +9 -0
  22. package/dist/chat/components/ProactivePopup.d.ts.map +1 -1
  23. package/dist/chat/components/ProductSummaryCard.d.ts +4 -0
  24. package/dist/chat/components/ProductSummaryCard.d.ts.map +1 -0
  25. package/dist/chat/components/ReviewHighlights.d.ts +3 -1
  26. package/dist/chat/components/ReviewHighlights.d.ts.map +1 -1
  27. package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -1
  28. package/dist/chat/components/renderUISpec.d.ts +4 -3
  29. package/dist/chat/components/renderUISpec.d.ts.map +1 -1
  30. package/dist/chat/heartbeat.d.ts +71 -0
  31. package/dist/chat/heartbeat.d.ts.map +1 -0
  32. package/dist/chat/index.d.ts +39 -78
  33. package/dist/chat/index.d.ts.map +1 -1
  34. package/dist/chat/kvkk.d.ts +21 -0
  35. package/dist/chat/kvkk.d.ts.map +1 -0
  36. package/dist/chat/locales/en.d.ts.map +1 -1
  37. package/dist/chat/locales/tr.d.ts.map +1 -1
  38. package/dist/chat/panel-manager.d.ts +81 -0
  39. package/dist/chat/panel-manager.d.ts.map +1 -0
  40. package/dist/chat/session-persistence.d.ts +56 -0
  41. package/dist/chat/session-persistence.d.ts.map +1 -0
  42. package/dist/chat/types.d.ts +39 -1
  43. package/dist/chat/types.d.ts.map +1 -1
  44. package/dist/chat.cjs +1 -1
  45. package/dist/chat.iife.js +48 -10
  46. package/dist/chat.iife.js.map +1 -1
  47. package/dist/chat.js +9 -8
  48. package/dist/chat.js.map +1 -1
  49. package/dist/common/analytics-events.d.ts +2 -0
  50. package/dist/common/analytics-events.d.ts.map +1 -1
  51. package/dist/common/analytics.d.ts.map +1 -1
  52. package/dist/common/api-paths.d.ts +5 -0
  53. package/dist/common/api-paths.d.ts.map +1 -1
  54. package/dist/common/client.d.ts +4 -1
  55. package/dist/common/client.d.ts.map +1 -1
  56. package/dist/common/communication-bridge.d.ts.map +1 -1
  57. package/dist/common/config-schema.d.ts +33 -195
  58. package/dist/common/config-schema.d.ts.map +1 -1
  59. package/dist/common/ga-datalayer.d.ts +62 -0
  60. package/dist/common/ga-datalayer.d.ts.map +1 -0
  61. package/dist/common/index.d.ts +7 -0
  62. package/dist/common/index.d.ts.map +1 -1
  63. package/dist/common/indexed-db.d.ts +1 -1
  64. package/dist/common/indexed-db.d.ts.map +1 -1
  65. package/dist/common/merchant-configs.d.ts +22 -0
  66. package/dist/common/merchant-configs.d.ts.map +1 -0
  67. package/dist/common/overlay.d.ts +5 -0
  68. package/dist/common/overlay.d.ts.map +1 -1
  69. package/dist/common/page-detect.d.ts +31 -0
  70. package/dist/common/page-detect.d.ts.map +1 -0
  71. package/dist/common/preflight.d.ts +3 -1
  72. package/dist/common/preflight.d.ts.map +1 -1
  73. package/dist/common/price-formatter.d.ts +33 -0
  74. package/dist/common/price-formatter.d.ts.map +1 -0
  75. package/dist/common/product-utils.d.ts +26 -0
  76. package/dist/common/product-utils.d.ts.map +1 -0
  77. package/dist/common/quantity-stepper.d.ts +22 -0
  78. package/dist/common/quantity-stepper.d.ts.map +1 -0
  79. package/dist/common/safe-html.d.ts +10 -6
  80. package/dist/common/safe-html.d.ts.map +1 -1
  81. package/dist/common/streaming.d.ts +6 -0
  82. package/dist/common/streaming.d.ts.map +1 -1
  83. package/dist/common/tts-player.d.ts +12 -0
  84. package/dist/common/tts-player.d.ts.map +1 -0
  85. package/dist/common/types.d.ts +51 -0
  86. package/dist/common/types.d.ts.map +1 -1
  87. package/dist/common/v1-protocol-adapter.d.ts +9 -0
  88. package/dist/common/v1-protocol-adapter.d.ts.map +1 -1
  89. package/dist/common/voice-input.d.ts +74 -0
  90. package/dist/common/voice-input.d.ts.map +1 -0
  91. package/dist/common/widget-base.d.ts +18 -1
  92. package/dist/common/widget-base.d.ts.map +1 -1
  93. package/dist/common.cjs +1 -1
  94. package/dist/common.cjs.map +1 -1
  95. package/dist/common.js +564 -244
  96. package/dist/common.js.map +1 -1
  97. package/dist/index-CXbH-cw8.js +4337 -0
  98. package/dist/index-CXbH-cw8.js.map +1 -0
  99. package/dist/index-DHfTHscz.cjs +13 -0
  100. package/dist/index-DHfTHscz.cjs.map +1 -0
  101. package/dist/index.cjs +1 -1
  102. package/dist/index.d.ts +2 -2
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +61 -53
  105. package/dist/qna/catalog.d.ts +30 -96
  106. package/dist/qna/catalog.d.ts.map +1 -1
  107. package/dist/qna/components/TextInput.d.ts.map +1 -1
  108. package/dist/qna/components/renderUISpec.d.ts.map +1 -1
  109. package/dist/qna/index.d.ts +2 -0
  110. package/dist/qna/index.d.ts.map +1 -1
  111. package/dist/qna.cjs +1 -1
  112. package/dist/qna.cjs.map +1 -1
  113. package/dist/qna.iife.js +46 -8
  114. package/dist/qna.iife.js.map +1 -1
  115. package/dist/qna.js +94 -86
  116. package/dist/qna.js.map +1 -1
  117. package/dist/quantity-stepper-B8kX8GbN.js +209 -0
  118. package/dist/quantity-stepper-B8kX8GbN.js.map +1 -0
  119. package/dist/quantity-stepper-UbAp53Ow.cjs +2 -0
  120. package/dist/quantity-stepper-UbAp53Ow.cjs.map +1 -0
  121. package/dist/schemas-CPkzbgia.js +4572 -0
  122. package/dist/schemas-CPkzbgia.js.map +1 -0
  123. package/dist/schemas-tCxs1sED.cjs +86 -0
  124. package/dist/schemas-tCxs1sED.cjs.map +1 -0
  125. package/dist/simrel/api.d.ts.map +1 -1
  126. package/dist/simrel/catalog.d.ts +32 -240
  127. package/dist/simrel/catalog.d.ts.map +1 -1
  128. package/dist/simrel/components/GroupTabs.d.ts.map +1 -1
  129. package/dist/simrel/components/ProductCard.d.ts +2 -0
  130. package/dist/simrel/components/ProductCard.d.ts.map +1 -1
  131. package/dist/simrel/components/renderUISpec.d.ts.map +1 -1
  132. package/dist/simrel/index.d.ts.map +1 -1
  133. package/dist/simrel/types.d.ts +5 -0
  134. package/dist/simrel/types.d.ts.map +1 -1
  135. package/dist/simrel.cjs +1 -1
  136. package/dist/simrel.cjs.map +1 -1
  137. package/dist/simrel.css +1 -1
  138. package/dist/simrel.iife.js +46 -8
  139. package/dist/simrel.iife.js.map +1 -1
  140. package/dist/simrel.js +319 -279
  141. package/dist/simrel.js.map +1 -1
  142. package/package.json +28 -8
  143. package/dist/index-CFA70IGF.js +0 -3626
  144. package/dist/index-CFA70IGF.js.map +0 -1
  145. package/dist/index-Dfl89zpe.cjs +0 -13
  146. package/dist/index-Dfl89zpe.cjs.map +0 -1
  147. package/dist/types-CeON7iBO.cjs +0 -48
  148. package/dist/types-CeON7iBO.cjs.map +0 -1
  149. package/dist/types-yxW8WA7u.js +0 -4132
  150. package/dist/types-yxW8WA7u.js.map +0 -1
package/dist/qna.js CHANGED
@@ -1,5 +1,5 @@
1
- import { b as w, c as q, a as L, r as Q, o as g, s as p, u as x, d as R, e as B, f as E, g as N, B as O, h as U, i as H, w as P, j as m, k as j, l as D, m as F } from "./types-yxW8WA7u.js";
2
- async function z(n, e, t) {
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-CPkzbgia.js";
2
+ async function W(n, e, t) {
3
3
  const i = w("launcher_action", e), o = { uiSpecs: [], actions: [] }, s = {
4
4
  method: "POST",
5
5
  headers: { "Content-Type": "application/json" },
@@ -10,10 +10,10 @@ async function z(n, e, t) {
10
10
  if (!a.ok)
11
11
  throw new Error(`HTTP ${a.status}: ${a.statusText}`);
12
12
  const r = {
13
- onEvent: (c) => {
14
- const l = L(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))
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))
17
17
  if (d.type === "ActionButton" && d.props?.action) {
18
18
  const h = d.props.action;
19
19
  o.actions.push(h);
@@ -44,7 +44,7 @@ function A(n) {
44
44
  }
45
45
  return e;
46
46
  }
47
- function W(n) {
47
+ function $(n) {
48
48
  const e = document.createElement("div");
49
49
  e.className = "gengage-qna-input-wrapper";
50
50
  const t = document.createElement("input");
@@ -52,29 +52,29 @@ function W(n) {
52
52
  const i = Array.isArray(n.placeholders) ? n.placeholders : n.placeholders ? [n.placeholders] : [n.defaultInputPlaceholder ?? "Bir soru sorun..."];
53
53
  let o = 0;
54
54
  t.placeholder = i[0] ?? "";
55
- let s = null;
55
+ let s = null, a = null;
56
56
  i.length > 1 && (s = setInterval(() => {
57
- t.classList.add("gengage-qna-input--fade"), setTimeout(() => {
57
+ t.classList.add("gengage-qna-input--fade"), a = setTimeout(() => {
58
58
  o = (o + 1) % i.length, t.placeholder = i[o] ?? "", t.classList.remove("gengage-qna-input--fade");
59
59
  }, 180);
60
60
  }, 3e3));
61
- const a = document.createElement("button");
62
- a.className = "gengage-qna-send", a.type = "button", a.textContent = n.ctaLabel ?? n.sendButtonText ?? "Sor", a.setAttribute("aria-label", n.sendQuestionAriaLabel ?? "Send question");
63
- const r = () => {
61
+ const r = document.createElement("button");
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
64
  const c = t.value.trim();
65
65
  c && (n.onSubmit({
66
66
  title: c,
67
67
  type: "user_message",
68
- payload: c
68
+ payload: { text: c }
69
69
  }), t.value = "");
70
70
  };
71
- return a.addEventListener("click", r), t.addEventListener("keydown", (c) => {
72
- c.key === "Enter" && (c.preventDefault(), r());
73
- }), e.appendChild(t), e.appendChild(a), e._cleanup = () => {
74
- s && clearInterval(s);
71
+ return r.addEventListener("click", l), t.addEventListener("keydown", (c) => {
72
+ c.key === "Enter" && (c.preventDefault(), l());
73
+ }), e.appendChild(t), e.appendChild(r), e._cleanup = () => {
74
+ s && clearInterval(s), a && clearTimeout(a);
75
75
  }, e;
76
76
  }
77
- function y(n, e) {
77
+ function b(n, e) {
78
78
  if (!n || typeof n != "object") return null;
79
79
  const t = n, i = t.type;
80
80
  if (typeof i != "string" || i.length === 0) return null;
@@ -94,22 +94,22 @@ function C(n, e) {
94
94
  const t = [], i = n.props?.actions;
95
95
  if (Array.isArray(i))
96
96
  for (const a of i) {
97
- const r = y(a);
97
+ const r = b(a);
98
98
  r && t.push(r);
99
99
  }
100
100
  const o = n.props?.buttons;
101
101
  if (Array.isArray(o))
102
102
  for (const a of o) {
103
103
  if (!a || typeof a != "object") continue;
104
- const r = a, c = typeof r.label == "string" ? r.label : void 0, l = y(r.action, c);
105
- l && t.push(l);
104
+ const r = a, l = typeof r.label == "string" ? r.label : void 0, c = b(r.action, l);
105
+ c && t.push(c);
106
106
  }
107
107
  if (n.children)
108
108
  for (const a of n.children) {
109
109
  const r = e.elements[a];
110
110
  if (!r || r.type !== "ActionButton") continue;
111
- const c = typeof r.props?.label == "string" ? r.props.label : void 0, l = y(r.props?.action, c);
112
- l && t.push(l);
111
+ const l = typeof r.props?.label == "string" ? r.props.label : void 0, c = b(r.props?.action, l);
112
+ c && t.push(c);
113
113
  }
114
114
  const s = /* @__PURE__ */ new Set();
115
115
  return t.filter((a) => s.has(a.title) ? !1 : (s.add(a.title), !0));
@@ -138,7 +138,7 @@ const v = {
138
138
  t.className = "gengage-qna-button", t.type = "button";
139
139
  const i = n.props?.label;
140
140
  typeof i == "string" ? t.textContent = i : t.textContent = e.i18n.defaultCtaText;
141
- const o = y(n.props?.action, typeof i == "string" ? i : void 0);
141
+ const o = b(n.props?.action, typeof i == "string" ? i : void 0);
142
142
  return o && t.addEventListener("click", () => e.onAction(o)), t;
143
143
  },
144
144
  TextInput: ({ element: n, context: e }) => {
@@ -149,17 +149,18 @@ const v = {
149
149
  sendButtonText: e.i18n.sendButton,
150
150
  sendQuestionAriaLabel: e.i18n.sendQuestionAriaLabel
151
151
  };
152
- return i !== void 0 && (s.placeholders = i), o !== void 0 && (s.ctaLabel = o), W(s);
152
+ return i !== void 0 && (s.placeholders = i), o !== void 0 && (s.ctaLabel = o), $(s);
153
153
  },
154
154
  QuestionHeading: ({ element: n }) => {
155
155
  const e = document.createElement("h3");
156
156
  e.className = "gengage-qna-heading";
157
157
  const t = n.props?.text;
158
158
  return e.textContent = typeof t == "string" ? t : "", e;
159
- }
160
- /* ProductCard intentionally omitted — QNA renders only question pills + text input.
161
- If the backend sends a ProductCard element, the unknownRenderer will render its
162
- children (if any) or return null. */
159
+ },
160
+ // ProductCard: no-op — QNA renders only question pills + text input (matches
161
+ // robot-engine-lean). Backend may send ProductCard but QNA intentionally skips it;
162
+ // the product is shown once chat opens via openWithAction().
163
+ ProductCard: () => null
163
164
  }, S = ({
164
165
  element: n,
165
166
  renderElement: e
@@ -173,11 +174,11 @@ const v = {
173
174
  }
174
175
  return t;
175
176
  };
176
- function M() {
177
+ function V() {
177
178
  return { ...v };
178
179
  }
179
- function G(n, e, t = v, i = S) {
180
- return Q({
180
+ function J(n, e, t = v, i = S) {
181
+ return x({
181
182
  spec: n,
182
183
  context: e,
183
184
  registry: t,
@@ -185,14 +186,14 @@ function G(n, e, t = v, i = S) {
185
186
  unknownRenderer: i
186
187
  });
187
188
  }
188
- const k = {
189
+ const I = {
189
190
  quickQuestionsAriaLabel: "Hızlı sorular",
190
191
  askQuestionAriaLabel: "Soru sorun",
191
192
  defaultInputPlaceholder: "Bir soru sorun...",
192
193
  sendButton: "Sor",
193
194
  sendQuestionAriaLabel: "Soruyu gönder",
194
195
  defaultCtaText: "Başka bir şey sor"
195
- }, $ = {
196
+ }, Y = {
196
197
  quickQuestionsAriaLabel: "Quick questions",
197
198
  askQuestionAriaLabel: "Ask a question",
198
199
  defaultInputPlaceholder: "Ask a question...",
@@ -200,56 +201,56 @@ const k = {
200
201
  sendQuestionAriaLabel: "Send question",
201
202
  defaultCtaText: "Ask something else"
202
203
  };
203
- function V(n) {
204
+ function K(n) {
204
205
  return n ? n.toLowerCase().split("-")[0] ?? "tr" : "tr";
205
206
  }
206
- function J(n) {
207
- return V(n) === "en" ? $ : k;
207
+ function X(n) {
208
+ return K(n) === "en" ? Y : I;
208
209
  }
209
- const Y = g({
210
+ const Z = g({
210
211
  title: p(),
211
212
  type: p(),
212
- payload: N().optional()
213
- }), K = g({
213
+ payload: B().optional()
214
+ }), tt = g({
214
215
  label: p(),
215
- action: Y,
216
+ action: Z,
216
217
  variant: E(["primary", "outline", "ghost"]).optional()
217
- }), X = g({
218
+ }), et = g({
218
219
  orientation: E(["horizontal", "vertical"]).optional(),
219
- wrap: B().optional()
220
- }), Z = g({
221
- placeholder: x([p(), R(p())]).optional(),
220
+ wrap: R().optional()
221
+ }), nt = g({
222
+ placeholder: L([p(), N(p())]).optional(),
222
223
  ctaLabel: p().optional()
223
- }), tt = g({
224
+ }), ot = g({
224
225
  text: p()
225
- }), at = {
226
+ }), ct = {
226
227
  components: {
227
228
  ActionButton: {
228
- schema: K,
229
+ schema: tt,
229
230
  description: "A single clickable QNA action button."
230
231
  },
231
232
  ButtonRow: {
232
- schema: X,
233
+ schema: et,
233
234
  description: "Container for a group of QNA action buttons."
234
235
  },
235
236
  TextInput: {
236
- schema: Z,
237
+ schema: nt,
237
238
  description: "Free-text input with rotating placeholder and CTA button."
238
239
  },
239
240
  QuestionHeading: {
240
- schema: tt,
241
+ schema: ot,
241
242
  description: "A heading displayed above the QNA button group."
242
243
  }
243
244
  }
244
245
  };
245
- class et extends O {
246
+ class it extends O {
246
247
  constructor() {
247
- super(...arguments), this._abortController = null, this._debounceTimer = null, this._contentEl = null, this._i18n = k, this._actionHandler = this._handleAction.bind(this), this._openChatHandler = this._handleOpenChat.bind(this);
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);
248
249
  }
249
250
  async onInit(e) {
250
251
  this._i18n = this._resolveI18n(e), this._contentEl = document.createElement("div"), this._contentEl.className = "gengage-qna-container", this.root.appendChild(this._contentEl);
251
252
  const t = e.pageContext?.sku;
252
- t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0;
253
+ t && (this._lastSku = t, await this._fetchAndRender(t)), this.isVisible = !0, U("qna");
253
254
  }
254
255
  onUpdate(e) {
255
256
  const t = e.sku;
@@ -265,7 +266,7 @@ class et extends O {
265
266
  onHide() {
266
267
  }
267
268
  onDestroy() {
268
- this._abort(), this._debounceTimer && (clearTimeout(this._debounceTimer), this._debounceTimer = null), this._contentEl && (this._contentEl.querySelector(".gengage-qna-input-wrapper")?._cleanup?.(), this._contentEl.remove(), this._contentEl = null);
269
+ this._abort(), this._debounceTimer && (clearTimeout(this._debounceTimer), this._debounceTimer = null), this._contentEl && (this._cleanupTextInputTimers(), this._contentEl.remove(), this._contentEl = null);
269
270
  }
270
271
  // ---------------------------------------------------------------------------
271
272
  // Internal
@@ -273,16 +274,23 @@ class et extends O {
273
274
  _abort() {
274
275
  this._abortController?.abort(), this._abortController = null;
275
276
  }
277
+ /** Clean up TextInput placeholder rotation timers to prevent interval leaks. */
278
+ _cleanupTextInputTimers() {
279
+ if (!this._contentEl) return;
280
+ const e = this._contentEl.querySelectorAll(".gengage-qna-input-wrapper");
281
+ for (const t of e)
282
+ t._cleanup?.();
283
+ }
276
284
  async _fetchAndRender(e) {
277
285
  if (this._abort(), this._abortController = new AbortController(), !this._contentEl) return;
278
- this._contentEl.innerHTML = "";
286
+ this._cleanupTextInputTimers(), this._contentEl.innerHTML = "";
279
287
  const t = this._createLoadingIndicator();
280
288
  this._contentEl.appendChild(t);
281
289
  const i = {
282
290
  middlewareUrl: this.config.middlewareUrl
283
291
  }, o = crypto.randomUUID(), s = Date.now();
284
292
  this.track(
285
- U(this.analyticsContext(), {
293
+ P(this.analyticsContext(), {
286
294
  endpoint: "launcher_action",
287
295
  request_id: o,
288
296
  widget: "qna"
@@ -297,37 +305,37 @@ class et extends O {
297
305
  locale: this.config.locale ?? "tr"
298
306
  }, r = this.config.pageContext?.pageType;
299
307
  r !== void 0 && (a.page_type = r);
300
- const c = await z(a, i, this._abortController.signal);
308
+ const l = await W(a, i, this._abortController.signal);
301
309
  if (this.track(
302
310
  H(this.analyticsContext(), {
303
311
  request_id: o,
304
312
  latency_ms: Date.now() - s,
305
- chunk_count: c.actions.length,
313
+ chunk_count: l.actions.length,
306
314
  widget: "qna"
307
315
  })
308
316
  ), this.track(
309
- P(this.analyticsContext(), {
310
- message_count: c.actions.length,
317
+ j(this.analyticsContext(), {
318
+ message_count: l.actions.length,
311
319
  history_ref: o,
312
320
  redaction_level: "none",
313
321
  widget: "qna"
314
322
  })
315
323
  ), !this._contentEl) return;
316
- if (this._contentEl.innerHTML = "", !this._specIncludesType(c.uiSpecs, "QuestionHeading") && this.config.showStaticQuestion && this.config.staticQuestionText) {
324
+ if (this._contentEl.innerHTML = "", !this._specIncludesType(l.uiSpecs, "QuestionHeading") && this.config.showStaticQuestion && this.config.staticQuestionText) {
317
325
  const u = document.createElement("h3");
318
326
  u.className = "gengage-qna-heading", u.textContent = this.config.staticQuestionText, this._contentEl.appendChild(u);
319
327
  }
320
- const d = this.config.inputPlaceholder, h = c.actions.length > 0 && d === !0 ? c.actions.map((u) => u.title) : d === !0 ? this._i18n.defaultInputPlaceholder : d, f = {
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 = {
321
329
  onAction: this._actionHandler,
322
330
  i18n: this._i18n
323
331
  };
324
332
  d === void 0 && (f.onOpenChat = this._openChatHandler, this.config.ctaText !== void 0 && (f.ctaText = this.config.ctaText)), h !== void 0 && (f.inputPlaceholder = h);
325
- const I = this._buildFallbackActionsSpec(c.actions), _ = (c.uiSpecs.length > 0 ? c.uiSpecs : [I]).filter((u) => Object.keys(u.elements).length > 0);
326
- for (const u of _) {
327
- const b = this._renderUISpec(u, f);
328
- this._contentEl.appendChild(b);
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);
329
337
  }
330
- if (d !== void 0 && !this._specIncludesType(_, "TextInput")) {
338
+ if (m.length > 0 && D("qna"), d !== void 0 && !this._specIncludesType(m, "TextInput")) {
331
339
  const u = {
332
340
  root: "root",
333
341
  elements: {
@@ -339,17 +347,17 @@ class et extends O {
339
347
  }
340
348
  }
341
349
  }
342
- }, b = this._renderUISpec(u, f);
343
- this._contentEl.appendChild(b);
350
+ }, y = this._renderUISpec(u, f);
351
+ this._contentEl.appendChild(y);
344
352
  }
345
353
  } catch (a) {
346
354
  if (a instanceof DOMException && a.name === "AbortError") return;
347
- m("gengage:global:error", {
355
+ _("gengage:global:error", {
348
356
  source: "qna",
349
357
  code: "FETCH_ERROR",
350
- message: j(this.config.locale)
358
+ message: F(this.config.locale)
351
359
  }), this.track(
352
- D(this.analyticsContext(), {
360
+ z(this.analyticsContext(), {
353
361
  request_id: o,
354
362
  error_code: "FETCH_ERROR",
355
363
  error_message: a instanceof Error ? a.message : String(a),
@@ -368,14 +376,14 @@ class et extends O {
368
376
  return e;
369
377
  }
370
378
  _resolveI18n(e) {
371
- return { ...J(e.locale), ...e.i18n };
379
+ return { ...X(e.locale), ...e.i18n };
372
380
  }
373
381
  _resolveUISpecRegistry() {
374
- const e = M();
375
- return F(e, this.config.renderer?.registry);
382
+ const e = V();
383
+ return M(e, this.config.renderer?.registry);
376
384
  }
377
385
  _renderUISpec(e, t) {
378
- const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? S, s = (c, l) => G(c, l, i, o), a = this.config.renderer?.renderUISpec;
386
+ const i = this._resolveUISpecRegistry(), o = this.config.renderer?.unknownRenderer ?? S, s = (l, c) => J(l, c, i, o), a = this.config.renderer?.renderUISpec;
379
387
  return a ? a(e, t, {
380
388
  registry: i,
381
389
  unknownRenderer: o,
@@ -415,21 +423,21 @@ class et extends O {
415
423
  };
416
424
  }
417
425
  _handleAction(e) {
418
- this.config.onActionSelected?.(e), m("gengage:qna:action", e);
426
+ G(e.title, e.type), this.config.onActionSelected?.(e), _("gengage:qna:action", e);
419
427
  }
420
428
  _handleOpenChat() {
421
- this.config.onOpenChat?.(), m("gengage:qna:open-chat", {});
429
+ this.config.onOpenChat?.(), _("gengage:qna:open-chat", {});
422
430
  }
423
431
  }
424
- function st() {
425
- return new et();
432
+ function lt() {
433
+ return new it();
426
434
  }
427
435
  export {
428
- et as GengageQNA,
429
- M as createDefaultQnaUISpecRegistry,
430
- st as createQNAWidget,
436
+ it as GengageQNA,
437
+ V as createDefaultQnaUISpecRegistry,
438
+ lt as createQNAWidget,
431
439
  S as defaultQnaUnknownUISpecRenderer,
432
- at as qnaCatalog,
433
- G as renderQnaUISpec
440
+ ct as qnaCatalog,
441
+ J as renderQnaUISpec
434
442
  };
435
443
  //# sourceMappingURL=qna.js.map
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 if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n 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 };\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 intentionally omitted — QNA renders only question pills + text input.\n If the backend sends a ProductCard element, the unknownRenderer will render its\n children (if any) or return 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 {\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 }\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 // Cleanup text input timers\n const inputWrapper = this._contentEl.querySelector('.gengage-qna-input-wrapper') as\n | (HTMLElement & { _cleanup?: () => void })\n | null;\n inputWrapper?._cleanup?.();\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 private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\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 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 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","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","newSku","loading","requestId","fetchStart","streamStartEvent","launcherReq","pageType","streamDoneEvent","widgetHistorySnapshotEvent","cfgPlaceholders","effectivePlaceholders","a","renderContext","fallbackSpec","nonEmptySpecs","inputSpec","renderedInput","err","dispatch","getGlobalErrorMessage","streamErrorEvent","i","dot","baseRegistry","mergeUISpecRegistry","defaultRender","inputContext","override","specs","elements","childIds","id","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 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 (matches\n // robot-engine-lean). 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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"}