Skip to content

Mobile IA Redesign — Progressive Disclosure, PTT Placement, MORE Dedup

Date: 2026-04-18 Owner: UX/UI Scope: frontend/src/components-v2/layout/MobileRadioLayout.svelte (portrait + landscape) Related (out of scope): #811 MAIN/SUB → segmented control, #812 BRT/REF → spectrum gear Constraints: no regression of Wake Lock / fullscreen landscape / waterfall size / PTT safety timer


1. Context — current mobile IA

1.1 Current portrait vertical stack (measured from component styles)

Region Role Height (approx, portrait 390×844) State
Safe area top iOS notch env(safe-area-inset-top) ≈ 47px
.m-vfo-bar (sticky) TX dot + freq 28px + MORE + meta (mode/filter/sub) ~62px Always visible
.m-smeter-bar Linear S-meter ~28px Always visible
.m-spectrum Waterfall + spectrum 220px (min 180px) Always visible
.m-section BAND Collapsible 40px collapsed / ~200px open Default collapsed
.m-section SCAN Collapsible 40px / ~180px Default collapsed
.m-section MODE LSB/USB/CW/AM + More 40px / ~100px Default collapsed
.m-section FILTER FIL1/2/3 + More 40px / ~90px Default collapsed
.m-section AUDIO LOCAL/LIVE/MUTE + AF + NB/NR/NOTCH 40px / ~220px Default collapsed
.m-section RF RF gain / SQL / ATT / PRE / DIGI / IP+ 40px / ~240px Default collapsed
.m-section TX PTT + ATU + power readout + TX meter when active 40px / ~140px Default collapsed
.m-bottom-spacer 52px
.m-tuning-strip (fixed) ⏮ ◀ step ▶ ⏭ 52px + safe-area-bottom Always visible

Above-the-fold at cold-open (390×844, portrait, no iOS chrome after fullscreen): - Fully visible: VFO bar + S-meter + spectrum = ~310–320px. - Remaining ~470px (before tuning strip) shows ~6 collapsed section rows. TX row is the 7th; usually just below the fold. AUDIO, RF, TX typically require 1 swipe.

1.2 Current modals (BottomSheet)

Modal Content Triggered from
SETTINGS (MORE btn) VFO ops + BAND, DSP, AGC, RF FRONT END, RIT/XIT, ANTENNA, CW Sticky header MORE
MODE All modes + DATA mode grid Inline MODE section "More…"
FILTER Full FilterPanel (shape, width, IF shift, PBT) Inline FILTER section "More…"
POWER RF Power slider Tap power readout in TX section
TX SETTINGS TxPanel (power, mic, ATU, VOX, COMP, MON, DRIVE) Gear icon in TX section

1.3 The duplication problem — explicit

Function Inline collapsible Also in SETTINGS (MORE) Verdict
BAND ✅ BAND section ✅ "VFO / BAND" (full BandSelector + VFO ops) Duplicate (inline has presets but no VFO ops)
MODE ✅ MODE (quick 4 + More modal) OK
FILTER ✅ FILTER (quick 3 + More modal) OK
AUDIO ✅ AUDIO (+NB/NR/NOTCH toggles) OK
DSP (detail) ❌ inline only has on/off toggles ✅ full DspPanel (NR level, NB level, notch freq) Complementary, but unclear
AGC Only in MORE
RF FRONT END ✅ RF section ✅ RF FRONT END in MORE Duplicate (full)
RIT/XIT Only in MORE
ANTENNA ✅ (if >1 antenna) Only in MORE
CW Only in MORE
VFO ops (SPLIT/A↔B/A=B) Only in MORE
TX ✅ TX section (PTT+ATU+gear→TX SETTINGS modal) OK
PTT ✅ TX section only Buried

Duplicates: BAND (partial) and RF FRONT END (full) appear in both places. Only in MORE: AGC, RIT/XIT, ANTENNA, CW, VFO ops (SPLIT/A↔B/A=B), DSP depth. Only inline: MODE quick, FILTER quick, AUDIO monitor mode, PTT.

1.4 Cold-open tap/swipe paths (current)

Measured as swipes + taps to reach the target from cold-open with default collapsed state:

Target action Current path Cost
Change freq (tuning strip ± step) visible 0 + 1 tap
Change tuning step visible 0 + 2 taps (open picker + pick)
Change band (preset) tap BAND header → tap preset 0–1 swipe + 2 taps
Change mode (quick) tap MODE header → tap LSB 0–1 swipe + 2 taps
Change mode (rare, e.g. RTTY) tap MODE → More… → pick mode 0–1 swipe + 3 taps
Toggle NR tap AUDIO header → tap NR 1 swipe + 2 taps
NR level (detail) tap MORE → expand DSP → slide 0 swipe + ~3 taps + slide
PTT press scroll to TX → tap TX header → hold PTT 1–2 swipes + 1 tap open + 1 hold
SPLIT toggle tap MORE → tap SPLIT 0 swipe + 2 taps
ATU toggle scroll to TX → tap TX header → tap ATU 1–2 swipes + 2 taps

Findings: - PTT requires 3 interactions to become available from cold-open. This is the worst offender and the motivation for this redesign. - The sticky MORE button gives 2-tap access to features otherwise 1-swipe+2-tap away inline — so MORE is partially a shortcut layer, not only overflow. - Two collapsibles (BAND, RF) exist in both places, confusing the contract.


2. Section inventory — frequency × time sensitivity

Usage classes: primary (hands-on every QSO), secondary (several times per session), tertiary (few times/session), rare (once per setup or per day).

Section Freq of use Time sensitivity Portrait today Landscape today
Frequency tune (±step) primary instant tuning strip overlay controls
Tuning step pick primary near-instant tuning strip overlay controls
Band change / preset secondary near-instant BAND collapsible + MORE not available
Mode (LSB/USB/CW/AM) primary (per band) near-instant MODE quick row overlay 4 quick buttons
Mode (rare: RTTY, DATA) rare OK-to-dig MODE More… modal not available
Filter (FIL1/2/3 quick) secondary near-instant FILTER quick row not available
Filter (width, shape, IF shift, PBT) tertiary OK-to-dig FILTER modal not available
AUDIO monitor mode (LOCAL/LIVE/MUTE) primary (set once, toggle in QSO) instant AUDIO not available
AF level primary near-instant AUDIO not available
DSP NB/NR/NOTCH toggle primary (noisy bands) instant AUDIO (on/off only) not available
DSP NR level / notch freq tertiary OK-to-dig MORE modal not available
AGC tertiary OK-to-dig MORE only not available
RF gain / SQL secondary near-instant RF inline + MORE not available
ATT / PRE / DIGI-SEL / IP+ tertiary OK-to-dig RF inline + MORE not available
RIT / XIT secondary (DX / pile-up) near-instant MORE only not available
Antenna (ANT1/ANT2, RX ANT) rare OK-to-dig MORE only not available
CW (WPM, break-in, sidetone) secondary for CW ops OK-to-dig MORE only not available
VFO ops (SPLIT, A↔B, A=B) secondary (DX) near-instant MORE only not available
PTT primary must-be-instant TX collapsible overlay right-edge
ATU toggle / tune secondary near-instant TX collapsible not available
RF Power secondary near-instant TX → power modal / TX SETTINGS not available
Mic gain / VOX / COMP / MON tertiary OK-to-dig TX SETTINGS modal not available
SCAN tertiary OK-to-dig SCAN collapsible not available
Spectrum / waterfall primary (band orientation) continuous fixed 220px full screen

Key insight: The set of must-be-instant actions is small: PTT, mode change (quick), NR/NB/NOTCH toggle, AF, tuning (already handled), monitor MUTE, RIT toggle.

Everything else can live one layer deeper without operator pain.


3. Three IA pattern options

Each option keeps: sticky freq header (simplified), spectrum+waterfall 220px, fixed tuning strip. Each option is evaluated for cold-open path to the five common actions.

3.1 Option A — Chip-scroll tab bar

 ┌───────────────────────────────────────┐
 │ ● 14.210.000 USB FIL2         [⚙]    │  sticky header (no MORE)
 ├───────────────────────────────────────┤
 │ S-meter ▂▃▄▅▆▇                        │
 ├───────────────────────────────────────┤
 │ [ waterfall + spectrum 220px       ]  │
 ├───────────────────────────────────────┤
 │ BAND │ MODE │ FILTER │ DSP │ RF │ TX │ → chip-scroll, sticky
 ├───────────────────────────────────────┤
 │ (content for active chip only)        │
 │                                        │
 │                                        │
 │                                        │
 ├───────────────────────────────────────┤
 │  ⏮  ◀  [ 1 kHz ]  ▶  ⏭               │  tuning strip
 └───────────────────────────────────────┘
          ╭─────╮ floating PTT (see §5)
          │ PTT │
          ╰─────╯
  • Only ONE section open at a time; no accordion juggling.
  • Tabs (chips): BAND · MODE · FILTER · AUDIO · DSP · RF · RIT · TX · MORE. Horizontal swipe between them (optional).
  • PTT = persistent element (see §5). Gear in header opens SETTINGS (rare config only).

Paths (cold-open): - Freq ±step → 0+1 (tuning strip) - Band → tap BAND chip → tap preset = 0 swipe + 2 taps - Mode quick → tap MODE chip → tap USB = 0 + 2 - NR toggle → tap DSP chip → tap NR = 0 + 2 - PTT → 1 tap (sticky)

Pros: Flat structure, predictable "always 2 taps", kills accordion scroll-hunting, one mental model. Content area is tall (≈420px) so long panels (FilterPanel) don't need a modal at all. Cons: Trades vertical scrolling for horizontal chip-scrolling. Operators used to seeing all section headers lose that affordance. Initial learning cost. AUDIO+DSP combined feels big.

3.2 Option B — Two-level accordion (Fast / Deep)

Same layout as today, but: - MORE modal renamed ADVANCED and contains only what is not inline. - Inline collapsibles contain everything users need on-the-air. Advanced panels contain depth controls. - Sticky header still has a quick-overflow button (ADVANCED), plus a persistent PTT element.

Sections inline (redefined): - BAND (with preset grid + SPLIT/A↔B/A=B row — moved from MORE) - MODE (quick row unchanged) - FILTER (quick row unchanged) - AUDIO (LOCAL/LIVE/MUTE + AF + NR/NB/NOTCH on/off) - RF (rfGain / SQL only — move ATT/PRE/DIGI/IP+ to ADVANCED) - RIT/XIT (new inline — often needed mid-QSO) - TX (PTT-subset: ATU + power + TX meter; PTT moves out — see §5)

ADVANCED modal (renamed MORE): AGC, DSP depth (NR level, NB level, notch freq), RF detail (ATT/PRE/DIGI/IP+), ANTENNA, CW, TX SETTINGS (mic/VOX/COMP/MON), SCAN.

Paths: - Freq → 0+1 - Band → 1 swipe + 2 taps (BAND below fold) - Mode → 1 swipe + 2 taps - NR toggle → 1 swipe + 2 taps - PTT → 1 tap (sticky)

Pros: Minimal disruption; users keep the same mental model. Kills duplication. RIT moves up where DX operators need it. Cons: Still scrolling. Cold-open still ~1 swipe to common controls. Doesn't solve the "which ones are collapsed" visual noise.

3.3 Option C — Bottom-tab navigation

Four bottom tabs: RADIO · TUNE · TX · SETUP. Tuning strip moves into TUNE tab (or remains in RADIO — see variant).

 ┌──────────────────────────────────┐
 │ sticky header + S-meter           │
 │ spectrum 220px                    │
 │ tab content (mode/filter/audio…)  │
 │                                    │
 ├──────────────────────────────────┤
 │ RADIO  │  TUNE  │   TX   │ SETUP │
 └──────────────────────────────────┘
  • TUNE tab: big tuning controls + step + band presets + RIT/XIT
  • TX tab: big PTT button, ATU, power, TX meter, TX settings
  • Mini-PTT floats on RADIO and TUNE (see §5)

Paths: - Freq → tap TUNE → ± = 1+1 (regression from 0+1 today) - Band → TUNE → preset = 1+2 - Mode → stays on RADIO → 2 taps - NR → RADIO → 2 taps (AUDIO chip or inline) - PTT → elevated in TX tab (1+1) or mini-PTT floating (1 tap)

Pros: Clean separation of concerns. Large touch targets for PTT in dedicated tab. Familiar mobile pattern. Cons: Adds a layer. Regresses "freq change is 1 tap" — worst failure mode for a radio controller. Users will fight the tab switch for tuning. Mini-PTT plus TX-tab-PTT creates duality. Rejected on principle: the point of a radio app is tune-and-transmit, putting them in different tabs is wrong.

3.4 Option D — Synthesis (chip-scroll + sticky PTT + smart defaults)

A refinement of A: - Chip-scroll tab bar near top (below spectrum). - First chip is ESSENTIALS — default on cold-open — containing the 90% panel: MODE quick, FILTER quick, AUDIO toggles (NR/NB/NOTCH + MUTE + AF). This is the "one chip to rule them all" for an active QSO. - Remaining chips: BAND, FILTER-detail, DSP, RF, RIT, TX, ANT, CW, SCAN. - Gear in header opens SETUP sheet (only truly rare/config: CW defaults, antenna names, TX meter source, defaults reset). - Persistent PTT (see §5) independent of chip. - Inline full filter/TX panels inside their chip (no modal needed for FILTER).

Paths (cold-open, ESSENTIALS active): - Freq → 0+1 ✅ - Band → 1 tap (BAND chip) + 1 tap preset = 0+2 ✅ - Mode → 0+1 (ESSENTIALS chip active → USB visible) ✅ - NR toggle → 0+1 (ESSENTIALS chip active → NR visible) ✅ - PTT → 1 tap (persistent) ✅

Pros of D vs A: ESSENTIALS default means the highest-frequency controls are 1-tap from cold-open, beating B and C. Still flat. Removes modals. Cons: ESSENTIALS chip is the "kitchen sink" and must be designed carefully to not become cluttered. Other chips are lean.


4. Recommendation — Option D (chip-scroll + ESSENTIALS default + sticky PTT)

4.1 Why

  • Meets the user's explicit goal: maximally clean surface (one chip visible) + max access to functions (every function is reachable in ≤2 taps, most in 1).
  • Respects domain frequency analysis (§2): the set of must-be-instant actions is small — ESSENTIALS accommodates all of them on one panel, below spectrum.
  • Beats every alternative on cold-open tap counts for the five common actions. Only PTT-reach is a design problem — addressed in §5.
  • Kills duplication: every control has exactly one home.
  • Waterfall stays 220px (unchanged). Wake Lock and fullscreen orientation path unchanged.
  • Landscape translates cleanly (§7): chip bar hides, ESSENTIALS quick-modes appear in overlay as today.

4.2 What we port from other options

  • From B: promote RIT/XIT out of deep-settings — give it a dedicated chip (DX operators need it fast).
  • From B: MORE becomes ADVANCED / SETUP-only (§6).
  • From C: the idea of a dedicated TX affordance — realised as the guarded sticky PTT FAB (§5), not a full tab.
  • From current design: keep the tuning strip exactly as-is. It is working. Do not change.
  • From current design: keep hasSpectrum() → LCD fallback path.

4.3 ESSENTIALS chip content (90% panel)

One vertical stack fitting ~420px: 1. VFO ops strip (SPLIT · A↔B · A=B) — 36px row 2. MODE quick row (4 buttons + More…) — 44px row 3. FILTER quick row (3 buttons + More…) — 44px row 4. AUDIO: LOCAL/LIVE/MUTE row — 44px row 5. AF level slider (hbar) — 48px 6. DSP toggles: NB · NR · NOTCH — 44px row

Total ≈ 260–280px — fits without scroll on 390×844 after header (62) + s-meter (28) + spectrum (220) + chip bar (44) = 354px, leaving ~490px for the chip content + tuning strip (52).


5. PTT design — guarded sticky PTT FAB (above tuning strip, right edge)

5.1 Requirements recap

  • No accidental TX during tuning. Tuning strip is at the bottom-centre; PTT must not be in the tuning thumb-path.
  • 1-tap availability from any screen state.
  • Visual + haptic feedback on active, plus existing double-tap-latch and 3-min safety timer preserved.
  • Works for both momentary hold and latched modes.

5.2 Rejected placements

Placement Rejected because
In tuning strip User explicitly rejected — accidental TX risk
Left edge of tuning strip Thumb still hits it during tune-drag
Top-right of sticky header (replacing MORE) Thumb reach is bad on 6"+ phones; MORE-shaped affordances are often tapped inadvertently
Inside TX chip only Buried — this is what we're fixing
Full-screen-hold region (swipe-up-to-TX) Too abstract, discovery failure

5.3 Chosen placement — guarded FAB, bottom-right, above tuning strip

                                  ╭─────╮
                                  │ ●   │  ← 72×72 FAB
                                  │PTT  │     right-aligned,
                                  ╰─────╯     16px right,
   ⏮   ◀    [step]    ▶   ⏭          ↑       56px above tuning strip
 ───────────────────────────────    PTT baseline
  • Position: position: fixed; right: 12px; bottom: calc(52px + safe-area-inset-bottom + 12px). Sits above the tuning strip, not in it. Natural right-thumb reach on 390×844.
  • Size: 72×72 CSS px (comfortably > 44 min). Round, heavy visual weight.
  • Offset from tuning buttons: ≥ 24px horizontally + it lives in a different row. Thumb-path during tuning follows the horizontal strip; PTT is out-of-path.
  • Base state: outlined red circle, mic icon, label PTT below icon.
  • Held state: solid red fill, "TX" label, box-shadow glow, navigator.vibrate(10) on engage.
  • Latched state: solid dark red + pulse animation (existing ptt-latch-pulse), 🔒 glyph + "TX LOCK" label. Pulse + haptic tick every 30s as a reminder (optional).

5.4 Anti-accidental-TX guards (layered)

  1. Spatial isolation — PTT not in tuning strip path. Primary guard.
  2. Press-and-hold minimum (50ms)pointerdown must persist 50ms before engageTx runs. Prevents tap-through from scroll gestures. If cancelled early (pointermove > 8px or pointerup < 50ms), nothing happens. This is a new behavioural guard beyond the existing code.
  3. "Arm-then-fire" option for latched mode only — latched remains double-tap (existing). Unchanged.
  4. TX permit colour — FAB border shows the existing txPermit state: dim if out-of-band. When dim, first tap shows a toast "TX not allowed on this frequency" and does NOT engage. Second tap (within 2s) engages (if user really insists). Prevents accidental TX on receive-only segments.
  5. Hide-during-drag — if user is currently dragging a slider or tuning, FAB dims to 40% opacity and pointer-events: none for the duration. (New.)
  6. Safety timeout — existing 3-min PTT_SAFETY_TIMEOUT_MS preserved verbatim.
  7. Haptic cuenavigator.vibrate([10, 50, 10]) on engage; vibrate(5) on release. (New.)

5.5 Why NOT a two-step reveal (swipe-up to expose PTT)

Considered. Rejected because: - On-air scenarios (contest, net) require instant TX. Any reveal step is too slow. - Discovery failure: hidden controls are unfindable. - The guard we need (accidental during tune) is solved by spatial separation, not by reveal.

5.6 Landscape PTT

Keep existing right-edge PTT button in landscape overlay. The landscape HUD is compact enough that spatial isolation + press-and-hold-50ms is sufficient. Add the same pointermove > 8px cancels guard.

5.7 Mini-PTT on other chips

Not needed — the FAB is persistent across all chips.


6. MORE modal redefinition — SETUP (rare config)

After Option D, MORE becomes SETUP, reached by gear icon in sticky header. Contains only:

  • Keyboard config (key bindings)
  • Antenna naming (ANT1 label, ANT2 label)
  • CW defaults (keyer type, reverse paddle, sidetone levels)
  • TX meter source default (PO/ALC/SWR/COMP)
  • Audio backend (local / live)
  • Diagnostics (Wake Lock status, fullscreen status, connection state)
  • Reset panel states

Not in SETUP (they have first-class homes in chips): BAND, MODE, FILTER, AUDIO, DSP, RF, RIT/XIT, ANTENNA (switching), SCAN, CW (operating controls), TX controls.

Eliminated modals: MODE modal (becomes a chip-overflow section), FILTER modal (becomes part of FILTER chip content when the chip is active), POWER modal (inline in TX chip), TX SETTINGS modal (inline in TX chip).

Duplication problem resolved by construction.


7. Landscape translation

Landscape today: fullscreen spectrum + absolute-positioned overlay with VFO · 4 quick modes · S-meter · step · ±1 · filter · PTT.

Keep landscape essentially unchanged. Waterfall IS primary orienting tool. Do not introduce chips in landscape — the overlay already IS the "ESSENTIALS chip" for landscape.

Minor refinements: - Apply the same pointermove cancels guard to landscape PTT. - Show TX permit dim-state (matches portrait). - Overlay auto-hide after 4s of inactivity (tap anywhere to show); preserves immersive waterfall. Optional, behind feature flag.

Do NOT move spectrum position, do NOT shrink it, do NOT change fullscreen/wake-lock code paths.


8. Scroll-depth / tap-depth KPI

Metric Current Target (Option D)
Max swipes to reach any "primary" action from cold-open 2 0
Max taps (after swipes) to reach any "primary" action 3 2 (1 for PTT/tune)
Cold-open-to-PTT-ready 2 swipes + 2 taps 0 swipes + 0 taps (visible)
Cold-open-to-NR-toggle 1 swipe + 2 taps 0 swipes + 1 tap
Number of distinct modals 5 1 (SETUP)
Functions present in 2+ places 2 (BAND, RF) 0

Explicit KPI goal: every primary action reachable in ≤2 interactions from cold-open. Every secondary action in ≤3. No action requires scrolling a long accordion list.


9. Accessibility & one-handed use

9.1 Thumb-reach zones (right-handed, 390×844)

  • Easy (lower third, right half): tuning strip right half, PTT FAB, TX chip — ✅ placements align.
  • OK (middle third): chip-scroll bar — reachable with thumb slide.
  • Stretch (top): sticky header (freq + gear) — only for tap targets that don't need to be fast (gear). Freq display is read, not tapped, so OK.

9.2 Left-hand consideration

FAB on right is harder for left-handed users. Add a SETUP preference ptt.side: "right" | "left" to flip placement. Small, 1-file change, ship after MVP.

9.3 Touch targets

  • All buttons ≥ 44×44 CSS px (already enforced in .m-tune-btn, .m-section triggers, HardwareButton). Preserve.
  • PTT FAB 72×72 (generous).
  • Chips ≥ 44 tall, ≥ 56 wide for legibility.
  • Minimum 8px spacing between adjacent actionable elements. FAB sits 24px from nearest tuning button.

9.4 Motion / haptics

  • Respect prefers-reduced-motion — disable FAB pulse and chip-swipe transition.
  • Vibrate API guarded ('vibrate' in navigator) — iOS does not support it; no-op there.

9.5 Colour / contrast

  • TX permit states (allowed/denied/active) must remain distinguishable for red/green deficiency — pair colour with icon/shape (mic vs mic-off vs lock).

10. Atomic implementation issues

Each fits guardrails: ≤3 files, ≤200 LOC, no protocol changes.

Issue 10.1 — feat: mobile IA chip-scroll + ESSENTIALS panel

  • Files: MobileRadioLayout.svelte, new components-v2/panels/EssentialsPanel.svelte, components-v2/layout/mobile-chip-bar.svelte.
  • Replace the stacked <section class="m-section"> stack with chip-scroll nav + single active-chip content area.
  • Default active chip = ESSENTIALS.
  • Preserve Wake Lock, fullscreen, landscape branch exactly.
  • LOC: ~180.

Issue 10.2 — feat: persistent guarded PTT FAB

  • Files: MobileRadioLayout.svelte, new components-v2/controls/PttFab.svelte.
  • Component implements: 72×72 FAB, pointer-down-50ms delay, pointermove-8px cancel, haptic, dim-during-drag, TX-permit-two-step prompt.
  • Reuses existing pttDown/pttUp/engageTx/disengageTx, pttMode state, safety timer — no state logic changes.
  • Remove PTT button from TX chip body (TX chip keeps ATU, power, meter).
  • LOC: ~150.

Issue 10.3 — refactor: collapse MORE modal into SETUP (rare config only)

  • Files: MobileRadioLayout.svelte.
  • Rename settingsOpensetupOpen, prune SETTINGS BottomSheet content to SETUP-only (Keyboard, Antenna labels, CW defaults, TX meter default, diagnostics).
  • Remove RF FRONT END and BAND duplicates.
  • Gear icon in header replaces MORE button.
  • LOC: ~100.

Issue 10.4 — feat: promote RIT/XIT to first-class chip

  • Files: MobileRadioLayout.svelte (add chip), components-v2/panels/RitXitPanel.svelte if it needs a mobile variant (likely none — reuse).
  • Ensure RIT toggle state visible in sticky header meta row when active (e.g. RIT +120).
  • LOC: ~60.

Issue 10.5 — chore: landscape PTT guard parity

  • Files: MobileRadioLayout.svelte (landscape branch only).
  • Add pointermove-cancel + haptic + TX-permit-dim-state to .m-ls-ptt.
  • Optional overlay auto-hide behind feature flag (do not ship in same PR).
  • LOC: ~40.

Dependency order

10.1 → 10.2 → 10.3 → 10.4 → 10.5. Each can ship independently after 10.1 lands.


11. Open questions

  1. Does the TX chip still exist after PTT moves to FAB? Proposal: yes — it holds ATU, power readout, TX meter, TX SETTINGS inline. But if the user would rather have those on the FAB long-press sheet, we could delete the TX chip entirely. Decision needed.
  2. Chip-swipe gesture vs. tap only? Horizontal swipe between chips is a native pattern but may conflict with spectrum waterfall horizontal pan if spectrum area is interactive. Safer to ship tap-only first.
  3. ESSENTIALS chip — does it include RIT toggle? Arguments for: DX fast access. Against: ESSENTIALS gets too tall. Proposal: show RIT status on sticky header, full control on dedicated RIT chip. User decision.
  4. Haptic on FAB engage — acceptable on iOS Safari? navigator.vibrate unsupported there; we lose haptic. Consider a tiny audio "click" as alternative? Not for MVP.
  5. TX LOCK auto-timeout — currently 3 min. Do we want to reduce to 2 min on mobile given screen-off risk? Preserve 3 min unless operator feedback says otherwise.
  6. Chip persistence across sessions — remember last active chip? Proposal: yes, localStorage, default to ESSENTIALS for new installs.
  7. A/B experiment — ship Option D behind mobile.ia=v2 URL flag, keep old IA for fallback for one minor version? Recommended.

Decision log

  • Waterfall 220px: preserved.
  • Wake Lock + fullscreen landscape paths: not touched.
  • PTT in tuning strip: rejected (user).
  • PTT in sticky header: rejected (thumb-reach + accidental-tap risk).
  • PTT as guarded FAB bottom-right above tuning strip: chosen.
  • MORE modal: renamed SETUP, trimmed to rare config.
  • IA pattern: Option D (chip-scroll + ESSENTIALS default).