You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Attribution and layer affordances near the same visual field.
Each piece is useful by itself, but the app lacks one mobile HUD arbitration contract. The user-facing symptom is a dashboard-like field tool where point data, atmospheric transmission, dusk/sun-up context, and phone hardware controls compete rather than compose.
Evidence from read-only inventory
src/app.css defines --field-bottom-reserve and --map-toolbar-inset-rem, plus a stacking comment for the map overlays, but this is not yet a full layout owner.
TransmissionSheet.svelte is a full-width mobile bottom sheet at bottom: 0, z-index: 12.
PointReadout.svelte has its own mobile bottom offset and right inset, z-index: 11.
EphemerisGantt.svelte has a static toolbar inset and fixed bottom rail, z-index: 6.
MapToolbar.svelte is fixed lower-right; the comment says it publishes toolbar sizing, but the implementation currently relies on static CSS vars rather than measured layout state.
docs/sprint-ui-polish.md described an earlier lower-right collision track. Parts landed, but the point-readout + transmission + twilight + toolbar combination needs a product-level mobile field HUD pass.
Live local browser capture was intentionally not performed here because this workstation lacks the Playwright browser binary and the repo posture is remote execution only. Regression evidence for this issue should come from CI / GloriousFlywheel browser proof, not local test/build/check execution.
Scope
Define a single map-overlay layout owner, either CSS-token first or a small Svelte/Effect layout coordinator, for reserved regions: bottom rail, right toolbar, bottom sheet, point readout, attribution, and transient popovers.
Coordinate point readout and atmospheric transmission instead of independently stacking by z-index. Candidate patterns: tabbed bottom sheet, stacked sheet states, or a compact collapsed summary with one expanded panel at a time.
Keep the twilight rail visible and tappable in normal field mode. It may be intentionally covered only by an explicit expanded sheet state.
Ensure lower-right hardware controls do not compete with bottom sheets or point data. Candidate patterns: measured toolbar inset, top/right relocation while sheets are open, or a compact overflow toolbar on phone widths.
Preserve Skeleton popover behavior and keep help/provenance popovers inside the visible viewport on touch devices.
Integrate with the Effect/runes lifecycle direction so measured resize/orientation/safe-area/device-state cleanup is scoped and regression-safe.
Acceptance
At 375x667, 390x844, 430x932, and 844x390, the point readout, transmission sheet, lower-right controls, twilight rail, and attribution do not visually collide in default and active states.
Touch targets remain at least 44px where practical; no control is hidden behind another overlay.
The user can open point readout, open/close transmission, operate compass/location controls, and tap/scrub the twilight rail without losing map context.
Expanded sheet states deliberately reserve or cover space; collapsed states leave the twilight rail and core controls available.
Regression evidence is produced through remote CI / GloriousFlywheel browser evidence.
Atmospheric modeling tickets remain separate: this issue owns layout arbitration, not PM2.5 model correctness or GIBS no-data semantics.
Linear: https://linear.app/tinyland/issue/TIN-1734/mobile-field-hud-layout-contract-for-non-competing-readout
Problem
The mobile field UI has several independently positioned surfaces competing for the lower viewport:
PointReadout.sveltefixed readout near the lower right / lower center.TransmissionSheet.sveltemobile bottom sheet for atmospheric transmission.EphemerisGantt.sveltebottom twilight rail with current-time staff marker and phase labels.MapToolbar.sveltelower-right hardware/control buttons.Each piece is useful by itself, but the app lacks one mobile HUD arbitration contract. The user-facing symptom is a dashboard-like field tool where point data, atmospheric transmission, dusk/sun-up context, and phone hardware controls compete rather than compose.
Evidence from read-only inventory
src/app.cssdefines--field-bottom-reserveand--map-toolbar-inset-rem, plus a stacking comment for the map overlays, but this is not yet a full layout owner.TransmissionSheet.svelteis a full-width mobile bottom sheet atbottom: 0,z-index: 12.PointReadout.sveltehas its own mobile bottom offset and right inset,z-index: 11.EphemerisGantt.sveltehas a static toolbar inset and fixed bottom rail,z-index: 6.MapToolbar.svelteis fixed lower-right; the comment says it publishes toolbar sizing, but the implementation currently relies on static CSS vars rather than measured layout state.docs/sprint-ui-polish.mddescribed an earlier lower-right collision track. Parts landed, but the point-readout + transmission + twilight + toolbar combination needs a product-level mobile field HUD pass.Live local browser capture was intentionally not performed here because this workstation lacks the Playwright browser binary and the repo posture is remote execution only. Regression evidence for this issue should come from CI / GloriousFlywheel browser proof, not local test/build/check execution.
Scope
Acceptance
375x667,390x844,430x932, and844x390, the point readout, transmission sheet, lower-right controls, twilight rail, and attribution do not visually collide in default and active states.Related