Files
hope-voice-api/.artifacts/20260831-105824-plan-code-ui-audit/ui-research-implementation.md
T
2026-08-31 19:50:46 -04:00

122 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# UI Research Implementation Report
- Task: 20260831-105824-plan-code-ui-audit
- Agent: coder (UI/UX research pass)
- Model: litellm-lan/qwen3.8-27b (the fixed model this agent runs on; note the user asked for a "cheap local qwen3.8-27b" — this is exactly that model, routed via LiteLLM LAN)
- Date: 2026-08-31
- Status: complete
## Summary
Research-only pass: located and analyzed the square Hope visual element in the reference
projects, audited every SwiftUI source file in `voice-ios`, extracted the web design-token
system, and produced a full redesign specification. **No product code was modified** —
the only files written are this report and `ui-ux-spec.md`.
### The square Hope element (resolved)
The square Hope element is the **LED-wall avatar** in the web UI: a 320×320 px square
(`border-radius: 26px`) containing a 21×21 dot matrix that blooms with audio.
Evidence:
- `hope-voice-api/web/style.css` L331–346 — `.led-wall { width: 320px; height: 320px;
display: grid; grid-template-columns: repeat(21, 1fr); border-radius: 26px }`
- `hope-voice-api/web/style.css` L349–359 — glass panel backing (radial iris gradient + border)
- `hope-voice-api/web/style.css` L361–372 — `.led-dot` (base 5 px, 90 ms linear transitions)
- `hope-voice-api/web/style.css` L376–392 — state palette: idle `#56739E`, connecting/thinking
`#D99A6C`, listening `#6F8FF7`, speaking `#9DC2FF` + drop-shadow
- `hope-voice-api/web/app.js` L265–341 — build (21×21, per-dot radial + phase) and per-frame
render (gaussian falloff, ripple, audio-reactive sizing, listening dimmed to 0.55×)
- `hope-voice-api/web/index.html` L61–62 — wall is `aria-hidden`, separate `aria-live="polite"` label
Two related marks documented for the redesign:
- **Favicon glyph** (`hope-voice-api/web/favicon.svg`): 64×64 rounded square, plate `#08111F`,
iris circle + tilted orbit ellipse + warm dot — compact identity mark.
- **Companion icon** (`hope_companion/resources/icon.png`, generated by
`scripts/gen-icons.mjs`): 1024² rounded square (r≈22.3%), indigo→violet diagonal gradient,
white two-node + arc + ring mark. Verified 1024×1024 RGBA via `sips`.
The current iOS app uses **none** of these: `OrbView.swift` L45–47 is a plain 120 pt system-color
`Circle()`, and `Resources/Assets.xcassets/AppIcon.appiconset/Contents.json` has no images.
## Files Changed
Product code: **none** (research-only mandate).
Artifacts written:
- `.artifacts/20260831-105824-plan-code-ui-audit/ui-ux-spec.md` — full audit + redesign spec
(asset provenance, current-state findings N1–N3/C1–C11, navigation hierarchy, color/shape/
motion tokens with exact values, per-component specs incl. LED-wall formulas, accessibility,
app-icon plan, 4-phase rollout, acceptance criteria, risks)
- `.artifacts/20260831-105824-plan-code-ui-audit/ui-research-implementation.md` — this report
## Paths Inspected
### voice-ios (all SwiftUI sources read in full)
- `Sources/App/VoiceApp.swift`, `Voices.swift`, `SettingsStore.swift`
- `Sources/Features/Conversation/ConversationView.swift`, `OrbView.swift` (incl. TranscriptListView)
- `Sources/Features/Settings/SettingsView.swift`, `ConnectionTestView.swift`
- `Sources/Features/Tasks/TaskPanelView.swift`
- `Sources/Features/Media/MediaPanelView.swift`
- `Sources/LiveKit/VoiceSession.swift`, `ConversationState.swift`, `TranscriptHandler.swift`,
`TranscriptHistory.swift`, `ControlChannel.swift`, `TaskStore.swift`, `AgentMonitor.swift`
- `Sources/Media/MediaPlayerController.swift`, `PinnedMediaResourceLoader.swift`, `MediaAPI.swift`
- `Sources/Networking/TokenClient.swift`, `ServerConfig.swift`, `TLSPinning.swift`
- `project.yml`, `Resources/Info.plist`, `Resources/Assets.xcassets/AppIcon.appiconset/Contents.json`
- `PLAN.md`, `UPDATE_PATH.md`, `AGENTS.md`
### hope-voice-api (reference)
- `web/style.css` — token block L1–26, brand glyph L125–166, LED wall L316–429, buttons L431+,
message bubbles L702–764, task dots L1120–1150, keyframes L427/L709/L1133
- `web/app.js` — LED wall build/render L265–341, mic level smoothing L343–354, state setter L389
- `web/index.html` — ARIA structure (L18–107)
- `web/favicon.svg` — full file (square Hope glyph)
### hope_companion (reference)
- `scripts/gen-icons.mjs` — full SDF icon generator (plate, gradient, mark geometry)
- `resources/icon.png` — metadata via `sips` (1024×1024 RGBA)
- `package.json`, `electron-builder.yml` — icon usage
## Verification
Commands run (research-only; no build performed since no code changed):
- `sips -g all hope_companion/resources/icon.png` → 1024×1024, RGBA, hasAlpha: yes ✓
- `rg "led-wall|led-dot|orb" hope-voice-api/web/style.css` → located all LED-wall rules (L317–1563) ✓
- `rg "square" voice-ios/` → no hits; confirmed the term maps to the LED-wall container, not a literal "square" identifier ✓
- Read-based verification of every cited line range above.
No build/test commands were run because the brief restricts this pass to research and
specification; the spec's Phase A–D implementation will carry its own verification per
`ui-ux-spec.md` §11 (XcodeBuildMCP simulator build + the PLAN.md Phase 8 reconnect matrix).
## Design Decisions (recorded for the implementer)
1. LED wall is procedural (Canvas + TimelineView ≤30 fps), not a raster asset — matches web
implementation and keeps the asset catalog clean.
2. Exact port of app.js formulas (falloff/ripple/sizing) rather than an approximation — the
spec includes the verbatim math so behavior matches the reference pixel-for-pixel in intent.
3. System colors fully replaced by a `HopeColor` token enum derived from web `:root`;
semantic mapping (mint=success, danger=error, warm=thinking) documented in spec §5.1.
4. Accessibility mirrors web ARIA: wall hidden from VO, separate live status element,
announcements throttled to meaningful transitions only.
5. Four-phase rollout (tokens/assets → LED wall → transcript/composer → polish) so each
phase is independently reviewable and revertible.
## Risks And Limitations
- Simulator mic is dead (-4010, PLAN.md Phase 2): listening-side wall reactivity is
device-only; speaking-side verifiable in sim via agent TTS. Recorded as R1 in the spec.
- No automated tests exist in the repo (also noted in manifest Open Risks); verification
for the implementation phases will be simulator-based + Instruments profiling for the wall.
- `Color(hex:)` helper does not exist yet — required prerequisite for Phase A (spec R3).
## Follow-up For Reviewer
1. Confirm the "square Hope element" identification (LED wall) matches the user's intent;
if they meant the favicon glyph or companion icon instead, spec §9 already covers both as
secondary assets and only §6.1/§10-B would need re-scoping.
2. Review spec §5.1 token table for any brand values that should differ from web (e.g., if a
lighter iOS-native surface treatment is preferred over the dark canvas).
3. Approve Phase A–D sequencing before coder implementation begins; each phase has exit
criteria in §10 and global acceptance criteria in §11.