@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,164 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../../../js/runtime.js";
|
|
2
|
+
import "../../../../widget/utils/native_globals.js";
|
|
3
|
+
|
|
4
|
+
/* provided dependency */ var requestAnimationFrame = __webpack_require__(68034).gj;
|
|
5
|
+
/* eslint-disable rulesdir/css-units */ // ============================================================================
|
|
6
|
+
// Concern Interface
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/**
|
|
9
|
+
* Common interface every docking concern (viewport_resize, viewport_lock, ...)
|
|
10
|
+
* implements. The orchestrator drives concerns uniformly through these three
|
|
11
|
+
* methods, so adding a new concern only requires implementing the same shape.
|
|
12
|
+
*
|
|
13
|
+
* Concerns must be self-contained: their CSS must not reference variables
|
|
14
|
+
* defined by another concern, and their JS must not import another concern's
|
|
15
|
+
* exports. This way each can be enabled / disabled / unit-tested in isolation.
|
|
16
|
+
*
|
|
17
|
+
* - `init` runs exactly once during {@link DockingAPI.init}. Use it for one-
|
|
18
|
+
* shot setup like installing prototype proxies, registering CSS custom
|
|
19
|
+
* properties, or measuring the host page.
|
|
20
|
+
* - `reEvaluate` runs at the end of `init` and on every subsequent
|
|
21
|
+
* {@link DockingAPI.reEvaluate} call. Must be idempotent — typical work is
|
|
22
|
+
* rescanning newly added DOM and re-stamping marker attributes.
|
|
23
|
+
* - `getStyles` returns the concern-specific CSS that the orchestrator
|
|
24
|
+
* concatenates into the base stylesheet. Called from the first
|
|
25
|
+
* `reEvaluate`, so any values measured in `init` (e.g. scrollbar width)
|
|
26
|
+
* are already available.
|
|
27
|
+
*/ // ============================================================================
|
|
28
|
+
// Shared Constants
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Attribute set on `<html>` to signal docked mode. Owned by the orchestrator
|
|
32
|
+
* (which adds/removes it) and read by viewport_resize's CSS to switch the
|
|
33
|
+
* docked-width variable between 0 and the panel width.
|
|
34
|
+
*/ const DOCKED_DOCUMENT_ATTRIBUTE = "q-docked";
|
|
35
|
+
// Value of the `q-docked` attribute, describing which docking layout is active.
|
|
36
|
+
// `regular` is the default right-side dock; `under-header` parks the panel flush
|
|
37
|
+
// below a full-width host header (hairline left border instead of a drop shadow).
|
|
38
|
+
// The (shadow-DOM) widget can't select the host page's `<html>` across the shadow
|
|
39
|
+
// boundary, so multimodal mirrors this value onto its own host for `:host()` CSS.
|
|
40
|
+
const DOCKED_MODE = {
|
|
41
|
+
regular: "regular",
|
|
42
|
+
underHeader: "under-header"
|
|
43
|
+
};
|
|
44
|
+
// Stamped on the element(s) that shrink to make room for the docked panel:
|
|
45
|
+
// `<html>` in default docking, the host's `<main>`/`<footer>` under-header.
|
|
46
|
+
const DOCKED_TARGET_ATTRIBUTE = "q-docked-target";
|
|
47
|
+
// Breakpoint at/below which docking collapses to full width. 767px keeps 768px
|
|
48
|
+
// (iPad mini portrait) on desktop while treating phones as mobile.
|
|
49
|
+
const MOBILE_BREAKPOINT = "max-width: 767px";
|
|
50
|
+
// Top offset (px) the docked widget starts below in `dockUnderHeader` mode,
|
|
51
|
+
// tracking the sticky header's bottom edge. Defaults to `0px` when consumed.
|
|
52
|
+
const DOCKED_TOP_OFFSET_CSS_VARIABLE = "--q-docked-top-offset";
|
|
53
|
+
/**
|
|
54
|
+
* Custom property holding the inline-size of the visible content area
|
|
55
|
+
* (`100dvw - docked offset`). Declared by viewport_resize's stylesheet, which
|
|
56
|
+
* also uses it as the target for `vw → calc(... * var(--qdvw))` rewrites; it
|
|
57
|
+
* lives here because the `<q-docking>` host sizes its probe iframe from it.
|
|
58
|
+
*/ const DOCKED_VIEWPORT_WIDTH_CSS_VARIABLE = "--qdvw";
|
|
59
|
+
/**
|
|
60
|
+
* Prefix for `applyOnce` markers stamped on DOM nodes / prototypes by the
|
|
61
|
+
* various proxy installers. Each installer adds a `_<name>` suffix so the
|
|
62
|
+
* markers are globally unique even when the proxies live in different files.
|
|
63
|
+
*/ const DOCKING_PROXY_MARKER = "__q_docking_proxy";
|
|
64
|
+
/**
|
|
65
|
+
* Tag name of the singleton custom element hosting every docking-owned DOM node.
|
|
66
|
+
* The element is in `docking_host.ts`; the name stays here because importing it
|
|
67
|
+
* back for `isQualifiedOwnedShadowRoot` would be circular.
|
|
68
|
+
*/ const Q_DOCKING_TAG_NAME = "q-docking";
|
|
69
|
+
/**
|
|
70
|
+
* Shadow roots owned by Qualified (widget root or `<q-docking>` host).
|
|
71
|
+
* The transformer must not walk these — their stylesheets are either
|
|
72
|
+
* ours to manage directly or in-flight CORS clones.
|
|
73
|
+
*/ function isQualifiedOwnedShadowRoot(root) {
|
|
74
|
+
if (!(root instanceof ShadowRoot)) return false;
|
|
75
|
+
if (root.host.id === "qualified-multimodal-host") return true;
|
|
76
|
+
if (root.host.tagName === Q_DOCKING_TAG_NAME.toUpperCase()) return true;
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Shared DOM Helpers
|
|
81
|
+
// ============================================================================
|
|
82
|
+
/**
|
|
83
|
+
* Measures the host page's vertical scrollbar width using a hidden element
|
|
84
|
+
* with `overflow:scroll`. Returns 0 in browsers/environments that don't
|
|
85
|
+
* paint a scrollbar (overlay scrollbars, jsdom). Each concern that needs
|
|
86
|
+
* the value calls this in its own `init` so concerns stay independent.
|
|
87
|
+
*/ function measureScrollbarWidth() {
|
|
88
|
+
const d = document.createElement("div");
|
|
89
|
+
d.style.cssText = "overflow:scroll;visibility:hidden;position:absolute;width:99px";
|
|
90
|
+
document.documentElement.append(d);
|
|
91
|
+
const w = d.offsetWidth - d.clientWidth;
|
|
92
|
+
d.remove();
|
|
93
|
+
return w;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Executes a callback on an element exactly once per key.
|
|
97
|
+
* Subsequent calls with the same element+key combination are no-ops.
|
|
98
|
+
*/ function applyOnce(el, key, fn) {
|
|
99
|
+
if (key in el) return;
|
|
100
|
+
Reflect.set(el, key, 1);
|
|
101
|
+
fn(el);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Invokes the callback with document.body once available.
|
|
105
|
+
* Fires synchronously if the body already exists, otherwise defers
|
|
106
|
+
* via MutationObserver on documentElement.
|
|
107
|
+
*/ function whenBodyAvailable(callback) {
|
|
108
|
+
if (document.body) {
|
|
109
|
+
callback(document.body);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const observer = new MutationObserver(()=>{
|
|
113
|
+
if (document.body) {
|
|
114
|
+
observer.disconnect();
|
|
115
|
+
callback(document.body);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
observer.observe(document.documentElement, {
|
|
119
|
+
childList: true
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Runs `fn` with `transition: none !important` on `element` so any synchronous
|
|
124
|
+
* style changes are not animated, then restores the original transition value
|
|
125
|
+
* on the next animation frame. The restore is scheduled even if `fn` throws,
|
|
126
|
+
* so the host page's transitions are never permanently overridden.
|
|
127
|
+
*/ function withTransitionsDisabled(element, fn) {
|
|
128
|
+
const hadInlineTransition = element.style.getPropertyValue("transition");
|
|
129
|
+
const hadPriority = element.style.getPropertyPriority("transition");
|
|
130
|
+
element.style.setProperty("transition", "none", "important");
|
|
131
|
+
try {
|
|
132
|
+
fn();
|
|
133
|
+
} finally{
|
|
134
|
+
// Always schedule the restore, even if fn() throws — otherwise `transition: none !important`
|
|
135
|
+
// would be left on the host page and could break any later CSS transitions on the element.
|
|
136
|
+
requestAnimationFrame(()=>{
|
|
137
|
+
if (hadInlineTransition) {
|
|
138
|
+
element.style.setProperty("transition", hadInlineTransition, hadPriority);
|
|
139
|
+
} else {
|
|
140
|
+
element.style.removeProperty("transition");
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function tryGet(fn, fallback) {
|
|
146
|
+
try {
|
|
147
|
+
return fn();
|
|
148
|
+
} catch (unused) {
|
|
149
|
+
return fallback;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Dispatches a resize event on the given target.
|
|
154
|
+
* @param target - The target to dispatch the resize event on. Defaults to window.
|
|
155
|
+
*/ function dispatchResizeEvent(target) {
|
|
156
|
+
if (target === void 0) target = window;
|
|
157
|
+
target.dispatchEvent(new CustomEvent("resize", {
|
|
158
|
+
detail: {
|
|
159
|
+
source: "q-docking"
|
|
160
|
+
}
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export { DOCKED_DOCUMENT_ATTRIBUTE, DOCKED_MODE, DOCKED_TARGET_ATTRIBUTE, DOCKED_TOP_OFFSET_CSS_VARIABLE, DOCKED_VIEWPORT_WIDTH_CSS_VARIABLE, DOCKING_PROXY_MARKER, MOBILE_BREAKPOINT, Q_DOCKING_TAG_NAME, applyOnce, dispatchResizeEvent, isQualifiedOwnedShadowRoot, measureScrollbarWidth, tryGet, whenBodyAvailable, withTransitionsDisabled };
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../../../js/runtime.js";
|
|
2
|
+
import { measureScrollbarWidth, whenBodyAvailable, DOCKING_PROXY_MARKER, DOCKED_DOCUMENT_ATTRIBUTE, applyOnce } from "./shared.js";
|
|
3
|
+
import "../../../../widget/utils/native_globals.js";
|
|
4
|
+
import { applyProxy } from "../../../../src/proxy.js";
|
|
5
|
+
|
|
6
|
+
/* provided dependency */ var requestAnimationFrame = __webpack_require__(68034).gj;
|
|
7
|
+
/* provided dependency */ var viewport_lock_setTimeout = __webpack_require__(68034).pS;
|
|
8
|
+
/* provided dependency */ var __nativeWindowAddEventListener = __webpack_require__(68034).zh;
|
|
9
|
+
/* eslint-disable rulesdir/css-units */
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Activates the calc-based padding override on `<body>` and the
|
|
16
|
+
* `padding: 0` override on `<html>` (see `getStyles()`). Stamped on both
|
|
17
|
+
* so body content starts at the same vertical position the host page
|
|
18
|
+
* rendered at: html.padding-top + body.margin-top + body.padding-top are
|
|
19
|
+
* absorbed into body.padding-top.
|
|
20
|
+
*/ const MARGIN_SWAP_ATTRIBUTE = "data-q-margin-swapped";
|
|
21
|
+
/** Activates `overflow: clip !important` on a detected scroll trap. */ const OVERFLOW_TRAP_ATTRIBUTE = "data-q-overflow-trap";
|
|
22
|
+
/** Activates `background: transparent !important` when body computes to plain white. */ const BACKGROUND_OVERRIDE_ATTRIBUTE = "data-q-bg-override";
|
|
23
|
+
function createViewportLock() {
|
|
24
|
+
const state = {
|
|
25
|
+
scrollbarWidth: 0,
|
|
26
|
+
pendingScroll: null,
|
|
27
|
+
scrollReplayScheduled: false
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
init () {
|
|
31
|
+
state.scrollbarWidth = measureScrollbarWidth();
|
|
32
|
+
state.pendingScroll = capturePreDockingScroll();
|
|
33
|
+
installScrollProxy();
|
|
34
|
+
},
|
|
35
|
+
reEvaluate () {
|
|
36
|
+
initMarginSwap();
|
|
37
|
+
initOverflowTrap();
|
|
38
|
+
initBackgroundOverride();
|
|
39
|
+
if (state.pendingScroll) {
|
|
40
|
+
restoreScroll(state.pendingScroll);
|
|
41
|
+
state.pendingScroll = null;
|
|
42
|
+
}
|
|
43
|
+
// Docking makes <body> the scroll container and forwards its scroll to
|
|
44
|
+
// window/document (see installScrollProxy), but nothing fires that first
|
|
45
|
+
// event — so host code that only positions itself on scroll (sticky /
|
|
46
|
+
// hide-on-scroll bars, scroll-anchored ad slots) stays in its pre-scroll
|
|
47
|
+
// default. Replay an initial scroll so it settles for the current docked
|
|
48
|
+
// scroll position.
|
|
49
|
+
if (!state.scrollReplayScheduled) {
|
|
50
|
+
state.scrollReplayScheduled = true;
|
|
51
|
+
replayInitialScroll();
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
getStyles () {
|
|
55
|
+
return /* css */ "\n html {\n display: block !important;\n position: relative !important;\n contain: layout inline-size !important;\n height: 100dvh !important;\n overflow: hidden !important;\n margin-top: 0 !important;\n }\n body {\n display: block !important;\n position: relative !important;\n overflow-x: hidden !important;\n overflow-y: auto !important;\n height: 100% !important;\n width: calc(100% + " + state.scrollbarWidth + "px) !important;\n max-width: calc(100% + " + state.scrollbarWidth + "px) !important;\n /* The overflow rules above make body the scroll container; inherit\n <html>'s scroll-behavior so anchor nav / scrollIntoView() keep the\n host's smooth scroll instead of body's UA-default 'auto'. */\n scroll-behavior: inherit !important;\n }\n [" + OVERFLOW_TRAP_ATTRIBUTE + "] {\n /* clip: not a scroll container (wheel passes through to body)\n while preserving the host's intentional clipping. */\n overflow: clip !important;\n /* clip does NOT establish a block formatting context, so a host\n that relied on its own 'overflow: hidden'/'auto' to contain a\n floated child (e.g. a 'float: left' main) loses that containment\n once we override to clip — the child escapes and the trap\n collapses to near-zero height, clipping the page blank.\n 'contain: layout' re-establishes an independent formatting context\n that contains the float without turning the element into a scroll\n container. */\n contain: layout !important;\n }\n html[" + MARGIN_SWAP_ATTRIBUTE + "] {\n padding: 0 !important;\n }\n body[" + MARGIN_SWAP_ATTRIBUTE + "] {\n margin-top: 0px !important;\n padding-top: calc(\n var(--q-orig-padding-top, 0px) +\n var(--q-orig-margin-top, 0px) +\n var(--q-html-orig-padding-top, 0px)\n ) !important;\n }\n [" + BACKGROUND_OVERRIDE_ATTRIBUTE + "] {\n background: transparent !important;\n }\n ";
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// Scroll Capture / Restore
|
|
61
|
+
// ============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* Falls through window → documentElement → body to tolerate environments
|
|
64
|
+
* where an earlier integration already hoisted the scroll onto body.
|
|
65
|
+
*/ function capturePreDockingScroll() {
|
|
66
|
+
var _document_body, _document_body1;
|
|
67
|
+
const scrollTop = window.scrollY || document.documentElement.scrollTop || ((_document_body = document.body) == null ? void 0 : _document_body.scrollTop) || 0;
|
|
68
|
+
const scrollLeft = window.scrollX || document.documentElement.scrollLeft || ((_document_body1 = document.body) == null ? void 0 : _document_body1.scrollLeft) || 0;
|
|
69
|
+
return {
|
|
70
|
+
scrollTop,
|
|
71
|
+
scrollLeft
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function restoreScroll(pos) {
|
|
75
|
+
const { body } = document;
|
|
76
|
+
if (!body) return;
|
|
77
|
+
// "instant" overrides body's inherited (possibly smooth) scroll-behavior so
|
|
78
|
+
// the restore jumps to the captured pre-dock offset rather than animating.
|
|
79
|
+
if (typeof body.scrollTo === "function") {
|
|
80
|
+
body.scrollTo({
|
|
81
|
+
top: pos.scrollTop,
|
|
82
|
+
left: pos.scrollLeft,
|
|
83
|
+
behavior: "instant"
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
// Environments without Element.scrollTo (e.g. jsdom): set offsets directly.
|
|
87
|
+
body.scrollTop = pos.scrollTop;
|
|
88
|
+
body.scrollLeft = pos.scrollLeft;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Dispatches `scroll` on `document` + `window` (the same targets the scroll
|
|
93
|
+
* proxy forwards body scrolls to) so scroll-driven host code recomputes its
|
|
94
|
+
* position against the docked scroll container. This mirrors the synthetic
|
|
95
|
+
* `resize` viewport_resize fires at init.
|
|
96
|
+
*
|
|
97
|
+
* Fired immediately, next frame, and on a short ramp: ad / widget scripts
|
|
98
|
+
* routinely attach their scroll listeners well after `load`, so a single
|
|
99
|
+
* dispatch at init would miss them and leave the widget parked in its
|
|
100
|
+
* pre-scroll default. Each dispatch is a bare event with no `scrollTo`, so
|
|
101
|
+
* handlers read the current scroll offset — re-firing later is harmless even
|
|
102
|
+
* if the user has since scrolled.
|
|
103
|
+
*
|
|
104
|
+
* The ramped re-fires are gated on docking still being active: if the widget
|
|
105
|
+
* is torn down (avatar-join-timeout failover, disable) before a timer elapses,
|
|
106
|
+
* we skip it rather than dispatch stray `scroll` events on the host page after
|
|
107
|
+
* we're gone. The immediate + next-frame fires run synchronously here, before
|
|
108
|
+
* any teardown, so they are unconditional.
|
|
109
|
+
*/ function replayInitialScroll() {
|
|
110
|
+
const fire = ()=>{
|
|
111
|
+
document.dispatchEvent(new Event("scroll"));
|
|
112
|
+
window.dispatchEvent(new Event("scroll"));
|
|
113
|
+
};
|
|
114
|
+
const fireIfDocked = ()=>{
|
|
115
|
+
if (!document.documentElement.hasAttribute(DOCKED_DOCUMENT_ATTRIBUTE)) return;
|
|
116
|
+
fire();
|
|
117
|
+
};
|
|
118
|
+
fire();
|
|
119
|
+
requestAnimationFrame(fire);
|
|
120
|
+
for (const delay of [
|
|
121
|
+
150,
|
|
122
|
+
400,
|
|
123
|
+
900,
|
|
124
|
+
1600
|
|
125
|
+
]){
|
|
126
|
+
viewport_lock_setTimeout(fireIfDocked, delay);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ============================================================================
|
|
130
|
+
// DOM Write Helpers
|
|
131
|
+
// ============================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Treats unset / `0px` as zero. getComputedStyle canonicalises zero lengths
|
|
134
|
+
* to `"0px"`; the empty-string branch covers jsdom / detached-element cases.
|
|
135
|
+
*/ function isZeroLength(cssValue) {
|
|
136
|
+
return cssValue === "" || cssValue === "0px";
|
|
137
|
+
}
|
|
138
|
+
// ============================================================================
|
|
139
|
+
// Margin Swap
|
|
140
|
+
// ============================================================================
|
|
141
|
+
/**
|
|
142
|
+
* Captures the host's original top spacing (html.padding-top + body.margin-top
|
|
143
|
+
* + body.padding-top) into CSS vars on body for the calc-based swap in
|
|
144
|
+
* getStyles(). Runs immediately when body is available, then re-runs whenever
|
|
145
|
+
* host code mutates body's class or style so customer themes / runtime
|
|
146
|
+
* stylesheet changes flow through.
|
|
147
|
+
*/ function initMarginSwap() {
|
|
148
|
+
whenBodyAvailable((body)=>{
|
|
149
|
+
swapMarginWithPadding(body);
|
|
150
|
+
observeBodyAttributes(body, "" + DOCKING_PROXY_MARKER + "_margin_swap_observer", ()=>swapMarginWithPadding(body));
|
|
151
|
+
// An early pass (body parsed before the host's render-blocking / async
|
|
152
|
+
// stylesheets have loaded) reads the UA-default body margin (e.g. 8px)
|
|
153
|
+
// instead of the host's real reset, baking that phantom spacing into
|
|
154
|
+
// padding-top. Stylesheet loads don't mutate body's class/style, so the
|
|
155
|
+
// observer above never fires the correction. Re-run once the document is
|
|
156
|
+
// fully loaded and styles have settled: swapMarginWithPadding is
|
|
157
|
+
// idempotent and self-clears when the settled margin is zero.
|
|
158
|
+
if (document.readyState !== "complete") {
|
|
159
|
+
__nativeWindowAddEventListener("load", ()=>swapMarginWithPadding(body), {
|
|
160
|
+
once: true
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function swapMarginWithPadding(body) {
|
|
166
|
+
// Late observer callbacks can fire after the document is gone (in-flight
|
|
167
|
+
// microtasks during teardown). Bail rather than blow up.
|
|
168
|
+
if (typeof document === "undefined" || !document.documentElement) return;
|
|
169
|
+
const html = document.documentElement;
|
|
170
|
+
// Remove the gated attribute so getComputedStyle returns the host's true
|
|
171
|
+
// values rather than our zeroed override.
|
|
172
|
+
body.removeAttribute(MARGIN_SWAP_ATTRIBUTE);
|
|
173
|
+
html.removeAttribute(MARGIN_SWAP_ATTRIBUTE);
|
|
174
|
+
// Read phase — snapshot everything before any writes so a single layout
|
|
175
|
+
// flush (triggered by the first getComputedStyle) covers all three reads.
|
|
176
|
+
const bodyComputed = getComputedStyle(body);
|
|
177
|
+
const htmlComputed = getComputedStyle(html);
|
|
178
|
+
const bodyMarginTop = bodyComputed.getPropertyValue("margin-top");
|
|
179
|
+
const bodyPaddingTop = bodyComputed.getPropertyValue("padding-top");
|
|
180
|
+
const htmlPaddingTop = htmlComputed.getPropertyValue("padding-top");
|
|
181
|
+
// Nothing to absorb: the gated body calc would resolve to body's existing
|
|
182
|
+
// padding-top and the html `padding: 0` override is a no-op. Skip the
|
|
183
|
+
// attribute stamp and clear any vars left over from a prior non-zero pass.
|
|
184
|
+
if (isZeroLength(bodyMarginTop) && isZeroLength(htmlPaddingTop)) {
|
|
185
|
+
body.style.removeProperty("--q-orig-margin-top");
|
|
186
|
+
body.style.removeProperty("--q-orig-padding-top");
|
|
187
|
+
body.style.removeProperty("--q-html-orig-padding-top");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
body.style.setProperty("--q-orig-margin-top", bodyMarginTop);
|
|
191
|
+
body.style.setProperty("--q-orig-padding-top", bodyPaddingTop);
|
|
192
|
+
body.style.setProperty("--q-html-orig-padding-top", htmlPaddingTop);
|
|
193
|
+
body.setAttribute(MARGIN_SWAP_ATTRIBUTE, "");
|
|
194
|
+
html.setAttribute(MARGIN_SWAP_ATTRIBUTE, "");
|
|
195
|
+
}
|
|
196
|
+
// ============================================================================
|
|
197
|
+
// Overflow Trap
|
|
198
|
+
// ============================================================================
|
|
199
|
+
/**
|
|
200
|
+
* Detects full-page-shell scroll traps so the lock stylesheet can override
|
|
201
|
+
* their overflow to visible — in docked mode body is the scroll container
|
|
202
|
+
* and would see no scrollable content because the trap clips its tall
|
|
203
|
+
* descendants. Idempotent: each pass clears existing marks and re-scans.
|
|
204
|
+
*/ function initOverflowTrap() {
|
|
205
|
+
whenBodyAvailable((body)=>{
|
|
206
|
+
markOverflowTraps(body);
|
|
207
|
+
observeBodyChildList(body);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/** Bounds the MutationObserver's lifetime so long-lived pages don't keep re-scanning. */ const OVERFLOW_TRAP_OBSERVER_LIFETIME_MS = 5000;
|
|
211
|
+
/**
|
|
212
|
+
* Re-runs {@link markOverflowTraps} when an SPA root mounts as a body child.
|
|
213
|
+
* `childList: true` without subtree keeps the observer narrow — SPA roots
|
|
214
|
+
* mount at body level, while deeper churn (carousels, focus rings) doesn't
|
|
215
|
+
* fire. Skipped after `load`: re-entry via reEvaluate scans synchronously.
|
|
216
|
+
*/ function observeBodyChildList(body) {
|
|
217
|
+
if (document.readyState === "complete") return;
|
|
218
|
+
applyOnce(body, "" + DOCKING_PROXY_MARKER + "_overflow_trap_observer", (b)=>{
|
|
219
|
+
const observer = new MutationObserver(()=>markOverflowTraps(b));
|
|
220
|
+
observer.observe(b, {
|
|
221
|
+
childList: true
|
|
222
|
+
});
|
|
223
|
+
viewport_lock_setTimeout(()=>observer.disconnect(), OVERFLOW_TRAP_OBSERVER_LIFETIME_MS);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Walk depth cap. Covers SPA shells that nest their scroll trap a few
|
|
228
|
+
* levels under body (e.g. drawer containers inside a wrapper). 6 covers
|
|
229
|
+
* every shell seen in the visual-regression suite.
|
|
230
|
+
*/ const OVERFLOW_TRAP_MAX_DEPTH = 6;
|
|
231
|
+
/**
|
|
232
|
+
* Height (as a multiple of the viewport) above which a full-width, in-flow
|
|
233
|
+
* clipper with no overflowing content is treated as a page-shell pass-through
|
|
234
|
+
* and opened up. Sits above 1.0× so a viewport-height hero/banner that clips
|
|
235
|
+
* its art keeps its clip, but low enough to catch tall content sections
|
|
236
|
+
* (~1.4× viewport) that would otherwise trap the wheel.
|
|
237
|
+
*/ const SHELL_PASS_THROUGH_VIEWPORT_RATIO = 1.25;
|
|
238
|
+
/**
|
|
239
|
+
* Walks body's subtree post-order, marking each qualifying scroll trap. Post-
|
|
240
|
+
* order is load-bearing: marking an inner trap exposes its previously-clipped
|
|
241
|
+
* overflow to the ancestor (the next layout read forces the browser to flush
|
|
242
|
+
* the descendant's CSS override), so the ancestor's `scrollHeight` reflects
|
|
243
|
+
* the propagated value on the same walk. See {@link isOverflowTrap} for the
|
|
244
|
+
* qualifying criteria.
|
|
245
|
+
*/ function markOverflowTraps(body) {
|
|
246
|
+
const viewportHeight = window.innerHeight;
|
|
247
|
+
const viewportWidth = window.innerWidth;
|
|
248
|
+
const dims = {
|
|
249
|
+
minH: viewportHeight * 0.95,
|
|
250
|
+
minW: viewportWidth * 0.95,
|
|
251
|
+
shellH: viewportHeight * SHELL_PASS_THROUGH_VIEWPORT_RATIO
|
|
252
|
+
};
|
|
253
|
+
// Clear stale marks so an element that no longer qualifies (e.g. its
|
|
254
|
+
// overflow changed) loses its attribute on this pass.
|
|
255
|
+
for (const el of body.querySelectorAll("[" + OVERFLOW_TRAP_ATTRIBUTE + "]")){
|
|
256
|
+
el.removeAttribute(OVERFLOW_TRAP_ATTRIBUTE);
|
|
257
|
+
}
|
|
258
|
+
const visit = (el, depth)=>{
|
|
259
|
+
if (depth < OVERFLOW_TRAP_MAX_DEPTH) {
|
|
260
|
+
for (const child of el.children){
|
|
261
|
+
if (child instanceof HTMLElement) visit(child, depth + 1);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (isOverflowTrap(el, depth, dims)) {
|
|
265
|
+
el.setAttribute(OVERFLOW_TRAP_ATTRIBUTE, "");
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
for (const child of body.children){
|
|
269
|
+
if (child instanceof HTMLElement) visit(child, 1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function isOverflowTrap(el, depth, dims) {
|
|
273
|
+
const { overflowY, position } = getComputedStyle(el);
|
|
274
|
+
// Depth=1 permissive case: opens up wrappers that are empty at init and
|
|
275
|
+
// only acquire scrolling content later (skips width/current-overflow
|
|
276
|
+
// checks since layout numbers may not be meaningful yet).
|
|
277
|
+
if (depth === 1 && /clip|hidden/.test(overflowY) && el.offsetHeight >= dims.minH) {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
const isClipping = /clip|hidden|auto|scroll/.test(overflowY);
|
|
281
|
+
if (!isClipping) return false;
|
|
282
|
+
// jsdom returns "" for position where real browsers return "static" — treat
|
|
283
|
+
// both as in-flow. Explicit non-flow (absolute/fixed/sticky) excludes.
|
|
284
|
+
if (position && position !== "static" && position !== "relative") return false;
|
|
285
|
+
if (el.offsetWidth < dims.minW) return false;
|
|
286
|
+
// Active trap: full-size clipper with currently-overflowing content.
|
|
287
|
+
// 4px slack covers sub-pixel rounding and scrollbar-gutter reservation.
|
|
288
|
+
if (el.offsetHeight >= dims.minH && el.scrollHeight > el.clientHeight + 4) {
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
// Page-shell pass-through: tall clipper whose scrollHeight === clientHeight
|
|
292
|
+
// because its own height accommodates its content. Must still be opened up:
|
|
293
|
+
// Chromium's wheel pipeline stops at any `overflow != visible` even with no
|
|
294
|
+
// scrollable content. The viewport-ratio threshold distinguishes such a
|
|
295
|
+
// section from a viewport-height hero that clips its art (≤1.0×, kept
|
|
296
|
+
// clipped) — see SHELL_PASS_THROUGH_VIEWPORT_RATIO.
|
|
297
|
+
return el.offsetHeight >= dims.shellH;
|
|
298
|
+
}
|
|
299
|
+
// ============================================================================
|
|
300
|
+
// Background Override
|
|
301
|
+
// ============================================================================
|
|
302
|
+
/**
|
|
303
|
+
* Opt-in via attribute so pages with intentional body backgrounds keep their
|
|
304
|
+
* own. Only opts in on plain white (the typical "no background set" case).
|
|
305
|
+
* Re-runs on every reEvaluate and whenever host code mutates body's class or
|
|
306
|
+
* style, so late-loaded customer styles / runtime theming flip the attribute
|
|
307
|
+
* back off without waiting for the next poll.
|
|
308
|
+
*/ function initBackgroundOverride() {
|
|
309
|
+
whenBodyAvailable((body)=>{
|
|
310
|
+
applyBackgroundOverride(body);
|
|
311
|
+
observeBodyAttributes(body, "" + DOCKING_PROXY_MARKER + "_bg_override_observer", ()=>applyBackgroundOverride(body));
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
function applyBackgroundOverride(element) {
|
|
315
|
+
// Remove first so getComputedStyle sees the host page's real background.
|
|
316
|
+
element.removeAttribute(BACKGROUND_OVERRIDE_ATTRIBUTE);
|
|
317
|
+
const computed = getComputedStyle(element);
|
|
318
|
+
const isWhite = computed.backgroundColor === "rgb(255, 255, 255)" || computed.backgroundColor === "rgba(255, 255, 255, 1)";
|
|
319
|
+
const hasNoImage = computed.backgroundImage === "none" || computed.backgroundImage === "";
|
|
320
|
+
if (isWhite && hasNoImage) {
|
|
321
|
+
element.setAttribute(BACKGROUND_OVERRIDE_ATTRIBUTE, "");
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// ============================================================================
|
|
325
|
+
// Body Attribute Observer (shared)
|
|
326
|
+
// ============================================================================
|
|
327
|
+
/**
|
|
328
|
+
* Installs a long-lived MutationObserver on `body`'s class/style attributes
|
|
329
|
+
* so `callback` re-runs whenever the host mutates either. applyOnce keeps
|
|
330
|
+
* it one-per-marker across reEvaluate calls.
|
|
331
|
+
*
|
|
332
|
+
* Disconnects around the callback so style writes made by the callback
|
|
333
|
+
* itself (e.g. CSS-var writes) don't self-trigger an infinite loop —
|
|
334
|
+
* attributeFilter excludes our data-q-* writes but not inline-style writes.
|
|
335
|
+
*
|
|
336
|
+
* The `observe` call is in a finally so a thrown callback still leaves us
|
|
337
|
+
* watching for the next mutation. Otherwise an unexpected style shape on
|
|
338
|
+
* one cycle would permanently sideline the corrective logic for the rest
|
|
339
|
+
* of the session.
|
|
340
|
+
*/ function observeBodyAttributes(body, marker, callback) {
|
|
341
|
+
applyOnce(body, marker, (b)=>{
|
|
342
|
+
const opts = {
|
|
343
|
+
attributes: true,
|
|
344
|
+
attributeFilter: [
|
|
345
|
+
"class",
|
|
346
|
+
"style"
|
|
347
|
+
]
|
|
348
|
+
};
|
|
349
|
+
const observer = new MutationObserver(()=>{
|
|
350
|
+
observer.disconnect();
|
|
351
|
+
try {
|
|
352
|
+
callback();
|
|
353
|
+
} finally{
|
|
354
|
+
observer.observe(b, opts);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
observer.observe(b, opts);
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
// ============================================================================
|
|
361
|
+
// Scroll Proxy
|
|
362
|
+
// ============================================================================
|
|
363
|
+
/**
|
|
364
|
+
* Redirects scroll APIs on documentElement/window to document.body (the
|
|
365
|
+
* docked scroll container) and forwards body scroll events to document/window
|
|
366
|
+
* so customer listeners fire transparently. Live getters keep the proxy
|
|
367
|
+
* working when installed before `<body>` exists (snippet in `<head>`).
|
|
368
|
+
*/ function installScrollProxy() {
|
|
369
|
+
const { documentElement } = document;
|
|
370
|
+
// True while a scroll started via the proxied APIs below is awaiting its
|
|
371
|
+
// `scroll` event, so the listener can tell it from genuine user input. The
|
|
372
|
+
// generation counter lets a deferred reset clear a write that fires no event
|
|
373
|
+
// without clobbering a newer write, and hoisting keeps `no-loop-func` happy.
|
|
374
|
+
let programmaticScrollPending = false;
|
|
375
|
+
let programmaticScrollGeneration = 0;
|
|
376
|
+
const markProgrammaticScroll = ()=>{
|
|
377
|
+
programmaticScrollPending = true;
|
|
378
|
+
const generation = programmaticScrollGeneration += 1;
|
|
379
|
+
requestAnimationFrame(()=>{
|
|
380
|
+
if (generation === programmaticScrollGeneration) {
|
|
381
|
+
programmaticScrollPending = false;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
for (const prop of [
|
|
386
|
+
"scrollHeight",
|
|
387
|
+
"scrollWidth"
|
|
388
|
+
]){
|
|
389
|
+
applyProxy(documentElement, prop, {
|
|
390
|
+
get () {
|
|
391
|
+
var _ref;
|
|
392
|
+
var _document_body;
|
|
393
|
+
return (_ref = (_document_body = document.body) == null ? void 0 : _document_body[prop]) != null ? _ref : 0;
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
for (const prop of [
|
|
398
|
+
"scrollTop",
|
|
399
|
+
"scrollLeft"
|
|
400
|
+
]){
|
|
401
|
+
applyProxy(documentElement, prop, {
|
|
402
|
+
get () {
|
|
403
|
+
var _ref;
|
|
404
|
+
var _document_body;
|
|
405
|
+
return (_ref = (_document_body = document.body) == null ? void 0 : _document_body[prop]) != null ? _ref : 0;
|
|
406
|
+
},
|
|
407
|
+
set (val) {
|
|
408
|
+
if (document.body) {
|
|
409
|
+
markProgrammaticScroll();
|
|
410
|
+
document.body[prop] = val;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
const proxyMethod = (method)=>function() {
|
|
416
|
+
for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){
|
|
417
|
+
args[_key] = arguments[_key];
|
|
418
|
+
}
|
|
419
|
+
var _document_body;
|
|
420
|
+
markProgrammaticScroll();
|
|
421
|
+
return (_document_body = document.body) == null ? void 0 : _document_body[method](...args);
|
|
422
|
+
};
|
|
423
|
+
window.scrollTo = proxyMethod("scrollTo");
|
|
424
|
+
window.scrollBy = proxyMethod("scrollBy");
|
|
425
|
+
window.scroll = proxyMethod("scroll");
|
|
426
|
+
documentElement.scrollTo = proxyMethod("scrollTo");
|
|
427
|
+
documentElement.scrollBy = proxyMethod("scrollBy");
|
|
428
|
+
documentElement.scroll = proxyMethod("scroll");
|
|
429
|
+
applyProxy(window, "scrollY", {
|
|
430
|
+
get () {
|
|
431
|
+
var _ref;
|
|
432
|
+
var _document_body;
|
|
433
|
+
return (_ref = (_document_body = document.body) == null ? void 0 : _document_body.scrollTop) != null ? _ref : 0;
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
applyProxy(window, "pageYOffset", {
|
|
437
|
+
get () {
|
|
438
|
+
var _ref;
|
|
439
|
+
var _document_body;
|
|
440
|
+
return (_ref = (_document_body = document.body) == null ? void 0 : _document_body.scrollTop) != null ? _ref : 0;
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
applyProxy(window, "scrollX", {
|
|
444
|
+
get () {
|
|
445
|
+
var _ref;
|
|
446
|
+
var _document_body;
|
|
447
|
+
return (_ref = (_document_body = document.body) == null ? void 0 : _document_body.scrollLeft) != null ? _ref : 0;
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
applyProxy(window, "pageXOffset", {
|
|
451
|
+
get () {
|
|
452
|
+
var _ref;
|
|
453
|
+
var _document_body;
|
|
454
|
+
return (_ref = (_document_body = document.body) == null ? void 0 : _document_body.scrollLeft) != null ? _ref : 0;
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
applyProxy(document, "scrollingElement", {
|
|
458
|
+
get () {
|
|
459
|
+
return document.body;
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
whenBodyAvailable((body)=>{
|
|
463
|
+
applyOnce(body, "" + DOCKING_PROXY_MARKER + "_scroll", (b)=>{
|
|
464
|
+
b.addEventListener("scroll", (event)=>{
|
|
465
|
+
// Only the body container's own scroll is the docked viewport
|
|
466
|
+
// scroll; let descendant scroll containers pass through.
|
|
467
|
+
if (event.target !== b) return;
|
|
468
|
+
// Read and clear before re-dispatching so a forwarded listener that
|
|
469
|
+
// scrolls programmatically doesn't taint this decision.
|
|
470
|
+
const wasProgrammatic = programmaticScrollPending;
|
|
471
|
+
programmaticScrollPending = false;
|
|
472
|
+
// Mirror non-docked semantics: a viewport scroll fires on document
|
|
473
|
+
// and window, not on the body/html elements.
|
|
474
|
+
document.dispatchEvent(new Event("scroll"));
|
|
475
|
+
window.dispatchEvent(new Event("scroll"));
|
|
476
|
+
// Hide our own programmatic scroll from element-level handlers so a
|
|
477
|
+
// host "cancel on user scroll" guard can't abort it; real user
|
|
478
|
+
// scrolls still reach them.
|
|
479
|
+
if (wasProgrammatic) event.stopImmediatePropagation();
|
|
480
|
+
}, {
|
|
481
|
+
capture: true,
|
|
482
|
+
passive: true
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
export { createViewportLock };
|