feat(assets): 文件夹主题 - 新增多主题皮肤并同步主线

This commit is contained in:
echoD886
2026-08-20 16:33:51 +08:00
93 changed files with 4081 additions and 1143 deletions

View File

@@ -0,0 +1,23 @@
import type { CanvasFolderTheme } from "@/types/canvas";
export const CANVAS_FOLDER_THEME_OPTIONS: ReadonlyArray<{
key: CanvasFolderTheme;
label: string;
cover: string;
}> = [
{ key: "aurora", label: "赤蓝流光", cover: "/images/canvas/folder-default-cover.png" },
{ key: "obsidian", label: "曜石银蓝", cover: "/images/canvas/folder-theme-obsidian.png" },
{ key: "ember", label: "熔金赤焰", cover: "/images/canvas/folder-theme-ember.png" },
{ key: "pearl", label: "珍珠薄雾", cover: "/images/canvas/folder-theme-pearl.png" },
];
export function resolveCanvasFolderTheme(value?: string): CanvasFolderTheme {
return CANVAS_FOLDER_THEME_OPTIONS.some((theme) => theme.key === value) ? value as CanvasFolderTheme : "aurora";
}
export function resolveCanvasFolderThemeCover(theme?: string, customCover?: string) {
const custom = customCover?.trim();
if (custom) return custom;
const resolved = resolveCanvasFolderTheme(theme);
return CANVAS_FOLDER_THEME_OPTIONS.find((item) => item.key === resolved)!.cover;
}

View File

@@ -52,14 +52,14 @@ export async function runBackendCanvasGenerationTask(
},
dependencies?: GenerationTaskDependencies,
) {
const normalizedReferenceImages = mode === "image" ? limitCanvasImageReferences(config, referenceImages) : referenceImages;
if (mode === "image") assertCanvasImageReferenceLimit(config, referenceImages);
return runBackendGenerationTask(
{
projectId,
mode,
prompt,
config,
referenceImages: normalizedReferenceImages,
referenceImages,
referenceVideos,
referenceAudios,
mask,
@@ -74,12 +74,15 @@ export async function runBackendCanvasGenerationTask(
);
}
// Canvas references can include a scene frame plus multiple character turnarounds. Keep
// the earliest connected scene image when a provider accepts fewer images than the graph.
export function limitCanvasImageReferences(config: AiConfig, referenceImages: ReferenceImage[]) {
export function canvasImageReferenceLimitError(config: AiConfig, referenceImages: ReferenceImage[]) {
const maxImages = modelCapabilityConfigFor(config, config.model).image?.references.maxImages;
if (maxImages === undefined || maxImages < 1 || referenceImages.length <= maxImages) return referenceImages;
return referenceImages.slice(0, maxImages);
if (maxImages === undefined || referenceImages.length <= maxImages) return "";
return `当前图片模型最多支持 ${maxImages} 张参考图,当前已连接 ${referenceImages.length} 张。请移除多余连线后重试`;
}
export function assertCanvasImageReferenceLimit(config: AiConfig, referenceImages: ReferenceImage[]) {
const error = canvasImageReferenceLimitError(config, referenceImages);
if (error) throw new Error(error);
}
export { backendProviderConfig };