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 && (
error 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 && (
error 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 && (
error - {/* 文案 */}
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 && (
error
- )} + )} */} {/* 只在生成过程中或没有分镜图片时使用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 && (
- error +
)} @@ -340,7 +343,7 @@ export function ThumbnailGrid({ )} {sketch.status === 2 && (
- error +
)} {/* 只在生成过程中或没有分镜图片时使用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