* Send pageCursor next to cursor for packets, nodes and observers
* Page nodes by the exact cursor when the server sends one
* Page packets by the exact cursor when the server sends one
* Retry a busy 503 or a 429 after the server's Retry-After
* Bump version to 2.1.0
* Recover from an invalid pageCursor; cap 503 waits
Map and Nodes fetch a region at the server's 200 cap instead of 50, a
quarter of the requests. A 429 now pauses paging until Retry-After and
retries the refused page, instead of stopping with "Some nodes failed to
load".
Chrome on macOS lays an emoji out 1em wide but paints Apple's about 1.25em
wide at small sizes on standard-density screens, so it overlapped the next
letter (☠️Grunt, 🍓Strawberry). Each emoji in a node, observer or sender
name, and in channel messages, now sits in its own span that gets 0.3em of
extra room below 1.5x density. Retina screens render unchanged.
* Speed up the Nodes table: mount only on-screen rows and sort with a shared collator
* Fit the Nodes table beside the detail panel and tidy virtualization
Name takes a 22% share and the table's floor drops to 52rem, so 1280 and
1366 px laptops no longer scroll sideways with a node open. Long names get
a title. Card dividers follow list position so heights stay put, cards and
rows cache sizes apart, getItemKey stays stable, and the table reports its
full row count to screen readers. Tests share one layout stub instead of a
global offsetHeight shim.
* Add live map lit-node and label helpers
* Add solid lit icons with a built-in ring
* Light crossed nodes as solid icons, newest on top
* Show idle repeaters and companions as dots in Live Map
* Disable the clustering control during Live Map
* Turn clustering off while Live Map is on
* Keep the live map helpers lint-clean
* Let a click on a lit icon win over the dot beneath it
* Tidy live map clicks, comments and filtered selection
The server now nulls a location on an explicit 0/0 advert and the WS nodeUpdate
event mirrors that: omitted lat/lng keeps the current position, null clears it.
patchNodeSummary used ?? so a clear was ignored.
Bugs: clear compare params on tab change, recover channel live messages after a 429,
observer copy link keeps only region params, route table no longer navigates on region
change with nothing selected, map borders memo on data identity, live overview can't
resurrect a failed query, French relative times, no language write on first visit,
0/0 node locations hidden outside the map, path/signal stats use the shared retry rule.
i18n: node/packet/mesh/observer strings that were still hardcoded after #62.
Cleanup: formatUtc, ACTION_BUTTON_CLASS, observer-stats, useWindowedStats, observer-id;
observer pages use StatCard/Card/Field/Segmented/SearchBar/SelectDropdown; one details
chrome on the stats tabs; comment and translations-guide trims; localStorage stub for
Node 26 in the test setup.
Lands the stacked web PRs #75, #79, #80, #81, #83, #85, #87, #89, #92, #95 and #99 in one squash. Server counterparts #166-#176 are merged. Remaining review items follow in a fix PR.