From a315be58f6ecbc5857efea231329e447e8715a9e Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 27 Aug 2026 14:55:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E6=A8=A1=E6=9D=BF=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E6=9D=A1=E7=BC=A9=E7=9F=AD+=E7=B4=A0?= =?UTF-8?q?=E6=9D=90=E5=88=97=E8=A1=A8=E6=94=B9=E4=B8=BA=E7=AB=96=E5=B1=8F?= =?UTF-8?q?9:16=E5=8D=A1=E7=89=87=E7=BD=91=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 任务G: 模板选择预览条从 60px 缩短到 36px,卡片间距收紧 任务H: 素材列表从横向列表改为竖屏 9:16 卡片网格 - 视频封面/缩略图作为背景 - 中央播放按钮 - 右下角时长 badge - 左下角文件名 - 左上角选中勾选标记 - hover 播放功能保持不变 --- .../material/ManualMaterialList.tsx | 271 +++++++++++------- apps/web/src/pages/generate/generate.css | 8 +- 2 files changed, 165 insertions(+), 114 deletions(-) diff --git a/apps/web/src/pages/generate/components/material/ManualMaterialList.tsx b/apps/web/src/pages/generate/components/material/ManualMaterialList.tsx index a067e1098..dbee4a1b0 100644 --- a/apps/web/src/pages/generate/components/material/ManualMaterialList.tsx +++ b/apps/web/src/pages/generate/components/material/ManualMaterialList.tsx @@ -1,5 +1,5 @@ /** - * 手动选择素材列表 + * 手动选择素材列表 — 竖屏 9:16 卡片网格 */ import React, { useRef, useCallback } from "react" import { Typography } from "antd" @@ -14,18 +14,24 @@ interface ManualMaterialListProps { onToggle: (materialId: string) => void } +/** 秒数格式化为 mm:ss */ +const fmtDuration = (seconds?: number): string => { + if (!seconds && seconds !== 0) return "--:--" + const m = Math.floor(seconds / 60) + const s = Math.floor(seconds % 60) + return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}` +} + const ManualMaterialList: React.FC = ({ materials, materialsLoading, selectedMaterials, onToggle, }) => { - // 追踪当前正在播放的视频元素,确保同时只有一个视频播放 const activeVideoRef = useRef(null) const handleVideoMouseEnter = useCallback((e: React.MouseEvent) => { const video = e.currentTarget - // 暂停之前正在播放的视频(检查是否仍在 DOM 中) if ( activeVideoRef.current && activeVideoRef.current !== video && @@ -56,143 +62,188 @@ const ManualMaterialList: React.FC = ({ 暂无素材,请先在视频库中上传 ) : ( -
+
{materials.items.map((m) => { const checked = selectedMaterials.includes(m.id) const isVideo = m.mime_type?.startsWith("video/") ?? false const thumbSrc = m.thumbnail_url || undefined return ( -
diff --git a/apps/web/src/pages/generate/generate.css b/apps/web/src/pages/generate/generate.css index c2fbd8b32..2e74af669 100644 --- a/apps/web/src/pages/generate/generate.css +++ b/apps/web/src/pages/generate/generate.css @@ -203,7 +203,7 @@ background: var(--bg-primary); border: 2px solid var(--border-color); border-radius: var(--radius-md); - padding: 14px; + padding: 10px; cursor: pointer; transition: 0.18s ease; text-align: center; @@ -219,14 +219,14 @@ } .xx-choice-thumb { - height: 60px; + height: 36px; border-radius: var(--radius-sm); display: grid; place-items: center; color: var(--text-inverse); - font-size: 24px; + font-size: 16px; font-weight: 700; - margin-bottom: 10px; + margin-bottom: 6px; } .xx-choice-item h4 { -- 2.54.0