1212from ..logging .db import TimePeriod
1313
1414# ── 品牌图标:Tabler terminal-2 核心笔划(> 与 _),不含外框 ──────────────
15- # 容器为「淡色磨砂卡片」(#f5f6fb 浅底 + 品牌紫描边环),> 与 _ 笔划改用品牌渐变
16- # (#667eea -> #764ba2)——色彩反转:品牌紫由背景迁移至图标笔划,轮廓成为视觉主角,
17- # 更简约、小尺寸下更清晰(Linear/Vercel 风)。保留 Tabler 原始外框笔划会双重描边、
18- # 边缘发糊,故仅取 > 与 _ 两条。
15+ # 容器为「玻璃雾卡」(半透明白 ~6-8% 浅底 + hairline 描边环),与深色毛玻璃 header
16+ # (backdrop-filter)语言统一;视觉重量让位给笔划,避免「亮白贴片」压制 >_ 主体。
17+ # > 与 _ 笔划用品牌渐变(#667eea -> #8b5fd0)——深端提亮使深底对比达 WCAG 图形 3:1。
18+ # chevron 左移、下划线右移并延长(M6 / M13 l5)撑开间距至 4 单位、下划线加长至 5,
19+ # 避免 stroke-width=2.5 加粗后下划线在小尺寸退化为圆点;保留 Tabler 原始外框笔划会
20+ # 双重描边、边缘发糊,故仅取 > 与 _ 两条。
1921# 单一事实源:_TERMINAL2_PATHS 与 _LOGO_DEFS 同时供 favicon SVG(f-string)与页面
2022# logo({{TERMINAL2}} / {{LOGO_DEFS}} 模板替换)消费。
21- _BRAND_FROM , _BRAND_TO = "#667eea" , "#764ba2 "
23+ _BRAND_FROM , _BRAND_TO = "#667eea" , "#8b5fd0 "
2224_LOGO_DEFS = (
2325 '<defs><linearGradient id="cpBrand" x1="0" y1="0" x2="1" y2="1">'
2426 f'<stop offset="0" stop-color="{ _BRAND_FROM } "/>'
2527 f'<stop offset="1" stop-color="{ _BRAND_TO } "/>'
2628 "</linearGradient></defs>"
2729)
28- _TERMINAL2_PATHS = '<path d="M8 9l3 3l-3 3" /><path d="M13 15l3 0" />'
30+ _TERMINAL2_PATHS = '<path d="M6 9l3 3l-3 3" /><path d="M13 15l5 0" />'
2931
3032
3133# ── Favicon (SVG, 现代浏览器主选) ──────────────────────────────────────────
3234def _build_favicon_svg () -> str :
33- """生成 24×24 SVG favicon:淡色磨砂卡片 + 品牌渐变 terminal-2 笔划.
35+ """生成 24×24 SVG favicon:玻璃雾卡 + 品牌渐变 terminal-2 笔划.
3436
35- 容器为 ``#f5f6fb`` 浅底圆角方块 + 品牌紫描边环;``>`` 与 ``_`` 笔划由白色改为品牌
36- 渐变(``url(#cpBrand)``),使图标轮廓成为主角。独立 SVG 文档无 CSS 上下文,
37- ``currentColor`` 不可靠,故颜色硬编码;``<defs>`` 复用 ``_LOGO_DEFS`` 单一事实源。
37+ 容器为半透明白雾卡(``#ffffff14`` 8% 浅底 + ``#ffffff38`` 22% hairline 描边环),
38+ 与深色毛玻璃 header 语言统一;``>`` 与 ``_`` 笔划加粗至 ``stroke-width=2.5``,
39+ 使图标轮廓成为主角。独立 SVG 文档无 CSS 上下文,``currentColor`` 不可靠,故颜色
40+ 硬编码为 hex8(同时承载透明度,避免与 ``stroke-opacity`` 双重叠加);``<defs>``
41+ 复用 ``_LOGO_DEFS`` 单一事实源。
3842 """
3943 return (
4044 '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">'
4145 f"{ _LOGO_DEFS } "
42- '<rect x="1" y="1" width="22" height="22" rx="6" fill="#f5f6fb " '
43- 'stroke="#667eea" stroke-opacity=".18 " stroke-width="1"/>'
44- f'<g fill="none" stroke="url(#cpBrand)" stroke-width="2" '
46+ '<rect x="1" y="1" width="22" height="22" rx="6" fill="#ffffff14 " '
47+ 'stroke="#ffffff38 " stroke-width="1"/>'
48+ f'<g fill="none" stroke="url(#cpBrand)" stroke-width="2.5 " '
4549 f'stroke-linecap="round" stroke-linejoin="round">{ _TERMINAL2_PATHS } </g>'
4650 "</svg>"
4751 )
4852
4953
5054# ── Favicon (ICO, 32×32 光栅回退) ─────────────────────────────────────────
5155def _build_favicon () -> bytes :
52- """程序化生成 32×32 ICO:淡色磨砂卡片 + 品牌渐变 terminal-2 笔划(旧浏览器/Safari 回退).
56+ """程序化生成 32×32 ICO:玻璃雾卡 + 品牌渐变 terminal-2 笔划(旧浏览器/Safari 回退).
5357
54- 项目无 Pillow/cairosvg 等图像库,故以纯 Python 按像素光栅化:``#f5f6fb`` 浅底圆角
55- 方块 + 品牌渐变(#667eea -> #764ba2)``>`` 折线与 ``_`` 下划线。沿用原实现「全零
56- AND-mask + per-pixel alpha」的圆角透明方案(现代渲染器按 alpha 通道处理透明)。
57- 32px 下细描边环易锯齿,故 ICO 仅保留浅底 + 渐变笔划,精修外观由 SVG 承载。
58+ 项目无 Pillow/cairosvg 等图像库,故以纯 Python 按像素光栅化:``#f5f6fb`` 半透明
59+ (alpha 0xB0)圆角方块 + 品牌渐变(#667eea -> #8b5fd0)``>`` 折线与 ``_`` 下划线。
60+ 沿用原实现「全零 AND-mask + per-pixel alpha」的圆角透明方案(现代渲染器按 alpha
61+ 通道处理透明)。32px 下细描边环易锯齿,故 ICO 仅保留雾底 + 渐变笔划,精修外观
62+ 由 SVG 承载。
5863 """
5964 import math
6065 import struct
@@ -63,10 +68,10 @@ def _build_favicon() -> bytes:
6368 radius = 8
6469 scale = width / 24.0 # SVG 24 单位 -> 像素
6570
66- # 图标笔划品牌渐变:#667eea -> #764ba2 (与 _LOGO_DEFS 同源)
71+ # 图标笔划品牌渐变:#667eea -> #8b5fd0 (与 _LOGO_DEFS 同源;深端提亮达 WCAG 3:1 )
6772 r0 , g0 , b0 = 0x66 , 0x7E , 0xEA
68- r1 , g1 , b1 = 0x76 , 0x4B , 0xA2
69- # 容器底色:#f5f6fb(近白、极浅冷蓝紫)
73+ r1 , g1 , b1 = 0x8B , 0x5F , 0xD0
74+ # 容器底色:#f5f6fb(近白、极浅冷蓝紫);alpha 在背景填充处降至 0xB0 实现玻璃雾感
7075 tile_r , tile_g , tile_b = 0xF5 , 0xF6 , 0xFB
7176
7277 def inside (x : int , y : int ) -> bool :
@@ -82,12 +87,12 @@ def inside(x: int, y: int) -> bool:
8287 [[0 , 0 , 0 , 0 ] for _ in range (width )] for _ in range (height )
8388 ]
8489
85- # 1) 浅底圆角背景(扁平 #f5f6fb)
90+ # 1) 玻璃雾卡圆角背景( #f5f6fb @ alpha 0xB0 ≈ 69%,半透明与 SVG #ffffff14 同向 )
8691 for y in range (height ):
8792 for x in range (width ):
8893 if not inside (x , y ):
8994 continue
90- buf [y ][x ] = [tile_b , tile_g , tile_r , 255 ]
95+ buf [y ][x ] = [tile_b , tile_g , tile_r , 0xB0 ]
9196
9297 def brand_at (px : float , py : float ) -> tuple [int , int , int ]:
9398 """按对角参数 t 返回 (px,py) 处的品牌渐变 RGB(与 SVG url(#cpBrand) 同向)."""
@@ -116,11 +121,11 @@ def line(x0: float, y0: float, x1: float, y1: float) -> None:
116121 s = i / steps
117122 stamp (x0 + (x1 - x0 ) * s , y0 + (y1 - y0 ) * s )
118123
119- # 2) terminal-2 笔划(SVG 24 单位 -> 像素)
120- # > 折线 (8 ,9)->(11 ,12)->(8 ,15);_ 下划线 (13,15)->(16 ,15)
121- line (8 * scale , 9 * scale , 11 * scale , 12 * scale )
122- line (11 * scale , 12 * scale , 8 * scale , 15 * scale )
123- line (13 * scale , 15 * scale , 16 * scale , 15 * scale )
124+ # 2) terminal-2 笔划(SVG 24 单位 -> 像素;chevron 左移、下划线右移并延长,间距 4 单位 )
125+ # > 折线 (6 ,9)->(9 ,12)->(6 ,15);_ 下划线 (13,15)->(18 ,15)
126+ line (6 * scale , 9 * scale , 9 * scale , 12 * scale )
127+ line (9 * scale , 12 * scale , 6 * scale , 15 * scale )
128+ line (13 * scale , 15 * scale , 18 * scale , 15 * scale )
124129
125130 # 3) 打包 ICO(BMP bottom-up;全零 AND-mask,信任 per-pixel alpha 实现圆角透明)
126131 pixel_rows : list [bytes ] = []
@@ -222,13 +227,13 @@ def line(x0: float, y0: float, x1: float, y1: float) -> None:
222227 .header-left { display: flex; align-items: center; gap: 12px; }
223228 .logo {
224229 width: 32px; height: 32px;
225- background: #f5f6fb ;
226- border: 1px solid rgba(102,126,234,.18 );
230+ background: rgba(255,255,255,.06) ;
231+ border: 1px solid rgba(255,255,255,.12 );
227232 border-radius: 10px;
228233 display: flex; align-items: center; justify-content: center;
229- box-shadow: 0 4px 12px rgba(102,126,234,.18 );
234+ box-shadow: 0 4px 12px rgba(0,0,0,.24), inset 0 1px 0 rgba(255,255,255,.06 );
230235 }
231- .logo svg { width: 20px; height: 20px; display: block; }
236+ .logo svg { width: 20px; height: 20px; display: block; filter: drop-shadow(0 0 4px rgba(182,140,255,.35)); }
232237 h1 { font-size: 18px; font-weight: 600; color: var(--text-primary); letter-spacing: -.3px; }
233238 .header-right { display: flex; align-items: center; gap: 12px; }
234239 .badge {
@@ -815,7 +820,7 @@ def line(x0: float, y0: float, x1: float, y1: float) -> None:
815820<body>
816821<header>
817822 <div class="header-left">
818- <div class="logo"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="url(#cpBrand)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">{{LOGO_DEFS}}{{TERMINAL2}}</svg></div>
823+ <div class="logo"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="url(#cpBrand)" stroke-width="2.5 " stroke-linecap="round" stroke-linejoin="round">{{LOGO_DEFS}}{{TERMINAL2}}</svg></div>
819824 <h1>Coding Proxy Dashboard</h1>
820825 <span class="badge" id="version-badge">v-.-.-</span>
821826 </div>
0 commit comments