feat(branding): 确定项目图标,并接入 Web / Electron / HarmonyOS

# 唯一源

`client/electron/src/icons/agentmail.svg` 是图标唯一源(24×24 视图框,`currentColor`
跟随文字色)。此前各端用的都是占位物:Electron 的窗口/托盘指向一个**不存在**的
`src/icons/tray-icon.png`(`nativeImage` 拿到空图,托盘不可见),
HarmonyOS 的 `startIcon/foreground/background` 是 1×1 PNG,
Web 端根本没有 favicon。

# 为什么带生成脚本

PNG/ICO 是二进制的,换一次配色要重出十几个尺寸,手工做必然出现
「Web 是旧的、Harmony 是新的」这种不一致,而且没人能复核。
`generate.py` 只认上面那一份源,所有变体都由它推导(本机无 rsvg/ImageMagick,
用 cairosvg + Pillow)。改图标只需改源文件再跑一次脚本。

# 各端产物

- **Web**:`public/assets/{agentmail.svg,favicon.ico,apple-touch-icon.png}` + `index.html` 引用。
  放 `assets/` 下而非根目录,是因为 Gateway 只把 `/assets/*` 与 `/` 交给静态处理器
  (`server/cmd/server/main.go`),放根下会 404。已实测本机与 LAN 均 200。
- **Electron**:应用图标 `icon.png`(512) / `icon.ico`(16–256) / 各尺寸 PNG /
  托盘 `tray-icon.png`(32),`package.json` 里 `win.icon` 与 `linux.icon` 指过去。
  托盘用品牌色字形而非白色 —— 浅色面板下白色会消失。
- **HarmonyOS**:`startIcon.png`(512) 用完整应用图标(启动页底色浅 `#FFF` /
  深 `#000`,白底蓝图标两套都立得住);分层图标的 `background` 是品牌色整块、
  `foreground` 是白色字形并留 12% 安全区,避免被系统圆角裁掉。
- **应用内**:新增 `BrandMarkIcon`(fill 型,与现有描边图标集不同族),
  替换登录页与初始化页品牌位的占位 `MailboxIcon`;后者已无引用,一并删除。

图标色 `#2563eb` 与门户 Dashy 主题主色一致。

# 验证

- 前端 typecheck 与 196 项测试全绿;`npm run build` 产物含三个图标文件
- Gateway 重新部署后 `/assets/{agentmail.svg,favicon.ico,apple-touch-icon.png}`
  在本机与 `192.168.2.60:8180` 都返回 200,Content-Type 正确
- 所有 PNG/ICO 用 Pillow 复核尺寸与 alpha 边界(合成失败会表现为全透明,
  已用 getbbox 排除)
This commit is contained in:
2026-09-11 15:49:41 +08:00
parent 4186ad4784
commit a404cbad54
26 changed files with 196 additions and 18 deletions

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#2563eb" transform="translate(0,0) scale(1)"><path fill="#2563eb" d="M12 1.5a1.25 1.25 0 0 1 1.25 1.25c0 .5-.29.93-.71 1.13V5h1.71A2.75 2.75 0 0 1 17 7.75V8h2.5A2.5 2.5 0 0 1 22 10.5v9a2.5 2.5 0 0 1-2.5 2.5h-15A2.5 2.5 0 0 1 2 19.5v-9A2.5 2.5 0 0 1 4.5 8H7v-.25A2.75 2.75 0 0 1 9.75 5h1.71V3.88c-.42-.2-.71-.63-.71-1.13A1.25 1.25 0 0 1 12 1.5m-2.25 5A1.25 1.25 0 0 0 8.5 7.75V8h7v-.25a1.25 1.25 0 0 0-1.25-1.25zM4.5 9.5a1 1 0 0 0-1 1v.34l8.5 4.72l8.5-4.72V10.5a1 1 0 0 0-1-1zm-1 3.05v6.95a1 1 0 0 0 1 1h15a1 1 0 0 0 1-1v-6.95l-8.5 4.72z"/><circle cx="9" cy="11.6" r=".9" fill="#2563eb"/><circle cx="15" cy="11.6" r=".9" fill="#2563eb"/></g></svg>

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB