Carries two commits that were pushed to #31 after it had already been merged, so they never reached main.
1. Reloading /statistics downloaded a file
A server bug, and pre-existing rather than something the recent UI work introduced.
src/api/assets.rs answers /, /map, /digital-modes, /recorder, /settings and /about with the application shell, but never had a route for /statistics — or for /bookmarks. Both fell through to the catch-all #[get("/{filename}")] asset handler, which served them as a file download.
Only in-app navigation worked, which is why it stayed hidden: you reach those pages by clicking, and nobody reloads on them often. Adds the two missing shell routes.
/bookmarks is worth a reload test too — it had the identical fault.
2. Statistics sat 16px inside every other page
#tab-statistics was the only panel carrying padding: 1rem of its own, so its title and content began 16px right of where every other page starts. Removing it lines the page up with the header and its siblings — title now at the same left edge as the header block.
3. The tab strip ran under the controls
Introduced by the menu-clipping fix: removing the strip's overflow-x left it unable to shrink below its content, so at around 1280px the Map tab sat beneath the audio button and Tools beneath REC.
Clipping is safe again — the menus the strip anchors are reparented to the body when they open — so the strip can shrink once more, and labels give way to icons at 1360px rather than 1180px, before it has to clip anything. Measured 321px of clearance at 1280px.
Verification
Chromium at 1280px: no overlap between strip and controls, page title flush with the header. cargo build -p trx-frontend-http and its tests pass; frontend gate green — lint, 34/34 test, build, test:browser.
Still open
This does not explain the "inner window" padding you described — I could not reproduce that against the test fixture, which serves no decode history. Worth checking whether a wrapper appears between the panel and the cards only when real data is present.
Carries two commits that were pushed to #31 after it had already been merged, so they never reached main.
## 1. Reloading /statistics downloaded a file
A **server** bug, and pre-existing rather than something the recent UI work introduced.
`src/api/assets.rs` answers `/`, `/map`, `/digital-modes`, `/recorder`, `/settings` and `/about` with the application shell, but never had a route for `/statistics` — or for `/bookmarks`. Both fell through to the catch-all `#[get("/{filename}")]` asset handler, which served them as a file download.
Only in-app navigation worked, which is why it stayed hidden: you reach those pages by clicking, and nobody reloads on them often. Adds the two missing shell routes.
**`/bookmarks` is worth a reload test too** — it had the identical fault.
## 2. Statistics sat 16px inside every other page
`#tab-statistics` was the only panel carrying `padding: 1rem` of its own, so its title and content began 16px right of where every other page starts. Removing it lines the page up with the header and its siblings — title now at the same left edge as the header block.
## 3. The tab strip ran under the controls
Introduced by the menu-clipping fix: removing the strip's `overflow-x` left it unable to shrink below its content, so at around 1280px the Map tab sat beneath the audio button and Tools beneath REC.
Clipping is safe again — the menus the strip anchors are reparented to the body when they open — so the strip can shrink once more, and labels give way to icons at 1360px rather than 1180px, before it has to clip anything. Measured 321px of clearance at 1280px.
## Verification
Chromium at 1280px: no overlap between strip and controls, page title flush with the header. `cargo build -p trx-frontend-http` and its tests pass; frontend gate green — `lint`, 34/34 `test`, `build`, `test:browser`.
## Still open
This does **not** explain the "inner window" padding you described — I could not reproduce that against the test fixture, which serves no decode history. Worth checking whether a wrapper appears between the panel and the cards only when real data is present.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01GdyUjuXejCEfiub675z6cz
Two faults, both mine, both visible in one screenshot of that page.
#tab-statistics was the only panel with padding of its own, so its title
and content sat 16px inside where every other page begins. Remove it and
the page lines up with the header and with its siblings.
Removing the tab strip's `overflow-x` left it unable to shrink below its
content, so at around 1280px it ran under the controls: the Map tab sat
beneath the audio button and Tools beneath REC. Clipping is safe again —
the menus it anchors are reparented to the body when they open — so the
strip can shrink, and the labels now give way to icons at 1360px rather
than 1180px, before it has to clip anything.
Measured at 1280px: 321px of clearance between the strip and the
controls, and the page title at the same left edge as the header.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GdyUjuXejCEfiub675z6cz
Signed-off-by: Stan Grams <sjg@haxx.space>
The server answers /, /map, /digital-modes, /recorder, /settings and
/about with the application shell, but never had a route for /statistics
or /bookmarks. Both fell through to the catch-all asset handler, so
reloading on either one downloaded a file instead of reopening the page.
Only in-app navigation worked, which is why it went unnoticed until
Statistics was reachable from the Tools menu.
Add the two missing shell routes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GdyUjuXejCEfiub675z6cz
Signed-off-by: Stan Grams <sjg@haxx.space>
sjg
merged commit 00191c8d7a into main2026-08-03 00:08:49 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Carries two commits that were pushed to #31 after it had already been merged, so they never reached main.
1. Reloading /statistics downloaded a file
A server bug, and pre-existing rather than something the recent UI work introduced.
src/api/assets.rsanswers/,/map,/digital-modes,/recorder,/settingsand/aboutwith the application shell, but never had a route for/statistics— or for/bookmarks. Both fell through to the catch-all#[get("/{filename}")]asset handler, which served them as a file download.Only in-app navigation worked, which is why it stayed hidden: you reach those pages by clicking, and nobody reloads on them often. Adds the two missing shell routes.
/bookmarksis worth a reload test too — it had the identical fault.2. Statistics sat 16px inside every other page
#tab-statisticswas the only panel carryingpadding: 1remof its own, so its title and content began 16px right of where every other page starts. Removing it lines the page up with the header and its siblings — title now at the same left edge as the header block.3. The tab strip ran under the controls
Introduced by the menu-clipping fix: removing the strip's
overflow-xleft it unable to shrink below its content, so at around 1280px the Map tab sat beneath the audio button and Tools beneath REC.Clipping is safe again — the menus the strip anchors are reparented to the body when they open — so the strip can shrink once more, and labels give way to icons at 1360px rather than 1180px, before it has to clip anything. Measured 321px of clearance at 1280px.
Verification
Chromium at 1280px: no overlap between strip and controls, page title flush with the header.
cargo build -p trx-frontend-httpand its tests pass; frontend gate green —lint, 34/34test,build,test:browser.Still open
This does not explain the "inner window" padding you described — I could not reproduce that against the test fixture, which serves no decode history. Worth checking whether a wrapper appears between the panel and the cards only when real data is present.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GdyUjuXejCEfiub675z6cz