Repository navigation
feat(app,web): ease what the map shows by zoom, on one hex system - #734
Conversation
|
Review before merge: three points to change, one question, merge-order notes. Point 2 checked in the code at 2104e11; the rest found by reading the code, not run. 1. The website map fades to nearly empty during a zoom of more than about one level (change requested) 2. A stored 3D view comes back as 2D (change requested) 3. Hover and click can hit the invisible slot (change requested) 4. Question: two heatmap requests per refresh 5. Merge order with the exports, #711 and #740
6. Small ones (app)
|
Everything the map showed or hid by zoom was a step: a threshold crossed, the data rebuilt, the thing there or gone in one frame. A share between 0 and 1 is now handed to the style as a zoom expression, so the map eases it while the fingers move. The app takes the server's cell sizes, one per zoom level at about 28 px, and gives up its ten bands in metres. Two sizes are on the map while one takes over from the other. The points and the earlier rides fade in over a hex that stays at full strength, the cell names fade in, and Auto takes the place of Both. In 3D the pillars wait for zoom 19. The numbers are Kasper's, picked in a mockup on 29 September 2026, and live in zoomfade.js, one file on both surfaces. Closes efiten#634 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2104e11 to
c96eb0e
Compare
|
Pushed c96eb0e for the review, rebased on master (#710, #712, #715). Per point:
App: 1671 tests, eslint, build. Web: 811 tests, eslint, Playwright 305 passed. |
Resolves the overlap with efiten#732 (narrow line 640 -> 767) and efiten#734 (hexgrid sizes, zoomfade parity): - barnarrow.js keeps efiten#725's per-control breakpoint (Export leaves below 900px) with NARROW_PX = 767; NARROW_MEDIA is built from it. - barnarrow.test.js: the stylesheet-width test accepts NARROW_MEDIA's width or a width a control leaves earlier at (Export's 900). - parity.test.js lists both zoomfade.js and hexgrid.js; web/hexgrid.js is recopied from app/src/hexgrid.js after efiten#734. - style.css and export.spec.js comments say 768 instead of 640.
🤖 I have created a release *beep* *boop* --- <details><summary>app: 1.30.0</summary> ## [1.30.0](app-v1.29.1...app-v1.30.0) (2026-09-30) ### Features * **app,web:** ease what the map shows by zoom, on one hex system ([#734](#734)) ([4c2a57b](4c2a57b)) * **app,web:** name a relay on the map the way the app does ([#733](#733)) ([a9aa01a](a9aa01a)) * **app:** send one broker to several collectors under one switch ([#722](#722)) ([8c6da30](8c6da30)) * **web:** export the repeaters heard in view as a 1200×1200 PNG ([#725](#725)) ([d6186bc](d6186bc)) ### Bug Fixes * **app,web:** hang a Discover-heard repeater's star from its own position ([#724](#724)) ([15a6ada](15a6ada)) * **app,web:** put the caret in the target picker's search when it opens ([#721](#721)) ([6bd899c](6bd899c)) * **app:** drop the float window's previous and next buttons ([#717](#717)) ([c957ff3](c957ff3)) * **app:** give the sound the playback buffer instead of the smallest ([#712](#712)) ([dee5484](dee5484)) * **app:** hide Chrome's pause on the fullscreen readout ([#715](#715)) ([836d91e](836d91e)) * **app:** keep a space under the HUD on Android ([#710](#710)) ([2754716](2754716)) * **app:** let the fullscreen readout turn with the phone ([#718](#718)) ([fae3749](fae3749)) * **app:** put the transmit pop under the receptions it sat over ([#738](#738)) ([2bfc5fa](2bfc5fa)) * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **web:** keep the map bar on one row between 641 and 767 px ([#732](#732)) ([c44dc1d](c44dc1d)) </details> <details><summary>server: 1.10.1</summary> ## [1.10.1](server-v1.10.0...server-v1.10.1) (2026-09-30) ### Bug Fixes * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **server:** read a refused frame again when the message-id decoder changes ([#737](#737)) ([8586c71](8586c71)) </details> <details><summary>web: 1.26.0</summary> ## [1.26.0](web-v1.25.1...web-v1.26.0) (2026-09-30) ### Features * **app,web:** ease what the map shows by zoom, on one hex system ([#734](#734)) ([4c2a57b](4c2a57b)) * **app,web:** name a relay on the map the way the app does ([#733](#733)) ([a9aa01a](a9aa01a)) * **app:** send one broker to several collectors under one switch ([#722](#722)) ([8c6da30](8c6da30)) * **web:** export the repeaters heard in view as a 1200×1200 PNG ([#725](#725)) ([d6186bc](d6186bc)) ### Bug Fixes * **app,web:** hang a Discover-heard repeater's star from its own position ([#724](#724)) ([15a6ada](15a6ada)) * **app,web:** put the caret in the target picker's search when it opens ([#721](#721)) ([6bd899c](6bd899c)) * **app:** drop the float window's previous and next buttons ([#717](#717)) ([c957ff3](c957ff3)) * **app:** give the sound the playback buffer instead of the smallest ([#712](#712)) ([dee5484](dee5484)) * **app:** hide Chrome's pause on the fullscreen readout ([#715](#715)) ([836d91e](836d91e)) * **app:** keep a space under the HUD on Android ([#710](#710)) ([2754716](2754716)) * **app:** let the fullscreen readout turn with the phone ([#718](#718)) ([fae3749](fae3749)) * **app:** put the transmit pop under the receptions it sat over ([#738](#738)) ([2bfc5fa](2bfc5fa)) * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **web:** keep the map bar on one row between 641 and 767 px ([#732](#732)) ([c44dc1d](c44dc1d)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
What the map shows at a zoom is now a share the style eases, where it was a step in JS. App and website draw their cells by one rule, the server's.
What was there
Five rules changed the map in one frame when a zoom threshold was crossed: the hex resolution bands, the outlines of earlier rides, the cell names, and on the website the server's resolution per zoom level. Hex and points together was a manual view,
both. The app binned in ten bands of a fixed size, the server in one size per zoom level.What this PR does
The numbers are Kasper's. He picked them on 29 September 2026 in a mockup with 4559 receptions between Nijmegen and Arnhem, by pinching through it on a phone, in 2D and in 3D. They are recorded on #634 and in
docs/2026-09-29-zoom-transitions.md.app/src/hexgrid.jstakes the server's sizes: one per zoom level, about 28 px tall. The ten bands in metres are gone.bothreads as auto.zoomfade.jsholds the numbers and builds the expressions. It is one file on both surfaces, pinned inweb/parity.test.js.Measured in MapLibre 4.7.1
['zoom']is only accepted as the input of a top-levelinterpolateorstep. The per-feature value (['get', 'op'],['get', 'height']) rides in each stop's output.fill-extrusionof height 0 still draws an opaque polygon on the ground. With several cell sizes stacked, the ones with nothing to show covered the one that had. A layer with nothing to show is switched off by asteponfill-extrusion-opacity.docs/2026-09-04-new-versus-old-on-the-map.mdrecords.Verification
zoomfade.test.js: the shares at their ends and midpoints, the pair adding up to 1 at every 0.05 zoom for both widths, no third size anywhere, and stops that rise in every expression for every resolution and view.web/e2e/zoomfade.spec.js: five cases. Two fail when the rule is taken out: asking for one size only, and fetching the points at every zoom.targetpicker.spec.js:198andui.spec.js:502, depend on timing. The second passed 4 of 4 when run alone.Not verified: the motion itself. The browser pane was in the background, so the checks are still frames and measurements.
Not in this PR
web/hexgrid.js. This PR does not touch that file. Whichever merges second has to check the cell sizes agree.Closes #634
🤖 Generated with Claude Code