v0.19.0: 全新品牌视觉设计 - 现代化 3D logo 更新

🎨 新 logo 设计特点
- 现代 3D 风格的字母 "P"
- 蓝紫渐变配色(#4fc3f7 → #1a237e,#7c4dff → #e91e63)
- 纯黑背景,解决白边问题

✨ 更新内容
- 🖼️ 应用图标:所有平台(Windows/macOS/iOS/Android/Web)
- 🔲 托盘图标:所有状态(运行/停止/警告/错误)
- 🎯 SVG 图标:主图标 + 紧凑版,支持任意尺寸缩放
- 🏠 界面 logo:配置管理页面 + About 页面

🛠️ 技术实现
- 使用 Tauri CLI 自动生成所有平台图标
- SVG 矢量设计确保清晰度
- 统一的视觉设计语言

🎉 全平台品牌标识统一升级完成!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
This commit is contained in:
coso
2025-12-25 23:17:43 +08:00
co-authored by Claude Sonnet 4
parent 404287c58d
commit f02e119957
62 changed files with 120 additions and 52 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 774 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 530 B

After

Width:  |  Height:  |  Size: 898 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1012 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1012 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 765 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1012 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

+3 -2
View File
@@ -6,6 +6,7 @@ import {
AlertCircle,
} from "lucide-react";
import { invoke } from "@tauri-apps/api/core";
import { ProviderIcon } from "@/icons/providers";
interface VersionInfo {
current: string;
@@ -127,8 +128,8 @@ export function AboutSection() {
<div className="space-y-6 max-w-2xl">
{/* 应用信息 */}
<div className="p-6 rounded-lg border text-center space-y-4">
<div className="w-16 h-16 mx-auto rounded-2xl bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center">
<span className="text-2xl font-bold text-white">PC</span>
<div className="w-16 h-16 mx-auto rounded-2xl bg-gradient-to-br from-slate-900 to-slate-800 flex items-center justify-center">
<ProviderIcon providerType="proxycast" size={40} />
</div>
<div>
+34 -16
View File
@@ -1,24 +1,42 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<defs>
<!-- 纯黑背景 -->
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#6366f1"/>
<stop offset="100%" style="stop-color:#8b5cf6"/>
<stop offset="0%" style="stop-color:#000000"/>
<stop offset="100%" style="stop-color:#0a0a0a"/>
</linearGradient>
<!-- P字母左侧渐变:蓝色系 -->
<linearGradient id="leftP" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#4fc3f7"/>
<stop offset="100%" style="stop-color:#1a237e"/>
</linearGradient>
<!-- P字母右侧渐变:紫色系 -->
<linearGradient id="rightP" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#7c4dff"/>
<stop offset="100%" style="stop-color:#e91e63"/>
</linearGradient>
</defs>
<!-- 圆角矩形背景 -->
<rect x="8" y="8" width="112" height="112" rx="24" ry="24" fill="url(#bg)"/>
<!-- 简化的代理符号 -->
<g fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
<!-- 左箭头 -->
<path d="M30 64 L50 64 M30 64 L38 56 M30 64 L38 72"/>
<!-- 中心圆 -->
<circle cx="64" cy="64" r="14" fill="rgba(255,255,255,0.2)" stroke="#ffffff" stroke-width="3"/>
<!-- 右箭头 -->
<path d="M78 64 L98 64 M98 64 L90 56 M98 64 L90 72"/>
<!-- 简化的 P 字母 -->
<g>
<!-- P 的左竖条 -->
<rect x="36" y="32" width="10" height="64" rx="3" fill="url(#leftP)"/>
<!-- P 的上横条 -->
<rect x="46" y="32" width="28" height="9" rx="3" fill="url(#rightP)"/>
<!-- P 的中横条 -->
<rect x="46" y="60" width="24" height="8" rx="2" fill="url(#rightP)"/>
<!-- P 的右竖条(上半部分) -->
<rect x="70" y="41" width="8" height="27" rx="3" fill="url(#rightP)"/>
</g>
<!-- 中心 P -->
<text x="64" y="71" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="#ffffff" text-anchor="middle">P</text>
</svg>
<!-- 简单光晕 -->
<circle cx="64" cy="64" r="42" fill="none" stroke="url(#rightP)" stroke-width="0.5" opacity="0.3"/>
</svg>

Before

Width:  |  Height:  |  Size: 1004 B

After

Width:  |  Height:  |  Size: 1.5 KiB

+52 -34
View File
@@ -1,45 +1,63 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<defs>
<!-- 主渐变:科技蓝紫色 -->
<!-- 纯黑背景 -->
<linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#6366f1"/>
<stop offset="100%" style="stop-color:#8b5cf6"/>
<stop offset="0%" style="stop-color:#000000"/>
<stop offset="100%" style="stop-color:#0a0a0a"/>
</linearGradient>
<!-- 高光渐变 -->
<!-- P字母左侧竖条渐变:从蓝色到深蓝 -->
<linearGradient id="leftGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#4fc3f7"/>
<stop offset="50%" style="stop-color:#3f51b5"/>
<stop offset="100%" style="stop-color:#1a237e"/>
</linearGradient>
<!-- P字母右侧弧形渐变:从蓝紫到粉紫 -->
<linearGradient id="rightGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#7c4dff"/>
<stop offset="50%" style="stop-color:#9c27b0"/>
<stop offset="100%" style="stop-color:#e91e63"/>
</linearGradient>
<!-- 高光效果 -->
<linearGradient id="highlightGradient" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:rgba(255,255,255,0.2)"/>
<stop offset="0%" style="stop-color:rgba(255,255,255,0.4)"/>
<stop offset="50%" style="stop-color:rgba(255,255,255,0.1)"/>
<stop offset="100%" style="stop-color:rgba(255,255,255,0)"/>
</linearGradient>
<!-- 阴影和发光效果 -->
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<!-- 圆角矩形背景 -->
<rect x="8" y="8" width="112" height="112" rx="24" ry="24" fill="url(#bgGradient)"/>
<!-- 高光层 -->
<rect x="8" y="8" width="112" height="56" rx="24" ry="24" fill="url(#highlightGradient)"/>
<!-- 代理/转换符号:双向箭头穿过中心节点 -->
<g fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<!-- 左侧输入箭头 -->
<path d="M28 64 L48 64"/>
<path d="M28 64 L36 56"/>
<path d="M28 64 L36 72"/>
<!-- 中心六边形节点(代表代理服务器) -->
<polygon points="64,42 82,53 82,75 64,86 46,75 46,53" fill="rgba(255,255,255,0.15)" stroke="#ffffff" stroke-width="2.5"/>
<!-- 中心 P 字母 -->
<text x="64" y="70" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#ffffff" text-anchor="middle">P</text>
<!-- 右侧输出箭头 -->
<path d="M80 64 L100 64"/>
<path d="M100 64 L92 56"/>
<path d="M100 64 L92 72"/>
<!-- P字母主体 -->
<g filter="url(#glow)">
<!-- P的左侧竖条 -->
<path d="M 32 28 L 32 96 Q 32 100 36 100 L 44 100 Q 48 100 48 96 L 48 28 Q 48 24 44 24 L 36 24 Q 32 24 32 28 Z"
fill="url(#leftGradient)"/>
<!-- P的上半部分(顶部横条和右上弧) -->
<path d="M 48 28 Q 48 24 52 24 L 72 24 Q 88 24 96 32 Q 104 40 104 56 Q 104 72 96 80 Q 88 88 72 88 L 52 88 Q 48 88 48 84 L 48 72 Q 48 68 52 68 L 68 68 Q 76 68 80 64 Q 84 60 84 56 Q 84 52 80 48 Q 76 44 68 44 L 52 44 Q 48 44 48 40 L 48 28 Z"
fill="url(#rightGradient)"/>
<!-- 左侧高光 -->
<rect x="34" y="26" width="6" height="30" rx="3" fill="url(#highlightGradient)" opacity="0.8"/>
<!-- 右侧高光 -->
<ellipse cx="78" cy="42" rx="8" ry="12" fill="url(#highlightGradient)" opacity="0.6"/>
</g>
<!-- 装饰点:表示多个 Provider -->
<circle cx="32" cy="44" r="3" fill="rgba(255,255,255,0.6)"/>
<circle cx="32" cy="84" r="3" fill="rgba(255,255,255,0.6)"/>
<circle cx="96" cy="44" r="3" fill="rgba(255,255,255,0.6)"/>
<circle cx="96" cy="84" r="3" fill="rgba(255,255,255,0.6)"/>
</svg>
<!-- 外围光晕 -->
<circle cx="64" cy="64" r="45" fill="none" stroke="url(#rightGradient)" stroke-width="0.5" opacity="0.3"/>
<circle cx="64" cy="64" r="50" fill="none" stroke="url(#leftGradient)" stroke-width="0.3" opacity="0.2"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

+2
View File
@@ -21,6 +21,7 @@ import MinimaxIcon from "./minimax.svg?react";
import DoubaoIcon from "./doubao.svg?react";
import AzureIcon from "./azure.svg?react";
import AntigravityIcon from "./antigravity.svg?react";
import ProxycastIcon from "./proxycast.svg?react";
// 图标组件映射
const iconComponents: Record<string, ComponentType<SVGProps<SVGSVGElement>>> = {
@@ -42,6 +43,7 @@ const iconComponents: Record<string, ComponentType<SVGProps<SVGSVGElement>>> = {
doubao: DoubaoIcon,
azure: AzureIcon,
antigravity: AntigravityIcon,
proxycast: ProxycastIcon,
};
interface ProviderIconProps {
+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
<defs>
<!-- P字母左侧渐变:蓝色系 -->
<linearGradient id="leftP" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#4fc3f7"/>
<stop offset="100%" style="stop-color:#1a237e"/>
</linearGradient>
<!-- P字母右侧渐变:紫色系 -->
<linearGradient id="rightP" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#7c4dff"/>
<stop offset="100%" style="stop-color:#e91e63"/>
</linearGradient>
</defs>
<!-- P 字母形状 -->
<!-- 左竖条 -->
<rect x="4" y="4" width="3" height="16" rx="1" fill="url(#leftP)"/>
<!-- 上横条 -->
<rect x="7" y="4" width="8" height="2.5" rx="1" fill="url(#rightP)"/>
<!-- 中横条 -->
<rect x="7" y="11" width="6.5" height="2.2" rx="0.8" fill="url(#rightP)"/>
<!-- 右竖条(上半部分) -->
<rect x="15" y="6.5" width="2.5" height="6.7" rx="1" fill="url(#rightP)"/>
</svg>

After

Width:  |  Height:  |  Size: 1013 B

+2
View File
@@ -20,6 +20,7 @@ export const availableIcons = [
"doubao",
"azure",
"antigravity",
"proxycast",
] as const;
// Provider 类型到图标名称的映射
@@ -45,6 +46,7 @@ export const providerTypeToIcon: Record<string, string> = {
doubao: "doubao",
azure: "azure",
aws: "aws",
proxycast: "proxycast",
};
// 获取规范化的图标名称