370 lines
53 KiB
Markdown
370 lines
53 KiB
Markdown
# 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。
|