Tuff 深色模式的底色是 #141414,不是纯黑。设计手册里给了三条理由:OLED 屏上纯黑意味着像素全关,高对比的东西一滚动,边缘会拖出紫黑色的尾巴;背景已经是纯黑,往下投的阴影就全部失效,卡片浮不起来;纯白压在纯黑上,对比度有 21 比 1,暗室里晃眼。

(这个博客的深色底倒是纯黑 #000。手册管的是 Tuff,管不到这里。)

那份手册 10 月 14 号有了第一版,中英双语;后面的 287 毫秒、autoDetect 默认关闭,还有 PingFang 那段补注,是 16 号和 17 号的两次修订才有的。所以我不太敢说里面每个数都是先定下来再去做的,大概有不少是做了一阵之后写下来的。

几个数

暗色模式里,三档强调字重各自调轻了 40:500 变 460,600 变 560,700 变 660。手册自己后面又补了一句实话:在没装 Inter 的 macOS 上,中文和英文都由 PingFang SC 来画,实测 460、560、660 画出来和 500、600、700 完全一样,默认字体栈下看不出这个微调。

悬停反馈,手册要求的是 0 毫秒,不许在 上做颜色渐变;它的理由是人的反应在 100 毫秒上下,渐变慢吞吞的,鼠标会像泡在浆糊里移动。菜单点一下,确认分两拍:先用 90 毫秒把这一行的高亮撤干净,再用 90 毫秒亮起激活态。动画只碰合成器自己能处理的属性,位移、缩放、旋转、透明度。

460 这样精确的数,生不生效,还要看一个没写进数里的东西,字体栈。

折射

Tuff 的默认材质叫 refraction,折射。手册的描述是:一条 SVG 位移贴图让红、绿、蓝三个通道各错开一点(这叫色散),上面叠背景模糊和饱和度,再描一圈 1 像素的折射边。

手册的材质表里,它的性能开销写的是最高,所以运动的时候会降级,恢复也是一层一层走的,走完要 287 毫秒。自动感知运动的开关叫 autoDetect,感知到运动结束以后,还要再安静满 140 毫秒才开始恢复,免得手在阈值附近抖一下,材质就来回切。

手册里还有一条门禁:想把默认的折射换成别的材质,必须经过用户手动明确确认,不能由 AI 或者开发的人自己顺手换。

铺开

十月中旬,一两天里,折射就铺开了。CoreBox 自己的底板(那是一扇透明窗口,模糊交给系统,玻璃层不画)、模态框、抽屉、命令面板和几种对话框,一个个换到折射面上。Nexus 站点那条提交的说明里数了数:显式写 mask 的有 121 处,glass 34 处,pure 4 处,光后台统计页就有 50 张卡片,全部改回了默认;留下的只有专门讲材质的演示页。应用本体那一条的说法也一样,之前写 blur、mask、pure 的,除非有人确认过,都回到默认。

账

十月二十一号,一条性能修复把账写了出来。提交说明里说:TxCard 从 0.9.0 起默认就是折射,每块折射表面都画一层 SVG 玻璃,位移贴图是整块大小的 SVG,Chromium 每一帧都要在 CPU 上栅格化一遍。一块 1526×1886 的面板,每帧花 100 到 200 毫秒;某个控制台页面滚起来,大约只有 5 帧。

修法主要有两处。位移贴图改成长边最多 256 像素的位图,再拉伸,据提交说明,位移的误差不超过一个量化步长;refractionRenderer 的默认值改成 css,也就是不画玻璃层,要的话自己选 svg,不透明度默认 0.3。

名字没动,还叫折射,默认里最贵的那一层变成了要自己打开。从 10 月 11 号那条写下折射规则的提交,到这笔账,差不多十天;从铺开算,不到一个礼拜。

还有个小细节。autoDetect 在手册里是默认关闭的:最贵的材质是默认,能在掉帧、省电的时候把它降下来的开关,默认是关着的。开着它能不能救下那 5 帧,我判断不了,提交说明里也没提,它只怪了位图太大。

提交说明的清单里还有一条小注:玻璃层开着的时候,TxCard 仍然用普通圆角,用 corner-shape 的话,某些嵌套里 Chromium 会把滤镜丢掉,钱却还是每帧照付。