feat(app): draw earlier rides as coverage and outlines, pulse the newest reception, and name the nodes in a hex cell - #579
Open
khagele wants to merge 1 commit into
Open
Conversation
…est reception, and name the nodes in a hex cell The map drew a live reception and the stored backlog the same way (efiten#556): open the app mid-hunt and what lands right now, the thing you steer on, was indistinguishable from what already stood there. Age fade encodes age, not arrival. Decided against a rendered design (Kasper, 2026-09-04), in 2D: - "Old" is everything before the current ride (rides.js): a gap of more than 10 minutes between consecutive receptions ends a ride. Not the app-open moment, so a restart mid-hunt keeps one ride. - Below zoom 15 a backlog reception is coverage only, its hex cell. From zoom 15 it comes back as an outline circle in its tier colour, no fill, heavier stroke; this ride is drawn filled as before. Age fade rides on top of both. - The newest reception pulses once, 1.6 s, in its tier colour, and only when the filter would draw it. A timer, not requestAnimationFrame, so it runs while the page is not painting. - From zoom 16 a hex cell names the nodes heard in it (hexlabels.js): 4-character id prefixes, newest first, three at most, then +N. Never from a hash kind or a record without an id (efiten#558). HTML markers like the node layer, since the bare fallback style has no glyphs. The 3D views keep their drawing; layerVisibility says so for the labels. docs/2026-09-04-new-versus-old-on-the-map.md records the decisions and the alternatives. Verified: app 911 unit tests, build and eslint clean; web 509 and the whatsnew e2e. Browser at 360 with seeded receptions, an earlier ride 25 minutes back and this ride now, both inside the window: zoom 14 draws the 4 ride points and no backlog point; zoom 15 draws 5 backlog outlines beside them; zoom 16 labels the cells "7e76" and "7e76 4ac3" with the 1-byte hash contributing nothing; a new reception pulses from 8 to 24 px and clears; a reception the target filter hides does not pulse. Closes efiten#556 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #556
The problem
The map drew a live reception and the stored backlog the same way. Open the app mid-hunt and the screen filled with everything in the time window; what landed right now, the thing you steer on, was indistinguishable from what already stood there. Age fade encodes age, not arrival: a 20-minute-old point looked the same whether it was on screen all along or loaded a second ago.
The refinement pass in the issue thread settled the form against a rendered design (four drawings of one drive).
My changes in this PR
All in 2D; the 3D views keep their drawing.
app/src/rides.js). A gap of more than 10 minutes between consecutive receptions ends a ride. Not the app-open moment: a restart mid-hunt keeps one ride, and yesterday's drive is old however wide the window is.requestAnimationFrame, so it runs while the page is not painting.app/src/hexlabels.js): 4-character id prefixes, newest first, three at most, then+N. A prefix comes only from a record with a node id;direct_hashandpath_hashnever contribute one, and a refused identity has none (app: traffic from a node whose adverts fail verification cannot be found or grouped #558). Drawn as HTML markers like the node layer, since the bare fallback style has no glyphs for a symbol layer.layerVisibilitycarries the labels with the flat hex layer, in 2D only.docs/2026-09-04-new-versus-old-on-the-map.md. Changelog entry in both copies.Verification
whatsnew.spec.js,--fail-on-flaky-testsUnit tests cover the ride split (a gap exactly on the threshold stays one ride, unsorted input, unparseable rows, one ride, none), backlog membership with no ride known, both zoom thresholds, the label rules (newest first, one prefix per node across id variants, hash kinds and missing ids excluded, the
+Ncap) and the visibility rule for the labels in 2D and 3D.Browser at 360x780 with seeded receptions, an earlier ride 25 minutes back and this ride now, both inside the 30-minute window: zoom 14 draws the 4 ride points and no backlog point; zoom 15 draws 5 backlog outlines beside them (
circle-opacity0, stroke 1.5); zoom 16 labels the cells7e76and7e76 4ac3, the 1-byte hash contributing nothing; a new reception pulses from 8 to 24 px and clears; a reception the target filter hides does not pulse.Decisions worth a look
🤖 Generated with Claude Code