Skip to content

feat(ui): draw the codev C in Splash and Mark - #176

Merged
quickbeard merged 1 commit into
mainfrom
codev-c-glyphs
Aug 10, 2026
Merged

quickbeard merged 1 commit into
mainfrom
codev-c-glyphs

Conversation

@quickbeard

@quickbeard quickbeard commented Aug 10, 2026 •

Copy link
Copy Markdown
Owner

Upstream's square "o" survived the icon/wordmark rebrand in the last two glyphs that still render it. Logo was rebranded in #170; Mark and Splash were explicitly carved out at the time. This closes that gap.

Affects the desktop boot splash, the app loading overlay, the connection-error screen, the two session side-panel watermarks and the v1 new-session view — all from one file.

What changed

Both glyphs draw the codev C as one full-bleed path each: the block art █▀▀▀ / █ / ▀▀▀▀ on a 4x5 grid with a one-unit stroke, the same geometry packages/desktop/icons/icon.svg and the codev --mini badge use.

  • Splash — viewBox 0 0 80 100, unit 20, M0 0H80V20H20V80H80V100H0Z
  • Mark — viewBox 0 0 16 20, unit 4, M0 0H16V4H4V16H16V20H0Z

Upstream's second path on each glyph — which shaded the lower half of the "o"'s enclosed counter in --icon-weak-base / --icon-base — is dropped. The C is open on the right, so there is no counter to shade, and the TUI badge is a flat outline for the same reason.

Why they split on color

Glyph Fill Light Dark
Splash --logo-splash #ee0033 #ee0033
Mark --icon-strong-base #1d1917 #ede8e4

Splash is brand-locked, following the precedent already set for this exact glyph in packages/opencode/src/cli/cmd/run/theme.ts (BRAND_MARK), so the boot splash, the dock icon, the landing page icon and the terminal badge are one glyph in one red. It needs no dark-mode swap — red clears 4:1 against both the light and dark background-base, unlike the wordmark's navy half.

Mark stays tokenized: two of its three call sites are opacity-10 watermarks in the session side panel, where brand red renders as a pink wash instead of a neutral texture.

Deliberately not changed

The static opacity-50 on the two splash call sites. This fork's animate-pulse is pulse-opacity (0.4 → 1 → 0.4, not Tailwind's stock 1 → .5), which overrides the declared opacity for the entire animation — verified by reading computed opacity in the running app. Removing it is a visual no-op that would touch two upstream files.

Known follow-up

At the 0.4 pulse floor, red on the dark ground composites to #6a0b1f — about 1.5:1 against #121212, where the grey it replaced held 3.4:1. Opacity blends toward the ground and red has little luminance to spend: the green channel carries 71.5% of perceived luminance and #ee0033 has none of it. Only the dark ground really changed — on light the trough was always soft (grey 2.5:1, red 2.0:1).

It recovers to full strength every two seconds, so this may just be what a pulse looks like. Holding 3:1 on dark would need a floor near 0.8, which is barely a pulse — so the real choice is to accept the trough or to stop pulsing opacity on a brand-locked mark and use the pulse-scale keyframes the app already ships. Note the blast radius of a global change is small: the only other animate-pulse call site in the app is one sidebar skeleton.

Verification

  • ui typecheck + 9 tests, desktop typecheck + 63 tests, app typecheck — all pass
  • Compiled output pulled from the vite dev server confirms one path per glyph with the intended d and fills
  • --logo-splash resolves to #ee0033 under both data-color-scheme values in the running app
  • All four states rendered on both app surfaces
  • No e2e selectors reference these glyphs

DIVERGENCES.md row updated: keep Splash brand-locked and Mark tokenized on conflict, and re-apply the C rather than taking back the "o".

🤖 Generated with Claude Code

The icon/wordmark rebrand only reached `Logo`, so upstream's square "o"
still shipped in the last two glyphs that render it: the desktop boot
splash, the app loading overlay, the connection-error screen, the two
session side-panel watermarks and the v1 new-session view.

Both glyphs now draw the codev C — the block art `█▀▀▀ / █ / ▀▀▀▀` on a
4x5 grid with a one-unit stroke, the same geometry the app icon and the
`codev --mini` badge use — as one full-bleed path each. Upstream's second
path, which shaded the lower half of the "o"'s enclosed counter, is
dropped: the C is open on the right so there is no counter to shade, and
the TUI badge is a flat outline for the same reason.

The two split on color. `Splash` is brand-locked through a new
`--logo-splash: #ee0033`, declared once with no dark-mode swap — red
clears 4:1 against both the light and dark `background-base`, unlike the
wordmark's navy half. `Mark` keeps `var(--icon-strong-base)` because two
of its three call sites are `opacity-10` watermarks, where brand red
reads as a pink wash rather than a neutral texture.

The static `opacity-50` on the two splash call sites is left as is: this
fork's `animate-pulse` is `pulse-opacity` (0.4 -> 1 -> 0.4), which
overrides the declared opacity for the whole animation, so removing it
would be a no-op in two upstream files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@quickbeard
quickbeard merged commit e1f5613 into main Aug 10, 2026
0 of 5 checks passed
@quickbeard
quickbeard deleted the codev-c-glyphs branch August 13, 2026 01:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant