罗德岛通讯与技术部

底栏重做(方舟 dock)方案

DOCK REDESIGN

底栏在聊天 App 里本身是好 UX(拇指可达、可扫读),问题不在「有底栏」,

状态:🟢 现行 · 最后核对 2026-08-20

把底部 tab 栏从「iOS/微信扁平四等分」重做成「明日方舟 dock」。 2026-08-19 · 🟢 已实施(视觉层 + 指示器 spring 滑动 + 次级系统浮窗 + 四格图标全面重绘 + ambient ticker)

这是 visual-redesign.md 四根杠杆(材质/字体/几何/呼吸感)里 「字体 + 几何」两杠杆在底栏这一小块上的落地样板。做对了,它能反过来当 「技术标签层 + 斜切几何」在全 app 复制的范本;做砸了,就是又一套写死的 iOS 值。

⚠️ 2026-08-20 三杠杆蔓延--dock-hairline / --dock-cut 已改名 --hairline-cold / --cut 并蔓延到全 app 的 chrome/卡片;新增 --tech-tracking / --cut-sm。本表里的旧名作废,以 style.css 为准。

定位

底栏在聊天 App 里本身是好 UX(拇指可达、可扫读),问题不在「有底栏」, 在于它长得像通用 iOS 底栏 + 四个 tab 无差别。这一轮的目标是:

  • 保留可用性(仍是常驻底栏、仍是四个 slot);
  • 消灭 AI 味(几何、字体、层次三件事,不是调色板);
  • 立起层次(三个「关系面」 + 一个「世界面」,让玩家一眼读出「这是不同的东西」)。

叙事锚点(Diegetic 的最浅层):整个 app 是一块「罗德岛终端」的屏幕,所有 chrome 都该长得像它的一部分。这里只取「视觉隐喻」,不做字面 diegetic UI——我们 没有游戏里那个「物理界面」层,硬做就是 cosplay。

已定决策(2026-08-19 讨论)

# 结论
1 中文技术 readout 中文主标 + 英文微标(英文大写小字距那层才是 readout 载体)
2 切角几何 只激活格斜切高亮块(平时底栏是安静轨道,激活时亮一块斜切块)
3 激活态指示器 顶部发丝线 + 图标填充(双重信号但都不重)
4 交易所 保持第四格等权,但分区分义(关系面 | 世界面),改名 「泰拉」
5 色相 冰蓝(冷光发丝线 + accent)
6 范围 token 化 + 守卫测试;动效后置(指示器 spring 滑动留到 juice 层)

为什么「分区分义」而不是「降权」

经济不是「第四个功能」,是「第四根支柱」——目标是一个自循环、反向扩展世界的 经济体系。所以交易所不该靠后,该等权但异质:和三个关系面平起平坐,但有一套 自己的身份(微标、读数、图标),不跟聊天抢同一套视觉语言。「显要」和「喧宾」的 区别,就在于是不是有独立身份。

架构原则:次级系统用浮窗,不是 tab(同 canvas)

方舟交互最典范的一条:玩家在复杂系统里从没离开过同一张 canvas。升级/升阶/合卡/ 升技能,按钮从不跳转到全新页面,而是横移淡入、人物位移、透明浮窗、原位展开。

落到我们:次级系统(设置/邮箱/通知/送礼)不该做成「跳走」的页面或 tab,而该是 「在原页之上呼出」的毛玻璃浮窗。这恰好闭环了「交易所该不该独立成 tab」的纠结:

  • 主角(三个关系面 + 世界面) → 占用 dock 的 slot;
  • 次级系统 → 一律浮窗呼出,不占 tab。

这是「喧宾夺主」的根解:不是把 tab 减到 3 个,而是让次级系统根本不进 tab。 (本次只立原则 + 分区分义;把次级系统逐个迁成浮窗,2026-08-20 已落地为右侧 .sheet-view。)

材质:散点(grain)+ 条纹(警戒线)

方舟用得最多的底图处理是两类:

  • 散点(grain):低密度高颗粒度噪声。用在按钮/卡片背景能让留白不单薄、 提升对比度。中性纹理,10 套主题通用,是「材质」杠杆里最安全、最便宜的一刀。
  • 条纹(警戒线):粗条纹的工业感。适合点缀(分隔、激活指示),别铺满, 否则从「工业」滑向「赛车涂装」。

这轮先在 dock 上试:grain 铺在 dock 底、条纹做在激活斜切块或分隔线上,跑顺了再 蔓延到卡片。grain 用 SVG noise 或重复小噪点的 background-image零请求; ⚠️ 别用全屏 filter: contrast()/noise 造噪点(烧 GPU + 挡可读性)。

具体规格

HTML(frontend/index.html 底部 #tab-bar

[ 消息 ] [ 联系人 ] [ 动态 ]  │  [ 泰拉 ]
  关系面(她的世界)     发丝线   世界面(泰拉)
  • 每个 .tab-btn 加一个英文微标 <span class="tab-sub">(在 .tab-label 之下);
  • 第四个 tab 文字 交易所泰拉
  • 关系面三个与「泰拉」之间插一根分隔线 <span class="tab-divider">(或伪元素)。

微标词(实施时定,我给的默认):

tab 中文主标 英文微标
消息 消息 MESSAGES
联系人 联系人 OPERATORS
动态 动态 MOMENTS
世界面 泰拉 TERRA

「联系人 → OPERATORS」是刻意的小心思:联系人就是干员名册,英文层叫 OPERATORS 比叫 CONTACTS 更像方舟本体。

Token(:root 新增,theme-aware)

token 用途 说明
--dock-accent 激活色 默认冰蓝;浅底主题要用压暗的冰蓝
--hairline-cold 冷光发丝线(分隔线 + 顶部指示线) 默认冰蓝 tint 的白/青;浅底压暗
--cut 斜切角尺寸 纯几何,主题无关,只放 :root,各主题不覆盖
--fs-tech 技术标签字号 + 字距 + 字体栈 英文微标层:工业等距无衬线(大写+字距),非 serif
--grain 散点噪声纹理(overlay) 材质第一刀:填「留白单薄」,中性、10 套主题通用
--stripe 警戒线粗条纹 工业点缀,只在分隔/激活态试,别铺满

CSS

  • .tab-btn.activeclip-path 斜切高亮块 + --dock-accent + 顶部 --hairline-cold 发丝线 + 图标从描边切填充;
  • .tab-sub:英文微标,text-transform: uppercase + letter-spacing + 比主标更小、 更灰(--text-tertiary 量级);
  • .tab-divider:一根 --hairline-cold 竖线。

图标填充的实现

现在图标是描边 SVG maskstroke-width=1.7、round cap)。填充态需要每格两套 mask:描边(未激活)+ 实心(激活)。做法是给每个 data-icon 再挂一个 --tab-icon-mask-fillfill 而非 stroke 的同形状 SVG),激活时 .active 规则把 --tab-icon-mask 切到填充版。不新增图片请求,仍是零请求的 mask。

泰拉图标

现有 data-icon="market" 是折线图(趋势图),偏「炒股 App」。既然身份从「交易所」 升成「世界面/泰拉」,图标值得换成世界/罗盘/六边形一类(实施时定,我给罗盘或 六边形两个候选)。

范围(in / out)

内容
✅ In dock 视觉语言:斜切几何、技术标签(中文+英文工业等距)、冷光发丝线、分区分义、改名泰拉、泰拉图标、grain+条纹材质
✅ 补 指示器 spring 滑动、次级系统迁浮窗、四格图标全面重绘、ambient ticker(原 Out,2026-08-20 补齐)

2026-08-20 补:上面两件 Out 已补完 —— 指示器 spring 滑动.tab-indicator 滑动到激活 tab)和次级系统迁浮窗(设置 + 6 子页 + 观察者收件箱改成右侧 .sheet-view 玻璃面板 + #sheet-backdrop,见 tests/test_sheet_views.py)。

2026-08-20 补(图标):四格图标已全部重绘成「方舟斜切/细线几何」——消息=斜切气泡 (右上切角,呼应 dock 激活指示器的单角斜切)、联系人=六边形头双干员、动态=菱形罗盘、 泰拉=尖顶六边形。描边/实心两套 mask 各格都保留(激活时描边→实心)。

2026-08-20 补(ticker):ambient ticker 落在泰拉行情页顶栏——#market-index-ticker 常驻源石指数读数(指数值 + 红涨绿跌的涨跌幅),和余额并排,数据走现成的 /market/stateindex.value/index.change(不改后端)。见 tests/test_market_ticker.py

主题兼容(唯一的坑)

--dock-accent / --hairline-cold 是 theme-aware,10 套主题都要覆盖。浅底主题 (夕/青绿/纸/绢/墨)漏一个 = 浅底上刷一块深色,重演 CLAUDE.md 里 「漏一个 token = 浅底刷深色,不报错不告警」的翻车。

所以这轮必须带守卫一起走

  • 扩展 tests/test_theme_polarity.py--dock-accent / --hairline-cold 在 10 套 主题都有定义,且明暗极性正确;
  • 扩展语义色对比度守卫:--dock-accent 在浅底主题上对比度达标(≥ 4.5)。

守卫测试(新增)

  • 静态:4 个 .tab-btn 都有 .tab-label + .tab-sub;第四个是「泰拉」; 分隔线存在;.tab-btn.active 用了 clip-path + 顶部发丝线(防「改了又没生效」)。
  • 主题:上述两个新 token 的极性与对比度(并入既有主题测试)。

实施顺序

  1. token(:root + 10 套主题 + 极性/对比度守卫;含 --grain/--stripe/--fs-tech
  2. CSS(.tab-btn.active 斜切 + .tab-sub + .tab-divider + 图标填充变体 + grain/条纹材质)
  3. HTML(微标 + 改名 + 分隔线)
  4. 图标(泰拉 SVG + 各 tab 填充变体)
  5. 静态守卫测试
  6. python scripts/bump_frontend_cache.py

实施时已定(原「未决」)

未决 落地
泰拉微标 TERRA(呼应「世界」身份)
泰拉图标 六边形M12 4 L18.9 8 … Z 尖顶六边形,方舟几何签名)
--dock-accent 各主题 跟随各自 accent--dock-accent: var(--active-color));默认暗色签名是冰蓝 #6cc9ea
斜切形状 单角切右上--cut: 10px
技术字体落地 letter-spacing + 等距/几何栈 仿--tech-font),零成本零请求