diff --git a/3DTank/docs/UI_Rebuild_Plan.md b/3DTank/docs/UI_Rebuild_Plan.md index 3a6b6e5..139e4ec 100644 --- a/3DTank/docs/UI_Rebuild_Plan.md +++ b/3DTank/docs/UI_Rebuild_Plan.md @@ -282,3 +282,147 @@ TankiOffline (Kotlin/JS 客户端) - [ ] 车库按 9.2 的原版布局重建 + 3D 预览加载器。 - [ ] 协议级 mock 服务器(用户 / 大厅列表 / 任务)。 - [ ] 大厅其余屏幕迁移到 React。 + +--- + +## 10. 原版 UI 还原方法(已验证,2026-10-26 设置页) + +> 这一节记录的是实际跑通的方法。后续所有页面都按这个流程做,不再先写通用样式再“看起来像”。 + +### 10.1 原则 + +1. **不自己设计 UI**:布局、尺寸、颜色、类名、DOM 层级都以混淆版源码/原版 DOM 为唯一来源。 +2. **先找定义,再做映射**:找不到原版定义就标注“未展开”,不靠截图猜。 +3. **能用原版资源就不画近似**:图标、勾、knob、箭头、背景图优先用 `play/static/images` 里的原版资源。 +4. **文案走 i18n**:使用 `Translations.T("lobby....")`,不硬编码中文。 +5. **颜色走配色表**:使用 `Palette.kt`(来源 `C9i`),不手写近似色。 +6. **每页完成后删除旧近似样式和死代码**,避免两套样式并存。 + +### 10.2 定位组件定义 + +1. 在 `module_82347.js` 搜索: + ```js + Sq(Class, "XxxComponentStyle", ...) + ``` + 找到样式类。 +2. 看类构造器: + ```js + this.xxx_1 = this.aux([], styleFn) + ``` + 找到字段与对应 `styleFn`。 +3. 看访问器: + ```js + jq(Class).accessor = function () { ... Eq("fieldName", ...) ... } + ``` + 确认字段名和生成的语义类名。 +4. 找渲染函数/组件:`jq(Component).tap` / `render`,确认 DOM 层级和子组件。 +5. 把类名、字段、行号记录到对应的 `*StyleTable.md`。 + +示例(设置页): + +| 组件 | 类 / 函数 | 位置 | +|---|---|---| +| `SettingsComponentStyle` | `kNi` | `module_82347.js:89525` | +| `SettingsMenuComponentStyle` | `EMi` | `90329` | +| `SettingsButtonsComponentStyle` | `UPi` | `89326` | +| `DropDownStyle` | `J7t` | `34073` | +| `ContextMenuStyle` | `u7t` | `33638` | +| `CheckBoxComponentStyle` | `QBi` | `92742` | +| `CheckBoxStyle` | `Z0t` | `33272` | +| `InputRangeComponentStyle` | `EUi` | `92980` | + +### 10.3 提取真实 CSS + +1. 在无头页面加载 `module_37036`(Kotlin 运行时)+ `module_82347`。 +2. 实现最小 webpack require:`i(id)`、`i.p`、`i.d`、`i.r`、`i.n`、`i.o`、`i.hmd`。 +3. patch `module_37036` 的 `ld`,捕获 `Sq(Class, Name)` 注册表。 +4. 实例化目标样式类,遍历 `kuv_1.a1_1`,执行每个 `entry.duv_1[0](recorder)`。 +5. recorder 记录 `rpf` / `gp8` / `jp8` / `lp7` / `qp7`,输出 base/nested CSS。 +6. 动态方法直接调用,例如: + - `d1mg(recorder, important)`:下拉选项 + - `m1md` / `n1md`:复选框 / Toggle Switch + - `hUi.tap`:滑杆进度渐变 +7. 提取结果写入 `*StyleTable.md`,作为实现依据。 + +### 10.4 还原真实 DOM 和类名 + +1. 按原版 DOM 写结构,不替换成自创的 `button` / `div`。 +2. 保留语义类名: + - `InputRangeComponentStyle-blockSoundVolume` + - `InputRangeComponentStyle-soundVolume` + - `InputRangeComponentStyle-range` + - `SettingsComponentStyle-slider` + - `CheckBoxComponentStyle-oneSetting` + - `CheckBoxStyle-checkbox` + - `DropDownStyle` / `ContextMenuStyle` 相关类 +3. 保留原版 `ksc-*` 标记用于核对,例如 `ksc-56`(百分比)、`ksc-57`(滑杆)、`ksc-62`(Switch)、`ksc-63`(标签容器)。 +4. 原版 DOM 示例: + + 滑杆: + ```html +
+ ``` + + Switch: + ```html +