@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.
- package/41842993ec71d6628e4949e9a22b146b.svg +3 -0
- package/7271f3433ed82fc7f56adcd9e30275f4.svg +17 -0
- package/LICENSE.txt +82 -0
- package/components/helpers/entriesStringValidations.js +69 -0
- package/components/helpers/languages.js +32 -0
- package/components/shared/assertUnreachable.js +5 -0
- package/components/shared/controls/imageCropperHelpers.js +43 -0
- package/components/shared/meetingLoadingProgressSpec.js +116 -0
- package/constants.generated.js +9883 -0
- package/css/widget/multimodal_v2/host.split-css.css +162 -0
- package/css/widget/multimodal_v2/index.split-css.panda.css +5240 -0
- package/css/widget/widget.split-css.css +100 -0
- package/fonts/inter/Inter-Black.woff +0 -0
- package/fonts/inter/Inter-Black.woff2 +0 -0
- package/fonts/inter/Inter-BlackItalic.woff +0 -0
- package/fonts/inter/Inter-BlackItalic.woff2 +0 -0
- package/fonts/inter/Inter-Bold.woff +0 -0
- package/fonts/inter/Inter-Bold.woff2 +0 -0
- package/fonts/inter/Inter-BoldItalic.woff +0 -0
- package/fonts/inter/Inter-BoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBold.woff +0 -0
- package/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLight.woff +0 -0
- package/fonts/inter/Inter-ExtraLight.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Italic.woff +0 -0
- package/fonts/inter/Inter-Italic.woff2 +0 -0
- package/fonts/inter/Inter-Light.woff +0 -0
- package/fonts/inter/Inter-Light.woff2 +0 -0
- package/fonts/inter/Inter-LightItalic.woff +0 -0
- package/fonts/inter/Inter-LightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Medium.woff +0 -0
- package/fonts/inter/Inter-Medium.woff2 +0 -0
- package/fonts/inter/Inter-MediumItalic.woff +0 -0
- package/fonts/inter/Inter-MediumItalic.woff2 +0 -0
- package/fonts/inter/Inter-Regular.woff +0 -0
- package/fonts/inter/Inter-Regular.woff2 +0 -0
- package/fonts/inter/Inter-SemiBold.woff +0 -0
- package/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-Thin.woff +0 -0
- package/fonts/inter/Inter-Thin.woff2 +0 -0
- package/fonts/inter/Inter-ThinItalic.woff +0 -0
- package/fonts/inter/Inter-ThinItalic.woff2 +0 -0
- package/fonts/inter/Inter-italic.var.woff2 +0 -0
- package/fonts/inter/Inter-roman.var.woff2 +0 -0
- package/images/close.js +63 -0
- package/images/logo.js +22 -0
- package/js/4101.js +19721 -0
- package/js/daily-esm.js +9948 -0
- package/js/date-fns.js +427 -0
- package/js/multimodal_v2.js +1653 -0
- package/js/runtime.js +109 -0
- package/media/Inter-Black.796be8d8bf.woff2 +0 -0
- package/media/Inter-Black.b254104c56.woff +0 -0
- package/media/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/media/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/media/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/media/Inter-Bold.b1234477a5.woff +0 -0
- package/media/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/media/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/media/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/media/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/media/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/media/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/media/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/media/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/media/Inter-Italic.9beab78452.woff +0 -0
- package/media/Inter-Italic.d593a8df79.woff2 +0 -0
- package/media/Inter-Light.27083fa637.woff2 +0 -0
- package/media/Inter-Light.91dfddd842.woff +0 -0
- package/media/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/media/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/media/Inter-Medium.dc792b508e.woff2 +0 -0
- package/media/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/media/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/media/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/media/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/media/Inter-Regular.f356e84aa0.woff +0 -0
- package/media/Inter-SemiBold.55027e4724.woff +0 -0
- package/media/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/media/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/media/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/media/Inter-Thin.16325d9b0f.woff +0 -0
- package/media/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/media/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/media/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/media/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/media/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/package.json +20 -0
- package/packs/widget/api/docking/docking_host.js +97 -0
- package/packs/widget/api/docking/index.js +294 -0
- package/packs/widget/api/docking/shared.js +164 -0
- package/packs/widget/api/docking/viewport_lock.js +488 -0
- package/packs/widget/api/docking/viewport_resize.js +1203 -0
- package/packs/widget/esm/fonts/Inter-Black.796be8d8bf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Black.b254104c56.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.b1234477a5.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.9beab78452.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.d593a8df79.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.27083fa637.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.91dfddd842.woff +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.dc792b508e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f356e84aa0.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.55027e4724.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.16325d9b0f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/packs/widget/esm/fonts/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/packs/widget/esm/index.js +183 -0
- package/packs/widget/esm/qualified.css +5502 -0
- package/routes/app/offers/scripts/OfferMainScript.js +154 -0
- package/routes/app/offers/scripts/constants.js +71 -0
- package/routes/app/offers/scripts/main/ButtonManager.js +65 -0
- package/routes/app/offers/scripts/main/FormManager.js +325 -0
- package/routes/app/offers/scripts/main/MainContext.js +19 -0
- package/routes/app/offers/scripts/main/OfferManager.js +91 -0
- package/routes/app/offers/scripts/main/TriggerManager.js +125 -0
- package/routes/app/offers/scripts/rendering/ContentManager.js +53 -0
- package/routes/app/offers/scripts/rendering/LocationManager.js +83 -0
- package/routes/app/offers/scripts/rendering/RenderedOffer.js +188 -0
- package/routes/app/offers/scripts/rendering/Renderer.js +69 -0
- package/routes/app/offers/scripts/rendering/RenderingInitializer.js +62 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManager.js +31 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerFooter.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerHeader.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerModal.js +117 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerSidebar.js +75 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationResult.js +43 -0
- package/routes/app/offers/scripts/rendering/animations/Animator.js +78 -0
- package/routes/app/offers/scripts/rendering/animations/BaseAnimationManager.js +25 -0
- package/routes/app/offers/scripts/rendering/lib/BaseComponent.js +106 -0
- package/routes/app/offers/scripts/rendering/lib/FormComponent.js +134 -0
- package/routes/app/offers/scripts/rendering/lib/OfferComponent.js +144 -0
- package/routes/app/offers/scripts/rendering/lib/ScrollbarWidth.js +27 -0
- package/routes/app/offers/scripts/rendering/lib/decorators.js +20 -0
- package/routes/app/offers/scripts/rendering/locations/CSSVarsManager.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/ElementResizeObserver.js +49 -0
- package/routes/app/offers/scripts/rendering/locations/footer.js +53 -0
- package/routes/app/offers/scripts/rendering/locations/header/AsyncBatchProcessor.js +70 -0
- package/routes/app/offers/scripts/rendering/locations/header/CSSTransitionObserver.js +182 -0
- package/routes/app/offers/scripts/rendering/locations/header/ElementStyleChangeObserver.js +138 -0
- package/routes/app/offers/scripts/rendering/locations/header/ExternalStyleManager.js +110 -0
- package/routes/app/offers/scripts/rendering/locations/header/Header.js +353 -0
- package/routes/app/offers/scripts/rendering/locations/header/InlineStyleManager.js +105 -0
- package/routes/app/offers/scripts/rendering/locations/header/MatchingElementsObserver.js +107 -0
- package/routes/app/offers/scripts/rendering/locations/header/NewElementsObserver.js +129 -0
- package/routes/app/offers/scripts/rendering/locations/header/RuleWrapper.js +46 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObservable.js +23 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObserver.js +61 -0
- package/routes/app/offers/scripts/rendering/locations/header/ShiftedElementsManager.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementManager.js +37 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementWrapper.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectorValue.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectors.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/StyleSelectorObserver.js +294 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/constants.js +21 -0
- package/routes/app/offers/scripts/rendering/locations/header/WindowResizeObserver.js +43 -0
- package/routes/app/offers/scripts/rendering/locations/header/utils.js +25 -0
- package/routes/app/offers/scripts/rendering/locations/popup.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/sidebar.js +21 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonModal.js +114 -0
- package/routes/app/offers/scripts/rendering/variations/FormBanner.js +214 -0
- package/routes/app/offers/scripts/rendering/variations/FormModal.js +325 -0
- package/routes/app/offers/scripts/rendering/variations/LinkBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/components/Body.js +29 -0
- package/routes/app/offers/scripts/rendering/variations/components/Button.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/DismissButton.js +39 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageBanner.js +110 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageModal.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/Headline.js +94 -0
- package/routes/app/offers/scripts/rendering/variations/components/MultiFieldForm.js +302 -0
- package/routes/app/offers/scripts/rendering/variations/components/Tooltip.js +74 -0
- package/routes/app/offers/scripts/rendering/variations/icons.js +15 -0
- package/routes/app/offers/scripts/utils.js +115 -0
- package/routes/app/offers/utils/HTMLUtils.js +10 -0
- package/routes/app/offers/utils/createTypeGuard.js +32 -0
- package/routes/app/offers/utils/promise-utils.js +22 -0
- package/routes/app/websiteBuilder/stores/storeHelpers.js +18 -0
- package/sounds/message-initial.mp3 +0 -0
- package/sounds/message-received.mp3 +0 -0
- package/sounds/message-sent.mp3 +0 -0
- package/src/arrays.js +15 -0
- package/src/audio.js +106 -0
- package/src/bounded-set.js +16 -0
- package/src/bounding_box_observer.js +129 -0
- package/src/decorators.js +29 -0
- package/src/dom.js +128 -0
- package/src/dom_roots.js +26 -0
- package/src/embedded_forms/EmbeddedForm.js +638 -0
- package/src/embedded_forms/QualifiedEmbeddedForm.js +51 -0
- package/src/embedded_forms/QualifiedFormField.js +137 -0
- package/src/embedded_forms/utils.js +17 -0
- package/src/graphql-types.js +1686 -0
- package/src/iframes.js +86 -0
- package/src/localstorage.js +43 -0
- package/src/mirror/Shipper.js +133 -0
- package/src/mirror/constants.generated.js +13 -0
- package/src/mirror/constants.js +238 -0
- package/src/mirror/shipper/ChangeQueue.js +155 -0
- package/src/mirror/shipper/DOMSerializer.js +392 -0
- package/src/mirror/shipper/observers.js +441 -0
- package/src/mirror/shipper/utils.js +98 -0
- package/src/mixins/disposable.js +125 -0
- package/src/mixins/injectable.js +37 -0
- package/src/personalizations/personalization-manager.js +110 -0
- package/src/personalizations/strategies/node-freezing-strategy.js +174 -0
- package/src/personalizations/utils.js +187 -0
- package/src/promises.js +107 -0
- package/src/proxy.js +144 -0
- package/src/qualified_root.js +35 -0
- package/src/query_params.js +55 -0
- package/src/shadow-dom-helper.js +63 -0
- package/src/singleton_host.js +39 -0
- package/src/smart_website/trigger.js +49 -0
- package/src/smart_website/utils.js +149 -0
- package/src/string.js +53 -0
- package/src/timezone.js +57 -0
- package/src/timing.js +49 -0
- package/src/type-utils.js +76 -0
- package/src/url-utils.js +102 -0
- package/src/url.js +50 -0
- package/src/utils.js +72 -0
- package/src/validation.js.js +29 -0
- package/src/validation_ts.js +6 -0
- package/vendor/actioncable/adapters.js +6 -0
- package/vendor/actioncable/connection.js +204 -0
- package/vendor/actioncable/connection_monitor.js +129 -0
- package/vendor/actioncable/consumer.js +91 -0
- package/vendor/actioncable/index.js +34 -0
- package/vendor/actioncable/internal.js +22 -0
- package/vendor/actioncable/logger.js +28 -0
- package/vendor/actioncable/subscription.js +93 -0
- package/vendor/actioncable/subscriptions.js +89 -0
- package/vendor/open-telemetry-idgenerator.js +43 -0
- package/widget/analytics/facebook_tracker.js +8 -0
- package/widget/analytics/google_analytics_tracker.js +83 -0
- package/widget/analytics/google_tag_manager_tracker.js +22 -0
- package/widget/analytics.js +58 -0
- package/widget/api_handler/api_handler.js +730 -0
- package/widget/api_handler/base_api_handler.js +249 -0
- package/widget/booker_intent_tracker.js +391 -0
- package/widget/booker_outcome_tracker.js +329 -0
- package/widget/capture_widget_exceptions.js +150 -0
- package/widget/channel.js +282 -0
- package/widget/composite_experience_adapter.js +101 -0
- package/widget/constants.generated.js +350 -0
- package/widget/constants.js +21 -0
- package/widget/container.js +193 -0
- package/widget/content_activity_emitter.js +36 -0
- package/widget/data360_visitor.js +67 -0
- package/widget/date_provider.js +11 -0
- package/widget/debug_mode_state.js +175 -0
- package/widget/dummy_module.js +9 -0
- package/widget/eloqua_visitor.js +17 -0
- package/widget/form_cta_booker_intent.js +246 -0
- package/widget/hubspot_visitor.js +39 -0
- package/widget/inline_meeting_booker_page.js +90 -0
- package/widget/local_state/abstract_local_state.js +38 -0
- package/widget/local_state/debug_state/abstract_debug_flow.js +29 -0
- package/widget/local_state/debug_state/custom_form_flow.js +14 -0
- package/widget/local_state/debug_state/hubspot_form_flow.js +19 -0
- package/widget/local_state/debug_state/hubspot_v4_form_flow.js +19 -0
- package/widget/local_state/debug_state/marketo_form_flow.js +20 -0
- package/widget/local_state/debug_state/pardot_form_flow.js +18 -0
- package/widget/local_state/debug_state.js +362 -0
- package/widget/local_state/trace_state.js +20 -0
- package/widget/location_provider.js +9 -0
- package/widget/marketo_visitor.js +39 -0
- package/widget/meetings/tracing/buttons_forms_triggering_tracer.js +124 -0
- package/widget/meetings/tracing/spans/button_spans.js +18 -0
- package/widget/meetings/tracing/spans/form_spans.js +11 -0
- package/widget/multimodal_v2/assets_preloader.js +97 -0
- package/widget/multimodal_v2/components/AppLayout.js +93 -0
- package/widget/multimodal_v2/components/CursorOverlay.js +93 -0
- package/widget/multimodal_v2/components/PointerRectOverlay.js +74 -0
- package/widget/multimodal_v2/components/app/Artifact.js +109 -0
- package/widget/multimodal_v2/components/app/Background.js +27 -0
- package/widget/multimodal_v2/components/app/CalendarLoadingContent.js +255 -0
- package/widget/multimodal_v2/components/app/Chat.js +39 -0
- package/widget/multimodal_v2/components/app/CookieConsentModal.js +149 -0
- package/widget/multimodal_v2/components/app/Foreground.js +48 -0
- package/widget/multimodal_v2/components/app/HiddenInput.js +41 -0
- package/widget/multimodal_v2/components/app/Input.js +72 -0
- package/widget/multimodal_v2/components/app/LightboxExperience.js +769 -0
- package/widget/multimodal_v2/components/app/LoadingOverlay.js +97 -0
- package/widget/multimodal_v2/components/app/Main.js +985 -0
- package/widget/multimodal_v2/components/app/MessengerButton.js +160 -0
- package/widget/multimodal_v2/components/app/Multimodal.js +17 -0
- package/widget/multimodal_v2/components/app/OverlayControls.js +79 -0
- package/widget/multimodal_v2/components/app/Preview.js +32 -0
- package/widget/multimodal_v2/components/app/PrivacyDisclosure.js +57 -0
- package/widget/multimodal_v2/components/app/RotateDeviceOverlay.js +70 -0
- package/widget/multimodal_v2/components/app/Toolbar.js +156 -0
- package/widget/multimodal_v2/components/chat/ChatComposer.js +129 -0
- package/widget/multimodal_v2/components/chat/ChatInputForm.js +398 -0
- package/widget/multimodal_v2/components/chat/ColdStartQuestions.js +354 -0
- package/widget/multimodal_v2/components/chat/ComposerErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/chat/PostCallSurvey.js +359 -0
- package/widget/multimodal_v2/components/chat/preview/FieldRequestRenderer.js +41 -0
- package/widget/multimodal_v2/components/chat/preview/PreviewMessageRenderer.js +60 -0
- package/widget/multimodal_v2/components/chat/preview/SharedOfferRenderer.js +143 -0
- package/widget/multimodal_v2/components/chat/preview/TextRenderer.js +27 -0
- package/widget/multimodal_v2/components/chat/preview/TimelinePreview.js +254 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventOfferRenderer.js +103 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +148 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldEntryRenderer.js +84 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldRequestRenderer.js +56 -0
- package/widget/multimodal_v2/components/chat/timeline/InlinePrivacyDisclosure.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/LinkPreviewCard.js +70 -0
- package/widget/multimodal_v2/components/chat/timeline/MessageEntry.js +88 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentContentRenderer.js +30 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +279 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentVideoRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/ShareContentRenderer.js +59 -0
- package/widget/multimodal_v2/components/chat/timeline/SharedOfferRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +82 -0
- package/widget/multimodal_v2/components/chat/timeline/TextRenderer.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/Timeline.js +158 -0
- package/widget/multimodal_v2/components/debug/DebugMultimodalPanel.js +327 -0
- package/widget/multimodal_v2/components/decks/index.js +160 -0
- package/widget/multimodal_v2/components/field_request/BooleanField.js +77 -0
- package/widget/multimodal_v2/components/field_request/FieldComponents.js +69 -0
- package/widget/multimodal_v2/components/field_request/Form.js +87 -0
- package/widget/multimodal_v2/components/field_request/MultiPicklistField.js +240 -0
- package/widget/multimodal_v2/components/field_request/PicklistField.js +166 -0
- package/widget/multimodal_v2/components/field_request/SingleLineInputField.js +69 -0
- package/widget/multimodal_v2/components/field_request/TextField.js +37 -0
- package/widget/multimodal_v2/components/field_request/index.js +170 -0
- package/widget/multimodal_v2/components/helpers/AutoScroll.js +37 -0
- package/widget/multimodal_v2/components/helpers/ErrorBoundary.js +53 -0
- package/widget/multimodal_v2/components/helpers/FocusTrapDialog.js +26 -0
- package/widget/multimodal_v2/components/helpers/ImpressionTracker.js +94 -0
- package/widget/multimodal_v2/components/helpers/ListRenderer.js +37 -0
- package/widget/multimodal_v2/components/helpers/Localization.js +76 -0
- package/widget/multimodal_v2/components/helpers/Persisted.js +166 -0
- package/widget/multimodal_v2/components/helpers/RichText.js +358 -0
- package/widget/multimodal_v2/components/helpers/ScreenReaderHeading.js +17 -0
- package/widget/multimodal_v2/components/helpers/Thumbnail.js +190 -0
- package/widget/multimodal_v2/components/helpers/VisuallyHidden.js +41 -0
- package/widget/multimodal_v2/components/helpers/content_click_payloads.js +58 -0
- package/widget/multimodal_v2/components/helpers/useDraggable.js +103 -0
- package/widget/multimodal_v2/components/helpers/useTextOverflow.js +44 -0
- package/widget/multimodal_v2/components/lightbox_gather/index.js +741 -0
- package/widget/multimodal_v2/components/meetings/ArtifactEntryPoint.js +252 -0
- package/widget/multimodal_v2/components/meetings/MeetingAdditionalAttendees.js +325 -0
- package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +100 -0
- package/widget/multimodal_v2/components/meetings/MeetingDetailsCard.js +99 -0
- package/widget/multimodal_v2/components/meetings/MeetingErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +239 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferFooter.js +104 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferSelectionStep.js +60 -0
- package/widget/multimodal_v2/components/meetings/MeetingRepHeader.js +222 -0
- package/widget/multimodal_v2/components/meetings/MeetingStepShell.js +92 -0
- package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +515 -0
- package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +603 -0
- package/widget/multimodal_v2/components/meetings/MonthDatePicker.js +422 -0
- package/widget/multimodal_v2/components/meetings/NavigationButtons.js +76 -0
- package/widget/multimodal_v2/components/meetings/TimeSlotHeader.js +357 -0
- package/widget/multimodal_v2/components/meetings/WeekViewHeader.js +20 -0
- package/widget/multimodal_v2/components/meetings/constants.js +7 -0
- package/widget/multimodal_v2/components/meetings/index.js +47 -0
- package/widget/multimodal_v2/components/meetings/utils.js +328 -0
- package/widget/multimodal_v2/components/multimodal/Audio.js +28 -0
- package/widget/multimodal_v2/components/multimodal/Controls.js +188 -0
- package/widget/multimodal_v2/components/multimodal/LiveVideo.js +63 -0
- package/widget/multimodal_v2/components/multimodal/MultiModalComponent.js +424 -0
- package/widget/multimodal_v2/components/multimodal/MultimodalAvatar.js +36 -0
- package/widget/multimodal_v2/components/multimodal/OrbAvatar.js +326 -0
- package/widget/multimodal_v2/components/multimodal/Status.js +220 -0
- package/widget/multimodal_v2/components/multimodal/VideoAvatar.js +24 -0
- package/widget/multimodal_v2/components/multimodal/VideoPreview.js +114 -0
- package/widget/multimodal_v2/components/multimodal/useAudioLevelMonitoring.js +96 -0
- package/widget/multimodal_v2/components/multimodal/useMultimodal.js +434 -0
- package/widget/multimodal_v2/components/presentations/index.js +372 -0
- package/widget/multimodal_v2/components/shared/Avatar.js +92 -0
- package/widget/multimodal_v2/components/shared/AvatarGroup.js +135 -0
- package/widget/multimodal_v2/components/shared/Button.js +245 -0
- package/widget/multimodal_v2/components/shared/ButtonGroup.js +133 -0
- package/widget/multimodal_v2/components/shared/ComposerForm.js +98 -0
- package/widget/multimodal_v2/components/shared/SpeakingIndicator.js +239 -0
- package/widget/multimodal_v2/components/shared/ThinkingAnimation.js +165 -0
- package/widget/multimodal_v2/components/shared/Tooltip.js +266 -0
- package/widget/multimodal_v2/components/shared/controls/Dropdown.js +79 -0
- package/widget/multimodal_v2/components/shared/controls/PillToggle.js +142 -0
- package/widget/multimodal_v2/components/shared/controls/TextArea.js +114 -0
- package/widget/multimodal_v2/components/shared/toolCallLabels.js +12 -0
- package/widget/multimodal_v2/components/slides/SlidesThumbnail.js +47 -0
- package/widget/multimodal_v2/components/slides/index.js +61 -0
- package/widget/multimodal_v2/constants.js +88 -0
- package/widget/multimodal_v2/host.split-css.js +2 -0
- package/widget/multimodal_v2/host.string.js +96 -0
- package/widget/multimodal_v2/images/icons.js +582 -0
- package/widget/multimodal_v2/images/posters/piper_low_res.jpg +0 -0
- package/widget/multimodal_v2/index.js +23 -0
- package/widget/multimodal_v2/index.panda.js +28 -0
- package/widget/multimodal_v2/index.split-css.panda.js +2 -0
- package/widget/multimodal_v2/inline_meeting_booker.js +182 -0
- package/widget/multimodal_v2/locales/cs.js +196 -0
- package/widget/multimodal_v2/locales/da.js +196 -0
- package/widget/multimodal_v2/locales/de.js +196 -0
- package/widget/multimodal_v2/locales/en.js +196 -0
- package/widget/multimodal_v2/locales/en_AU.js +197 -0
- package/widget/multimodal_v2/locales/en_GB.js +197 -0
- package/widget/multimodal_v2/locales/es.js +197 -0
- package/widget/multimodal_v2/locales/es_LA.js +196 -0
- package/widget/multimodal_v2/locales/fi.js +196 -0
- package/widget/multimodal_v2/locales/fr.js +197 -0
- package/widget/multimodal_v2/locales/fr_CA.js +196 -0
- package/widget/multimodal_v2/locales/id.js +196 -0
- package/widget/multimodal_v2/locales/index.js +48 -0
- package/widget/multimodal_v2/locales/it.js +196 -0
- package/widget/multimodal_v2/locales/ja.js +196 -0
- package/widget/multimodal_v2/locales/ko.js +196 -0
- package/widget/multimodal_v2/locales/nb.js +196 -0
- package/widget/multimodal_v2/locales/nl.js +196 -0
- package/widget/multimodal_v2/locales/pl.js +196 -0
- package/widget/multimodal_v2/locales/pt_BR.js +196 -0
- package/widget/multimodal_v2/locales/ru.js +196 -0
- package/widget/multimodal_v2/locales/sv.js +196 -0
- package/widget/multimodal_v2/locales/th.js +196 -0
- package/widget/multimodal_v2/locales/tr.js +196 -0
- package/widget/multimodal_v2/locales/vi.js +196 -0
- package/widget/multimodal_v2/locales/zh_CN.js +196 -0
- package/widget/multimodal_v2/locales/zh_TW.js +196 -0
- package/widget/multimodal_v2/multimodal.js +633 -0
- package/widget/multimodal_v2/multimodal_channel.js +195 -0
- package/widget/multimodal_v2/signals/active_conversation_signal.js +33 -0
- package/widget/multimodal_v2/signals/allowed_conversation_mode_signal.js +38 -0
- package/widget/multimodal_v2/signals/artifact_signal.js +22 -0
- package/widget/multimodal_v2/signals/layout_signal.js +98 -0
- package/widget/multimodal_v2/signals/messages_signal.js +207 -0
- package/widget/multimodal_v2/signals/ui_state_signal.js +128 -0
- package/widget/multimodal_v2/stable_bundle_src.js +44 -0
- package/widget/multimodal_v2/stores/ai_conversation_store.js +221 -0
- package/widget/multimodal_v2/stores/artifact_store.js +205 -0
- package/widget/multimodal_v2/stores/base_store.js +16 -0
- package/widget/multimodal_v2/stores/call_store.js +770 -0
- package/widget/multimodal_v2/stores/call_ui_adapter.js +225 -0
- package/widget/multimodal_v2/stores/debug_multimodal_scenario_store.js +471 -0
- package/widget/multimodal_v2/stores/decks_store.js +285 -0
- package/widget/multimodal_v2/stores/device_store.js +63 -0
- package/widget/multimodal_v2/stores/docking_store.js +62 -0
- package/widget/multimodal_v2/stores/field_request_store.js +326 -0
- package/widget/multimodal_v2/stores/meeting_store.js +477 -0
- package/widget/multimodal_v2/stores/participant_store.js +73 -0
- package/widget/multimodal_v2/stores/post_call_survey_store.js +160 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store.js +163 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store_v2.js +511 -0
- package/widget/multimodal_v2/stores/presentations_store.js +111 -0
- package/widget/multimodal_v2/stores/root_store.js +1919 -0
- package/widget/multimodal_v2/stores/screen_share_store.js +217 -0
- package/widget/multimodal_v2/stores/slides_store.js +21 -0
- package/widget/multimodal_v2/stores/translation_store.js +185 -0
- package/widget/multimodal_v2/stores/ui_store.js +496 -0
- package/widget/multimodal_v2/stores/waiting_store.js +159 -0
- package/widget/multimodal_v2/stores/website_navigation_store.js +767 -0
- package/widget/multimodal_v2/styled-system/css/conditions.js +34 -0
- package/widget/multimodal_v2/styled-system/css/css.js +48 -0
- package/widget/multimodal_v2/styled-system/css/cva.js +96 -0
- package/widget/multimodal_v2/styled-system/css/cx.js +13 -0
- package/widget/multimodal_v2/styled-system/css/index.js +15 -0
- package/widget/multimodal_v2/styled-system/css/sva.js +69 -0
- package/widget/multimodal_v2/styled-system/helpers.js +384 -0
- package/widget/multimodal_v2/styled-system/jsx/create-style-context.js +96 -0
- package/widget/multimodal_v2/styled-system/jsx/factory-helper.js +19 -0
- package/widget/multimodal_v2/styled-system/jsx/factory.js +111 -0
- package/widget/multimodal_v2/styled-system/jsx/index.js +12 -0
- package/widget/multimodal_v2/styled-system/jsx/is-valid-prop.js +22 -0
- package/widget/multimodal_v2/types.js +105 -0
- package/widget/multimodal_v2/utils/auto_scroller.js +157 -0
- package/widget/multimodal_v2/utils/flip_animation.js +124 -0
- package/widget/multimodal_v2/utils/focus_gate.js +237 -0
- package/widget/multimodal_v2/utils/locale.js +16 -0
- package/widget/multimodal_v2/utils/media_queries.js +30 -0
- package/widget/multimodal_v2/utils/multimodal_cache.js +19 -0
- package/widget/multimodal_v2/utils/mutation_effect.js +14 -0
- package/widget/multimodal_v2/utils/navigation_interceptor.js +205 -0
- package/widget/multimodal_v2/utils/navigation_strategies/dom_swap.js +393 -0
- package/widget/multimodal_v2/utils/navigation_strategies/index.js +12 -0
- package/widget/multimodal_v2/utils/navigation_strategies/lwr.js +61 -0
- package/widget/multimodal_v2/utils/navigation_strategies/navigation_utils.js +46 -0
- package/widget/multimodal_v2/utils/navigation_strategies/next_js.js +24 -0
- package/widget/multimodal_v2/utils/navigation_strategies/wouter_v3.js +15 -0
- package/widget/multimodal_v2/utils/objects_map.js +38 -0
- package/widget/multimodal_v2/utils/perceived_voice_turn_tracker.js +345 -0
- package/widget/multimodal_v2/utils/sanitize_html.js +132 -0
- package/widget/multimodal_v2/utils/signals.js +97 -0
- package/widget/multimodal_v2/utils/slide_zoom.js +114 -0
- package/widget/multimodal_v2/utils/theme_styles.js +137 -0
- package/widget/multimodal_v2/utils/url_observer.js +52 -0
- package/widget/multimodal_v2/utils/voice_onset_detector.js +127 -0
- package/widget/page_mirror.js +89 -0
- package/widget/page_view_activity_emitter.js +71 -0
- package/widget/pardot_visitor.js +137 -0
- package/widget/personalization_observer.js +96 -0
- package/widget/personalizations_config.js +160 -0
- package/widget/qualified_form/constants.js +23 -0
- package/widget/qualified_form/phone_utils.js +38 -0
- package/widget/qualified_form/qualified_form_action.js +91 -0
- package/widget/qualified_form/qualified_form_action_orchestrator.js +21 -0
- package/widget/qualified_form/qualified_form_api.js +471 -0
- package/widget/scroll_disabler.js +109 -0
- package/widget/server-logger.js +156 -0
- package/widget/smart_website_config.js +112 -0
- package/widget/telemetry/context.js +75 -0
- package/widget/telemetry/index.js +16 -0
- package/widget/telemetry/messenger_uptime.js +80 -0
- package/widget/telemetry/metrics.js +120 -0
- package/widget/telemetry/span.js +82 -0
- package/widget/telemetry/telemetry.js +180 -0
- package/widget/telemetry/tracer.js +41 -0
- package/widget/telemetry/tracing_store.js +310 -0
- package/widget/tracker.js +916 -0
- package/widget/utils/native_globals.js +129 -0
- package/widget/v1_adapter.js +50 -0
- package/widget/v2_adapter.js +368 -0
- package/widget/visitor/base_visitor_state.js +11 -0
- package/widget/visitor/cookie_visitor_state.js +128 -0
- package/widget/visitor/in_memory_visitor_state.js +29 -0
- package/widget/visitor/visitor_state.js +384 -0
- package/widget/visitor.js +356 -0
- package/widget/widget/linked_widget_v2.js +227 -0
- package/widget/widget/page_mirror_factory.js +22 -0
- package/widget/widget/sentry.js +130 -0
- package/widget/widget/widget.js +1698 -0
- package/widget/widget.split-css.js +2 -0
- package/widget/widget_bootstrap.js +97 -0
- 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 };
|