VOZEB-COMPONENT-FOUNDATION-R1 — OceanWay 可复用组件增量候选
Task ID: VOZEB-COMPONENT-FOUNDATION-R1
目标用户结果: 在 VOZEB React/Next 项目内形成可独立复用、可在组件实验室审查的 Ocean 原子组件
Base SHA: db32a44b25b55d3d04ea6f8e7e5ac00596b87fef
允许修改: web/src/components/ocean/**、web/src/components/ui/component-manifest.*、
web/src/app/components/**、web/src/app/styles/**、组件测试、组件说明文档
禁止修改: retail-platform、User Web/Vue、API/领域契约、路由整合、Canvas/Space 迁移、生产配置
状态: DESIGN_CANDIDATE / REVIEW_REQUIRED / NOT_FROZEN1. 本轮边界
本候选只在 oceanway-vozeb 的 React/Next 工作区构建视觉组件。retail-platform 仅作为
领域内容参考,不是本候选的代码来源,也不在本候选中修改。组件只接可序列化 props、
children 和 callbacks;不读取 store、router、session、API、模型、积分、账务或持久化事实。
Canvas、Drama、Works、Community 和旧 User Web 页面仍是来源清单中的 domain/legacy 对照, 不因本候选而恢复或整合。它们的视觉 kit 可以在实验室中展示,但不代表相应产品页面已迁移。
2. 当前清单
component-manifest.ts 是唯一登记入口。当前总数为 235:
| readiness | 数量 | 含义 |
|---|---|---|
| built | 89 | 已有 Ocean 视觉实现,可作为候选复用;不等于业务页面已接入 |
| candidate | 41 | 保留来源细节,仍需页面 owner 或 view-model 解耦 |
| domain | 94 | 携带业务/Canvas/Admin 状态,不下沉为无业务原子 |
| controller | 9 | hydrator、controller 或副作用边界,不是视觉组件 |
| legacy | 2 | 仅保留兼容/历史对照 |
| planned | 0 | 暂无未登记的后继 kit;新增 kit 必须先登记 |
React Bits 来源共 27 项(extract 15、reference 12、direct 0),固定快照为
1ba7ecd4e570d20392fb62c923efb00f5b440642,许可证与来源见
web/THIRD_PARTY_NOTICES.md。
3. 本轮新增/收口
OceanNotice:成功、信息、警告、错误和权限提示;由调用方控制 action/dismiss,不创建全局 toast。OceanTooltip:CSS-first hover/focus 提示,向可聚焦触发器写入aria-describedby,无全局监听器。OceanSwitch:受控/非受控role=switch设置项,轻量 thumb 过渡可在偏好下静态化。OceanCheckbox:原生 checkbox、描述和indeterminate语义,保留浏览器键盘/表单行为。OceanGlassCard:支持 renderer-neutralmaterial覆盖(blur/saturation 等),仍为 CSS-only, 不创建 SVG/WebGL context,也不增加第二条边框。/componentsFoundation Lab:增加四个原子真实交互预览;所有 manifest 条目仍有data-component-preview契约骨架,未构建条目不会被隐藏。- Component Showcase:材质参数中的 SVG channel split 改用
OceanSwitch,避免页面专用开关样式漂移。
4. Ocean / React Bits 使用规则
- Ocean Air 与 Abyss 共用语义 token;组件内不写死蓝色正文或独立 dark 色板。
- 页面级背景只允许一个 renderer;
MoltenMetal仅实验室候选,SlicedWaves仍是 metadata。 - Spotlight、Tilt、Magnetic、GlareHover、AnimatedList、ClickSpark 等只作用于局部交互/媒体; 不在列表中创建 renderer 或 React state render loop。
- BlurText、GradientText、ShinyText、RotatingText 只用于短标题/副文案;账务、价格、余额和用量 等事实不使用插值动效。
- 所有新增组件声明
prefers-reduced-motion、prefers-reduced-transparency和forced-colors回退;玻璃材质缺少 backdrop-filter 时提供不透明 surface。
5. 证据与缺口
本候选已在独立组件工作树完成以下验证(2026-08-28):
定向组件测试:5 files / 22 tests passed
全量 Vitest:514 files passed、4 files skipped;2328 tests passed、9 tests skipped
pnpm exec tsc --noEmit --pretty false:passed
pnpm exec eslint . --quiet:passed
pnpm exec prettier --check .:passed
pnpm run check:release:passed(含 lint、Vitest、tsc、隔离 Next build)
pnpm build:passed;静态页面 63/63
git diff --check:passed独立开发服务器 http://127.0.0.1:3010/components 的浏览器复核结果:桌面 1280px 无横向
溢出(scrollWidth === clientWidth),单一 canvas 背景实例,玻璃表面与四个新增原子均
可见;Switch、Checkbox、Notice dismiss 和 Tooltip focus/hover 均可交互;深色主题可切换且
正文使用 Ocean 中性 token;390px 下切换为移动壳层、无横向溢出,导航抽屉可打开;两帧间隔
900ms 的截图差异为 66,948 bytes,确认实验室动态背景确实在渲染。浏览器控制台无 error/warn。
prefers-reduced-motion: reduce 与 prefers-reduced-transparency: reduce 的媒体查询均命中,
新增原子提供静态 CSS 回退;WebGL 不可用时的全局静态回退沿用既有 Foundation 实现与测试。
尚未完成的事项:
- 89 个 built 仍是视觉候选,不代表产品页面和业务 adapter 已接入;本会话不做整合。
- 94 个 domain 与 9 个 controller 只展示契约骨架;它们需要后续具名业务任务,不在此候选下沉。
- 完整组件库的正式 Testing/Operations 结论仍需独立任务;本候选不提升为 FROZEN 或 Gate 1 通过。
- 新 User Web 页面(Models/Keys/Usage/Wallet/Notifications 等)只在后续产品/契约冻结后消费本库。
6. 交接状态
交接时使用:
git rev-parse HEAD
git show --format=%T --no-patch HEAD
git status --short只提交本文件列明的组件白名单;不得使用 git add .,不得把 retail-platform 或其它并行
工作树 dirty 文件带入候选。收到新的用户视觉确认前,保持
DESIGN_CANDIDATE / REVIEW_REQUIRED / NOT_FROZEN。