# iOS UX Feedback — for Plan 6 polish pass

Accumulating live UX notes from each plan's first-run usage. Plan 6 (UI/UX
polish + visual consistency pass) consumes this file as its input list.

## From Plan 3 (Sign flow)

- **Camera QR scanner shows black screen and never opens the camera on
  real device.** Tap "Scan QR" → screen pushes but the preview is fully
  black and never recovers. No permission prompt observed; possible
  causes worth checking in Plan 6:
  - `CameraPreviewView`'s `AVCaptureVideoPreviewLayer.frame` is set in
    `updateUIView(_:)` based on `uiView.bounds`, which may be `.zero`
    on first layout pass — set via Auto Layout or a `layoutSubviews`
    override instead.
  - `AVCaptureSession.startRunning()` is dispatched off-main but we
    never verify the session actually started; if input setup raised
    silently we'd see a black layer with no log.
  - Permission may not have prompted (Plan 3's `setupCamera()` requests
    only if `.notDetermined`; first install on a fresh device should
    prompt — verify `NSCameraUsageDescription` is making it into the
    real-device build's Info.plist).
- **Restore took a very long time** (~minutes). Pure-Python secp256k1
  on real device deriving 200 BIP84 + 200 BIP86 addresses. Plan 6
  should either reduce default address generation count (e.g., 20
  receive + 5 change, scan-on-demand) or ship libsecp256k1 as a
  static lib for iOS.
- **General UI feels rough** — visual polish (orange Bitcoin theme,
  spacing, button styles) all rolls up into the Plan 6 design pass.

## From Plan 2 (Welcome / Restore)

- **Seed word boxes feel cramped.** Tighten the padding and give each box a
  bit more height; current `padding(.vertical, 6)` is too compact when the
  user is touching a real keyboard. Also consider wider gap between the
  number prefix and the input.
- **12/24 word-count toggle has unwanted Form-section background.** The
  segmented Picker is wrapped in a `Section { ... }` which draws a gray
  rounded container behind it. Either drop the Section and float the picker
  above the Form, or use `.listRowBackground(Color.clear)` /
  `.listRowInsets(.zero)` to flatten it.

## Whole-app theme direction (from Plan 2 review)

Match the desktop offline wallet's palette so users moving between desktop
and iOS get visual continuity. Source of truth is `tauri/src/style.css`'s
CSS custom properties:

- `--bg: #1c1c1e` (deep near-black background)
- `--surface: #242426` (slightly lighter card surface)
- `--border: #30363d` (thin border)
- `--accent: #f7931a` (Bitcoin orange — primary buttons, focus rings)
- `--accent-dim: #b36a0f`
- `--green: #3fb950` (positive/confirmed states)
- `--text: #e6edf3`
- `--text-dim: #8b949e`

User mentioned "blue/red accents" — the desktop also uses red for amount-sent
and destructive actions, and likely a blue tint somewhere (verify against
the latest style.css when polishing).

**Buttons:** orange `.borderedProminent` (so the system applies the iOS
material). Use `.tint(.orange)` or a custom `Color(red: ..., green: ..., blue: ...)`
matching `#f7931a`.

**Cards and rows:** dark-mode-only for now; consider whether to support light
mode (the desktop has a light-mode toggle — commit `2026-06-11-light-mode`).

## How Plan 6 will consume this

Plan 6 brainstorm should:

1. Read this file end-to-end.
2. Read `tauri/src/style.css` and `tauri/src/index.html` for the canonical
   desktop design language.
3. Establish a small SwiftUI design system (color tokens, button styles,
   list-row treatments, navigation chrome) before redoing screens.
4. Re-skin every screen Plan 2-5 shipped (Welcome, Restore, WalletsList,
   WalletHome, Sign, Receive, Keygen, Settings).
5. Roundtrip with the user one screen at a time before locking in the design.
