From 226e005bf54c2a32422ea0e47f5d4ec74128d6fe Mon Sep 17 00:00:00 2001 From: minhn4 Date: Tue, 7 Jul 2026 11:43:08 +0700 Subject: [PATCH 1/4] feat: rebrand TUI banner to codev and accent to #EE0033 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wordmark glyphs become "co"+"dev" in the shared pixel font (feeds the TUI home banner, CLI help logo, and plain wordmark). Banner renders uniform bold cyan matching the codev hub CLI banner. Default theme secondary — which colors the first agent label ("Build") and the prompt border — becomes #EE0033 in dark and light variants. Co-Authored-By: Claude Fable 5 --- DIVERGENCES.md | 9 ++++++--- packages/opencode/src/cli/ui.ts | 8 ++++---- packages/tui/src/component/logo.tsx | 8 ++++++-- packages/tui/src/logo.ts | 6 ++++-- packages/tui/src/theme/assets/opencode.json | 4 ++-- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 3b2f5c2781..4661fcb0e3 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -20,6 +20,10 @@ future `packages/codev-*`) never conflict and are not tracked here. | `packages/opencode/script/publish.ts` | `PUBLISH_NAME = "codev-code"` const; published-name→dir map; main pkg name + bin key; env-guarded exit before the Docker/AUR/Homebrew section | npm-only publishing under the fork's names (unscoped, public on npmjs); upstream's other channels target anomalyco infra. | Keep our names + early exit; take upstream's npm-section changes above the exit. | | `packages/opencode/bin/opencode` | `base` prefix `opencode-` → `codev-code-` | Runtime platform-binary lookup must match the published names. | Keep our prefix. | | `packages/opencode/script/postinstall.mjs` | `base` prefix `opencode-` → `codev-code-` | Install-time platform-binary fetch must match the published names. | Keep our prefix. | +| `packages/tui/src/logo.ts` | Wordmark glyphs "open"+"code" → "co"+"dev" | TUI home banner and CLI help logo read "codev". | Keep our glyphs. | +| `packages/tui/src/component/logo.tsx` | Banner rendered uniform bold cyan (#00cdcd) instead of theme muted/text two-tone | Matches the codev hub CLI banner color. | Keep our color; take upstream's surrounding changes. | +| `packages/tui/src/theme/assets/opencode.json` | `darkSecondary`/`lightSecondary` → `#EE0033` | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. | +| `packages/opencode/src/cli/ui.ts` | Plain-text `wordmark` → "codev" letters | Non-TTY fallback banner matches the branded logo. | Keep our wordmark rows; take upstream's surrounding changes. | | `README.md` | Replaced with fork README | Fork identity, sync + divergence policy. | Keep ours entirely. | | `README.*.md` (21 translations) | Deleted | Upstream marketing translations, irrelevant to the fork. | Keep deleted (`git rm` the upstream side of modify/delete conflicts). | | `screenshot-uk.png` | Deleted | Orphaned README-translation asset; referenced by nothing. | Keep deleted. | @@ -38,9 +42,8 @@ future `packages/codev-*`) never conflict and are not tracked here. the upstream version the fork was built from; suffix like `-codev.1` for fork-only re-releases). Docker/AUR/Homebrew/GitHub-release channels are upstream-only and disabled. The binary inside platform packages is still named `opencode` (cosmetic). -- **UI branding**: TUI logo (`UI.logo()`), desktop/web app names and assets — all still - upstream-branded. Cosmetic; not worth the merge-conflict surface until the product ships - beyond the team. +- **UI branding**: TUI banner and default-theme accent are rebranded (see table). Desktop/web + app names and assets remain upstream-branded — revisit if those surfaces ship to the team. - **Internal names**: `@opencode-ai/*` package names, `OPENCODE_*` env vars, `~/.local/share/codev-code` internals keep upstream naming on purpose. Renaming them would be a permanent merge-conflict machine for names users never see. Do not "clean these up". diff --git a/packages/opencode/src/cli/ui.ts b/packages/opencode/src/cli/ui.ts index 6ad6495cf1..d8693e1587 100644 --- a/packages/opencode/src/cli/ui.ts +++ b/packages/opencode/src/cli/ui.ts @@ -3,10 +3,10 @@ import { Schema } from "effect" import { logo as glyphs } from "./logo" const wordmark = [ - `⠀ ▄ `, - `█▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀█`, - `█ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀▀`, - `▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀`, + `⠀ ▄ `, + `█▀▀▀ █▀▀█ █▀▀█ █▀▀█ █ █`, + `█ █ █ █ █ █▀▀▀ █ █`, + `▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀ `, ] export class CancelledError extends Schema.TaggedErrorClass()("UICancelledError", {}) {} diff --git a/packages/tui/src/component/logo.tsx b/packages/tui/src/component/logo.tsx index db8e8dc716..cdcec3093b 100644 --- a/packages/tui/src/component/logo.tsx +++ b/packages/tui/src/component/logo.tsx @@ -46,13 +46,17 @@ export function Logo() { }) } + // Fork: uniform bold cyan, matching the codev hub's CLI banner + // (codev repo, src/components/Banner.tsx renders it in ink's "cyan"). + const brand = RGBA.fromHex("#00cdcd") + return ( {(line, index) => ( - {renderLine(line, theme.textMuted, false)} - {renderLine(logo.right[index()], theme.text, true)} + {renderLine(line, brand, true)} + {renderLine(logo.right[index()], brand, true)} )} diff --git a/packages/tui/src/logo.ts b/packages/tui/src/logo.ts index a58a8cf995..d898ab051e 100644 --- a/packages/tui/src/logo.ts +++ b/packages/tui/src/logo.ts @@ -1,6 +1,8 @@ +// Fork: "codev" wordmark ("co" + "dev"), same pixel font and shadow marks as +// upstream's "open" + "code". export const logo = { - left: [" ", "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", "█__█ █__█ █^^^ █__█", "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀"], - right: [" ▄ ", "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", "█___ █__█ █__█ █^^^", "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"], + left: [" ", "█▀▀▀ █▀▀█", "█___ █__█", "▀▀▀▀ ▀▀▀▀"], + right: [" ▄ ", "█▀▀█ █▀▀█ █__█", "█__█ █^^^ █__█", "▀▀▀▀ ▀▀▀▀ ▀▀ "], } export const go = { diff --git a/packages/tui/src/theme/assets/opencode.json b/packages/tui/src/theme/assets/opencode.json index e92dca8c2f..850539813f 100644 --- a/packages/tui/src/theme/assets/opencode.json +++ b/packages/tui/src/theme/assets/opencode.json @@ -13,7 +13,7 @@ "darkStep10": "#ffc09f", "darkStep11": "#808080", "darkStep12": "#eeeeee", - "darkSecondary": "#5c9cf5", + "darkSecondary": "#EE0033", "darkAccent": "#9d7cd8", "darkRed": "#e06c75", "darkOrange": "#f5a742", @@ -32,7 +32,7 @@ "lightStep10": "#2968c3", "lightStep11": "#8a8a8a", "lightStep12": "#1a1a1a", - "lightSecondary": "#7b5bb6", + "lightSecondary": "#EE0033", "lightAccent": "#d68c27", "lightRed": "#d1383d", "lightOrange": "#d68c27", From 711231e306b30af49d730cd34fe88c765c0dea47 Mon Sep 17 00:00:00 2001 From: minhn4 Date: Tue, 7 Jul 2026 13:49:20 +0700 Subject: [PATCH 2/4] feat: rebrand desktop/web app names and favicon assets Web UI title, PWA manifest, app-menu labels, desktop APP_NAMES/window title/productName/artifact name become CoDev Code. New favicon set: pixel "C" mark in #EE0033 on dark (SVG + rasterized PNG variants) in packages/ui favicon assets, served through packages/app symlinks. appId and the opencode:// deep-link scheme stay upstream (identity plumbing); i18n strings, .ico/social image, and desktop icons remain (documented in DIVERGENCES). Co-Authored-By: Claude Fable 5 --- DIVERGENCES.md | 14 ++++++++++++-- packages/app/index.html | 2 +- .../app/src/components/windows-app-menu.tsx | 2 +- packages/app/src/desktop-menu.ts | 2 +- packages/desktop/electron-builder.config.ts | 10 +++++----- packages/desktop/src/main/index.ts | 6 +++--- packages/desktop/src/main/windows.ts | 2 +- .../assets/favicon/apple-touch-icon-v3.png | Bin 1541 -> 2181 bytes .../src/assets/favicon/favicon-96x96-v3.png | Bin 536 -> 1416 bytes packages/ui/src/assets/favicon/favicon-v3.svg | 13 ++++++------- .../ui/src/assets/favicon/site.webmanifest | 4 ++-- .../favicon/web-app-manifest-192x192.png | Bin 1601 -> 2303 bytes .../favicon/web-app-manifest-512x512.png | Bin 7194 -> 6247 bytes 13 files changed, 32 insertions(+), 23 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 4661fcb0e3..403e3c1357 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -24,6 +24,11 @@ future `packages/codev-*`) never conflict and are not tracked here. | `packages/tui/src/component/logo.tsx` | Banner rendered uniform bold cyan (#00cdcd) instead of theme muted/text two-tone | Matches the codev hub CLI banner color. | Keep our color; take upstream's surrounding changes. | | `packages/tui/src/theme/assets/opencode.json` | `darkSecondary`/`lightSecondary` → `#EE0033` | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. | | `packages/opencode/src/cli/ui.ts` | Plain-text `wordmark` → "codev" letters | Non-TTY fallback banner matches the branded logo. | Keep our wordmark rows; take upstream's surrounding changes. | +| `packages/app/index.html` | `` → "CoDev Code" | Web UI tab title. | Keep our title. | +| `packages/app/src/desktop-menu.ts`, `packages/app/src/components/windows-app-menu.tsx` | App-menu label "OpenCode" → "CoDev Code" | Visible menu branding. | Keep our labels. | +| `packages/desktop/src/main/index.ts`, `packages/desktop/src/main/windows.ts` | APP_NAMES + window title → "CoDev Code" (Dev/Beta variants too) | Desktop app display name. | Keep our names. | +| `packages/desktop/electron-builder.config.ts` | `productName` ×3 → "CoDev Code…"; artifactName → `codev-code-desktop-…`; protocol display name | Installer/product branding. appId (`ai.opencode.desktop`) and the `opencode://` deep-link scheme stay upstream — identity plumbing wired into main/index.ts and app deep-links; do not rename casually. | Keep our names; take upstream's other config. | +| `packages/ui/src/assets/favicon/` (favicon-v3.svg, site.webmanifest, favicon-96x96-v3.png, apple-touch-icon-v3.png, web-app-manifest-192/512.png) | New codev mark: pixel "C" in #EE0033 on dark; manifest name "CoDev Code"/"codev" | Web/desktop favicon + PWA branding (served via packages/app/public symlinks). | Keep our assets (binary: take ours wholesale). | | `README.md` | Replaced with fork README | Fork identity, sync + divergence policy. | Keep ours entirely. | | `README.*.md` (21 translations) | Deleted | Upstream marketing translations, irrelevant to the fork. | Keep deleted (`git rm` the upstream side of modify/delete conflicts). | | `screenshot-uk.png` | Deleted | Orphaned README-translation asset; referenced by nothing. | Keep deleted. | @@ -42,8 +47,13 @@ future `packages/codev-*`) never conflict and are not tracked here. the upstream version the fork was built from; suffix like `-codev.1` for fork-only re-releases). Docker/AUR/Homebrew/GitHub-release channels are upstream-only and disabled. The binary inside platform packages is still named `opencode` (cosmetic). -- **UI branding**: TUI banner and default-theme accent are rebranded (see table). Desktop/web - app names and assets remain upstream-branded — revisit if those surfaces ship to the team. +- **UI branding**: TUI banner, default-theme accent, desktop/web app names, and favicon/PWA + assets are rebranded (see table). Still upstream-branded, deliberately: in-app i18n strings + mentioning "OpenCode" (~33 × 19 locale files — a merge-conflict farm; revisit with a + runtime display-name shim if it matters), `favicon-v3.ico` + `social-share.png` (binary + formats we can't author well — need design assets), desktop app ICONS (resources/icons — + need design assets), and the `ai.opencode.desktop` appId / `opencode://` scheme (identity + plumbing, like the OPENCODE_* env vars). - **Internal names**: `@opencode-ai/*` package names, `OPENCODE_*` env vars, `~/.local/share/codev-code` internals keep upstream naming on purpose. Renaming them would be a permanent merge-conflict machine for names users never see. Do not "clean these up". diff --git a/packages/app/index.html b/packages/app/index.html index d71535182c..2709791e9f 100644 --- a/packages/app/index.html +++ b/packages/app/index.html @@ -6,7 +6,7 @@ name="viewport" content="width=device-width, initial-scale=1, interactive-widget=resizes-content, viewport-fit=cover" /> - <title>OpenCode + CoDev Code diff --git a/packages/app/src/components/windows-app-menu.tsx b/packages/app/src/components/windows-app-menu.tsx index 017ac4cf8d..3ad2930954 100644 --- a/packages/app/src/components/windows-app-menu.tsx +++ b/packages/app/src/components/windows-app-menu.tsx @@ -77,7 +77,7 @@ export function WindowsAppMenu(props: { - OpenCode + CoDev Code {DESKTOP_MENU.filter((menu) => desktopMenuVisible(menu, "windows")).map((menu) => ( {menu.items diff --git a/packages/app/src/desktop-menu.ts b/packages/app/src/desktop-menu.ts index d3902cd2b2..b96fe57e0d 100644 --- a/packages/app/src/desktop-menu.ts +++ b/packages/app/src/desktop-menu.ts @@ -72,7 +72,7 @@ export type DesktopMenu = { export const DESKTOP_MENU: DesktopMenu[] = [ { id: "app", - label: "OpenCode", + label: "CoDev Code", platforms: ["macos"], items: [ { type: "item", role: "about" }, diff --git a/packages/desktop/electron-builder.config.ts b/packages/desktop/electron-builder.config.ts index 23afe811c2..3ef10ba206 100644 --- a/packages/desktop/electron-builder.config.ts +++ b/packages/desktop/electron-builder.config.ts @@ -39,7 +39,7 @@ const APP_IDS = { } as const const getBase = (appId: string): Configuration => ({ - artifactName: "opencode-desktop-${os}-${arch}.${ext}", + artifactName: "codev-code-desktop-${os}-${arch}.${ext}", directories: { output: "dist", buildResources: "resources", @@ -74,7 +74,7 @@ const getBase = (appId: string): Configuration => ({ sign: true, }, protocols: { - name: "OpenCode", + name: "CoDev Code", schemes: ["opencode"], }, win: { @@ -115,7 +115,7 @@ function getConfig() { return { ...base, appId, - productName: "OpenCode Dev", + productName: "CoDev Code Dev", rpm: { packageName: "opencode-dev" }, } } @@ -123,7 +123,7 @@ function getConfig() { return { ...base, appId, - productName: "OpenCode Beta", + productName: "CoDev Code Beta", protocols: { name: "OpenCode Beta", schemes: ["opencode"] }, publish: { provider: "github", owner: "anomalyco", repo: "opencode-beta", channel: "latest" }, rpm: { packageName: "opencode-beta" }, @@ -133,7 +133,7 @@ function getConfig() { return { ...base, appId, - productName: "OpenCode", + productName: "CoDev Code", protocols: { name: "OpenCode", schemes: ["opencode"] }, publish: { provider: "github", owner: "anomalyco", repo: "opencode", channel: "latest" }, deb: { fpm: [legacyDesktopEntryFpm] }, diff --git a/packages/desktop/src/main/index.ts b/packages/desktop/src/main/index.ts index acceabfef0..f378bc043f 100644 --- a/packages/desktop/src/main/index.ts +++ b/packages/desktop/src/main/index.ts @@ -44,9 +44,9 @@ import { migrate } from "./migrate" import { cleanupStoreFiles } from "./store-cleanup" const APP_NAMES: Record = { - dev: "OpenCode Dev", - beta: "OpenCode Beta", - prod: "OpenCode", + dev: "CoDev Code Dev", + beta: "CoDev Code Beta", + prod: "CoDev Code", } const APP_IDS: Record = { dev: "ai.opencode.desktop.dev", diff --git a/packages/desktop/src/main/windows.ts b/packages/desktop/src/main/windows.ts index a2c7ca617b..00c5850e6f 100644 --- a/packages/desktop/src/main/windows.ts +++ b/packages/desktop/src/main/windows.ts @@ -166,7 +166,7 @@ export function createMainWindow(id: string = randomUUID()) { height: state.height, show: false, autoHideMenuBar: true, - title: "OpenCode", + title: "CoDev Code", icon: iconPath(), backgroundColor: backgroundColor ?? defaultBackgroundColor(), ...(process.platform === "darwin" diff --git a/packages/ui/src/assets/favicon/apple-touch-icon-v3.png b/packages/ui/src/assets/favicon/apple-touch-icon-v3.png index 70fd01b0ea38ea8b3d0429a6438f5b8e85aba94a..97eaf7247d827dd91f5fb9cd26ce980cc10a7ae8 100644 GIT binary patch literal 2181 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 diff --git a/packages/ui/src/assets/favicon/favicon-96x96-v3.png b/packages/ui/src/assets/favicon/favicon-96x96-v3.png index 15266d28f159a74d5c54634d1b3ef548e97f6c8c..7e7181af08329f6283c298d5cb5a026eb4727dfa 100644 GIT binary patch literal 1416 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDB+SC;hE;^%b*2hb1*Qr zXELw=S&Tp|1;h*t%nKM9n1M7SNNfQUTsC0=GlC6LxY9V@52$QzW=KRygs+cPa(=E} zVoH8es$NBI0Z0LZO@$SZnVVXYs8ErclUHn2VXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO| zi&7QL^bGV2l1AfjnEKjFOT9D}DX)@^Za$W4-*MbbUihOG|wN zBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o3raHc^AtelCMM;Vme?vOfh>Xph&xj& zG7&cA6+^uR^q@XSM&D4+Kp$>4P^%3{)G8peA~h$%B{MfQuNY{DovERb4Ol&f48lev zosl?oBFR8?+USEkfaD=aXn{q6!DYu~qYn>yJFXr29^t@vmGX3P45?szJJ&Yvwu6A% z^hq+$*BeY=cv;JIU-9_~#-dgkh42%lMJ&@-PCC`vxTP&QdeY&E3(};dttbEVc)D@J z#)h)=ANTltb;7@Vc=zVb#=;XEIw=!5_b4|od~|VOU^>EbT3A z%b5fe)D-yqSrr_79AxHkIW){@u&@zrU@&AX{1F=V$G1A?_L_rgc73sC({epd8o3^* zYWe^4TkY-}bGEfl*|N;~#K{@Ao_<9&tO@~hyK_D4`Vi~NtQcCs#qU)bWq>1CXeHU(oIV~CaZ&~rOpmwC(jiM zT;SAOEzPvaqpYvF!LK0luD}G>O~o=SB~7PaP1`0S=&6w&YdGoP=igE5X8!bZYFNAM zTq@^zJ;~S4e^-5)9K>igndjeg^XqS~KeEg1{d;mVU(ErQJ3P0iEY0wC);b`xVdnqh zmjB5y$@ZSQdD6E3H`MqZS|WGC#s9Kgj>MlHcA1MYt9}=Yhxpz(>fFE_bl1hfv{0O% zk8&@prfR=dTYk6ZU46 zNqaTN?CCpmL3yM8|MOZJDr5eB-=KT_OwCU2F8@atI5;>Sc9*+3%t_2(VQKkr)LL2L zoPh}wlhcn!a|H#`C8QV`6>C181}8b*jMp<%TkVL<(vDjn9RE}#eGBZnLlpz zT@2Ad`(pk{*5BIouTZ`{Ts(cRVd{xr`K$Kq*`5DrX-Grsw$i_;@qGVF_5X2ne^q8+ kOk#TUA%uj~s37)1d|!{Z{0Doc)u2Ml)78&qol`;+0A-N^$N&HU literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U_9&T;uuoF_-2kH*C7W17V-E6 zFXn$)Jn1}VWz)Rk!VA93%@(%Up4f0XPqg-HiS7LRa(xF^{&eKjU^sez7Ly2raKq!= z2Brk2f<3$e3_c8f+ZnkSICw-dnG+r;>$uDw$0;LPsnB{na7mCjKzib*uaihe}mzNs&#KTgN`2~7sCBeS(pZpU>|VHo`hk0|4|7)d1$)nnOUS-2?|0x9zfA3XrUYknTj~WYE{IAqoDKnpTg@KE zlmGwSOe(+SALH)78&qol`;+06E9QCjbBd diff --git a/packages/ui/src/assets/favicon/favicon-v3.svg b/packages/ui/src/assets/favicon/favicon-v3.svg index 157edc4d75..80fb672c98 100644 --- a/packages/ui/src/assets/favicon/favicon-v3.svg +++ b/packages/ui/src/assets/favicon/favicon-v3.svg @@ -1,7 +1,6 @@ - - - - - \ No newline at end of file + + + + + + diff --git a/packages/ui/src/assets/favicon/site.webmanifest b/packages/ui/src/assets/favicon/site.webmanifest index 427c3adf42..6c83900477 100644 --- a/packages/ui/src/assets/favicon/site.webmanifest +++ b/packages/ui/src/assets/favicon/site.webmanifest @@ -1,6 +1,6 @@ { - "name": "OpenCode", - "short_name": "OpenCode", + "name": "CoDev Code", + "short_name": "codev", "id": "/", "start_url": "/", "scope": "/", diff --git a/packages/ui/src/assets/favicon/web-app-manifest-192x192.png b/packages/ui/src/assets/favicon/web-app-manifest-192x192.png index e637755490fb8b6f36252d6f740214c9203af27b..dd7c3f97edf83ef4fa6737bc42322c344ffbfcb3 100644 GIT binary patch literal 2303 zcmeHJX;2eq82)xyFhEfXv{AHm4G7v|mP1fNz@Q*!03BMQ#c+!OasaUja=2ovqEfUv zjFlreqvBCH>H&jDq6iF9w8~J5ToI6nHgYJ+O~0U3r=9+CI{nj~`SyGFJ@Y>EJTu7% z@bfUxGt~nC7@!1ah#bDxs|ceZT;(V_~lI7 zCKihr1R;?~=n^}+Fd>?-addPftZfNf+Z8ZlMPiab941{MNHlxZUTy-d2c5P5?`+c7bG+h!iH{5yy*=~nHn!6fG3TLucm@HW zbJ)wxHBgGEJ2u2bx|`Gvwe_3tUxw*m*A0F~+cWe<#zi;S%GB1ny~r+PNY6`KS;Ey8D* zNGIEZMV@+6mV~a>@-fC0_eR>7Nbasvx`v_sh`1NnBc`C;q7^CFJ)7Qz0(8HMY73anM-R`(zrNzFcq)Ao0$=R^%L1l zq4>gSBPDC9+>9}I4H7<=dwRJ?Su3|S&Ag%3BflQ*KAg@kh8Xc(^8NfsaD*C{%tx_p z&xXVaD0Zwev@O;cXXRuS9)XDUYPWH70CGQtnU@O?3*xsI_c6*ZeLelX7{xm2`jr+4 zu)|`1OG_46uYcv51A<-}lQJ9;)R$YLzN~9l&{)^>9wS*5IS;0Z&bpdZZVzQL*`~XE zjL7pP=k*5HjNUU7k5wEDGNTiUp?a~&vksM~hdAqUZLh&n78#Jc=L<6y8IxJR(3=D&RvVmOPl9ICBdd-A zWNp0Zmze-LXKx`~hM?bcul&&zK?7rbI|ERRQp4lequ7~Wk5!()D2Dr+N@6fd!2bjP z0;!TA-uxiUzimRTo_=Wmor34YSH<^)to#8uU1^#g8M&GhO{!G#Yx_>Q8=!M~CZ@Fd zUY;+@l%!62H0X;``a%ZwPS>rGkB>g5j#Gt_+BJDIomEraErDIy*;J+6PHNH%yIy~3 zu_OXbdDQMd(=&I*W=xrLxU>t+RChdw)IL;+57ips3QpB&4Yhlowv1X8L42AQ9+e*eNX6i$;5;akRm*l#5mfx2 b4x9nZi|&2l*?xhV{|a92er`o;L(~5N)ESIk literal 1601 zcmZuydpH$o9G>|a%qfR)DP@)8xE1SCu1}KV7DXI#i|BNdYim>S5Y4ex5{pfxY~{8k zEslo{p*o6{q;f6FlWa*h|e`)(~|CpI?=Ka3kJMa5@znNoP7YF7-<%JlAF*iEe zxx-cT^&lnT?EW-N3d1BOHriQxMC0$e{q}9KrtIC0%Te`z@bZ(J)%K9A_}LweuZ4Z- z#ihUQUiDmf#r1t;RewuW+4i|<9(R2CI(1igISsbpWKOs z3~sS^%OQCdM|)+{eGLw66noWE8%GBc_P=vRgn5Ox-@&h7QD;-)O{fvo7R}`YZ)I3h zEkQ;orAaL&sa%_uLv`Q42*mG}A%f(_W`kgLO+d?4fbH*y3m8=YP>kLqc18egH8P@f zAx_%Yz~|$u*AmsTj}?esf_xbGqM;s2MqKj>RbX*)G8Lp0Sfcuuz9pM!EPTV1i{n!m z^cAVB1KloRT`qmFChcy$0#t7Bdf)jCyvONpOC_SSvc(Q^ERowm-$6I@|F`CjbU{q{ zJvJhIh+dP`42l(K;I7B!(Du3h3MVjp=LEZJ9*lWol4J$dT?@pG3ZSNK;8RtV)1d3F z>tpE*?w7?yOd7j7V{p?Fzk3s1!|TqT$I9eCe(og5jGFb&w`+1}Z^m?d2qGN)FN~JS zvqV>jI4cu=11cQUKTIKlbWdCwOHw@9s47V{4$ZPpEJvS8?%1zE31)+vnk|iv|X&IEN6%wEWRGy~=U^&m&P3#TS3`9kP1`BJOmYEChKxo|V5aLUat(&WDNvc1CUGhN%N9&qet7Jg9ZA#_ekpwxaV)krp zB8IbJ=?xWVf}_8* zhHr2Qk}8(j;RPX@2U!_dUNyM|DyJxhx28jCcIkf+k~mUa)q7SIW;Jb_4VObiGPhFt z3Hb0sjFJN=B=znHK%p=%>SqGLhY8=oIc>p=E#1egJ^~vstZ`%v@+hdqKm7y^FPZee zk%QsN%-QMBGrv!D_>|55lZLYP%5pI1H#dQt0Rq)nGbtdzG?NAC(C_l7NB|$ZC0N`B z`?Gb39%~x2D5^D*#!=#Bn~dd9{+F8nz!2h?P!rELVLxyOi&CEKX(K6?ulm@JK>la7 z{}OoPZ{Q*cpPJJx)DYxa-&y9|CK|hB8d|20h@o3A9$tp+7E&?sW*#(HF*Ys$&xFeL zUX-JO2tt1R!FoyEfc7&{g-Sdvm5K-299nE4e69^mVyL7CXj5?r&o|R}<^l0Yc{Dl% ztFNm~U4)2x)FnB<>>*~e*-4QdesR!Lg|9}ChD3qdR%m8uu#NUEcBMAFgnt3i)?%gr diff --git a/packages/ui/src/assets/favicon/web-app-manifest-512x512.png b/packages/ui/src/assets/favicon/web-app-manifest-512x512.png index f6f0cf514e89b5a9fc7294eb2ab41388bf614b4e..b1adae26b0ded54b8f20cbad709108752bf5d038 100644 GIT binary patch literal 6247 zcmeI0-%Aux6vxk<8JE%A7=M7GB2z@WMYzlMP?Y2-yXaEduJvF)w4qudh!8ATQE+w( z{Q00SnGfX>6ci~%5hB%&MYLe_AQeWIOBf^?ZBkOYXy;yu{s18&?!z!=?wxbb<#4|D z$EU+rRc=koO9KF_x58ZwAfPFLY{A#J;LAmPk;dxsG8lSMFoPdE12x|I%1YRZwhW~0 z6iDnPmER`^($`wi43#ig5KMzwHL%- zY<oYl z28ml_YG^(aQ>4rYDF^f5hrj>?*P{bh0w%U_4f~vzX3#BUAP6%J?+Q%HzVF#Zq z&nz#4wF@lK9dAx~zh}ASi`a4*MLD%8u^3#r?pT^DAyF6>nF_i1h`^UMz6PT{)?Nl? zqw{X8q$2+P>+<>W_A=b?cB9fJ4=rV~o$gYG6Y6g!6ehd|o6dW94pd$T3eN!^hj|_F z9MEeKuY>#6W#DEyyUfMJN> zA!1}=#1@NmFeMMHo*zb literal 7194 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 From 775650395e2f89c950cb408d080c34af2b160010 Mon Sep 17 00:00:00 2001 From: minhn4 Date: Tue, 7 Jul 2026 14:29:40 +0700 Subject: [PATCH 3/4] feat: hub-style CODEV banner, accent becomes banner cyan The TUI home banner, CLI help, and presentation mode now render the same ANSI-Shadow CODEV art as the codev hub's Banner.tsx, in bold cyan. Default-theme secondary and the favicon mark move from #EE0033 to the banner cyan (#00cdcd) so the accent matches the banner. Co-Authored-By: Claude Fable 5 --- DIVERGENCES.md | 11 +-- packages/opencode/src/cli/ui.ts | 66 ++---------------- packages/tui/src/component/logo.tsx | 66 +++--------------- packages/tui/src/logo.ts | 11 +++ packages/tui/src/theme/assets/opencode.json | 4 +- packages/tui/src/util/presentation.ts | 23 +----- .../assets/favicon/apple-touch-icon-v3.png | Bin 2181 -> 2149 bytes .../src/assets/favicon/favicon-96x96-v3.png | Bin 1416 -> 1396 bytes packages/ui/src/assets/favicon/favicon-v3.svg | 6 +- .../favicon/web-app-manifest-192x192.png | Bin 2303 -> 2245 bytes .../favicon/web-app-manifest-512x512.png | Bin 6247 -> 6244 bytes 11 files changed, 42 insertions(+), 145 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 403e3c1357..0d54018c63 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -20,15 +20,16 @@ future `packages/codev-*`) never conflict and are not tracked here. | `packages/opencode/script/publish.ts` | `PUBLISH_NAME = "codev-code"` const; published-name→dir map; main pkg name + bin key; env-guarded exit before the Docker/AUR/Homebrew section | npm-only publishing under the fork's names (unscoped, public on npmjs); upstream's other channels target anomalyco infra. | Keep our names + early exit; take upstream's npm-section changes above the exit. | | `packages/opencode/bin/opencode` | `base` prefix `opencode-` → `codev-code-` | Runtime platform-binary lookup must match the published names. | Keep our prefix. | | `packages/opencode/script/postinstall.mjs` | `base` prefix `opencode-` → `codev-code-` | Install-time platform-binary fetch must match the published names. | Keep our prefix. | -| `packages/tui/src/logo.ts` | Wordmark glyphs "open"+"code" → "co"+"dev" | TUI home banner and CLI help logo read "codev". | Keep our glyphs. | -| `packages/tui/src/component/logo.tsx` | Banner rendered uniform bold cyan (#00cdcd) instead of theme muted/text two-tone | Matches the codev hub CLI banner color. | Keep our color; take upstream's surrounding changes. | -| `packages/tui/src/theme/assets/opencode.json` | `darkSecondary`/`lightSecondary` → `#EE0033` | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. | -| `packages/opencode/src/cli/ui.ts` | Plain-text `wordmark` → "codev" letters | Non-TTY fallback banner matches the branded logo. | Keep our wordmark rows; take upstream's surrounding changes. | +| `packages/tui/src/logo.ts` | Pixel glyphs "open"+"code" → "co"+"dev"; added hub-style `banner` (ANSI-Shadow CODEV) | Branded wordmark art; `banner` feeds the TUI home banner, CLI help, and presentation mode. | Keep our glyphs and banner. | +| `packages/tui/src/component/logo.tsx` | Renders the hub-style CODEV `banner` in uniform bold cyan (#00cdcd) | Matches the codev hub CLI banner art and color. | Keep our version wholesale. | +| `packages/tui/src/theme/assets/opencode.json` | `darkSecondary`/`lightSecondary` → `#00cdcd` (banner cyan) | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. | +| `packages/opencode/src/cli/ui.ts` | `wordmark`/`logo()` render the hub-style CODEV banner (bold bright cyan on TTY) | Help banner matches the hub CLI banner. | Keep our wordmark + logo(); take upstream's surrounding changes. | +| `packages/tui/src/util/presentation.ts` | Local logo copy replaced by the shared CODEV `banner` (cyan) | Presentation-mode wordmark was still upstream-branded. | Keep our wordmark(); take upstream's surrounding changes. | | `packages/app/index.html` | `` → "CoDev Code" | Web UI tab title. | Keep our title. | | `packages/app/src/desktop-menu.ts`, `packages/app/src/components/windows-app-menu.tsx` | App-menu label "OpenCode" → "CoDev Code" | Visible menu branding. | Keep our labels. | | `packages/desktop/src/main/index.ts`, `packages/desktop/src/main/windows.ts` | APP_NAMES + window title → "CoDev Code" (Dev/Beta variants too) | Desktop app display name. | Keep our names. | | `packages/desktop/electron-builder.config.ts` | `productName` ×3 → "CoDev Code…"; artifactName → `codev-code-desktop-…`; protocol display name | Installer/product branding. appId (`ai.opencode.desktop`) and the `opencode://` deep-link scheme stay upstream — identity plumbing wired into main/index.ts and app deep-links; do not rename casually. | Keep our names; take upstream's other config. | -| `packages/ui/src/assets/favicon/` (favicon-v3.svg, site.webmanifest, favicon-96x96-v3.png, apple-touch-icon-v3.png, web-app-manifest-192/512.png) | New codev mark: pixel "C" in #EE0033 on dark; manifest name "CoDev Code"/"codev" | Web/desktop favicon + PWA branding (served via packages/app/public symlinks). | Keep our assets (binary: take ours wholesale). | +| `packages/ui/src/assets/favicon/` (favicon-v3.svg, site.webmanifest, favicon-96x96-v3.png, apple-touch-icon-v3.png, web-app-manifest-192/512.png) | New codev mark: blocky "C" in #00cdcd (banner cyan) on dark; manifest name "CoDev Code"/"codev" | Web/desktop favicon + PWA branding (served via packages/app/public symlinks). | Keep our assets (binary: take ours wholesale). | | `README.md` | Replaced with fork README | Fork identity, sync + divergence policy. | Keep ours entirely. | | `README.*.md` (21 translations) | Deleted | Upstream marketing translations, irrelevant to the fork. | Keep deleted (`git rm` the upstream side of modify/delete conflicts). | | `screenshot-uk.png` | Deleted | Orphaned README-translation asset; referenced by nothing. | Keep deleted. | diff --git a/packages/opencode/src/cli/ui.ts b/packages/opencode/src/cli/ui.ts index d8693e1587..0eb6be187e 100644 --- a/packages/opencode/src/cli/ui.ts +++ b/packages/opencode/src/cli/ui.ts @@ -1,13 +1,9 @@ import { EOL } from "os" import { Schema } from "effect" -import { logo as glyphs } from "./logo" +import { banner } from "./logo" -const wordmark = [ - `⠀ ▄ `, - `█▀▀▀ █▀▀█ █▀▀█ █▀▀█ █ █`, - `█ █ █ █ █ █▀▀▀ █ █`, - `▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀ `, -] +// Fork: hub-style CODEV banner (see @opencode-ai/tui/logo). +const wordmark = banner export class CancelledError extends Schema.TaggedErrorClass<CancelledError>()("UICancelledError", {}) {} @@ -47,60 +43,10 @@ export function empty() { export function logo(pad?: string) { if (!process.stdout.isTTY && !process.stderr.isTTY) { - const result = [] - for (const row of wordmark) { - if (pad) result.push(pad) - result.push(row) - result.push(EOL) - } - return result.join("").trimEnd() + return wordmark.map((row) => (pad ?? "") + row).join(EOL) } - - const result: string[] = [] - const reset = "\x1b[0m" - const left = { - fg: "\x1b[90m", - shadow: "\x1b[38;5;235m", - bg: "\x1b[48;5;235m", - } - const right = { - fg: reset, - shadow: "\x1b[38;5;238m", - bg: "\x1b[48;5;238m", - } - const gap = " " - const draw = (line: string, fg: string, shadow: string, bg: string) => { - const parts: string[] = [] - for (const char of line) { - if (char === "_") { - parts.push(bg, " ", reset) - continue - } - if (char === "^") { - parts.push(fg, bg, "▀", reset) - continue - } - if (char === "~") { - parts.push(shadow, "▀", reset) - continue - } - if (char === " ") { - parts.push(" ") - continue - } - parts.push(fg, char, reset) - } - return parts.join("") - } - glyphs.left.forEach((row, index) => { - if (pad) result.push(pad) - result.push(draw(row, left.fg, left.shadow, left.bg)) - result.push(gap) - const other = glyphs.right[index] ?? "" - result.push(draw(other, right.fg, right.shadow, right.bg)) - result.push(EOL) - }) - return result.join("").trimEnd() + // Bold bright cyan, matching the codev hub CLI banner. + return wordmark.map((row) => (pad ?? "") + "\x1b[1m\x1b[96m" + row + "\x1b[0m").join(EOL) } export async function input(prompt: string): Promise<string> { diff --git a/packages/tui/src/component/logo.tsx b/packages/tui/src/component/logo.tsx index cdcec3093b..13cbe3b8c6 100644 --- a/packages/tui/src/component/logo.tsx +++ b/packages/tui/src/component/logo.tsx @@ -1,63 +1,19 @@ import { RGBA, TextAttributes } from "@opentui/core" -import { For, type JSX } from "solid-js" -import { tint, useTheme } from "../context/theme" -import { logo } from "../logo" +import { For } from "solid-js" +import { banner } from "../logo" -export function Logo() { - const { theme } = useTheme() - - const renderLine = (line: string, fg: RGBA, bold: boolean): JSX.Element[] => { - const shadow = tint(theme.background, fg, 0.25) - const attrs = bold ? TextAttributes.BOLD : undefined - return Array.from(line).map((char) => { - if (char === "_") { - return ( - <text fg={fg} bg={shadow} attributes={attrs} selectable={false}> - {" "} - </text> - ) - } - if (char === "^") { - return ( - <text fg={fg} bg={shadow} attributes={attrs} selectable={false}> - ▀ - </text> - ) - } - if (char === "~") { - return ( - <text fg={shadow} attributes={attrs} selectable={false}> - ▀ - </text> - ) - } - if (char === ",") { - return ( - <text fg={shadow} attributes={attrs} selectable={false}> - ▄ - </text> - ) - } - return ( - <text fg={fg} attributes={attrs} selectable={false}> - {char} - </text> - ) - }) - } - - // Fork: uniform bold cyan, matching the codev hub's CLI banner - // (codev repo, src/components/Banner.tsx renders it in ink's "cyan"). - const brand = RGBA.fromHex("#00cdcd") +// Fork: hub-style CODEV banner in uniform bold cyan, matching the codev +// hub's CLI banner (codev repo, src/components/Banner.tsx, ink "cyan"). +const BRAND = RGBA.fromHex("#00cdcd") +export function Logo() { return ( <box> - <For each={logo.left}> - {(line, index) => ( - <box flexDirection="row" gap={1}> - <box flexDirection="row">{renderLine(line, brand, true)}</box> - <box flexDirection="row">{renderLine(logo.right[index()], brand, true)}</box> - </box> + <For each={banner}> + {(line) => ( + <text fg={BRAND} attributes={TextAttributes.BOLD} selectable={false}> + {line} + </text> )} </For> </box> diff --git a/packages/tui/src/logo.ts b/packages/tui/src/logo.ts index d898ab051e..6b76e302c8 100644 --- a/packages/tui/src/logo.ts +++ b/packages/tui/src/logo.ts @@ -5,6 +5,17 @@ export const logo = { right: [" ▄ ", "█▀▀█ █▀▀█ █__█", "█__█ █^^^ █__█", "▀▀▀▀ ▀▀▀▀ ▀▀ "], } +// Fork: hub-style CODEV banner (same ANSI-Shadow art as the codev hub's +// src/components/Banner.tsx). Used by the TUI home banner and CLI help. +export const banner = [ + " ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗", + "██╔════╝██╔═══██╗██╔══██╗██╔════╝██║ ██║", + "██║ ██║ ██║██║ ██║█████╗ ██║ ██║", + "██║ ██║ ██║██║ ██║██╔══╝ ╚██╗ ██╔╝", + "╚██████╗╚██████╔╝██████╔╝███████╗ ╚████╔╝ ", + " ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═══╝ ", +] + export const go = { left: [" ", "█▀▀▀", "█_^█", "▀▀▀▀"], right: [" ", "█▀▀█", "█__█", "▀▀▀▀"], diff --git a/packages/tui/src/theme/assets/opencode.json b/packages/tui/src/theme/assets/opencode.json index 850539813f..caee450b8d 100644 --- a/packages/tui/src/theme/assets/opencode.json +++ b/packages/tui/src/theme/assets/opencode.json @@ -13,7 +13,7 @@ "darkStep10": "#ffc09f", "darkStep11": "#808080", "darkStep12": "#eeeeee", - "darkSecondary": "#EE0033", + "darkSecondary": "#00cdcd", "darkAccent": "#9d7cd8", "darkRed": "#e06c75", "darkOrange": "#f5a742", @@ -32,7 +32,7 @@ "lightStep10": "#2968c3", "lightStep11": "#8a8a8a", "lightStep12": "#1a1a1a", - "lightSecondary": "#EE0033", + "lightSecondary": "#00cdcd", "lightAccent": "#d68c27", "lightRed": "#d1383d", "lightOrange": "#d68c27", diff --git a/packages/tui/src/util/presentation.ts b/packages/tui/src/util/presentation.ts index cf432bf967..de885eac40 100644 --- a/packages/tui/src/util/presentation.ts +++ b/packages/tui/src/util/presentation.ts @@ -1,29 +1,12 @@ -const logo = { - left: [" ", "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", "█__█ █__█ █^^^ █__█", "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀"], - right: [" ▄ ", "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", "█___ █__█ █__█ █^^^", "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"], -} +import { banner } from "../logo" const reset = "\x1b[0m" const bold = "\x1b[1m" const dim = "\x1b[90m" function wordmark(pad = "") { - const draw = (line: string, fg: string, shadow: string, bg: string) => - [...line] - .map((char) => { - if (char === "_") return `${bg} ${reset}` - if (char === "^") return `${fg}${bg}▀${reset}` - if (char === "~") return `${shadow}▀${reset}` - if (char === " ") return " " - return `${fg}${char}${reset}` - }) - .join("") - - return logo.left.map((line, index) => { - const left = draw(line, dim, "\x1b[38;5;235m", "\x1b[48;5;235m") - const right = draw(logo.right[index] ?? "", reset, "\x1b[38;5;238m", "\x1b[48;5;238m") - return `${pad}${left} ${right}` - }) + // Fork: hub-style CODEV banner in bold bright cyan. + return banner.map((line) => `${pad}${bold}\x1b[96m${line}${reset}`) } export function sessionEpilogue(input: { title: string; sessionID?: string }) { diff --git a/packages/ui/src/assets/favicon/apple-touch-icon-v3.png b/packages/ui/src/assets/favicon/apple-touch-icon-v3.png index 97eaf7247d827dd91f5fb9cd26ce980cc10a7ae8..0d398245ac43931b913da0a0857c1986b306e934 100644 GIT binary patch literal 2149 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDB+SC;hE;^%b*2hb1*Qr zXELw=S&Tp|1;h*t%nKM9n1M7SNNfQUTz1O>W&|6gFzo8IN}#g2nIRD+5xzcF$@#f@ zi7EL>sd^Q;1t0|sHWgMtW^QUpqC!P(PF}H9g{=};g%ywu64qBz04piUwpEJo4N!2- zFG^J~(=*UBP_pAvP*AWbN=dT{a&d!d2l8x{GD=Dctn~HE%ggo3jrH=2()A53EiLs8 zjP#9+bb%^#i!1X=5-W7`ij^UTz|3(;Elw`VEGWs$&r<-Io0ybeT4JlD1hNPYAnr`9 z$VAwbR}A$Q(1ZFQ8GS=N1AVyJK&>_)QLBK=iqxD4m(1MMykejocBY0#HemG_G6)-y zbVlOTi6jHnX`>JF0Fs9wp#>HN2A3U|jXpf+?YMU6dxSGEuzvS+aSW+oe0%3&mWa1V z>%&={;Z26GoL}|6UwnQ=f{W+6Idk59WZ_!K?bPP8*7p8^30<yL-+o>9Uw+p0t=*kF zHYWNkT>>}6Pb#u8xiht>IcYMr=!GsfXnE!^Xjto)ITl!K`SxJNtIS^&rxbR_X8*Q) z*IUf7_khKo`un%Ij%oKFC{n(4|K7H3_okftW3~T6{Xd!1e?PxwS6BSK75nRqlg-b^ z(`R3J_io+Zzdts<-Cvvi_SLJC(=DFz&xwCwdX_15>dXtv*L-VT_w`5g*N?BcYu{Wu zen#<&)!koz{`|N%>)QVFo(YTo|333k#XjA48JCK~ivyQ>_V_kjxSjKcMM$9}A=B-i zn!}4+voa=50jmur%K5?yU(BSf8(BDHBW6w9&M8neyLYYwQwyKY*%P-}IQE`B=BL2u z#6B(UNiI{%y|iTY2@DIFy^TMaF*@aM-YD$RaG`OjWaVszh1+l5;3UDiXO`0+FMa4+ zBzD{TxZTg^YuV5E9QkC_8h1YF_s7TYBXcIt`B7YSG44at?%%&P&uxuXj-Pko^xc%H zKi@9*&;9;;JF}9%%D<|8cXyuOy4z>r^(&`ktG>U!{?YdG`qRQYOXr>T`E;YOvi!yI zUDui9?)U$HmTkjW|FmO$K*KzSh1F8mJ_7w4zmUO}(doO%n#aJP*yqGp#nkdHGvc_g zLP<?4(-#(wyO%fgsXM&*!NvN5Q()KfL|Ola3m-+fE&vtyAGQLT^H^JC0Z_rbwo)5L zr{m!o4nPIAyss;mTKYzSMUCNq&BeFc$wWopk6W&|VgBQL6*HaQm%V*>cJ{St>yLlW z)Y|)E^_zF^qN*z_teZ~@SMAi6U$_4DdHwi*_ZEh)+&j-Tp}hY7I{W&(-|z27@7`5) zZR@<>ho`H5@yeO_<HNhV#W#Qc{2wXz{+yiUxi`(vpI;W)@ULxl$5R>qPs<%&YjK!3 zO<o|v=rny*u!K`F%~>-l`DPXBgfHuz{MD@e!s(eA$1j&(^HR5v*S);P*mp07?dhFm z+KqSHXV3mTf5Ube<<cEH3kx32oKy4dxSsjKzi;1)sB4@pY>(@kWF`0I`MW<k+s_p> ze%*NZX4(G*^I1;V2mdtdY1m)XBARx`kkP6C=M7$EhZh?T^;iRQtD*evL|}Rin^Ab2 zg~Rq)vUv}~!oys~?`AM8JYMsrO;DjEBJr3kFeA_CziR-@y4q)UBr~<hecmYT)^H)Q zRkGZt;X<-q*<lU=t2G9X`+#};%<()4MyGaqSoVj#N2gFhbhd9Os7Cg5^>bP0l+XkK DJ&tZN literal 2181 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDB+SC;hE;^%b*2hb1*Qr zXELw=S&Tp|1;h*t%nKM9n1M7SNNfQUTz1O>W&|6gFzo8IN}#g2nIRD+5xzcF$@#f@ zi7EL>sd^Q;1t0|sHWgMtW^QUpqC!P(PF}H9g{=};g%ywu64qBz04piUwpEJo4N!2- zFG^J~(=*UBP_pAvP*AWbN=dT{a&d!d2l8x{GD=Dctn~HE%ggo3jrH=2()A53EiLs8 zjP#9+bb%^#i!1X=5-W7`ij^UTz|3(;Elw`VEGWs$&r<-Io0ybeT4JlD1hNPYAnr`9 z$VAwbR}A$Q(1ZFQ8GS=N1AVyJK&>_)QLBK=iqxD4m(1MMykejocBY0#HemG_G6)-y zbVlOTi6jHnX`>JF0Fs9wp#>HN2A3U|jXpf+?YMU6dxSGEu!(!RIEGX(zP+=tFUD1% z_2KT_d>lDjCKa;0Pf?mDe2;SiXAg_TmvaWWSHe_%AH-Fz%G%dG?e?yq>eqjs&$lkS zRK8wb{(L)kqZ-S**-r$R8~s^0d|Sd;IPR|UOXN7)IA~aLDUKheqzV+*2sXCs-}?Gz zb`Xc{KDB#u<ob4>u3uNha_;!giu(U0bA)>8N*5lV{qyY0qaRPVzwe*^{I^Je(3haJ zmXAii3d*hS?fdh#qWu5I9p7gEdgavr>{xZ>i9cNznB7-q|5MgEU7pRg(7pNb>#ToM zvaW1cxi9oNyN@o%76peFVy0Y%oB~yo3i2HrF6d^7Bnc^eQF(Z;iD6;%6^$b*4lg_p z?PX<j+P)&N!?WSS<d$k~rk1?G#R8KV7OHc87XyaqA~!`fMkjxvce)$`yIgyne3)A1 zsoaScP$=n^YMsHtVe7eLJFylunmjM6$({9h@|>pyQ`XP@YgvE)!Hkz{D<(VjGw1%> zQ@v}>iD$P|4N~OX8&fT==cVklTzLFuw(~Rj_`g+uYBiNE-%b??`YII^|2t;)!FSJE z<bYuY3<&Xs?0xAwH|>$g3wm+!fkwhV8}G&cCWx?Xs@V{9z`&)Jsb$^$g)EH>3z>ON z|6<{Y-S5oF#OTB>G3_g-z^=M>Ar__<J_DWC!U`pS`BXVrIAjwduBkh`_$BKlz#(9D zV8a^!h6`V<rzimZ+>jVKpJCzaat%kIpBWBsvSW0*{yw0|q2U5!Tk5d4DDF!Chg43# z>A8=Of3;!Rv_~>O=*4dD_WSexuU7CDJiqwr*MC#^%a=c{*&F}=r}_Ok7yPHc=zre+ z_<4PuN8o|yYF&EAxD!wOxqSM5zx_LVIsWi-g~d+%_ZGLj*9+=5-<sWjAmQiP)|6@a zyJm}2g}iuwzFO)0-N)-CXGWy`Oz^dP$B`qb@I}mS_GUqal5K8hHoG=li2jjt&aL6X zO)10kVvJ7t4>wy%GdiVbAF+vM;n>@H{#gzS$K17opXsCV(wx(Vc9C|m(Xnx<#oO)y zGdrKQ<Z;hl?aK>Q=d*p<|6kRh<y_IayAogCeSQ4+>iHYe0dez>U5w#-F10jd_qpl8 zO!x2GFRhSVTH)Nk{nKu4f$&(S>vl^DCwVJ=kx=8Fz<F%18smSy)i-Ca6bE{b;c=la eFl`ST-apnSOu;u_m1}$h)!3e{elF{r5}E+Y=39jT diff --git a/packages/ui/src/assets/favicon/favicon-96x96-v3.png b/packages/ui/src/assets/favicon/favicon-96x96-v3.png index 7e7181af08329f6283c298d5cb5a026eb4727dfa..2af0e7f87f8ff6e8aa5c8eaf213070cbcf317a86 100644 GIT binary patch delta 809 zcmeC+{=&5(lBu4})5S5Qg7NKKM?Yml0oS`PdAcV`D4w0gT)>)lWEQi6-@%y{jM`=! zl5B&-e3S}Qg*#n6rv*J-W%jws&?9X7{=aeJE`3jD*2Txvh^#YVTD>Ku={t+Sgg;6O z42&mPCOuxsz@j4T(YKsQV1kc=<vcD22cyO(6<RRKdSuzUx6}6Dp8DzI{F?2?zDv(+ z=C+b&6#e(?*|MDV>%4B}#j<U?;dkxzrn)LEdwIDSl^+}{^7kG1UtJq}>i6%Yn>%^l zym@n>H+buBjtPn<XX}61zq{da48PQw|DQBZ^jx^c$dvQvjKA^$6lOhkVW{YDUDt>< zrPbYwV~oO%f7Ek6;Gw-@^)GMdY4_%?i(&kv7W(6Pd3kDGrRGw-uX_JhCC@XHp1w3= z=4+)ioBjKy{rp+U!|3E2H^;SBQMq|jjFDvJZ}$}pr){RD{}fr`(3#`ppi-Z!%FW0% z<%AlG%cZbQ0t+Cb^bw3Ya_va{-?Zx!&0f@PU)#C+^y$Nn^2#~Bf3{nefBp7sldtV| zrYCz^cj<pQ|F<^f>g`RhA_eW`<WH}^9X);Tnw?C28g3Pz_xD}ROy5$nlZVkyy<bMM z^si=esf_;ord_wP%KIA37OyK;SfG8c>^Vn<@vAC!rd^M6QH1L;#DD0zo~SzaG2rq# zXTNtb&tB{(d#b!Z@8YS#eZRApl>QBl3H$MT=c#fgzUxoE?O$0`@!iv^M$2K5?DP!( wStl3pe{{Eql);hMkkcA8B`U&`VnYh!eAa}(M%}vo<qSaJ>FVdQ&MBb@06m0f;Q#;t delta 829 zcmeyu)xo_XlBr(G)5S5Qg7NKK+q~Nj0&deM$vj_gFoEG^Ez^C)=O-A8T4fZ%Pm~t1 zOkX+aRBPjww&dtZhbJyblajWc{L|y<#tj=A%F=(_<MY)C|MKD8n>QN^PjKj@Oyu07 z+`#bB#esq82+NU&D;ZciI6DppGja$B3$!n15>QZ6;PYoyaPV=cmzl@q&@iLH!bY@# z!H}`=M`+j|-|C#(YYwW}^~IV^%k?;E<a(g0<^R)fwYzW3+15T~%QEW|CuiJx`e|Kl z?bqFFg;bVsY)GFaK70Dx$G=K<OQ*_wF5J~@w`6W=7X$M@gJmfn`eP3~jM=OvS?(CA zVtw4vL4C)XJdP7eH!b;?tPa+vmO49#ojg}4aDh{AwKUTvkFvhz2ET&Hy8;tjHx<jU zlr)`wHEo-Spr=N9tl^}CpMOWKoB7kvsbTH1bE%x?^(0?E|6TQIauB20WS)P|&9A?` z{>U!3_wUKgd^HDH?(p26vNXfnS?hq%hME71TmC1<B-?xH=1JTB-%#UwXo=hjmwNxp zayb%zde~(y#;p2XEFR)}=csc7bI@HE2h&1venvizQenocM`CSQEEKN#vV;hie-wDo z5MnMEKplnkXhu%X_uW#HQ@^72Vm06Ki@CmAcy~R&ExtQ;VdQV!|4Th~r`&jUXZ2C5 zRQ1(cm~zY{zvP?Cry2c^-dyfl6MuJ`fByO)GhuI5nY34P%$~k87nC>Z|39y#p)%(0 z_YJz&&(!SX?(%<hfrEqNVRyNk!<@v7dKQ+J4@a$)70wx$Fflp(cr;f~AYDR=kx{Yc z<2jBFW1ilI27!GQ&$le)h*rM2|BA`HD^uJz6rcIyR^P=C9kegzpJe^5UH=N@+r!1v z_Zp_2_?5qE&z{}+kCuisv~DZ?n;Osezf}JpNB37{2F4_&M;}5^lcXt@G>J%(3Su9` X_w{(of3Rm-%>V?Ru6{1-oD!M<$T(@A diff --git a/packages/ui/src/assets/favicon/favicon-v3.svg b/packages/ui/src/assets/favicon/favicon-v3.svg index 80fb672c98..aba6d7787e 100644 --- a/packages/ui/src/assets/favicon/favicon-v3.svg +++ b/packages/ui/src/assets/favicon/favicon-v3.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512"> <rect width="512" height="512" fill="#131010"/> - <rect x="96" y="96" width="320" height="80" fill="#EE0033"/> - <rect x="96" y="96" width="80" height="320" fill="#EE0033"/> - <rect x="96" y="336" width="320" height="80" fill="#EE0033"/> + <rect x="96" y="96" width="320" height="80" fill="#00cdcd"/> + <rect x="96" y="96" width="80" height="320" fill="#00cdcd"/> + <rect x="96" y="336" width="320" height="80" fill="#00cdcd"/> </svg> diff --git a/packages/ui/src/assets/favicon/web-app-manifest-192x192.png b/packages/ui/src/assets/favicon/web-app-manifest-192x192.png index dd7c3f97edf83ef4fa6737bc42322c344ffbfcb3..d88c83f86f74f44285e67792799a3379981548d9 100644 GIT binary patch literal 2245 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zcalEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDB+SC;hE;^%b*2hb1*Qr zXELw=S&Tp|1;h*t%nKM9n1M7SNNfQUT=u{MW&|6g(AV1X6j0gR%#etZ2wxwo<osN{ z#FYG`RK1Ga0+0d*n+hu+GdHy)QK2F?C$HG5!d3~a!V1U+3F|8<fR&VF+bTu)1}He^ z7o{qg=^5x5DA{o-C@9zzrKDK}xwt{K19`Se86_nJR{Hwo<>h+i#(Mch>H3D2mX`Vk zM*2oZx<D1W#g%y_i50qe#mW#vVCJ}_7AF^F7L;V>=P7{9O-#x!EwNQn0$BtH5O=0l zWFl<JD~5Ut=s|sujJ~0sfj-=9pjI1@s8v8_MQTojOJ;6rUNO)PJ5xg=8?br|8H9~U zIwNuFM3RB(w9yB70Lep;&;pABgUgP~MjsyZc3eC3J;E6n*up(s978G?-`?4uH^ow< zt?>N(lGS%TLato7BWWrW-f-k^;4<e$3!`#H)n?A+H;Il+Z<WygX1Rajq6U78y7|}7 zs|3{S4*&lB`LkAsK&Ib|b{=(mz|P3DgJUVDz=D#$hlCHvYWOxVEPX9LkKvs|CKHQB z?EVid1?*nJ3Jx!SwW>E*2h3t%^t!HZ!+59h5(`JbuDXYu5BR32IW%1Q%I(ikzQBZ$ zY0A3z3Z@;*G%-?Ux%dA+Hg_k=yl7+jR=oH5In@JCKmGsw(7C$m^Rlg%U$$Mz{rZTd z?|4~7MMizipBuMagwCiQSi1D>r}_8x<-Yy>UHttS#ypP)@7}e|zMHrDCCiVG=k~|e zG2L1BG_q{ghuyzo>?fQJno>MP(V@X8l>3&lLxY@Xb}EO!0-vi*-++|+(I`n^umo>i zV9UhvB5-3^8w2C15Z#P^2F9w8HB;%V&EWpzhjCng^S%eg?>u(>?hn5cGZ?PF-fr9V zv1Z@DbI+rNZ`|<vvBR4w=e^hTq<=O4_r2X;m;1J0N9osZw>e@g-pk1^uQK{lro)sY zqW9kK_EY<spH2<E$4^{O$v0rxF>SAC@!uWme$JWK@SoKyeq)0mBa=(XnM=UL@T-fp zheJSNQS!8T42+k;brM_}7zAZEe_`R6urG;GnTe(2#f+uu4h>&Kxg`V@99)j;*fKIL zSs!trgMm@WD(xkwfI{t2CN~xifs2OT{tXN-wZ#mS92z?MBCD8KJVvczI-U`c_3g`* zTi+g<PCM|>pzMGAow*Fs8}6>N-Cy@t_-+d8-=z7U|9#|seD`tk?fTzlS0y<M?6#NL zY};>No0a=}>vajH^76Moeir|JeRub@Z=e4>@omVyJH2TSo6rqNGC8;Rcf4oM&pjXK zPWWhZzx!Cic5Nm_My8eup3T4r{?_)C8yHDPl4s0iVBBP`6YtT$peT3v4KRZDCjN9{ zV&V8Gkp_(5H@v6Cg%lh*jvH7rGNt54?3=*A=w#D&6R5ZP@TXQ_1V1u7<JZ7&Q+k@d zibI1ye_|OE%ZYm%YRI%|#`}{6)1Q}|`@yky!lH-&g>T4p?<lptnY~L`R!*)?$!e~e z^HYoct`CZS{(t>#yV<U{@%Q%b+CTsG#1rSwZ}-jEzLUe}OUeu0GbQ&K)2d3o#h4$@ xbQAc{|3EP0?M@y>CY|7^&3y_E4I_*DL4Vf20G|iS^S6R(d{0+Dmvv4FO#q#vON;;j literal 2303 zcmeHJX;2eq82)xyFhEfXv{AHm4G7v|mP1fNz@Q*!03BMQ#c+!OasaUja=2ovqEfUv zjFlreqvBCH>H&jDq6iF9w8~J5ToI6nHgYJ+O~0U3r=9+CI{nj~`SyGFJ@Y>EJTu7% z@bfUxGt~nC7<hTQZG^W%b0|9Sy|F!R4!p2vSGFqvrCIuuVcPH;kMP{c24IH;0OU6S zj6)as2!QR@06Y!_fN=}}swlT&0}}?^qBve#*=+C`v?&1D%L5p+5O_@C0YIw&0b1}z zG`<4#O;k~!_14xTvYi}n!L&SHAV<t$`!XVge0o@<Fg%Jb<%={4fGK4_lOH7x!=?N< zK_WxyOq<PMKwIM`X!vZ3IM$iQVF%#rgb7i&1KpZ#O>@!1ah#bDxs|ceZT;(V_~lI7 zCKihr1R;?~=n^}+Fd>?-addPftZfNf+Z8ZlMPiab941{MNHlxZ<j+2CQHc==Jdv0u z6yTb^Vd28<VrLpnGw99p>UTy-d2c5P5?`+c7bG+h!iH{5yy*=~nHn!6fG3TL<GAto zQG!G`!^PglmN}dMx5(Rx?^JI3$I5piuPd2^W`TDWdWF`k7sBPD$0XiB@1j>ucm@HW zbJ)wxHBgGEJ2u2bx|`Gvwe_3tUxw*m*A0F~+cWe<#zi;S<x6C$MoahSn{JvPSul{< z6MOfhU#2Q>%GB1ny~r+PN<J=G`)Q0{@zbZBLN3M1TN!gVwao#&gHe>Y6`KS;Ey8D* zNGIEZMV@+6mV~a>@-fC0_eR>7Nbasvx`v_s<NSPZTX7Ggl!&Js{6Tam55+hYX*rgp zUCBxWwb~+YG*&F&90y2tQCFX?@`Hb^t&-99v`f8fQpRrGoKc^6zb<m(CVQzOest&P zlLqxjllsN{>h`1NnBc`C;q7^CFJ)7Qz0(8HMY73anM-R`(zrNzFcq)Ao0$=R^%L1l zq4>gSBPDC9+>9}I4H7<=dwRJ?Su3|S&Ag%3BflQ*KAg@kh8Xc(^8NfsaD*C{%tx_p z&xXVaD0Zwev@O;cXXRuS9)XDUYPWH70CGQtnU@O?3*xsI_c6*ZeLelX7{xm2`jr+4 zu)|`1OG_46uYcv51A<-}lQJ9;)R$YLzN~9l&{)^>9wS*5IS;0Z&bpdZZVzQL*`~XE zjL7pP=k*5HjNUU7k5wEDGNTiUp?a~&vksM<FAsJWs8l||1kvn7n2AJHU5+v$dBP*P zWf)y_GVAlNvZ`mEHCKPlCd2j)T)MbaVO^QJJIjB%XVADHE8=o<nttE~o1}HRhPX*# zSTn`2U~|Oq9wVH!%&+>~hdAqUZLh&n78#Jc=L<6y8IxJR(3=D&RvVmOPl9ICBdd-A zWNp0Zmze-LXKx`~hM?bcul&&zK?7rbI|ERRQp4lequ7~Wk5!()D2Dr+N@6fd!2bjP z0;!TA-uxiUzimRTo_=Wmor34YSH<^)to#8uU1^#g8M&GhO{!G#Yx_>Q8=!M~CZ@Fd zUY;+@l%!62H0X;``a%ZwPS>rGkB>g5j#Gt_+BJDIomEraErDIy*;J+6PHNH%yIy~3 zu_OXbdDQMd(=&I*W=xrLxU>t+RChdw)IL;+57ips3QpB&4Yhl<Ggf5-q;}Ze8B*Jv z@T@F_^v^Etht$TCT)Q*j2Bj%%f2gK<eIub2f*yPry927plY2-S0TpKz(gfAS8cx5t z(1!#OW5@HMn!cx+cXCi{enZRqjKn({MRg-dMazBDVz`EPn)gvzP6Aa*VpZ2nirkqy zm?k{CPFbEj(KxoGLtRi9B$1pgic2Zm?fuc2+Y5YT&qv9I7j}}0#k+n&ymy|%ey1rb zw?DX8&VZ~H229gY?9q+r`0bFjoduIyp!UDL)BPB-_L}S1Rj3brSxqxk`HtPg5~vTV z%YpN7%@Li412h&%Px&|qg7?_qR+l>owv1X8L42AQ9+e*eNX6i$;5;akRm*l#5mfx2 b4x9nZi|&2l*?xhV{|a92er`o;L(~5N)ESIk diff --git a/packages/ui/src/assets/favicon/web-app-manifest-512x512.png b/packages/ui/src/assets/favicon/web-app-manifest-512x512.png index b1adae26b0ded54b8f20cbad709108752bf5d038..20559c86049c7f2adc87cee0d6e794e095691202 100644 GIT binary patch literal 6244 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn2Dage(c!@6@aFM%A3)CkWs zUtb0-Ae)1Mu|1Q41*8OsrGOZybpaDhgo$ARGlC70)G(O7pMgRAmZytjNCo5D8wY)3 z0tH+GlLZ+rwU`tN3mGQdRIIod{7CNGi~UwtyD#mrwX@q-|5Mqafq{{UC5UN%aAvD2 zg!7M6f`P9QB+S9W%F~eWQb||=B*T1wR{+FlT+qNMpc9({lowD)VAugtD4-x9V!+U} zwA%-49uI>##H=PJHir!*6FET|8yFw30TntlI0PJE;FzXo1lDN4a0hIa00)-@!@*0g zYG93Q4bmX17?~UynH3^-odDV3aDbtJ8O%`7NMK;`7M}^$D8Y~iwsX|6qaiz*W+}>G z4`dH!v+lFAkN?dOukO%rpqoYR{PXU8Z#LJn{$YB+N0Hg1nU{%Wv{)Q1!+}K<QZjgd z@Ql)bg~sEbe>Pw0a01q?){OfZ?nM3;0@sZ*1PvI{R(%ivSFi=@38ONjVW2RY4g^NS z09X}|ri0Ni0QH7O)4{M0gNpf;o$UfY_#4-sKmY%S{(q;215F1W|BR_{`^H<xcp^;S z0@PfX0_?08{oVxXtUH7qU>Fr14U^FXLEqePPflL`ek#LF@OYO)-~oMxqt{YFBU+7n z8W<<oGcte*>;T|MS=ZXr;E}RQ;P6&Ga7++5y0ri}s3j6T9XzP@iHXhO9}5F`uq^NZ zgT^*JV^9u%0?grmI2k}AV~vX%7z1)*(?DH=6WkIEKZO~9qKr(gjLZve>^cLoXM(r^ z!zXnH@ZeY%(7=tQGePcB&`)4^;?DpcI}-sKnDp8R97u7%B4a*qlo6;^12_~n>hRGJ gA5AKQCUZXEw~FRvlCnB04;t<FboFyt=akR{0DR5+TL1t6 literal 6247 zcmeI0-%Aux6vxk<8JE%A7=M7GB2z@WMYzlMP?Y2-yXaEduJvF)w4qudh!8ATQE+w( z{Q00SnGfX>6ci~%5hB%&MYLe_AQeWIOBf^?ZBkOYXy;yu{s18&?!z!=?wxbb<#4|D z$EU+rRc=koO9KF_x58ZwAfPFLY{A#J;LAmPk;dxsG8lSMFoPdE12x|I%1YRZwhW~0 z6iD<JeDd%?*NE`DMSzI-$EKZjXI~T`=bhJGdN4>nPmER`^($`wi43#ig5KMzwHL%- zY<<Xc;6vfUr|7O%UE{?Miwg&$$qZF9fCyVcQ#bBC&RqRiNlAw`)+~hui+1~LZ>oYl z28ml_YG^(a<cmcvB1p30gh}*ALr%+u(Q(ga=4dhUSH~(PqFOT&!+upWp+RJZYS%&9 zo72x6bKwk~fh0>Q>4rYDF^f5hrj>?*P{bh0w%U_4f~vzX3#BUAP6%J?+Q%HzVF#Zq z&nz#4wF@lK9dAx~zh}ASi`a4*MLD%8u^3#r?pT^DAyF6>nF_i1h`^UMz6PT{)?Nl? zqw{X8q$2+P>+<>W_A=b?cB9fJ4=rV~o$gYG6Y6g!6ehd|o6dW94pd$T3eN!^hj|_F z9MEeKuY><S2f-^%9c{{wu=)1cfFs%0x<S)R@yzfj(LI-+6nX~h8t4hZzAhI&E(C1! z-h9g-yqV{O7sTIH1H)<oc*BU9<~JSi^mTwTvCsn)WC;PfVEYhXbq<a(eAR@2tQD~! z(yj<%vFsy#42#VR7HwGqhTHrm*zXr@rx${0WMs)yU}Ws7L42oc>#6W#DEyyUfMJN> zA!1}=<T;JgljDSW8!$@Ni38p_*H7oAI&_%c4-C3x<ABF!T@<=$btc3H5HwQNAk5<v f=Nadv^3RAf?r<HmHqRcmJ)ywg>#1@NmFeMMHo*zb From 05cd232cc585e45d0568e4e686831115e990c127 Mon Sep 17 00:00:00 2001 From: minhn4 <nguyenm.cuny@gmail.com> Date: Tue, 7 Jul 2026 14:31:48 +0700 Subject: [PATCH 4/4] fix: darker cyan for light-mode secondary #00cdcd on white is low-contrast; light variant uses #009999. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --- DIVERGENCES.md | 2 +- packages/tui/src/theme/assets/opencode.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 0d54018c63..53ebda0cc6 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -22,7 +22,7 @@ future `packages/codev-*`) never conflict and are not tracked here. | `packages/opencode/script/postinstall.mjs` | `base` prefix `opencode-` → `codev-code-` | Install-time platform-binary fetch must match the published names. | Keep our prefix. | | `packages/tui/src/logo.ts` | Pixel glyphs "open"+"code" → "co"+"dev"; added hub-style `banner` (ANSI-Shadow CODEV) | Branded wordmark art; `banner` feeds the TUI home banner, CLI help, and presentation mode. | Keep our glyphs and banner. | | `packages/tui/src/component/logo.tsx` | Renders the hub-style CODEV `banner` in uniform bold cyan (#00cdcd) | Matches the codev hub CLI banner art and color. | Keep our version wholesale. | -| `packages/tui/src/theme/assets/opencode.json` | `darkSecondary`/`lightSecondary` → `#00cdcd` (banner cyan) | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. | +| `packages/tui/src/theme/assets/opencode.json` | `darkSecondary` → `#00cdcd` (banner cyan); `lightSecondary` → `#009999` (darker for light-bg contrast) | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. | | `packages/opencode/src/cli/ui.ts` | `wordmark`/`logo()` render the hub-style CODEV banner (bold bright cyan on TTY) | Help banner matches the hub CLI banner. | Keep our wordmark + logo(); take upstream's surrounding changes. | | `packages/tui/src/util/presentation.ts` | Local logo copy replaced by the shared CODEV `banner` (cyan) | Presentation-mode wordmark was still upstream-branded. | Keep our wordmark(); take upstream's surrounding changes. | | `packages/app/index.html` | `<title>` → "CoDev Code" | Web UI tab title. | Keep our title. | diff --git a/packages/tui/src/theme/assets/opencode.json b/packages/tui/src/theme/assets/opencode.json index caee450b8d..979e929788 100644 --- a/packages/tui/src/theme/assets/opencode.json +++ b/packages/tui/src/theme/assets/opencode.json @@ -32,7 +32,7 @@ "lightStep10": "#2968c3", "lightStep11": "#8a8a8a", "lightStep12": "#1a1a1a", - "lightSecondary": "#00cdcd", + "lightSecondary": "#009999", "lightAccent": "#d68c27", "lightRed": "#d1383d", "lightOrange": "#d68c27",