From 2b2bb105229a26c0287acbb2d66be0708ad29034 Mon Sep 17 00:00:00 2001 From: kang Date: Fri, 15 May 2026 19:52:33 +0800 Subject: [PATCH] auto-save 2026-05-15 19:52 (+1, ~4) --- .memory/worklog.json | 13 +++++----- docs/source-analysis.html | 4 +-- web/app/login/layout.tsx | 11 ++++++++ web/app/login/page.tsx | 36 +++++++++------------------ web/components/login/oasis-canvas.tsx | 1 - 5 files changed, 32 insertions(+), 33 deletions(-) create mode 100644 web/app/login/layout.tsx diff --git a/.memory/worklog.json b/.memory/worklog.json index 0f753f2..136d5b4 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1,11 +1,5 @@ { "entries": [ - { - "files_changed": 1, - "message": "Claude 会话活跃 · 最近命令:claude · 1 项未提交变更 · 最近提交:auto-save 2026-05-14 03:42 (~3)", - "ts": "2026-05-13T19:43:12Z", - "type": "session-heartbeat" - }, { "files_changed": 1, "hash": "9572111", @@ -3258,6 +3252,13 @@ "type": "session-heartbeat", "message": "Codex 会话活跃 · 最近命令:codex · 1 项未提交变更 · 最近提交:auto-save 2026-05-15 19:41 (~3)", "files_changed": 1 + }, + { + "ts": "2026-05-15T19:46:59+08:00", + "type": "commit", + "message": "auto-save 2026-05-15 19:46 (~1)", + "hash": "aedb746", + "files_changed": 1 } ] } diff --git a/docs/source-analysis.html b/docs/source-analysis.html index a7311cd..620f4c5 100644 --- a/docs/source-analysis.html +++ b/docs/source-analysis.html @@ -591,7 +591,7 @@ - + @@ -952,7 +952,7 @@ SubjectAsset {

问题:组合登录框内仍显示输入占位、保持会话、按钮文字和状态提示文字,不符合“登录框文字都删掉”的要求。

-

改动:web/app/login/page.tsx 删除账号/密钥输入框占位文字、保持会话文本、提交按钮文本和错误/成功状态文本;表单视觉只保留图标、输入区域、复选框和箭头按钮,必要的控件识别改用 aria-label

+

改动:web/app/login/page.tsx 删除账号/密钥输入框占位文字、保持会话文本、提交按钮文本、错误/成功状态文本以及表单控件上的可读 aria-label;表单视觉只保留图标、输入区域、复选框和箭头按钮。

影响:web/app/login/page.tsxdocs/source-analysis.html

diff --git a/web/app/login/layout.tsx b/web/app/login/layout.tsx new file mode 100644 index 0000000..c518436 --- /dev/null +++ b/web/app/login/layout.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next" +import type { ReactNode } from "react" + +export const metadata: Metadata = { + title: { absolute: "" }, + description: "", +} + +export default function LoginLayout({ children }: { children: ReactNode }) { + return children +} diff --git a/web/app/login/page.tsx b/web/app/login/page.tsx index 305d026..1f1c496 100644 --- a/web/app/login/page.tsx +++ b/web/app/login/page.tsx @@ -22,7 +22,7 @@ export default function LoginPage() { const [remember, setRemember] = useState(true) const [showPassword, setShowPassword] = useState(false) const [activeField, setActiveField] = useState<"username" | "password" | null>(null) - const [error, setError] = useState("") + const [hasError, setHasError] = useState(false) const [status, setStatus] = useState("idle") const [eyeOffset, setEyeOffset] = useState({ x: 0, y: 0 }) @@ -42,17 +42,17 @@ export default function LoginPage() { const mood: LoginCharacterMood = useMemo(() => { if (status === "success") return "success" - if (error) return "error" + if (hasError) return "error" if (showPassword && activeField === "password") return "peek" if (activeField || username || password) return "typing" return "idle" - }, [activeField, error, password, showPassword, status, username]) + }, [activeField, hasError, password, showPassword, status, username]) async function onSubmit(event: FormEvent) { event.preventDefault() - setError("") + setHasError(false) if (!username.trim() || !password) { - setError("请输入访问账号和访问密钥") + setHasError(true) return } setStatus("loading") @@ -64,22 +64,15 @@ export default function LoginPage() { body: JSON.stringify({ username, password, remember }), }) if (!res.ok) { - let message = "访问账号或密钥不正确" - try { - const data = await res.json() - message = data?.detail || data?.error || message - } catch { - // keep default message - } - throw new Error(message) + throw new Error() } setStatus("success") window.setTimeout(() => { window.location.href = "/" }, 420) - } catch (err) { + } catch { setStatus("idle") - setError(err instanceof Error ? err.message : "验证失败,请稍后再试") + setHasError(true) } } @@ -107,13 +100,12 @@ export default function LoginPage() { className="h-full min-w-0 flex-1 bg-transparent text-base text-white outline-none placeholder:text-white/30" value={username} disabled={disabled} - aria-label="account" autoComplete="username" onFocus={() => setActiveField("username")} onBlur={() => setActiveField(null)} onChange={(event) => { setUsername(event.target.value) - if (error) setError("") + if (hasError) setHasError(false) }} /> @@ -126,21 +118,19 @@ export default function LoginPage() { className="h-full min-w-0 flex-1 bg-transparent text-base text-white outline-none placeholder:text-white/30" value={password} disabled={disabled} - aria-label="secret" type={showPassword ? "text" : "password"} autoComplete="current-password" onFocus={() => setActiveField("password")} onBlur={() => setActiveField(null)} onChange={(event) => { setPassword(event.target.value) - if (error) setError("") + if (hasError) setHasError(false) }} /> diff --git a/web/components/login/oasis-canvas.tsx b/web/components/login/oasis-canvas.tsx index 07db44c..ed159f6 100644 --- a/web/components/login/oasis-canvas.tsx +++ b/web/components/login/oasis-canvas.tsx @@ -63,7 +63,6 @@ export function OasisCanvas() { className="login-oasis-canvas" loading="eager" src="/oasis-source/index.html" - title="Digital Oasis WebGPU background" /> ) }
web/app/page.tsx产品工作台主状态:jobs、activeJobId、按 job 隔离的 selectedFrames/详情面板状态、clipboard、ReactFlow 节点和边;负责打开/找回画布工作面板。
web/app/login/page.tsx生产登录页:访问账号/访问密钥表单、保持会话、错误/成功状态;当前只在原版 Digital Oasis 动态背景上叠加一个组合登录框,框内上方是动态角色、下方是无可见文字的图标化登录表单,不再保留旧版入口营销文案、状态胶囊和指标栏。
web/app/login/page.tsx生产登录页:访问账号/访问密钥表单、保持会话、错误/成功状态;当前只在原版 Digital Oasis 动态背景上叠加一个组合登录框,框内上方是动态角色、下方是无任何界面文字的图标化登录表单,不再保留旧版入口营销文案、状态胶囊和指标栏。
web/components/login/oasis-canvas.tsx登录页全屏动态视觉层:用 iframe 直接承载下载包 web/public/oasis-source/index.html 的原 WebGPU / Three.js 草场源码;父级登录页只覆盖自己的文案和表单,并在捕获阶段把全局鼠标坐标转发给 iframe,避免登录面板遮挡时草地失去鼠标响应。
web/public/oasis-source/index.html从下载包 remix-3d-website-the-digital-o 复制来的原始视觉源码。只额外隐藏 demo 站自己的导航、文字和设置面板,保留原 WebGPU 渲染、草场、景深和鼠标交互源码;同时接收父页面 postMessage 指针坐标驱动草地交互。
web/components/login/animated-login-characters.tsx登录页四个几何动态角色组件:当前嵌入登录框顶部,去掉独立网格背景,保留鼠标眼神跟随、输入、显示密码、错误和成功状态反馈。