feat(workbench): 统一立绘详情页参考布局 · 三视图全 16:9 · 工作台批次追加

详情页 (pipeline / library / model-photo)
- 统一参考布局:大立绘+缩略 strip+查看大图,右栏 三视图+简介(标签 chip)+3 列属性表
- 底部仅留「下载」+「使用该资产」,去除收藏 / 关闭

三视图固定单张 16:9
- pipeline / library / model-photo / asset-factory / product-studio 全部同步
- 移除原 actor 3 列 3:4 拆图,改为单容器 16:9

图片工作台 (model-photo / platform-cover)
- 立即生成 + 全部重跑 + 单张重跑 均追加新批次到下方,旧批次保留
- 批量按钮下沉到每批次下方,与图片网格左对齐
- hover 重跑/采用 icon 缩小至 26px,右下角横向,无遮罩层
- 立即生成后不再自动新增「编辑中」草稿卡

新建商品 drawer
- 无 onSave 回调时默认跳转 product-detail
- 卖点新增 「+ 添加卖点」按钮(输入框下方独立行,左对齐)

product-detail
- 视频项目卡片状态 pill 改为 4 态(已完成/视频生成 4/6/已归档/故事板失败)
- 移除视频卡个体「通过/不通过/归档」状态切换
- 去掉冗余「通过」status 筛选;过滤逻辑兼容缺失按钮

sidebar (shell.js)
- 图片生成补 badge 12,团队去 badge

清理
- 删除 v2/ 历史镜像目录(与 电商AI平台/ 重复,Dockerfile build context 不依赖)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
iye
2026-05-21 21:12:03 +08:00
co-authored by Claude Opus 4.7
parent 2a3ae88dc5
commit 8a783ca36f
34 changed files with 2147 additions and 29201 deletions
+76 -4
View File
@@ -204,6 +204,25 @@
font-size: 13.5px;
}
#${DRAWER_ID} .bullet-list .bl-add { background: transparent; border-style: dashed; }
#${DRAWER_ID} .bullet-list .bl-add-row {
margin: 8px 0 0;
display: none;
padding: 0;
background: transparent;
border: 0;
}
#${DRAWER_ID} .bullet-list .bl-add-row.show { display: flex; justify-content: flex-start; }
#${DRAWER_ID} .bl-add-btn {
display: inline-flex; align-items: center; gap: 6px;
padding: 7px 14px;
background: var(--heat); color: #fff;
border: 0; border-radius: var(--r-md);
font-size: 13px; font-weight: 600;
cursor: pointer; font-family: inherit;
transition: filter var(--t-base);
}
#${DRAWER_ID} .bl-add-btn:hover { filter: brightness(.94); }
#${DRAWER_ID} .bl-add-btn svg { width: 12px; height: 12px; }
#${DRAWER_ID} .bullet-list .num {
width: 22px; height: 22px;
background: var(--surface);
@@ -298,7 +317,13 @@
<div class="field" style="margin-bottom: 0;">
<label class="field-label">核心卖点<span class="req">*</span></label>
<ul class="bullet-list" data-f="bullets">
<li class="bl-add"><span class="num">+</span><input class="bl-input" placeholder="添加新卖点 · 回车确认"></li>
<li class="bl-add"><span class="num">+</span><input class="bl-input" placeholder="添加新卖点 · 回车或点击下方按钮"></li>
<li class="bl-add-row" data-f="add-row">
<button type="button" class="bl-add-btn" data-act="bl-add">
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M8 3v10M3 8h10"/></svg>
添加卖点
</button>
</li>
</ul>
</div>
</div>
@@ -371,6 +396,13 @@
if (act === 'guide') return toast('使用指南', '点击查看完整填写指南');
if (act === 'save') return save();
if (act === 'upload-zone') return openFilePicker();
if (act === 'bl-add') {
blAdd($blInput.value);
$blInput.value = '';
$blInput.focus();
updateBlAddBtn();
return;
}
});
document.addEventListener('keydown', e => {
if (e.key === 'Escape' && drawer.classList.contains('show')) close();
@@ -388,8 +420,20 @@
// 卖点 bullet-list
$blInput.addEventListener('keydown', e => {
if (e.key === 'Enter') { e.preventDefault(); blAdd($blInput.value); $blInput.value = ''; }
if (e.key === 'Enter') {
e.preventDefault();
blAdd($blInput.value);
$blInput.value = '';
updateBlAddBtn();
}
});
$blInput.addEventListener('input', updateBlAddBtn);
}
function updateBlAddBtn() {
const row = $bullets && $bullets.querySelector('[data-f="add-row"]');
if (!row) return;
row.classList.toggle('show', !!($blInput.value || '').trim());
}
function openFilePicker() { if (pfFiles.length < PF_MAX) $f.file.click(); }
@@ -465,6 +509,7 @@
pfRender();
[...$bullets.querySelectorAll('.bl-item')].forEach(li => li.remove());
$blInput.value = '';
updateBlAddBtn();
}
function lockBody() {
@@ -550,9 +595,36 @@
images,
imgs: images.length,
};
// 持久化到 localStorage('fs-extra-products'),让 products.html 下次加载时
// 自动从 storage 读出并 prepend 到 grid(否则用户在工作台创建后 → 跳详情 →
// 回商品库会看不到刚创建的商品)
try {
const KEY = 'fs-extra-products';
const list = JSON.parse(localStorage.getItem(KEY) || '[]');
list.push({
id: product.id,
name, cat,
tags: '',
assets: 0,
videos: 0,
bullets: points,
date: new Date().toISOString().slice(0, 10),
createdAt: Date.now(),
});
localStorage.setItem(KEY, JSON.stringify(list));
} catch (e) { /* storage 不可用降级到只跳转 */ }
if (typeof currentOpts.onSave === 'function') {
toast('商品已创建', '+ ' + name);
currentOpts.onSave(product);
close();
return;
}
// 默认行为: 不 close drawer · 跳转期间 drawer 仍覆盖 host 页面 → 视觉上彻底
// 消除"闪 host"(浏览器导航开始后,整页被新页面替换,drawer 自然消失)
toast('商品已创建', '+ ' + name);
if (typeof currentOpts.onSave === 'function') currentOpts.onSave(product);
close();
const url = 'product-detail.html?product=' + encodeURIComponent(name) + '&id=new';
location.href = url;
}
window.NewProductDrawer = { open, close };