@thoughtspot/visual-embed-sdk 1.53.0 → 1.53.2-beta

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 (203) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts.map +1 -1
  3. package/cjs/src/auth.js +25 -6
  4. package/cjs/src/auth.js.map +1 -1
  5. package/cjs/src/auth.spec.js +40 -8
  6. package/cjs/src/auth.spec.js.map +1 -1
  7. package/cjs/src/contracts/contracts.spec.js +169 -2
  8. package/cjs/src/contracts/contracts.spec.js.map +1 -1
  9. package/cjs/src/contracts/embed-event-payloads.d.ts +212 -14
  10. package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -1
  11. package/cjs/src/contracts/host-event-contracts.d.ts +11 -0
  12. package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -1
  13. package/cjs/src/css-variables.d.ts +140 -0
  14. package/cjs/src/css-variables.d.ts.map +1 -1
  15. package/cjs/src/embed/app.d.ts +1 -0
  16. package/cjs/src/embed/app.d.ts.map +1 -1
  17. package/cjs/src/embed/app.js.map +1 -1
  18. package/cjs/src/embed/auto-frame-renderer.d.ts +14 -1
  19. package/cjs/src/embed/auto-frame-renderer.d.ts.map +1 -1
  20. package/cjs/src/embed/auto-frame-renderer.js +91 -2
  21. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  22. package/cjs/src/embed/auto-frame-renderer.spec.js +112 -7
  23. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  24. package/cjs/src/embed/conversation.d.ts +14 -0
  25. package/cjs/src/embed/conversation.d.ts.map +1 -1
  26. package/cjs/src/embed/conversation.js.map +1 -1
  27. package/cjs/src/embed/conversation.spec.js +22 -0
  28. package/cjs/src/embed/conversation.spec.js.map +1 -1
  29. package/cjs/src/embed/host-events.spec.js +50 -0
  30. package/cjs/src/embed/host-events.spec.js.map +1 -1
  31. package/cjs/src/embed/liveboard.d.ts +2 -16
  32. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  33. package/cjs/src/embed/liveboard.js +29 -10
  34. package/cjs/src/embed/liveboard.js.map +1 -1
  35. package/cjs/src/embed/liveboard.spec.js +139 -0
  36. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  37. package/cjs/src/embed/spotter-utils.d.ts +1 -0
  38. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  39. package/cjs/src/embed/spotter-utils.js +7 -1
  40. package/cjs/src/embed/spotter-utils.js.map +1 -1
  41. package/cjs/src/embed/spotter-utils.spec.js +19 -0
  42. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  43. package/cjs/src/embed/ts-embed.d.ts +21 -16
  44. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  45. package/cjs/src/embed/ts-embed.js +77 -63
  46. package/cjs/src/embed/ts-embed.js.map +1 -1
  47. package/cjs/src/embed/ts-embed.spec.js +240 -7
  48. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  49. package/cjs/src/index.d.ts +2 -2
  50. package/cjs/src/index.d.ts.map +1 -1
  51. package/cjs/src/index.js.map +1 -1
  52. package/cjs/src/react/all-types-export.d.ts +1 -1
  53. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  54. package/cjs/src/react/all-types-export.js.map +1 -1
  55. package/cjs/src/react/util.d.ts +8 -1
  56. package/cjs/src/react/util.d.ts.map +1 -1
  57. package/cjs/src/react/util.js.map +1 -1
  58. package/cjs/src/types.d.ts +249 -2
  59. package/cjs/src/types.d.ts.map +1 -1
  60. package/cjs/src/types.js +247 -0
  61. package/cjs/src/types.js.map +1 -1
  62. package/cjs/src/utils/runtimeTelemetry.d.ts +11 -0
  63. package/cjs/src/utils/runtimeTelemetry.d.ts.map +1 -0
  64. package/cjs/src/utils/runtimeTelemetry.js +34 -0
  65. package/cjs/src/utils/runtimeTelemetry.js.map +1 -0
  66. package/cjs/src/utils/runtimeTelemetry.spec.d.ts +2 -0
  67. package/cjs/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
  68. package/cjs/src/utils/runtimeTelemetry.spec.js +124 -0
  69. package/cjs/src/utils/runtimeTelemetry.spec.js.map +1 -0
  70. package/dist/{index-CyDR8j_0.js → index-DQ7r5f1z.js} +1 -1
  71. package/dist/src/auth.d.ts.map +1 -1
  72. package/dist/src/contracts/embed-event-payloads.d.ts +212 -14
  73. package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -1
  74. package/dist/src/contracts/host-event-contracts.d.ts +11 -0
  75. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -1
  76. package/dist/src/css-variables.d.ts +140 -0
  77. package/dist/src/css-variables.d.ts.map +1 -1
  78. package/dist/src/embed/app.d.ts +1 -0
  79. package/dist/src/embed/app.d.ts.map +1 -1
  80. package/dist/src/embed/auto-frame-renderer.d.ts +14 -1
  81. package/dist/src/embed/auto-frame-renderer.d.ts.map +1 -1
  82. package/dist/src/embed/conversation.d.ts +14 -0
  83. package/dist/src/embed/conversation.d.ts.map +1 -1
  84. package/dist/src/embed/liveboard.d.ts +2 -16
  85. package/dist/src/embed/liveboard.d.ts.map +1 -1
  86. package/dist/src/embed/spotter-utils.d.ts +1 -0
  87. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  88. package/dist/src/embed/ts-embed.d.ts +21 -16
  89. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  90. package/dist/src/index.d.ts +2 -2
  91. package/dist/src/index.d.ts.map +1 -1
  92. package/dist/src/react/all-types-export.d.ts +1 -1
  93. package/dist/src/react/all-types-export.d.ts.map +1 -1
  94. package/dist/src/react/util.d.ts +8 -1
  95. package/dist/src/react/util.d.ts.map +1 -1
  96. package/dist/src/types.d.ts +249 -2
  97. package/dist/src/types.d.ts.map +1 -1
  98. package/dist/src/utils/runtimeTelemetry.d.ts +11 -0
  99. package/dist/src/utils/runtimeTelemetry.d.ts.map +1 -0
  100. package/dist/src/utils/runtimeTelemetry.spec.d.ts +2 -0
  101. package/dist/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
  102. package/dist/tsembed-react.es.js +474 -84
  103. package/dist/tsembed-react.js +473 -83
  104. package/dist/tsembed.es.js +542 -85
  105. package/dist/tsembed.js +541 -84
  106. package/dist/visual-embed-sdk-react-full.d.ts +649 -30
  107. package/dist/visual-embed-sdk-react.d.ts +646 -28
  108. package/dist/visual-embed-sdk.d.ts +642 -44
  109. package/lib/package.json +1 -1
  110. package/lib/src/auth.d.ts.map +1 -1
  111. package/lib/src/auth.js +25 -6
  112. package/lib/src/auth.js.map +1 -1
  113. package/lib/src/auth.spec.js +40 -8
  114. package/lib/src/auth.spec.js.map +1 -1
  115. package/lib/src/contracts/contracts.spec.js +169 -2
  116. package/lib/src/contracts/contracts.spec.js.map +1 -1
  117. package/lib/src/contracts/embed-event-payloads.d.ts +212 -14
  118. package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -1
  119. package/lib/src/contracts/host-event-contracts.d.ts +11 -0
  120. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -1
  121. package/lib/src/css-variables.d.ts +140 -0
  122. package/lib/src/css-variables.d.ts.map +1 -1
  123. package/lib/src/embed/app.d.ts +1 -0
  124. package/lib/src/embed/app.d.ts.map +1 -1
  125. package/lib/src/embed/app.js.map +1 -1
  126. package/lib/src/embed/auto-frame-renderer.d.ts +14 -1
  127. package/lib/src/embed/auto-frame-renderer.d.ts.map +1 -1
  128. package/lib/src/embed/auto-frame-renderer.js +91 -2
  129. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  130. package/lib/src/embed/auto-frame-renderer.spec.js +113 -8
  131. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  132. package/lib/src/embed/conversation.d.ts +14 -0
  133. package/lib/src/embed/conversation.d.ts.map +1 -1
  134. package/lib/src/embed/conversation.js.map +1 -1
  135. package/lib/src/embed/conversation.spec.js +22 -0
  136. package/lib/src/embed/conversation.spec.js.map +1 -1
  137. package/lib/src/embed/host-events.spec.js +50 -0
  138. package/lib/src/embed/host-events.spec.js.map +1 -1
  139. package/lib/src/embed/liveboard.d.ts +2 -16
  140. package/lib/src/embed/liveboard.d.ts.map +1 -1
  141. package/lib/src/embed/liveboard.js +28 -10
  142. package/lib/src/embed/liveboard.js.map +1 -1
  143. package/lib/src/embed/liveboard.spec.js +139 -0
  144. package/lib/src/embed/liveboard.spec.js.map +1 -1
  145. package/lib/src/embed/spotter-utils.d.ts +1 -0
  146. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  147. package/lib/src/embed/spotter-utils.js +7 -1
  148. package/lib/src/embed/spotter-utils.js.map +1 -1
  149. package/lib/src/embed/spotter-utils.spec.js +19 -0
  150. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  151. package/lib/src/embed/ts-embed.d.ts +21 -16
  152. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  153. package/lib/src/embed/ts-embed.js +78 -64
  154. package/lib/src/embed/ts-embed.js.map +1 -1
  155. package/lib/src/embed/ts-embed.spec.js +240 -7
  156. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  157. package/lib/src/index.d.ts +2 -2
  158. package/lib/src/index.d.ts.map +1 -1
  159. package/lib/src/index.js.map +1 -1
  160. package/lib/src/react/all-types-export.d.ts +1 -1
  161. package/lib/src/react/all-types-export.d.ts.map +1 -1
  162. package/lib/src/react/all-types-export.js.map +1 -1
  163. package/lib/src/react/util.d.ts +8 -1
  164. package/lib/src/react/util.d.ts.map +1 -1
  165. package/lib/src/react/util.js.map +1 -1
  166. package/lib/src/types.d.ts +249 -2
  167. package/lib/src/types.d.ts.map +1 -1
  168. package/lib/src/types.js +247 -0
  169. package/lib/src/types.js.map +1 -1
  170. package/lib/src/utils/runtimeTelemetry.d.ts +11 -0
  171. package/lib/src/utils/runtimeTelemetry.d.ts.map +1 -0
  172. package/lib/src/utils/runtimeTelemetry.js +28 -0
  173. package/lib/src/utils/runtimeTelemetry.js.map +1 -0
  174. package/lib/src/utils/runtimeTelemetry.spec.d.ts +2 -0
  175. package/lib/src/utils/runtimeTelemetry.spec.d.ts.map +1 -0
  176. package/lib/src/utils/runtimeTelemetry.spec.js +122 -0
  177. package/lib/src/utils/runtimeTelemetry.spec.js.map +1 -0
  178. package/lib/src/visual-embed-sdk.d.ts +642 -44
  179. package/package.json +1 -1
  180. package/src/auth.spec.ts +47 -11
  181. package/src/auth.ts +35 -6
  182. package/src/contracts/contracts.spec.ts +186 -3
  183. package/src/contracts/embed-event-payloads.ts +281 -14
  184. package/src/contracts/host-event-contracts.ts +14 -0
  185. package/src/css-variables.ts +168 -0
  186. package/src/embed/app.ts +1 -0
  187. package/src/embed/auto-frame-renderer.spec.ts +134 -8
  188. package/src/embed/auto-frame-renderer.ts +103 -2
  189. package/src/embed/conversation.spec.ts +24 -0
  190. package/src/embed/conversation.ts +14 -0
  191. package/src/embed/host-events.spec.ts +68 -0
  192. package/src/embed/liveboard.spec.ts +156 -0
  193. package/src/embed/liveboard.ts +34 -10
  194. package/src/embed/spotter-utils.spec.ts +20 -0
  195. package/src/embed/spotter-utils.ts +12 -1
  196. package/src/embed/ts-embed.spec.ts +297 -8
  197. package/src/embed/ts-embed.ts +79 -64
  198. package/src/index.ts +2 -0
  199. package/src/react/all-types-export.ts +1 -0
  200. package/src/react/util.ts +13 -1
  201. package/src/types.ts +249 -0
  202. package/src/utils/runtimeTelemetry.spec.ts +148 -0
  203. package/src/utils/runtimeTelemetry.ts +50 -0
@@ -45,6 +45,7 @@ import {
45
45
  getHostEventsConfig,
46
46
  getValueFromWindow,
47
47
  deserializeParam,
48
+ getScrollableAncestors,
48
49
  setParamIfDefined,
49
50
  } from '../utils';
50
51
  import { getCustomActions } from '../utils/custom-actions';
@@ -80,6 +81,7 @@ import {
80
81
  BaseViewConfig,
81
82
  } from '../types';
82
83
  import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service';
84
+ import { summarizeRuntimeDataForTelemetry } from '../utils/runtimeTelemetry';
83
85
  import { processEventData, processAuthFailure } from '../utils/processData';
84
86
  import { version } from '../utils/sdk-version';
85
87
  import {
@@ -116,6 +118,9 @@ const TS_EMBED_ID = '_thoughtspot-embed';
116
118
  */
117
119
  const PRERENDER_CONTAINER_ORIGINAL_POSITION_KEY = 'tsEmbedOriginalPosition';
118
120
  const PRERENDER_WRAPPER_ID_PREFIX = 'tsEmbed-pre-render-wrapper-';
121
+ const PRERENDER_PARKED_TRANSFORM = 'translateY(-100%)';
122
+ /** The height createPreRenderWrapper() seeds before anything is measured. */
123
+ const UNMEASURED_WRAPPER_HEIGHT = '100vh';
119
124
 
120
125
  // The container applies UpdateEmbedParams through React state, so a delivered
121
126
  // post is not the same as the params being in effect.
@@ -325,8 +330,7 @@ export class TsEmbed {
325
330
 
326
331
  private preRenderContainerEl: HTMLElement = document.body;
327
332
 
328
- private containerScrollListener: (() => void) | null = null;
329
-
333
+ /** Last height the embedded app reported, once fullHeight has measured one. */
330
334
  protected hostEventClient: HostEventClient;
331
335
 
332
336
  protected isReadyForRenderPromise;
@@ -347,9 +351,10 @@ export class TsEmbed {
347
351
  ...viewConfig,
348
352
  };
349
353
  this.registerAppInit();
350
- uploadMixpanelEvent(MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE, {
351
- ...viewConfig,
352
- });
354
+ uploadMixpanelEvent(
355
+ MIXPANEL_EVENT.VISUAL_SDK_EMBED_CREATE,
356
+ summarizeRuntimeDataForTelemetry(viewConfig),
357
+ );
353
358
  const embedConfig = getEmbedConfig();
354
359
  if (embedConfig) {
355
360
  this.embedConfig = embedConfig;
@@ -1283,7 +1288,7 @@ export class TsEmbed {
1283
1288
  top: '0',
1284
1289
  left: '0',
1285
1290
  width: '100vw',
1286
- height: '100vh',
1291
+ height: UNMEASURED_WRAPPER_HEIGHT,
1287
1292
  };
1288
1293
  setStyleProperties(preRenderWrapper, initialPreRenderWrapperStyle);
1289
1294
 
@@ -1369,10 +1374,12 @@ export class TsEmbed {
1369
1374
  }
1370
1375
 
1371
1376
  /**
1372
- * Resolves the configured preRenderContainer to a live element, falling
1373
- * back to `document.body`. A string selector is re-queried on every call so
1374
- * a remounted container (E.g.: React replacing the node) resolves to the
1375
- * fresh element; an element passed directly cannot be re-resolved.
1377
+ * Resolves the configured preRenderContainer, or defaults to the host's
1378
+ * nearest scrolling ancestor (document.body if none). The absolutely
1379
+ * positioned wrapper only follows the page while it sits inside what
1380
+ * scrolls, so body is right only when the document itself scrolls — an inner
1381
+ * scroller left the frame pinned to the viewport (SCAL-338563). A string
1382
+ * selector is re-queried each call so a remounted container resolves fresh.
1376
1383
  */
1377
1384
  private resolvePreRenderContainerTarget(): HTMLElement {
1378
1385
  const containerConfig = this.getPreRenderConfig().containerSelector;
@@ -1389,7 +1396,13 @@ export class TsEmbed {
1389
1396
  } else if (containerConfig) {
1390
1397
  container = containerConfig;
1391
1398
  }
1392
- return (container as HTMLElement) ?? document.body;
1399
+ if (container) {
1400
+ return container as HTMLElement;
1401
+ }
1402
+ if (!this.hostElement) {
1403
+ return document.body;
1404
+ }
1405
+ return getScrollableAncestors(this.hostElement)[0] ?? document.body;
1393
1406
  }
1394
1407
 
1395
1408
  private inheritPreRenderContainer(): void {
@@ -1443,8 +1456,9 @@ export class TsEmbed {
1443
1456
  * Re-attaches the wrapper to a live container when the previously resolved
1444
1457
  * one has been detached or no longer holds the wrapper — e.g. the host app
1445
1458
  * remounted a custom preRenderContainer, which would otherwise leave a stale
1446
- * reference and collapse the wrapper. Only string selectors can be
1447
- * re-resolved; a container passed as an element is left untouched.
1459
+ * reference and collapse the wrapper. Selectors and the auto-resolved
1460
+ * scrolling ancestor are both re-resolved; a container passed as an element
1461
+ * is left untouched, as there is nothing to re-query.
1448
1462
  */
1449
1463
  private reconcilePreRenderContainer(): void {
1450
1464
  const wrapper = this.preRenderWrapper;
@@ -1463,14 +1477,6 @@ export class TsEmbed {
1463
1477
  if (resolved === stored && stored.contains(wrapper)) {
1464
1478
  return;
1465
1479
  }
1466
- if (this.containerScrollListener && stored !== resolved) {
1467
- if (stored !== document.body) {
1468
- stored.removeEventListener('scroll', this.containerScrollListener);
1469
- }
1470
- if (resolved !== document.body) {
1471
- resolved.addEventListener('scroll', this.containerScrollListener);
1472
- }
1473
- }
1474
1480
  this.preRenderContainerEl = resolved;
1475
1481
  this.applyPreRenderContainerPositioning();
1476
1482
  if (wrapper.parentNode !== resolved) {
@@ -1539,10 +1545,11 @@ export class TsEmbed {
1539
1545
  */
1540
1546
  protected setIFrameHeight(height: number | string): void {
1541
1547
  if (this.isPreRendered) {
1548
+ const next = getCssDimension(height);
1542
1549
  if (this.insertedDomEl) {
1543
- (this.insertedDomEl as HTMLElement).style.height = getCssDimension(height);
1550
+ (this.insertedDomEl as HTMLElement).style.height = next;
1544
1551
  } else if (this.preRenderWrapper) {
1545
- this.preRenderWrapper.style.height = getCssDimension(height);
1552
+ this.preRenderWrapper.style.height = next;
1546
1553
  }
1547
1554
  } else {
1548
1555
  // normal (non-preRender) mode: size the iframe directly
@@ -2113,15 +2120,27 @@ export class TsEmbed {
2113
2120
  }
2114
2121
 
2115
2122
  /**
2116
- * Detaches and clears the container scroll listener, if one is attached.
2117
- */
2118
- private removeContainerScrollListener(): void {
2119
- if (!this.containerScrollListener) {
2123
+ * Re-sizes the wrapper when its placeholder changes size.
2124
+ *
2125
+ * Position deliberately has no equivalent. An absolutely positioned wrapper
2126
+ * follows its containing block for free, so a correctly placed frame is the
2127
+ * browser's job and costs nothing; repositioning it on scroll would mean a
2128
+ * layout read and a style write per frame to compensate for placing it in
2129
+ * the wrong box. Size is the one thing the browser will not do for us: the
2130
+ * placeholder grows when the embedded app reports a new height, and the
2131
+ * wrapper has to be told.
2132
+ */
2133
+ private observePreRenderSize(): void {
2134
+ if (this.getPreRenderConfig().doNotTrackSize || typeof ResizeObserver === 'undefined') {
2135
+ return;
2136
+ }
2137
+ const placeholder = this.getPreRenderPlaceHolderElement();
2138
+ if (!placeholder) {
2120
2139
  return;
2121
2140
  }
2122
- const customContainer = this.getCustomPreRenderContainer();
2123
- customContainer?.removeEventListener('scroll', this.containerScrollListener);
2124
- this.containerScrollListener = null;
2141
+ this.resizeObserver?.disconnect();
2142
+ this.resizeObserver = new ResizeObserver(() => this.syncPreRenderStyle());
2143
+ this.resizeObserver.observe(placeholder);
2125
2144
  }
2126
2145
 
2127
2146
  /**
@@ -2131,7 +2150,7 @@ export class TsEmbed {
2131
2150
  public destroy(): void {
2132
2151
  try {
2133
2152
  this.removeFullscreenChangeHandler();
2134
- this.removeContainerScrollListener();
2153
+ this.resizeObserver?.disconnect();
2135
2154
  this.unsubscribeToEvents();
2136
2155
  this.preRenderWrapper?.remove();
2137
2156
  this.restorePreRenderContainerPosition();
@@ -2258,14 +2277,18 @@ export class TsEmbed {
2258
2277
 
2259
2278
  if (this.hostElement) {
2260
2279
  this.insertedDomEl = this.createPreRenderPlaceholder();
2261
- if ((this.viewConfig as { fullHeight: boolean }).fullHeight) {
2262
- // If fullHeight has already sized the wrapper, seed the
2263
- // placeholder with the same height so syncPreRenderStyle gets
2264
- // an accurate rect.
2265
- const existingHeight = this.preRenderWrapper.style.height;
2266
- if (existingHeight) {
2267
- (this.insertedDomEl as HTMLDivElement).style.height = existingHeight;
2268
- }
2280
+ // Carry a height fullHeight has already measured onto the fresh
2281
+ // placeholder, so a re-show does not flash at frameParams height.
2282
+ // UNMEASURED_WRAPPER_HEIGHT is what createPreRenderWrapper() seeds
2283
+ // before anything has been measured; treating that as a measurement
2284
+ // is what made a first reveal overshoot to a full viewport.
2285
+ const wrapperHeight = this.preRenderWrapper.style.height;
2286
+ if (
2287
+ (this.viewConfig as { fullHeight: boolean }).fullHeight
2288
+ && wrapperHeight
2289
+ && wrapperHeight !== UNMEASURED_WRAPPER_HEIGHT
2290
+ ) {
2291
+ (this.insertedDomEl as HTMLDivElement).style.height = wrapperHeight;
2269
2292
  }
2270
2293
 
2271
2294
  const placeHolderId = this.getPreRenderIds().placeHolder;
@@ -2282,32 +2305,20 @@ export class TsEmbed {
2282
2305
  this.hostElement.appendChild(this.insertedDomEl);
2283
2306
 
2284
2307
  this.syncPreRenderStyle();
2285
-
2286
- const customContainer = this.getCustomPreRenderContainer();
2287
- if (customContainer && !this.containerScrollListener) {
2288
- this.containerScrollListener = () => this.syncPreRenderStyle();
2289
- customContainer.addEventListener('scroll', this.containerScrollListener);
2290
- }
2291
-
2292
- if (!this.getPreRenderConfig().doNotTrackSize) {
2293
- const observeTarget = (this.insertedDomEl as HTMLElement) ?? this.hostElement;
2294
- this.resizeObserver = new ResizeObserver((entries) => {
2295
- entries.forEach((entry) => {
2296
- if (entry.target === observeTarget) {
2297
- this.syncPreRenderStyle();
2298
- }
2299
- });
2300
- });
2301
- this.resizeObserver.observe(observeTarget);
2302
- }
2308
+ this.observePreRenderSize();
2303
2309
  }
2304
2310
 
2305
2311
  removeStyleProperties(this.preRenderWrapper, [
2306
2312
  'z-index',
2307
2313
  'opacity',
2308
- 'pointer-events',
2309
2314
  'overflow',
2315
+ 'transform',
2310
2316
  ]);
2317
+ // Set rather than removed: a container that carries `pointer-events:
2318
+ // none` — the usual styling for a parking root that must not swallow
2319
+ // clicks — passes it down, and dropping the property here would leave
2320
+ // the inherited `none` in force and the frame dead to input.
2321
+ setStyleProperties(this.preRenderWrapper, { pointerEvents: 'auto' });
2311
2322
  this.subscribeToEvents();
2312
2323
 
2313
2324
  // Setup fullscreen change handler for prerendered components
@@ -2379,22 +2390,26 @@ export class TsEmbed {
2379
2390
  return;
2380
2391
  }
2381
2392
  const { zIndex } = this.getPreRenderConfig();
2393
+ // A hidden pre-render frame must add no scroll space to the host page.
2382
2394
  const preRenderHideStyles = {
2383
2395
  opacity: '0',
2384
2396
  pointerEvents: 'none',
2385
2397
  zIndex: zIndex !== undefined ? String(zIndex) : '-1000',
2386
- position: 'absolute',
2398
+ // Resolves to the viewport, so the hidden frame belongs to no
2399
+ // scroll container's overflow; syncPreRenderStyle restores absolute
2400
+ // on show.
2401
+ position: 'fixed',
2387
2402
  top: '0',
2388
2403
  left: '0',
2389
2404
  overflow: 'hidden',
2405
+ // The one exception: a transformed or contained ancestor captures
2406
+ // `fixed`; parking above the top edge keeps it out of that
2407
+ // overflow.
2408
+ transform: PRERENDER_PARKED_TRANSFORM,
2390
2409
  };
2391
2410
  setStyleProperties(this.preRenderWrapper, preRenderHideStyles);
2392
2411
 
2393
- this.removeContainerScrollListener();
2394
-
2395
- if (this.resizeObserver) {
2396
- this.resizeObserver.disconnect();
2397
- }
2412
+ this.resizeObserver?.disconnect();
2398
2413
 
2399
2414
  const placeHolderEle = this.getPreRenderPlaceHolderElement();
2400
2415
  if (placeHolderEle) {
package/src/index.ts CHANGED
@@ -159,6 +159,7 @@ import {
159
159
  ScheduleEmailRequest,
160
160
  NavigateRequest,
161
161
  SetActiveTabRequest,
162
+ UpdateThemeRequest,
162
163
  } from './contracts/host-event-contracts';
163
164
  import {
164
165
  convertFilterChangedToUpdateFiltersPayload,
@@ -292,6 +293,7 @@ export {
292
293
  ScheduleEmailRequest,
293
294
  NavigateRequest,
294
295
  SetActiveTabRequest,
296
+ UpdateThemeRequest,
295
297
  LiveboardTab,
296
298
  LiveboardGroup,
297
299
  ApplicabilityLevel,
@@ -92,6 +92,7 @@ export {
92
92
  ScheduleEmailRequest,
93
93
  NavigateRequest,
94
94
  SetActiveTabRequest,
95
+ UpdateThemeRequest,
95
96
  LiveboardTab,
96
97
  LiveboardGroup,
97
98
  ApplicabilityLevel,
package/src/react/util.ts CHANGED
@@ -1,8 +1,20 @@
1
1
  import { EmbedEvent, MessageCallback, AllEmbedViewConfig } from '../types';
2
+ import { EmbedEventPayload } from '../contracts/embed-event-payloads';
2
3
 
3
4
  interface EmbedViewConfig extends AllEmbedViewConfig, EmbedEventHandlers {}
4
5
 
5
- export type EmbedEventHandlers = { [key in keyof typeof EmbedEvent as `on${Capitalize<key>}`]?: MessageCallback };
6
+ /**
7
+ * `on{Event}` handler props for the React components. Each handler receives the
8
+ * payload typed for its event (the same {@link EmbedEventPayload} the imperative
9
+ * `embed.on()` delivers), so `onData`, `onVizPointClick`, etc. are per-event
10
+ * typed rather than the loose {@link MessageCallback}.
11
+ */
12
+ export type EmbedEventHandlers = {
13
+ [K in keyof typeof EmbedEvent as `on${Capitalize<K>}`]?: (
14
+ payload: EmbedEventPayload<(typeof EmbedEvent)[K]>,
15
+ responder?: (data: any) => void,
16
+ ) => void;
17
+ };
6
18
 
7
19
  export interface EmbedProps extends EmbedViewConfig {
8
20
  className?: string;