Ubisam-MobileGit/tasks/069-in-app-motion.md
choiminyeong 1f6f0dac8a TASK-069: tabs inside a screen glide like the bottom tabs
The repository list (all / favourites) and a repository's issues and pull
requests keep their header and tab row still while the list under them moves
the whole width. TabGlide in Motion.kt holds the movement.

A repository tab change reloads through Loading, which names no tab, so the
screen remembers the tab that was tapped and keeps the tab row up meanwhile.

Agent: main (opus)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:37:00 +09:00

76 lines
3.2 KiB
Markdown

# TASK-069: In-app motion
Status: implemented; required checks pass; not yet seen on a device
Owner: Claude
Reviewer: human product owner
## Outcome
The app moves where it used to jump, and what moves is the launcher icon's tea cup.
1. Cold start: the cup on the icon's blue, steaming, for about a second, then it fades.
2. Loading: lists show grey placeholder rows with a light passing over them; everything else shows
the steaming cup in place of the stock spinner.
3. The favourite star springs when its state changes.
4. A screen with nothing to list shows the cup bobbing above its message.
5. Entering and leaving a screen slides it a short way in from the side it was opened towards.
6. Pull to refresh brings the cup down with the finger; the steam appears near the release point.
7. A file's diff arrives row by row the first time it is shown.
8. Added while this was in progress (product owner, 2026-10-12): switching bottom tabs slides the
whole screen sideways, the old tab gliding out as the new one glides in, and the tab's icon
springs.
9. Added after that (product owner, 2026-10-12): the tabs inside a screen glide the same way.
전체 저장소/즐겨찾기 and 이슈/풀 리퀘스트 keep their header and tab row still while the list under
them changes sides. The branch screen's tabs already slid (a pager) and are unchanged.
## Scope
- Included: Compose's own animation APIs only. No new dependency.
- Excluded: videos made with Claude Motion; any change to what the screens load or show.
## Writable paths
- `app/src/main/java/com/ubisam/ubgitea/ui/components/Motion.kt`
- `app/src/main/java/com/ubisam/ubgitea/ui/components/Elements.kt`
- `app/src/main/java/com/ubisam/ubgitea/ui/shell/AppShell.kt`
- `app/src/main/java/com/ubisam/ubgitea/MainActivity.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/home/HomeScreen.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/repositories/RepositoryListScreen.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/work/WorkScreen.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/notifications/NotificationsScreen.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/workitems/WorkItemsScreen.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/history/HistoryScreen.kt`
- `app/src/main/java/com/ubisam/ubgitea/feature/history/FileDiffScreen.kt`
- `tasks/069-in-app-motion.md`
- `docs/development-log.md`
## Acceptance criteria
- [x] Each of the nine items above is in the code and the app builds.
- [x] The splash covers the app without delaying it: sign-in, loading and the OAuth callback run
underneath, and taps do not pass through the cover.
- [x] Moving between code tabs, or between pages of one screen, does not replay the screen
transition.
- [x] Nothing animates off screen: the pull indicator composes only during a pull, and the diff
rows animate once per file, not on scroll.
- [x] A list's loading message is still what a screen reader says.
- [ ] Seen on the product owner's device.
## Security and privacy
No additional concerns. No network, storage or credential code is touched.
## Required checks
```text
./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug
```
## Evidence
See the development log entry for TASK-069.
## Review findings
None yet.