Typing narrows both groups: airports match on code or display name,
regions match on their name or on any member code — a code-only match
tags the row with the code that hit, so it doesn't look like a stray
result. Empty groups drop their headers so the divider never dangles.
The panel body moves into its own component so the query dies with the
dropdown, and focus returns to the trigger on close.
Drops the Open analyzer and Copy link buttons from the expansion; the analyzer popup keeps its own copy link. Table rows butt up against each other now, so the whole strip is a click target.
The header and the rows are separate grids, so the shared track list can't use ch or auto — each resolved them differently and the columns drifted apart. Observer moves into the expansion to free the column.
The analyzer drawer and path-map restore both read the live ?hash and
fetch by hash directly, independent of whether the packet is in the
loaded list. Deleting the param once the first page settles without a
match unmounts the drawer and can drop path-map restores, for any
shared link more than a couple of minutes old.
- Stop resetting selectedObservationId when opening the analyzer, so picking an
observation inside an expanded row lands the drawer on it instead of observations[0]
- Disable View path on map in the expanded row when the detail has no resolvable path,
matching the drawer's existing button
- Strip a ?hash deep link once the first page has loaded and it matches no packet
Draw each active IATA's GeoJSON region border as an outline over a faint
fill beneath the node markers, behind a Map Settings toggle that's off by
default and shareable via a URL param. IATAs with no border answer 204
and are skipped.
List repeaters and room servers whose advert-derived clock has drifted
past the server threshold, worst first, in a sortable table. It's each
node's latest reading, so there's no time range to pick.