布局这个词,在 Tuff 的仓库里出现得比 Tuff 这个名字还早。2023 年 4 月 9 号就有一条提交,标题里写着 Update Layout Module,而 Tuff 这个名字,要到 2025 年 8 月才有。

要讲清楚八月四号那天删掉的五千多行是怎么来的,得从这儿说起。

2023

当时项目叫 TalexTouch 才两个来月。后面的两年多里,布局这个词时不时冒出来:FlatLayout 早就有了,2023 年 6 月还有提交改过它;到 2025 年秋天又有了 DynamicLayout,11 月初删过一个 layout-manager。

二月

2026 年 2 月 4 号,一条提交加上了布局预设,还有导入导出。提交说明里列的预设有 compact、minimal、classic、card、dock,另外增强了 LayoutAtomEditor,还加了一层给用户自己写的样式用的 CSS 清洗。

“原子化”是什么意思,文档里是这样讲的:把布局拆成一组小参数,圆角、边框、侧栏放哪边、透明度多少,解析成 CSS 变量,灌进外壳的根节点。上面那五个再加 simple 和 flat,布局组件一共七个。编辑器里改了任何一点,都会存成一个叫 custom 的预设,布局也跟着切过去,custom 用的还是 simple 的壳。它算第八种,后来提交里说的八种可选布局,就是这么数出来的。

用户自己的 CSS 那一块,文档写得挺坦白:@import、url( 这些会被拦掉,长度默认不超过 8000,最后补了一句,这个过滤器不是严格的安全沙箱。

到 2 月 13 号,仓库里已经有一个画布式的编辑器了,叫 CanvasGridEditor,用来拖着摆位置。

八月四号

然后是八月四号,两条提交隔了不到八分钟。

第一条落下一个固定的外壳:260px 宽的侧栏,加一个主栏,按设计稿来。它的提交说明先交代了一句,原来那八种可切换的布局这时已经没有人引用,会在下一条里删,这样这一条自己也能单独退回去。

第二条就是删。八种布局,连同注册表、动态加载、原子配置、预设导入导出、远程预设、预览那一整套,还有外观页里布局那一栏,一共 41 个文件,大约 5200 行。给的理由只有半句:应用现在只有一个固定的外壳了。同一批带进仓库的一份任务文档说得多一点:八套能切换的布局,让外壳收不成一种样子。后面还有一段验证:类型检查零错误,lint 干净,构建通过,相关目录下的 32 个测试全绿。随后又有一条提交,把设置页重排了一遍,还加了首页的对话入口。

留下的

删的时候按一条事先说好的边界走,叫 layout only,只动布局。主题、壁纸、窗口效果留下了,它们不是在切布局。CoreBox 的画布编辑也留下了。

CanvasGridEditor 下面挂着两个编辑浮层,提交里管它们叫兄弟。一个改的是 CoreBox 窗口里各块的位置,logo、输入框、标签、动作、结果、底栏这些;提交说明说,它只是碰巧挂在布局那一栏下面,算 CoreBox 的窗口定制,入口挪进了一个新的小节。另一个改的是主界面的头部、侧栏和内容区,那个才是外壳布局,一起删了。两个编辑浮层在布局那一栏下面挂了半年,到删的时候才分得出哪个算布局。

再算算时间。从第一条 Update Layout Module 算起是三年多,从预设和导入导出算起,2 月 4 号加的,8 月 4 号拆,整整六个月。按理说,可切换就是每个版本都得验证八次,第二季度一个季度就发了五十多个 release。我没去查它们是不是真的都验证了,这只是按理推出来的。

设置的结构里,布局相关的几个字段还留着:layout、layoutAtomConfig、layoutCanvasConfig、presetState。应用本身已经不读它们了,留着是因为 Nexus 里的预设仓库还在用,而且 @talex-touch/utils 是发出去的包,第三方插件的类型依赖它。提交说明里的说法是,只清了读写的地方。