@thoughtspot/visual-embed-sdk 1.49.1 → 1.49.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/cjs/package.json +4 -10
  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 +7 -1
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +4 -1
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +97 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +8 -0
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +2 -1
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +12 -0
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/events.spec.js +5 -0
  17. package/cjs/src/embed/events.spec.js.map +1 -1
  18. package/cjs/src/embed/liveboard.d.ts +6 -0
  19. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  20. package/cjs/src/embed/liveboard.js +4 -1
  21. package/cjs/src/embed/liveboard.js.map +1 -1
  22. package/cjs/src/embed/liveboard.spec.js +11 -0
  23. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  24. package/cjs/src/embed/spotter-viz-utils.d.ts +29 -0
  25. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  26. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  27. package/cjs/src/embed/ts-embed.d.ts +38 -0
  28. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  29. package/cjs/src/embed/ts-embed.js +166 -9
  30. package/cjs/src/embed/ts-embed.js.map +1 -1
  31. package/cjs/src/embed/ts-embed.spec.js +237 -0
  32. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  33. package/cjs/src/index.d.ts +2 -2
  34. package/cjs/src/index.d.ts.map +1 -1
  35. package/cjs/src/index.js.map +1 -1
  36. package/cjs/src/types.d.ts +87 -4
  37. package/cjs/src/types.d.ts.map +1 -1
  38. package/cjs/src/types.js +47 -3
  39. package/cjs/src/types.js.map +1 -1
  40. package/cjs/src/utils/graphql/answerService/answerService.spec.js +15 -0
  41. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  42. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  43. package/cjs/src/utils/processTrigger.js +6 -5
  44. package/cjs/src/utils/processTrigger.js.map +1 -1
  45. package/cjs/src/utils/processTrigger.spec.js +13 -0
  46. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  47. package/cjs/src/utils.d.ts +10 -0
  48. package/cjs/src/utils.d.ts.map +1 -1
  49. package/cjs/src/utils.js +25 -4
  50. package/cjs/src/utils.js.map +1 -1
  51. package/cjs/src/utils.spec.js +48 -0
  52. package/cjs/src/utils.spec.js.map +1 -1
  53. package/dist/{index-B6Rn561t.js → index-DsSQndIB.js} +303 -187
  54. package/dist/src/css-variables.d.ts +17 -0
  55. package/dist/src/css-variables.d.ts.map +1 -1
  56. package/dist/src/embed/app.d.ts +7 -1
  57. package/dist/src/embed/app.d.ts.map +1 -1
  58. package/dist/src/embed/conversation.d.ts +8 -0
  59. package/dist/src/embed/conversation.d.ts.map +1 -1
  60. package/dist/src/embed/liveboard.d.ts +6 -0
  61. package/dist/src/embed/liveboard.d.ts.map +1 -1
  62. package/dist/src/embed/spotter-viz-utils.d.ts +29 -0
  63. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  64. package/dist/src/embed/ts-embed.d.ts +38 -0
  65. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  66. package/dist/src/index.d.ts +2 -2
  67. package/dist/src/index.d.ts.map +1 -1
  68. package/dist/src/types.d.ts +87 -4
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  71. package/dist/src/utils.d.ts +10 -0
  72. package/dist/src/utils.d.ts.map +1 -1
  73. package/dist/tsembed-react.es.js +282 -35
  74. package/dist/tsembed-react.js +583 -220
  75. package/dist/tsembed.es.js +282 -35
  76. package/dist/tsembed.js +583 -220
  77. package/dist/visual-embed-sdk-react-full.d.ts +190 -4
  78. package/dist/visual-embed-sdk-react.d.ts +190 -4
  79. package/dist/visual-embed-sdk.d.ts +190 -4
  80. package/lib/package.json +4 -10
  81. package/lib/src/css-variables.d.ts +17 -0
  82. package/lib/src/css-variables.d.ts.map +1 -1
  83. package/lib/src/embed/app.d.ts +7 -1
  84. package/lib/src/embed/app.d.ts.map +1 -1
  85. package/lib/src/embed/app.js +4 -1
  86. package/lib/src/embed/app.js.map +1 -1
  87. package/lib/src/embed/app.spec.js +97 -0
  88. package/lib/src/embed/app.spec.js.map +1 -1
  89. package/lib/src/embed/conversation.d.ts +8 -0
  90. package/lib/src/embed/conversation.d.ts.map +1 -1
  91. package/lib/src/embed/conversation.js +2 -1
  92. package/lib/src/embed/conversation.js.map +1 -1
  93. package/lib/src/embed/conversation.spec.js +12 -0
  94. package/lib/src/embed/conversation.spec.js.map +1 -1
  95. package/lib/src/embed/events.spec.js +5 -0
  96. package/lib/src/embed/events.spec.js.map +1 -1
  97. package/lib/src/embed/liveboard.d.ts +6 -0
  98. package/lib/src/embed/liveboard.d.ts.map +1 -1
  99. package/lib/src/embed/liveboard.js +4 -1
  100. package/lib/src/embed/liveboard.js.map +1 -1
  101. package/lib/src/embed/liveboard.spec.js +11 -0
  102. package/lib/src/embed/liveboard.spec.js.map +1 -1
  103. package/lib/src/embed/spotter-viz-utils.d.ts +29 -0
  104. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  105. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  106. package/lib/src/embed/ts-embed.d.ts +38 -0
  107. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  108. package/lib/src/embed/ts-embed.js +167 -10
  109. package/lib/src/embed/ts-embed.js.map +1 -1
  110. package/lib/src/embed/ts-embed.spec.js +237 -0
  111. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  112. package/lib/src/index.d.ts +2 -2
  113. package/lib/src/index.d.ts.map +1 -1
  114. package/lib/src/index.js.map +1 -1
  115. package/lib/src/types.d.ts +87 -4
  116. package/lib/src/types.d.ts.map +1 -1
  117. package/lib/src/types.js +47 -3
  118. package/lib/src/types.js.map +1 -1
  119. package/lib/src/utils/graphql/answerService/answerService.spec.js +15 -0
  120. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  121. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  122. package/lib/src/utils/processTrigger.js +6 -5
  123. package/lib/src/utils/processTrigger.js.map +1 -1
  124. package/lib/src/utils/processTrigger.spec.js +13 -0
  125. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  126. package/lib/src/utils.d.ts +10 -0
  127. package/lib/src/utils.d.ts.map +1 -1
  128. package/lib/src/utils.js +22 -1
  129. package/lib/src/utils.js.map +1 -1
  130. package/lib/src/utils.spec.js +49 -1
  131. package/lib/src/utils.spec.js.map +1 -1
  132. package/lib/src/visual-embed-sdk.d.ts +190 -4
  133. package/package.json +4 -10
  134. package/src/css-variables.ts +20 -0
  135. package/src/embed/app.spec.ts +109 -0
  136. package/src/embed/app.ts +11 -1
  137. package/src/embed/conversation.spec.ts +17 -0
  138. package/src/embed/conversation.ts +10 -0
  139. package/src/embed/events.spec.ts +7 -0
  140. package/src/embed/liveboard.spec.ts +15 -0
  141. package/src/embed/liveboard.ts +10 -0
  142. package/src/embed/spotter-viz-utils.ts +30 -0
  143. package/src/embed/ts-embed.spec.ts +294 -0
  144. package/src/embed/ts-embed.ts +180 -9
  145. package/src/index.ts +2 -1
  146. package/src/types.ts +86 -3
  147. package/src/utils/graphql/answerService/answerService.spec.ts +18 -0
  148. package/src/utils/processTrigger.spec.ts +23 -0
  149. package/src/utils/processTrigger.ts +8 -6
  150. package/src/utils.spec.ts +63 -0
  151. package/src/utils.ts +25 -1
@@ -1,4 +1,4 @@
1
- /* @thoughtspot/visual-embed-sdk version 1.49.1 */
1
+ /* @thoughtspot/visual-embed-sdk version 1.49.3 */
2
2
  'use client';
3
3
  import * as React from 'react';
4
4
  import React__default, { useRef, useCallback } from 'react';
@@ -141,28 +141,45 @@ const isObject$1 = (obj) => {
141
141
  }
142
142
  return false;
143
143
  };
144
- const merge = (...objects) => objects.reduce((result, current) => {
144
+ const UNSAFE_KEYS = new Set([
145
+ "__proto__",
146
+ "constructor",
147
+ "prototype",
148
+ "toString",
149
+ "valueOf",
150
+ "hasOwnProperty",
151
+ "isPrototypeOf",
152
+ "propertyIsEnumerable",
153
+ "toLocaleString",
154
+ ]);
155
+ const merge$1 = (...objects) => objects.reduce((result, current) => {
156
+ if (current === undefined) {
157
+ return result;
158
+ }
145
159
  if (Array.isArray(current)) {
146
160
  throw new TypeError("Arguments provided to ts-deepmerge must be objects, not arrays.");
147
161
  }
148
162
  Object.keys(current).forEach((key) => {
149
- if (["__proto__", "constructor", "prototype"].includes(key)) {
163
+ if (UNSAFE_KEYS.has(key)) {
150
164
  return;
151
165
  }
152
166
  if (Array.isArray(result[key]) && Array.isArray(current[key])) {
153
- result[key] = merge.options.mergeArrays
154
- ? merge.options.uniqueArrayItems
167
+ result[key] = merge$1.options.mergeArrays
168
+ ? merge$1.options.uniqueArrayItems
155
169
  ? Array.from(new Set(result[key].concat(current[key])))
156
170
  : [...result[key], ...current[key]]
157
171
  : current[key];
158
172
  }
159
173
  else if (isObject$1(result[key]) && isObject$1(current[key])) {
160
- result[key] = merge(result[key], current[key]);
174
+ result[key] = merge$1(result[key], current[key]);
175
+ }
176
+ else if (!isObject$1(result[key]) && isObject$1(current[key])) {
177
+ result[key] = merge$1(current[key], undefined);
161
178
  }
162
179
  else {
163
180
  result[key] =
164
181
  current[key] === undefined
165
- ? merge.options.allowUndefinedOverrides
182
+ ? merge$1.options.allowUndefinedOverrides
166
183
  ? current[key]
167
184
  : result[key]
168
185
  : current[key];
@@ -175,11 +192,11 @@ const defaultOptions = {
175
192
  mergeArrays: true,
176
193
  uniqueArrayItems: true,
177
194
  };
178
- merge.options = defaultOptions;
179
- merge.withOptions = (options, ...objects) => {
180
- merge.options = Object.assign(Object.assign({}, defaultOptions), options);
181
- const result = merge(...objects);
182
- merge.options = defaultOptions;
195
+ merge$1.options = defaultOptions;
196
+ merge$1.withOptions = (options, ...objects) => {
197
+ merge$1.options = Object.assign(Object.assign({}, defaultOptions), options);
198
+ const result = merge$1(...objects);
199
+ merge$1.options = defaultOptions;
183
200
  return result;
184
201
  };
185
202
 
@@ -2411,11 +2428,30 @@ var HostEvent;
2411
2428
  /**
2412
2429
  * Navigate to a specific page in the embedded ThoughtSpot application.
2413
2430
  * This is the same as calling `appEmbed.navigateToPage(path, true)`.
2414
- * @param - `path` - the path to navigate to go forward or back. The path value can
2415
- * be a number; for example, `1`, `-1`.
2431
+ *
2432
+ * Accepts either a plain value or an object with `path`
2433
+ * and an optional `replace` flag.
2434
+ *
2435
+ * @param data - A string path, a numeric history delta, or an object
2436
+ * `{ path: string | number, replace?: boolean }`.
2437
+ * - `path` — the route to navigate to, or a history delta such as `1`
2438
+ * or `-1` (calls `window.history.go()`).
2439
+ * - `replace` — when `true`, replaces the current history entry instead
2440
+ * of pushing a new one (uses `window.location.replace`).
2441
+ *
2416
2442
  * @example
2417
2443
  * ```js
2418
- * appEmbed.navigateToPage(-1)
2444
+ * // Preferred: use navigateToPage directly
2445
+ * appEmbed.navigateToPage(-1);
2446
+ *
2447
+ * // Numeric delta — go back one step
2448
+ * appEmbed.trigger(HostEvent.Navigate, -1);
2449
+ *
2450
+ * // String path — push a new history entry
2451
+ * appEmbed.trigger(HostEvent.Navigate, 'home');
2452
+ *
2453
+ * // Object format — replace current history entry
2454
+ * appEmbed.trigger(HostEvent.Navigate, { path: 'home', replace: true }); // SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
2419
2455
  * ```
2420
2456
  * @version SDK: 1.12.0 | ThoughtSpot: 8.4.0.cl, 8.4.1.sw
2421
2457
  */
@@ -4404,6 +4440,7 @@ var Param;
4404
4440
  Param["EnableLiveboardDataCache"] = "enableLiveboardDataCache";
4405
4441
  Param["SpotterFileUploadEnabled"] = "spotterFileUploadEnabled";
4406
4442
  Param["SpotterFileUploadFileTypes"] = "spotterFileUploadFileTypes";
4443
+ Param["IsStarterPromptsEnabled"] = "enableStarterPrompts";
4407
4444
  })(Param || (Param = {}));
4408
4445
  /**
4409
4446
  * ThoughtSpot application pages include actions and menu commands
@@ -5046,6 +5083,16 @@ var Action;
5046
5083
  * @version SDK: 1.9.0 | ThoughtSpot: 8.1.0.cl, 8.4.1.sw
5047
5084
  */
5048
5085
  Action["AddToFavorites"] = "addToFavorites";
5086
+ /**
5087
+ * Remove from Favorites option in home page v3 sidebar.
5088
+ * Allows removing an object from the user's favorites list from home-page v3 sidebar.
5089
+ * @version SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
5090
+ * @example
5091
+ * ```js
5092
+ * disabledActions: [Action.RemoveFromFavorites]
5093
+ * ```
5094
+ */
5095
+ Action["RemoveFromFavorites"] = "removeFromFavorites";
5049
5096
  /**
5050
5097
  * The edit icon on Liveboards (Classic experience).
5051
5098
  * @example
@@ -6103,6 +6150,20 @@ var Action;
6103
6150
  * ```
6104
6151
  */
6105
6152
  Action["SpotterViz"] = "spotterViz";
6153
+ /**
6154
+ * The reference-mode toggle button inside the SpotterViz chat input.
6155
+ * When users enable reference mode, clicking tiles, filters, or
6156
+ * parameters adds them as chat context. Hide this action to remove
6157
+ * the reference-mode capability entirely.
6158
+ * Visible by default.
6159
+ * @version SDK: 1.51.0 | ThoughtSpot Cloud: 26.8.0.cl
6160
+ * @example
6161
+ * ```js
6162
+ * hiddenActions: [Action.SpotterVizReferenceMode]
6163
+ * disabledActions: [Action.SpotterVizReferenceMode]
6164
+ * ```
6165
+ */
6166
+ Action["SpotterVizReferenceMode"] = "spotterVizReferenceMode";
6106
6167
  /**
6107
6168
  * Clears browser cache and fetches new data for liveboard ChartViz Containers.
6108
6169
  * Requires `enableLiveboardDataCache` to be enabled.
@@ -6579,7 +6640,7 @@ var TableContentDensity;
6579
6640
  TableContentDensity["Compact"] = "COMPACT";
6580
6641
  })(TableContentDensity || (TableContentDensity = {}));
6581
6642
 
6582
- var version$1="1.49.1";var pkg = {version:version$1};
6643
+ var version$1="1.49.3";var pkg = {version:version$1};
6583
6644
 
6584
6645
  const { version } = pkg;
6585
6646
 
@@ -6926,7 +6987,28 @@ const getRuntimeFilters = (runtimefilters) => getFilterQuery(runtimefilters || [
6926
6987
  function getDOMNode(domSelector) {
6927
6988
  return typeof domSelector === 'string' ? document.querySelector(domSelector) : domSelector;
6928
6989
  }
6929
- const deepMerge = (target, source) => merge(target, source);
6990
+ /**
6991
+ * Resolves a CSS selector to an element. `document.querySelector` cannot pierce
6992
+ * shadow boundaries, so when the document lookup misses and a reference node is
6993
+ * provided, this also searches the shadow root the reference node lives in —
6994
+ * letting a selector target an element inside the same shadow root as the embed
6995
+ * instead of silently falling back to the light DOM.
6996
+ * @param selector CSS selector string.
6997
+ * @param referenceNode Node whose shadow root is searched when the document lookup misses.
6998
+ */
6999
+ function querySelectorAcrossShadowRoot(selector, referenceNode) {
7000
+ var _a;
7001
+ const fromDocument = document.querySelector(selector);
7002
+ if (fromDocument) {
7003
+ return fromDocument;
7004
+ }
7005
+ const rootNode = (_a = referenceNode === null || referenceNode === void 0 ? void 0 : referenceNode.getRootNode) === null || _a === void 0 ? void 0 : _a.call(referenceNode);
7006
+ if (typeof ShadowRoot !== 'undefined' && rootNode instanceof ShadowRoot) {
7007
+ return rootNode.querySelector(selector);
7008
+ }
7009
+ return null;
7010
+ }
7011
+ const deepMerge = (target, source) => merge$1(target, source);
6930
7012
  const getOperationNameFromQuery = (query) => {
6931
7013
  const regex = /(?:query|mutation)\s+(\w+)/;
6932
7014
  const matches = query.match(regex);
@@ -9128,7 +9210,7 @@ class AnswerService {
9128
9210
  async getTML() {
9129
9211
  const { object } = await this.executeQuery(getAnswerTML, {});
9130
9212
  const edoc = object[0].edoc;
9131
- const YAML = await import('./index-B6Rn561t.js');
9213
+ const YAML = await import('./index-DsSQndIB.js');
9132
9214
  const parsedDoc = YAML.parse(edoc);
9133
9215
  return {
9134
9216
  answer: {
@@ -19439,8 +19521,14 @@ function processTrigger(iFrame, messageType, thoughtSpotHost, data, context) {
19439
19521
  }
19440
19522
  }
19441
19523
  const channel = new MessageChannel();
19524
+ // Close the messageChannel and resolve the promise if timeout.
19525
+ const timeoutId = setTimeout(() => {
19526
+ channel.port1.close();
19527
+ res(new Error(ERROR_MESSAGE.TRIGGER_TIMED_OUT));
19528
+ }, TRIGGER_TIMEOUT);
19442
19529
  channel.port1.onmessage = ({ data: responseData }) => {
19443
19530
  var _a;
19531
+ clearTimeout(timeoutId);
19444
19532
  channel.port1.close();
19445
19533
  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);
19446
19534
  if (error) {
@@ -19450,11 +19538,6 @@ function processTrigger(iFrame, messageType, thoughtSpotHost, data, context) {
19450
19538
  res(responseData);
19451
19539
  }
19452
19540
  };
19453
- // Close the messageChannel and resolve the promise if timeout.
19454
- setTimeout(() => {
19455
- channel.port1.close();
19456
- res(new Error(ERROR_MESSAGE.TRIGGER_TIMED_OUT));
19457
- }, TRIGGER_TIMEOUT);
19458
19541
  return postIframeMessage(iFrame, { type: messageType, data, context }, thoughtSpotHost, channel);
19459
19542
  });
19460
19543
  }
@@ -20219,6 +20302,14 @@ const processLegacyInterceptResponse = (payload) => {
20219
20302
  */
20220
20303
  const THOUGHTSPOT_PARAM_PREFIX = 'ts-';
20221
20304
  const TS_EMBED_ID = '_thoughtspot-embed';
20305
+ /**
20306
+ * dataset key used to stash a custom preRenderContainer's original inline
20307
+ * `position` while we override it to `relative`. Stored on the container (not
20308
+ * per-instance) so the override can be reverted on destroy even when multiple
20309
+ * pre-rendered embeds share the same container.
20310
+ */
20311
+ const PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY = 'tsEmbedOriginalPosition';
20312
+ const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
20222
20313
  /**
20223
20314
  * The event id map from v2 event names to v1 event id
20224
20315
  * v1 events are the classic embed events implemented in Blink v1
@@ -20254,6 +20345,8 @@ class TsEmbed {
20254
20345
  */
20255
20346
  this.shouldEncodeUrlQueryParams = false;
20256
20347
  this.defaultHiddenActions = [Action.ReportError];
20348
+ this.preRenderContainerEl = null;
20349
+ this.containerScrollListener = null;
20257
20350
  /**
20258
20351
  * Handler for fullscreen change events
20259
20352
  */
@@ -21119,6 +21212,89 @@ class TsEmbed {
21119
21212
  placeholder.id = id.placeHolder;
21120
21213
  return placeholder;
21121
21214
  }
21215
+ /**
21216
+ * Resolves the configured preRenderContainer to a live element, falling
21217
+ * back to `document.body`. A string selector is re-queried on every call so
21218
+ * a remounted container (E.g.: React replacing the node) resolves to the
21219
+ * fresh element; an element passed directly cannot be re-resolved.
21220
+ */
21221
+ resolvePreRenderContainerTarget() {
21222
+ var _a;
21223
+ const containerConfig = this.viewConfig.preRenderContainer;
21224
+ let container = null;
21225
+ if (typeof containerConfig === 'string') {
21226
+ try {
21227
+ // Resolve against the host's shadow root too, so a selector can
21228
+ // target a container inside the same shadow DOM as the embed —
21229
+ // document.querySelector alone cannot pierce shadow boundaries.
21230
+ container = querySelectorAcrossShadowRoot(containerConfig, this.hostElement);
21231
+ }
21232
+ catch (e) {
21233
+ logger$3.error(`Invalid CSS selector for preRenderContainer: ${containerConfig}`, e);
21234
+ }
21235
+ }
21236
+ else if (containerConfig) {
21237
+ container = containerConfig;
21238
+ }
21239
+ return (_a = container) !== null && _a !== void 0 ? _a : document.body;
21240
+ }
21241
+ /**
21242
+ * Makes the container a positioning context for the absolutely positioned
21243
+ * wrapper, stashing the original inline `position` on the element (once) so
21244
+ * destroy() can restore it exactly, leaving no trace. Recording it on the
21245
+ * element rather than per-instance lets the override be reverted even when
21246
+ * embeds share the same container.
21247
+ */
21248
+ applyPreRenderContainerPositioning(container) {
21249
+ if (container === document.body) {
21250
+ return;
21251
+ }
21252
+ const pos = window.getComputedStyle(container).position;
21253
+ if (pos === 'static') {
21254
+ if (container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY] === undefined) {
21255
+ container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY] = container.style.position;
21256
+ }
21257
+ container.style.position = 'relative';
21258
+ }
21259
+ }
21260
+ /**
21261
+ * Re-attaches the wrapper to a live container when the previously resolved
21262
+ * one has been detached or no longer holds the wrapper — e.g. the host app
21263
+ * remounted a custom preRenderContainer, which would otherwise leave a stale
21264
+ * reference and collapse the wrapper. Only string selectors can be
21265
+ * re-resolved; a container passed as an element is left untouched.
21266
+ */
21267
+ reconcilePreRenderContainer() {
21268
+ const wrapper = this.preRenderWrapper;
21269
+ const stored = this.preRenderContainerEl;
21270
+ // Nothing to reconcile until this instance resolved its container.
21271
+ if (!wrapper || !stored) {
21272
+ return;
21273
+ }
21274
+ const storedIsLive = stored === document.body || document.contains(stored);
21275
+ if (storedIsLive && stored.contains(wrapper)) {
21276
+ return;
21277
+ }
21278
+ const resolved = this.resolvePreRenderContainerTarget();
21279
+ // Re-resolution yielded the same (still stale) element — nothing we can
21280
+ // do, e.g. a detached container passed as an HTMLElement.
21281
+ if (resolved === stored && stored.contains(wrapper)) {
21282
+ return;
21283
+ }
21284
+ if (this.containerScrollListener && stored !== resolved) {
21285
+ if (stored !== document.body) {
21286
+ stored.removeEventListener('scroll', this.containerScrollListener);
21287
+ }
21288
+ if (resolved !== document.body) {
21289
+ resolved.addEventListener('scroll', this.containerScrollListener);
21290
+ }
21291
+ }
21292
+ this.applyPreRenderContainerPositioning(resolved);
21293
+ if (wrapper.parentNode !== resolved) {
21294
+ resolved.appendChild(wrapper);
21295
+ }
21296
+ this.preRenderContainerEl = resolved;
21297
+ }
21122
21298
  insertIntoDOMForPreRender(child) {
21123
21299
  const preRenderChild = this.createPreRenderChild(child);
21124
21300
  const preRenderWrapper = this.createPreRenderWrapper();
@@ -21138,7 +21314,10 @@ class TsEmbed {
21138
21314
  else {
21139
21315
  this.hidePreRender();
21140
21316
  }
21141
- document.body.appendChild(preRenderWrapper);
21317
+ const targetContainer = this.resolvePreRenderContainerTarget();
21318
+ this.preRenderContainerEl = targetContainer;
21319
+ this.applyPreRenderContainerPositioning(targetContainer);
21320
+ targetContainer.appendChild(preRenderWrapper);
21142
21321
  }
21143
21322
  insertIntoDOM(child) {
21144
21323
  var _a;
@@ -21577,6 +21756,50 @@ class TsEmbed {
21577
21756
  tsParams = tsParams ? `?${tsParams}` : '';
21578
21757
  return tsParams;
21579
21758
  }
21759
+ /**
21760
+ * Reverts the custom preRenderContainer's `position` to the value it had
21761
+ * before we overrode it to `relative` (see insertIntoDOMForPreRender).
21762
+ *
21763
+ * We restore the original inline value rather than forcing `static`, and we
21764
+ * skip the restore if another preRender wrapper is still mounted inside the
21765
+ * same container — a shared container still needs the positioning context.
21766
+ */
21767
+ restorePreRenderContainerPosition() {
21768
+ const container = this.preRenderContainerEl;
21769
+ if (!container || container === document.body) {
21770
+ return;
21771
+ }
21772
+ // Drop our reference up front so a destroyed embed never pins a
21773
+ // detached container in memory; restoration uses the local handle.
21774
+ this.preRenderContainerEl = null;
21775
+ const originalPosition = container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY];
21776
+ if (originalPosition === undefined) {
21777
+ // We never overrode this container's position; nothing to restore.
21778
+ return;
21779
+ }
21780
+ // This instance's own wrapper has already been removed by now, so any
21781
+ // match here belongs to another embed still sharing the container — it
21782
+ // continues to rely on the positioning context, so leave it in place.
21783
+ const hasOtherWrapper = container.querySelector(`[id^="${PRERENDER_WRAPPER_ID_PREFIX}"]`);
21784
+ if (hasOtherWrapper) {
21785
+ return;
21786
+ }
21787
+ container.style.position = originalPosition;
21788
+ delete container.dataset[PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY];
21789
+ }
21790
+ /**
21791
+ * Detaches and clears the container scroll listener, if one is attached.
21792
+ */
21793
+ removeContainerScrollListener() {
21794
+ if (!this.containerScrollListener) {
21795
+ return;
21796
+ }
21797
+ const customContainer = this.preRenderContainerEl && this.preRenderContainerEl !== document.body
21798
+ ? this.preRenderContainerEl
21799
+ : null;
21800
+ customContainer === null || customContainer === void 0 ? void 0 : customContainer.removeEventListener('scroll', this.containerScrollListener);
21801
+ this.containerScrollListener = null;
21802
+ }
21580
21803
  /**
21581
21804
  * Destroys the ThoughtSpot embed, and remove any nodes from the DOM.
21582
21805
  * @version SDK: 1.19.1 | ThoughtSpot: *
@@ -21585,8 +21808,10 @@ class TsEmbed {
21585
21808
  var _a, _b, _c;
21586
21809
  try {
21587
21810
  this.removeFullscreenChangeHandler();
21811
+ this.removeContainerScrollListener();
21588
21812
  this.unsubscribeToEvents();
21589
21813
  (_a = this.preRenderWrapper) === null || _a === void 0 ? void 0 : _a.remove();
21814
+ this.restorePreRenderContainerPosition();
21590
21815
  if (!this.isRendered) {
21591
21816
  return;
21592
21817
  }
@@ -21696,15 +21921,19 @@ class TsEmbed {
21696
21921
  }
21697
21922
  this.hostElement.appendChild(this.insertedDomEl);
21698
21923
  this.syncPreRenderStyle();
21924
+ const customContainer = this.preRenderContainerEl && this.preRenderContainerEl !== document.body
21925
+ ? this.preRenderContainerEl
21926
+ : null;
21927
+ if (customContainer && !this.containerScrollListener) {
21928
+ this.containerScrollListener = () => this.syncPreRenderStyle();
21929
+ customContainer.addEventListener('scroll', this.containerScrollListener);
21930
+ }
21699
21931
  if (!this.viewConfig.doNotTrackPreRenderSize) {
21700
21932
  const observeTarget = (_a = this.insertedDomEl) !== null && _a !== void 0 ? _a : this.hostElement;
21701
21933
  this.resizeObserver = new ResizeObserver((entries) => {
21702
21934
  entries.forEach((entry) => {
21703
- if (entry.contentRect && entry.target === observeTarget) {
21704
- setStyleProperties(this.preRenderWrapper, {
21705
- width: `${entry.contentRect.width}px`,
21706
- height: `${entry.contentRect.height}px`,
21707
- });
21935
+ if (entry.target === observeTarget) {
21936
+ this.syncPreRenderStyle();
21708
21937
  }
21709
21938
  });
21710
21939
  });
@@ -21736,14 +21965,24 @@ class TsEmbed {
21736
21965
  * is not defined or not found.
21737
21966
  */
21738
21967
  syncPreRenderStyle() {
21968
+ var _a;
21739
21969
  if (!this.isPreRenderConnected() || !this.getPreRenderPlaceHolderElement()) {
21740
21970
  logger$3.error(ERROR_MESSAGE.SYNC_STYLE_CALLED_BEFORE_RENDER);
21741
21971
  return;
21742
21972
  }
21973
+ // Self-heal if the resolved container was remounted/detached, so we
21974
+ // never measure a stale node (which would collapse the wrapper).
21975
+ this.reconcilePreRenderContainer();
21743
21976
  const elBoundingClient = this.getPreRenderPlaceHolderElement().getBoundingClientRect();
21977
+ const containerEl = this.preRenderContainerEl && this.preRenderContainerEl !== document.body
21978
+ ? this.preRenderContainerEl
21979
+ : null;
21980
+ const containerRect = (_a = containerEl === null || containerEl === void 0 ? void 0 : containerEl.getBoundingClientRect()) !== null && _a !== void 0 ? _a : { x: 0, y: 0 };
21981
+ const scrollX = containerEl ? containerEl.scrollLeft : window.scrollX;
21982
+ const scrollY = containerEl ? containerEl.scrollTop : window.scrollY;
21744
21983
  setStyleProperties(this.preRenderWrapper, {
21745
- top: `${elBoundingClient.y + window.scrollY}px`,
21746
- left: `${elBoundingClient.x + window.scrollX}px`,
21984
+ top: `${elBoundingClient.y - containerRect.y + scrollY}px`,
21985
+ left: `${elBoundingClient.x - containerRect.x + scrollX}px`,
21747
21986
  width: `${elBoundingClient.width}px`,
21748
21987
  height: `${elBoundingClient.height}px`,
21749
21988
  position: 'absolute',
@@ -21770,6 +22009,7 @@ class TsEmbed {
21770
22009
  overflow: 'hidden',
21771
22010
  };
21772
22011
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
22012
+ this.removeContainerScrollListener();
21773
22013
  if (this.resizeObserver) {
21774
22014
  this.resizeObserver.disconnect();
21775
22015
  }
@@ -21788,7 +22028,7 @@ class TsEmbed {
21788
22028
  */
21789
22029
  getPreRenderIds() {
21790
22030
  return {
21791
- wrapper: `tsEmbed-pre-render-wrapper-${this.viewConfig.preRenderId}`,
22031
+ wrapper: `${PRERENDER_WRAPPER_ID_PREFIX}${this.viewConfig.preRenderId}`,
21792
22032
  child: `tsEmbed-pre-render-child-${this.viewConfig.preRenderId}`,
21793
22033
  placeHolder: `tsEmbed-pre-render-placeholder-${this.viewConfig.preRenderId}`,
21794
22034
  };
@@ -22497,12 +22737,15 @@ let AppEmbed$1 = class AppEmbed extends V1Embed {
22497
22737
  }
22498
22738
  // Handle spotterChatConfig params
22499
22739
  if (spotterChatConfig) {
22500
- const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, } = spotterChatConfig;
22740
+ const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, } = spotterChatConfig;
22501
22741
  setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
22502
22742
  setParamIfDefined(params, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
22503
22743
  if (spotterFileUploadEnabled !== undefined) {
22504
22744
  params[Param.SpotterFileUploadEnabled] = spotterFileUploadEnabled;
22505
22745
  }
22746
+ if (enableStarterPrompts !== undefined) {
22747
+ params[Param.IsStarterPromptsEnabled] = enableStarterPrompts;
22748
+ }
22506
22749
  if (spotterFileUploadFileTypes !== undefined) {
22507
22750
  params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
22508
22751
  }
@@ -23058,12 +23301,15 @@ let LiveboardEmbed$1 = class LiveboardEmbed extends V1Embed {
23058
23301
  }
23059
23302
  // Handle spotterChatConfig params
23060
23303
  if (spotterChatConfig) {
23061
- const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, } = spotterChatConfig;
23304
+ const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, } = spotterChatConfig;
23062
23305
  setParamIfDefined(params, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
23063
23306
  setParamIfDefined(params, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
23064
23307
  if (spotterFileUploadEnabled !== undefined) {
23065
23308
  params[Param.SpotterFileUploadEnabled] = spotterFileUploadEnabled;
23066
23309
  }
23310
+ if (enableStarterPrompts !== undefined) {
23311
+ params[Param.IsStarterPromptsEnabled] = enableStarterPrompts;
23312
+ }
23067
23313
  if (spotterFileUploadFileTypes !== undefined) {
23068
23314
  params[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
23069
23315
  }
@@ -23900,10 +24146,11 @@ let SpotterEmbed$1 = class SpotterEmbed extends TsEmbed {
23900
24146
  setParamIfDefined(queryParams, Param.EnableStopAnswerGenerationEmbed, enableStopAnswerGenerationEmbed, true);
23901
24147
  // Handle spotterChatConfig params
23902
24148
  if (spotterChatConfig) {
23903
- const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, } = spotterChatConfig;
24149
+ const { hideToolResponseCardBranding, toolResponseCardBrandingLabel, spotterFileUploadEnabled, spotterFileUploadFileTypes, enableStarterPrompts, } = spotterChatConfig;
23904
24150
  setParamIfDefined(queryParams, Param.HideToolResponseCardBranding, hideToolResponseCardBranding, true);
23905
24151
  setParamIfDefined(queryParams, Param.ToolResponseCardBrandingLabel, toolResponseCardBrandingLabel);
23906
24152
  setParamIfDefined(queryParams, Param.SpotterFileUploadEnabled, spotterFileUploadEnabled, true);
24153
+ setParamIfDefined(queryParams, Param.IsStarterPromptsEnabled, enableStarterPrompts, true);
23907
24154
  if (spotterFileUploadFileTypes !== undefined) {
23908
24155
  queryParams[Param.SpotterFileUploadFileTypes] = JSON.stringify(spotterFileUploadFileTypes);
23909
24156
  }