@yak-io/javascript 0.11.0 → 0.11.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.
package/dist/index.js CHANGED
@@ -282,7 +282,8 @@ var YakClient = class {
282
282
  * ```
283
283
  */
284
284
  sendPrompt(prompt) {
285
- if (!this.iframeWindow) {
285
+ const target = this.getActiveTarget();
286
+ if (!target) {
286
287
  logger.warn("Cannot send prompt: iframe not ready");
287
288
  return;
288
289
  }
@@ -290,21 +291,37 @@ var YakClient = class {
290
291
  type: "yak:prompt",
291
292
  payload: { prompt }
292
293
  };
293
- this.iframeWindow.postMessage(message, this.getIframeOrigin());
294
+ target.window.postMessage(message, target.origin);
294
295
  }
295
296
  /**
296
297
  * Send a focus request to the chatbot iframe
297
298
  * This will focus the chat input field
298
299
  */
299
300
  sendFocus() {
300
- if (!this.iframeWindow) {
301
+ const target = this.getActiveTarget();
302
+ if (!target) {
301
303
  logger.warn("Cannot send focus: iframe not ready");
302
304
  return;
303
305
  }
304
306
  const message = {
305
307
  type: "yak:focus"
306
308
  };
307
- this.iframeWindow.postMessage(message, this.getIframeOrigin());
309
+ target.window.postMessage(message, target.origin);
310
+ }
311
+ /**
312
+ * The live postMessage target. Prefers `readyTarget` — the window that
313
+ * completed the `yak:ready` handshake — and falls back to the iframe's
314
+ * `contentWindow`. The two are normally identical, but they're populated by
315
+ * different events (the ready postMessage vs. the DOM `load` event) and can
316
+ * briefly diverge (e.g. a remount under React StrictMode, where `isReady`
317
+ * goes true before — or without — the load event repopulating
318
+ * `iframeWindow`). Trusting `readyTarget` keeps `sendFocus`/`sendPrompt`
319
+ * consistent with `isReady()` and avoids spurious "iframe not ready" warns.
320
+ */
321
+ getActiveTarget() {
322
+ if (this.readyTarget) return this.readyTarget;
323
+ if (this.iframeWindow) return { window: this.iframeWindow, origin: this.getIframeOrigin() };
324
+ return null;
308
325
  }
309
326
  /**
310
327
  * Check if the iframe is ready to receive messages
@@ -1369,7 +1386,7 @@ function getTriggerStyles() {
1369
1386
  flex-shrink: 0;
1370
1387
  }
1371
1388
 
1372
- .yak-widget-icon { width: 20px; height: 20px; color: currentColor; }
1389
+ .yak-widget-icon { width: 24px; height: 24px; color: currentColor; }
1373
1390
 
1374
1391
  .yak-widget-trigger-icon-btn {
1375
1392
  display: inline-flex; align-items: center; justify-content: center;
@@ -1616,6 +1633,7 @@ var YakEmbed = class {
1616
1633
  if (!this.mounted) return;
1617
1634
  this.mounted = false;
1618
1635
  this.client.unmount();
1636
+ this.client.setIframeWindow(null);
1619
1637
  if (this.unsubscribeVoice) {
1620
1638
  this.unsubscribeVoice();
1621
1639
  this.unsubscribeVoice = null;
@@ -1779,8 +1797,8 @@ var YakEmbed = class {
1779
1797
  const logoImg = document.createElement("img");
1780
1798
  logoImg.src = `${this.client.getIframeOrigin()}/logo.svg`;
1781
1799
  logoImg.alt = "";
1782
- logoImg.width = 20;
1783
- logoImg.height = 20;
1800
+ logoImg.width = 24;
1801
+ logoImg.height = 24;
1784
1802
  logoImg.className = "yak-widget-icon";
1785
1803
  iconBg.appendChild(logoImg);
1786
1804
  this.triggerEl.appendChild(iconBg);