auto-save 2026-05-18 20:13 (~3)

This commit is contained in:
2026-05-18 20:13:59 +08:00
parent bc0b010def
commit 69bb692a58
3 changed files with 402 additions and 218 deletions

View File

@@ -1,194 +1,5 @@
{ {
"entries": [ "entries": [
{
"files_changed": 1,
"hash": "8b18908",
"message": "auto-save 2026-05-16 03:59 (~1)",
"ts": "2026-05-16T03:59:42+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "41c534e",
"message": "auto-save 2026-05-16 04:05 (~1)",
"ts": "2026-05-16T04:05:31+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "d472cdf",
"message": "auto-save 2026-05-16 04:11 (~1)",
"ts": "2026-05-16T04:11:21+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "b95a728",
"message": "auto-save 2026-05-16 04:17 (~1)",
"ts": "2026-05-16T04:17:10+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "f7e4a2a",
"message": "auto-save 2026-05-16 04:22 (~1)",
"ts": "2026-05-16T04:23:00+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "5758c94",
"message": "auto-save 2026-05-16 04:28 (~1)",
"ts": "2026-05-16T07:31:38+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "c5a549e",
"message": "auto-save 2026-05-16 10:20 (~1)",
"ts": "2026-05-16T10:22:49+08:00",
"type": "commit"
},
{
"files_changed": 2,
"hash": "de56f9d",
"message": "auto-save 2026-05-16 10:28 (~2)",
"ts": "2026-05-16T10:28:22+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "f3ba716",
"message": "auto-save 2026-05-16 10:33 (~1)",
"ts": "2026-05-16T10:33:54+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "dc77686",
"message": "auto-save 2026-05-16 10:39 (~1)",
"ts": "2026-05-16T10:39:24+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "e12433d",
"message": "auto-save 2026-05-16 10:44 (~1)",
"ts": "2026-05-16T10:44:52+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "752bbab",
"message": "auto-save 2026-05-16 12:12 (~1)",
"ts": "2026-05-16T12:12:12+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "4283512",
"message": "auto-save 2026-05-16 12:18 (~1)",
"ts": "2026-05-16T12:18:24+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "809e983",
"message": "auto-save 2026-05-16 12:23 (~1)",
"ts": "2026-05-16T12:23:53+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "3bd3199",
"message": "auto-save 2026-05-16 12:29 (~1)",
"ts": "2026-05-16T12:29:22+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "cead9a7",
"message": "auto-save 2026-05-16 12:34 (~1)",
"ts": "2026-05-16T12:34:49+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "7a2f630",
"message": "auto-save 2026-05-16 12:43 (~1)",
"ts": "2026-05-16T12:44:07+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "75a430d",
"message": "auto-save 2026-05-16 12:49 (~1)",
"ts": "2026-05-16T12:49:35+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "24743ef",
"message": "auto-save 2026-05-16 14:01 (~1)",
"ts": "2026-05-16T14:01:14+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "ebe1476",
"message": "auto-save 2026-05-16 14:06 (~1)",
"ts": "2026-05-16T14:06:40+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "c27e68d",
"message": "auto-save 2026-05-16 14:12 (~1)",
"ts": "2026-05-16T14:12:18+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "f299408",
"message": "auto-save 2026-05-16 14:17 (~1)",
"ts": "2026-05-16T14:17:47+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "7c427d3",
"message": "auto-save 2026-05-16 14:23 (~1)",
"ts": "2026-05-16T14:23:19+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "c55d95c",
"message": "auto-save 2026-05-16 14:28 (~1)",
"ts": "2026-05-16T14:28:46+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "5e78071",
"message": "auto-save 2026-05-16 14:34 (~1)",
"ts": "2026-05-16T14:34:30+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "a5a3cec",
"message": "auto-save 2026-05-16 14:40 (~1)",
"ts": "2026-05-16T14:40:17+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "e1411e7",
"message": "auto-save 2026-05-16 14:45 (~1)",
"ts": "2026-05-16T14:46:03+08:00",
"type": "commit"
},
{ {
"files_changed": 1, "files_changed": 1,
"hash": "7067a2b", "hash": "7067a2b",
@@ -3229,6 +3040,183 @@
"message": "fix: surface resilient subject asset generation", "message": "fix: surface resilient subject asset generation",
"hash": "095c6f1", "hash": "095c6f1",
"files_changed": 8 "files_changed": 8
},
{
"ts": "2026-05-18T18:18:23+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 18:18 (~2)",
"hash": "06bf0ee",
"files_changed": 2
},
{
"ts": "2026-05-18T18:20:48+08:00",
"type": "commit",
"message": "docs: align legacy model descriptions",
"hash": "87ffa6b",
"files_changed": 1
},
{
"ts": "2026-05-18T10:22:18Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交docs: align legacy model descriptions",
"files_changed": 1
},
{
"ts": "2026-05-18T18:29:13+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 18:29 (~3)",
"hash": "4d10b09",
"files_changed": 3
},
{
"ts": "2026-05-18T10:32:18Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 3 项未提交变更 · 最近提交auto-save 2026-05-18 18:29 (~3)",
"files_changed": 3
},
{
"ts": "2026-05-18T18:34:39+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 18:34 (~4)",
"hash": "0bec7f9",
"files_changed": 4
},
{
"ts": "2026-05-18T18:38:10+08:00",
"type": "commit",
"message": "feat: add subject profile controls",
"hash": "33c3aef",
"files_changed": 4
},
{
"ts": "2026-05-18T10:42:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交feat: add subject profile controls",
"files_changed": 1
},
{
"ts": "2026-05-18T10:52:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交feat: add subject profile controls",
"files_changed": 1
},
{
"ts": "2026-05-18T11:02:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交feat: add subject profile controls",
"files_changed": 1
},
{
"ts": "2026-05-18T11:12:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交feat: add subject profile controls",
"files_changed": 1
},
{
"ts": "2026-05-18T19:19:49+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:19 (~4)",
"hash": "0e2b038",
"files_changed": 4
},
{
"ts": "2026-05-18T11:22:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-18 19:19 (~4)",
"files_changed": 2
},
{
"ts": "2026-05-18T19:25:14+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:25 (~3)",
"hash": "73c9b51",
"files_changed": 3
},
{
"ts": "2026-05-18T19:30:39+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:30 (~2)",
"hash": "182435b",
"files_changed": 2
},
{
"ts": "2026-05-18T11:32:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 5 项未提交变更 · 最近提交feat: add subject profile controls",
"files_changed": 5
},
{
"ts": "2026-05-18T19:33:16+08:00",
"type": "commit",
"message": "feat: use subject brief for endpoint frames",
"hash": "adf8b2b",
"files_changed": 4
},
{
"ts": "2026-05-18T19:41:29+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:41 (~2)",
"hash": "a869cf9",
"files_changed": 2
},
{
"ts": "2026-05-18T11:42:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-18 19:41 (~2)",
"files_changed": 2
},
{
"ts": "2026-05-18T19:46:53+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:46 (~2)",
"hash": "a6f03fd",
"files_changed": 2
},
{
"ts": "2026-05-18T19:52:19+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:52 (~3)",
"hash": "2219f96",
"files_changed": 3
},
{
"ts": "2026-05-18T11:52:19Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交auto-save 2026-05-18 19:52 (~3)",
"files_changed": 1
},
{
"ts": "2026-05-18T19:57:44+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 19:57 (~4)",
"hash": "699fdcd",
"files_changed": 4
},
{
"ts": "2026-05-18T12:02:20Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-18 19:57 (~4)",
"files_changed": 2
},
{
"ts": "2026-05-18T20:03:09+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 20:03 (~3)",
"hash": "e4a56f2",
"files_changed": 3
},
{
"ts": "2026-05-18T20:07:11+08:00",
"type": "commit",
"message": "feat: enforce english prompt language strategy",
"hash": "bc0b010",
"files_changed": 4
},
{
"ts": "2026-05-18T12:12:20Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交feat: enforce english prompt language strategy",
"files_changed": 2
} }
] ]
} }

View File

@@ -469,10 +469,29 @@ nextjs-portal {
信息流工作台 · 登录页同源质感 信息流工作台 · 登录页同源质感
============================================================ */ ============================================================ */
.skg-board-theme { .skg-board-theme {
--skg-gold-1: #d6b36a;
--skg-gold-2: #c89b3c;
--skg-cream: #f5efe3;
--skg-bg-1: #0a0a0a;
--skg-bg-2: #111111;
--skg-bg-3: rgba(255, 255, 255, 0.035);
--skg-border: rgba(255, 255, 255, 0.1);
--skg-text-1: #ffffff;
--skg-text-2: rgba(255, 255, 255, 0.62);
--skg-text-3: rgba(255, 255, 255, 0.34);
--skg-success: #34d399;
--skg-warn: #fcd34d;
--skg-danger: #fb7185;
--skg-info: #67e8f9;
--skg-radius-sm: 6px;
--skg-radius-md: 8px;
--skg-radius-lg: 12px;
--skg-shadow-button: 0 6px 24px -8px rgba(0, 0, 0, 0.45);
color: var(--skg-text-1);
background: background:
radial-gradient(circle at 12% 2%, rgba(214, 179, 106, 0.13), transparent 31%), radial-gradient(circle at 52% 4%, rgba(214, 179, 106, 0.1), transparent 30%),
radial-gradient(circle at 82% 8%, rgba(143, 176, 113, 0.1), transparent 26%), radial-gradient(circle at 12% 96%, rgba(214, 179, 106, 0.065), transparent 34%),
linear-gradient(120deg, #050706 0%, #070b09 42%, #030303 100%); linear-gradient(120deg, #0a0a0a 0%, #10100f 46%, #050505 100%);
} }
.skg-board-theme::before { .skg-board-theme::before {
@@ -501,17 +520,16 @@ nextjs-portal {
.skg-board-ambient { .skg-board-ambient {
background: background:
radial-gradient(circle at 22% 18%, rgba(214, 179, 106, 0.16), transparent 26%), radial-gradient(circle at 78% 0%, rgba(232, 201, 122, 0.08), transparent 30%),
radial-gradient(circle at 68% 10%, rgba(143, 176, 113, 0.11), transparent 28%), radial-gradient(circle at 8% 100%, rgba(214, 179, 106, 0.06), transparent 34%);
radial-gradient(circle at 52% 100%, rgba(214, 179, 106, 0.08), transparent 36%);
} }
.skg-board-topbar, .skg-board-topbar,
.skg-board-panel { .skg-board-panel {
border-color: rgba(160, 182, 129, 0.14) !important; border-color: var(--skg-border) !important;
background: background:
linear-gradient(180deg, rgba(255, 255, 255, 0.055), rgba(255, 255, 255, 0.026)), linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.022)),
rgba(6, 11, 8, 0.58) !important; rgba(17, 17, 17, 0.74) !important;
box-shadow: box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.06),
0 18px 54px rgba(0, 0, 0, 0.34); 0 18px 54px rgba(0, 0, 0, 0.34);
@@ -520,8 +538,8 @@ nextjs-portal {
.skg-board-topbar { .skg-board-topbar {
background: background:
linear-gradient(100deg, rgba(214, 179, 106, 0.08), rgba(143, 176, 113, 0.035) 42%, rgba(255, 255, 255, 0.03)), linear-gradient(100deg, rgba(214, 179, 106, 0.075), rgba(255, 255, 255, 0.03) 54%, rgba(214, 179, 106, 0.035)),
rgba(4, 8, 6, 0.62) !important; rgba(12, 12, 12, 0.76) !important;
} }
.skg-board-theme input:focus, .skg-board-theme input:focus,
@@ -541,11 +559,22 @@ nextjs-portal {
} }
.skg-board-theme--light { .skg-board-theme--light {
color: #22261f; --skg-bg-1: #faf8f4;
--skg-bg-2: #ffffff;
--skg-bg-3: rgba(0, 0, 0, 0.03);
--skg-border: rgba(0, 0, 0, 0.08);
--skg-text-1: #0a0a0a;
--skg-text-2: rgba(0, 0, 0, 0.62);
--skg-text-3: rgba(0, 0, 0, 0.34);
--skg-success: #059669;
--skg-warn: #b7791f;
--skg-danger: #e11d48;
--skg-info: #0891b2;
color: var(--skg-text-1);
background: background:
radial-gradient(circle at 12% 0%, rgba(214, 179, 106, 0.18), transparent 30%), radial-gradient(circle at 50% 0%, rgba(232, 212, 168, 0.18), transparent 31%),
radial-gradient(circle at 82% 8%, rgba(143, 176, 113, 0.14), transparent 28%), radial-gradient(circle at 4% 100%, rgba(214, 179, 106, 0.12), transparent 28%),
linear-gradient(126deg, #f7f4ea 0%, #eef1e7 48%, #f9f6ee 100%); linear-gradient(126deg, #faf8f4 0%, #f4efe5 48%, #ffffff 100%);
} }
.skg-board-theme--light::before { .skg-board-theme--light::before {
@@ -669,6 +698,163 @@ nextjs-portal {
color: #171a14; color: #171a14;
} }
.skg-board-brand {
display: flex;
min-width: 0;
align-items: center;
gap: 14px;
}
.skg-board-brand__logo-chip {
display: inline-flex;
height: 42px;
width: 132px;
flex-shrink: 0;
align-items: center;
justify-content: center;
border: 1px solid rgba(214, 179, 106, 0.24);
border-radius: var(--skg-radius-md);
background: #f5efe3;
box-shadow: var(--skg-shadow-button);
}
.skg-board-brand__logo {
width: 96px;
height: auto;
display: block;
}
.skg-board-brand__system {
font-size: 12px;
font-weight: 700;
letter-spacing: 0.16em;
color: var(--skg-gold-1);
}
.skg-board-brand__title {
margin-top: 3px;
color: var(--skg-text-1);
font-size: 20px;
font-weight: 650;
line-height: 1.1;
letter-spacing: 0;
}
.skg-board-brand__subtitle {
margin-top: 4px;
color: var(--skg-text-3);
font-size: 12px;
line-height: 1.3;
}
.skg-stat-card {
border: 1px solid rgba(214, 179, 106, 0.18);
border-radius: var(--skg-radius-md);
background: var(--skg-cream);
color: #0a0a0a;
box-shadow: var(--skg-shadow-button);
}
.skg-stat-card__label {
color: rgba(0, 0, 0, 0.5);
}
.skg-stat-card__value {
color: #0a0a0a;
}
.skg-primary-action {
border-radius: var(--skg-radius-md);
background: #f5efe3;
color: #0a0a0a;
box-shadow: var(--skg-shadow-button);
}
.skg-primary-action:hover {
background: #fff7df;
}
.skg-secondary-action {
border: 1px solid rgba(214, 179, 106, 0.3);
border-radius: var(--skg-radius-md);
background: rgba(214, 179, 106, 0.08);
color: var(--skg-gold-1);
}
.skg-secondary-action:hover {
border-color: rgba(214, 179, 106, 0.54);
background: rgba(214, 179, 106, 0.12);
color: #f5d98e;
}
.skg-empty-state {
border: 1px dashed rgba(214, 179, 106, 0.22);
border-radius: var(--skg-radius-lg);
background:
radial-gradient(circle at 50% 0%, rgba(214, 179, 106, 0.1), transparent 38%),
rgba(255, 255, 255, 0.028);
color: var(--skg-text-3);
}
.skg-empty-character {
width: min(230px, 82%);
margin: 0 auto 12px;
pointer-events: none;
}
.skg-empty-character .login-character-stage {
min-height: 112px;
border-color: rgba(214, 179, 106, 0.16);
background:
radial-gradient(circle at 78% 18%, rgba(214, 179, 106, 0.16), transparent 28%),
linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.026));
box-shadow: none;
}
.skg-empty-character .login-character-stage::after,
.skg-empty-character .login-stage-grid {
display: none;
}
.skg-empty-character .login-characters-container {
bottom: -6px;
transform: translateX(-50%) scale(0.22);
}
.skg-board-theme--light .skg-board-brand__logo-chip {
background: #ffffff;
}
.skg-board-theme--light .skg-stat-card {
background: #0a0a0a;
color: #fff;
box-shadow: 0 10px 24px -12px rgba(133, 96, 21, 0.38);
}
.skg-board-theme--light .skg-stat-card__label {
color: rgba(255, 255, 255, 0.54);
}
.skg-board-theme--light .skg-stat-card__value {
color: #fff;
}
.skg-board-theme--light .skg-primary-action {
background: #0a0a0a;
color: #fff;
box-shadow: 0 10px 24px -12px rgba(133, 96, 21, 0.42);
}
.skg-board-theme--light .skg-primary-action:hover {
background: #252525;
}
.skg-board-theme--light .skg-empty-state {
background:
radial-gradient(circle at 50% 0%, rgba(232, 212, 168, 0.28), transparent 38%),
rgba(255, 255, 255, 0.66);
}
.login-hero { .login-hero {
isolation: isolate; isolation: isolate;
color: #282828; color: #282828;

View File

@@ -59,6 +59,7 @@ import {
} from "@/lib/api" } from "@/lib/api"
import { type NodeData } from "@/components/nodes" import { type NodeData } from "@/components/nodes"
import { MediaAssetTile } from "@/components/media-asset-tile" import { MediaAssetTile } from "@/components/media-asset-tile"
import { AnimatedLoginCharacters } from "@/components/login/animated-login-characters"
const TARGETS: Array<{ value: FrameExtractTarget; label: string }> = [ const TARGETS: Array<{ value: FrameExtractTarget; label: string }> = [
{ value: "balanced", label: "综合" }, { value: "balanced", label: "综合" },
@@ -1938,21 +1939,27 @@ export function AdRecreationBoard({
<div className="skg-board-ambient pointer-events-none absolute inset-0" /> <div className="skg-board-ambient pointer-events-none absolute inset-0" />
<div className="relative z-10 flex h-full flex-col px-4 py-4"> <div className="relative z-10 flex h-full flex-col px-4 py-4">
<header className="skg-board-topbar mb-3 flex items-center justify-between gap-4 rounded-lg border border-white/10 bg-white/[0.04] px-4 py-3"> <header className="skg-board-topbar mb-3 flex items-center justify-between gap-4 rounded-lg border border-white/10 bg-white/[0.04] px-4 py-3">
<div className="min-w-0"> <div className="skg-board-brand">
<div className="text-[11px] font-medium uppercase tracking-[0.18em] text-white/40">feed ad recreation worksheet</div> <div className="skg-board-brand__logo-chip" aria-hidden="true">
<h1 className="mt-1 text-[22px] font-semibold leading-tight text-white">广</h1> <img className="skg-board-brand__logo" src="/skg-logo-black.svg" alt="" />
</div>
<div className="min-w-0">
<div className="skg-board-brand__system"> · </div>
<h1 className="skg-board-brand__title"> · TK </h1>
<p className="skg-board-brand__subtitle">广线</p>
</div>
</div> </div>
<div className="flex shrink-0 items-center gap-2"> <div className="flex shrink-0 items-center gap-2">
<button <button
type="button" type="button"
onClick={toggleBoardTheme} onClick={toggleBoardTheme}
className="skg-board-theme-toggle inline-flex h-10 items-center gap-1.5 rounded-md border border-white/10 bg-black/24 px-3 text-[11px] font-semibold text-white/62 transition hover:border-[#d6b36a]/45 hover:text-white" className="skg-board-theme-toggle skg-secondary-action inline-flex h-10 items-center gap-1.5 px-3 text-[11px] font-semibold transition"
title={boardTheme === "dark" ? "切换到明亮模式" : "切换到暗色模式"} title={boardTheme === "dark" ? "切换到明亮模式" : "切换到暗色模式"}
> >
{boardTheme === "dark" ? <Sun className="h-3.5 w-3.5" /> : <Moon className="h-3.5 w-3.5" />} {boardTheme === "dark" ? <Sun className="h-3.5 w-3.5" /> : <Moon className="h-3.5 w-3.5" />}
{boardTheme === "dark" ? "明亮" : "暗色"} {boardTheme === "dark" ? "明亮" : "暗色"}
</button> </button>
<div className="grid min-w-[520px] grid-cols-5 gap-2 text-[11px] text-white/48"> <div className="grid min-w-[520px] grid-cols-5 gap-2 text-[11px]">
<Metric label="素材" value={`${jobs.length}`} /> <Metric label="素材" value={`${jobs.length}`} />
<Metric label="当前" value={shortId(activeJobId)} /> <Metric label="当前" value={shortId(activeJobId)} />
<Metric label="视频" value={job?.video_url ? "ready" : "-"} /> <Metric label="视频" value={job?.video_url ? "ready" : "-"} />
@@ -2102,20 +2109,20 @@ function MaterialColumn({
onChange={(e) => setUrl(e.target.value)} onChange={(e) => setUrl(e.target.value)}
onKeyDown={(e) => { if (e.key === "Enter") onSubmitUrl() }} onKeyDown={(e) => { if (e.key === "Enter") onSubmitUrl() }}
placeholder="粘贴 TK / 信息流视频链接" placeholder="粘贴 TK / 信息流视频链接"
className="h-10 min-w-0 flex-1 rounded-md border border-white/10 bg-black/45 px-3 text-[13px] text-white outline-none placeholder:text-white/28 focus:border-cyan-300/60" className="h-10 min-w-0 flex-1 rounded-md border border-white/10 bg-black/45 px-3 text-[13px] text-white outline-none placeholder:text-white/28 focus:border-[#d6b36a]/60"
/> />
<button <button
type="button" type="button"
onClick={onStartProduction} onClick={onStartProduction}
disabled={data.submitting || (!url.trim() && !job)} disabled={data.submitting || (!url.trim() && !job)}
className="inline-flex h-10 items-center justify-center rounded-md bg-[#f0ead8] px-3 text-[13px] font-semibold text-black shadow-[0_14px_28px_rgba(0,0,0,0.28)] transition hover:bg-[#fff7df] disabled:cursor-not-allowed disabled:opacity-45" className="skg-primary-action inline-flex h-10 items-center justify-center px-3 text-[13px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-45"
> >
{actionLabel} {actionLabel}
</button> </button>
<button <button
type="button" type="button"
onClick={() => fileRef.current?.click()} onClick={() => fileRef.current?.click()}
className="inline-flex h-10 w-10 items-center justify-center rounded-md border border-white/10 bg-white/[0.06] text-white/75 transition hover:border-white/25 hover:bg-white/[0.1]" className="skg-secondary-action inline-flex h-10 w-10 items-center justify-center transition disabled:cursor-not-allowed disabled:opacity-45"
aria-label="上传视频" aria-label="上传视频"
title="上传视频" title="上传视频"
> >
@@ -5068,9 +5075,9 @@ function MaterialCard({
function Metric({ label, value, compact }: { label: string; value: string; compact?: boolean }) { function Metric({ label, value, compact }: { label: string; value: string; compact?: boolean }) {
return ( return (
<div className={`rounded-md border border-white/10 bg-black/35 ${compact ? "px-2 py-1" : "px-2 py-1.5"}`}> <div className={`skg-stat-card ${compact ? "px-2 py-1" : "px-2.5 py-1.5"}`}>
<div>{label}</div> <div className="skg-stat-card__label">{label}</div>
<div className="mt-0.5 truncate font-mono text-[12px] text-white/78">{value}</div> <div className="skg-stat-card__value mt-0.5 truncate font-mono text-[13px] font-semibold">{value}</div>
</div> </div>
) )
} }
@@ -5181,7 +5188,7 @@ function ActionButton({
type="button" type="button"
disabled={disabled} disabled={disabled}
onClick={onClick} onClick={onClick}
className={`inline-flex h-10 cursor-pointer items-center justify-center gap-1.5 rounded-md px-3 text-[12px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40 ${variant === "solid" ? "bg-white text-black hover:bg-white/90" : "border border-white/10 bg-white/[0.04] text-white/72 hover:border-white/25 hover:text-white"}`} className={`inline-flex h-10 cursor-pointer items-center justify-center gap-1.5 px-3 text-[12px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40 ${variant === "solid" ? "skg-primary-action" : "skg-secondary-action"}`}
> >
{children} {children}
</button> </button>
@@ -5190,8 +5197,11 @@ function ActionButton({
function EmptyState({ text }: { text: string }) { function EmptyState({ text }: { text: string }) {
return ( return (
<div className="rounded-lg border border-dashed border-white/12 bg-black/25 px-3 py-8 text-center text-[12px] text-white/38"> <div className="skg-empty-state px-3 py-8 text-center text-[12px]">
{text} <div className="skg-empty-character" aria-hidden="true">
<AnimatedLoginCharacters mood="idle" eyeOffset={{ x: 0, y: 0 }} />
</div>
<div>{text}</div>
</div> </div>
) )
} }