feat: add ComfyUI integration for image generation and management

- Implemented ComfyGenerateRequest type and associated functions for generating images using various architectures and modes.
- Added functions for listing generation options and handling image uploads.
- Created workflows for different generation modes including SDXL, Z-Image, Z-Image Turbo, and Anima.
- Introduced GenerationJobStatus component to display the status of ongoing generation jobs.
- Developed MaskControls for managing mask operations and displaying mask analysis.
- Created palette items for tool selection, layer management, and generation settings.
This commit is contained in:
syntaxbullet
2026-07-10 23:15:02 +02:00
parent 41bbd1e16b
commit 5e4b548ad4
80 changed files with 2114 additions and 1954 deletions

View File

@@ -0,0 +1,32 @@
export type BrowserImageFile = {
name: string;
mimeType: string;
source: string;
intrinsicSize: { w: number; h: number };
release(): void;
};
export async function decodeBrowserImageFile(file: File): Promise<BrowserImageFile | undefined> {
if (!file.type.startsWith("image/")) return undefined;
const source = await fileToDataUrl(file);
const intrinsicSize = await loadImageSize(source);
return { name: file.name, mimeType: file.type, source, intrinsicSize, release: () => undefined };
}
function fileToDataUrl(file: File): Promise<string> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => typeof reader.result === "string" ? resolve(reader.result) : reject(new Error("Failed to read image file"));
reader.onerror = () => reject(reader.error ?? new Error("Failed to read image file"));
reader.readAsDataURL(file);
});
}
function loadImageSize(source: string): Promise<{ w: number; h: number }> {
return new Promise((resolve, reject) => {
const image = new Image();
image.onload = () => resolve({ w: image.naturalWidth, h: image.naturalHeight });
image.onerror = () => reject(new Error("Failed to load image"));
image.src = source;
});
}