Files

370 lines
53 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Rhine Lab UI
## 索引与阵列:当前机制(权威,动它之前先读这一节)
> 下方时间线是历史记录,其中有几段**已经被回退**。读到时以本节为准。
> **不存在**的文件(曾在时间线里出现,现已删除,不要再去找):
> `src/archive-array.ts`、`scripts/check-array.mjs`;`src/data.ts` 里的
> `loadArchiveDataset` / `searchDataset` / `columnCount` / `recordKey` / `indexOfKey` /
> `childrenOfPath` / `datasetSource` / `laneCenter` / `rowPeriod` 也都已移除。
**数据流**:`content/curated.mjs`(手写)→ `npm run archive:snapshot` → `content/archives.json`(生成物)
→ `src/data.ts` → 阵列(`src/archive-loop.ts` / `src/archive-visibility.ts` / `src/scene.ts`)。
`public/archive-index.json` 只服务 LOCAL ARCHIVE 面板与检索,**不参与阵列**。
**现状**:5 个分类,每列条数**不限**(校验器只要求每列 ≥1、总数 ≥5),当前内容 **47 条**,五列 **8 / 9 / 11 / 9 / 10**(刻意不等长,用来证明上限确实放开了)。
阵列窗口是 32 行、内容从第 12 行起编号,`slot = lane * 32 + (row % 32)`。
### 想改数量时动哪里
| 目标 | 动这里 | 别动 / 注意 |
| --- | --- | --- |
| 每列条数、总条数 | `content/curated.mjs` 增删条目 → `npm run archive:snapshot` | **不要手改 `content/archives.json`**,它是生成物,下次生成会覆盖 |
| 单列超过 20 条 | 不用改任何东西 | 交互路径的行空间无上限(`fileAtCell` 按 `files.length` 取模循环);`slot` 已用 `% 32` 防止串到下一列 |
| 分类数量 5 → n | `curated.mjs` 的 `categories`/`columns` **+** `scripts/archive-content.mjs` 的 `names.length !== 5` **+** `src/archive-loop.ts` 的 `POOL_LANES` / `LOOP_COLUMNS` **+** 行内写死的列原点 `(lane - 2)`、`/ 5`、`/ 8`(`archive-visibility.ts:36,42`、`scene.ts` 的相机/动效/取值多处) | ⚠️ 列数一改就动了**原片逐帧对照**的构图基准,必须重新校准;不要只改一处 |
| 刻度条长度 | `src/main.ts` 的 `TICK_WINDOW` | 短列必须走自然顺序分支(见下) |
| 校验规则 | `scripts/archive-content.mjs`;同步改 `scripts/check-content.mjs` 的 `invalidCases` | 校验不过时 `predev`/`prebuild` 会**直接 throw**,dev server 和 build 都起不来 |
### 改完怎么自检(改了阵列/内容/场景就跑这一套)
```powershell
npx tsc --noEmit # 类型必须 exit 0
npm run check:content # 档案数据校验,20 项
node --experimental-strip-types scripts/check-archive.mjs # 相机/抽取几何
node --experimental-strip-types scripts/check-loop.mjs # 循环阵列
npm run build # prebuild 会跑快照+校验+字体
```
⚠️ `check:archive` / `check:loop` **没有** npm script(只有 `check:content` / `check:viewport` 有),
必须用上面的 node 形式跑文件。`check:array` 已随方案回退一并删除,**不要再引用**。
### 已经踩过的坑(改之前先看)
1. **别把每列条数写死成 8。** 旧版校验器与阵列数学都假定每列恰好 8 条;用户要求"每列无限"后已放开,但阵列窗口只有 32 行、内容从第 12 行起 → 每列**超过 20 条**时若 `slot` 不取模就会串到下一列的行上。`data.ts` 的 `slot: lane * 32 + (row % 32)` 就是为这个加的。
2. **刻度条窗口化时,短列必须保持自然顺序。** `main.ts` 的 `tickWindow()` 里 `const start = len <= TICK_WINDOW ? 0 : position - Math.floor(count / 2)`。若一律"以选中项居中",列内 8 条时窗口会绕回来变成 `5,6,7,8,1,2,3,4`——顺序整体转位、高亮卡在正中,看起来就是"滑条坏了"。这个 bug 已经发生过一次。
3. **`fileAtSlot` 是截断、`fileAtCell`(archive-loop)是循环取模**,两者语义不同,不要合并。`fileAtSlot` 服务 boot 与原片对照的固定 160 布局,必须与原版一致。
4. **别再用"往阵列里塞全量归档文件"的方案。** 试过一次(每个文件一张盘),造成检索列表里全是 `00_索引` 的 CSV/MD/TXT、选中列外条目还会错位到第一列的盘上,用户判定"索引完全改坏",已整体回退。要扩内容请往 `curated.mjs` 加条目。
5. **`records` 是静态 import**,模块顶层就会用到它(`main.ts` 里 `columnFiles(...)[0]`、`fileLocation(selected).lane`)。若日后要改成异步加载,必须先处理这些顶层访问,否则启动即崩。
### 开场与退出的入口序列
`src/main.ts` 的 `beginOpening()`:加载完成 → 尝试解锁音频 → logo 停留 `ENTRY_LOGO_HOLD = 1000ms` → 渐出 → 自动播放(**没有点击门槛**,`src/startup.ts` 的 `StartupGate` 已无调用方)。
浏览器要求用户手势才允许启动音频设备,解锁失败时本次开场静音,但**不清空** `prefs.sound/music`,改由 `armAudioUnlock()` 在首次 `pointerdown`/`keydown` 补解锁。
右上角那个 46px 圆形按钮:开场中是 `↗` 跳过(`.skip`),进入档案/详情后变成 `⏻` 退出(`.exit`),两者同坐标不重合。
退出序列(`exitSystem()`,CSS 时序在 `style.css` 的 `.shutdown` 段):白屏 + logo(**不闪动**)→ 字符本体明灭(`shutdownFlicker`)→ 黑条从左扫到**完全覆盖**为止、**不向右滑出**(`shutdownSweep` 无 100% 那一段)→ `SHUTDOWN_WINDOW` 之后 `window.close()`,关不掉则退化为纯白页。
- 2026-09-11:官网已独立集成 Novecento 开场字体;授权 kit 不进入 Git。正式 Vercel 项目在构建时从当前生产版本恢复并校验字体,首次部署使用本机授权 kit 的静态输出。见 verification/WEBFONT-DEPLOYMENT.md。
## 开场中央字体
- 2026-09-11:用户要求中央开场文案中适合的位置统一使用 Novecento Sans Wide。访问、身份、请求、处理、授权提示使用 Normal;欢迎三行使用 Bold。后续按用户纠正与原片叠加比较,左上 RHINE LAB 使用 DemiBold,下方两行保留 MiSans。沿用原时间轴与 HUD。
- 用户后续授权从 MyFonts 领取 Normal、DemiBold、Bold 正式 Webfont 并直接替换,本机已领取并接入。public/fonts/novecento 为独立许可资源,排除 Git;有完整字体包时使用原始 WOFF2,其他检出或加载失败保留既有固定图形。来源、再制作与回归见 verification/BOOT-LETTERING.md。网页年度许可不等于已确认创意工坊分发授权,本轮未上传。
## Wallpaper Engine 实验分支
- 用户追加授权音乐律动、手动点击开始且可隐藏入口的波纹接力小游戏,以及入场详情开关。工作台默认短入场,展示模式默认完整;可强制覆盖。工作台内容轻微错峰淡入,减少动态效果时直接显示。
- WE 属性采用原生可折叠分组和条件显示;选中档案支持保持原样、仅音乐时归齐、始终归齐。原生实现继续沿用,不启用前端或动效 Skill。详见 docs/WALLPAPER-ENGINE.md。
- 用户进一步要求登录入场适配多分辨率并移除底部字幕。正常入场背景与三维画布铺满实际视口,中央图形保持比例;只有显式逐帧对照保留固定 1920×1080 舞台。此前“所有开场固定比例”规则由此更新。
- 用户于 2026-09-10 授权新建 `codex/wallpaper-engine`,在本机 Wallpaper Engine 中试用网页壁纸。当前作为独立实验保留,不合并主分支、不上传创意工坊。
- 沿用现有原生实现和视觉规范;`npm run build:wallpaper` 输出 `release/wallpaper`,网页正式构建保持原流程。
- 壁纸资源全部本地打包,关闭 PWA,自动启动,接入宿主设置、帧率和暂停通知。使用说明与实际验证见 `docs/WALLPAPER-ENGINE.md`。
- 用户明确要求:以目录内视频 5–40 秒为视觉与动效参考,尽量逐像素还原;不使用前端 Skill,由代理选择技术栈。
- 本项目采用参考视频逐帧分析与原生实现流程,不启用主前端设计或动效 Skill。
- 美术资源必须通过 Blender MCP 制作,保留源文件与可复现脚本。
- 技术栈:TypeScript、Three.js、Vite。1920×1080 为布局基准,等比例适应窗口。
- 视觉与时间轴规范见 DESIGN.md。视频仅用于参考与验证,不能作为产品交互背景。
## 阵列拖动与持续惯性
- 用户要求悬停轻抬,拖动浏览阵列,鼠标滚轮切换列内档案;鼠标与触摸共用原生输入逻辑。
- 用户进一步明确需要类似网页快速滑动的持续惯性:快拖与慢拖按实际松手速度产生不同滑行距离,不能采用固定最多两列/三档的追加距离。松手后持续减速,档案随经过的位置依次切换,接近停止时才吸附;再次按住从当前画面接管。
- 用户最新明确选择自由平面拖动:用当前相机的两条投影轨道共同还原屏幕位移,取消横竖快捷手势和斜向锁轴。一次拖动可随时转弯或反向,两个轨道共同衰减并最终吸附。拖动按实际物理位置选择档案并更新列内记忆;键盘和按钮切列继续恢复该列记忆。
- 已确认的波浪、竖直抽取、归位、列内记忆与循环规则继续沿用。实现与验证见 `verification/ARRAY-INPUT.md`。
## 详情与弹窗过渡
- 详情退出约 180ms,快速返回再进入从当前透明度接续;背景遮罩随实际镜头进度变化。抽取、转正、归位与波浪继续沿用已确认的三维规则。
- 检索、收藏和设置弹窗进入约 300ms、退出约 200ms。退出期间保留节点与背景输入隔离,结束后恢复焦点,再执行选档或重播。
- 详情页签使用 150ms 内容淡入与 180ms 下划线移动;收藏仅更新按钮状态、总数和反馈,保留正文节点、页签及滚动位置。减少动态效果时直接切换。验证见 `verification/UI-TRANSITIONS.md`。
## 标注修订约束
- 用户标注对应原片约 27.60、29.16、31.56 秒;相机校准同时检查端面厚度、空隙和前后排边界。
- 同一档案从阵列升起并进入特写时,仅允许竖直升降,不能把模型向前或横向平移来重新构图;靠近与转向由摄像机完成。初始整组阵列入场及切换档案的轨道移动不属于抽取动作。
- 背景卡片不能随特写进度额外下沉来让出画面。
- 交互模式左右切换五类档案列,上下切换同一列的前后档案;每列至少 8 份可读档案。切列保留该列的选择记忆。
- 预览时卡片抬起 0.4;交互详情升至 4.05(原片时间轴仍为 3.35),只比早先略高,必须保留后方阵列的可见层次。镜头负责左侧构图,右侧展示信息。
- 卡片获得净空后才允许拖拽旋转;收回时保持高度先转正,再下降。被换选的旧卡片也遵守此顺序。
- 阵列与抽出卡片的材质、内部细节必须连续过渡,快速切回正在归位的卡片时保留当前升降状态。
- 标签复用主界面的同一份莱茵生命标志,不使用另画的简笔版本。
## 独立模型查看器
- 用户要求在详情页增加 360° 模型查看、方向键平移、滚轮缩放、拆解和一键重组,先提供可体验的版本。
- 独立查看器沿用既有视觉规范与原生实现流程;部件模型通过 Blender MCP 制作,保留源文件与生成脚本,见 DESIGN.md。
- 阵列中的抽取与归位继续遵守上文约束。独立查看器在自己的场景内旋转观察与分层拆解,关闭后回到原档案。
## 循环档案阵列
- 用户确认:主界面的档案阵列上下切档案、左右切列均可持续循环,画面不出现队列尽头。
- 五类档案、每类八份的内容顺序循环复用;跨首尾仍沿按键方向移动到相邻位置,切列保留该列的档案选择记忆。
- 使用固定的可见窗口与外围卡片补位。归位副本按实际循环位置区分,保留快速重新选中时的运动状态。
- 原片参考时间轴继续使用原来的五列、160 个位置;循环只用于交互阵列。相关实现与验证见 DESIGN.md、verification/LOOPING-ARCHIVE.md。
## 当前动效选择与光影微调
- 用户试用后明确选择原始基线 aeddd8f:选中抬起和波浪同时开始,恢复原有负向波谷与 4.2 阻尼速率。此前去波谷、先抬起后波浪及源点静止方案只保留为对照实验,不用于主界面。
- 用户对比后选择恢复整体基线的颜色与光照。生产场景及独立查看器默认采用 baseline 配置;光影微调只保留为对照实验。见 DESIGN.md。
- 档案序号和列编号使用 Rolling Number,保留两位数;X-001 形式的档案编号与悬停提示使用三位数滚动,X- 前缀固定。连续输入延续当前运动,减少动态效果设置关闭滚动。
## 标题与查看器过渡
- 主界面随选档变化的顶部分类、底部列名、悬停标题与权限标签统一复用主标题的文字滚动。相同内容不重复播放,悬停首次出现直接显示;跨列刻度复用固定八个按钮,保留连续伸缩和各列选档记忆。见 `verification/ROLLING-TITLE.md`。
- 用户最新选择:主档案标题改为类似数字的滚动文字,替代此前快切黑条。直接复用已有库的 `createRollingText`,与编号共享 460ms 时长;使用 direct 模式、各字同时启动、轻微模糊与宽度过渡。文字固定向上滚动,快速输入衔接最新目标;进入详情或减少动态效果时直接显示最终标题。见 `verification/ROLLING-TITLE.md`。
- 360° 独立查看器增加进出过渡。进入约 320ms 淡入,模型载入后约 380ms 轻微展开;退出约 220ms 淡出。退出结束前保留模型与模态焦点,结束后释放并返回原按钮;进入中途按 Esc 可衔接退出。
## 前段 2D 动效逐帧修订
- 用户明确范围:黑底的鹰角网络片头不做,直接从画面变白开始。正常启动和重播从原片 6.76 秒进入;本地对照保持原片时间码。
- 继续使用逐帧分析和原生 DOM/SVG 实现,不启用前端或动效 Skill。2D 时间轴见 `src/boot-motion.ts`,渲染见 `src/boot.ts`;规范与复核见 `verification/BOOT-MOTION.md`。
- 已认可的三维交互、基线颜色和档案阵列时间轴继续沿用。启动标志沿共享标志的同一组贝塞尔曲线连续绘制,缺口通过路径首尾控制,保留与档案标签一致的轮廓。
- 用户进一步要求按原片逐帧修订非线性运动。左上三行分别在 278、280、282 帧滑入,各自加速后减速;圆环半径、弧端、内环与橙点使用独立轨迹,名称黑底快速扫过后长尾收束。测量轨迹见 `src/boot-tracks.ts`;局部放大对照及限制见 `verification/BOOT-MOTION.md`。
- 用户进一步强调两侧小圆主要绕自身圆心旋转并补全弧段;仅保留原片测得的轻微位置收拢。中央大点闪变后缩小,六颗小点错峰绕行。Logo 以连续笔画首尾及移动缺口表现运动,不能替换成整枚标志闪烁;加号与方点同帧展开,方点随后拉成减号。见 `src/boot-orbit-tracks.ts`、`src/boot-logo-tracks.ts`。
## 品牌文字与 360° 导航过渡
- 用户要求放大并叠加原片,校准左上角三行文字。保留 MiSans,三行约 270px 宽;中间一行使用 600 字重,ANALYSIS 按原片字母位置分别校准间隔,OS 右对齐。具体尺寸见 DESIGN.md,叠加页为 `reference/brand-review.html`。
- 360° 查看器的平移、滚轮及加减键缩放均平滑跟随;复位约 560ms,按球面短路径返回。复位过程中输入从当前显示位置接管;减少动态效果时直接到位。仅用于独立查看器。
## 声音实现
- 用户要求依据原视频与莱茵生命相关设定重设计音效和背景音乐。本次实现采用原创三轨循环配乐和 Web Audio 音效,详见 `verification/AUDIO-DESIGN.md`。
- 音效与音乐独立开关、独立音量;保留旧静音偏好。启动声音沿用原片时间码,跳帧不补播;三轨在切场景时连续播放并改变比例。
- 听感尚待用户试听,技术验证不视为用户已经确认声音方向。源谱与音色生成脚本必须保留。
- 用户进一步指定玻璃交互应采用清脆音色。当前音效使用薄玻璃轻碰与短共鸣,切档、抽取、归位及拆组有不同的衰减;保留快速输入时的叠音限制。用户尚未确认本版最终听感。
- 用户明确要求复刻原视频已有的逐字输入音效。输入现在使用三个原片短音(各 38ms),保留来源记录;其他卡片交互沿用玻璃音色。输入节奏跟随真实文字揭示,不把故障闪动恢复当作新输入。
- 用户接受档案切换使用玻璃声,并要求检查 OS 页面打开、Logo 与文字出现的声音。窗口开合、系统操作、启动标志、整块文字及验证反馈采用独立电子音色;玻璃声用于档案实体运动。完整开场试听见 `reference/boot-audio.html`,只临时开启声音,结束后恢复偏好。具体音色尚待用户试听。
## 档案内容维护
- 档案内容独立保存在 `content/archives.json`,页面和 TXT 导出共用;修改步骤见 `content/README.md`。五列保持不变,**每列条数不限**(2026-09-12 起;校验器只要求每列 ≥1、总数 ≥5),编号 `X-0NN` 按顺序稳定、宽度随总量自适应,构建前校验;内容按纯文本显示。
- 2026-09-12:`archives.json` 已改为**生成物**,手写内容在 `content/curated.mjs`,由 `scripts/archive-source.mjs` 扫描 `E:\归档` 后写出,直接编辑 JSON 会被下次生成覆盖。五列、每列八份、`X-0NN` 稳定编号的约束不变,校验规则仅在 `source` 上额外接受 `file:` 链接。
- 同期新增本地归档接入:**LOCAL ARCHIVE** 面板检索归档全部条目并执行移动/复制/解压/新建目录等安全写操作,由只监听回环、带每次启动令牌的 `scripts/archive-service.mjs` 承担;归档变动会自动重建快照。使用与安全边界见 `docs/LOCAL-ARCHIVE.md`,实现与实测证据见 `verification/ARCHIVE-INTEGRATION.md`。该面板与四十条阵列互相独立,阵列的数学与三个消费方(`src/scene.ts`、`src/archive-loop.ts`、`src/data.ts` 的位置映射)未改动。
- 2026-09-12:用户要求把详情页的 EXPORT 按钮(原为下载 TXT)改为直接打开本地文件资源管理器中的文件位置。现为 **SHOW IN FOLDER / 文件位置**,用该档案的真实 `path` 调 `POST /reveal`;服务不在线时提示启动方式而非静默失败。`public/archives/*.txt` 仍会生成但详情页不再提供下载入口。同时修掉详情页脚注的 `file:` 参考链接(浏览器不允许从网页跳转 `file:`),改为显示归档内相对路径文本。
- ⚠️ **以下四条(全量归档驱动 → 修正盘的粒度 → 独立详情导航 → 文件夹即列)已于 2026-09-12 当天全部回退。** 留在时间线里只作历史与教训,**不要再按它们实现**;当前机制以本文件顶部「索引与阵列:当前机制(权威)」为准,回退范围见下文「索引与阵列方案整体回退」。
- 【已回退】2026-09-12:**三维阵列改为全量归档驱动**(用户明确选择"真正的全量阵列")。列 = 归档顶层内容分类(当前 7 列),列内是该分类下全部真实归档条目(合计 49,997 条);标题/摘要/研究记录由索引自动派生,用 Proxy 惰性物化,只给被读到的条目生成文本。四十条手写精选档案降级为**备用数据集**(索引不可用时兜底,应用照常启动)与 TXT 摘要来源,因此 `archive-content.mjs` 的校验器与 `check-content` 的约束**保持不变**。
- `data.ts` 重写为双数据集 + O(1) 预计算寻址(`laneMembers` / `laneOf` / `posOf` / `counts`)。旧实现每次调用全量扫描 + `indexOf`,全量下每次输入事件约 19 ms、一次拖动累计约 1.2 秒(注意:**不是**每帧开销,渲染循环不碰 `records`)。改造后 2000 次寻址 38,365 ms → 0.33 ms。
- 引入**全局行周期**(`rowPeriod()` = 最长一列的条数)解决 rebase 取整:各列长度不同,不存在公共周期,rebase 位移必须是全局周期的整数倍才能保持内容不变。
- `fileAtSlot`(**截断**,服务 boot 与 `?time=`/`review=1` 逐帧对照的固定 160 布局)与 `indexAtCell`(**循环取模**,服务交互阵列)语义不同,不可合并。
- 收藏改按归档相对路径键存放(`recordKey`),否则新增文件导致编号位移会让旧收藏指向别的档案。`#file-ticks` 改为固定 8 个按钮的滑动窗口,避免单列上万条时渲染上万个 DOM 节点。
- 列数参数化:`archive-loop.ts` 新增 `configureLoop()`(`LOOP_COLUMNS`/`POOL_LANES` 改为 live binding,前五项恒为真实列以保证固定 160 布局成立);`archive-visibility.ts`、`scene.ts` 的 lane 原点改用 `laneCenter()`;`motion.ts` 增加 `laneOrigin` 可选参数。`fixed` 路径保持 5 列不变(原片对照基准),正常入场走动态路径,因此阶段之间不跳变。
- 新增自包含回归检查 `npm run check:array`(桩掉 fetch 直读快照,可进 CI),断言反向寻址一致、格子互为逆、rebase 平移不变性、列循环回绕、检索不物化、寻址吞吐。设计与证据见 `verification/ARCHIVE-ARRAY.md`。
- 远距离跳转不再长距离飞行:`scene.ts` 的 `ROW_SNAP_DISTANCE = 64`(可视窗口 32 行的两倍)。超长列上 `nearestOccurrence` 最远会给出半列(约 10,337 行)的目标,超过阈值就让 `shoulder`/`rail` 直接落位、速度清零;只作用于行轴,列轴最远半个列数、保留原动画,拖动/惯性/抽取期间显式排除。阈值两侧由 `check-array` 用真实数据钉住。
- 已知未决:7 列下的实机构图与剔除数值需人工确认(无浏览器自动化环境)。
- 【已回退】2026-09-12:**修正盘的粒度**——用户指出"一个项目就是一个 3D 盘,在盘内的页面可以自由访问所有文件"。此前把**每个文件**都做成一张盘(49,997 张)是错的,会导致列表里全是 `00_索引` 的 CSV/MD/TXT、选中这类列外条目还会错位到第一列的盘上。
- 现在 **盘 = 分类下的第 1 层目录**(项目单元),文件与更深的目录都不是盘。列分布变为 `4 / 2 / 11 / 3 / 4 / 4 / 4 = 32 张盘`,列均衡、可浏览。
- 列外条目(`laneOf < 0`)**不再参与** `searchDataset`,也不会出现在检索列表里——它们的正确入口是所属盘的页面,或 LOCAL ARCHIVE 面板。
- 未输入关键字时,检索列表改为列出阵列成员(各列的盘),不再退回 `records` 开头若干条(那正是元数据文件)。
- 详情页新增 **04 盘内文件** 页签:列出当前盘的直接子项(目录在前),目录可逐层进入并带面包屑返回,文件可直接【打开】【定位】。子项表在 `archive-array.ts` 里惰性建一次(一趟遍历),之后 O(1)。
- 副作用:`ROW_SNAP_DISTANCE = 64`(远距离跳转落位)在盘模型下**处于休眠**——最长列只有 11 张盘,最近同现点最远 5 行。阈值保留以应对日后粒度变化,`check-array` 会报告 `snapEngaged` 的值。
- 2026-09-12:用户要求**开场播完直接进入浏览,不要自动展开头一张盘**。原先 `main.ts` 的 `bootFrame` 在原片时间轴走完(t ≥ 35)无条件 `setMode("detail")`,而「入场详情」属性只在 `isWallpaper` 分支里被读过——网页版没有开关,永远自动展开选中的头一张盘。
- 现在该处改为:网页版 `setMode("archive")`;壁纸版仍按 `openingShowsDetail(openingdetail, workbench)` 决定是否展开,行为不变。
- `?scene=detail`、`?time=`/`review=1` 逐帧对照(frozen time 恒 < 35)、以及"减少动态效果"直进阵列等既有路径都不受影响。
- 2026-09-12:用户要求**去掉开场的"点击进入"门槛、启动即自动播放**,并**把 ENTER SYSTEM 做成右上角不起眼的圆形按钮**,以及 logo 先显示 1 秒再渐出。
- 开场入口序列改为 `beginOpening()`:尝试解锁音频 → logo 停留 `ENTRY_LOGO_HOLD = 1000ms` → 渐出 → 自动 `completeStartup()`。`StartupGate` 不再被引用(`src/startup.ts` 保留但已无调用方)。
- **音频的现实约束**:浏览器要求用户手势才允许启动音频设备,自动开场时 `unlock()` 可能失败。此时本次开场静音,但**不再清空 `prefs.sound/music`**(原先 `completeStartup(silent)` 会写死静音偏好,自动开场下那样做等于擅自关掉用户的设置);改为 `armAudioUnlock()` 在首次 `pointerdown`/`keydown` 时补解锁,音乐与后续交互音效接上。开场自身的音效在那种情况下会是静音——这是浏览器策略,不是缺陷。
- `completeStartup()` 去掉了 `silent` 参数;`?time=`/`?review=1` 逐帧对照不加 1 秒停留,避免影响对照工具。
- `.skip` 由文字按钮改为 46px 圆形(`right: 38px; top: 30px`,`opacity: .3`,hover/focus 提到 1),`data-action="skip"` 不变;不再在开场结束后抢焦点。移动端的 `.mobile-entry` 保持原样。
- 【已回退】2026-09-12:用户指出**盘内的文件打不开详情页**——只能看盘(列内成员)的详情。原因是详情页绑在阵列选中项 `selected` 上,而列外的文件/子目录没有盘位(`laneOf < 0`),`fileLocation` 会退化成第一列的盘。
- 引入**独立的详情页导航状态** `detailEntry`(-1 = 跟随阵列选中项),`detailIndex()` 统一取当前应展示的条目。`renderDetail` / `overview` / `setTab` / `contentTab` / `toggleSaved` / `revealSelectedArchive` / 页脚编号全部改用它;`updateSelection` 仍用 `selected`(它渲染的是阵列选中盘的界面)。
- 新增 `openEntryDetail(index)`:详情页可切换到**任意**条目(盘或盘内文件/目录)。盘内文件列表与检索命中里都加了【查看】按钮;面包屑逐级可点,点上级目录即打开那一级的详情页,实现"返回上级"。
- `select()` 与 `setMode("archive")` 都会把 `detailEntry` 复位为 -1,避免回到阵列后再进入时还停在上次看的那一层。
- 顺带修正:`SHOW IN FOLDER`(`revealSelectedArchive`)现在作用于**当前查看的条目**,因此盘内任意文件都能直接在资源管理器中定位。
- 【已回退】2026-09-12:用户进一步明确阵列层级——"**每一个文件夹一个横列,里面的每一个文件就是一个盘;子目录也算盘,可以在详情里继续查看子目录里的文件**"。
- 现在 **列 = 分类下的第 1 层文件夹**(32 列,按路径排序);**列内成员 = 该文件夹的直接文件(盘)+ 直接子目录(项目,同样是盘)**。子目录盘点开后进详情页,用「盘内文件」页签继续往下看,可逐层进入。
- **为什么子目录也要进列**:只放文件的话,`02_游戏/Minecraft` 这类只有子目录的文件夹会既不是列、也不是盘 → **从阵列里彻底消失**(实测 32 个文件夹里有 11 个是这种)。把子目录也算作盘之后 **空列为 0**,所有文件夹都在阵列里可达。
- 实测分布(`check:array`):32 列 / 435 张盘 / 0 空列;最多 251、中位 2、最少 1;10 列只有 1 张盘。列内循环由 `indexAtCell` 的取模保证(到末尾回到第一张)。
- 修复一个被 32 列暴露的真 bug:`archive-loop.ts` 的 `poolCell()` 直接取 `POOL_LANES[floor(index/LOOP_ROWS)]`,而 `selectedSlot = laneCenter()*32+12` 在 32 列下是 508 → 下标 15 越界(`POOL_LANES` 只有 9 项)→ 模型坐标变 `NaN`。已改为按 `POOL_LANES.length` 回绕。
- 副作用:`ROW_SNAP_DISTANCE = 64` 的保护**重新生效**(最长列 251 张盘,半列跳转 125 行 > 64,`snapEngaged: true`)。
- 2026-09-12:**索引与阵列方案整体回退 + 每列条数放开**(用户原话:"你把索引机制完全改坏了,直接退回到原版")。上一条 ⚠️ 标注的四条全在此次回退范围内,本节是它们的收尾。
- **删除**:`src/archive-array.ts`、`scripts/check-array.mjs`,以及 `package.json` 里指向它的 `check:array` 脚本项(那个文件没了以后 `npm run check:array` 只会报缺文件)。**还原**:`src/data.ts` 回到 38 行原版(`columnFiles` / `fileLocation` / `fileAtSlot`);`src/archive-loop.ts`、`src/archive-visibility.ts`、`src/scene.ts` 的 `laneCenter()` / `configureLoop()` / `rowPeriod()` / `ROW_SNAP` / lane 原点全部回到原版;`main.ts` 里依赖它的 `detailEntry` 独立导航、盘内文件页签、检索分支一并移除。**保留**(用户单独要求过,与阵列无关):LOCAL ARCHIVE 面板、`POST /reveal`、SHOW IN FOLDER、`beginOpening()` 自动开场、圆形 `.skip`、boot 结束进 `archive`、退出系统。
- **每列条数已放开到不限**:`scripts/archive-content.mjs` 只要求"每列 ≥1、总数 ≥5"(原为恰好 5 列 × 8 条),`idWidth = Math.max(3, String(records.length).length)` 让编号宽度随条数自适应(1200 条时是 `X-0001` 而不是溢出到 `X-1000` 变四位)。`data.ts` 的 `slot: lane * 32 + (row % 32)` 是配套的防串列护栏(见顶部坑 1)。
- `scripts/check-content.mjs` 相应改判:原"列数不均衡""缺记录"两个用例换成"空列"(`/至少要有一条档案/`)与"条数过少"(`/至少需要每个分类一条档案/`),并新增两条正向用例——不等长列(1/12/5/2/9 = 29 条)与 1200 条(钉住 id 宽度补齐)。**20 项全绿**。
- 全量方案带来的**盘内文件浏览、按路径收藏、列数参数化**能力随之失去,这是用户明确选择的取舍,不要再"顺手恢复"。要扩内容请往 `content/curated.mjs` 加条目(原因见顶部坑 4)。
- **顺带修一个交互 bug**:刻度条窗口化在 8 条短列上把顺序整体转位成 `5,6,7,8,1,2,3,4`、高亮卡在正中(用户反馈"切换列左边的切换文件滑条坏掉了")。`main.ts` 的 `tickWindow()` 现在对 `len <= TICK_WINDOW` 走自然顺序分支,见顶部坑 2。
- **新增右上角退出系统**(`#exit`,46px 圆形 `⏻`,与开场 `.skip` 同坐标切换):白屏 + logo(**不闪动**)→ 字符本体明灭(`shutdownFlicker`)→ 黑条从左扫到**完全覆盖字体**为止、**不向右滑出**(`shutdownSweep` 的 keyframes 只到 `inset(0 0 0 0)`)→ `SHUTDOWN_CLOSE = 880ms` 后 `window.close()`,关不掉时退化为纯白页。CSS 时序集中在 `style.css` 的 `.shutdown` 段,详见顶部「开场与退出的入口序列」。
- ⚠️ **验证边界**:本机没有浏览器自动化、也没有无头 WebGL 环境,下面这套自检只能证明工程能构建、数据结构自洽,**不能证明动画观感**。退出序列、开场铺屏、刻度条观感这类结论必须由用户实机确认后才算通过。
- **自检命令**(注意 `check:archive` / `check:loop` **没有** npm script,要直接用 node 跑文件;`check:content` 才是 npm test 形式):
```powershell
npx tsc --noEmit # 类型
npm run check:content # 档案数据校验(20 项)
node --experimental-strip-types scripts/check-archive.mjs # 相机/抽取几何
node --experimental-strip-types scripts/check-loop.mjs # 循环阵列
npm run build # prebuild 会先跑归档快照 + 校验 + 字体
```
- `verification/ARCHIVE-ARRAY.md` 已标注为**存档**(描述的是被回退的方案),不要照它实现。
- 2026-09-12:**归档重组 + 精选档案扩到 47 条 + 回归检查去掉写死条数**。用户指示"不要老是问我,你来下最优决策",于是把两件挂起的事一起做了。
- **归档侧重组(18 项同盘 rename,零数据丢失)**:把纯货架内容上提到分类一级(`01_人工智能\01_训练产物\*`、`02_数据集\*`、`05_媒体\02_视频\*`、`03_截图\*`),并压平两类同名套娃——`07_日志与排查\下载日志\X.log\X.log`(5 份)、`ArmouryCrateInstallTool\ArmouryCrateInstaller_3.3.6.0\ArmouryCrateInstaller.exe`、以及 `03_代码与项目\{opencode-dev, awesome-design-md-main, CangjieCommunity-main, mc-bots-main}\<同名>\`。完整清单与回滚办法在 `E:\归档\00_索引\重组计划-*.json`,约定写在 `E:\归档\AGENTS.md` §3.3 与 §3 决策表。
- **守恒已核对**(拿重组前的 `archive-index.json` totals 对比):文件 +2(两份计划文件)、目录 −15(11+4,全是搬空的)、字节 +5,207(计划文件 + 账目行),归档内容零丢失。
- `content/curated.mjs` 里 X-001 / X-002 / X-003 的 `path` 随之上提,`department` 改为 `01_人工智能`;X-039 的摘要改成"五份日志"(原来描述的是目录套娃,已被压平)。
- **精选档案 40 → 47**:补上此前**完全没有精选档案覆盖**的真实大件——NM2 原版权重(6.7 GB)、V2_dpskw 备份集(13.9 GB)、设计资料集、darwin 客户端、musicbase 曲库、录屏片段、`00_索引` 自身。编号接在 X-041…X-047,**既有编号一个没动**(校验器要求 `id === X-{index+1}`,所以只能追加)。五列现在是 **8 / 9 / 11 / 9 / 10**,这是**刻意不等长**,用来证明"每列不限"真的生效,不是数据错乱。
- **`check-archive.mjs` / `check-loop.mjs` 里写死的 40 与 8 已拔掉**(它们正是坑 1 的翻版:改了条数就崩)。现在从数据推导:`documents` / `perColumn` / `maxPerColumn` 如实输出,只保留真正的契约断言(每列 ≥1、总数 ≥5、列内槽位不冲突;`slot` 复用在单列 >32 条时才允许)。`check-loop.mjs` 的 `files[wrap(row - 12, 8)]` 改成 `files.length`。
- 全套自检:`tsc` 0 · `check:content` 20/20 · `check-archive` 0(47 条 / maxPerColumn 11)· `check-loop` 0(20000 次定向移动)· `build` 0(825 files / 33.9 MiB)。
## 正式功能提交与同步
- 用户授权:非实验性质的正式功能完成相关验证后,直接提交并合并到主分支,或提交后同步到对应远程分支,无需再次询问。
- 当前已经位于主分支时,可直接提交并推送;在功能分支上则按项目分支状态完成合并与同步。
- 提交应聚焦当前任务;同一工作区中尚在进行或等待用户确认的其他工作,保留原状,不混入正式功能提交。
## 解密与清晰内构
- 用户要求参考原片 41 秒正面与 46–51 秒多角度制作内部结构,并省略左侧三根高塔。模型继续通过 Blender MCP 生成,保留共享脚本与源文件。
- 详情打开后由磨砂变清晰,解密线按原片 34–39 秒沿同一物理对角线合拢、保持、向中央收束,采用非线性运动。交互压缩时间,原片对照使用原时间码。
- 360° 查看器可切换清晰/磨砂,切换不改变视角或拆解状态;返回详情保持解密,退回阵列恢复磨砂。
- 长焦主场景近裁剪面为 5,以避免薄层内构深度冲突;保持原镜头和构图。验证见 verification/DECRYPTION.md。
## 内部模型的锐利截面(历史方案,已撤回)
- 用户要求内部环形模型更锐利,采用半透明磨砂质感,并打磨两环的连接处。内构沿圆周平滑,屋面、侧壁和切边之间保留硬法线;不再用多层圆角制造体积。
- 两环通过一条切向接入、两端略展宽的连续薄片连接;内部仍完全容纳在盖板与基板之间。外壳几何与法线保持原样。
- 源脚本为 art/internal_architecture.py;打磨前后与装配状态对照为 reference/internal-review.html,验证见 verification/INTERNAL-OPTICS.md。
## 外壳结构与磨砂揭示
- 用户要求黄色方块位于顶边并与外壳齐平,去掉左侧黄色竖条;螺丝仅保留右上与左下两处。
- 外框刻线与螺丝周围的压槽全部置于盖板后。解密前整面磨砂,原片 38.84–39.56 秒由顶部向底部逐渐变清晰;上下半清晰差异只出现在移动过程,不能保留固定高度的清晰渐变。
- 外壳细节通过 Blender MCP 制作,共用 art/shell_reference_details.py。新外壳保持既有内构顶点及法线,验证与对照见 verification/SHELL-REFINEMENT.md。
## 第一版内构恢复与轻磨砂
- 用户明确选择对照页左侧的第一版完整内构,来源为 89c7742 与 reference/internal-study/assembly-before.glb。恢复其两环截面、双连接带、平滑法线和原始白色/橙色材质;此前锐利截面、单连接片和追加内圈细节均已撤回。
- 通过 Blender MCP 重新生成单体与拆解资产,保留 art/internal_architecture.py 和两个 .blend 源场景。已修订的外壳继续使用 art/shell_reference_details.py。
- 选中盖板粗糙度为 0.42,并将折射模糊范围限制在投影盖板高度的约 1.6%,避免小尺寸预览过度模糊。自上而下揭示、阵列参数和完全清晰端点继续沿用。
- 原始内构与当前内构对照见 reference/internal-review.html;验证见 verification/RING-TEXTURE.md。
- 用户查看恢复后的版本与磨砂修正后反馈‘效果很不错’,确认保留本版。
## 屏幕比例与触摸适配
- 用户授权按桌面不同比例、手机横屏、竖屏构图与触摸、实机性能校准的顺序完成适配;实机目标为 iPhone / Safari。继续采用本项目原生实现流程,不启用前端或动效 Skill。
- 逐帧对照保留 1920×1080 舞台,完整等比展示;用户于 2026-09-10 追加要求正常登录入场铺满实际视口并移除字幕。交互阶段按实际视口布局。16:9 为视觉基准,桌面延展阵列,竖屏上方模型、下方独立滚动正文。
- 镜头适配不能改变抽取高度、模型横向/纵深坐标、波浪、归位规则与基线材质。竖屏预览镜头也不能跟随卡片实时升降或轨道位置抵消运动。
- 触摸在阵列区域左右切列、上下切档;详情获得净空后可单指检查,360° 查看器单指旋转、双指缩放和平移。正文滚动与场景手势隔离,旋转屏幕保留当前选档、视角与拆解状态。
- 画质仍采用已有用户设置与原始默认值;不得以手机类型直接切到删减光影的性能档。实机校准必须区分真实 iPhone 数据、桌面 WebKit 兼容性检查与 Chromium 视口模拟。实现见 `src/viewport-layout.ts`、`src/responsive.css`,验证见 `verification/RESPONSIVE.md`。
## PWA 与线上入口
- 用户要求增加 PWA,以便 iPhone 从主屏幕进入独立窗口;沿用现有 Vercel 项目与正式域名 https://rhine.lubeiluchen.cc/,README 保留在线入口。
- 正式构建缓存完整资源版本,更新下载失败时保留旧版。新版本准备好后由用户在设置中更新并重启,不中断当前浏览;保留收藏和偏好。
- 开发模式不注册 Service Worker。图标复用项目共享品牌路径;主屏幕安装、离线与更新说明见 `docs/PWA.md`,验证见 `verification/RESPONSIVE.md`。
- 针对 Win11 Chrome / Edge 的反馈,设置图标保留可见“设置”文字,新版本提供可直接点击的更新入口;`update.html` 从网络获取,用于旧版页面无法找到更新按钮时恢复,不清除收藏或偏好。
- 动态效果默认遵循系统偏好,设置中明确说明跳过开机和简化选档的影响,并提供“启用完整动效并重播”。本站明确选择优先于系统默认,正文解密遮罩也遵循同一设置。验证见 `verification/PWA-RECOVERY.md`。
## 字体分包与开场启动(issue #6、#7)
- 用户于 2026-09-10 明确批准:比较 `misans` 与 `misans-webfont` 第三方分包,在确认加载收益和显示效果后替换官方整包。本项目允许采用第三方 MiSans 分包,此明确授权覆盖此前禁止第三方分包的全局默认;保留字体署名、许可、来源和固定版本记录。
- 分包随项目同源部署,按页面字符加载;保持现有 MiSans 的字形、字重映射与排版。PWA 仍缓存完整版本,避免新档案或离线检索缺字。
- 比较后采用 `[email protected]`,字体 4.003;固定版本与源哈希保存在 public/fonts。品牌三行宽度按基线重新校准,首次入口字体约 415 KiB。选择依据、完整离线体积取舍与验证见 `verification/STARTUP-LOADING.md`。
- 开场等待用户点击、轻触或键盘启动,解锁声音并完成准备后统一开始音画;保留静音和减少动态效果偏好,加载失败提供重试与无声进入。
- 用户授权完成验证、提交及同步后,回复 GitHub issue #6、#7 并关闭它们。
## 桌面工作台(实验)
- 用户于 2026-09-10 批准在同一壁纸中切换档案展示与实用工作台,首版为时间日期、三条今日事项、重要日程倒计时、系统媒体信息与专注计时。沿用既有原生实现、视觉和 Blender 资产。
- 模式与事项内容、日期、计时时长从 Wallpaper Engine 属性读取。事项完成状态每日重置,专注计时按绝对截止时间恢复;这些进度独立存储,不受宿主声音与画质覆盖。
- 用户提出把玻璃档案交互用于真实文件夹。本次仅评估可行性,尚未授权安装本地桥接服务;研究见 docs/DESKTOP-FOLDERS.md。
- 用户于 2026-09-10 要求工作台严格沿用原主页设计,撤回首版绿色强调色与有底色的面板。采用原主页近黑/暖灰、细线与竖线刻度,规范见 DESIGN.md。
## 工作台显示内容与纯净效果
- 用户于 2026-09-10 决定将纯净效果与工作台合并,通过按需隐藏元素配置画面,不另建纯净模式。
- 七项显示开关全部位于 Wallpaper Engine 壁纸属性:时钟日期、今日事项、右侧功能内容、底部功能导航、品牌文字、页脚信息、设置入口。默认全部显示,仅影响工作台交互阶段;开场与档案展示沿用原样。
- 用户明确允许隐藏设置入口,恢复通过 WE 属性完成。壁纸内不提供另一套临时显示开关。隐藏内容不清除任务状态或停止专注计时。
- 音乐频谱、自动演出和小游戏仍为讨论中的后续方向,本次显示配置不代表已实现这些效果。
## 明暗配色(壁纸实验)
- 设置及 Wallpaper Engine「入场与画面」分组提供亮色/暗色,默认亮色。暗色采用石墨背景、烟灰玻璃、暖白文字与琥珀标记,沿用原生实现。
- 切换时以当前档案为起点,沿行列依次改变卡片材质;背景与文字同步渐变。中途反向从当前颜色接续,减少动态效果时直接到位。
- 详情解密后盖板恢复清透,内部结构保持可读;查看器、工作台与开场共同使用配色。实现与验证见 verification/THEME.md。
- 用户要求静止呼吸可独立开关,且「始终归齐」也可生效。WE 工作台显示分组新增该开关,默认开启;音乐时淡出、静音后恢复。用户认为现有音乐律动杂乱,已提出鼓点主导宽波的后续方案,当前未替换音乐算法。
- 用户批准原版、鼓点宽波和整组轻抬三种音乐律动并列试用;WE 属性中选择,默认保留原版,尚未决定最终方案。原有呼吸开关继续独立生效。
## 自适应阵列与暗色雾气
- 用户要求解决边角露出阵列尽头,并将屏幕外档案裁剪、按屏幕覆盖范围动态决定数量作为同一任务。
- 交互阵列按当前实际镜头与视口计算候选范围,逐实例裁剪并紧凑提交;替代固定 9 列 × 32 行的交互窗口。显式原片对照继续保持原来的 160 个位置。
- WE「入场与画面」提供自动标准余量/自动额外余量,默认标准。余量包括边缘预留、卡片完整高度和附近阴影贡献;相同宽高比与构图不因像素数量增加而复制更多档案。
- 暗色采用可见灰雾,并加强顶部、底部和边缘淡出。连续循环、点击、抽取、归位与原片对照回归见 verification/ARRAY-COVERAGE.md。
## 工作台衔接与连续频谱修订
- 用户要求删除媒体无进度与本机时区说明,修复暗色刻度、重播悬停和接力退出与设置的重叠。工作台开场隐藏选档标签,Powered 淡出;工作台与档案展示均保留退场过渡。
- 用户比较后保留原版律动为默认,撤回鼓点 A 与整组轻抬 B。重做 A 为按屏幕从左低频、中间中频到右高频的持续频谱,B 为持续层叠流波,两者均响应持续音乐。新 A/B 待试用。
- 正常开场同样动态覆盖实际视口,只有显式逐帧对照保留 160 个档案位置。实现与复核见 verification/WORKBENCH-REVISION.md。
- 媒体信息各通道独立更新:不能在歌曲文字回调中删除封面或进度。保留先封面后文字、同封面切曲与播放器切换;只有相应通道的显式空值替换旧状态。见 verification/WORKBENCH-REVISION.md。
- 用户进一步要求游戏模式进出也有过渡:工作台淡出、游戏信息进入,退出反向衔接;快速打断延续当前状态,退场期间保持输入隔离,完成后恢复焦点,减少动态效果直接切换。
## UI 视差与画面质感(壁纸实验)
用户明确要求仅 UI 产生 HUD 曲面视差,壁纸三维镜头不随被动鼠标移动。按参考项目的镜头畸变思路,UI 各区域以共同径向曲面投影到不同梯形;独立「鼠标追踪」关闭后保留静态形状。WE「HUD 与画面质感」提供曲面纵深、全局屏幕效果、局部界面磨砂底,三项默认关闭,强度可调。
用户追加明确:色散、暗角与颗粒处理最终全局合成,覆盖 UI、三维画面和弹窗,替代此前仅三维画布的 ShaderPass。颗粒增加尺寸控制;减少动态效果时冻结颗粒并停止鼠标追踪,静态曲面仍可保留。开场无 UI 视差,全局屏幕效果同样可见。磨砂底随 UI 投影。继续原生实现,见 verification/VISUAL-EFFECTS.md。
用户追加要求 UI 上、下、左、右四边距分别使用滑杆,并纠正为允许负数。WE「界面边距」提供四个 −300~300px 的独立偏移,默认 0;正值内收,负值外扩,抵消舞台缩放。仅调整交互 UI 布局,三维画布保持铺满;支持曲面与磨砂。实现与验证见 verification/UI-INSETS.md。
2026-09-10 修订:曲面纵深、细颗粒、颗粒尺寸、边缘色散、暗角的默认数值统一为 20。下边距不再缩短桌面工作台的中部定位容器;底部导航和页脚先上移,实际接近中部内容时才推动对应内容,上方品牌限制继续上移,空间不足时内容独立滚动。手机窄屏继续采用原有纵向滚动布局。
WE 新增「工作台 · 可用功能」,时间日期、今日事项、重要日程、正在播放、专注计时各自可开关,默认全开。关闭功能同时移除其右侧内容入口和底部按钮;当前项关闭时选择首个仍开启功能,全关时隐藏右侧内容和导航。左侧时钟与事项仍由原显示开关控制,任务和计时状态保留。用户明确要求自行验证,本轮仅完成实现和构建打包,未进行运行时与视觉验收。
2026-09-10 后续修正(覆盖上述中部避让方案):用户明确下边距只移动底部两排,排间距固定,中部组件不压缩、不滚动。已删除 workbench-insets 自动避让;工作台高度不再随下边距变化。底部导航、游戏入口与页脚在曲面投影之后使用相同 translate 偏移。另修复 :is 内 ID 提高优先级导致原规则覆盖,以及减少动态效果的隐式 all 过渡污染曲面测量的问题。Edge 实际页面完成 1920×1080、2560×1440、1600×900,曲面 0/20/80,下边距 60/192/300/−80/0,共 45 组检查:中部坐标及尺寸固定,无新增 overflow,底部各行位移一致。画面对照与数据见 verification/ui-insets/。
WE「入场与画面」新增暗色专用开关「暗色模式仅选中档案标签使用强调色」,默认关闭保留现有选择。开启后阵列与归位档案的顶边标签使用暗色,当前选中档案保留琥珀强调;浅色不受影响。通过既有材质 uniform 实现,无新增网格与绘制通道,暗色开/关及浅色截图已检查。
## 超级性能模式与自定义画质
用户于 2026-09-10 要求低配壁纸模式与减少动态效果独立,并恢复 WE 原生自定义画质。新增「超级性能模式(保留动态效果)」开关,默认关闭;开启时以独立的有效画质覆盖已保存画质,不改减少动态效果、宿主帧率或音乐律动设置,关闭恢复当前预设/自定义配置。
超级模式:三维比例 60%、DPR 上限 1、总像素不超过 921600;关闭阵列阴影、AO、景深和 SMAA,直接输出主场景;背景阵列使用无折射、无清漆材质并隐藏小螺丝,选中/详情模型保留完整结构和低分辨率折射。全局屏幕滤镜暂时停用,文字磨砂改为无模糊底色,HUD 曲面与追踪继续运行。DOM 文字不降低分辨率。
WE 画质下拉增加「自定义」,仅此选择且超级模式关闭时显示九项控制:渲染比例、像素密度、抗锯齿、阴影、AO 采样、AO 分辨率、景深、透明材质分辨率、纹理过滤。连续参数用滑杆,离散参数用原生下拉。部分宿主回调保留其他参数;超级模式开启期间保留自定义更新,关闭恢复最新配置。完整证据见 verification/SUPER-PERFORMANCE.md。
## 三维资源开关与自定义壁纸
- 用户于 2026-09-10 授权在左下 SESSION 右侧增加 3D 开关:档案错峰下落退场后实际释放全部三维场景、查看器和 WebGL 资源;再次开启重新加载并从下方逆向升起,保留选档。关闭途中可反向恢复,减少动态效果时直接切换。
- 3D 退场、关闭与载入期间隐藏游戏入口及模型专用入口;重新开启按原显示偏好恢复。2D 工作台和正文继续可用。
- WE「入场与画面」增加可选自定义壁纸,默认不启用;用户选图后,仅在三维资源释放后淡入。重新载入成功时图片淡出,失败保持图片并允许重试。沿用原生实现,见 verification/THREE-RELEASE.md。
- 用户明确保留三种音乐律动并列选择:原版、连续频谱、层叠流波。原版仍为默认,不再标为待定 A/B。
- 修复壁纸自身交互声音触发音乐归齐:静音状态抑制本地音效引起的新频谱活动,已建立的音乐继续响应。全部归齐时取消标签强调,暗色仅选中强调随实际升降连续过渡,见 verification/SELECTION-STATE.md。
## 创意工坊发布准备
- 用户于 2026-09-10 曾授权发布,随后明确改为自行操作发布,代理负责 GIF 和操作说明;当前尚未上传。
- 正式名称为 Rhine Lab · 莱茵生命交互桌面,去掉“本地测试”。独立正式工程放在 Wallpaper Engine 的 myprojects/rhine-lab-workshop,保留之前本地试用工程。
- 预览参照用户指定的 3088099655 预览的全景/局部剪辑方法,素材全部来自本工程工作台实际运行画面。最终 GIF 256×256、13.2 秒,含时钟事项、专注与明暗切换;没有将参考壁纸的图片放入发行包。
- 发布操作和后续更新须保留 workshopid,见 docs/WORKSHOP-PUBLISH.md;预览来源与验证见 verification/WORKSHOP-PREVIEW.md。
- 用户要求增加「启动时加载 3D」WE 属性,默认开启;关闭时只播放前段 2D 入场并进入组件页,不创建三维场景,左下可手动加载。属性下次加载生效。自定义图片在 2D 开场后显示,支持 WE 编码盘符和失败后同路径重试。见 docs/WALLPAPER-ENGINE.md。
- 用户要求自定义壁纸上下遮罩范围可调:WE 图片设置下新增 0–100 滑杆,默认 100,0 完全关闭遮罩;仅自定义图片显示时生效,沿用原生实现。见 docs/WALLPAPER-ENGINE.md。
- 用户要求改善无遮罩图片背景下浅色页脚按钮的对比,并将既有滚动库应用到时钟、播放器时间及切歌文字。使用原生实现与现有 createRollingText,460ms direct,媒体原位更新,减少动态效果直接显示。见 docs/WALLPAPER-ENGINE.md。
- 用户撤回额外白底的可读性方案:删除页脚新增底色与外扩阴影,仅调整底部导航、待办、提示及按钮的文字颜色;原玻璃背景和模糊参数保留。
## 壁纸功能回合主分支(2026-09-11)
用户明确授权评估兼容性后更新 main,覆盖此前不合并主分支的实验限制。共用暗色主题、自适应阵列、开场铺屏、滚动数字修复与资源管理进入网页;超级性能模式适配为网页持久化设置,默认关闭,独立于减少动态效果。工作台、系统音频/媒体、HUD 属性、自定义图片与 3D 卸载入口仍仅在 wallpaper 构建启用。普通网页保留启动声音解锁、键盘与触摸、PWA 和自定义画质。继续沿用原生实现流程。验证见 verification/WEB-INTEGRATION.md。
- 2026-09-11:用户要求开启 HUD 时开场同样应用曲面与鼠标追踪,覆盖此前开场无 UI 视差的限制。Logo、验证文字、圆环和欢迎画面按当帧原始动作叠加投影,品牌与 Powered 共用同一曲面;切换阶段保留深度与指针跟随状态。磨砂底仍仅交互阶段启用。见 verification/BOOT-HUD.md。