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)}
/>