Files
rhinelab-ui/AGENTS.md
T

53 KiB
Raw Blame History

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 都起不来

改完怎么自检(改了阵列/内容/场景就跑这一套)

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 形式):

      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。