fix(core): 测试清单 行24/28-39/46 — 流水线脚本&资产/消息页 + 单镜重跑后端接口
前端流水线(pipeline.tsx):脚本助手三选项指引(AI全生/一句话/自带脚本)+来源风格推荐;
风格/人物设定卡并持久化到 project.metadata;Enter发送/Shift+Enter换行;长文折叠10行;
生成进度流提示;分镜人物/场景标签可编辑并持久化+点击添加分镜;单镜重跑/删除即时反馈;
脚本助手记录按项目 localStorage 持久化;Stage2 基础资产补替换/重跑/可编辑提示词;
三视图采用弹窗+缺三视图气泡。
消息页(messages):复用全站 .search-inline 搜索框、去掉小标题背景方块。
视频项目(projects):列表按创建时间倒序,新建置顶。
性能:action 改后台 hydrate,消除创建/确认后白等(行29/37)。
后端(projects/ai):新增单镜 AI 重跑接口 POST /projects/{id}/rerun-script-segment/
(regenerate_script_segment 服务,复用 AITask+计费 reserve/charge/release;+2 单测)。
前端 build 通过;后端 check 0/无新迁移/apps.projects 14 测试通过。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -488,7 +488,84 @@
|
||||
.playhead::after { content: ''; position: absolute; top: 0; bottom: 0; left: 50%; transform: translateX(-50%); width: 1.5px; background: var(--heat); pointer-events: none; }
|
||||
.playhead::before { content: ''; position: absolute; top: -4px; left: 50%; transform: translateX(-50%) rotate(45deg); width: 10px; height: 10px; background: var(--heat); box-shadow: 0 0 0 1.5px var(--surface); border-radius: 1px; pointer-events: none; }
|
||||
.playhead .ph-grab { position: absolute; top: -10px; left: 50%; transform: translateX(-50%); width: 24px; height: 24px; cursor: ew-resize; pointer-events: auto; border-radius: 50%; }
|
||||
|
||||
/* ── 行34 · 脚本人物/场景可编辑 chip ── */
|
||||
.script-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 6px 2px 9px; background: var(--background-lighter); border: 1px solid var(--border-faint); border-radius: var(--r-pill); font-size: 12px; color: var(--accent-black); }
|
||||
.script-chip .chip-x { width: 15px; height: 15px; display: grid; place-items: center; background: transparent; border: 0; border-radius: 50%; color: var(--black-alpha-48); cursor: pointer; font-size: 13px; line-height: 1; padding: 0; }
|
||||
.script-chip .chip-x:hover { background: var(--black-alpha-08); color: var(--accent-crimson); }
|
||||
.tag-add-input { height: 22px; width: 76px; padding: 0 8px; font-size: 12px; font-family: inherit; color: var(--accent-black); background: var(--surface); border: 1px solid var(--heat); border-radius: var(--r-pill); outline: none; }
|
||||
.tag-add-input::placeholder { color: var(--black-alpha-40); }
|
||||
|
||||
/* ── 行33 · 进度提示流 ── */
|
||||
.progress-stream { display: flex; flex-direction: column; gap: 6px; }
|
||||
.progress-stream .ps-row { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; line-height: 1.5; animation: psRowIn .28s ease; }
|
||||
.progress-stream .ps-row .ps-dot { width: 6px; height: 6px; margin-top: 6px; border-radius: 50%; background: var(--heat); flex: 0 0 6px; }
|
||||
.progress-stream .ps-row.past { color: var(--black-alpha-48); }
|
||||
.progress-stream .ps-row.past .ps-dot { background: var(--black-alpha-24); }
|
||||
.progress-stream .ps-row.active { color: var(--accent-black); }
|
||||
.progress-stream .ps-row.active .ps-dot { animation: prog-pulse 1.2s ease-in-out infinite; }
|
||||
.progress-stream.done { display: inline-flex; flex-direction: row; align-items: center; gap: 7px; font-size: 13px; color: var(--accent-forest); }
|
||||
.progress-stream.done .ps-check { width: 16px; height: 16px; display: grid; place-items: center; background: var(--forest-bg); color: var(--accent-forest); border-radius: 50%; flex: 0 0 16px; }
|
||||
.progress-stream.done .ps-check svg { width: 10px; height: 10px; }
|
||||
|
||||
/* ── 行32 · 长文本折叠 ── */
|
||||
.clamp-lines { display: -webkit-box; -webkit-line-clamp: var(--clamp-lines, 10); -webkit-box-orient: vertical; overflow: hidden; white-space: pre-wrap; word-break: break-word; }
|
||||
.clamp-toggle { margin-top: 6px; padding: 0; background: none; border: 0; color: var(--heat); font-family: inherit; font-size: 12px; cursor: pointer; }
|
||||
.clamp-toggle:hover { text-decoration: underline; }
|
||||
|
||||
/* ── 行28/行30 · 生成前「来源 & 风格 & 人物」设定卡 ── */
|
||||
.bubble.setup-card { width: 100%; max-width: 100%; display: flex; flex-direction: column; gap: 4px; }
|
||||
.setup-card .setup-lead { font-size: 13px; line-height: 1.5; color: var(--accent-black); margin-bottom: 6px; }
|
||||
.setup-card .setup-field { display: grid; grid-template-columns: 40px 1fr; align-items: center; gap: 10px; }
|
||||
.setup-card .setup-field .sf-k { font-family: var(--font-mono); font-size: 12px; color: var(--black-alpha-48); letter-spacing: .04em; }
|
||||
.setup-card .setup-select { height: 32px; width: 100%; padding: 0 10px; font-size: 13px; font-family: inherit; color: var(--accent-black); background: var(--surface); border: 1px solid var(--border-faint); border-radius: var(--r-sm); outline: none; cursor: pointer; }
|
||||
.setup-card .setup-select:focus { border-color: var(--heat); box-shadow: 0 0 0 3px var(--heat-12); }
|
||||
.setup-card .setup-rec { grid-column: 2; margin-left: 50px; font-size: 12px; color: var(--black-alpha-40); margin: 0 0 8px 50px; }
|
||||
.setup-card .setup-foot { display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 4px; }
|
||||
|
||||
/* ── 行34 · 添加分镜:本地草稿可编辑卡片 ── */
|
||||
.draft-shot-card { background: var(--heat-12); border-radius: var(--r-md); border-bottom: 1px solid var(--heat-20); }
|
||||
.draft-shot-card .shot-n { background: var(--heat); color: var(--accent-white); }
|
||||
.draft-shot-input { width: 100%; font-family: inherit; font-size: 13px; line-height: 1.55; color: var(--accent-black); background: var(--surface); border: 1px solid var(--border-faint); border-radius: var(--r-sm); padding: 5px 8px; outline: none; resize: vertical; min-height: 30px; }
|
||||
.draft-shot-input:focus { border-color: var(--heat); box-shadow: 0 0 0 2px var(--heat-12); }
|
||||
.draft-shot-input::placeholder { color: var(--black-alpha-32); }
|
||||
|
||||
/* ── 行38 · 资产卡可编辑提示词 + 重跑/替换 ── */
|
||||
.asset-prompt-edit { width: 100%; margin-top: 8px; font-family: var(--font-mono); font-size: 12px; line-height: 1.55; letter-spacing: .01em; color: var(--black-alpha-72); background: var(--background-base); border: 1px solid var(--border-faint); border-radius: var(--r-sm); padding: 8px 10px; outline: none; resize: vertical; min-height: 56px; transition: border-color var(--t-base), background var(--t-base), box-shadow var(--t-base); }
|
||||
.asset-prompt-edit:hover { border-color: var(--heat-20); }
|
||||
.asset-prompt-edit:focus { border-color: var(--heat); background: var(--surface); color: var(--accent-black); box-shadow: 0 0 0 3px var(--heat-12); }
|
||||
.asset-prompt-edit::placeholder { color: var(--black-alpha-32); }
|
||||
.asset-card-actions { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
|
||||
.asset-card-actions .btn { display: inline-flex; align-items: center; }
|
||||
|
||||
/* ── 行39 · 缺三视图悬浮气泡 ── */
|
||||
.tri-missing-badge { position: absolute; top: 10px; left: 10px; z-index: 3; display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; background: var(--surface); border: 1px solid rgba(180,83,9,.30); border-radius: var(--r-pill); color: #B45309; font-size: 12px; cursor: help; }
|
||||
.tri-missing-badge .ico { width: 6px; height: 6px; border-radius: 50%; background: #B45309; }
|
||||
.tri-missing-badge .lbl-mono { font-family: var(--font-mono); letter-spacing: .02em; }
|
||||
.tri-missing-badge .tri-missing-pop { position: absolute; top: calc(100% + 8px); left: 0; width: 260px; padding: 12px 14px; background: var(--surface); border: 1px solid var(--border-faint); border-radius: var(--r-md); box-shadow: 0 12px 32px rgba(0,0,0,.14); opacity: 0; visibility: hidden; transform: translateY(-4px); transition: opacity var(--t-base), transform var(--t-base), visibility var(--t-base); z-index: 20; pointer-events: none; display: flex; flex-direction: column; gap: 6px; cursor: default; }
|
||||
.tri-missing-badge:hover .tri-missing-pop, .tri-missing-badge:focus-visible .tri-missing-pop { opacity: 1; visibility: visible; transform: translateY(0); }
|
||||
.tri-missing-pop .pop-h { display: inline-flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 12px; letter-spacing: .04em; color: #B45309; }
|
||||
.tri-missing-pop .pop-body { font-size: 12px; line-height: 1.55; color: var(--accent-black); }
|
||||
.tri-missing-pop .pop-tip { font-size: 12px; line-height: 1.5; color: var(--black-alpha-56); }
|
||||
.tri-missing-pop b { color: var(--heat); }
|
||||
|
||||
/* ── 行39 · 三视图选择弹窗 ── */
|
||||
.tri-modal { width: min(720px, 100%); }
|
||||
.tri-modal .tri-modal-tip { font-size: 13px; line-height: 1.55; color: var(--black-alpha-72); padding: 10px 12px; background: var(--heat-12); border: 1px solid var(--heat-20); border-radius: var(--r-md); margin-bottom: 16px; }
|
||||
.tri-modal .tri-modal-tip b { color: var(--heat); }
|
||||
.tri-cand-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; }
|
||||
.tri-cand-card { border: 1px solid var(--border-faint); border-radius: var(--r-md); overflow: hidden; cursor: pointer; background: var(--surface); transition: border-color var(--t-base), box-shadow var(--t-base); }
|
||||
.tri-cand-card:hover { border-color: var(--heat); box-shadow: 0 1px 3px rgba(0,0,0,.04); }
|
||||
.tri-cand-card.adopted { border-color: var(--heat); }
|
||||
.tri-cand-card .tri-cand-img { aspect-ratio: 16/9; }
|
||||
.tri-cand-card .tri-cand-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; }
|
||||
.tri-cand-card .tri-cand-foot .mono { font-family: var(--font-mono); font-size: 12px; color: var(--black-alpha-48); }
|
||||
.tri-empty { text-align: center; padding: 8px 0; }
|
||||
.tri-empty .tri-empty-hint { font-size: 13px; line-height: 1.6; color: var(--black-alpha-56); margin-top: 14px; }
|
||||
}
|
||||
|
||||
/* 进度流逐条滚入(顶层 @keyframes 才注册) */
|
||||
@keyframes psRowIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
|
||||
|
||||
/* 顶层 @keyframes:嵌套进 .pipeline-page 块内不会注册,动画不执行(product-detail 同坑) */
|
||||
@keyframes edXfadeFlash { from { opacity: 0.72; } to { opacity: 0; } }
|
||||
|
||||
Reference in New Issue
Block a user