Goal
Redesign the operator-mobile UI (Android today, iOS to be added) into an award-winning, smart, clean experience. The current Stage / Control / Status three-tab shape is the starting point — Stage and Status are largely retained; Control is the focus of the rework.
Per feedback_critical_path_spec_first: write/update an authoritative design doc first before any code lands. Operator vetoes piecemeal patches in critical-path subsystems, and the operator UI is exactly that.
Tab requirements
Stage — unchanged
Same functionality as v1.7.126. Layout view, fixture placement read-out, gyro/puck claim. Cosmetic refresh OK; behaviour identical.
Control — major rework
Today's Control tab is a fixed strip of widgets. The new design must expose quick access to any number of operator surfaces from a single screen, without nested menu diving:
- Grab an individual DMX fixture and control it directly (e.g. trigger bubbles on the Chauvet Hurricane Bubble Haze X2 Q6 — bubble on/off, haze level, fan speed, LED colour, strobe). Should work for any fixture in the layout, profile-driven.
- Grab a moving head and start aiming it (claim → live pan/tilt + colour, hands-on takeover).
- Auto Brightness — one-tap enable/disable + master multiplier.
- Pick and run a show — show selector + transport (play / stop / loop) without leaving Control.
Constraints:
- Operator-only — no editing of layout, actions, timelines, profiles (per feedback_android_operator_not_editor).
- Must work one-handed on a phone in a dim room (large tap targets, high contrast, no reliance on hover).
- Must scale to many fixtures (12+) without becoming a search problem — favourites, recent, grouping.
- Visual language follows the Kinetic Prism design manifesto: dark-first, bloom, Space Grotesk, shared tokens with desktop SPA.
- UI parity rule still applies (feedback_ui_parity): any control surface that exists in the mobile Control tab must also exist on the desktop SPA.
Status — unchanged shape
Performer health, RSSI, uptime, last PONG. Cosmetic refresh OK.
Cross-platform
The same design must carry into a native iOS app. Implementation strategy is open (Kotlin Multiplatform / native SwiftUI mirror / React Native / Compose Multiplatform) — the design doc decides based on:
- ability to reuse the existing UDP binary protocol + REST client code,
- visual fidelity to Kinetic Prism,
- App Store + Play Store distribution friction (operator currently sideloads APK — that won't fly on iOS).
Deliverables (in order)
- Design doc in
docs/design/mobile_ui_redesign.md covering:
- Information architecture for Control (how the quick-access surfaces compose without nesting).
- Wireframes for each surface (fixture-direct, moving-head grab, Auto Brightness, show picker/transport).
- Component inventory + Kinetic Prism token map.
- iOS strategy decision + rationale.
- Migration path from current Android app (incremental vs. greenfield).
- Test strategy (Playwright is desktop-only; what's the mobile equivalent?).
- Operator review + sign-off on the doc before any code.
- Implementation broken into staged PRs per the doc.
Out of scope for this issue
- Desktop SPA redesign (separate effort if needed).
- Editing surfaces — operator app stays operator-only.
Acceptance
- Doc merged and approved before any UI code.
- Control tab demonstrably reaches each of {direct DMX fixture, moving head, Auto Brightness, run a show} in ≤2 taps from app open.
- Android + iOS share a single design language and the same operator mental model.
Goal
Redesign the operator-mobile UI (Android today, iOS to be added) into an award-winning, smart, clean experience. The current Stage / Control / Status three-tab shape is the starting point — Stage and Status are largely retained; Control is the focus of the rework.
Per feedback_critical_path_spec_first: write/update an authoritative design doc first before any code lands. Operator vetoes piecemeal patches in critical-path subsystems, and the operator UI is exactly that.
Tab requirements
Stage — unchanged
Same functionality as v1.7.126. Layout view, fixture placement read-out, gyro/puck claim. Cosmetic refresh OK; behaviour identical.
Control — major rework
Today's Control tab is a fixed strip of widgets. The new design must expose quick access to any number of operator surfaces from a single screen, without nested menu diving:
Constraints:
Status — unchanged shape
Performer health, RSSI, uptime, last PONG. Cosmetic refresh OK.
Cross-platform
The same design must carry into a native iOS app. Implementation strategy is open (Kotlin Multiplatform / native SwiftUI mirror / React Native / Compose Multiplatform) — the design doc decides based on:
Deliverables (in order)
docs/design/mobile_ui_redesign.mdcovering:Out of scope for this issue
Acceptance