Skip to content

Mobile field HUD: non-competing point readout, transmission sheet, toolbar, and twilight rail #312

@Jesssullivan

Description

@Jesssullivan

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.svelte fixed readout near the lower right / lower center.
  • TransmissionSheet.svelte mobile bottom sheet for atmospheric transmission.
  • EphemerisGantt.svelte bottom twilight rail with current-time staff marker and phase labels.
  • MapToolbar.svelte lower-right hardware/control buttons.
  • 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.

Related

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions