diff --git a/.memory/worklog.json b/.memory/worklog.json index d7ef395..6daf473 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 01:51 (~2)", - "ts": "2026-05-13T17:53:11Z", - "type": "session-heartbeat" - }, { "files_changed": 5, "hash": "11de581", @@ -3251,6 +3245,13 @@ "type": "session-heartbeat", "message": "Codex 会话活跃 · 最近命令:codex · 2 项未提交变更 · 最近提交:auto-save 2026-05-15 17:11 (~6)", "files_changed": 2 + }, + { + "ts": "2026-05-15T17:17:23+08:00", + "type": "commit", + "message": "auto-save 2026-05-15 17:17 (~2)", + "hash": "f590d51", + "files_changed": 2 } ] } diff --git a/docs/source-analysis.html b/docs/source-analysis.html index 4e8fd2a..1ba5eeb 100644 --- a/docs/source-analysis.html +++ b/docs/source-analysis.html @@ -591,7 +591,7 @@ - + @@ -944,13 +944,13 @@ SubjectAsset {
-

2026-05-15 · 登录页升级为高级产品入口视觉

+

2026-05-15 · 登录页移除产品元素并保留动态模块

UI
-

问题:上一版虽然吸收了官网元素,但仍偏浅灰卡片拼接,卡通角色舞台削弱了公司级工具和高端健康硬件的质感。

-

改动:生产登录页主视觉改为真实 SKG 颈部按摩仪产品摄影卡,采用黑白/香槟金主轴、超大标题、克制胶囊状态、素材/声音/成片三段式状态栏;几何角色组件不再抢占主视觉,但作为 Live Studio Modules 小组件保留,继续响应鼠标眼神跟随、输入、显示密码、错误和成功状态。新增本地静态图 web/public/assets/skg-g7-pro-neck-massager.png,并在生产 Nginx 放行 /assets/,避免登录页产品图被登录保护拦截。

-

影响:web/app/login/page.tsxweb/app/globals.cssweb/public/assets/skg-g7-pro-neck-massager.pngdeploy/nginx.confRULES.mddocs/source-analysis.html

+

问题:登录页不应该放具体产品图,入口职责是进入内容生产系统,不是展示某个产品。

+

改动:移除登录页产品图、G7/Neck Massager 等产品文案和产品摄影卡,改为抽象流程视觉与全新入口文案:内容创作中枢、Content Production System、Creative Pipeline。四个动态几何角色作为 Live Creative Modules 小组件保留,继续响应鼠标眼神跟随、输入、显示密码、错误和成功状态。

+

影响:web/app/login/page.tsxweb/app/globals.cssdocs/source-analysis.html

diff --git a/web/app/globals.css b/web/app/globals.css index 95e1dd7..e28e3b2 100644 --- a/web/app/globals.css +++ b/web/app/globals.css @@ -243,39 +243,81 @@ font-size: 16px; line-height: 1.7; } -.login-product-stage { +.login-creative-stage { position: relative; flex: 1; min-height: 300px; margin-top: 26px; } -.login-product-stage__halo { +.login-creative-stage__halo { position: absolute; - right: 7%; - bottom: 24px; - width: 52%; - height: 42px; + right: 10%; + bottom: 54px; + width: 46%; + height: 46px; border-radius: 50%; - background: rgba(40, 40, 40, 0.12); - filter: blur(18px); + background: rgba(40, 40, 40, 0.11); + filter: blur(20px); transform: perspective(500px) rotateX(58deg); } -.login-product-image { +.login-creative-orbit { position: absolute; - right: 1%; - bottom: 0; + right: 2%; + bottom: 8px; width: min(46%, 390px); - max-height: 360px; - object-fit: contain; + aspect-ratio: 1; border: 1px solid rgba(40, 40, 40, 0.08); border-radius: 8px; - background: #fff; - padding: 20px; - filter: - drop-shadow(0 32px 52px rgba(40, 40, 40, 0.18)) - drop-shadow(0 1px 0 rgba(255, 255, 255, 0.8)); + background: + radial-gradient(circle at 50% 50%, rgba(214, 179, 106, 0.16), transparent 36%), + linear-gradient(145deg, rgba(255, 255, 255, 0.88), rgba(244, 244, 240, 0.64)); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.9), + 0 34px 70px rgba(40, 40, 40, 0.12); + overflow: hidden; } -.login-product-caption { +.login-creative-orbit::before, +.login-creative-orbit::after, +.login-creative-orbit span { + content: ""; + position: absolute; + border-radius: 999px; +} +.login-creative-orbit::before { + inset: 17%; + border: 1px solid rgba(40, 40, 40, 0.12); +} +.login-creative-orbit::after { + left: 50%; + top: 50%; + width: 42%; + height: 42%; + background: linear-gradient(145deg, #18191c, #343434); + box-shadow: 0 18px 44px rgba(40, 40, 40, 0.18); + transform: translate(-50%, -50%); +} +.login-creative-orbit span:nth-child(1) { + left: 18%; + top: 22%; + width: 16%; + height: 16%; + background: #d6b36a; +} +.login-creative-orbit span:nth-child(2) { + right: 18%; + top: 34%; + width: 11%; + height: 11%; + background: #111214; +} +.login-creative-orbit span:nth-child(3) { + left: 50%; + bottom: 15%; + width: 13%; + height: 13%; + background: rgba(40, 40, 40, 0.18); +} +.login-creative-caption { position: absolute; left: 0; bottom: 50px; @@ -284,12 +326,12 @@ padding-top: 18px; color: #151515; } -.login-product-caption span { +.login-creative-caption span { display: block; color: rgba(40, 40, 40, 0.5); font-size: 13px; } -.login-product-caption b { +.login-creative-caption b { display: block; margin-top: 5px; font-size: 28px; @@ -404,21 +446,6 @@ border: 1px solid rgba(214, 179, 106, 0.42); box-shadow: 0 18px 42px rgba(0, 0, 0, 0.3), 0 0 0 5px rgba(214, 179, 106, 0.06); } -.login-product-ribbon { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-top: -12px; -} -.login-product-ribbon span { - border: 1px solid rgba(40, 40, 40, 0.08); - border-radius: 999px; - background: rgba(255, 255, 255, 0.74); - padding: 8px 12px; - color: rgba(40, 40, 40, 0.66); - font-size: 12px; - box-shadow: 0 10px 28px rgba(40, 40, 40, 0.06); -} .login-skg-tile { border: 1px solid rgba(40, 40, 40, 0.08); background: @@ -843,21 +870,19 @@ .login-premium-copy { font-size: 14px; } - .login-product-stage { + .login-creative-stage { min-height: 340px; } - .login-product-image { - right: -18%; - bottom: 28px; + .login-creative-orbit { + right: -20%; + bottom: 34px; width: 78%; - max-height: 280px; - padding: 14px; } - .login-product-caption { + .login-creative-caption { bottom: 34px; width: 48%; } - .login-product-caption b { + .login-creative-caption b { font-size: 22px; } .login-dynamic-dock { diff --git a/web/app/login/page.tsx b/web/app/login/page.tsx index c8349e4..9104bed 100644 --- a/web/app/login/page.tsx +++ b/web/app/login/page.tsx @@ -5,7 +5,6 @@ import { useEffect, useMemo, useState } from "react" import { AlertCircle, ArrowRight, - BadgeCheck, CheckCircle2, Eye, EyeOff, @@ -18,9 +17,6 @@ import { AnimatedLoginCharacters, type LoginCharacterMood } from "@/components/l type LoginStatus = "idle" | "loading" | "success" -const PRODUCT_IMAGE = - "/assets/skg-g7-pro-neck-massager.png" - export default function LoginPage() { const [username, setUsername] = useState("") const [password, setPassword] = useState("") @@ -57,7 +53,7 @@ export default function LoginPage() { event.preventDefault() setError("") if (!username.trim() || !password) { - setError("请输入账号和密码") + setError("请输入访问账号和访问密钥") return } setStatus("loading") @@ -69,7 +65,7 @@ export default function LoginPage() { body: JSON.stringify({ username, password, remember }), }) if (!res.ok) { - let message = "账号或密码不正确" + let message = "访问账号或密钥不正确" try { const data = await res.json() message = data?.detail || data?.error || message @@ -84,7 +80,7 @@ export default function LoginPage() { }, 420) } catch (err) { setStatus("idle") - setError(err instanceof Error ? err.message : "登录失败,请稍后再试") + setError(err instanceof Error ? err.message : "验证失败,请稍后再试") } } @@ -97,46 +93,46 @@ export default function LoginPage() {
SKG - 未来健康 + Creative OS
- Secure Studio + Internal Access
-

MARKETING CONTENT STUDIO

-

营销内容工作台

-

SKG 健康科技素材、产品视觉与广告视频生产入口

+

CONTENT PRODUCTION SYSTEM

+

内容创作中枢

+

统一进入素材拆解、画面处理、声音处理与成片生成流程。

-
-
- SKG neck massager -
- G7 Pro Fold - Neck Massager +
+
+ +
+ Creative Pipeline + Pipeline ready
- Live Studio Modules + Live Creative Modules
- Visual Asset Flow -
-
- - Brand Review Ready + Pipeline Online
{[ - ["Visual", "素材"], - ["Audio", "声音"], - ["Video", "成片"], + ["Frame Lab", "画面"], + ["Sound Lab", "声音"], + ["Final Cut", "成片"], ].map(([label, value]) => (
{label} @@ -153,13 +149,13 @@ export default function LoginPage() {
-

登录

-

进入 SKG 营销内容工作台

+

身份验证

+

验证后进入内容生产环境

marketing.skg.com
@@ -233,7 +229,7 @@ export default function LoginPage() { ) : status === "success" ? (
- 登录成功,正在进入工作台 + 验证通过,正在打开工作台
) : null}
@@ -243,7 +239,7 @@ export default function LoginPage() { type="submit" disabled={disabled} > - {status === "loading" ? "正在登录" : status === "success" ? "已通过" : "进入工作台"} + {status === "loading" ? "验证中" : status === "success" ? "已验证" : "打开工作台"} diff --git a/web/public/assets/skg-g7-pro-neck-massager.png b/web/public/assets/skg-g7-pro-neck-massager.png deleted file mode 100644 index d391360..0000000 Binary files a/web/public/assets/skg-g7-pro-neck-massager.png and /dev/null differ
web/app/page.tsx产品工作台主状态:jobs、activeJobId、按 job 隔离的 selectedFrames/详情面板状态、clipboard、ReactFlow 节点和边;负责打开/找回画布工作面板。
web/app/login/page.tsx生产登录页:账号密码表单、保持登录、错误/成功状态;左侧展示区改为高级产品入口页结构,使用本地 SKG 颈部按摩仪产品图、黑白/香槟金视觉、Secure Studio 胶囊和素材/声音/成片状态栏;同时保留动态角色作为 Live Studio Modules 小组件。
web/app/login/page.tsx生产登录页:访问账号/访问密钥表单、保持会话、错误/成功状态;左侧展示区改为高级内容入口结构,使用抽象流程视觉、黑白/香槟金视觉、Internal Access 胶囊和画面/声音/成片状态栏;同时保留动态角色作为 Live Creative Modules 小组件。
web/components/login/animated-login-characters.tsx登录页四个几何动态角色组件:当前以小型 Live Studio Modules 方式挂在产品区,保留鼠标眼神跟随、输入、显示密码、错误和成功状态反馈。
web/components/nodes/index.tsxDAG 节点定义:Input、VisualLab、Audio、Compose,以及画布工作面板 KeyframePanel / VideoFramePanel;旧 Keyframe/Storyboard/VideoGen 组件保留但不再挂主画布。
web/components/audio-strip.tsx底部吸附音频条:可拖拽调整高度;播放原音频时移动指针,逐个高亮英文/中文字幕节点和对应波形,并在右侧固定显示按原音频时长生成的 SKG 英文产品口播和 MiniMax 随机英文配音。