# 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.