Rebuilds the Material3 light/dark palette around a sky-blue primary, adds the UBGiteaTopBar wordmark to the repository list, and recolors the launcher icon background to match. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
110 lines
6.7 KiB
Markdown
110 lines
6.7 KiB
Markdown
# TASK-045: Sky blue + white redesign, UbiSam logo
|
|
|
|
Status: implemented; all required checks pass; awaiting live device confirmation (wireless adb
|
|
pairing is currently broken on the human product owner's PC -- see Known limitations)
|
|
Owner: Claude
|
|
Reviewer: Codex
|
|
|
|
## Outcome
|
|
|
|
Revises `docs/product.md`'s "Visual identity, icon, and color palette" decision (originally closed
|
|
by TASK-039 with a "Gitea green" theme), at the human product owner's fresh, explicit request
|
|
("현재 UI/UX를 전체적으로 갈아엎고싶다... 하늘색과 하얀색으로 구성하고 싶어"). The app's Material 3
|
|
theme moves from that earlier green palette to a sky-blue + white one, and the UbiSam wordmark now
|
|
appears small in the top-left of the root (저장소 목록) screen, matching the reference logo image the
|
|
product owner shared.
|
|
|
|
## Scope
|
|
|
|
- Included: `ui/theme/Color.kt` and `Theme.kt` (full light/dark Material3 tonal palette rebuilt
|
|
around a sky-blue primary); a new shared `UBGiteaTopBar`/`UBGiteaLogo` composable; wiring the top
|
|
bar into `RepositoryListScreen` (the app's root/home screen); the launcher icon background color
|
|
updated to match the new primary.
|
|
- Excluded (deliberately): adding the logo or a visible top bar to the other six screens (settings,
|
|
notifications, work items, branch detail/files, history), and adding visible back-arrow buttons
|
|
anywhere. Those screens have no back-button UI today -- they rely entirely on the system back
|
|
gesture, with non-trivial existing logic around exactly when that gesture is intercepted (see
|
|
`BranchDetailScreen`'s tab/pager comments). Retrofitting a header with a back action into that
|
|
would mean threading current-tab-aware back callbacks through screens that don't expose that
|
|
today -- a real behavior change, not a color/branding pass, so it was left out of this task. Those
|
|
screens still get the new sky-blue theme automatically, since none of them hardcode colors outside
|
|
`MaterialTheme.colorScheme`.
|
|
- Excluded (pending an asset): the logo is currently a hand-drawn Compose recreation (`UBGiteaLogo`
|
|
in `ui/components/UBGiteaTopBar.kt`) -- grey "Ubi" + blue "Sam" text plus a small rounded badge
|
|
with a drawn signal/RSS mark -- reproducing the reference image's colors and layout without an
|
|
image asset. If the actual PNG/SVG is provided later, it should replace this with a real
|
|
`Image(painterResource(...))`.
|
|
|
|
## Design notes
|
|
|
|
- **Primary is a deep-enough sky blue for contrast, not the literal reference-image blue**, same
|
|
reasoning as the previous "Gitea green" theme: `SkyPrimaryLight` (`#0369A1`) is chosen so white
|
|
text/icons on it clear WCAG's 4.5:1 threshold, while lighter tones (`SkyPrimaryContainerLight`,
|
|
`InversePrimaryLight`) carry the brighter, more literal sky-blue feel.
|
|
- **Background is a near-white with a faint blue cast (`#F7FBFF`), not pure white**, so white
|
|
cards/surfaces still have visible separation from the page -- pure white-on-white would flatten
|
|
the whole UI.
|
|
- **The logo appears only on the root screen.** An app wordmark conventionally belongs on the
|
|
top-level/home screen; nested screens showing the same static logo would be redundant chrome that
|
|
doesn't help navigation, and (per Scope above) adding a context-aware header to those screens is a
|
|
separate, larger change than what was asked for here.
|
|
- **No new icon library dependency.** The app currently has zero Material Icons usage (an established
|
|
convention -- see the launcher icon's own comment about "no icon library"); the small signal/RSS
|
|
mark inside the logo badge is drawn with `Canvas`/`drawArc` rather than pulling in
|
|
`material-icons-core` for one glyph.
|
|
- **Launcher icon background recolored to match**, so the home-screen icon and in-app theme read as
|
|
the same deliberate color rather than drifting apart (this exact reasoning -- and this exact file --
|
|
already existed for the old green theme; this task only changes the fill value and comment).
|
|
|
|
## Acceptance criteria
|
|
|
|
- [x] App-wide Material3 light and dark color schemes use a sky-blue primary with a near-white
|
|
background, replacing the old green theme, with no other role (error, etc.) touched.
|
|
- [x] The 저장소 목록 (root) screen shows a small UbiSam wordmark top-left.
|
|
- [x] No behavior change to navigation, back handling, or any non-visual logic anywhere in the app.
|
|
- [x] Launcher icon background color matches the new theme's primary.
|
|
- [x] Build, unit tests, and lint pass.
|
|
- [ ] Live-confirmed on the human product owner's device -- blocked, see Known limitations.
|
|
|
|
## Required checks
|
|
|
|
```text
|
|
./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug
|
|
```
|
|
|
|
## Evidence
|
|
|
|
- `ui/theme/Color.kt`: full sky-blue light/dark palette (`SkyPrimary*`, `SlateSecondary*`,
|
|
`CyanTertiary*`, background/surface/outline/inverse roles), plus fixed `UbiSamLogoGray`/
|
|
`UbiSamLogoBlue` brand constants independent of light/dark mode.
|
|
- `ui/theme/Theme.kt`: `LightColorScheme`/`DarkColorScheme` rebuilt from the new values; structure
|
|
otherwise unchanged from the previous theme file.
|
|
- New `ui/components/UBGiteaTopBar.kt`: `UBGiteaTopBar` (a plain branding bar, not a Material3
|
|
`TopAppBar`, deliberately without a back button -- see Scope), `UBGiteaLogo`, and a private
|
|
`SignalMark` Canvas composable.
|
|
- `feature/repositories/RepositoryListScreen.kt`: `Scaffold`'s `topBar` now renders
|
|
`UBGiteaTopBar()`.
|
|
- `res/drawable/ic_launcher_background.xml`: fill color changed from `#3B6A1F` to `#0369A1`.
|
|
- `docs/product.md`: "Visual identity, icon, and color palette" and "Whether repositories must be
|
|
cached for offline browsing" (already shipped by TASK-044, previously left undocumented as
|
|
resolved) moved from Open to Product decisions.
|
|
- `./gradlew compileDebugKotlin compileDebugUnitTestKotlin testDebugUnitTest assembleDebug lintDebug`:
|
|
BUILD SUCCESSFUL, all existing unit tests passing unmodified (no behavior touched), 0 lint errors.
|
|
|
|
## Known limitations
|
|
|
|
- **Not yet confirmed on the human product owner's physical device.** Wireless `adb` pairing failed
|
|
five consecutive times with `protocol fault (couldn't read status message)` across three freshly
|
|
issued pairing codes, on a PC that could otherwise ping the phone with 0% loss -- pointing at a
|
|
local firewall/security-software block on the TLS pairing handshake specifically, not an expired
|
|
code or a network-reachability problem. Diagnosis was paused at the product owner's direction
|
|
("일단 보류"); a USB cable connection was suggested as the way to bypass this and hasn't been tried
|
|
yet.
|
|
- The logo is a hand-drawn recreation, not the actual reference image file (see Scope).
|
|
- Six of the app's seven screens get the new color theme automatically but no logo/branded header --
|
|
intentional, see Scope.
|
|
|
|
## Review findings
|
|
|
|
None yet -- pending Codex/human review.
|