14 Commits

Author SHA1 Message Date
stringadmin 526ad490f7 Merge branch 'main' into feat/ecommerce-record-detail-conversation-panel 2026-06-16 05:07:45 +00:00
ludan 4993f6eeec feat: implement multi-turn conversation system for generation record detail with deduplication enhancement
- generationRecordClient.ts: Enhance save deduplication with payload signature — replace simple recordId-based dedup with stableJsonStringify-based signature comparison; same recordId + same signature skips save, changed payload proceeds; add buildSaveSignature covering tool/mode/title/status/prompt/taskIds/assets/config/result/metadata; store signature alongside savedAt in recentlySavedRecords map for per-turn save accuracy
- EcommercePage.tsx: Introduce EcommerceHistoryTurn interface and multi-turn conversation architecture —
  - Add EcommerceHistoryTurn with full generation context (status/output/platform/market/language/ratio/requirement/images/results/counts/modules/scenes/replicateLevel); EcommerceHistoryRecord gains status/errorMessage/turns[] fields
  - beginEcommerceHistoryTurn() — start a new generation turn, create or append to record, persist to localStorage immediately
  - updateLocalEcommerceHistoryTurn() — real-time turn status sync (generating→done/failed) with record summary mirroring via syncRecordSummaryWithTurn()
  - restoreHistoryTurnInputs() — one-click parameter restoration from failed turns for retry
  - upsertCanvasNode() — insert or update canvas node by ID (dedup by turnId), alternating row layout (x: index*420, y: 0 or 160)
  - Generate flow wired to turns: status callbacks update turn state; cancel sets turn to failed; results written to turn.results
  - Record detail conversation panel refactored from single-message to per-turn iteration — each turn renders user message (requirement + meta + assets) and assistant message (status-aware text + progress bar during generation + result thumbnails); failed turns show "恢复参数" retry button; generating turn shows EcommerceProgressBar
  - openEcommerceHistoryRecord() loads all turns as canvas nodes with distributed positions; preserves generating turn tracking via activeHistoryTurnIdRef
  - History list items display status label (生成中/失败/time)
  - Product set preview backdrop moved to createPortal(document.body) with z-index 4000
- pages/ecommerce.css: Bump product-set-preview-backdrop z-index from 100 to 4000 for Portal rendering layer
2026-06-16 13:02:11 +08:00
Codex 79f220dbbf feat: add responsive layouts for template cards and hot clone 2026-06-16 11:44:55 +08:00
Codex c1c7cb3cc7 fix ecommerce preview and module compatibility 2026-06-15 22:00:00 +08:00
Codex b67f2e7601 Merge branch 'main' of http://118.145.251.184:3000/OmniAI/omniai-ds-code-package into codex/main-latest-20260615-030000 2026-06-15 21:56:00 +08:00
Codex f056547160 fix: align hot clone reference upload UI 2026-06-15 19:59:00 +08:00
Codex de3eb1d06a merge main and adjust clone mode tabs 2026-06-15 18:25:38 +08:00
stringadmin f929be30ed Merge pull request 'feat: 优化记录详情对话面板布局与视觉层次' (#17) from feat/ecommerce-chat-polish into main
Reviewed-on: #17
2026-06-15 10:24:35 +00:00
stringadmin a2875738ce Merge branch 'main' into feat/ecommerce-chat-polish 2026-06-15 10:24:30 +00:00
Codex 66b761314b chore: re-trigger push 2026-06-15 16:52:15 +08:00
stringadmin ab99e3bf2f Merge pull request 'feat: 完善电商记录详情页,支持触摸手势交互、对话式需求面板与画布节点拖拽' (#16) from feat/ecommerce-record-detail-polish into main
Reviewed-on: #16
2026-06-15 08:38:41 +00:00
Codex 9a9c7eb86d feat: optimize ecommerce hot clone UI 2026-06-15 15:26:49 +08:00
Codex 48262d6233 chore: 新增 .gitattributes 统一换行符为 LF 2026-06-15 10:52:03 +08:00
Codex 062c8b3445 feat: 临时下线智能抠图与图片翻译入口 2026-06-15 10:42:33 +08:00
37 changed files with 1929 additions and 385 deletions
+43
View File
@@ -0,0 +1,43 @@
# 自动检测文本文件并统一换行符
* text=auto eol=lf
# 源码强制使用 LF(跨平台一致)
*.ts text eol=lf
*.tsx text eol=lf
*.js text eol=lf
*.jsx text eol=lf
*.mjs text eol=lf
*.cjs text eol=lf
*.json text eol=lf
*.css text eol=lf
*.html text eol=lf
*.md text eol=lf
*.svg text eol=lf
# 配置类(统一 LF
*.yml text eol=lf
*.yaml text eol=lf
*.toml text eol=lf
*.conf text eol=lf
# Windows 专用脚本保持 CRLF
*.bat text eol=crlf
*.cmd text eol=crlf
# 二进制文件,不做换行符转换
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.webp binary
*.ico binary
*.woff binary
*.woff2 binary
*.ttf binary
*.eot binary
*.otf binary
*.mp4 binary
*.mp3 binary
*.pdf binary
*.zip binary
*.gz binary
+1
View File
@@ -0,0 +1 @@
export * from "./aiGenerationClient.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./apiErrorUtils.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./generationRecordClient.ts";
+38 -10
View File
@@ -43,15 +43,40 @@ export interface SaveGenerationRecordResult {
// 单个 poller 内也会重复触发。这里做客户端幂等:in-flight 合流 + 成功后短期拦截,
// 避免后端在缺少去重时插入重复记录。
const inFlightSaves = new Map<string, Promise<SaveGenerationRecordResult>>();
const recentlySavedAt = new Map<string, number>();
const recentlySavedRecords = new Map<string, { savedAt: number; signature: string }>();
const SAVE_DEDUPE_WINDOW_MS = 60_000;
function pruneRecentlySaved(now: number): void {
for (const [id, savedAt] of recentlySavedAt) {
if (now - savedAt > SAVE_DEDUPE_WINDOW_MS) recentlySavedAt.delete(id);
for (const [id, record] of recentlySavedRecords) {
if (now - record.savedAt > SAVE_DEDUPE_WINDOW_MS) recentlySavedRecords.delete(id);
}
}
function stableJsonStringify(value: unknown): string {
if (value === null || typeof value !== "object") return JSON.stringify(value);
if (Array.isArray(value)) return `[${value.map(stableJsonStringify).join(",")}]`;
const entries = Object.entries(value as Record<string, unknown>)
.filter(([, entryValue]) => entryValue !== undefined)
.sort(([a], [b]) => a.localeCompare(b));
return `{${entries.map(([key, entryValue]) => `${JSON.stringify(key)}:${stableJsonStringify(entryValue)}`).join(",")}}`;
}
function buildSaveSignature(input: SaveGenerationRecordInput): string {
return stableJsonStringify({
tool: input.tool,
mode: input.mode,
title: input.title,
status: input.status,
prompt: input.prompt,
taskIds: input.taskIds,
assets: input.assets,
config: input.config,
result: input.result,
metadata: input.metadata,
createdAt: input.createdAt,
});
}
function readPendingRecords(): SaveGenerationRecordInput[] {
try {
const raw = window.localStorage.getItem(PENDING_RECORDS_KEY);
@@ -78,26 +103,29 @@ export async function saveGenerationRecord(input: SaveGenerationRecordInput): Pr
pruneRecentlySaved(now);
const recordId = input.clientRecordId;
const signature = buildSaveSignature(input);
if (recordId) {
const inFlight = inFlightSaves.get(recordId);
const saveKey = `${recordId}:${signature}`;
const inFlight = inFlightSaves.get(saveKey);
if (inFlight) return inFlight;
const savedAt = recentlySavedAt.get(recordId);
if (savedAt !== undefined && now - savedAt <= SAVE_DEDUPE_WINDOW_MS) {
// 终态记录只需落库一次;窗口内的重复调用直接视为已保存。
const savedRecord = recentlySavedRecords.get(recordId);
if (savedRecord && savedRecord.signature === signature && now - savedRecord.savedAt <= SAVE_DEDUPE_WINDOW_MS) {
// 相同 clientRecordId 且 payload 完全一致时才拦截;同一记录的多轮更新需要继续保存。
return { source: "server", id: recordId };
}
}
const promise = saveGenerationRecordInternal(input);
if (recordId) {
inFlightSaves.set(recordId, promise);
const saveKey = `${recordId}:${signature}`;
inFlightSaves.set(saveKey, promise);
void promise
.then((result) => {
if (result.source === "server") recentlySavedAt.set(recordId, Date.now());
if (result.source === "server") recentlySavedRecords.set(recordId, { savedAt: Date.now(), signature });
})
.catch(() => undefined)
.finally(() => {
inFlightSaves.delete(recordId);
inFlightSaves.delete(saveKey);
});
}
return promise;
+1
View File
@@ -0,0 +1 @@
export * from "./serverConnection.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./taskSubscription.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./webGenerationGateway.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./toastStore.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./ossAssets.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./workflows.ts";
+2
View File
@@ -0,0 +1,2 @@
export { default } from "./EcommercePage.tsx";
export * from "./EcommercePage.tsx";
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
export * from "./ecommerceGenerationPersistence.ts";
@@ -0,0 +1 @@
export * from "./ecommerceImageValidation.ts";
@@ -0,0 +1 @@
export * from "./ecommerceTemplates.ts";
@@ -381,108 +381,6 @@ export default function EcommerceClonePanel({
</section>
) : null}
{cloneOutput === "hot" ? (
<section className="clone-ai-replicate-panel" aria-label="爆款图复刻设置">
<div className="clone-ai-dynamic-head">
<strong></strong>
<span></span>
</div>
<div className="clone-ai-replicate-section">
<span className="clone-ai-replicate-title"></span>
<div className="clone-ai-replicate-tabs" role="tablist" aria-label="参考内容来源">
<button
type="button"
className={cloneReferenceMode === "upload" ? "is-active" : ""}
aria-selected={cloneReferenceMode === "upload"}
onClick={() => setCloneReferenceMode("upload")}
>
</button>
<button
type="button"
className={cloneReferenceMode === "link" ? "is-active" : ""}
aria-selected={cloneReferenceMode === "link"}
onClick={() => setCloneReferenceMode("link")}
>
</button>
</div>
{cloneReferenceMode === "upload" ? (
<button
type="button"
className={`clone-ai-replicate-upload${isCloneReferenceDragging ? " is-dragging" : ""}${cloneReferenceImages.length ? " has-files" : ""}`}
onClick={() => cloneReferenceInputRef.current?.click()}
onDragOver={handleCloneReferenceDragOver}
onDragLeave={handleCloneReferenceDragLeave}
onDrop={handleCloneReferenceDrop}
>
{cloneReferenceImages.length ? (
<>
<div className="clone-ai-replicate-files">
{cloneReferenceImages.map((item) => (
<figure
key={item.id}
className="clone-ai-replicate-file"
onMouseEnter={(e) => handleFileMouseEnter(item.src, e)}
onMouseLeave={handleFileMouseLeave}
>
<img src={item.src} alt="" />
</figure>
))}
</div>
<span className="clone-ai-replicate-add-more">
<CloudUploadOutlined />
</span>
</>
) : (
<span>
<CloudUploadOutlined />
<span className="clone-ai-replicate-upload-text"></span>
</span>
)}
<em>{cloneReferenceImages.length ? `已选 ${cloneReferenceImages.length}/${maxCloneReferenceImages}` : `最多 ${maxCloneReferenceImages}`}</em>
{isCloneReferenceDragging ? (
<div className="clone-ai-replicate-upload-overlay">
<CloudUploadOutlined />
<span></span>
</div>
) : null}
</button>
) : (
<label className="clone-ai-replicate-link">
<input placeholder="粘贴商品图或详情页链接" />
</label>
)}
<input
ref={cloneReferenceInputRef}
type="file"
accept="image/jpeg,image/png,image/webp"
multiple
onChange={handleCloneReferenceUpload}
aria-label="上传参考图片"
/>
</div>
<div className="clone-ai-replicate-section">
<span className="clone-ai-replicate-title"></span>
<div className="clone-ai-replicate-levels" role="toolbar" aria-label="复刻程度">
{cloneReplicateLevelOptions.map((option) => (
<button
key={option.key}
type="button"
className={cloneReplicateLevel === option.key ? "is-active" : ""}
aria-pressed={cloneReplicateLevel === option.key}
onClick={() => setCloneReplicateLevel(option.key)}
>
<strong>{option.title}</strong>
<span>{option.desc}</span>
</button>
))}
</div>
</div>
</section>
) : null}
{cloneOutput === "set" ? (
<section className="clone-ai-count-panel" aria-label="套图图片数量">
<div className="clone-ai-dynamic-head">
@@ -0,0 +1 @@
export * from "./workbenchDownload.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useGenerationTasks.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useTypewriter.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./backgroundTaskRunner.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./index.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useAppStore.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useGenerationStore.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useProjectStore.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useSessionStore.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./useTaskStore.ts";
+672 -11
View File
@@ -2781,7 +2781,7 @@
position: absolute !important;
left: 50% !important;
z-index: 12 !important;
width: min(1036px, calc(100% - 56px)) !important;
width: min(1220px, calc(100% - 40px)) !important;
margin-right: 0 !important;
margin-left: 0 !important;
;
@@ -4537,6 +4537,275 @@
display: none !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page {
display: block !important;
height: 100% !important;
min-height: calc(100vh - 58px) !important;
overflow: hidden !important;
background: #f3f5f8 !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .product-clone-shell {
display: block !important;
width: 100% !important;
height: 100% !important;
padding: 0 !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .product-clone-rail,
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .product-clone-panel,
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .clone-ai-settings-toggle,
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-command-history {
display: none !important;
}
/* ── Hot Clone: requirement input in left panel ── */
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement {
display: flex !important;
flex-direction: column !important;
gap: 8px !important;
margin-top: 2px !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__head {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
gap: 8px !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__head > strong {
font-size: 13px !important;
font-weight: 800 !important;
color: #1a2b3c !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__input {
position: relative !important;
min-height: 158px !important;
border: 1px dashed rgba(30, 189, 219, 0.34) !important;
border-radius: 8px !important;
background: linear-gradient(180deg, rgba(237, 248, 255, 0.72), rgba(255, 255, 255, 0.94)) !important;
overflow: hidden !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__input textarea {
display: block !important;
width: 100% !important;
min-height: 140px !important;
max-height: 240px !important;
resize: none !important;
border: 0 !important;
outline: none !important;
padding: 14px 14px 24px !important;
color: #172636 !important;
background: transparent !important;
font-size: 13px !important;
font-weight: 700 !important;
line-height: 1.6 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__input textarea::placeholder {
color: #9badb9 !important;
font-weight: 500 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__input > span {
position: absolute !important;
right: 12px !important;
bottom: 6px !important;
color: #9badb9 !important;
font-size: 11px !important;
font-weight: 600 !important;
pointer-events: none !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__ai {
padding: 3px 12px !important;
border: 1.5px solid rgba(16, 115, 204, 0.18) !important;
border-radius: 20px !important;
background: linear-gradient(135deg, rgba(16, 115, 204, 0.06), rgba(25, 173, 200, 0.06)) !important;
color: #1073cc !important;
font-size: 11px !important;
font-weight: 800 !important;
cursor: pointer !important;
white-space: nowrap !important;
flex-shrink: 0 !important;
transition: background 160ms ease, border-color 160ms ease !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-requirement__ai:hover {
background: linear-gradient(135deg, rgba(16, 115, 204, 0.12), rgba(25, 173, 200, 0.12)) !important;
border-color: rgba(16, 115, 204, 0.3) !important;
}
/* ── Hot Clone: material upload with images ── */
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images {
display: flex !important;
flex-wrap: wrap !important;
align-items: flex-start !important;
justify-content: flex-start !important;
gap: 10px !important;
padding: 12px !important;
place-items: unset !important;
background: #f9fafa !important;
border: 1px solid rgba(30, 189, 219, 0.22) !important;
border-style: solid !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs {
display: contents !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs figure {
position: relative !important;
width: 80px !important;
height: 80px !important;
margin: 0 !important;
border: 1px solid #e8edf0 !important;
border-radius: 10px !important;
overflow: hidden !important;
background: #fff !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs figure > img {
display: block !important;
width: 100% !important;
height: 100% !important;
object-fit: cover !important;
border-radius: 9px !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs figure > button {
position: absolute !important;
top: 4px !important;
right: 4px !important;
width: 20px !important;
height: 20px !important;
border: none !important;
border-radius: 50% !important;
background: rgba(0, 0, 0, 0.48) !important;
color: #fff !important;
font-size: 11px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
cursor: pointer !important;
opacity: 0 !important;
transition: opacity 140ms ease, background 140ms ease !important;
padding: 0 !important;
z-index: 3 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs figure:hover > button {
opacity: 1 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs figure > button:hover {
background: rgba(220, 53, 69, 0.85) !important;
}
/* Hide old CSS zoom in material section (portal replaces it) */
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-zoom {
display: none !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-add-btn {
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
width: 80px !important;
height: 80px !important;
border: 1px solid #e8edf0 !important;
border-radius: 10px !important;
color: #3a4555 !important;
background: #f5f5f5 !important;
font-size: 22px !important;
cursor: pointer !important;
transition: background 160ms ease, border-color 160ms ease, color 160ms ease !important;
flex-shrink: 0 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-add-btn:hover {
color: #ffffff !important;
background: linear-gradient(135deg, #1073cc, #1ebddb) !important;
border-color: #1073cc !important;
}
/* ── Hot Clone: sticky bottom action buttons ── */
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-actions {
position: sticky !important;
bottom: 0 !important;
z-index: 5 !important;
display: flex !important;
flex-direction: column !important;
gap: 8px !important;
margin: 0 -14px -86px -14px !important;
padding: 14px 14px 16px !important;
background: linear-gradient(to top, #feffff 60%, rgba(254, 255, 255, 0.92) 80%, transparent) !important;
backdrop-filter: blur(6px) !important;
flex-shrink: 0 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-actions .ecom-quick-set-primary {
position: static !important;
left: auto !important;
right: auto !important;
bottom: auto !important;
width: 100% !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-actions .ecom-quick-set-primary--cancel.is-disabled {
color: #c0ccd4 !important;
background: #f0f3f5 !important;
border-color: #e4e9ec !important;
cursor: not-allowed !important;
opacity: 0.55 !important;
}
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-hot-actions .ecom-quick-set-primary--cancel.is-disabled:hover {
color: #c0ccd4 !important;
background: #f0f3f5 !important;
border-color: #e4e9ec !important;
}
/* ── Hot Clone: stage fills space without prompt ── */
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-set-stage {
grid-template-rows: auto minmax(0, 1fr) !important;
}
/* ── Hot Clone: portal zoom preview (avoids overflow clipping) ── */
.ecom-hot-material-zoom-portal {
position: fixed !important;
z-index: 2147483647 !important;
width: min(280px, calc(100vw - 24px)) !important;
max-height: 340px !important;
border: 1px solid rgba(30, 189, 219, 0.2) !important;
border-radius: 14px !important;
background: #ffffff !important;
padding: 8px !important;
box-shadow: 0 22px 48px rgba(20, 80, 100, 0.22) !important;
pointer-events: none !important;
isolation: isolate !important;
}
.ecom-hot-material-zoom-portal.is-above {
transform: translate(-50%, -100%) !important;
}
.ecom-hot-material-zoom-portal.is-below {
transform: translate(-50%, 0) !important;
}
.ecom-hot-material-zoom-portal img {
display: block !important;
width: 100% !important;
height: auto !important;
max-height: 324px !important;
border-radius: 8px !important;
object-fit: contain !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-watermark-page {
display: block !important;
height: 100% !important;
@@ -6783,31 +7052,36 @@
background: rgba(16, 115, 204, 0.28) !important;
}
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel {
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel,
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-set-panel {
overflow-y: auto !important;
padding-bottom: 16px !important;
scrollbar-width: auto !important;
scrollbar-color: rgba(16, 115, 204, 0.56) rgba(16, 115, 204, 0.08) !important;
}
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar {
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar,
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-set-panel::-webkit-scrollbar {
display: block !important;
width: 14px !important;
height: 14px !important;
}
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar-track {
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar-track,
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-set-panel::-webkit-scrollbar-track {
border-radius: 999px !important;
background: rgba(16, 115, 204, 0.08) !important;
}
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar-thumb {
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar-thumb,
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-set-panel::-webkit-scrollbar-thumb {
border: 3px solid rgba(248, 249, 250, 0.95) !important;
border-radius: 999px !important;
background: rgba(16, 115, 204, 0.56) !important;
}
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar-thumb:hover {
.ecommerce-standalone .ecom-quick-detail-page .ecom-quick-set-panel::-webkit-scrollbar-thumb:hover,
.ecommerce-standalone .ecom-quick-hot-page .ecom-quick-set-panel::-webkit-scrollbar-thumb:hover {
background: rgba(16, 115, 204, 0.72) !important;
}
@@ -8766,6 +9040,58 @@
z-index: 0 !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-strip {
display: grid !important;
grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
gap: 10px !important;
width: min(100%, 1088px) !important;
margin: 16px auto 12px !important;
box-sizing: border-box !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-card {
position: relative !important;
display: block !important;
width: 100% !important;
min-width: 0 !important;
aspect-ratio: 3.06 / 1 !important;
min-height: 100px !important;
padding: 0 !important;
border: 1px solid rgba(30, 189, 219, 0.18) !important;
border-radius: 14px !important;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.94), rgba(246, 251, 253, 0.98)),
#ffffff !important;
box-shadow:
0 16px 34px rgba(16, 115, 204, 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.94) !important;
overflow: hidden !important;
cursor: pointer !important;
transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease, background 180ms ease !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-card:hover {
transform: translateY(-1px) !important;
border-color: rgba(30, 189, 219, 0.34) !important;
box-shadow:
0 20px 42px rgba(16, 115, 204, 0.11),
0 0 0 1px rgba(30, 189, 219, 0.12) inset !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-card:focus-visible {
outline: none !important;
border-color: rgba(30, 189, 219, 0.48) !important;
box-shadow:
0 0 0 3px rgba(30, 189, 219, 0.15),
0 20px 42px rgba(16, 115, 204, 0.11) !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-card__blank {
display: block !important;
width: 100% !important;
height: 100% !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .clone-ai-preview {
background: #f8f9fa !important;
transition: padding-top 520ms cubic-bezier(0.16, 1, 0.3, 1),
@@ -8984,6 +9310,10 @@
min-height: 224px !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-strip {
grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-quick-board button:not(:nth-child(6n + 1))::before {
content: none !important;
}
@@ -9014,6 +9344,18 @@
min-height: 60px !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-strip {
grid-template-columns: minmax(0, 1fr) !important;
gap: 8px !important;
width: min(100%, 540px) !important;
margin: 12px auto 10px !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-card {
aspect-ratio: 2.9 / 1 !important;
min-height: 84px !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .clone-ai-preview {
padding-inline: 18px !important;
}
@@ -9050,6 +9392,50 @@
content: "" !important;
background: rgba(30, 189, 219, 0.12) !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images {
gap: 8px !important;
padding: 8px !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-quick-hot-add-btn,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-hot-add-btn {
width: 56px !important;
height: 56px !important;
min-width: 56px !important;
min-height: 56px !important;
flex-basis: 56px !important;
}
}
@media (max-width: 480px) {
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-strip {
width: 100% !important;
}
.ecommerce-standalone .product-clone-page[data-tool="clone"] .ecom-command-template-card {
min-height: 76px !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images {
gap: 6px !important;
padding: 6px !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-quick-hot-add-btn,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-hot-add-btn {
width: 50px !important;
height: 50px !important;
min-width: 50px !important;
min-height: 50px !important;
flex-basis: 50px !important;
}
}
@keyframes ecommerce-soft-popover-out {
@@ -11773,6 +12159,15 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
--quick-text: #164e63;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--hot {
--quick-accent: #e8590c;
--quick-bg: #fff4e6;
--quick-text: #5c2d0e;
--quick-icon: #d9480f;
--quick-border: rgba(232, 89, 12, 0.12);
--quick-shadow: rgba(232, 89, 12, 0.1);
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board button,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board button > span,
@@ -13172,6 +13567,7 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--detail,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--hot,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--edit,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--cutout,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--watermark {
@@ -13397,6 +13793,16 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
--quick-shadow: rgba(122, 90, 248, 0.1) !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--hot {
--quick-accent: #e8590c !important;
--quick-bg: #fff4e6 !important;
--quick-text: #5c2d0e !important;
--quick-icon: #d9480f !important;
--quick-icon-bg: rgba(232, 89, 12, 0.13) !important;
--quick-border: rgba(232, 89, 12, 0.12) !important;
--quick-shadow: rgba(232, 89, 12, 0.1) !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-quick-board .ecom-command-quick-card--edit {
--quick-accent: #cc6b14 !important;
--quick-bg: #fff2e5 !important;
@@ -13492,7 +13898,7 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
/* #/imageWorkbench quick actions: soften each action so the tones blend into the page. */
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-composer-wrap.ecom-command-composer-wrap:has(.ecom-inspiration-lab) .ecom-command-quick-board {
background: rgba(255, 255, 255, 0.3) !important;
background: transparent !important;
box-shadow: none !important;
}
@@ -13600,7 +14006,7 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
/* #/imageWorkbench composer redesign: mode tabs outside, settings and assets inside. */
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-mode-tabs {
display: grid !important;
grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
gap: 8px !important;
width: min(100%, 760px) !important;
margin: 0 auto 12px !important;
@@ -13887,7 +14293,7 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
@media (max-width: 900px) {
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-mode-tabs {
grid-template-columns: repeat(5, minmax(94px, 1fr)) !important;
grid-template-columns: repeat(4, minmax(104px, 1fr)) !important;
width: 100% !important;
overflow-x: auto !important;
overscroll-behavior-x: contain !important;
@@ -13901,7 +14307,7 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
@media (max-width: 640px) {
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"] .ecom-command-mode-tabs {
grid-template-columns: repeat(5, minmax(88px, 1fr)) !important;
grid-template-columns: repeat(4, minmax(92px, 1fr)) !important;
margin-bottom: 10px !important;
}
@@ -14082,6 +14488,261 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
font-size: 22px !important;
}
/* Hot clone uploaded material thumbnails: compact grid and consistent delete control. */
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images {
display: flex !important;
flex-wrap: wrap !important;
align-items: flex-start !important;
justify-content: flex-start !important;
align-content: flex-start !important;
gap: 10px !important;
width: 100% !important;
min-height: 0 !important;
height: auto !important;
padding: 10px !important;
border: 1px solid #e8edf0 !important;
border-radius: 8px !important;
background: #ffffff !important;
box-shadow: none !important;
transform: none !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images:hover,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images:focus-visible,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images.is-dragging {
border-color: rgba(30, 189, 219, 0.42) !important;
background: #fbfdff !important;
box-shadow: 0 10px 24px rgba(16, 115, 204, 0.08) !important;
transform: none !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-quick-upload-thumbs {
display: contents !important;
width: auto !important;
max-width: none !important;
padding: 0 !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb {
position: relative !important;
flex: 0 0 64px !important;
width: 64px !important;
height: 64px !important;
min-width: 64px !important;
min-height: 64px !important;
margin: 0 !important;
overflow: hidden !important;
border: 1px solid #e8edf0 !important;
border-radius: 8px !important;
background: #f6f8fa !important;
box-shadow: none !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > img {
display: block !important;
width: 100% !important;
height: 100% !important;
border-radius: 7px !important;
object-fit: cover !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button {
position: absolute !important;
top: 4px !important;
right: 4px !important;
z-index: 6 !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
width: 22px !important;
height: 22px !important;
min-width: 22px !important;
min-height: 22px !important;
padding: 0 !important;
border: 1px solid rgba(239, 68, 68, 0.42) !important;
border-radius: 999px !important;
color: #ef4444 !important;
background: rgba(255, 255, 255, 0.92) !important;
box-shadow: 0 8px 18px rgba(239, 68, 68, 0.16) !important;
cursor: pointer !important;
opacity: 0 !important;
pointer-events: none !important;
transform: scale(0.92) !important;
visibility: hidden !important;
transition:
opacity 150ms ease,
transform 150ms ease,
background 150ms ease,
box-shadow 150ms ease,
visibility 150ms ease !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb:hover > button,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb:focus-within > button {
opacity: 1 !important;
pointer-events: auto !important;
transform: scale(1) !important;
visibility: visible !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button:hover {
border-color: rgba(220, 38, 38, 0.72) !important;
color: #dc2626 !important;
background: #fff1f2 !important;
box-shadow: 0 10px 22px rgba(220, 38, 38, 0.22) !important;
transform: scale(1.04) !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button .anticon {
display: inline-flex !important;
font-size: 13px !important;
line-height: 1 !important;
color: currentColor !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-set-upload.has-images .ecom-quick-hot-add-btn {
flex: 0 0 64px !important;
width: 64px !important;
height: 64px !important;
min-width: 64px !important;
min-height: 64px !important;
border: 1px solid #e8edf0 !important;
border-radius: 8px !important;
color: #111827 !important;
background: #f3f4f6 !important;
box-shadow: none !important;
font-size: 22px !important;
transform: none !important;
}
/* Keep hot material upload controls visible after files are added. */
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images {
display: flex !important;
flex-wrap: wrap !important;
align-items: flex-start !important;
justify-content: flex-start !important;
gap: 10px !important;
min-height: 0 !important;
height: auto !important;
padding: 10px !important;
overflow: visible !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-upload-thumbs {
display: contents !important;
width: auto !important;
max-width: none !important;
padding: 0 !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb {
flex: 0 0 64px !important;
width: 64px !important;
height: 64px !important;
min-width: 64px !important;
min-height: 64px !important;
overflow: visible !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > img {
overflow: hidden !important;
border-radius: 8px !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button {
top: -7px !important;
right: -7px !important;
width: 22px !important;
height: 22px !important;
min-width: 22px !important;
min-height: 22px !important;
opacity: 1 !important;
visibility: visible !important;
pointer-events: auto !important;
transform: none !important;
color: #ef4444 !important;
background: #ffffff !important;
border: 1px solid rgba(239, 68, 68, 0.5) !important;
box-shadow: 0 8px 18px rgba(239, 68, 68, 0.16) !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button .anticon,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button svg {
display: block !important;
width: 12px !important;
height: 12px !important;
color: currentColor !important;
fill: none !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-quick-hot-add-btn {
display: inline-flex !important;
flex: 0 0 64px !important;
width: 64px !important;
height: 64px !important;
min-width: 64px !important;
min-height: 64px !important;
margin: 0 !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button.ecom-hot-material-delete {
position: absolute !important;
top: -8px !important;
right: -8px !important;
z-index: 20 !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
width: 24px !important;
height: 24px !important;
min-width: 24px !important;
min-height: 24px !important;
padding: 0 !important;
overflow: visible !important;
border: 1px solid rgba(239, 68, 68, 0.62) !important;
border-radius: 999px !important;
color: #ef4444 !important;
background: #ffffff !important;
box-shadow: 0 8px 18px rgba(239, 68, 68, 0.16) !important;
cursor: pointer !important;
opacity: 1 !important;
pointer-events: auto !important;
transform: none !important;
visibility: visible !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button.ecom-hot-material-delete:hover {
border-color: #dc2626 !important;
color: #dc2626 !important;
background: #fff1f2 !important;
box-shadow: 0 10px 22px rgba(220, 38, 38, 0.24) !important;
transform: scale(1.04) !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material.has-images .ecom-command-asset-thumb.ecom-quick-upload-thumb > button.ecom-hot-material-delete svg {
display: block !important;
width: 14px !important;
height: 14px !important;
stroke: currentColor !important;
stroke-width: 1.9 !important;
stroke-linecap: round !important;
stroke-linejoin: round !important;
fill: none !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-material:not(.has-images) {
min-height: 94px !important;
padding: 12px 14px !important;
gap: 6px !important;
}
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-reference.has-images > .anticon,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-reference.has-images > span,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-reference.has-images > em,
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"].is-hot-clone-page .ecom-quick-hot-page .ecom-quick-hot-reference.has-images > b {
display: none !important;
}
/* Generation record detail workspace: left chat, center canvas, right history drawer. */
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"].is-history-detail {
--clone-chat-width: 352px;
@@ -16649,7 +17310,7 @@ html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[d
html body #root .ecommerce-standalone.ecommerce-standalone .product-clone-page[data-tool="clone"][data-tool="clone"].is-history-detail .clone-ai-node-drag-handle {
height: 38px !important;
}
}
}
/* Record detail chat polish: wider drawer and clearer turn-taking. */
+1 -1
View File
@@ -7861,7 +7861,7 @@
.product-set-preview-backdrop {
position: fixed;
inset: 0;
z-index: 100;
z-index: 4000;
display: grid;
place-items: center;
background: rgb(17 24 39 / 58%);
+1
View File
@@ -0,0 +1 @@
export * from "./types.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./enterpriseVideoPolicy.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./happyHorseRouting.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./pixverseRouting.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./resolveVideoModel.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./taskLifecycle.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./translateTaskError.ts";
+1
View File
@@ -0,0 +1 @@
export * from "./viduRouting.ts";