# Unspooled UI/UX rebuild verification notes

Use this reference when executing the premium Android TV UI/UX rebuild prompt.

## Current primary-navigation rule
- Primary nav is `DebridStreamTopBar` only.
- Banned for current Unspooled UI/UX work: `NuvioModernSidebar`, `HomeTopBar`, Lumera glass sidebar, `TvLazyRow`, real `focusManager.moveFocus()` calls.
- A legacy alias like `HomeTopBar()` should be removed, not kept as a wrapper, because static scans and future agents treat it as permission to restore old nav.

## Static banned-pattern verification
Run after UI/focus edits:

```bash
cd ~/Unspooled
rg 'NuvioModernSidebar|HomeTopBar\(|TvLazyRow|moveFocus\(' app/src/main/java/com/unspooled/app
```

Expected: zero matches. If matches are comments only, rewrite the comments so the scan stays clean.

## Build verification
```bash
cd ~/Unspooled
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug
```

APK path: `app/build/outputs/apk/debug/app-debug.apk`.

## Profile picker fix pattern
- `ProfileListState` needs `activeProfileId`.
- Build state with `combine(profileDao.observeAll(), profileManager.activeProfileId)`.
- On entry, request focus for the active profile index, not always index 0.
- Focus state and selected state are separate:
  - Focused: scale ~1.08, `2dp` white card border, white glow, `TextPrimary`.
  - Selected: avatar `2dp` gold ring, check badge, theme focus background.

## Settings two-pane fix pattern
- Do not use `focusManager.moveFocus()` fallback for settings rail/detail handoff.
- RIGHT/SELECT from rail: set selected panel and directly request the first detail requester.
- LEFT from detail: directly request the selected rail item; if unavailable, request rail container.

## PremiumContentCard focus pattern
- Required focus visuals: scale + `2dp` white border + `#26FFFFFF` glow/shadow.
- Use spring focus scale: `Spring.DampingRatioNoBouncy`, `Spring.StiffnessMediumLow`.
- Coil 3 cache-policy extension imports may not exist in the pinned version. If they fail compilation, keep verified `crossfade(300).build()` rather than adding unverified imports.
