diff --git a/app/layout.tsx b/app/layout.tsx
index 9631a78..71bf208 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,5 +1,6 @@
'use client'
import './globals.css';
+import '@/iconfont/iconfont.css';
import { createContext, useContext, useEffect, useState } from 'react';
import { Providers } from '@/components/providers';
import { ConfigProvider, theme } from 'antd';
diff --git a/components/pages/work-flow/H5MediaViewer.tsx b/components/pages/work-flow/H5MediaViewer.tsx
index ec2cc51..3ce95a7 100644
--- a/components/pages/work-flow/H5MediaViewer.tsx
+++ b/components/pages/work-flow/H5MediaViewer.tsx
@@ -14,6 +14,7 @@ import { Drawer } from 'antd';
import { useSearchParams } from 'next/navigation';
import error_image from '@/public/assets/error.webp';
import { showDownloadOptionsModal } from './download-options-modal';
+import RenderLoading from './RenderLoading';
interface H5MediaViewerProps {
/** 任务对象,包含各阶段数据 */
@@ -150,9 +151,10 @@ export function H5MediaViewer({
return [...roles, ...scenes].map(item => ({
url: item?.url as string | undefined,
status: item?.status as number | undefined,
+ type: item?.type as string | undefined,
}));
}
- return [] as Array<{ url?: string; status?: number }>;
+ return [] as Array<{ url?: string; status?: number; type?: string }>;
}, [stage, taskObject.roles?.data, taskObject.scenes?.data]);
// 占位,避免未使用警告
@@ -266,18 +268,19 @@ export function H5MediaViewer({
- {status === 0 && (
-
Generating...
+ {(status === 0 || status === 2) && (
+
)}
- {status === 2 && (
+ {/* {status === 2 && (
Generate failed
- )}
- {status !== 0 && status !== 2 && (
-
Pending
- )}
+ )} */}
)}
@@ -315,15 +318,19 @@ export function H5MediaViewer({
- {status === 0 && (
-
Generating...
+ {(status === 0 || status === 2) && (
+
)}
- {status === 2 && (
+ {/* {status === 2 && (
Generate failed
- )}
+ )} */}
)}
@@ -544,8 +551,9 @@ export function H5MediaViewer({
)}
+
+
+ {/* Vinyl Record Container */}
+
+ {/* Record Half - Top */}
+
+ {/* Record grooves effect */}
+
+
+ {/* Scanner light */}
+
+
+ {/* Center label */}
+
+ {/* Pulsing core */}
+
+
+
+
+ {/* Record Half - Bottom */}
+
+ {/* Record grooves effect */}
+
+
+ {/* Scanner light */}
+
+
+ {/* Center label */}
+
+ {/* Pulsing core */}
+
+
+
+
+
+ {/* Tonearm */}
+
+ {/* Arm */}
+
+
+ {/* Head */}
+
+
+ {/* Pivot */}
+
+
+
+ {/* 加载/失败文案 */}
+
+ {loadingText}
+
+
+ >
+ );
+};
+
+export default RenderLoading;
+
diff --git a/components/pages/work-flow/media-viewer.tsx b/components/pages/work-flow/media-viewer.tsx
index d6ef89a..2c99514 100644
--- a/components/pages/work-flow/media-viewer.tsx
+++ b/components/pages/work-flow/media-viewer.tsx
@@ -18,8 +18,7 @@ import { VideoEditOverlay } from './video-edit/VideoEditOverlay';
import { EditPoint as EditPointType } from './video-edit/types';
import { isVideoModificationEnabled } from '@/lib/server-config';
import { useSearchParams } from 'next/navigation';
-import error_image from '@/public/assets/error.webp';
-import { AspectRatioValue } from '@/components/ChatInputBox/AspectRatioSelector';
+import RenderLoading from './RenderLoading';
interface MediaViewerProps {
taskObject: TaskObject;
@@ -573,14 +572,16 @@ export const MediaViewer = React.memo(function MediaViewer({
{taskObject.videos.data[currentSketchIndex].video_status !== 1 && (
{/* 生成中 */}
- {taskObject.videos.data[currentSketchIndex].video_status === 0 && (
- renderLoading()
+ {(taskObject.videos.data[currentSketchIndex].video_status === 0 || taskObject.videos.data[currentSketchIndex].video_status === 2) && (
+
)}
{/* 生成失败 */}
- {taskObject.videos.data[currentSketchIndex].video_status === 2 && (
+ {/* {taskObject.videos.data[currentSketchIndex].video_status === 2 && (

- {/* 文案 */}
Failed
@@ -588,7 +589,7 @@ export const MediaViewer = React.memo(function MediaViewer({
Violation of security policy. Please modify your prompt and regenerate.
- )}
+ )} */}
)}
@@ -778,14 +779,17 @@ export const MediaViewer = React.memo(function MediaViewer({
}}
>
{/* 状态 */}
- {currentSketch.status === 0 && (
- renderLoading()
+ {(currentSketch.status === 0 || currentSketch.status === 2) && (
+
)}
- {currentSketch.status === 2 && (
+ {/* {currentSketch.status === 2 && (
- )}
+ )} */}
{/* 只在生成过程中或没有分镜图片时使用ProgressiveReveal */}
{currentSketch.status === 1 && (
diff --git a/components/pages/work-flow/thumbnail-grid.tsx b/components/pages/work-flow/thumbnail-grid.tsx
index 4972520..12200c4 100644
--- a/components/pages/work-flow/thumbnail-grid.tsx
+++ b/components/pages/work-flow/thumbnail-grid.tsx
@@ -5,7 +5,6 @@ import { CircleAlert, Film } from 'lucide-react';
import { TaskObject } from '@/api/DTO/movieEdit';
import { getFirstFrame } from '@/utils/tools';
import { AspectRatioValue } from '@/components/ChatInputBox/AspectRatioSelector';
-import error_image from '@/public/assets/error.webp';
interface ThumbnailGridProps {
isDisabledFocus: boolean;
@@ -52,7 +51,7 @@ export function ThumbnailGrid({
const [scrollLeft, setScrollLeft] = useState(0);
const [isFocused, setIsFocused] = useState(false);
- // 监听当前选中索引变化,自动滚动到对应位置
+ // 监听当前选中索引变化,自动滚动到对应位置(居中显示)
useEffect(() => {
if (thumbnailsRef.current) {
const container = thumbnailsRef.current;
@@ -60,9 +59,13 @@ export function ThumbnailGrid({
if (currentSketchIndex >= 0 && currentSketchIndex < thumbnails.length) {
const thumbnail = thumbnails[currentSketchIndex] as HTMLElement;
- const containerLeft = container.getBoundingClientRect().left;
- const thumbnailLeft = thumbnail.getBoundingClientRect().left;
- const scrollPosition = container.scrollLeft + (thumbnailLeft - containerLeft);
+ const containerRect = container.getBoundingClientRect();
+ const thumbnailRect = thumbnail.getBoundingClientRect();
+
+ // 计算滚动位置:将缩略图居中显示
+ const containerCenter = containerRect.width / 2;
+ const thumbnailCenter = thumbnailRect.width / 2;
+ const scrollPosition = container.scrollLeft + (thumbnailRect.left - containerRect.left) - containerCenter + thumbnailCenter;
container.scrollTo({
left: scrollPosition,
@@ -266,7 +269,7 @@ export function ThumbnailGrid({
)}
{taskObject.videos.data[index].video_status === 2 && (
-

+
)}
@@ -340,7 +343,7 @@ export function ThumbnailGrid({
)}
{sketch.status === 2 && (
-

+
)}
{/* 只在生成过程中或没有分镜图片时使用ProgressiveReveal */}
diff --git a/iconfont/iconfont.css b/iconfont/iconfont.css
new file mode 100644
index 0000000..1473cf6
--- /dev/null
+++ b/iconfont/iconfont.css
@@ -0,0 +1,23 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 5039410 */
+ src: url('./iconfont.woff2?t=1760340285776') format('woff2'),
+ url('./iconfont.woff?t=1760340285776') format('woff'),
+ url('./iconfont.ttf?t=1760340285776') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-shipindiushibaojing:before {
+ content: "\e618";
+}
+
+.icon-tudiushi:before {
+ content: "\e717";
+}
+
diff --git a/iconfont/iconfont.ttf b/iconfont/iconfont.ttf
new file mode 100644
index 0000000..624634e
Binary files /dev/null and b/iconfont/iconfont.ttf differ
diff --git a/iconfont/iconfont.woff b/iconfont/iconfont.woff
new file mode 100644
index 0000000..24a5a77
Binary files /dev/null and b/iconfont/iconfont.woff differ
diff --git a/iconfont/iconfont.woff2 b/iconfont/iconfont.woff2
new file mode 100644
index 0000000..c68a25e
Binary files /dev/null and b/iconfont/iconfont.woff2 differ