diff --git a/.changeset/thick-mice-tan.md b/.changeset/thick-mice-tan.md new file mode 100644 index 000000000..f3d913a73 --- /dev/null +++ b/.changeset/thick-mice-tan.md @@ -0,0 +1,5 @@ +--- +'@getodk/web-forms': patch +--- + +Prevent background scroll and browser zooming in full-screen map diff --git a/packages/web-forms/src/assets/styles/style.scss b/packages/web-forms/src/assets/styles/style.scss index 689b731ce..03a2ba38f 100644 --- a/packages/web-forms/src/assets/styles/style.scss +++ b/packages/web-forms/src/assets/styles/style.scss @@ -80,6 +80,9 @@ /* Overlays like modals, popups, or dialogs above form content */ --odk-z-index-overlay: 100; + /* Floating feedback button */ + --odk-z-index-feedback-button: 900; + /* Critical UI elements (e.g., loading spinners, toast notifications) */ --odk-z-index-topmost: 1000; } diff --git a/packages/web-forms/src/components/common/map/MapBlock.vue b/packages/web-forms/src/components/common/map/MapBlock.vue index eecdd4925..3fb06aca7 100644 --- a/packages/web-forms/src/components/common/map/MapBlock.vue +++ b/packages/web-forms/src/components/common/map/MapBlock.vue @@ -262,7 +262,7 @@ const saveAdvancedPanelCoords = (newCoords: Coordinate) => { border: 1px solid var(--odk-border-color); border-radius: var(--odk-radius); overflow: hidden; - // Fixes iPhone select issues on map + // iPhone - fixes select issues on map -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; @@ -295,18 +295,31 @@ const saveAdvancedPanelCoords = (newCoords: Coordinate) => { } .map-container.map-full-screen { + position: fixed; + inset: 0; display: flex; flex-direction: column; - justify-content: flex-start; - position: fixed; - top: 0; - left: 0; - height: 100vh; width: 100vw; + height: 100dvh; z-index: var(--odk-z-index-topmost); + background: var(--odk-base-background-color); + border-radius: 0; + + // Prevent background scroll-chaining + overscroll-behavior: none; + // Hand touch gestures (zoom/pan) exclusively to the map engine + touch-action: none; .map-block { - flex-grow: 2; + flex: 1 1 0; + width: 100%; + min-height: 0; + height: auto; + } + + :deep(.map-status-bar), + :deep(.advanced-panel) { + flex-shrink: 0; } } diff --git a/packages/web-forms/src/demo/FeedbackButton.vue b/packages/web-forms/src/demo/FeedbackButton.vue index b3cc43bf7..0ebfc3858 100644 --- a/packages/web-forms/src/demo/FeedbackButton.vue +++ b/packages/web-forms/src/demo/FeedbackButton.vue @@ -41,7 +41,7 @@ const surveyLink = computed(() => { right: 0; bottom: 150px; height: 4rem; - z-index: var(--odk-z-index-topmost); + z-index: var(--odk-z-index-feedback-button); border-top-left-radius: var(--odk-radius); border-top-right-radius: var(--odk-radius); text-align: center;