The map keeps the wheel; the edge strips carry the page

Driver: "two finger scrolling on the map should allow me to interact with
the map, but instead it just scrolls down past the map and does not
interact with the map -- that's what the scroll side bars are there for, to
let me interact with the map AND have a way to scroll down past the map."

REPRODUCED before touching anything: wheel over the centre of the map in
research-map-plus-grid moved scrollY 0 -> 480 and the camera never moved.
The map was inert exactly where it is the main control.

CAUSE: _syncScrollZoomToHost disabled scroll-zoom whenever the document or
an ancestor could scroll -- which is ALWAYS true in a composite that stacks
a grid under a map. It was not careless: it fixed
BUG-CANNOT-SCROLL-DOWN-TO-THE-GRID, where the map ate every wheel and the
grid below could not be reached. But that bug already had a second fix --
the .map-scroll-edge gutters, a dedicated page-scroll lane down both sides,
which the Map constructor's own note calls "the single-finger page-scroll
escape". Two fixes for one bug, and the second silently undid the feature
while leaving the first redundant.

So scroll-zoom now stays enabled and the strips carry the page. The
docScrolls/ancestorScrolls probe stays, because the edge affordance keys its
gray indicator off the same question.

MEASURED on the built tree, 1280x900:
  wheel x4 over map centre    scrollY 0 -> 0     map takes the gesture
  wheel x4 over edge strip    scrollY 0 -> 480   escape still works
  (two strips, 46px wide each)
And the repo's own fitness gate, which exists for this property:
  check:fits-screen 17/17 PASS -- including "the grid is reachable" and
  "the wheel is targeted", so the bug this replaced has not returned.

DashboardMapPanel carries the same helper and was deliberately NOT changed:
different layout contract (map inside a fixed shell with facet/table/rail
columns), and fits-screen passes it today as "wheel escapes every column".
Flagged in the ledger for the Driver rather than altered on the strength of
a report about a different surface.

gates:pre 0. gates:post 17/18, the single failure being the pre-existing
verify/tables-complete break from the visa-leak fix.
This commit is contained in:
doxa-maps-88655c70 2026-09-24 03:47:28 +00:00
parent 6ba36817eb
commit 72be2bee84
6 changed files with 73 additions and 50 deletions

View file

@ -121,8 +121,31 @@ function _syncScrollZoomToHost(m) {
const docScrolls = doc.scrollHeight > window.innerHeight + 4
const host = (m.getContainer && m.getContainer()) || null
const ancestorScrolls = host ? !!_findScrollportAncestor(host) : false
if (docScrolls || ancestorScrolls) m.scrollZoom.disable()
else m.scrollZoom.enable()
// ★ THE MAP KEEPS THE GESTURE. THE EDGE STRIPS ARE THE WAY PAST IT.
// Driver, 2026-09-24: "two finger scrolling on the map should allow me to interact with the
// map, but instead it just scrolls down past the map and does not interact with the map —
// that's what the scroll side bars are there for, to let me interact with the map AND have a
// way to scroll down past the map."
//
// This used to disable scroll-zoom whenever the page or an ancestor could scroll, which is
// ALWAYS true in the research-map-plus-grid composite (a map with a grid stacked under it).
// MEASURED before this change, wheel over the centre of the map in that composite:
// scrollY 0 -> 480 and the camera never moved. The map was inert exactly where it is the
// main control.
//
// It was not a careless choice — it fixed BUG-CANNOT-SCROLL-DOWN-TO-THE-GRID, where the map
// ate every wheel and the grid below was unreachable. But that bug had already been solved a
// second way: the .map-scroll-edge gutters (useEdgeScrollAffordance, pointer-events:auto,
// touch-action:pan-y) are a dedicated page-scroll lane down both sides, and the note at the
// Map constructor says so outright — "the single-finger page-scroll escape is NOW the gray
// side-edge affordance". With the strips in place, releasing the wheel as well made the map
// non-interactive and left the strips redundant. Two fixes for one bug, and the second one
// silently undid the feature.
//
// So: keep scroll-zoom ON, and let the strips carry the page. `docScrolls`/`ancestorScrolls`
// are still computed because the edge affordance below keys its gray indicator off the same
// question — a map with nothing stacked under it should not advertise a scroll lane.
m.scrollZoom.enable()
} catch (_) { /* an engine without scrollZoom must never break the panel */ }
}
function loadPoster() {

File diff suppressed because one or more lines are too long

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
<script src="../doxa-research-map.js" integrity="sha384-m4l+f0dtSiobgVmlkVLdbrLtQ1XwOTEmN2S++QZFqsYdTeEVuSDMl96aTudjoqB4" crossorigin="anonymous"></script>
<script src="../doxa-research-map.js" integrity="sha384-oecoezttPmpRe5GNG/Yko6IkEbtLjCD7PD7qghU1ZigprnfLKhbf0eBEiEbE24iR" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -27,7 +27,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <doxa-research-map> custom element. -->
<script src="../../doxa-research-map.js" integrity="sha384-m4l+f0dtSiobgVmlkVLdbrLtQ1XwOTEmN2S++QZFqsYdTeEVuSDMl96aTudjoqB4" crossorigin="anonymous"></script>
<script src="../../doxa-research-map.js" integrity="sha384-oecoezttPmpRe5GNG/Yko6IkEbtLjCD7PD7qghU1ZigprnfLKhbf0eBEiEbE24iR" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -331,7 +331,7 @@
"bundle": "doxa-research-map",
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"output": "doxa-maps/doxa-research-map/doxa-research-map.js",
"integrity": "sha384-m4l+f0dtSiobgVmlkVLdbrLtQ1XwOTEmN2S++QZFqsYdTeEVuSDMl96aTudjoqB4",
"integrity": "sha384-oecoezttPmpRe5GNG/Yko6IkEbtLjCD7PD7qghU1ZigprnfLKhbf0eBEiEbE24iR",
"elements": [
"doxa-research-map"
],
@ -347,7 +347,7 @@
"scriptUrl": "./doxa-research-map/doxa-research-map.js",
"embed": {
"iframe": "<iframe src=\"./doxa-research-map/research-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-m4l+f0dtSiobgVmlkVLdbrLtQ1XwOTEmN2S++QZFqsYdTeEVuSDMl96aTudjoqB4\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./doxa-research-map/doxa-research-map.js\" integrity=\"sha384-oecoezttPmpRe5GNG/Yko6IkEbtLjCD7PD7qghU1ZigprnfLKhbf0eBEiEbE24iR\" crossorigin=\"anonymous\"></script>\n<doxa-research-map profile-config='{\"profile\":\"research-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></doxa-research-map>"
},
"instances": [
{