auto-save 2026-05-15 19:02 (~5)
This commit is contained in:
@@ -1,11 +1,5 @@
|
||||
{
|
||||
"entries": [
|
||||
{
|
||||
"files_changed": 3,
|
||||
"message": "Codex 会话活跃 · 最近命令:codex · 3 项未提交变更 · 最近提交:auto-save 2026-05-14 03:03 (~3)",
|
||||
"ts": "2026-05-13T19:08:49Z",
|
||||
"type": "session-heartbeat"
|
||||
},
|
||||
{
|
||||
"files_changed": 3,
|
||||
"hash": "79b3f79",
|
||||
@@ -3256,6 +3250,13 @@
|
||||
"type": "session-heartbeat",
|
||||
"message": "Codex 会话活跃 · 最近命令:codex · 2 项未提交变更 · 最近提交:auto-save 2026-05-15 18:51 (~1)",
|
||||
"files_changed": 2
|
||||
},
|
||||
{
|
||||
"ts": "2026-05-15T18:57:08+08:00",
|
||||
"type": "commit",
|
||||
"message": "auto-save 2026-05-15 18:56 (~4)",
|
||||
"hash": "dd27cdd",
|
||||
"files_changed": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -591,10 +591,10 @@
|
||||
<table>
|
||||
<tbody>
|
||||
<tr><td><code>web/app/page.tsx</code></td><td>产品工作台主状态:jobs、activeJobId、按 job 隔离的 selectedFrames/详情面板状态、clipboard、ReactFlow 节点和边;负责打开/找回画布工作面板。</td></tr>
|
||||
<tr><td><code>web/app/login/page.tsx</code></td><td>生产登录页:访问账号/访问密钥表单、保持会话、错误/成功状态;页面改为全屏 Digital Oasis 式动态背景、黑白/香槟金视觉、Internal Access 胶囊和画面/声音/成片状态栏;同时保留动态角色作为 Live Creative Modules 小组件。</td></tr>
|
||||
<tr><td><code>web/components/login/oasis-canvas.tsx</code></td><td>登录页全屏动态视觉层:用 iframe 直接承载下载包 <code>web/public/oasis-source/index.html</code> 的原 WebGPU / Three.js 草场源码;父级登录页只覆盖自己的文案和表单。</td></tr>
|
||||
<tr><td><code>web/public/oasis-source/index.html</code></td><td>从下载包 <code>remix-3d-website-the-digital-o</code> 复制来的原始视觉源码。只额外隐藏 demo 站自己的导航、文字和设置面板,保留原 WebGPU 渲染、草场、景深和鼠标交互源码。</td></tr>
|
||||
<tr><td><code>web/components/login/animated-login-characters.tsx</code></td><td>登录页四个几何动态角色组件:当前以小型 Live Creative Modules 方式挂在左侧展示区,保留鼠标眼神跟随、输入、显示密码、错误和成功状态反馈。</td></tr>
|
||||
<tr><td><code>web/app/login/page.tsx</code></td><td>生产登录页:访问账号/访问密钥表单、保持会话、错误/成功状态;页面改为全屏 Digital Oasis 式动态背景、黑白/香槟金视觉、Internal Access 胶囊和画面/声音/成片状态栏;右侧身份验证面板保持简约窄列,不再强制大高度。</td></tr>
|
||||
<tr><td><code>web/components/login/oasis-canvas.tsx</code></td><td>登录页全屏动态视觉层:用 iframe 直接承载下载包 <code>web/public/oasis-source/index.html</code> 的原 WebGPU / Three.js 草场源码;父级登录页只覆盖自己的文案和表单,并在捕获阶段把全局鼠标坐标转发给 iframe,避免登录面板遮挡时草地失去鼠标响应。</td></tr>
|
||||
<tr><td><code>web/public/oasis-source/index.html</code></td><td>从下载包 <code>remix-3d-website-the-digital-o</code> 复制来的原始视觉源码。只额外隐藏 demo 站自己的导航、文字和设置面板,保留原 WebGPU 渲染、草场、景深和鼠标交互源码;同时接收父页面 <code>postMessage</code> 指针坐标驱动草地交互。</td></tr>
|
||||
<tr><td><code>web/components/login/animated-login-characters.tsx</code></td><td>登录页四个几何动态角色组件:当前作为左侧透明框架里的放大主视觉展示,保留鼠标眼神跟随、输入、显示密码、错误和成功状态反馈。</td></tr>
|
||||
<tr><td><code>web/components/nodes/index.tsx</code></td><td>DAG 节点定义:Input、VisualLab、Audio、Compose,以及画布工作面板 KeyframePanel / VideoFramePanel;旧 Keyframe/Storyboard/VideoGen 组件保留但不再挂主画布。</td></tr>
|
||||
<tr><td><code>web/components/audio-strip.tsx</code></td><td>底部吸附音频条:可拖拽调整高度;播放原音频时移动指针,逐个高亮英文/中文字幕节点和对应波形,并在右侧固定显示按原音频时长生成的 SKG 英文产品口播和 MiniMax 随机英文配音。</td></tr>
|
||||
<tr><td><code>web/components/lightbox.tsx</code></td><td>关键帧素材准备面板:清洗、统一主体候选、参考帧网格、六张主体重绘图、每帧去主体场景图、纵向 6 行产品融合镜头工作表和审核。</td></tr>
|
||||
@@ -944,6 +944,18 @@ SubjectAsset {
|
||||
<h2>变更记录</h2>
|
||||
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
|
||||
<div class="changelog">
|
||||
<article class="change">
|
||||
<header>
|
||||
<h3>2026-05-15 · 登录页草地鼠标转发、面板压缩和角色放大</h3>
|
||||
<span class="tag rose">UI</span>
|
||||
<span class="tag violet">Login</span>
|
||||
</header>
|
||||
<div class="body">
|
||||
<p><strong>问题:</strong>原版 Digital Oasis 鼠标划过草地会产生响应,但登录页的表单和透明面板盖在 iframe 上方时,iframe 收不到鼠标坐标;同时右侧登录面板过大,左侧动态角色被压成小装饰。</p>
|
||||
<p><strong>改动:</strong><code>web/components/login/oasis-canvas.tsx</code> 在捕获阶段监听父页面指针移动,并通过 <code>postMessage</code> 发送到 <code>web/public/oasis-source/index.html</code>,后者复用原 raycaster 逻辑驱动草地。<code>web/app/login/page.tsx</code> 将身份验证面板改成 300-340px 窄列、去掉强制大高度、压缩标题/输入/按钮间距;<code>web/app/globals.css</code> 将动态角色面板放大成左侧透明框架里的主视觉。</p>
|
||||
<p><strong>影响:</strong><code>web/app/login/page.tsx</code>、<code>web/components/login/oasis-canvas.tsx</code>、<code>web/public/oasis-source/index.html</code>、<code>web/app/globals.css</code>、<code>docs/source-analysis.html</code>。</p>
|
||||
</div>
|
||||
</article>
|
||||
<article class="change">
|
||||
<header>
|
||||
<h3>2026-05-15 · 登录页两块主面板复刻 Pillars 透明卡片质感</h3>
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
text-shadow: 0 2px 18px rgba(0, 0, 0, 0.68);
|
||||
}
|
||||
.login-page--oasis .login-creative-stage {
|
||||
min-height: 310px;
|
||||
min-height: 400px;
|
||||
margin-top: auto;
|
||||
}
|
||||
.login-page--oasis .login-creative-caption {
|
||||
@@ -265,21 +265,25 @@
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock {
|
||||
left: 0;
|
||||
bottom: 138px;
|
||||
bottom: 104px;
|
||||
width: min(430px, 54%);
|
||||
border-color: rgba(140, 180, 120, 0.12);
|
||||
background: rgba(10, 18, 10, 0.55);
|
||||
padding: 18px;
|
||||
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
|
||||
backdrop-filter: blur(16px);
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock__label {
|
||||
margin-bottom: 12px;
|
||||
color: rgba(224, 210, 128, 0.78);
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock .login-character-stage {
|
||||
min-height: 240px;
|
||||
border-color: rgba(255, 255, 255, 0.1);
|
||||
background:
|
||||
linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px),
|
||||
linear-gradient(180deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px),
|
||||
rgba(255, 255, 255, 0.06);
|
||||
rgba(255, 255, 255, 0.045);
|
||||
background-size: 22px 22px, 22px 22px, auto;
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock .login-character-stage::after {
|
||||
@@ -288,6 +292,9 @@
|
||||
.login-page--oasis .login-dynamic-dock .login-stage-grid {
|
||||
border-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock .login-characters-container {
|
||||
transform: translateX(-50%) scale(0.54);
|
||||
}
|
||||
.login-page--oasis .login-studio-chip {
|
||||
border-color: rgba(140, 180, 120, 0.14);
|
||||
background: rgba(10, 18, 10, 0.55);
|
||||
@@ -297,8 +304,8 @@
|
||||
}
|
||||
.login-page--oasis .login-studio-chip--visual {
|
||||
right: auto;
|
||||
left: 310px;
|
||||
top: 172px;
|
||||
left: min(470px, 58%);
|
||||
top: 176px;
|
||||
}
|
||||
.login-page--oasis .login-premium-metrics {
|
||||
border-color: rgba(140, 180, 120, 0.12);
|
||||
@@ -320,7 +327,7 @@
|
||||
border-radius: 16px;
|
||||
background: rgba(10, 18, 10, 0.55);
|
||||
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
|
||||
padding: 36px 28px;
|
||||
padding: 28px 24px;
|
||||
backdrop-filter: blur(16px);
|
||||
transition: border-color 0.4s, background 0.4s;
|
||||
}
|
||||
@@ -1076,11 +1083,11 @@
|
||||
linear-gradient(180deg, rgba(0, 0, 0, 0.72), rgba(0, 0, 0, 0.2) 48%, rgba(0, 0, 0, 0.82));
|
||||
}
|
||||
.login-page--oasis .login-oasis-hero {
|
||||
min-height: 650px;
|
||||
min-height: 740px;
|
||||
padding: 24px 20px;
|
||||
}
|
||||
.login-page--oasis .login-auth-panel {
|
||||
padding: 28px 20px;
|
||||
padding: 24px 18px;
|
||||
}
|
||||
.login-page--oasis .login-wordmark__logo {
|
||||
font-size: 24px;
|
||||
@@ -1108,7 +1115,7 @@
|
||||
min-height: 340px;
|
||||
}
|
||||
.login-page--oasis .login-creative-stage {
|
||||
min-height: 360px;
|
||||
min-height: 450px;
|
||||
}
|
||||
.login-creative-orbit {
|
||||
right: -20%;
|
||||
@@ -1120,8 +1127,8 @@
|
||||
width: 48%;
|
||||
}
|
||||
.login-page--oasis .login-creative-caption {
|
||||
bottom: 42px;
|
||||
width: 48%;
|
||||
bottom: 38px;
|
||||
width: 58%;
|
||||
}
|
||||
.login-creative-caption b {
|
||||
font-size: 22px;
|
||||
@@ -1133,8 +1140,9 @@
|
||||
padding: 10px;
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock {
|
||||
bottom: 142px;
|
||||
width: 210px;
|
||||
bottom: 112px;
|
||||
width: min(100%, 330px);
|
||||
padding: 14px;
|
||||
}
|
||||
.login-dynamic-dock .login-character-stage {
|
||||
min-height: 94px;
|
||||
@@ -1142,6 +1150,12 @@
|
||||
.login-dynamic-dock .login-characters-container {
|
||||
transform: translateX(-50%) scale(0.22);
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock .login-character-stage {
|
||||
min-height: 190px;
|
||||
}
|
||||
.login-page--oasis .login-dynamic-dock .login-characters-container {
|
||||
transform: translateX(-50%) scale(0.42);
|
||||
}
|
||||
.login-studio-chip {
|
||||
font-size: 12px;
|
||||
}
|
||||
@@ -1152,7 +1166,7 @@
|
||||
.login-page--oasis .login-studio-chip--visual {
|
||||
left: auto;
|
||||
right: 0;
|
||||
top: 112px;
|
||||
top: 118px;
|
||||
}
|
||||
.login-studio-chip--review {
|
||||
display: none;
|
||||
|
||||
@@ -90,7 +90,7 @@ export default function LoginPage() {
|
||||
<OasisCanvas />
|
||||
<div className="login-oasis-shade" />
|
||||
<div className="relative z-10 mx-auto flex min-h-[calc(100vh-3rem)] w-full max-w-7xl items-center">
|
||||
<div className="grid w-full gap-5 lg:grid-cols-[minmax(0,1.28fr)_minmax(320px,380px)] lg:items-center">
|
||||
<div className="grid w-full gap-5 lg:grid-cols-[minmax(0,1fr)_minmax(300px,340px)] lg:items-center">
|
||||
<section className="login-hero login-oasis-hero order-2 relative min-h-[540px] overflow-hidden p-1 text-white sm:p-2 lg:order-1 lg:min-h-[620px]">
|
||||
<div className="relative z-10 flex h-full flex-col">
|
||||
<div className="flex flex-wrap items-center justify-between gap-4">
|
||||
@@ -140,20 +140,20 @@ export default function LoginPage() {
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="login-auth-panel order-1 flex min-h-[390px] items-center rounded-[8px] p-5 sm:p-8 lg:order-2 lg:min-h-[460px]">
|
||||
<section className="login-auth-panel order-1 flex items-center rounded-[8px] p-5 sm:p-6 lg:order-2 lg:p-6">
|
||||
<form className="w-full" onSubmit={onSubmit}>
|
||||
<div className="mb-6">
|
||||
<div className="login-auth-icon mb-4 inline-flex h-10 w-10 items-center justify-center rounded-[8px] text-white">
|
||||
<div className="mb-5">
|
||||
<div className="login-auth-icon mb-3 inline-flex h-9 w-9 items-center justify-center rounded-[8px] text-white">
|
||||
<LockKeyhole className="h-5 w-5" />
|
||||
</div>
|
||||
<h2 className="text-2xl font-semibold text-white">身份验证</h2>
|
||||
<h2 className="text-xl font-semibold text-white">身份验证</h2>
|
||||
<p className="mt-2 text-sm leading-6 text-white/55">验证后进入内容生产环境</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div className="space-y-3">
|
||||
<label className="block">
|
||||
<span className="mb-2 block text-sm font-medium text-white/70">访问账号</span>
|
||||
<span className="flex h-12 items-center gap-3 rounded-[8px] border border-white/10 bg-black/25 px-3 text-white transition focus-within:border-[#d6b36a] focus-within:bg-black/35 focus-within:ring-2 focus-within:ring-[#d6b36a]/25">
|
||||
<span className="flex h-11 items-center gap-3 rounded-[8px] border border-white/10 bg-black/25 px-3 text-white transition focus-within:border-[#d6b36a] focus-within:bg-black/35 focus-within:ring-2 focus-within:ring-[#d6b36a]/25">
|
||||
<UserRound className="h-4 w-4 text-white/45" />
|
||||
<input
|
||||
className="h-full min-w-0 flex-1 bg-transparent text-base text-white outline-none placeholder:text-white/30"
|
||||
@@ -173,7 +173,7 @@ export default function LoginPage() {
|
||||
|
||||
<label className="block">
|
||||
<span className="mb-2 block text-sm font-medium text-white/70">访问密钥</span>
|
||||
<span className="flex h-12 items-center gap-3 rounded-[8px] border border-white/10 bg-black/25 px-3 text-white transition focus-within:border-[#d6b36a] focus-within:bg-black/35 focus-within:ring-2 focus-within:ring-[#d6b36a]/25">
|
||||
<span className="flex h-11 items-center gap-3 rounded-[8px] border border-white/10 bg-black/25 px-3 text-white transition focus-within:border-[#d6b36a] focus-within:bg-black/35 focus-within:ring-2 focus-within:ring-[#d6b36a]/25">
|
||||
<LockKeyhole className="h-4 w-4 text-white/45" />
|
||||
<input
|
||||
className="h-full min-w-0 flex-1 bg-transparent text-base text-white outline-none placeholder:text-white/30"
|
||||
@@ -203,7 +203,7 @@ export default function LoginPage() {
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div className="mt-4 flex items-center justify-between gap-4">
|
||||
<div className="mt-3 flex items-center justify-between gap-4">
|
||||
<label className="flex cursor-pointer items-center gap-2 text-sm text-white/60">
|
||||
<input
|
||||
className="h-4 w-4 rounded border-white/20 bg-black/30 accent-[#c89b3c]"
|
||||
@@ -217,7 +217,7 @@ export default function LoginPage() {
|
||||
<span className="text-xs text-white/35">marketing.skg.com</span>
|
||||
</div>
|
||||
|
||||
<div className="mt-5 min-h-11" aria-live="polite">
|
||||
<div className="mt-4 min-h-9" aria-live="polite">
|
||||
{error ? (
|
||||
<div className="flex items-start gap-2 rounded-[8px] border border-red-400/30 bg-red-500/10 px-3 py-2 text-sm text-red-100">
|
||||
<AlertCircle className="mt-0.5 h-4 w-4 shrink-0" />
|
||||
@@ -232,7 +232,7 @@ export default function LoginPage() {
|
||||
</div>
|
||||
|
||||
<button
|
||||
className="mt-2 flex h-12 w-full items-center justify-center gap-2 rounded-[8px] bg-white px-4 text-base font-semibold text-black shadow-xl shadow-black/25 transition hover:bg-[#f5efe3] focus:outline-none focus:ring-2 focus:ring-[#d6b36a]/60 disabled:cursor-wait disabled:opacity-70"
|
||||
className="mt-1 flex h-11 w-full items-center justify-center gap-2 rounded-[8px] bg-white px-4 text-base font-semibold text-black shadow-xl shadow-black/25 transition hover:bg-[#f5efe3] focus:outline-none focus:ring-2 focus:ring-[#d6b36a]/60 disabled:cursor-wait disabled:opacity-70"
|
||||
type="submit"
|
||||
disabled={disabled}
|
||||
>
|
||||
|
||||
@@ -22,11 +22,13 @@ export function OasisCanvas() {
|
||||
const onPointerMove = (event: PointerEvent) => sendPointer("pointermove", event)
|
||||
const onPointerLeave = () => sendPointer("pointerleave")
|
||||
|
||||
window.addEventListener("pointermove", onPointerMove)
|
||||
window.addEventListener("pointerleave", onPointerLeave)
|
||||
const listenerOptions = { capture: true, passive: true }
|
||||
|
||||
window.addEventListener("pointermove", onPointerMove, listenerOptions)
|
||||
window.addEventListener("pointerleave", onPointerLeave, listenerOptions)
|
||||
return () => {
|
||||
window.removeEventListener("pointermove", onPointerMove)
|
||||
window.removeEventListener("pointerleave", onPointerLeave)
|
||||
window.removeEventListener("pointermove", onPointerMove, listenerOptions)
|
||||
window.removeEventListener("pointerleave", onPointerLeave, listenerOptions)
|
||||
}
|
||||
}, [])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user