@qualified-salesforce/web 0.0.1-oidc-bootstrap

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 (560) hide show
  1. package/41842993ec71d6628e4949e9a22b146b.svg +3 -0
  2. package/7271f3433ed82fc7f56adcd9e30275f4.svg +17 -0
  3. package/LICENSE.txt +82 -0
  4. package/components/helpers/entriesStringValidations.js +69 -0
  5. package/components/helpers/languages.js +32 -0
  6. package/components/shared/assertUnreachable.js +5 -0
  7. package/components/shared/controls/imageCropperHelpers.js +43 -0
  8. package/components/shared/meetingLoadingProgressSpec.js +116 -0
  9. package/constants.generated.js +9883 -0
  10. package/css/widget/multimodal_v2/host.split-css.css +162 -0
  11. package/css/widget/multimodal_v2/index.split-css.panda.css +5240 -0
  12. package/css/widget/widget.split-css.css +100 -0
  13. package/fonts/inter/Inter-Black.woff +0 -0
  14. package/fonts/inter/Inter-Black.woff2 +0 -0
  15. package/fonts/inter/Inter-BlackItalic.woff +0 -0
  16. package/fonts/inter/Inter-BlackItalic.woff2 +0 -0
  17. package/fonts/inter/Inter-Bold.woff +0 -0
  18. package/fonts/inter/Inter-Bold.woff2 +0 -0
  19. package/fonts/inter/Inter-BoldItalic.woff +0 -0
  20. package/fonts/inter/Inter-BoldItalic.woff2 +0 -0
  21. package/fonts/inter/Inter-ExtraBold.woff +0 -0
  22. package/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  23. package/fonts/inter/Inter-ExtraBoldItalic.woff +0 -0
  24. package/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
  25. package/fonts/inter/Inter-ExtraLight.woff +0 -0
  26. package/fonts/inter/Inter-ExtraLight.woff2 +0 -0
  27. package/fonts/inter/Inter-ExtraLightItalic.woff +0 -0
  28. package/fonts/inter/Inter-ExtraLightItalic.woff2 +0 -0
  29. package/fonts/inter/Inter-Italic.woff +0 -0
  30. package/fonts/inter/Inter-Italic.woff2 +0 -0
  31. package/fonts/inter/Inter-Light.woff +0 -0
  32. package/fonts/inter/Inter-Light.woff2 +0 -0
  33. package/fonts/inter/Inter-LightItalic.woff +0 -0
  34. package/fonts/inter/Inter-LightItalic.woff2 +0 -0
  35. package/fonts/inter/Inter-Medium.woff +0 -0
  36. package/fonts/inter/Inter-Medium.woff2 +0 -0
  37. package/fonts/inter/Inter-MediumItalic.woff +0 -0
  38. package/fonts/inter/Inter-MediumItalic.woff2 +0 -0
  39. package/fonts/inter/Inter-Regular.woff +0 -0
  40. package/fonts/inter/Inter-Regular.woff2 +0 -0
  41. package/fonts/inter/Inter-SemiBold.woff +0 -0
  42. package/fonts/inter/Inter-SemiBold.woff2 +0 -0
  43. package/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
  44. package/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
  45. package/fonts/inter/Inter-Thin.woff +0 -0
  46. package/fonts/inter/Inter-Thin.woff2 +0 -0
  47. package/fonts/inter/Inter-ThinItalic.woff +0 -0
  48. package/fonts/inter/Inter-ThinItalic.woff2 +0 -0
  49. package/fonts/inter/Inter-italic.var.woff2 +0 -0
  50. package/fonts/inter/Inter-roman.var.woff2 +0 -0
  51. package/images/close.js +63 -0
  52. package/images/logo.js +22 -0
  53. package/js/4101.js +19721 -0
  54. package/js/daily-esm.js +9948 -0
  55. package/js/date-fns.js +427 -0
  56. package/js/multimodal_v2.js +1653 -0
  57. package/js/runtime.js +109 -0
  58. package/media/Inter-Black.796be8d8bf.woff2 +0 -0
  59. package/media/Inter-Black.b254104c56.woff +0 -0
  60. package/media/Inter-BlackItalic.70306b0eae.woff +0 -0
  61. package/media/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
  62. package/media/Inter-Bold.579e0f95ca.woff2 +0 -0
  63. package/media/Inter-Bold.b1234477a5.woff +0 -0
  64. package/media/Inter-BoldItalic.3d0d804323.woff +0 -0
  65. package/media/Inter-BoldItalic.828a494e04.woff2 +0 -0
  66. package/media/Inter-ExtraBold.208a9e6c99.woff +0 -0
  67. package/media/Inter-ExtraBold.d65f028165.woff2 +0 -0
  68. package/media/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
  69. package/media/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
  70. package/media/Inter-ExtraLight.15c082a57d.woff +0 -0
  71. package/media/Inter-ExtraLight.6824177d1e.woff2 +0 -0
  72. package/media/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
  73. package/media/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
  74. package/media/Inter-Italic.9beab78452.woff +0 -0
  75. package/media/Inter-Italic.d593a8df79.woff2 +0 -0
  76. package/media/Inter-Light.27083fa637.woff2 +0 -0
  77. package/media/Inter-Light.91dfddd842.woff +0 -0
  78. package/media/Inter-LightItalic.0a783b89b3.woff2 +0 -0
  79. package/media/Inter-LightItalic.f8ccf2813f.woff +0 -0
  80. package/media/Inter-Medium.dc792b508e.woff2 +0 -0
  81. package/media/Inter-Medium.ec7dd2d9d8.woff +0 -0
  82. package/media/Inter-MediumItalic.17301e5b40.woff +0 -0
  83. package/media/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
  84. package/media/Inter-Regular.f1f0c35b32.woff2 +0 -0
  85. package/media/Inter-Regular.f356e84aa0.woff +0 -0
  86. package/media/Inter-SemiBold.55027e4724.woff +0 -0
  87. package/media/Inter-SemiBold.fcb100c760.woff2 +0 -0
  88. package/media/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
  89. package/media/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
  90. package/media/Inter-Thin.16325d9b0f.woff +0 -0
  91. package/media/Inter-Thin.dafaa44d99.woff2 +0 -0
  92. package/media/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
  93. package/media/Inter-ThinItalic.d3d8994788.woff +0 -0
  94. package/media/Inter-italic.var.958a0b9742.woff2 +0 -0
  95. package/media/Inter-roman.var.b2129c009c.woff2 +0 -0
  96. package/package.json +20 -0
  97. package/packs/widget/api/docking/docking_host.js +97 -0
  98. package/packs/widget/api/docking/index.js +294 -0
  99. package/packs/widget/api/docking/shared.js +164 -0
  100. package/packs/widget/api/docking/viewport_lock.js +488 -0
  101. package/packs/widget/api/docking/viewport_resize.js +1203 -0
  102. package/packs/widget/esm/fonts/Inter-Black.796be8d8bf.woff2 +0 -0
  103. package/packs/widget/esm/fonts/Inter-Black.b254104c56.woff +0 -0
  104. package/packs/widget/esm/fonts/Inter-BlackItalic.70306b0eae.woff +0 -0
  105. package/packs/widget/esm/fonts/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
  106. package/packs/widget/esm/fonts/Inter-Bold.579e0f95ca.woff2 +0 -0
  107. package/packs/widget/esm/fonts/Inter-Bold.b1234477a5.woff +0 -0
  108. package/packs/widget/esm/fonts/Inter-BoldItalic.3d0d804323.woff +0 -0
  109. package/packs/widget/esm/fonts/Inter-BoldItalic.828a494e04.woff2 +0 -0
  110. package/packs/widget/esm/fonts/Inter-ExtraBold.208a9e6c99.woff +0 -0
  111. package/packs/widget/esm/fonts/Inter-ExtraBold.d65f028165.woff2 +0 -0
  112. package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
  113. package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
  114. package/packs/widget/esm/fonts/Inter-ExtraLight.15c082a57d.woff +0 -0
  115. package/packs/widget/esm/fonts/Inter-ExtraLight.6824177d1e.woff2 +0 -0
  116. package/packs/widget/esm/fonts/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
  117. package/packs/widget/esm/fonts/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
  118. package/packs/widget/esm/fonts/Inter-Italic.9beab78452.woff +0 -0
  119. package/packs/widget/esm/fonts/Inter-Italic.d593a8df79.woff2 +0 -0
  120. package/packs/widget/esm/fonts/Inter-Light.27083fa637.woff2 +0 -0
  121. package/packs/widget/esm/fonts/Inter-Light.91dfddd842.woff +0 -0
  122. package/packs/widget/esm/fonts/Inter-LightItalic.0a783b89b3.woff2 +0 -0
  123. package/packs/widget/esm/fonts/Inter-LightItalic.f8ccf2813f.woff +0 -0
  124. package/packs/widget/esm/fonts/Inter-Medium.dc792b508e.woff2 +0 -0
  125. package/packs/widget/esm/fonts/Inter-Medium.ec7dd2d9d8.woff +0 -0
  126. package/packs/widget/esm/fonts/Inter-MediumItalic.17301e5b40.woff +0 -0
  127. package/packs/widget/esm/fonts/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
  128. package/packs/widget/esm/fonts/Inter-Regular.f1f0c35b32.woff2 +0 -0
  129. package/packs/widget/esm/fonts/Inter-Regular.f356e84aa0.woff +0 -0
  130. package/packs/widget/esm/fonts/Inter-SemiBold.55027e4724.woff +0 -0
  131. package/packs/widget/esm/fonts/Inter-SemiBold.fcb100c760.woff2 +0 -0
  132. package/packs/widget/esm/fonts/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
  133. package/packs/widget/esm/fonts/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
  134. package/packs/widget/esm/fonts/Inter-Thin.16325d9b0f.woff +0 -0
  135. package/packs/widget/esm/fonts/Inter-Thin.dafaa44d99.woff2 +0 -0
  136. package/packs/widget/esm/fonts/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
  137. package/packs/widget/esm/fonts/Inter-ThinItalic.d3d8994788.woff +0 -0
  138. package/packs/widget/esm/fonts/Inter-italic.var.958a0b9742.woff2 +0 -0
  139. package/packs/widget/esm/fonts/Inter-roman.var.b2129c009c.woff2 +0 -0
  140. package/packs/widget/esm/index.js +183 -0
  141. package/packs/widget/esm/qualified.css +5502 -0
  142. package/routes/app/offers/scripts/OfferMainScript.js +154 -0
  143. package/routes/app/offers/scripts/constants.js +71 -0
  144. package/routes/app/offers/scripts/main/ButtonManager.js +65 -0
  145. package/routes/app/offers/scripts/main/FormManager.js +325 -0
  146. package/routes/app/offers/scripts/main/MainContext.js +19 -0
  147. package/routes/app/offers/scripts/main/OfferManager.js +91 -0
  148. package/routes/app/offers/scripts/main/TriggerManager.js +125 -0
  149. package/routes/app/offers/scripts/rendering/ContentManager.js +53 -0
  150. package/routes/app/offers/scripts/rendering/LocationManager.js +83 -0
  151. package/routes/app/offers/scripts/rendering/RenderedOffer.js +188 -0
  152. package/routes/app/offers/scripts/rendering/Renderer.js +69 -0
  153. package/routes/app/offers/scripts/rendering/RenderingInitializer.js +62 -0
  154. package/routes/app/offers/scripts/rendering/animations/AnimationManager.js +31 -0
  155. package/routes/app/offers/scripts/rendering/animations/AnimationManagerFooter.js +81 -0
  156. package/routes/app/offers/scripts/rendering/animations/AnimationManagerHeader.js +81 -0
  157. package/routes/app/offers/scripts/rendering/animations/AnimationManagerModal.js +117 -0
  158. package/routes/app/offers/scripts/rendering/animations/AnimationManagerSidebar.js +75 -0
  159. package/routes/app/offers/scripts/rendering/animations/AnimationResult.js +43 -0
  160. package/routes/app/offers/scripts/rendering/animations/Animator.js +78 -0
  161. package/routes/app/offers/scripts/rendering/animations/BaseAnimationManager.js +25 -0
  162. package/routes/app/offers/scripts/rendering/lib/BaseComponent.js +106 -0
  163. package/routes/app/offers/scripts/rendering/lib/FormComponent.js +134 -0
  164. package/routes/app/offers/scripts/rendering/lib/OfferComponent.js +144 -0
  165. package/routes/app/offers/scripts/rendering/lib/ScrollbarWidth.js +27 -0
  166. package/routes/app/offers/scripts/rendering/lib/decorators.js +20 -0
  167. package/routes/app/offers/scripts/rendering/locations/CSSVarsManager.js +66 -0
  168. package/routes/app/offers/scripts/rendering/locations/ElementResizeObserver.js +49 -0
  169. package/routes/app/offers/scripts/rendering/locations/footer.js +53 -0
  170. package/routes/app/offers/scripts/rendering/locations/header/AsyncBatchProcessor.js +70 -0
  171. package/routes/app/offers/scripts/rendering/locations/header/CSSTransitionObserver.js +182 -0
  172. package/routes/app/offers/scripts/rendering/locations/header/ElementStyleChangeObserver.js +138 -0
  173. package/routes/app/offers/scripts/rendering/locations/header/ExternalStyleManager.js +110 -0
  174. package/routes/app/offers/scripts/rendering/locations/header/Header.js +353 -0
  175. package/routes/app/offers/scripts/rendering/locations/header/InlineStyleManager.js +105 -0
  176. package/routes/app/offers/scripts/rendering/locations/header/MatchingElementsObserver.js +107 -0
  177. package/routes/app/offers/scripts/rendering/locations/header/NewElementsObserver.js +129 -0
  178. package/routes/app/offers/scripts/rendering/locations/header/RuleWrapper.js +46 -0
  179. package/routes/app/offers/scripts/rendering/locations/header/SelectorObservable.js +23 -0
  180. package/routes/app/offers/scripts/rendering/locations/header/SelectorObserver.js +61 -0
  181. package/routes/app/offers/scripts/rendering/locations/header/ShiftedElementsManager.js +45 -0
  182. package/routes/app/offers/scripts/rendering/locations/header/StyleElementManager.js +37 -0
  183. package/routes/app/offers/scripts/rendering/locations/header/StyleElementWrapper.js +62 -0
  184. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectorValue.js +45 -0
  185. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectors.js +62 -0
  186. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/StyleSelectorObserver.js +294 -0
  187. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/constants.js +21 -0
  188. package/routes/app/offers/scripts/rendering/locations/header/WindowResizeObserver.js +43 -0
  189. package/routes/app/offers/scripts/rendering/locations/header/utils.js +25 -0
  190. package/routes/app/offers/scripts/rendering/locations/popup.js +66 -0
  191. package/routes/app/offers/scripts/rendering/locations/sidebar.js +21 -0
  192. package/routes/app/offers/scripts/rendering/variations/ButtonBanner.js +105 -0
  193. package/routes/app/offers/scripts/rendering/variations/ButtonModal.js +114 -0
  194. package/routes/app/offers/scripts/rendering/variations/FormBanner.js +214 -0
  195. package/routes/app/offers/scripts/rendering/variations/FormModal.js +325 -0
  196. package/routes/app/offers/scripts/rendering/variations/LinkBanner.js +105 -0
  197. package/routes/app/offers/scripts/rendering/variations/components/Body.js +29 -0
  198. package/routes/app/offers/scripts/rendering/variations/components/Button.js +128 -0
  199. package/routes/app/offers/scripts/rendering/variations/components/DismissButton.js +39 -0
  200. package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageBanner.js +110 -0
  201. package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageModal.js +128 -0
  202. package/routes/app/offers/scripts/rendering/variations/components/Headline.js +94 -0
  203. package/routes/app/offers/scripts/rendering/variations/components/MultiFieldForm.js +302 -0
  204. package/routes/app/offers/scripts/rendering/variations/components/Tooltip.js +74 -0
  205. package/routes/app/offers/scripts/rendering/variations/icons.js +15 -0
  206. package/routes/app/offers/scripts/utils.js +115 -0
  207. package/routes/app/offers/utils/HTMLUtils.js +10 -0
  208. package/routes/app/offers/utils/createTypeGuard.js +32 -0
  209. package/routes/app/offers/utils/promise-utils.js +22 -0
  210. package/routes/app/websiteBuilder/stores/storeHelpers.js +18 -0
  211. package/sounds/message-initial.mp3 +0 -0
  212. package/sounds/message-received.mp3 +0 -0
  213. package/sounds/message-sent.mp3 +0 -0
  214. package/src/arrays.js +15 -0
  215. package/src/audio.js +106 -0
  216. package/src/bounded-set.js +16 -0
  217. package/src/bounding_box_observer.js +129 -0
  218. package/src/decorators.js +29 -0
  219. package/src/dom.js +128 -0
  220. package/src/dom_roots.js +26 -0
  221. package/src/embedded_forms/EmbeddedForm.js +638 -0
  222. package/src/embedded_forms/QualifiedEmbeddedForm.js +51 -0
  223. package/src/embedded_forms/QualifiedFormField.js +137 -0
  224. package/src/embedded_forms/utils.js +17 -0
  225. package/src/graphql-types.js +1686 -0
  226. package/src/iframes.js +86 -0
  227. package/src/localstorage.js +43 -0
  228. package/src/mirror/Shipper.js +133 -0
  229. package/src/mirror/constants.generated.js +13 -0
  230. package/src/mirror/constants.js +238 -0
  231. package/src/mirror/shipper/ChangeQueue.js +155 -0
  232. package/src/mirror/shipper/DOMSerializer.js +392 -0
  233. package/src/mirror/shipper/observers.js +441 -0
  234. package/src/mirror/shipper/utils.js +98 -0
  235. package/src/mixins/disposable.js +125 -0
  236. package/src/mixins/injectable.js +37 -0
  237. package/src/personalizations/personalization-manager.js +110 -0
  238. package/src/personalizations/strategies/node-freezing-strategy.js +174 -0
  239. package/src/personalizations/utils.js +187 -0
  240. package/src/promises.js +107 -0
  241. package/src/proxy.js +144 -0
  242. package/src/qualified_root.js +35 -0
  243. package/src/query_params.js +55 -0
  244. package/src/shadow-dom-helper.js +63 -0
  245. package/src/singleton_host.js +39 -0
  246. package/src/smart_website/trigger.js +49 -0
  247. package/src/smart_website/utils.js +149 -0
  248. package/src/string.js +53 -0
  249. package/src/timezone.js +57 -0
  250. package/src/timing.js +49 -0
  251. package/src/type-utils.js +76 -0
  252. package/src/url-utils.js +102 -0
  253. package/src/url.js +50 -0
  254. package/src/utils.js +72 -0
  255. package/src/validation.js.js +29 -0
  256. package/src/validation_ts.js +6 -0
  257. package/vendor/actioncable/adapters.js +6 -0
  258. package/vendor/actioncable/connection.js +204 -0
  259. package/vendor/actioncable/connection_monitor.js +129 -0
  260. package/vendor/actioncable/consumer.js +91 -0
  261. package/vendor/actioncable/index.js +34 -0
  262. package/vendor/actioncable/internal.js +22 -0
  263. package/vendor/actioncable/logger.js +28 -0
  264. package/vendor/actioncable/subscription.js +93 -0
  265. package/vendor/actioncable/subscriptions.js +89 -0
  266. package/vendor/open-telemetry-idgenerator.js +43 -0
  267. package/widget/analytics/facebook_tracker.js +8 -0
  268. package/widget/analytics/google_analytics_tracker.js +83 -0
  269. package/widget/analytics/google_tag_manager_tracker.js +22 -0
  270. package/widget/analytics.js +58 -0
  271. package/widget/api_handler/api_handler.js +730 -0
  272. package/widget/api_handler/base_api_handler.js +249 -0
  273. package/widget/booker_intent_tracker.js +391 -0
  274. package/widget/booker_outcome_tracker.js +329 -0
  275. package/widget/capture_widget_exceptions.js +150 -0
  276. package/widget/channel.js +282 -0
  277. package/widget/composite_experience_adapter.js +101 -0
  278. package/widget/constants.generated.js +350 -0
  279. package/widget/constants.js +21 -0
  280. package/widget/container.js +193 -0
  281. package/widget/content_activity_emitter.js +36 -0
  282. package/widget/data360_visitor.js +67 -0
  283. package/widget/date_provider.js +11 -0
  284. package/widget/debug_mode_state.js +175 -0
  285. package/widget/dummy_module.js +9 -0
  286. package/widget/eloqua_visitor.js +17 -0
  287. package/widget/form_cta_booker_intent.js +246 -0
  288. package/widget/hubspot_visitor.js +39 -0
  289. package/widget/inline_meeting_booker_page.js +90 -0
  290. package/widget/local_state/abstract_local_state.js +38 -0
  291. package/widget/local_state/debug_state/abstract_debug_flow.js +29 -0
  292. package/widget/local_state/debug_state/custom_form_flow.js +14 -0
  293. package/widget/local_state/debug_state/hubspot_form_flow.js +19 -0
  294. package/widget/local_state/debug_state/hubspot_v4_form_flow.js +19 -0
  295. package/widget/local_state/debug_state/marketo_form_flow.js +20 -0
  296. package/widget/local_state/debug_state/pardot_form_flow.js +18 -0
  297. package/widget/local_state/debug_state.js +362 -0
  298. package/widget/local_state/trace_state.js +20 -0
  299. package/widget/location_provider.js +9 -0
  300. package/widget/marketo_visitor.js +39 -0
  301. package/widget/meetings/tracing/buttons_forms_triggering_tracer.js +124 -0
  302. package/widget/meetings/tracing/spans/button_spans.js +18 -0
  303. package/widget/meetings/tracing/spans/form_spans.js +11 -0
  304. package/widget/multimodal_v2/assets_preloader.js +97 -0
  305. package/widget/multimodal_v2/components/AppLayout.js +93 -0
  306. package/widget/multimodal_v2/components/CursorOverlay.js +93 -0
  307. package/widget/multimodal_v2/components/PointerRectOverlay.js +74 -0
  308. package/widget/multimodal_v2/components/app/Artifact.js +109 -0
  309. package/widget/multimodal_v2/components/app/Background.js +27 -0
  310. package/widget/multimodal_v2/components/app/CalendarLoadingContent.js +255 -0
  311. package/widget/multimodal_v2/components/app/Chat.js +39 -0
  312. package/widget/multimodal_v2/components/app/CookieConsentModal.js +149 -0
  313. package/widget/multimodal_v2/components/app/Foreground.js +48 -0
  314. package/widget/multimodal_v2/components/app/HiddenInput.js +41 -0
  315. package/widget/multimodal_v2/components/app/Input.js +72 -0
  316. package/widget/multimodal_v2/components/app/LightboxExperience.js +769 -0
  317. package/widget/multimodal_v2/components/app/LoadingOverlay.js +97 -0
  318. package/widget/multimodal_v2/components/app/Main.js +985 -0
  319. package/widget/multimodal_v2/components/app/MessengerButton.js +160 -0
  320. package/widget/multimodal_v2/components/app/Multimodal.js +17 -0
  321. package/widget/multimodal_v2/components/app/OverlayControls.js +79 -0
  322. package/widget/multimodal_v2/components/app/Preview.js +32 -0
  323. package/widget/multimodal_v2/components/app/PrivacyDisclosure.js +57 -0
  324. package/widget/multimodal_v2/components/app/RotateDeviceOverlay.js +70 -0
  325. package/widget/multimodal_v2/components/app/Toolbar.js +156 -0
  326. package/widget/multimodal_v2/components/chat/ChatComposer.js +129 -0
  327. package/widget/multimodal_v2/components/chat/ChatInputForm.js +398 -0
  328. package/widget/multimodal_v2/components/chat/ColdStartQuestions.js +354 -0
  329. package/widget/multimodal_v2/components/chat/ComposerErrorBanner.js +62 -0
  330. package/widget/multimodal_v2/components/chat/PostCallSurvey.js +359 -0
  331. package/widget/multimodal_v2/components/chat/preview/FieldRequestRenderer.js +41 -0
  332. package/widget/multimodal_v2/components/chat/preview/PreviewMessageRenderer.js +60 -0
  333. package/widget/multimodal_v2/components/chat/preview/SharedOfferRenderer.js +143 -0
  334. package/widget/multimodal_v2/components/chat/preview/TextRenderer.js +27 -0
  335. package/widget/multimodal_v2/components/chat/preview/TimelinePreview.js +254 -0
  336. package/widget/multimodal_v2/components/chat/timeline/CalendarEventOfferRenderer.js +103 -0
  337. package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +148 -0
  338. package/widget/multimodal_v2/components/chat/timeline/FieldEntryRenderer.js +84 -0
  339. package/widget/multimodal_v2/components/chat/timeline/FieldRequestRenderer.js +56 -0
  340. package/widget/multimodal_v2/components/chat/timeline/InlinePrivacyDisclosure.js +66 -0
  341. package/widget/multimodal_v2/components/chat/timeline/LinkPreviewCard.js +70 -0
  342. package/widget/multimodal_v2/components/chat/timeline/MessageEntry.js +88 -0
  343. package/widget/multimodal_v2/components/chat/timeline/PresentContentRenderer.js +30 -0
  344. package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +279 -0
  345. package/widget/multimodal_v2/components/chat/timeline/PresentVideoRenderer.js +131 -0
  346. package/widget/multimodal_v2/components/chat/timeline/ShareContentRenderer.js +59 -0
  347. package/widget/multimodal_v2/components/chat/timeline/SharedOfferRenderer.js +131 -0
  348. package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +82 -0
  349. package/widget/multimodal_v2/components/chat/timeline/TextRenderer.js +66 -0
  350. package/widget/multimodal_v2/components/chat/timeline/Timeline.js +158 -0
  351. package/widget/multimodal_v2/components/debug/DebugMultimodalPanel.js +327 -0
  352. package/widget/multimodal_v2/components/decks/index.js +160 -0
  353. package/widget/multimodal_v2/components/field_request/BooleanField.js +77 -0
  354. package/widget/multimodal_v2/components/field_request/FieldComponents.js +69 -0
  355. package/widget/multimodal_v2/components/field_request/Form.js +87 -0
  356. package/widget/multimodal_v2/components/field_request/MultiPicklistField.js +240 -0
  357. package/widget/multimodal_v2/components/field_request/PicklistField.js +166 -0
  358. package/widget/multimodal_v2/components/field_request/SingleLineInputField.js +69 -0
  359. package/widget/multimodal_v2/components/field_request/TextField.js +37 -0
  360. package/widget/multimodal_v2/components/field_request/index.js +170 -0
  361. package/widget/multimodal_v2/components/helpers/AutoScroll.js +37 -0
  362. package/widget/multimodal_v2/components/helpers/ErrorBoundary.js +53 -0
  363. package/widget/multimodal_v2/components/helpers/FocusTrapDialog.js +26 -0
  364. package/widget/multimodal_v2/components/helpers/ImpressionTracker.js +94 -0
  365. package/widget/multimodal_v2/components/helpers/ListRenderer.js +37 -0
  366. package/widget/multimodal_v2/components/helpers/Localization.js +76 -0
  367. package/widget/multimodal_v2/components/helpers/Persisted.js +166 -0
  368. package/widget/multimodal_v2/components/helpers/RichText.js +358 -0
  369. package/widget/multimodal_v2/components/helpers/ScreenReaderHeading.js +17 -0
  370. package/widget/multimodal_v2/components/helpers/Thumbnail.js +190 -0
  371. package/widget/multimodal_v2/components/helpers/VisuallyHidden.js +41 -0
  372. package/widget/multimodal_v2/components/helpers/content_click_payloads.js +58 -0
  373. package/widget/multimodal_v2/components/helpers/useDraggable.js +103 -0
  374. package/widget/multimodal_v2/components/helpers/useTextOverflow.js +44 -0
  375. package/widget/multimodal_v2/components/lightbox_gather/index.js +741 -0
  376. package/widget/multimodal_v2/components/meetings/ArtifactEntryPoint.js +252 -0
  377. package/widget/multimodal_v2/components/meetings/MeetingAdditionalAttendees.js +325 -0
  378. package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +100 -0
  379. package/widget/multimodal_v2/components/meetings/MeetingDetailsCard.js +99 -0
  380. package/widget/multimodal_v2/components/meetings/MeetingErrorBanner.js +62 -0
  381. package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +239 -0
  382. package/widget/multimodal_v2/components/meetings/MeetingOfferFooter.js +104 -0
  383. package/widget/multimodal_v2/components/meetings/MeetingOfferSelectionStep.js +60 -0
  384. package/widget/multimodal_v2/components/meetings/MeetingRepHeader.js +222 -0
  385. package/widget/multimodal_v2/components/meetings/MeetingStepShell.js +92 -0
  386. package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +515 -0
  387. package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +603 -0
  388. package/widget/multimodal_v2/components/meetings/MonthDatePicker.js +422 -0
  389. package/widget/multimodal_v2/components/meetings/NavigationButtons.js +76 -0
  390. package/widget/multimodal_v2/components/meetings/TimeSlotHeader.js +357 -0
  391. package/widget/multimodal_v2/components/meetings/WeekViewHeader.js +20 -0
  392. package/widget/multimodal_v2/components/meetings/constants.js +7 -0
  393. package/widget/multimodal_v2/components/meetings/index.js +47 -0
  394. package/widget/multimodal_v2/components/meetings/utils.js +328 -0
  395. package/widget/multimodal_v2/components/multimodal/Audio.js +28 -0
  396. package/widget/multimodal_v2/components/multimodal/Controls.js +188 -0
  397. package/widget/multimodal_v2/components/multimodal/LiveVideo.js +63 -0
  398. package/widget/multimodal_v2/components/multimodal/MultiModalComponent.js +424 -0
  399. package/widget/multimodal_v2/components/multimodal/MultimodalAvatar.js +36 -0
  400. package/widget/multimodal_v2/components/multimodal/OrbAvatar.js +326 -0
  401. package/widget/multimodal_v2/components/multimodal/Status.js +220 -0
  402. package/widget/multimodal_v2/components/multimodal/VideoAvatar.js +24 -0
  403. package/widget/multimodal_v2/components/multimodal/VideoPreview.js +114 -0
  404. package/widget/multimodal_v2/components/multimodal/useAudioLevelMonitoring.js +96 -0
  405. package/widget/multimodal_v2/components/multimodal/useMultimodal.js +434 -0
  406. package/widget/multimodal_v2/components/presentations/index.js +372 -0
  407. package/widget/multimodal_v2/components/shared/Avatar.js +92 -0
  408. package/widget/multimodal_v2/components/shared/AvatarGroup.js +135 -0
  409. package/widget/multimodal_v2/components/shared/Button.js +245 -0
  410. package/widget/multimodal_v2/components/shared/ButtonGroup.js +133 -0
  411. package/widget/multimodal_v2/components/shared/ComposerForm.js +98 -0
  412. package/widget/multimodal_v2/components/shared/SpeakingIndicator.js +239 -0
  413. package/widget/multimodal_v2/components/shared/ThinkingAnimation.js +165 -0
  414. package/widget/multimodal_v2/components/shared/Tooltip.js +266 -0
  415. package/widget/multimodal_v2/components/shared/controls/Dropdown.js +79 -0
  416. package/widget/multimodal_v2/components/shared/controls/PillToggle.js +142 -0
  417. package/widget/multimodal_v2/components/shared/controls/TextArea.js +114 -0
  418. package/widget/multimodal_v2/components/shared/toolCallLabels.js +12 -0
  419. package/widget/multimodal_v2/components/slides/SlidesThumbnail.js +47 -0
  420. package/widget/multimodal_v2/components/slides/index.js +61 -0
  421. package/widget/multimodal_v2/constants.js +88 -0
  422. package/widget/multimodal_v2/host.split-css.js +2 -0
  423. package/widget/multimodal_v2/host.string.js +96 -0
  424. package/widget/multimodal_v2/images/icons.js +582 -0
  425. package/widget/multimodal_v2/images/posters/piper_low_res.jpg +0 -0
  426. package/widget/multimodal_v2/index.js +23 -0
  427. package/widget/multimodal_v2/index.panda.js +28 -0
  428. package/widget/multimodal_v2/index.split-css.panda.js +2 -0
  429. package/widget/multimodal_v2/inline_meeting_booker.js +182 -0
  430. package/widget/multimodal_v2/locales/cs.js +196 -0
  431. package/widget/multimodal_v2/locales/da.js +196 -0
  432. package/widget/multimodal_v2/locales/de.js +196 -0
  433. package/widget/multimodal_v2/locales/en.js +196 -0
  434. package/widget/multimodal_v2/locales/en_AU.js +197 -0
  435. package/widget/multimodal_v2/locales/en_GB.js +197 -0
  436. package/widget/multimodal_v2/locales/es.js +197 -0
  437. package/widget/multimodal_v2/locales/es_LA.js +196 -0
  438. package/widget/multimodal_v2/locales/fi.js +196 -0
  439. package/widget/multimodal_v2/locales/fr.js +197 -0
  440. package/widget/multimodal_v2/locales/fr_CA.js +196 -0
  441. package/widget/multimodal_v2/locales/id.js +196 -0
  442. package/widget/multimodal_v2/locales/index.js +48 -0
  443. package/widget/multimodal_v2/locales/it.js +196 -0
  444. package/widget/multimodal_v2/locales/ja.js +196 -0
  445. package/widget/multimodal_v2/locales/ko.js +196 -0
  446. package/widget/multimodal_v2/locales/nb.js +196 -0
  447. package/widget/multimodal_v2/locales/nl.js +196 -0
  448. package/widget/multimodal_v2/locales/pl.js +196 -0
  449. package/widget/multimodal_v2/locales/pt_BR.js +196 -0
  450. package/widget/multimodal_v2/locales/ru.js +196 -0
  451. package/widget/multimodal_v2/locales/sv.js +196 -0
  452. package/widget/multimodal_v2/locales/th.js +196 -0
  453. package/widget/multimodal_v2/locales/tr.js +196 -0
  454. package/widget/multimodal_v2/locales/vi.js +196 -0
  455. package/widget/multimodal_v2/locales/zh_CN.js +196 -0
  456. package/widget/multimodal_v2/locales/zh_TW.js +196 -0
  457. package/widget/multimodal_v2/multimodal.js +633 -0
  458. package/widget/multimodal_v2/multimodal_channel.js +195 -0
  459. package/widget/multimodal_v2/signals/active_conversation_signal.js +33 -0
  460. package/widget/multimodal_v2/signals/allowed_conversation_mode_signal.js +38 -0
  461. package/widget/multimodal_v2/signals/artifact_signal.js +22 -0
  462. package/widget/multimodal_v2/signals/layout_signal.js +98 -0
  463. package/widget/multimodal_v2/signals/messages_signal.js +207 -0
  464. package/widget/multimodal_v2/signals/ui_state_signal.js +128 -0
  465. package/widget/multimodal_v2/stable_bundle_src.js +44 -0
  466. package/widget/multimodal_v2/stores/ai_conversation_store.js +221 -0
  467. package/widget/multimodal_v2/stores/artifact_store.js +205 -0
  468. package/widget/multimodal_v2/stores/base_store.js +16 -0
  469. package/widget/multimodal_v2/stores/call_store.js +770 -0
  470. package/widget/multimodal_v2/stores/call_ui_adapter.js +225 -0
  471. package/widget/multimodal_v2/stores/debug_multimodal_scenario_store.js +471 -0
  472. package/widget/multimodal_v2/stores/decks_store.js +285 -0
  473. package/widget/multimodal_v2/stores/device_store.js +63 -0
  474. package/widget/multimodal_v2/stores/docking_store.js +62 -0
  475. package/widget/multimodal_v2/stores/field_request_store.js +326 -0
  476. package/widget/multimodal_v2/stores/meeting_store.js +477 -0
  477. package/widget/multimodal_v2/stores/participant_store.js +73 -0
  478. package/widget/multimodal_v2/stores/post_call_survey_store.js +160 -0
  479. package/widget/multimodal_v2/stores/pounce_tracking_store.js +163 -0
  480. package/widget/multimodal_v2/stores/pounce_tracking_store_v2.js +511 -0
  481. package/widget/multimodal_v2/stores/presentations_store.js +111 -0
  482. package/widget/multimodal_v2/stores/root_store.js +1919 -0
  483. package/widget/multimodal_v2/stores/screen_share_store.js +217 -0
  484. package/widget/multimodal_v2/stores/slides_store.js +21 -0
  485. package/widget/multimodal_v2/stores/translation_store.js +185 -0
  486. package/widget/multimodal_v2/stores/ui_store.js +496 -0
  487. package/widget/multimodal_v2/stores/waiting_store.js +159 -0
  488. package/widget/multimodal_v2/stores/website_navigation_store.js +767 -0
  489. package/widget/multimodal_v2/styled-system/css/conditions.js +34 -0
  490. package/widget/multimodal_v2/styled-system/css/css.js +48 -0
  491. package/widget/multimodal_v2/styled-system/css/cva.js +96 -0
  492. package/widget/multimodal_v2/styled-system/css/cx.js +13 -0
  493. package/widget/multimodal_v2/styled-system/css/index.js +15 -0
  494. package/widget/multimodal_v2/styled-system/css/sva.js +69 -0
  495. package/widget/multimodal_v2/styled-system/helpers.js +384 -0
  496. package/widget/multimodal_v2/styled-system/jsx/create-style-context.js +96 -0
  497. package/widget/multimodal_v2/styled-system/jsx/factory-helper.js +19 -0
  498. package/widget/multimodal_v2/styled-system/jsx/factory.js +111 -0
  499. package/widget/multimodal_v2/styled-system/jsx/index.js +12 -0
  500. package/widget/multimodal_v2/styled-system/jsx/is-valid-prop.js +22 -0
  501. package/widget/multimodal_v2/types.js +105 -0
  502. package/widget/multimodal_v2/utils/auto_scroller.js +157 -0
  503. package/widget/multimodal_v2/utils/flip_animation.js +124 -0
  504. package/widget/multimodal_v2/utils/focus_gate.js +237 -0
  505. package/widget/multimodal_v2/utils/locale.js +16 -0
  506. package/widget/multimodal_v2/utils/media_queries.js +30 -0
  507. package/widget/multimodal_v2/utils/multimodal_cache.js +19 -0
  508. package/widget/multimodal_v2/utils/mutation_effect.js +14 -0
  509. package/widget/multimodal_v2/utils/navigation_interceptor.js +205 -0
  510. package/widget/multimodal_v2/utils/navigation_strategies/dom_swap.js +393 -0
  511. package/widget/multimodal_v2/utils/navigation_strategies/index.js +12 -0
  512. package/widget/multimodal_v2/utils/navigation_strategies/lwr.js +61 -0
  513. package/widget/multimodal_v2/utils/navigation_strategies/navigation_utils.js +46 -0
  514. package/widget/multimodal_v2/utils/navigation_strategies/next_js.js +24 -0
  515. package/widget/multimodal_v2/utils/navigation_strategies/wouter_v3.js +15 -0
  516. package/widget/multimodal_v2/utils/objects_map.js +38 -0
  517. package/widget/multimodal_v2/utils/perceived_voice_turn_tracker.js +345 -0
  518. package/widget/multimodal_v2/utils/sanitize_html.js +132 -0
  519. package/widget/multimodal_v2/utils/signals.js +97 -0
  520. package/widget/multimodal_v2/utils/slide_zoom.js +114 -0
  521. package/widget/multimodal_v2/utils/theme_styles.js +137 -0
  522. package/widget/multimodal_v2/utils/url_observer.js +52 -0
  523. package/widget/multimodal_v2/utils/voice_onset_detector.js +127 -0
  524. package/widget/page_mirror.js +89 -0
  525. package/widget/page_view_activity_emitter.js +71 -0
  526. package/widget/pardot_visitor.js +137 -0
  527. package/widget/personalization_observer.js +96 -0
  528. package/widget/personalizations_config.js +160 -0
  529. package/widget/qualified_form/constants.js +23 -0
  530. package/widget/qualified_form/phone_utils.js +38 -0
  531. package/widget/qualified_form/qualified_form_action.js +91 -0
  532. package/widget/qualified_form/qualified_form_action_orchestrator.js +21 -0
  533. package/widget/qualified_form/qualified_form_api.js +471 -0
  534. package/widget/scroll_disabler.js +109 -0
  535. package/widget/server-logger.js +156 -0
  536. package/widget/smart_website_config.js +112 -0
  537. package/widget/telemetry/context.js +75 -0
  538. package/widget/telemetry/index.js +16 -0
  539. package/widget/telemetry/messenger_uptime.js +80 -0
  540. package/widget/telemetry/metrics.js +120 -0
  541. package/widget/telemetry/span.js +82 -0
  542. package/widget/telemetry/telemetry.js +180 -0
  543. package/widget/telemetry/tracer.js +41 -0
  544. package/widget/telemetry/tracing_store.js +310 -0
  545. package/widget/tracker.js +916 -0
  546. package/widget/utils/native_globals.js +129 -0
  547. package/widget/v1_adapter.js +50 -0
  548. package/widget/v2_adapter.js +368 -0
  549. package/widget/visitor/base_visitor_state.js +11 -0
  550. package/widget/visitor/cookie_visitor_state.js +128 -0
  551. package/widget/visitor/in_memory_visitor_state.js +29 -0
  552. package/widget/visitor/visitor_state.js +384 -0
  553. package/widget/visitor.js +356 -0
  554. package/widget/widget/linked_widget_v2.js +227 -0
  555. package/widget/widget/page_mirror_factory.js +22 -0
  556. package/widget/widget/sentry.js +130 -0
  557. package/widget/widget/widget.js +1698 -0
  558. package/widget/widget.split-css.js +2 -0
  559. package/widget/widget_bootstrap.js +97 -0
  560. package/widget/widget_object.js +73 -0
@@ -0,0 +1,633 @@
1
+ import { __webpack_require__ } from "../../js/runtime.js";
2
+ import "./host.string.js";
3
+ import "./index.panda.js";
4
+ import { G, signals_core_module_w, preact_module_, signals_core_module_E } from "../../js/multimodal_v2.js";
5
+ import { BoundingBoxObserver } from "../../src/bounding_box_observer.js";
6
+ import { V2Adapter } from "../v2_adapter.js";
7
+ import { getSentryClient } from "../widget/sentry.js";
8
+ import { default as WidgetObject } from "../widget_object.js";
9
+ import { WIDGET_VISIBLE_ATTRIBUTE, EXTERNAL_CSS_VARIABLES, MULTIMODAL_HOST_Z_INDEX, DOCKED_DOCUMENT_ATTRIBUTE, PINNED_HEADER_SELECTOR, MULTIMODAL_HOST_ID } from "./constants.js";
10
+ import { InlineMeetingBooker } from "./inline_meeting_booker.js";
11
+ import { MultimodalChannel } from "./multimodal_channel.js";
12
+ import { RootStore } from "./stores/root_store.js";
13
+ import { FocusGate } from "./utils/focus_gate.js";
14
+ import { isMobile, isTouchDevice } from "./utils/media_queries.js";
15
+ import { MultimodalCache } from "./utils/multimodal_cache.js";
16
+ import { default as App } from "./index.js";
17
+ import { getQualifiedRoot } from "../../src/qualified_root.js";
18
+ import { createBetterPromise } from "../../src/promises.js";
19
+ import { DisplayMode as types_DisplayMode, MaximizedState as types_MaximizedState, OpenedDisplayMode as types_OpenedDisplayMode } from "./types.js";
20
+ import { mutationEffect } from "./utils/mutation_effect.js";
21
+ import "../utils/native_globals.js";
22
+ import { applyThemeCssVars, createThemeCss } from "./utils/theme_styles.js";
23
+
24
+ const host_string = __webpack_require__("84629");
25
+ var host_string_default = /*#__PURE__*/__webpack_require__.n(host_string);
26
+ const index_panda = __webpack_require__("7709");
27
+ var index_panda_default = /*#__PURE__*/__webpack_require__.n(index_panda);
28
+ /* provided dependency */ var requestAnimationFrame = __webpack_require__(68034).gj;
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ class Multimodal extends WidgetObject {
51
+ /** Public accessor for the RootStore. Used by LinkedWidgetV2 to bind V2Adapter. */ get rootStore() {
52
+ return this._rootStore;
53
+ }
54
+ init() {
55
+ var _window_qualified_docking_setAbortStage, _window_qualified_docking, _window_qualified;
56
+ (_window_qualified = window.qualified) == null ? void 0 : (_window_qualified_docking = _window_qualified.docking) == null ? void 0 : (_window_qualified_docking_setAbortStage = _window_qualified_docking.setAbortStage) == null ? void 0 : _window_qualified_docking_setAbortStage.call(_window_qualified_docking, "init_state");
57
+ // The channel is the persistent event router and mode detector; it outlives
58
+ // UI teardown so a switch back to multimodal can rebuild. The heavy UI
59
+ // (RootStore + shadow host) is created here, torn down/rebuilt via
60
+ // teardownUI()/ensureUI().
61
+ this.multimodalChannel = new MultimodalChannel(this.widget);
62
+ this.initializeChannelListeners();
63
+ this.ensureUI();
64
+ }
65
+ /**
66
+ * (Re)create the multimodal UI: RootStore, shadow host, focus gate, and
67
+ * UI-scoped listeners. No-op if the UI already exists. Called on init and
68
+ * again when the session switches back to the new messenger after a teardown.
69
+ */ ensureUI() {
70
+ if (this._rootStore || !this.multimodalChannel) return;
71
+ const context = {
72
+ experienceAdapter: this.widget.experienceAdapter,
73
+ channel: this.multimodalChannel,
74
+ visitor: this.visitor
75
+ };
76
+ this._rootStore = new RootStore(context, this.config);
77
+ this.host = this.createHost();
78
+ getQualifiedRoot().appendChild(this.host);
79
+ // After mounting: a <link> in a disconnected shadow root is not fetched.
80
+ this.applyShadowCss(this.latestThemeConfig);
81
+ this.initializeFocusGate();
82
+ this.initializeRootStoreListeners();
83
+ void this.renderHost();
84
+ this.setupInlineMeetingBooker();
85
+ }
86
+ /**
87
+ * When the inline_meeting_booker flag is on and the page has a container div
88
+ * tagged with a manual-experience id, render that experience's meeting booker
89
+ * inline into the container (a dedicated shadow host sharing this RootStore)
90
+ * instead of the full-screen lightbox. No-op when the flag is off or no tagged
91
+ * container is present, so existing lightbox behavior is unchanged.
92
+ */ setupInlineMeetingBooker() {
93
+ if (this.inlineMeetingBooker || !this._rootStore) return;
94
+ if (!this.featureFlags.inlineMeetingBooker) return;
95
+ const rootStore = this._rootStore;
96
+ const booker = new InlineMeetingBooker({
97
+ rootStore,
98
+ // Trigger once the tracker is ready to perform (channel connected), not on
99
+ // rootStore.initialized: showExperience works before the multimodal
100
+ // rootStore finishes initializing, and on some pages (no active
101
+ // conversation) `initialized` never flips true, so gating on it would
102
+ // never fire the trigger.
103
+ ready: new Promise((resolve)=>this.tracker.afterInit(resolve)),
104
+ showLoading: ()=>rootStore.showElementConversationLoadingState(),
105
+ triggerExperience: (experienceId)=>this.tracker.showExperience(experienceId),
106
+ // `endLoadingState` is broadcast when the experience halts without a
107
+ // conversation (e.g. a conditional No-Match). Lets the booker clear its
108
+ // spinner instead of loading forever.
109
+ onExperienceEnd: (callback)=>{
110
+ this.channel.on("endLoadingState", callback);
111
+ return ()=>this.channel.off("endLoadingState", callback);
112
+ }
113
+ });
114
+ if (this.latestThemeConfig) booker.applyTheme(this.latestThemeConfig);
115
+ if (booker.mount()) {
116
+ this.inlineMeetingBooker = booker;
117
+ this.bindInlineElementConversationBridge(rootStore);
118
+ }
119
+ }
120
+ /**
121
+ * Routes the top-level channel's element-conversation events into this
122
+ * RootStore so a manually-triggered experience's meeting-booker offer reaches
123
+ * the inline booker.
124
+ *
125
+ * In the code-split bundle the host is the base Widget/ChunkedWidget with a
126
+ * V1Adapter, which never bridges element conversations into multimodal_v2 —
127
+ * without this the inline booker triggers the experience but the offer never
128
+ * arrives and the container spins forever. This lets the feature run under
129
+ * widget_use_code_split_snippet instead of requiring widget_use_v2_bundle.
130
+ *
131
+ * Under a V2Adapter (v2-only bundle) `LinkedWidgetV2` already routes these
132
+ * events into this RootStore, so we skip the store routing there to avoid
133
+ * double-handling. It does NOT apply the offer-payload theme, though, and
134
+ * inline-booker pages have no initState theme, so we still apply the theme on
135
+ * the V2 path — otherwise the booker renders default colors under that bundle.
136
+ *
137
+ * The inline booker triggers its experience only after the widget is ready (by
138
+ * which point this RootStore exists), so — unlike LinkedWidgetV2 — no
139
+ * pending-event queue is needed: the store is always available when events
140
+ * arrive. Mirrors LinkedWidgetV2#handleReceivedElementConversationEvent and
141
+ * #handleElementMessageEvent.
142
+ */ bindInlineElementConversationBridge(rootStore) {
143
+ const routesToStore = !(this.experienceAdapter instanceof V2Adapter);
144
+ // The classic messenger iframe never opens a full-screen lightbox on a page
145
+ // that owns the inline booker: IframeManager suppresses showLightboxLoading
146
+ // and withholds element-conversation events using pageOwnsInlineMeetingBooker,
147
+ // a static page/flag check that is true from first paint (so it also covers a
148
+ // page-reload rebroadcast that fires before multimodal_v2 mounts).
149
+ const onReceived = (eventName, payload)=>{
150
+ if (eventName === "startElementConversationLoadingState") {
151
+ if (routesToStore) rootStore.showElementConversationLoadingState();
152
+ } else if (eventName === "initElementConversation") {
153
+ this.applyElementConversationTheme(payload);
154
+ if (routesToStore) rootStore.handleInitElementConversation(payload);
155
+ } else if (eventName === "initQualifiedFormElementConversation") {
156
+ this.applyElementConversationTheme(payload);
157
+ if (routesToStore) rootStore.handleInitQualifiedFormElementConversation(payload);
158
+ }
159
+ };
160
+ // In V2 there is no qualified_form_api to bridge elementMessage into the
161
+ // element conversation UI, so gather/offer/text messages that arrive during
162
+ // the loading phase are wrapped as a minimal conversation and handed off.
163
+ // LinkedWidgetV2 does this itself under a V2Adapter, so skip it there.
164
+ const onElementMessage = (payload)=>{
165
+ var _ref;
166
+ var _payload_conversation_script, _payload_conversation, _payload_conversation_script1, _payload_conversation1;
167
+ if (!routesToStore || !rootStore.elementConversationLoading.value) return;
168
+ const botType = (_ref = payload == null ? void 0 : (_payload_conversation = payload.conversation) == null ? void 0 : (_payload_conversation_script = _payload_conversation.script) == null ? void 0 : _payload_conversation_script.botType) != null ? _ref : payload == null ? void 0 : (_payload_conversation1 = payload.conversation) == null ? void 0 : (_payload_conversation_script1 = _payload_conversation1.script) == null ? void 0 : _payload_conversation_script1.bot_type;
169
+ const isQualifiedFormGather = (payload == null ? void 0 : payload.type) === "lightbox_gather" && botType === "form";
170
+ if ((payload == null ? void 0 : payload.type) === "lightbox_gather" && !isQualifiedFormGather) {
171
+ var _payload_conversationId;
172
+ rootStore.handleInitElementConversation({
173
+ id: (_payload_conversationId = payload.conversationId) != null ? _payload_conversationId : payload.conversation_id,
174
+ messages: [
175
+ payload
176
+ ]
177
+ });
178
+ } else if ((payload == null ? void 0 : payload.type) === "calendar_event_offer") {
179
+ rootStore.handleInitQualifiedFormElementConversation({
180
+ messages: [
181
+ payload
182
+ ]
183
+ });
184
+ } else if ((payload == null ? void 0 : payload.type) === "text") {
185
+ rootStore.handleElementConversationTextMessage(payload);
186
+ }
187
+ };
188
+ this.channel.on("received", onReceived);
189
+ this.channel.on("elementMessage", onElementMessage);
190
+ this.uiDisposers.push(()=>{
191
+ this.channel.off("received", onReceived);
192
+ this.channel.off("elementMessage", onElementMessage);
193
+ });
194
+ }
195
+ /**
196
+ * Applies the messenger theme colors delivered with an element-conversation
197
+ * offer. The inline booker renders on pages with no active new-messenger
198
+ * conversation, so the usual `initState` themeConfig never arrives and the
199
+ * Panda tokens would fall back to their defaults. The server ships the
200
+ * hostname-matched theme on the offer payload (gated by the
201
+ * inline_meeting_booker flag); apply it to the inline (and main) host before
202
+ * the booker renders so it never flashes default colors. No-op when absent.
203
+ */ applyElementConversationTheme(payload) {
204
+ const themeConfig = payload == null ? void 0 : payload.themeConfig;
205
+ if (themeConfig) this.applyThemeConfig(themeConfig);
206
+ }
207
+ /**
208
+ * Store the latest theme and apply it to both the main host and the inline
209
+ * booker. Shared by the initState broadcast and the element-conversation offer
210
+ * payload (the inline booker's theme source when there is no active messenger
211
+ * conversation).
212
+ */ applyThemeConfig(themeConfig) {
213
+ var _this_inlineMeetingBooker;
214
+ this.latestThemeConfig = themeConfig;
215
+ this.applyShadowCss(themeConfig);
216
+ (_this_inlineMeetingBooker = this.inlineMeetingBooker) == null ? void 0 : _this_inlineMeetingBooker.applyTheme(themeConfig);
217
+ }
218
+ /**
219
+ * Tear down the multimodal UI (RootStore, shadow host, listeners) while
220
+ * keeping the channel alive. Used when the session switches to the legacy
221
+ * messenger so the new messenger stops rendering, without losing the ability
222
+ * to rebuild it if the session switches back.
223
+ *
224
+ * `rebuildable` (default true) resets `ready` to a fresh pending promise so a
225
+ * later ensureUI() can resolve it again. Full disposal passes false so awaiters
226
+ * (startCall/startChat) settle instead of hanging on a promise nothing resolves.
227
+ */ teardownUI(param) {
228
+ let { rebuildable = true } = param === void 0 ? {} : param;
229
+ var _this_inlineMeetingBooker, _this__rootStore, _this_host;
230
+ if (!this._rootStore && !this.host) {
231
+ if (!rebuildable && !this.ready.isSettled) {
232
+ this.ready.reject(new Error("disposed"));
233
+ }
234
+ return;
235
+ }
236
+ if (!this.ready.isSettled) {
237
+ this.ready.reject(new Error(rebuildable ? "torn down" : "disposed"));
238
+ }
239
+ if (rebuildable) {
240
+ this.ready = createBetterPromise();
241
+ }
242
+ this.uiDisposers.forEach((dispose)=>dispose());
243
+ this.uiDisposers = [];
244
+ (_this_inlineMeetingBooker = this.inlineMeetingBooker) == null ? void 0 : _this_inlineMeetingBooker.dispose();
245
+ this.inlineMeetingBooker = null;
246
+ this.focusGate.dispose();
247
+ this.pageHeaderObserver.stop();
248
+ (_this__rootStore = this._rootStore) == null ? void 0 : _this__rootStore.dispose();
249
+ (_this_host = this.host) == null ? void 0 : _this_host.remove();
250
+ this._rootStore = null;
251
+ this.host = null;
252
+ MultimodalCache.clear();
253
+ }
254
+ cleanup() {
255
+ var _this_multimodalChannel;
256
+ this.teardownUI({
257
+ rebuildable: false
258
+ });
259
+ (_this_multimodalChannel = this.multimodalChannel) == null ? void 0 : _this_multimodalChannel.dispose();
260
+ this.multimodalChannel = null;
261
+ }
262
+ async startCall(param) {
263
+ let { maximized = false, state } = param === void 0 ? {} : param;
264
+ var _this__rootStore;
265
+ if ((_this__rootStore = this._rootStore) == null ? void 0 : _this__rootStore.callInProgress.peek()) return;
266
+ // `maximized` is the deprecated spelling of `state`; `state` wins when both are given.
267
+ const displayState = state != null ? state : maximized ? "maximized" : "open";
268
+ try {
269
+ var // applied here, so it survives the cookie-consent detour and is skipped
270
+ // entirely when the store declines to start a call.
271
+ _this__rootStore_getCallUiAdapter, _this__rootStore1;
272
+ await this.ready;
273
+ (_this__rootStore1 = this._rootStore) == null ? void 0 : (_this__rootStore_getCallUiAdapter = _this__rootStore1.getCallUiAdapter()) == null ? void 0 : _this__rootStore_getCallUiAdapter.actions.startCall(undefined, displayState);
274
+ } catch (error) {
275
+ var _getSentryClient;
276
+ (_getSentryClient = getSentryClient({
277
+ project: "multimodal"
278
+ })) == null ? void 0 : _getSentryClient.captureException(error);
279
+ }
280
+ }
281
+ async startChat(param) {
282
+ let { initialMessage, position } = param === void 0 ? {} : param;
283
+ try {
284
+ await this.ready;
285
+ if (position) {
286
+ var _this__rootStore, // (setOpenedDisplayMode) reopen at the position the caller requested.
287
+ _this__rootStore1;
288
+ (_this__rootStore = this._rootStore) == null ? void 0 : _this__rootStore.setDisplayMode(position === "pinned" ? types_DisplayMode.DOCKED : types_DisplayMode.SIDEBAR);
289
+ (_this__rootStore1 = this._rootStore) == null ? void 0 : _this__rootStore1.updateOpenedDisplayMode(position === "pinned" ? types_OpenedDisplayMode.DOCKED : types_OpenedDisplayMode.SIDEBAR);
290
+ } else {
291
+ var _this__rootStore2;
292
+ (_this__rootStore2 = this._rootStore) == null ? void 0 : _this__rootStore2.setOpenedDisplayMode();
293
+ }
294
+ if (initialMessage) {
295
+ var _this__rootStore3;
296
+ (_this__rootStore3 = this._rootStore) == null ? void 0 : _this__rootStore3.sendVisitorText(initialMessage);
297
+ }
298
+ } catch (error) {
299
+ var _getSentryClient;
300
+ (_getSentryClient = getSentryClient({
301
+ project: "multimodal"
302
+ })) == null ? void 0 : _getSentryClient.captureException(error);
303
+ }
304
+ }
305
+ initializeChannelListeners() {
306
+ this.multimodalChannel.on("initState", (payload)=>{
307
+ if (payload.themeConfig) this.applyThemeConfig(payload.themeConfig);
308
+ });
309
+ }
310
+ initializeFocusGate() {
311
+ var _this_config, _this_config1;
312
+ const rootStore = this._rootStore;
313
+ const { t } = rootStore.translationStore;
314
+ const aiName = signals_core_module_w(()=>{
315
+ var _ref;
316
+ var _rootStore_activeConversation_aiSdr_value;
317
+ return (_ref = (_rootStore_activeConversation_aiSdr_value = rootStore.activeConversation.aiSdr.value) == null ? void 0 : _rootStore_activeConversation_aiSdr_value.name) != null ? _ref : "AI";
318
+ });
319
+ this.focusGate.init({
320
+ host: this.host,
321
+ selector: (_this_config = this.config) == null ? void 0 : _this_config.focusRelaySelector,
322
+ position: (_this_config1 = this.config) == null ? void 0 : _this_config1.focusRelayPosition,
323
+ isDialogActive: rootStore.layout.additionalState.isDialogActive,
324
+ labels: {
325
+ entryGate: signals_core_module_w(()=>t("focusGate.entryGate", {
326
+ name: aiName.value
327
+ })),
328
+ exitGate: signals_core_module_w(()=>t("focusGate.exitGate", {
329
+ name: aiName.value
330
+ })),
331
+ startGuard: signals_core_module_w(()=>t("focusGate.startGuard", {
332
+ name: aiName.value
333
+ })),
334
+ endGuard: signals_core_module_w(()=>t("focusGate.endGuard", {
335
+ name: aiName.value
336
+ }))
337
+ }
338
+ });
339
+ }
340
+ initializeRootStoreListeners() {
341
+ this.uiDisposers.push(this._rootStore.initialized.subscribe((initialized)=>{
342
+ if (initialized) {
343
+ this.ready.resolve();
344
+ }
345
+ }));
346
+ this.uiDisposers.push(signals_core_module_E(()=>this.syncWidgetVisible()));
347
+ this.uiDisposers.push(signals_core_module_E(()=>this.syncHostZIndex()));
348
+ this.uiDisposers.push(signals_core_module_E(()=>this.syncPageHeaderObserver()));
349
+ this.uiDisposers.push(mutationEffect(()=>this.syncDockedMode(), document.documentElement, {
350
+ attributes: true,
351
+ attributeFilter: [
352
+ DOCKED_DOCUMENT_ATTRIBUTE
353
+ ]
354
+ }));
355
+ }
356
+ syncWidgetVisible() {
357
+ if (!this._rootStore) return;
358
+ document.documentElement.toggleAttribute(WIDGET_VISIBLE_ATTRIBUTE, this._rootStore.layout.root.visible.value);
359
+ }
360
+ // Mirror the docking layer's `q-docked` mode value onto the host element so the
361
+ // widget's shadow-DOM Panda CSS can gate on it via `:host([q-docked="..."])`
362
+ // (an `html[...]` selector can't reach across the shadow boundary).
363
+ syncDockedMode() {
364
+ if (!this.host) return;
365
+ const mode = document.documentElement.getAttribute(DOCKED_DOCUMENT_ATTRIBUTE);
366
+ if (mode) {
367
+ this.host.setAttribute(DOCKED_DOCUMENT_ATTRIBUTE, mode);
368
+ } else {
369
+ this.host.removeAttribute(DOCKED_DOCUMENT_ATTRIBUTE);
370
+ }
371
+ }
372
+ /**
373
+ * Keep the floating widget below the host page's header. Only sidebar mode on
374
+ * non-mobile viewports consumes the page-header top offset, so we only pay for
375
+ * the observers (ResizeObserver/scroll/click) while that layout is active.
376
+ */ syncPageHeaderObserver() {
377
+ if (!this._rootStore) return;
378
+ if (this._rootStore.displayMode.sidebar.value && !isMobile.value) {
379
+ this.pageHeaderObserver.start();
380
+ } else {
381
+ this.pageHeaderObserver.stop();
382
+ }
383
+ }
384
+ async renderHost() {
385
+ const { host, _rootStore: rootStore } = this;
386
+ if (!host || !rootStore) return;
387
+ if (window.__qualifiedSplitCss) {
388
+ host.style.visibility = "hidden";
389
+ await this.prepareSplitCssStylesheets();
390
+ // `cleanup()` can null out the current host/store while split CSS is still loading.
391
+ // Bail out rather than rendering into a stale or detached shadow root.
392
+ if (this.host !== host || this._rootStore !== rootStore || !host.shadowRoot) return;
393
+ }
394
+ G(preact_module_(App, {
395
+ rootStore
396
+ }), host.shadowRoot);
397
+ if (window.__qualifiedSplitCss) {
398
+ requestAnimationFrame(()=>{
399
+ if (this.host === host) {
400
+ host.style.visibility = "";
401
+ }
402
+ });
403
+ }
404
+ }
405
+ syncHostZIndex() {
406
+ if (!this.host || !this._rootStore) return;
407
+ if (this._rootStore.maximizedState.value !== types_MaximizedState.NONE || isMobile.value && !this._rootStore.displayMode.minimized.value) {
408
+ this.host.style.zIndex = String(MULTIMODAL_HOST_Z_INDEX.maximized);
409
+ } else if (this._rootStore.displayMode.minimized.value && !this._rootStore.uiStore.isPiP.value) {
410
+ const customZIndex = getComputedStyle(document.documentElement).getPropertyValue(EXTERNAL_CSS_VARIABLES.minimizedZIndex).trim();
411
+ this.host.style.zIndex = customZIndex || String(MULTIMODAL_HOST_Z_INDEX.minimized);
412
+ } else if (this._rootStore.displayMode.docked.value) {
413
+ this.host.style.zIndex = String(MULTIMODAL_HOST_Z_INDEX.docked);
414
+ } else {
415
+ this.host.style.zIndex = String(MULTIMODAL_HOST_Z_INDEX.expanded);
416
+ }
417
+ }
418
+ createHost() {
419
+ const host = document.createElement("div");
420
+ host.id = MULTIMODAL_HOST_ID;
421
+ this.configureHostStyling(host);
422
+ host.tabIndex = -1;
423
+ host.attachShadow({
424
+ mode: "open",
425
+ delegatesFocus: !isTouchDevice.peek()
426
+ });
427
+ this.trapEvents(host);
428
+ return host;
429
+ }
430
+ /**
431
+ * Installs the widget's stylesheet into the shadow root, carrying the theme's
432
+ * custom properties once one has arrived.
433
+ *
434
+ * Called at host creation too, not just on a theme: the theme is a dozen
435
+ * properties with fallbacks, while the stylesheet is every rule the UI has,
436
+ * and a theme may never come.
437
+ */ applyShadowCss(theme) {
438
+ if (!this.host || !this.host.shadowRoot) return;
439
+ if (window.__qualifiedSplitCss) {
440
+ this.syncSplitCssStylesheets();
441
+ if (!theme) return;
442
+ // Apply theme CSS custom properties on the host element.
443
+ // CSS custom properties inherit through shadow DOM, so these override
444
+ // the defaults in the linked CSS file. This is always CSP-safe
445
+ // (JS property assignment, not style text injection).
446
+ applyThemeCssVars(this.host, theme);
447
+ return;
448
+ }
449
+ const bundledCss = (theme ? createThemeCss(theme) : "") + (index_panda_default());
450
+ const shadow = this.host.shadowRoot;
451
+ if (!this.host.querySelector("#qualified-multimodal-host-css")) {
452
+ const hostCssStyle = document.createElement("style");
453
+ hostCssStyle.id = "qualified-multimodal-host-css";
454
+ hostCssStyle.textContent = (host_string_default());
455
+ this.host.appendChild(hostCssStyle);
456
+ }
457
+ // Constructable stylesheets (adoptedStyleSheets) are unsupported in Safari < 16.4 — `new CSSStyleSheet()` throws.
458
+ let usedAdopted = false;
459
+ if (typeof CSSStyleSheet !== "undefined" && shadow && "adoptedStyleSheets" in shadow && typeof CSSStyleSheet.prototype.replaceSync === "function") {
460
+ try {
461
+ var _shadow_querySelector;
462
+ const stylesheet = new CSSStyleSheet();
463
+ stylesheet.replaceSync(bundledCss);
464
+ shadow.adoptedStyleSheets = [
465
+ stylesheet
466
+ ];
467
+ usedAdopted = true;
468
+ (_shadow_querySelector = shadow.querySelector("#qualified-multimodal-bundled-css")) == null ? void 0 : _shadow_querySelector.remove();
469
+ } catch (unused) {
470
+ // Fall through to <style> injection.
471
+ }
472
+ }
473
+ if (!usedAdopted && shadow) {
474
+ shadow.adoptedStyleSheets = [];
475
+ let bundleEl = shadow.querySelector("#qualified-multimodal-bundled-css");
476
+ if (!bundleEl) {
477
+ bundleEl = document.createElement("style");
478
+ bundleEl.id = "qualified-multimodal-bundled-css";
479
+ shadow.prepend(bundleEl);
480
+ }
481
+ bundleEl.textContent = bundledCss;
482
+ }
483
+ }
484
+ async prepareSplitCssStylesheets() {
485
+ const stylesheets = this.syncSplitCssStylesheets();
486
+ await Promise.all(stylesheets.map((link)=>this.waitForStylesheet(link)));
487
+ }
488
+ syncSplitCssStylesheets() {
489
+ var _this_host;
490
+ if (!((_this_host = this.host) == null ? void 0 : _this_host.shadowRoot)) return [];
491
+ // In split-css mode, component styles are delivered via a <link> in the document.
492
+ // Shadow DOM doesn't inherit document-level stylesheets, so we inject <link> elements
493
+ // into the shadow root pointing to the same CSS files.
494
+ // The browser should reuse the same fetched stylesheet response for that href; this is
495
+ // about applying it inside the shadow root, not forcing a second CSS build artifact.
496
+ // This is CSP-safe: <link rel="stylesheet"> is allowed by style-src 'self'.
497
+ const injected = new Map(Array.from(this.host.shadowRoot.querySelectorAll('link[rel="stylesheet"]')).map((link)=>[
498
+ link.href,
499
+ link
500
+ ]));
501
+ // Matched on the marker attribute alone, not on rel: the self-hosted package loads
502
+ // the CSS as a non-render-blocking rel="preload", and a page can be rendered before
503
+ // that link is promoted to a stylesheet. The shadow link below sets rel="stylesheet"
504
+ // itself, so only the href matters here.
505
+ const links = [];
506
+ for (const link of document.querySelectorAll("link[data-q-stylesheet]")){
507
+ let shadowLink = injected.get(link.href);
508
+ if (!shadowLink) {
509
+ shadowLink = document.createElement("link");
510
+ shadowLink.rel = "stylesheet";
511
+ shadowLink.href = link.href;
512
+ this.host.shadowRoot.prepend(shadowLink);
513
+ }
514
+ links.push(shadowLink);
515
+ }
516
+ return links;
517
+ }
518
+ waitForStylesheet(link) {
519
+ return new Promise((resolve)=>{
520
+ if (link.sheet) {
521
+ resolve();
522
+ return;
523
+ }
524
+ const cleanup = ()=>{
525
+ link.removeEventListener("load", onReady);
526
+ link.removeEventListener("error", onReady);
527
+ window.clearTimeout(timeoutId);
528
+ };
529
+ const onReady = ()=>{
530
+ cleanup();
531
+ resolve();
532
+ };
533
+ const timeoutId = window.setTimeout(onReady, Multimodal.SPLIT_CSS_LOAD_TIMEOUT_MS);
534
+ link.addEventListener("load", onReady, {
535
+ once: true
536
+ });
537
+ link.addEventListener("error", onReady, {
538
+ once: true
539
+ });
540
+ });
541
+ }
542
+ trapEvents(host) {
543
+ const trappedEvents = [
544
+ "wheel"
545
+ ];
546
+ for (const event of trappedEvents){
547
+ host.addEventListener(event, (e)=>{
548
+ // Also blocks any other bubble-phase listener attached to the host element itself.
549
+ e.stopImmediatePropagation();
550
+ // Isolate the widget from host-page listeners (shortcuts, click-outside, custom scroll handlers).
551
+ // Runs in the bubble phase so events first reach the widget's own scroll containers inside
552
+ // the shadow root; we only stop propagation on the way out. `passive: true` is safe because
553
+ // we never `preventDefault()` here, and avoids Chrome's "non-passive wheel listener" warning.
554
+ e.stopPropagation();
555
+ }, {
556
+ passive: true
557
+ });
558
+ }
559
+ // Protect keyboard input from host-page listeners that don't handle Shadow DOM.
560
+ // Many customer sites use smooth scroll libraries or accessibility scripts that intercept
561
+ // spacebar (and other keys) to enable keyboard navigation. These scripts typically check
562
+ // `event.target.nodeName` to skip input fields, but due to Shadow DOM event retargeting,
563
+ // they see the host div instead of the actual textarea inside. This causes them to call
564
+ // `preventDefault()` on spacebar, breaking text input in the widget.
565
+ //
566
+ // We stop propagation only for printable characters and text-editing keys (not navigation
567
+ // keys like Tab, Escape, or Arrow keys, and not modifier combos) when an input/textarea
568
+ // inside the shadow DOM has focus. This allows the widget to receive normal keyboard input
569
+ // while preserving keyboard shortcuts (Ctrl+C, Cmd+V, etc.) and navigation keys that the
570
+ // host page may handle.
571
+ host.addEventListener("keydown", (e)=>{
572
+ var _host_shadowRoot;
573
+ const activeEl = (_host_shadowRoot = host.shadowRoot) == null ? void 0 : _host_shadowRoot.activeElement;
574
+ const isInputFocused = activeEl && /textarea|input/i.test(activeEl.tagName);
575
+ const isModified = e.ctrlKey || e.altKey || e.metaKey;
576
+ const isTextInputKey = e.key.length === 1 || e.key === "Backspace" || e.key === "Delete" || e.key === "Enter";
577
+ if (isInputFocused && !isModified && isTextInputKey) {
578
+ // Prevent host-page scripts (smooth scroll, a11y widgets) from intercepting keyboard input
579
+ e.stopPropagation();
580
+ }
581
+ }, false);
582
+ }
583
+ configureHostStyling(host) {
584
+ // Check for custom z-index via CSS variable for customers who need to position the widget below their UI.
585
+ const customZIndex = getComputedStyle(document.documentElement).getPropertyValue(EXTERNAL_CSS_VARIABLES.minimizedZIndex).trim();
586
+ const initialZIndex = customZIndex || String(MULTIMODAL_HOST_Z_INDEX.minimized);
587
+ // Inline, so the widget overlays the page before the shadow CSS loads.
588
+ // `contain` makes this the containing block for the fixed layouts inside,
589
+ // which then position against it in plain `top: 0` / `right: 0`. The offset
590
+ // escapes the gutter docking carves out of `<html>`. AppLayout takes the
591
+ // pointer events back.
592
+ host.style.cssText = [
593
+ "position: fixed",
594
+ "top: 0",
595
+ "left: 0",
596
+ "bottom: 0",
597
+ "right: var(--q-docked-right-offset, 0px)",
598
+ "contain: layout",
599
+ "pointer-events: none",
600
+ // Only the starting level; syncHostZIndex() re-stacks it per display state.
601
+ "z-index: " + initialZIndex
602
+ ].join("; ");
603
+ }
604
+ // An element only covers the content below it when it is anchored near the top of
605
+ // the viewport (so bottom-anchored sticky bars/CTAs are ignored) AND is not so tall
606
+ // that treating it as a header would shove the widget off-screen (guards full-height
607
+ // hero banners that happen to use `<header>`/`role="banner"`).
608
+ isPinnedToTop(el) {
609
+ const { top, height } = el.getBoundingClientRect();
610
+ return top <= window.innerHeight * 0.25 && height <= window.innerHeight * 0.5;
611
+ }
612
+ constructor(...args){
613
+ super(...args), this.ready = createBetterPromise(), this.host = null, this._rootStore = null, this.multimodalChannel = null, this.inlineMeetingBooker = null, this.latestThemeConfig = null, this.focusGate = new FocusGate(), this.pageHeaderObserver = new BoundingBoxObserver({
614
+ selector: PINNED_HEADER_SELECTOR,
615
+ property: "bottom",
616
+ isValid: (el)=>this.isPinnedToTop(el),
617
+ skipShadowRoot: (root)=>root.host.id === MULTIMODAL_HOST_ID,
618
+ onBBoxChange: (rect)=>{
619
+ const root = document.documentElement;
620
+ if (rect === null) {
621
+ root.style.removeProperty(EXTERNAL_CSS_VARIABLES.floatingTopOffset);
622
+ return;
623
+ }
624
+ root.style.setProperty(EXTERNAL_CSS_VARIABLES.floatingTopOffset, "" + Math.max(0, Math.round(rect.bottom)) + "px");
625
+ }
626
+ }), // can be rebuilt by ensureUI(). Distinct from callOnDispose(), which only fires
627
+ // on full dispose().
628
+ this.uiDisposers = [];
629
+ }
630
+ }
631
+ Multimodal.SPLIT_CSS_LOAD_TIMEOUT_MS = 3000;
632
+
633
+ export { Multimodal };