合并master并保留Spine序列帧修复

合并master当前工程、后端、前端和文档更新

按已确认方案解决Spine序列帧多模态、帧数和快速编辑冲突

保留当前分支底部工具栏宽度与隐藏滚动条样式
This commit is contained in:
2026-08-14 21:33:26 +08:00
338 changed files with 69729 additions and 8828 deletions
@@ -6,6 +6,7 @@ import type {
} from '../../services/image-editor/editorProjectClient';
import {
CANVAS_WORLD_ORIGIN,
canvasAssetKindOrNull,
canvasDisplayScaleToViewportScale,
canvasDisplayViewportToViewport,
collectExpiredInlineGenerationDialogIds,
@@ -548,7 +549,7 @@ describe('ImageCanvasEditorModel', () => {
width: 640,
height: 640,
sourceType: 'generated',
assetKind: 'image',
assetKind: null,
sourceResourceId: 'resource-generated',
},
],
@@ -557,6 +558,7 @@ describe('ImageCanvasEditorModel', () => {
expect(library.assets[0]).toMatchObject({
id: 'asset-generated',
sourceResourceId: 'resource-generated',
assetKind: null,
});
});
@@ -1118,7 +1120,7 @@ describe('ImageCanvasEditorModel', () => {
assetKindOverride: 'character-animation',
},
new Map([
['resource-image', { imageSrc: '/read/image.png', assetKind: 'image' }],
['resource-image', { imageSrc: '/read/image.png', assetKind: null }],
]),
{ onAssetKindOverrideFallback },
);
@@ -1127,29 +1129,28 @@ describe('ImageCanvasEditorModel', () => {
id: 'layer-image-with-action-label',
src: '/read/image.png',
mediaType: 'image',
resourceAssetKind: 'image',
resourceAssetKind: null,
assetKindOverride: null,
assetKind: 'image',
assetKind: null,
});
expect(onAssetKindOverrideFallback).toHaveBeenCalledWith({
layerId: 'layer-image-with-action-label',
resourceId: 'resource-image',
resourceAssetKind: 'image',
resourceAssetKind: null,
rejectedAssetKindOverride: 'character-animation',
});
});
it('uses the same media-family compatibility matrix for layer labels', () => {
expect(isCanvasAssetKindOverrideCompatible('image', 'character')).toBe(
true,
);
expect(canvasAssetKindOrNull('image')).toBeNull();
expect(isCanvasAssetKindOverrideCompatible(null, 'character')).toBe(true);
expect(isCanvasAssetKindOverrideCompatible(null, 'icon')).toBe(true);
expect(
isCanvasAssetKindOverrideCompatible('sound-effect', 'background-music'),
).toBe(true);
expect(isCanvasAssetKindOverrideCompatible('image', 'video')).toBe(false);
expect(isCanvasAssetKindOverrideCompatible(null, 'video')).toBe(false);
expect(
isCanvasAssetKindOverrideCompatible('image', 'character-animation'),
isCanvasAssetKindOverrideCompatible(null, 'character-animation'),
).toBe(false);
expect(isCanvasAssetKindOverrideCompatible('video', 'character')).toBe(
false,