Conversation
2de3e3d to
7864ccf
Compare
|
Review of this PR's own commit (7864ccf): four points to change, small ones below. Points 1 and 2 checked in the code at 7864ccf; the rest found by reading the code, not run. 1. The export's cells are not the cells the map draws (change requested) 2. Picked targets are placed by key prefix at any length (change requested) 3. A nameless picked node draws the word "undefined" (change requested) 4. The mapped-cells query can hit the cap silently (change requested) 5. Small ones
|
7864ccf to
55cb517
Compare
|
Pushed 55cb517 for the review, rebuilt on #726 (b22cbd1). Per point:
Web: 850 tests, eslint, Playwright 305 passed. |
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`. | | 2D | 3D | |---|---|---| | Points of this ride | fade in from zoom 13.25 to 18.25 | one step at zoom 19 | | Hex | stays at 100% | 95% of the bar height from zoom 19 | | Earlier rides (app) | fade in from zoom 11.25 to 18.75 | with the points, at zoom 19 | | Cell names (app) | fade in from zoom 15.5 to 16.5 | not drawn in 3D, as before | | Two cell sizes | blend over 0.95 zoom level | blend over 0.75 zoom level | - **One hex system.** `app/src/hexgrid.js` takes the server's sizes: one per zoom level, about 28 px tall. The ten bands in metres are gone. - **Two cell sizes at a time.** A size hands over to its neighbour around every change, and the two shares add up to 1. Two hex layers hold them, the even resolutions in one and the odd in the other. The pair moves up at a whole zoom, where the size that stays is at 100% and the other two are at 0. - **The website asks for two sizes**, one heatmap request each. Where the server answers both with the same size, that size is drawn once and stays in full. - **Auto replaces Both**, in the app's view cycle and in the website's segmented control. A stored view or a link that says `both` reads as auto. - **In 3D the pillars wait for zoom 19.** Up to there the hex is drawn as bars, also in auto. #266 drew it flat under the pillars. - **Nothing is built for a share of 0.** In auto the points are not built below their zoom, and the website does not fetch them. - **A cell names one node.** A cell is 28 px tall and about 24 wide at every zoom, which holds four characters. The label is the prefix of the node heard last, with the count of the others under it. It was three prefixes on one line. `zoomfade.js` holds the numbers and builds the expressions. It is one file on both surfaces, pinned in `web/parity.test.js`. ## Measured in MapLibre 4.7.1 - `['zoom']` is only accepted as the input of a top-level `interpolate` or `step`. The per-feature value (`['get', 'op']`, `['get', 'height']`) rides in each stop's output. - A `fill-extrusion` of 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 a `step` on `fill-extrusion-opacity`. - In 3D a share is spent on the bar's height. Alpha dissolves toward black, as `docs/2026-09-04-new-versus-old-on-the-map.md` records. ## Verification - app vitest 1661 of 1661, web vitest 810 of 810, eslint clean in both, the app builds. - `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. - The app's map, fed the 4559 receptions through a throwaway page: at zoom 13.3 two sizes are up (646 and 1042 cells), no points are built below 13.25, in 3D the pillars are built from zoom 19 (1882 after the collapse). No map errors. - Full e2e locally: 300 of 302 at a load average between 26 and 48. The two that failed, `targetpicker.spec.js:198` and `ui.spec.js:502`, depend on timing. The second passed 4 of 4 when run alone. - Two existing e2e cases changed with the rules: the click on a point inside a cell runs at a zoom where auto shows points, and the 3D case asserts bars and no pillars below zoom 19. Not verified: the motion itself. The browser pane was in the background, so the checks are still frames and measurements. ## Not in this PR - **The server is unchanged.** It stops at resolution 18. The app goes to 21, so a cell stays 28 px up to zoom 20 for the walk-in. On the website a cell grows past 28 px above zoom 17. Kasper chose this on 29 September 2026. - **The noise layer (#410) draws one size**, the one in full at the zoom, without a blend. - **The exports (#725, #726, #729) add `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](https://claude.com/claude-code) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: efiten <erwin.fiten@gmail.com>
A hunter who wants to show how far one repeater reaches has only the map, which draws every repeater at once. A second item in the Export sheet, Reach of one repeater, draws the selected star on the res-8 grid: where it was heard, in the RSSI tiers, where the same hunters drove without hearing it, and where it likely reaches in between. What is filled in is thought from the repeater. Each heard cell gets a line from the repeater. A line is reached up to the next heard cell and not across a silent one: a shadow darkens it until it is heard again. Between neighbouring lines the area where both are reached is filled, when their ends are at most 2 km apart and no silent cell lies in it. The ground comes from the Terrarium tiles the 3D view draws, at zoom 10: a cell is filled only where a 30 m mast sees it over the ground and the earth's bulge. When the tiles cannot all be read, the lines alone decide. Both exports now shade the relief from the same tiles, at the exaggeration from Settings as the 3D view does, and say "relief 7× exaggerated" beside the scale bar. The Export sheet takes a list of items, and the two exports share the offscreen map and the band. Decided with Kasper on renders from real data; recorded in docs/2026-09-27-export-reach.md. Closes efiten#720 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Export sheet drew every repeater in view (efiten#666) or one repeater's reach (efiten#720), not what the filters select: channel messages with a 1-byte sender, say, or two hunted nodes together. A third item, Heard with these filters, draws the selection in view as a 1200×1200 PNG. Heard cells in the tier of the strongest reception, at the cell size the map draws at that zoom; grey where the same hunters drove without it; the nodes it was heard from, placed by reach or by key as the map's layers place them; the relief; and a band titled after the filter, with receptions, cells heard and the share of the cells driven. It does not depend on repeaters, and nothing is filled in: there is no one origin to think from. The reach export's cell and dot layers are shared with it. Decided with Kasper on renders from real data; recorded in docs/2026-09-27-export-selection.md. Closes efiten#728 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55cb517 to
a9935fb
Compare
|
Review of a9935fb (base 957b144, #726's commit). The five points of the earlier review are in the code and tested. Run on a9935fb: web 926 tests, eslint, 1. Question: the band's numbers cover the map view, but the picture only covers the selection 2. One merged target row gives a title and file name with several ids (change requested) 3. Small ones
This PR follows #726. Once #726 is merged, it needs the rebase that drops 957b144. |
Closes #728
Stacked on #724, #725 and #726: the first three commits are those PRs, the last one is this PR.
What it is
A third item in the Export sheet, Heard with these filters, draws what the map's filters select in view as a 1200×1200 PNG. It works for any filter: targets, packet types, id sizes, time and hunters.
selectionCellSize), 180 Mercator units at z11 and 90 at z14.The rules and what was left out:
docs/2026-09-27-export-selection.md.Measured on real data
Channel messages with a 1-byte sender, Nijmegen and Arnhem, 28 August to 27 September 2026:
Code
web/exportselection.js: the model, the heard nodes and the title, in small pure functions.web/exportrender.js: the reach export's cell and dot layers are now shared helpers.web/map.js: the glue, and a__lastSelectiontest hook.Verification
Not in it
🤖 Generated with Claude Code