@thoughtspot/visual-embed-sdk 1.49.0 → 1.49.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 (143) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +17 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts.map +1 -1
  5. package/cjs/src/embed/app.js +4 -1
  6. package/cjs/src/embed/app.js.map +1 -1
  7. package/cjs/src/embed/app.spec.js +97 -0
  8. package/cjs/src/embed/app.spec.js.map +1 -1
  9. package/cjs/src/embed/conversation.d.ts +8 -0
  10. package/cjs/src/embed/conversation.d.ts.map +1 -1
  11. package/cjs/src/embed/conversation.js +2 -1
  12. package/cjs/src/embed/conversation.js.map +1 -1
  13. package/cjs/src/embed/conversation.spec.js +12 -0
  14. package/cjs/src/embed/conversation.spec.js.map +1 -1
  15. package/cjs/src/embed/events.spec.js +5 -0
  16. package/cjs/src/embed/events.spec.js.map +1 -1
  17. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  18. package/cjs/src/embed/liveboard.js +4 -1
  19. package/cjs/src/embed/liveboard.js.map +1 -1
  20. package/cjs/src/embed/liveboard.spec.js +11 -0
  21. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  22. package/cjs/src/embed/ts-embed.d.ts +38 -0
  23. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  24. package/cjs/src/embed/ts-embed.js +168 -11
  25. package/cjs/src/embed/ts-embed.js.map +1 -1
  26. package/cjs/src/embed/ts-embed.spec.js +237 -0
  27. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  28. package/cjs/src/mixpanel-service.js +2 -2
  29. package/cjs/src/mixpanel-service.js.map +1 -1
  30. package/cjs/src/types.d.ts +87 -4
  31. package/cjs/src/types.d.ts.map +1 -1
  32. package/cjs/src/types.js +47 -3
  33. package/cjs/src/types.js.map +1 -1
  34. package/cjs/src/utils/logger.js +2 -2
  35. package/cjs/src/utils/logger.js.map +1 -1
  36. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  37. package/cjs/src/utils/processTrigger.js +6 -5
  38. package/cjs/src/utils/processTrigger.js.map +1 -1
  39. package/cjs/src/utils/processTrigger.spec.js +13 -0
  40. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  41. package/cjs/src/utils/sdk-version.d.ts +2 -0
  42. package/cjs/src/utils/sdk-version.d.ts.map +1 -0
  43. package/cjs/src/utils/sdk-version.js +7 -0
  44. package/cjs/src/utils/sdk-version.js.map +1 -0
  45. package/cjs/src/utils.d.ts +10 -0
  46. package/cjs/src/utils.d.ts.map +1 -1
  47. package/cjs/src/utils.js +23 -1
  48. package/cjs/src/utils.js.map +1 -1
  49. package/cjs/src/utils.spec.js +48 -0
  50. package/cjs/src/utils.spec.js.map +1 -1
  51. package/dist/{index-_UGCSSDR.js → index-CS7yJ2Jj.js} +1 -1
  52. package/dist/src/css-variables.d.ts +17 -0
  53. package/dist/src/css-variables.d.ts.map +1 -1
  54. package/dist/src/embed/app.d.ts.map +1 -1
  55. package/dist/src/embed/conversation.d.ts +8 -0
  56. package/dist/src/embed/conversation.d.ts.map +1 -1
  57. package/dist/src/embed/liveboard.d.ts.map +1 -1
  58. package/dist/src/embed/ts-embed.d.ts +38 -0
  59. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  60. package/dist/src/types.d.ts +87 -4
  61. package/dist/src/types.d.ts.map +1 -1
  62. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  63. package/dist/src/utils/sdk-version.d.ts +2 -0
  64. package/dist/src/utils/sdk-version.d.ts.map +1 -0
  65. package/dist/src/utils.d.ts +10 -0
  66. package/dist/src/utils.d.ts.map +1 -1
  67. package/dist/tsembed-react.es.js +255 -23
  68. package/dist/tsembed-react.js +254 -22
  69. package/dist/tsembed.es.js +255 -23
  70. package/dist/tsembed.js +254 -22
  71. package/dist/visual-embed-sdk-react-full.d.ts +148 -3
  72. package/dist/visual-embed-sdk-react.d.ts +148 -3
  73. package/dist/visual-embed-sdk.d.ts +148 -3
  74. package/lib/package.json +1 -1
  75. package/lib/src/css-variables.d.ts +17 -0
  76. package/lib/src/css-variables.d.ts.map +1 -1
  77. package/lib/src/embed/app.d.ts.map +1 -1
  78. package/lib/src/embed/app.js +4 -1
  79. package/lib/src/embed/app.js.map +1 -1
  80. package/lib/src/embed/app.spec.js +97 -0
  81. package/lib/src/embed/app.spec.js.map +1 -1
  82. package/lib/src/embed/conversation.d.ts +8 -0
  83. package/lib/src/embed/conversation.d.ts.map +1 -1
  84. package/lib/src/embed/conversation.js +2 -1
  85. package/lib/src/embed/conversation.js.map +1 -1
  86. package/lib/src/embed/conversation.spec.js +12 -0
  87. package/lib/src/embed/conversation.spec.js.map +1 -1
  88. package/lib/src/embed/events.spec.js +5 -0
  89. package/lib/src/embed/events.spec.js.map +1 -1
  90. package/lib/src/embed/liveboard.d.ts.map +1 -1
  91. package/lib/src/embed/liveboard.js +4 -1
  92. package/lib/src/embed/liveboard.js.map +1 -1
  93. package/lib/src/embed/liveboard.spec.js +11 -0
  94. package/lib/src/embed/liveboard.spec.js.map +1 -1
  95. package/lib/src/embed/ts-embed.d.ts +38 -0
  96. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  97. package/lib/src/embed/ts-embed.js +168 -11
  98. package/lib/src/embed/ts-embed.js.map +1 -1
  99. package/lib/src/embed/ts-embed.spec.js +237 -0
  100. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  101. package/lib/src/mixpanel-service.js +1 -1
  102. package/lib/src/mixpanel-service.js.map +1 -1
  103. package/lib/src/types.d.ts +87 -4
  104. package/lib/src/types.d.ts.map +1 -1
  105. package/lib/src/types.js +47 -3
  106. package/lib/src/types.js.map +1 -1
  107. package/lib/src/utils/logger.js +1 -1
  108. package/lib/src/utils/logger.js.map +1 -1
  109. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  110. package/lib/src/utils/processTrigger.js +6 -5
  111. package/lib/src/utils/processTrigger.js.map +1 -1
  112. package/lib/src/utils/processTrigger.spec.js +13 -0
  113. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  114. package/lib/src/utils/sdk-version.d.ts +2 -0
  115. package/lib/src/utils/sdk-version.d.ts.map +1 -0
  116. package/lib/src/utils/sdk-version.js +3 -0
  117. package/lib/src/utils/sdk-version.js.map +1 -0
  118. package/lib/src/utils.d.ts +10 -0
  119. package/lib/src/utils.d.ts.map +1 -1
  120. package/lib/src/utils.js +21 -0
  121. package/lib/src/utils.js.map +1 -1
  122. package/lib/src/utils.spec.js +49 -1
  123. package/lib/src/utils.spec.js.map +1 -1
  124. package/lib/src/visual-embed-sdk.d.ts +148 -3
  125. package/package.json +1 -1
  126. package/src/css-variables.ts +20 -0
  127. package/src/embed/app.spec.ts +109 -0
  128. package/src/embed/app.ts +4 -0
  129. package/src/embed/conversation.spec.ts +17 -0
  130. package/src/embed/conversation.ts +10 -0
  131. package/src/embed/events.spec.ts +7 -0
  132. package/src/embed/liveboard.spec.ts +15 -0
  133. package/src/embed/liveboard.ts +4 -0
  134. package/src/embed/ts-embed.spec.ts +294 -0
  135. package/src/embed/ts-embed.ts +181 -10
  136. package/src/mixpanel-service.ts +1 -1
  137. package/src/types.ts +86 -3
  138. package/src/utils/logger.ts +1 -1
  139. package/src/utils/processTrigger.spec.ts +23 -0
  140. package/src/utils/processTrigger.ts +8 -6
  141. package/src/utils/sdk-version.ts +3 -0
  142. package/src/utils.spec.ts +63 -0
  143. package/src/utils.ts +24 -0
@@ -1,4 +1,4 @@
1
- /* @thoughtspot/visual-embed-sdk version 1.49.0 */
1
+ /* @thoughtspot/visual-embed-sdk version 1.49.2 */
2
2
  'use client';
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
@@ -2433,11 +2433,30 @@
2433
2433
  /**
2434
2434
  * Navigate to a specific page in the embedded ThoughtSpot application.
2435
2435
  * This is the same as calling `appEmbed.navigateToPage(path, true)`.
2436
- * @param - `path` - the path to navigate to go forward or back. The path value can
2437
- * be a number; for example, `1`, `-1`.
2436
+ *
2437
+ * Accepts either a plain value or an object with `path`
2438
+ * and an optional `replace` flag.
2439
+ *
2440
+ * @param data - A string path, a numeric history delta, or an object
2441
+ * `{ path: string | number, replace?: boolean }`.
2442
+ * - `path` — the route to navigate to, or a history delta such as `1`
2443
+ * or `-1` (calls `window.history.go()`).
2444
+ * - `replace` — when `true`, replaces the current history entry instead
2445
+ * of pushing a new one (uses `window.location.replace`).
2446
+ *
2438
2447
  * @example
2439
2448
  * ```js
2440
- * appEmbed.navigateToPage(-1)
2449
+ * // Preferred: use navigateToPage directly
2450
+ * appEmbed.navigateToPage(-1);
2451
+ *
2452
+ * // Numeric delta — go back one step
2453
+ * appEmbed.trigger(HostEvent.Navigate, -1);
2454
+ *
2455
+ * // String path — push a new history entry
2456
+ * appEmbed.trigger(HostEvent.Navigate, 'home');
2457
+ *
2458
+ * // Object format — replace current history entry
2459
+ * appEmbed.trigger(HostEvent.Navigate, { path: 'home', replace: true }); // SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
2441
2460
  * ```
2442
2461
  * @version SDK: 1.12.0 | ThoughtSpot: 8.4.0.cl, 8.4.1.sw
2443
2462
  */
@@ -4426,6 +4445,7 @@
4426
4445
  Param["EnableLiveboardDataCache"] = "enableLiveboardDataCache";
4427
4446
  Param["SpotterFileUploadEnabled"] = "spotterFileUploadEnabled";
4428
4447
  Param["SpotterFileUploadFileTypes"] = "spotterFileUploadFileTypes";
4448
+ Param["IsStarterPromptsEnabled"] = "enableStarterPrompts";
4429
4449
  })(Param || (Param = {}));
4430
4450
  /**
4431
4451
  * ThoughtSpot application pages include actions and menu commands
@@ -5068,6 +5088,16 @@
5068
5088
  * @version SDK: 1.9.0 | ThoughtSpot: 8.1.0.cl, 8.4.1.sw
5069
5089
  */
5070
5090
  Action["AddToFavorites"] = "addToFavorites";
5091
+ /**
5092
+ * Remove from Favorites option in home page v3 sidebar.
5093
+ * Allows removing an object from the user's favorites list from home-page v3 sidebar.
5094
+ * @version SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
5095
+ * @example
5096
+ * ```js
5097
+ * disabledActions: [Action.RemoveFromFavorites]
5098
+ * ```
5099
+ */
5100
+ Action["RemoveFromFavorites"] = "removeFromFavorites";
5071
5101
  /**
5072
5102
  * The edit icon on Liveboards (Classic experience).
5073
5103
  * @example
@@ -6125,6 +6155,20 @@
6125
6155
  * ```
6126
6156
  */
6127
6157
  Action["SpotterViz"] = "spotterViz";
6158
+ /**
6159
+ * The reference-mode toggle button inside the SpotterViz chat input.
6160
+ * When users enable reference mode, clicking tiles, filters, or
6161
+ * parameters adds them as chat context. Hide this action to remove
6162
+ * the reference-mode capability entirely.
6163
+ * Visible by default.
6164
+ * @version SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
6165
+ * @example
6166
+ * ```js
6167
+ * hiddenActions: [Action.SpotterVizReferenceMode]
6168
+ * disabledActions: [Action.SpotterVizReferenceMode]
6169
+ * ```
6170
+ */
6171
+ Action["SpotterVizReferenceMode"] = "spotterVizReferenceMode";
6128
6172
  /**
6129
6173
  * Clears browser cache and fetches new data for liveboard ChartViz Containers.
6130
6174
  * Requires `enableLiveboardDataCache` to be enabled.
@@ -6601,7 +6645,9 @@
6601
6645
  TableContentDensity["Compact"] = "COMPACT";
6602
6646
  })(TableContentDensity || (TableContentDensity = {}));
6603
6647
 
6604
- var version="1.49.0";
6648
+ var version$1="1.49.2";var pkg = {version:version$1};
6649
+
6650
+ const { version } = pkg;
6605
6651
 
6606
6652
  const logFunctions = {
6607
6653
  [exports.LogLevel.SILENT]: () => undefined,
@@ -6946,6 +6992,27 @@
6946
6992
  function getDOMNode(domSelector) {
6947
6993
  return typeof domSelector === 'string' ? document.querySelector(domSelector) : domSelector;
6948
6994
  }
6995
+ /**
6996
+ * Resolves a CSS selector to an element. `document.querySelector` cannot pierce
6997
+ * shadow boundaries, so when the document lookup misses and a reference node is
6998
+ * provided, this also searches the shadow root the reference node lives in —
6999
+ * letting a selector target an element inside the same shadow root as the embed
7000
+ * instead of silently falling back to the light DOM.
7001
+ * @param selector CSS selector string.
7002
+ * @param referenceNode Node whose shadow root is searched when the document lookup misses.
7003
+ */
7004
+ function querySelectorAcrossShadowRoot(selector, referenceNode) {
7005
+ var _a;
7006
+ const fromDocument = document.querySelector(selector);
7007
+ if (fromDocument) {
7008
+ return fromDocument;
7009
+ }
7010
+ const rootNode = (_a = referenceNode === null || referenceNode === void 0 ? void 0 : referenceNode.getRootNode) === null || _a === void 0 ? void 0 : _a.call(referenceNode);
7011
+ if (typeof ShadowRoot !== 'undefined' && rootNode instanceof ShadowRoot) {
7012
+ return rootNode.querySelector(selector);
7013
+ }
7014
+ return null;
7015
+ }
6949
7016
  const deepMerge = (target, source) => merge(target, source);
6950
7017
  const getOperationNameFromQuery = (query) => {
6951
7018
  const regex = /(?:query|mutation)\s+(\w+)/;
@@ -19459,8 +19526,14 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
19459
19526
  }
19460
19527
  }
19461
19528
  const channel = new MessageChannel();
19529
+ // Close the messageChannel and resolve the promise if timeout.
19530
+ const timeoutId = setTimeout(() => {
19531
+ channel.port1.close();
19532
+ res(new Error(ERROR_MESSAGE.TRIGGER_TIMED_OUT));
19533
+ }, TRIGGER_TIMEOUT);
19462
19534
  channel.port1.onmessage = ({ data: responseData }) => {
19463
19535
  var _a;
19536
+ clearTimeout(timeoutId);
19464
19537
  channel.port1.close();
19465
19538
  const error = (responseData === null || responseData === void 0 ? void 0 : responseData.error) || ((_a = responseData === null || responseData === void 0 ? void 0 : responseData.data) === null || _a === void 0 ? void 0 : _a.error);
19466
19539
  if (error) {
@@ -19470,11 +19543,6 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
19470
19543
  res(responseData);
19471
19544
  }
19472
19545
  };
19473
- // Close the messageChannel and resolve the promise if timeout.
19474
- setTimeout(() => {
19475
- channel.port1.close();
19476
- res(new Error(ERROR_MESSAGE.TRIGGER_TIMED_OUT));
19477
- }, TRIGGER_TIMEOUT);
19478
19546
  return postIframeMessage(iFrame, { type: messageType, data, context }, thoughtSpotHost, channel);
19479
19547
  });
19480
19548
  }
@@ -20239,6 +20307,14 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
20239
20307
  */
20240
20308
  const THOUGHTSPOT_PARAM_PREFIX = 'ts-';
20241
20309
  const TS_EMBED_ID = '_thoughtspot-embed';
20310
+ /**
20311
+ * dataset key used to stash a custom preRenderContainer's original inline
20312
+ * `position` while we override it to `relative`. Stored on the container (not
20313
+ * per-instance) so the override can be reverted on destroy even when multiple
20314
+ * pre-rendered embeds share the same container.
20315
+ */
20316
+ const PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY = 'tsEmbedOriginalPosition';
20317
+ const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
20242
20318
  /**
20243
20319
  * The event id map from v2 event names to v1 event id
20244
20320
  * v1 events are the classic embed events implemented in Blink v1
@@ -20274,6 +20350,8 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
20274
20350
  */
20275
20351
  this.shouldEncodeUrlQueryParams = false;
20276
20352
  this.defaultHiddenActions = [exports.Action.ReportError];
20353
+ this.preRenderContainerEl = null;
20354
+ this.containerScrollListener = null;
20277
20355
  /**
20278
20356
  * Handler for fullscreen change events
20279
20357
  */
@@ -21139,6 +21217,89 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21139
21217
  placeholder.id = id.placeHolder;
21140
21218
  return placeholder;
21141
21219
  }
21220
+ /**
21221
+ * Resolves the configured preRenderContainer to a live element, falling
21222
+ * back to `document.body`. A string selector is re-queried on every call so
21223
+ * a remounted container (E.g.: React replacing the node) resolves to the
21224
+ * fresh element; an element passed directly cannot be re-resolved.
21225
+ */
21226
+ resolvePreRenderContainerTarget() {
21227
+ var _a;
21228
+ const containerConfig = this.viewConfig.preRenderContainer;
21229
+ let container = null;
21230
+ if (typeof containerConfig === 'string') {
21231
+ try {
21232
+ // Resolve against the host's shadow root too, so a selector can
21233
+ // target a container inside the same shadow DOM as the embed —
21234
+ // document.querySelector alone cannot pierce shadow boundaries.
21235
+ container = querySelectorAcrossShadowRoot(containerConfig, this.hostElement);
21236
+ }
21237
+ catch (e) {
21238
+ logger$3.error(`Invalid CSS selector for preRenderContainer: ${containerConfig}`, e);
21239
+ }
21240
+ }
21241
+ else if (containerConfig) {
21242
+ container = containerConfig;
21243
+ }
21244
+ return (_a = container) !== null && _a !== void 0 ? _a : document.body;
21245
+ }
21246
+ /**
21247
+ * Makes the container a positioning context for the absolutely positioned
21248
+ * wrapper, stashing the original inline `position` on the element (once) so
21249
+ * destroy() can restore it exactly, leaving no trace. Recording it on the
21250
+ * element rather than per-instance lets the override be reverted even when
21251
+ * embeds share the same container.
21252
+ */
21253
+ applyPreRenderContainerPositioning(container) {
21254
+ if (container === document.body) {
21255
+ return;
21256
+ }
21257
+ const pos = window.getComputedStyle(container).position;
21258
+ if (pos === 'static') {
21259
+ if (container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY] === undefined) {
21260
+ container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY] = container.style.position;
21261
+ }
21262
+ container.style.position = 'relative';
21263
+ }
21264
+ }
21265
+ /**
21266
+ * Re-attaches the wrapper to a live container when the previously resolved
21267
+ * one has been detached or no longer holds the wrapper — e.g. the host app
21268
+ * remounted a custom preRenderContainer, which would otherwise leave a stale
21269
+ * reference and collapse the wrapper. Only string selectors can be
21270
+ * re-resolved; a container passed as an element is left untouched.
21271
+ */
21272
+ reconcilePreRenderContainer() {
21273
+ const wrapper = this.preRenderWrapper;
21274
+ const stored = this.preRenderContainerEl;
21275
+ // Nothing to reconcile until this instance resolved its container.
21276
+ if (!wrapper || !stored) {
21277
+ return;
21278
+ }
21279
+ const storedIsLive = stored === document.body || document.contains(stored);
21280
+ if (storedIsLive && stored.contains(wrapper)) {
21281
+ return;
21282
+ }
21283
+ const resolved = this.resolvePreRenderContainerTarget();
21284
+ // Re-resolution yielded the same (still stale) element — nothing we can
21285
+ // do, e.g. a detached container passed as an HTMLElement.
21286
+ if (resolved === stored && stored.contains(wrapper)) {
21287
+ return;
21288
+ }
21289
+ if (this.containerScrollListener && stored !== resolved) {
21290
+ if (stored !== document.body) {
21291
+ stored.removeEventListener('scroll', this.containerScrollListener);
21292
+ }
21293
+ if (resolved !== document.body) {
21294
+ resolved.addEventListener('scroll', this.containerScrollListener);
21295
+ }
21296
+ }
21297
+ this.applyPreRenderContainerPositioning(resolved);
21298
+ if (wrapper.parentNode !== resolved) {
21299
+ resolved.appendChild(wrapper);
21300
+ }
21301
+ this.preRenderContainerEl = resolved;
21302
+ }
21142
21303
  insertIntoDOMForPreRender(child) {
21143
21304
  const preRenderChild = this.createPreRenderChild(child);
21144
21305
  const preRenderWrapper = this.createPreRenderWrapper();
@@ -21158,7 +21319,10 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21158
21319
  else {
21159
21320
  this.hidePreRender();
21160
21321
  }
21161
- document.body.appendChild(preRenderWrapper);
21322
+ const targetContainer = this.resolvePreRenderContainerTarget();
21323
+ this.preRenderContainerEl = targetContainer;
21324
+ this.applyPreRenderContainerPositioning(targetContainer);
21325
+ targetContainer.appendChild(preRenderWrapper);
21162
21326
  }
21163
21327
  insertIntoDOM(child) {
21164
21328
  var _a;
@@ -21597,6 +21761,50 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21597
21761
  tsParams = tsParams ? `?${tsParams}` : '';
21598
21762
  return tsParams;
21599
21763
  }
21764
+ /**
21765
+ * Reverts the custom preRenderContainer's `position` to the value it had
21766
+ * before we overrode it to `relative` (see insertIntoDOMForPreRender).
21767
+ *
21768
+ * We restore the original inline value rather than forcing `static`, and we
21769
+ * skip the restore if another preRender wrapper is still mounted inside the
21770
+ * same container — a shared container still needs the positioning context.
21771
+ */
21772
+ restorePreRenderContainerPosition() {
21773
+ const container = this.preRenderContainerEl;
21774
+ if (!container || container === document.body) {
21775
+ return;
21776
+ }
21777
+ // Drop our reference up front so a destroyed embed never pins a
21778
+ // detached container in memory; restoration uses the local handle.
21779
+ this.preRenderContainerEl = null;
21780
+ const originalPosition = container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY];
21781
+ if (originalPosition === undefined) {
21782
+ // We never overrode this container's position; nothing to restore.
21783
+ return;
21784
+ }
21785
+ // This instance's own wrapper has already been removed by now, so any
21786
+ // match here belongs to another embed still sharing the container — it
21787
+ // continues to rely on the positioning context, so leave it in place.
21788
+ const hasOtherWrapper = container.querySelector(`[id^="${PRERENDER_WRAPPER_ID_PREFIX}"]`);
21789
+ if (hasOtherWrapper) {
21790
+ return;
21791
+ }
21792
+ container.style.position = originalPosition;
21793
+ delete container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY];
21794
+ }
21795
+ /**
21796
+ * Detaches and clears the container scroll listener, if one is attached.
21797
+ */
21798
+ removeContainerScrollListener() {
21799
+ if (!this.containerScrollListener) {
21800
+ return;
21801
+ }
21802
+ const customContainer = this.preRenderContainerEl && this.preRenderContainerEl !== document.body
21803
+ ? this.preRenderContainerEl
21804
+ : null;
21805
+ customContainer === null || customContainer === void 0 ? void 0 : customContainer.removeEventListener('scroll', this.containerScrollListener);
21806
+ this.containerScrollListener = null;
21807
+ }
21600
21808
  /**
21601
21809
  * Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
21602
21810
  * @version SDK: 1.19.1 | ThoughtSpot: *
@@ -21605,8 +21813,10 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21605
21813
  var _a, _b, _c;
21606
21814
  try {
21607
21815
  this.removeFullscreenChangeHandler();
21816
+ this.removeContainerScrollListener();
21608
21817
  this.unsubscribeToEvents();
21609
21818
  (_a = this.preRenderWrapper) === null || _a === void 0 ? void 0 : _a.remove();
21819
+ this.restorePreRenderContainerPosition();
21610
21820
  if (!this.isRendered) {
21611
21821
  return;
21612
21822
  }
@@ -21716,15 +21926,19 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21716
21926
  }
21717
21927
  this.hostElement.appendChild(this.insertedDomEl);
21718
21928
  this.syncPreRenderStyle();
21929
+ const customContainer = this.preRenderContainerEl && this.preRenderContainerEl !== document.body
21930
+ ? this.preRenderContainerEl
21931
+ : null;
21932
+ if (customContainer && !this.containerScrollListener) {
21933
+ this.containerScrollListener = () => this.syncPreRenderStyle();
21934
+ customContainer.addEventListener('scroll', this.containerScrollListener);
21935
+ }
21719
21936
  if (!this.viewConfig.doNotTrackPreRenderSize) {
21720
21937
  const observeTarget = (_a = this.insertedDomEl) !== null && _a !== void 0 ? _a : this.hostElement;
21721
21938
  this.resizeObserver = new ResizeObserver((entries) => {
21722
21939
  entries.forEach((entry) => {
21723
- if (entry.contentRect && entry.target === observeTarget) {
21724
- setStyleProperties(this.preRenderWrapper, {
21725
- width: `${entry.contentRect.width}px`,
21726
- height: `${entry.contentRect.height}px`,
21727
- });
21940
+ if (entry.target === observeTarget) {
21941
+ this.syncPreRenderStyle();
21728
21942
  }
21729
21943
  });
21730
21944
  });
@@ -21756,14 +21970,24 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21756
21970
  * is not defined or not found.
21757
21971
  */
21758
21972
  syncPreRenderStyle() {
21973
+ var _a;
21759
21974
  if (!this.isPreRenderConnected() || !this.getPreRenderPlaceHolderElement()) {
21760
21975
  logger$3.error(ERROR_MESSAGE.SYNC_STYLE_CALLED_BEFORE_RENDER);
21761
21976
  return;
21762
21977
  }
21978
+ // Self-heal if the resolved container was remounted/detached, so we
21979
+ // never measure a stale node (which would collapse the wrapper).
21980
+ this.reconcilePreRenderContainer();
21763
21981
  const elBoundingClient = this.getPreRenderPlaceHolderElement().getBoundingClientRect();
21982
+ const containerEl = this.preRenderContainerEl && this.preRenderContainerEl !== document.body
21983
+ ? this.preRenderContainerEl
21984
+ : null;
21985
+ const containerRect = (_a = containerEl === null || containerEl === void 0 ? void 0 : containerEl.getBoundingClientRect()) !== null && _a !== void 0 ? _a : { x: 0, y: 0 };
21986
+ const scrollX = containerEl ? containerEl.scrollLeft : window.scrollX;
21987
+ const scrollY = containerEl ? containerEl.scrollTop : window.scrollY;
21764
21988
  setStyleProperties(this.preRenderWrapper, {
21765
- top: `${elBoundingClient.y + window.scrollY}px`,
21766
- left: `${elBoundingClient.x + window.scrollX}px`,
21989
+ top: `${elBoundingClient.y - containerRect.y + scrollY}px`,
21990
+ left: `${elBoundingClient.x - containerRect.x + scrollX}px`,
21767
21991
  width: `${elBoundingClient.width}px`,
21768
21992
  height: `${elBoundingClient.height}px`,
21769
21993
  position: 'absolute',
@@ -21790,6 +22014,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21790
22014
  overflow: 'hidden',
21791
22015
  };
21792
22016
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
22017
+ this.removeContainerScrollListener();
21793
22018
  if (this.resizeObserver) {
21794
22019
  this.resizeObserver.disconnect();
21795
22020
  }
@@ -21808,7 +22033,7 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
21808
22033
  */
21809
22034
  getPreRenderIds() {
21810
22035
  return {
21811
- wrapper: `tsEmbed-pre-render-wrapper-${this.viewConfig.preRenderId}`,
22036
+ wrapper: `${PRERENDER_WRAPPER_ID_PREFIX}${this.viewConfig.preRenderId}`,
21812
22037
  child: `tsEmbed-pre-render-child-${this.viewConfig.preRenderId}`,
21813
22038
  placeHolder: `tsEmbed-pre-render-placeholder-${this.viewConfig.preRenderId}`,
21814
22039
  };
@@ -22517,12 +22742,15 @@ mutation GetUnsavedAnswerTML($session: BachSessionIdInput!, $exportDependencies:
22517
22742
  }
22518
22743
  // Handle spotterChatConfig params
22519
22744
  if (spotterChatConfig) {
22520
- const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, } = spotterChatConfig;
22745
+ const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, } = spotterChatConfig;
22521
22746
  setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
22522
22747
  setParamIfDefined(params, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
22523
22748
  if (spotterFileUploadEnabled !== undefined) {
22524
22749
  params[Param.SpotterFileUploadEnabled] = spotterFileUploadEnabled;
22525
22750
  }
22751
+ if (enableStarterPrompts !== undefined) {
22752
+ params[Param.IsStarterPromptsEnabled] = enableStarterPrompts;
22753
+ }
22526
22754
  if (spotterFileUploadFileTypes !== undefined) {
22527
22755
  params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
22528
22756
  }
@@ -23078,12 +23306,15 @@ query GetEurekaVizSnapshots(
23078
23306
  }
23079
23307
  // Handle spotterChatConfig params
23080
23308
  if (spotterChatConfig) {
23081
- const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, } = spotterChatConfig;
23309
+ const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, } = spotterChatConfig;
23082
23310
  setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
23083
23311
  setParamIfDefined(params, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
23084
23312
  if (spotterFileUploadEnabled !== undefined) {
23085
23313
  params[Param.SpotterFileUploadEnabled] = spotterFileUploadEnabled;
23086
23314
  }
23315
+ if (enableStarterPrompts !== undefined) {
23316
+ params[Param.IsStarterPromptsEnabled] = enableStarterPrompts;
23317
+ }
23087
23318
  if (spotterFileUploadFileTypes !== undefined) {
23088
23319
  params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
23089
23320
  }
@@ -23920,10 +24151,11 @@ query SendMessage($params: Input_convassist_SendMessageRequest) {
23920
24151
  setParamIfDefined(queryParams, Param.EnableStopAnswerGenerationEmbed, enableStopAnswerGenerationEmbed, true);
23921
24152
  // Handle spotterChatConfig params
23922
24153
  if (spotterChatConfig) {
23923
- const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, } = spotterChatConfig;
24154
+ const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, } = spotterChatConfig;
23924
24155
  setParamIfDefined(queryParams, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
23925
24156
  setParamIfDefined(queryParams, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
23926
24157
  setParamIfDefined(queryParams, Param.SpotterFileUploadEnabled, spotterFileUploadEnabled, true);
24158
+ setParamIfDefined(queryParams, Param.IsStarterPromptsEnabled, enableStarterPrompts, true);
23927
24159
  if (spotterFileUploadFileTypes !== undefined) {
23928
24160
  queryParams[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
23929
24161
  }