diff --git a/apps/admin-web/src/components/AdminEditorAssetMedia.tsx b/apps/admin-web/src/components/AdminEditorAssetMedia.tsx index 3b3b41e99..73a837610 100644 --- a/apps/admin-web/src/components/AdminEditorAssetMedia.tsx +++ b/apps/admin-web/src/components/AdminEditorAssetMedia.tsx @@ -269,6 +269,13 @@ function AdminEditorImageSequencePreview({ const currentFrameItem = frameItems[Math.min(frameIndex, frameItems.length - 1)]; const currentFrameKey = currentFrameItem?.key ?? ''; + const mountedFrameKeys = new Set([visibleFrameKey]); + for (let offset = 0; offset < Math.min(3, frameItems.length); offset += 1) { + const item = frameItems[(frameIndex + offset) % frameItems.length]; + if (item) { + mountedFrameKeys.add(item.key); + } + } const handleFrameReady = useCallback((frameKey: string) => { setLoadedFrameKeys((currentKeys) => { @@ -303,7 +310,7 @@ function AdminEditorImageSequencePreview({ if (!isPlaying) { return undefined; } - const frameIntervalMs = durationMs / frames.length; + const frameIntervalMs = Math.min(2_147_483_647, durationMs / frames.length); const timer = window.setInterval(() => { setFrameIndex((currentIndex) => (currentIndex + 1) % frames.length); }, frameIntervalMs); @@ -315,18 +322,20 @@ function AdminEditorImageSequencePreview({ aria-label={`角色动作预览:${entry.label || entry.assetId}`} className="admin-asset-query-preview-media admin-asset-query-sequence-preview" > - {frameItems.map((item) => ( - - ))} + {frameItems + .filter((item) => mountedFrameKeys.has(item.key)) + .map((item) => ( + + ))}
@@ -679,6 +714,7 @@ export function CreationLandingView({ onOpenCommunity, searchKeyword = '', }: CreationLandingViewProps) { + const prefersReducedMotion = usePrefersReducedMotion(); const authUi = useAuthUi(); const isAuthenticated = Boolean(authUi?.user); const normalizedSearchKeyword = searchKeyword.trim().toLocaleLowerCase(); @@ -706,7 +742,9 @@ export function CreationLandingView({ useState('all'); const [selectedShowcaseItem, setSelectedShowcaseItem] = useState(null); - const [activeShowcaseSequenceCardId, setActiveShowcaseSequenceCardId] = + const [hoveredShowcaseSequenceCardId, setHoveredShowcaseSequenceCardId] = + useState(null); + const [focusedShowcaseSequenceCardId, setFocusedShowcaseSequenceCardId] = useState(null); const [selectedShowcaseIndex, setSelectedShowcaseIndex] = useState(0); const [likedShowcaseIds, setLikedShowcaseIds] = useState>( @@ -1095,16 +1133,16 @@ export function CreationLandingView({ type="button" className="creation-landing__asset-card-open" onPointerEnter={() => - setActiveShowcaseSequenceCardId(item.id) + setHoveredShowcaseSequenceCardId(item.id) } onPointerLeave={() => - setActiveShowcaseSequenceCardId((current) => + setHoveredShowcaseSequenceCardId((current) => current === item.id ? null : current, ) } - onFocus={() => setActiveShowcaseSequenceCardId(item.id)} + onFocus={() => setFocusedShowcaseSequenceCardId(item.id)} onBlur={() => - setActiveShowcaseSequenceCardId((current) => + setFocusedShowcaseSequenceCardId((current) => current === item.id ? null : current, ) } @@ -1116,7 +1154,9 @@ export function CreationLandingView({ @@ -1374,6 +1414,7 @@ export function CreationLandingView({ setSelectedShowcaseItem(null)} />