A ?hash selection outside the loaded or filtered results now shows an Open analyzer notice with loading, error/retry and dismiss states, using the existing detail query.
Airtime telemetry is on-air seconds, so chart it as a percent of elapsed time.
Add channel busy, packets heard, SNR heard and payload type charts from the
new per-observer activity endpoint; hidden until the server has it.
origin/main is the squash-merge of PR #20 (v1.2.1). Its tree is identical to
dev's bc62d28, which dev already builds on, so the conflicts were an artifact of
the squash rather than real divergence -- keep dev's tree wholesale.
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