Ubisam-MobileGit/tasks/045-sky-blue-redesign.md
choiminyeong f6ac20c8ed TASK-063: task records say what is actually open
No task waits on a Codex review; the redesign tasks are confirmed on the
product owner's Z Fold7; TASK-016's leftovers are on hold; no biometric
reauthentication.

Agent: main (opus)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 20:25:49 +09:00

6.7 KiB

TASK-045: Sky blue + white redesign, UbiSam logo

Status: implemented; required checks pass; confirmed by the human product owner on their Z Fold7 (2026-09-29) 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

  • 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.
  • The 저장소 목록 (root) screen shows a small UbiSam wordmark top-left.
  • No behavior change to navigation, back handling, or any non-visual logic anywhere in the app.
  • Launcher icon background color matches the new theme's primary.
  • Build, unit tests, and lint pass.
  • Live-confirmed on the human product owner's device -- blocked, see Known limitations.

Required checks

./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 -- no Codex review pending (Codex retired, 2026-09-29).