@genfeedai/workflow-ui 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas.mjs +19 -17
- package/dist/canvas.mjs.map +1 -0
- package/dist/{chunk-MGLAKMDP.mjs → chunk-2BHILUF7.mjs} +2 -0
- package/dist/chunk-2BHILUF7.mjs.map +1 -0
- package/dist/{chunk-U4QPE4CY.mjs → chunk-2C2AAXJP.mjs} +2 -0
- package/dist/chunk-2C2AAXJP.mjs.map +1 -0
- package/dist/{chunk-ZSITTZ4S.mjs → chunk-3GWH2ZOH.mjs} +5 -3
- package/dist/chunk-3GWH2ZOH.mjs.map +1 -0
- package/dist/{chunk-XRC3O5GK.mjs → chunk-4JOFNZW6.mjs} +2 -0
- package/dist/chunk-4JOFNZW6.mjs.map +1 -0
- package/dist/{chunk-2FUPL67V.mjs → chunk-55JFUNLR.mjs} +253 -237
- package/dist/chunk-55JFUNLR.mjs.map +1 -0
- package/dist/{chunk-GPYIIWD5.mjs → chunk-7DJHFOIW.mjs} +3 -1
- package/dist/chunk-7DJHFOIW.mjs.map +1 -0
- package/dist/{chunk-QQVHGJ2G.mjs → chunk-AZJFDWBF.mjs} +2 -0
- package/dist/chunk-AZJFDWBF.mjs.map +1 -0
- package/dist/{chunk-C6MQBJFC.mjs → chunk-G3HCTMAZ.mjs} +3 -1
- package/dist/chunk-G3HCTMAZ.mjs.map +1 -0
- package/dist/{chunk-IYFWAJBB.mjs → chunk-HMTYPFOT.mjs} +3 -1
- package/dist/chunk-HMTYPFOT.mjs.map +1 -0
- package/dist/{chunk-7LV4UAUS.mjs → chunk-IKR6GVZ4.mjs} +2 -0
- package/dist/chunk-IKR6GVZ4.mjs.map +1 -0
- package/dist/{chunk-YUIK4AHM.mjs → chunk-JSF4FHBH.mjs} +3 -1
- package/dist/chunk-JSF4FHBH.mjs.map +1 -0
- package/dist/{chunk-OJWVEEMM.mjs → chunk-R5L7WB7F.mjs} +4 -2
- package/dist/chunk-R5L7WB7F.mjs.map +1 -0
- package/dist/{chunk-53XDE62A.mjs → chunk-RY6OZJ7A.mjs} +8 -6
- package/dist/chunk-RY6OZJ7A.mjs.map +1 -0
- package/dist/{chunk-B4EAAKYF.mjs → chunk-SBB2YW3Y.mjs} +2 -0
- package/dist/chunk-SBB2YW3Y.mjs.map +1 -0
- package/dist/{chunk-FWJIAW2E.mjs → chunk-SHU7JPQY.mjs} +7 -5
- package/dist/chunk-SHU7JPQY.mjs.map +1 -0
- package/dist/chunk-SRPSHHHV.mjs +3 -0
- package/dist/chunk-SRPSHHHV.mjs.map +1 -0
- package/dist/{chunk-ESVULCFY.mjs → chunk-TOFB4BTA.mjs} +3 -1
- package/dist/chunk-TOFB4BTA.mjs.map +1 -0
- package/dist/{chunk-ORVDYXDP.mjs → chunk-VKXTPLM7.mjs} +6 -4
- package/dist/chunk-VKXTPLM7.mjs.map +1 -0
- package/dist/{chunk-VVQ4CH77.mjs → chunk-X3XNTD4R.mjs} +5 -2
- package/dist/chunk-X3XNTD4R.mjs.map +1 -0
- package/dist/chunk-YYFM6P4C.mjs +3 -0
- package/dist/chunk-YYFM6P4C.mjs.map +1 -0
- package/dist/hooks.mjs +13 -11
- package/dist/hooks.mjs.map +1 -0
- package/dist/index.mjs +27 -25
- package/dist/index.mjs.map +1 -0
- package/dist/lib.mjs +6 -4
- package/dist/lib.mjs.map +1 -0
- package/dist/nodes.mjs +15 -13
- package/dist/nodes.mjs.map +1 -0
- package/dist/panels.mjs +5 -3
- package/dist/panels.mjs.map +1 -0
- package/dist/provider.mjs +5 -3
- package/dist/provider.mjs.map +1 -0
- package/dist/stores.mjs +8 -6
- package/dist/stores.mjs.map +1 -0
- package/dist/toolbar.mjs +7 -5
- package/dist/toolbar.mjs.map +1 -0
- package/dist/ui.mjs +4 -2
- package/dist/ui.mjs.map +1 -0
- package/dist/workflowStore-XYPHB6DS.mjs +4 -0
- package/dist/workflowStore-XYPHB6DS.mjs.map +1 -0
- package/package.json +24 -24
- package/dist/chunk-LDN7IX4Y.mjs +0 -1
- package/dist/chunk-MLJJBBTB.mjs +0 -1
- package/dist/workflowStore-N2F7WIG3.mjs +0 -2
package/dist/lib.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/deduplicatedFetch.ts","../src/lib/gridSplitter.ts","../src/lib/nodeDimensions.ts","../src/lib/speedCurve.ts"],"names":["getImageDimensions"],"mappings":"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","file":"lib.mjs","sourcesContent":["/**\n * Deduplicated Fetch Utility\n *\n * When multiple callers request the same URL concurrently, only one\n * actual network request is made. All callers receive the same response\n * data once the request completes. Responses are cached for 5 seconds.\n */\n\nconst inFlightRequests = new Map<string, Promise<Response>>();\n\nconst responseCache = new Map<\n string,\n {\n status: number;\n headers: Record<string, string>;\n bodyText: string;\n timestamp: number;\n }\n>();\n\nconst CACHE_TTL = 5000;\n\nconst pendingTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nfunction getCacheKey(url: string, headers?: HeadersInit): string {\n if (!headers) return url;\n\n const headerObj =\n headers instanceof Headers\n ? Object.fromEntries(headers.entries())\n : Array.isArray(headers)\n ? Object.fromEntries(headers)\n : headers;\n\n const sortedHeaders = Object.keys(headerObj as Record<string, string>)\n .sort()\n .map((k) => `${k}:${(headerObj as Record<string, string>)[k]}`)\n .join('|');\n\n return `${url}|${sortedHeaders}`;\n}\n\n/**\n * Fetch with request deduplication.\n *\n * Multiple concurrent calls to the same URL (with same headers) will\n * share a single network request. The response is cloned for each caller.\n */\nexport async function deduplicatedFetch(\n url: string,\n options?: RequestInit,\n): Promise<Response> {\n const cacheKey = getCacheKey(url, options?.headers);\n\n const cached = responseCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return new Response(cached.bodyText, {\n headers: cached.headers,\n status: cached.status,\n });\n }\n\n const existingRequest = inFlightRequests.get(cacheKey);\n if (existingRequest) {\n await existingRequest;\n const cachedData = responseCache.get(cacheKey);\n if (cachedData) {\n return new Response(cachedData.bodyText, {\n headers: cachedData.headers,\n status: cachedData.status,\n });\n }\n return new Response(JSON.stringify({ error: 'Cache miss' }), {\n status: 500,\n });\n }\n\n const requestPromise = fetch(url, options)\n .then(async (response) => {\n try {\n const bodyText = await response.clone().text();\n responseCache.set(cacheKey, {\n bodyText,\n headers: Object.fromEntries(response.headers.entries()),\n status: response.status,\n timestamp: Date.now(),\n });\n } catch {\n // Failed to read response body for caching\n }\n return response;\n })\n .finally(() => {\n const timeoutId = setTimeout(() => {\n inFlightRequests.delete(cacheKey);\n pendingTimeouts.delete(cacheKey);\n }, 50);\n pendingTimeouts.set(cacheKey, timeoutId);\n });\n\n inFlightRequests.set(cacheKey, requestPromise);\n\n return requestPromise;\n}\n\n/**\n * Clear all cached responses.\n */\nexport function clearFetchCache(): void {\n responseCache.clear();\n inFlightRequests.clear();\n for (const timeoutId of pendingTimeouts.values()) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts.clear();\n}\n","/**\n * Grid Splitter Utility\n *\n * Detects and splits contact sheet grids into component images.\n * Uses a regularity-first approach that assumes grids are uniform,\n * scoring candidates based on how well the image dimensions divide\n * into cells with common photo aspect ratios.\n */\n\nexport interface GridCell {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface GridDetectionResult {\n rows: number;\n cols: number;\n cells: GridCell[];\n confidence: number;\n}\n\nexport interface GridCandidate {\n rows: number;\n cols: number;\n cellWidth: number;\n cellHeight: number;\n cellAspectRatio: number;\n score: number;\n}\n\n// Common photo/video aspect ratios (width:height), ordered by likelihood in contact sheets\nconst COMMON_ASPECT_RATIOS = [\n 16 / 9, // 1.778 - Widescreen video\n 4 / 3, // 1.333 - Standard photo/video\n 3 / 2, // 1.5 - DSLR photos\n 1.85, // 1.85:1 - Cinema flat\n 2.39, // 2.39:1 - Cinema scope\n 1, // 1:1 - Square\n 9 / 16, // 0.5625 - Portrait video\n 3 / 4, // 0.75 - Portrait photo\n 2 / 3, // 0.667 - Portrait DSLR\n];\n\n/**\n * Analyzes an image and detects grid boundaries.\n */\nexport async function detectGrid(\n imageDataUrl: string,\n): Promise<GridDetectionResult> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const result = analyzeGridFromImageData(imageData);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error('Failed to load image'));\n };\n\n img.src = imageDataUrl;\n });\n}\n\n/**\n * Creates a grid result for a specific rows x cols configuration.\n */\nexport function createGridForDimensions(\n width: number,\n height: number,\n rows: number,\n cols: number,\n): GridDetectionResult {\n const cellWidth = width / cols;\n const cellHeight = height / rows;\n\n const cells: GridCell[] = [];\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n cells.push({\n height: Math.round(cellHeight),\n width: Math.round(cellWidth),\n x: Math.round(col * cellWidth),\n y: Math.round(row * cellHeight),\n });\n }\n }\n\n return { cells, cols, confidence: 1, rows };\n}\n\n/**\n * Detects grid with user-specified dimensions (most reliable).\n */\nexport async function detectGridWithDimensions(\n imageDataUrl: string,\n rows: number,\n cols: number,\n): Promise<GridDetectionResult> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n img.onload = () => {\n const result = createGridForDimensions(img.width, img.height, rows, cols);\n resolve(result);\n };\n\n img.onerror = () => {\n reject(new Error('Failed to load image'));\n };\n\n img.src = imageDataUrl;\n });\n}\n\n/**\n * Calculate how well an aspect ratio matches common ratios.\n * Returns a score from 0 to 1 (1 = perfect match).\n */\nfunction aspectRatioScore(aspectRatio: number): number {\n let bestMatch = Infinity;\n\n for (const commonAR of COMMON_ASPECT_RATIOS) {\n const ratio =\n aspectRatio > commonAR ? aspectRatio / commonAR : commonAR / aspectRatio;\n const distance = ratio - 1;\n bestMatch = Math.min(bestMatch, distance);\n }\n\n return Math.exp(-bestMatch * 3);\n}\n\n/**\n * Gets ranked grid candidates based on geometric analysis.\n */\nexport function getGridCandidates(\n width: number,\n height: number,\n): GridCandidate[] {\n const candidates: GridCandidate[] = [];\n const imageAspectRatio = width / height;\n\n for (let rows = 1; rows <= 6; rows++) {\n for (let cols = 1; cols <= 6; cols++) {\n if (rows === 1 && cols === 1) continue;\n\n const cellWidth = width / cols;\n const cellHeight = height / rows;\n const cellAspectRatio = cellWidth / cellHeight;\n\n const cellARScore = aspectRatioScore(cellAspectRatio);\n\n const gridAspectRatio = cols / rows;\n const layoutRatio =\n imageAspectRatio > gridAspectRatio\n ? imageAspectRatio / gridAspectRatio\n : gridAspectRatio / imageAspectRatio;\n const layoutScore = Math.exp(-(layoutRatio - 1) * 2);\n\n const cellCount = rows * cols;\n const cellCountScore = Math.min(cellCount / 6, 1);\n\n const gridSymmetry = 1 - Math.abs(rows - cols) / Math.max(rows, cols);\n\n const score =\n cellARScore * 0.45 +\n layoutScore * 0.25 +\n cellCountScore * 0.15 +\n gridSymmetry * 0.15;\n\n candidates.push({\n cellAspectRatio,\n cellHeight,\n cellWidth,\n cols,\n rows,\n score,\n });\n }\n }\n\n return candidates.sort((a, b) => b.score - a.score);\n}\n\n/**\n * Core grid detection using regularity-first approach.\n */\nfunction analyzeGridFromImageData(imageData: ImageData): GridDetectionResult {\n const { width, height, data } = imageData;\n\n const candidates = getGridCandidates(width, height);\n const verticalEdgeStrength = calculateVerticalEdgeProfile(\n data,\n width,\n height,\n );\n const horizontalEdgeStrength = calculateHorizontalEdgeProfile(\n data,\n width,\n height,\n );\n\n let bestCandidate = candidates[0];\n let bestCombinedScore = -Infinity;\n\n for (const candidate of candidates.slice(0, 8)) {\n const edgeScore = scoreGridByEdges(\n candidate.rows,\n candidate.cols,\n width,\n height,\n verticalEdgeStrength,\n horizontalEdgeStrength,\n );\n\n const combinedScore = candidate.score * 0.7 + edgeScore * 0.3;\n\n if (combinedScore > bestCombinedScore) {\n bestCombinedScore = combinedScore;\n bestCandidate = candidate;\n }\n }\n\n const result = createGridForDimensions(\n width,\n height,\n bestCandidate.rows,\n bestCandidate.cols,\n );\n result.confidence = bestCombinedScore;\n return result;\n}\n\nfunction calculateVerticalEdgeProfile(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n): Float32Array {\n const profile = new Float32Array(width);\n\n for (let x = 1; x < width - 1; x++) {\n let totalGradient = 0;\n for (let y = 0; y < height; y++) {\n const idxLeft = (y * width + (x - 1)) * 4;\n const idxRight = (y * width + (x + 1)) * 4;\n\n const gradR = Math.abs(data[idxRight] - data[idxLeft]);\n const gradG = Math.abs(data[idxRight + 1] - data[idxLeft + 1]);\n const gradB = Math.abs(data[idxRight + 2] - data[idxLeft + 2]);\n\n totalGradient += (gradR + gradG + gradB) / 3;\n }\n profile[x] = totalGradient / height;\n }\n\n return profile;\n}\n\nfunction calculateHorizontalEdgeProfile(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n): Float32Array {\n const profile = new Float32Array(height);\n\n for (let y = 1; y < height - 1; y++) {\n let totalGradient = 0;\n for (let x = 0; x < width; x++) {\n const idxUp = ((y - 1) * width + x) * 4;\n const idxDown = ((y + 1) * width + x) * 4;\n\n const gradR = Math.abs(data[idxDown] - data[idxUp]);\n const gradG = Math.abs(data[idxDown + 1] - data[idxUp + 1]);\n const gradB = Math.abs(data[idxDown + 2] - data[idxUp + 2]);\n\n totalGradient += (gradR + gradG + gradB) / 3;\n }\n profile[y] = totalGradient / width;\n }\n\n return profile;\n}\n\nfunction scoreGridByEdges(\n rows: number,\n cols: number,\n width: number,\n height: number,\n verticalProfile: Float32Array,\n horizontalProfile: Float32Array,\n): number {\n let verticalSum = 0;\n for (let i = 0; i < verticalProfile.length; i++) {\n verticalSum += verticalProfile[i];\n }\n const verticalBaseline = verticalSum / verticalProfile.length;\n\n let horizontalSum = 0;\n for (let i = 0; i < horizontalProfile.length; i++) {\n horizontalSum += horizontalProfile[i];\n }\n const horizontalBaseline = horizontalSum / horizontalProfile.length;\n\n let totalRatio = 0;\n let divisions = 0;\n const searchWindow = Math.max(\n 3,\n Math.floor(Math.min(width / cols, height / rows) * 0.03),\n );\n\n if (cols > 1) {\n const cellWidth = width / cols;\n for (let i = 1; i < cols; i++) {\n const expectedPos = Math.round(cellWidth * i);\n let maxStrength = 0;\n\n for (let offset = -searchWindow; offset <= searchWindow; offset++) {\n const pos = expectedPos + offset;\n if (pos > 0 && pos < width - 1) {\n maxStrength = Math.max(maxStrength, verticalProfile[pos]);\n }\n }\n\n const ratio = verticalBaseline > 0 ? maxStrength / verticalBaseline : 1;\n totalRatio += Math.min(ratio, 3);\n divisions++;\n }\n }\n\n if (rows > 1) {\n const cellHeight = height / rows;\n for (let i = 1; i < rows; i++) {\n const expectedPos = Math.round(cellHeight * i);\n let maxStrength = 0;\n\n for (let offset = -searchWindow; offset <= searchWindow; offset++) {\n const pos = expectedPos + offset;\n if (pos > 0 && pos < height - 1) {\n maxStrength = Math.max(maxStrength, horizontalProfile[pos]);\n }\n }\n\n const ratio =\n horizontalBaseline > 0 ? maxStrength / horizontalBaseline : 1;\n totalRatio += Math.min(ratio, 3);\n divisions++;\n }\n }\n\n if (divisions === 0) return 0;\n\n const avgRatio = totalRatio / divisions;\n return Math.min((avgRatio - 1) / 2, 1);\n}\n\n/**\n * Splits an image into grid cells and returns them as separate data URLs.\n */\nexport async function splitImage(\n imageDataUrl: string,\n grid: GridDetectionResult,\n): Promise<string[]> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n img.onload = () => {\n try {\n const results: string[] = [];\n\n for (const cell of grid.cells) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n reject(new Error('Could not get canvas context'));\n return;\n }\n\n canvas.width = cell.width;\n canvas.height = cell.height;\n\n ctx.drawImage(\n img,\n cell.x,\n cell.y,\n cell.width,\n cell.height,\n 0,\n 0,\n cell.width,\n cell.height,\n );\n\n results.push(canvas.toDataURL('image/png'));\n }\n\n resolve(results);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error('Failed to load image'));\n };\n\n img.src = imageDataUrl;\n });\n}\n\n/**\n * Convenience function that detects and splits in one call.\n */\nexport async function detectAndSplitGrid(\n imageDataUrl: string,\n): Promise<{ grid: GridDetectionResult; images: string[] }> {\n const grid = await detectGrid(imageDataUrl);\n const images = await splitImage(imageDataUrl, grid);\n return { grid, images };\n}\n\n/**\n * Split with user-specified dimensions (most reliable method).\n */\nexport async function splitWithDimensions(\n imageDataUrl: string,\n rows: number,\n cols: number,\n): Promise<{ grid: GridDetectionResult; images: string[] }> {\n const grid = await detectGridWithDimensions(imageDataUrl, rows, cols);\n const images = await splitImage(imageDataUrl, grid);\n return { grid, images };\n}\n","/**\n * Node Dimensions Utility\n *\n * Calculate node dimensions based on output aspect ratio,\n * respecting min/max constraints.\n */\n\n/**\n * Extract dimensions from a base64 data URL image.\n */\nexport function getImageDimensions(\n base64DataUrl: string,\n): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n if (!base64DataUrl || !base64DataUrl.startsWith('data:image')) {\n resolve(null);\n return;\n }\n\n const img = new Image();\n img.onload = () => {\n resolve({ height: img.naturalHeight, width: img.naturalWidth });\n };\n img.onerror = () => {\n resolve(null);\n };\n img.src = base64DataUrl;\n });\n}\n\n/**\n * Extract dimensions from a video data URL or blob URL.\n */\nexport function getVideoDimensions(\n videoUrl: string,\n): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n if (!videoUrl) {\n resolve(null);\n return;\n }\n\n const video = document.createElement('video');\n video.onloadedmetadata = () => {\n resolve({ height: video.videoHeight, width: video.videoWidth });\n };\n video.onerror = () => {\n resolve(null);\n };\n video.src = videoUrl;\n });\n}\n\n// Node sizing constraints\nconst MIN_WIDTH = 200;\nconst MAX_WIDTH = 500;\nconst MIN_HEIGHT = 200;\nconst MAX_HEIGHT = 600;\n\n// Node chrome: header (~40px), controls/padding (~60px)\nconst NODE_CHROME_HEIGHT = 100;\n\n/**\n * Calculate node dimensions that maintain aspect ratio within constraints.\n *\n * @param aspectRatio - Width divided by height (e.g., 16/9 for landscape)\n * @param baseWidth - Starting width to calculate from (default 300px)\n */\nexport function calculateNodeSize(\n aspectRatio: number,\n baseWidth: number = 300,\n): { width: number; height: number } {\n if (!aspectRatio || aspectRatio <= 0 || !Number.isFinite(aspectRatio)) {\n return { height: 300, width: 300 };\n }\n\n let width = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, baseWidth));\n\n let contentHeight = width / aspectRatio;\n let totalHeight = contentHeight + NODE_CHROME_HEIGHT;\n\n if (totalHeight > MAX_HEIGHT) {\n contentHeight = MAX_HEIGHT - NODE_CHROME_HEIGHT;\n width = contentHeight * aspectRatio;\n totalHeight = MAX_HEIGHT;\n }\n\n if (totalHeight < MIN_HEIGHT) {\n contentHeight = MIN_HEIGHT - NODE_CHROME_HEIGHT;\n width = contentHeight * aspectRatio;\n totalHeight = MIN_HEIGHT;\n }\n\n if (width > MAX_WIDTH) {\n width = MAX_WIDTH;\n contentHeight = width / aspectRatio;\n totalHeight = contentHeight + NODE_CHROME_HEIGHT;\n totalHeight = Math.max(MIN_HEIGHT, Math.min(MAX_HEIGHT, totalHeight));\n }\n\n if (width < MIN_WIDTH) {\n width = MIN_WIDTH;\n contentHeight = width / aspectRatio;\n totalHeight = contentHeight + NODE_CHROME_HEIGHT;\n totalHeight = Math.max(MIN_HEIGHT, Math.min(MAX_HEIGHT, totalHeight));\n }\n\n return {\n height: Math.round(totalHeight),\n width: Math.round(width),\n };\n}\n\n/**\n * Calculate node dimensions preserving current height if provided.\n *\n * @param aspectRatio - Width divided by height\n * @param currentHeight - Optional current height to preserve (if within constraints)\n */\nexport function calculateNodeSizePreservingHeight(\n aspectRatio: number,\n currentHeight?: number,\n): { width: number; height: number } {\n if (!aspectRatio || aspectRatio <= 0 || !Number.isFinite(aspectRatio)) {\n return { height: currentHeight ?? 300, width: 300 };\n }\n\n if (\n currentHeight !== undefined &&\n currentHeight >= MIN_HEIGHT &&\n currentHeight <= MAX_HEIGHT\n ) {\n const contentHeight = currentHeight - NODE_CHROME_HEIGHT;\n let width = contentHeight * aspectRatio;\n width = Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, width));\n\n return {\n height: Math.round(currentHeight),\n width: Math.round(width),\n };\n }\n\n return calculateNodeSize(aspectRatio);\n}\n","/**\n * Speed Curve Utility\n *\n * Advanced time-warping for video speed ramps using easing functions.\n * Maps original video timestamps to warped timestamps through easing curves.\n */\n\nimport { type EasingFunction, easing, getEasingFunction } from './easing';\n\nconst INVERSE_TOLERANCE = 1e-6;\nconst INVERSE_MAX_ITERATIONS = 32;\nconst MONOTONICITY_SAMPLES = 256;\nconst MONOTONICITY_TOLERANCE = 1e-6;\n\nconst inverseCache = new WeakMap<EasingFunction, EasingFunction | null>();\nconst monotonicityCache = new WeakMap<EasingFunction, boolean>();\n\nfunction isMonotonicIncreasing(func: EasingFunction): boolean {\n const cached = monotonicityCache.get(func);\n if (cached !== undefined) {\n return cached;\n }\n\n let prev = func(0);\n for (let i = 1; i <= MONOTONICITY_SAMPLES; i++) {\n const value = func(i / MONOTONICITY_SAMPLES);\n if (value + MONOTONICITY_TOLERANCE < prev) {\n monotonicityCache.set(func, false);\n return false;\n }\n prev = value;\n }\n\n monotonicityCache.set(func, true);\n return true;\n}\n\nfunction invertEasingValue(target: number, func: EasingFunction): number {\n if (target <= INVERSE_TOLERANCE) {\n return 0;\n }\n if (target >= 1 - INVERSE_TOLERANCE) {\n return 1;\n }\n\n let low = 0;\n let high = 1;\n let mid = 0.5;\n\n for (let i = 0; i < INVERSE_MAX_ITERATIONS; i++) {\n mid = (low + high) / 2;\n const value = func(mid);\n const diff = value - target;\n\n if (Math.abs(diff) <= INVERSE_TOLERANCE) {\n break;\n }\n\n if (diff < 0) {\n low = mid;\n } else {\n high = mid;\n }\n }\n\n return Math.min(1, Math.max(0, mid));\n}\n\nfunction getInverseEasing(func: EasingFunction): EasingFunction | null {\n if (inverseCache.has(func)) {\n return inverseCache.get(func)!;\n }\n\n if (!isMonotonicIncreasing(func)) {\n inverseCache.set(func, null);\n return null;\n }\n\n const inverse: EasingFunction = (value: number) => {\n const clamped = Math.max(0, Math.min(1, value));\n return invertEasingValue(clamped, func);\n };\n\n inverseCache.set(func, inverse);\n return inverse;\n}\n\nfunction mapTimeWithEasing(\n normalizedTime: number,\n func: EasingFunction,\n): number {\n const inverse = getInverseEasing(func);\n if (!inverse) {\n // Non-monotonic function — fall back to direct mapping\n return func(normalizedTime);\n }\n\n return inverse(normalizedTime);\n}\n\n/**\n * Maps original video timestamps to warped timestamps using any easing function.\n *\n * @param originalTime - Original timestamp in seconds (0 to inputDuration)\n * @param inputDuration - Input video duration in seconds (default: 5)\n * @param outputDuration - Output video duration in seconds (default: 1.5)\n * @param easingFunction - Easing function or function name string (default: easeInOutCubic)\n * @returns Warped timestamp for the output video\n */\nexport function warpTime(\n originalTime: number,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n): number {\n const easingFunc =\n typeof easingFunction === 'string'\n ? getEasingFunction(easingFunction)\n : easingFunction;\n\n const t = originalTime / inputDuration;\n const clamped = Math.max(0, Math.min(1, t));\n const eased = mapTimeWithEasing(clamped, easingFunc);\n\n return eased * outputDuration;\n}\n\n/**\n * Calculate the duration of a frame after warping.\n */\nexport function calculateWarpedDuration(\n originalStart: number,\n originalDuration: number,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n): number {\n const warpedStart = warpTime(\n originalStart,\n inputDuration,\n outputDuration,\n easingFunction,\n );\n const warpedEnd = warpTime(\n originalStart + originalDuration,\n inputDuration,\n outputDuration,\n easingFunction,\n );\n return warpedEnd - warpedStart;\n}\n\n/**\n * Validate that a warp time function produces valid output.\n */\nexport function validateWarpFunction(\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n tolerance: number = 0.001,\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n const startWarp = warpTime(0, inputDuration, outputDuration, easingFunction);\n if (Math.abs(startWarp - 0) > tolerance) {\n errors.push(`Start point should be 0, got ${startWarp}`);\n }\n\n const endWarp = warpTime(\n inputDuration,\n inputDuration,\n outputDuration,\n easingFunction,\n );\n if (Math.abs(endWarp - outputDuration) > tolerance) {\n errors.push(`End point should be ${outputDuration}, got ${endWarp}`);\n }\n\n let prevWarp = 0;\n for (let t = 0; t <= inputDuration; t += inputDuration / 100) {\n const warp = warpTime(t, inputDuration, outputDuration, easingFunction);\n if (warp < prevWarp) {\n errors.push(\n `Monotonicity violation at t=${t.toFixed(2)}: ${warp} < ${prevWarp}`,\n );\n break;\n }\n prevWarp = warp;\n }\n\n return { errors, valid: errors.length === 0 };\n}\n\n/**\n * Generate statistics about the warp curve.\n */\nexport function analyzeWarpCurve(\n easingFunction: EasingFunction | string = easing.easeInOutCubic,\n inputDuration: number = 5,\n outputDuration: number = 1.5,\n samples: number = 100,\n): {\n speedMultipliers: number[];\n minSpeed: number;\n maxSpeed: number;\n avgSpeed: number;\n} {\n const speedMultipliers: number[] = [];\n const averageSpeed = inputDuration / outputDuration;\n\n for (let i = 0; i < samples; i++) {\n const t1 = (i / samples) * inputDuration;\n const t2 = ((i + 1) / samples) * inputDuration;\n\n const warp1 = warpTime(t1, inputDuration, outputDuration, easingFunction);\n const warp2 = warpTime(t2, inputDuration, outputDuration, easingFunction);\n\n const inputSegmentDuration = t2 - t1;\n const outputSegmentDuration = warp2 - warp1;\n const absoluteSpeed =\n inputSegmentDuration / (outputSegmentDuration + 1e-10);\n const speedMultiplier = absoluteSpeed / averageSpeed;\n\n speedMultipliers.push(speedMultiplier);\n }\n\n const minSpeed = Math.min(...speedMultipliers);\n const maxSpeed = Math.max(...speedMultipliers);\n const avgSpeed =\n speedMultipliers.reduce((a, b) => a + b, 0) / speedMultipliers.length;\n\n return { avgSpeed, maxSpeed, minSpeed, speedMultipliers };\n}\n"]}
|
package/dist/nodes.mjs
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
export { AnimationNode, AnnotationNode, AudioInputNode, BaseNode, DownloadNode, ImageCompareNode, ImageGenNode, ImageGridSplitNode, ImageInputNode, LLMNode, LipSyncNode, MotionControlNode, NodeDetailModal, OutputGalleryNode, OutputNode, PromptConstructorNode, PromptNode, ReframeNode, ResizeNode, SubtitleNode, TextToSpeechNode, TranscribeNode, UpscaleNode, VideoFrameExtractNode, VideoGenNode, VideoInputNode, VideoStitchNode, VideoTrimNode, VoiceChangeNode, WorkflowInputNode, WorkflowOutputNode, WorkflowRefNode, nodeTypes, setWorkflowRefApi } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
import './chunk-
|
|
1
|
+
export { AnimationNode, AnnotationNode, AudioInputNode, BaseNode, DownloadNode, ImageCompareNode, ImageGenNode, ImageGridSplitNode, ImageInputNode, LLMNode, LipSyncNode, MotionControlNode, NodeDetailModal, OutputGalleryNode, OutputNode, PromptConstructorNode, PromptNode, ReframeNode, ResizeNode, SubtitleNode, TextToSpeechNode, TranscribeNode, UpscaleNode, VideoFrameExtractNode, VideoGenNode, VideoInputNode, VideoStitchNode, VideoTrimNode, VoiceChangeNode, WorkflowInputNode, WorkflowOutputNode, WorkflowRefNode, nodeTypes, setWorkflowRefApi } from './chunk-55JFUNLR.mjs';
|
|
2
|
+
import './chunk-G3HCTMAZ.mjs';
|
|
3
|
+
import './chunk-SHU7JPQY.mjs';
|
|
4
|
+
import './chunk-SBB2YW3Y.mjs';
|
|
5
|
+
import './chunk-2C2AAXJP.mjs';
|
|
6
|
+
import './chunk-X3XNTD4R.mjs';
|
|
7
|
+
import './chunk-SRPSHHHV.mjs';
|
|
8
|
+
import './chunk-JSF4FHBH.mjs';
|
|
9
|
+
import './chunk-AZJFDWBF.mjs';
|
|
10
|
+
import './chunk-YYFM6P4C.mjs';
|
|
11
|
+
import './chunk-R5L7WB7F.mjs';
|
|
12
|
+
import './chunk-7DJHFOIW.mjs';
|
|
13
|
+
import './chunk-4JOFNZW6.mjs';
|
|
14
|
+
//# sourceMappingURL=nodes.mjs.map
|
|
15
|
+
//# sourceMappingURL=nodes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"nodes.mjs"}
|
package/dist/panels.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export { DebugPanel, NodePalette, PanelContainer } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { DebugPanel, NodePalette, PanelContainer } from './chunk-HMTYPFOT.mjs';
|
|
2
|
+
import './chunk-R5L7WB7F.mjs';
|
|
3
|
+
import './chunk-7DJHFOIW.mjs';
|
|
4
|
+
//# sourceMappingURL=panels.mjs.map
|
|
5
|
+
//# sourceMappingURL=panels.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"panels.mjs"}
|
package/dist/provider.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import './chunk-
|
|
2
|
-
export { WorkflowUIProvider, useWorkflowUIConfig } from './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
import './chunk-SRPSHHHV.mjs';
|
|
2
|
+
export { WorkflowUIProvider, useWorkflowUIConfig } from './chunk-JSF4FHBH.mjs';
|
|
3
|
+
import './chunk-4JOFNZW6.mjs';
|
|
4
|
+
//# sourceMappingURL=provider.mjs.map
|
|
5
|
+
//# sourceMappingURL=provider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"provider.mjs"}
|
package/dist/stores.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export { createSelectGroupByNodeId, createSelectIsNodeSelected, createSelectNodeById, selectAddNode, selectAddNodesAndEdges, selectCreateGroup, selectDeleteGroup, selectDuplicateNode, selectEdgeStyle, selectEdges, selectFindCompatibleHandle, selectGetConnectedNodeIds, selectGetNodeById, selectGroups, selectIsDirty, selectIsLoading, selectIsSaving, selectIsValidConnection, selectNavigationTargetId, selectNodes, selectOnConnect, selectOnEdgesChange, selectOnNodesChange, selectRemoveEdge, selectRemoveNode, selectSelectedNodeIds, selectSetDirty, selectSetSelectedNodeIds, selectToggleNodeLock, selectUnlockAllNodes, selectUpdateNodeData, selectWorkflowId, selectWorkflowName, useContextMenuStore } from './chunk-
|
|
2
|
-
export { useAnnotationStore, usePromptEditorStore } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
export { PROVIDER_INFO, useExecutionStore, useSettingsStore, useUIStore } from './chunk-
|
|
5
|
-
export { useWorkflowStore } from './chunk-
|
|
6
|
-
export { configurePromptLibrary, usePromptLibraryStore } from './chunk-
|
|
1
|
+
export { createSelectGroupByNodeId, createSelectIsNodeSelected, createSelectNodeById, selectAddNode, selectAddNodesAndEdges, selectCreateGroup, selectDeleteGroup, selectDuplicateNode, selectEdgeStyle, selectEdges, selectFindCompatibleHandle, selectGetConnectedNodeIds, selectGetNodeById, selectGroups, selectIsDirty, selectIsLoading, selectIsSaving, selectIsValidConnection, selectNavigationTargetId, selectNodes, selectOnConnect, selectOnEdgesChange, selectOnNodesChange, selectRemoveEdge, selectRemoveNode, selectSelectedNodeIds, selectSetDirty, selectSetSelectedNodeIds, selectToggleNodeLock, selectUnlockAllNodes, selectUpdateNodeData, selectWorkflowId, selectWorkflowName, useContextMenuStore } from './chunk-IKR6GVZ4.mjs';
|
|
2
|
+
export { useAnnotationStore, usePromptEditorStore } from './chunk-AZJFDWBF.mjs';
|
|
3
|
+
import './chunk-YYFM6P4C.mjs';
|
|
4
|
+
export { PROVIDER_INFO, useExecutionStore, useSettingsStore, useUIStore } from './chunk-R5L7WB7F.mjs';
|
|
5
|
+
export { useWorkflowStore } from './chunk-7DJHFOIW.mjs';
|
|
6
|
+
export { configurePromptLibrary, usePromptLibraryStore } from './chunk-4JOFNZW6.mjs';
|
|
7
|
+
//# sourceMappingURL=stores.mjs.map
|
|
8
|
+
//# sourceMappingURL=stores.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"stores.mjs"}
|
package/dist/toolbar.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { BottomBar, CostIndicator, OverflowMenu, SaveAsDialog, SaveIndicator, Toolbar, ToolbarDropdown } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
1
|
+
export { BottomBar, CostIndicator, OverflowMenu, SaveAsDialog, SaveIndicator, Toolbar, ToolbarDropdown } from './chunk-3GWH2ZOH.mjs';
|
|
2
|
+
import './chunk-2BHILUF7.mjs';
|
|
3
|
+
import './chunk-YYFM6P4C.mjs';
|
|
4
|
+
import './chunk-R5L7WB7F.mjs';
|
|
5
|
+
import './chunk-7DJHFOIW.mjs';
|
|
6
|
+
//# sourceMappingURL=toolbar.mjs.map
|
|
7
|
+
//# sourceMappingURL=toolbar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"toolbar.mjs"}
|
package/dist/ui.mjs
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export { Checkbox, ComparisonSlider, GridPositionSelector, Input, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Slider } from './chunk-
|
|
2
|
-
export { Button, buttonVariants, cn } from './chunk-
|
|
1
|
+
export { Checkbox, ComparisonSlider, GridPositionSelector, Input, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Slider } from './chunk-G3HCTMAZ.mjs';
|
|
2
|
+
export { Button, buttonVariants, cn } from './chunk-SBB2YW3Y.mjs';
|
|
3
|
+
//# sourceMappingURL=ui.mjs.map
|
|
4
|
+
//# sourceMappingURL=ui.mjs.map
|
package/dist/ui.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ui.mjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"workflowStore-XYPHB6DS.mjs"}
|
package/package.json
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
-
"@dagrejs/dagre": "
|
|
4
|
-
"@genfeedai/core": "
|
|
5
|
-
"@genfeedai/types": "
|
|
6
|
-
"@radix-ui/react-checkbox": "
|
|
7
|
-
"@radix-ui/react-label": "
|
|
8
|
-
"@radix-ui/react-select": "
|
|
9
|
-
"@radix-ui/react-slider": "
|
|
10
|
-
"@radix-ui/react-slot": "
|
|
11
|
-
"class-variance-authority": "
|
|
12
|
-
"clsx": "
|
|
13
|
-
"lucide-react": "
|
|
14
|
-
"nanoid": "
|
|
15
|
-
"tailwind-merge": "
|
|
3
|
+
"@dagrejs/dagre": "3.0.0",
|
|
4
|
+
"@genfeedai/core": "0.2.1",
|
|
5
|
+
"@genfeedai/types": "0.2.2",
|
|
6
|
+
"@radix-ui/react-checkbox": "1.3.3",
|
|
7
|
+
"@radix-ui/react-label": "2.1.8",
|
|
8
|
+
"@radix-ui/react-select": "2.2.6",
|
|
9
|
+
"@radix-ui/react-slider": "1.3.6",
|
|
10
|
+
"@radix-ui/react-slot": "1.2.4",
|
|
11
|
+
"class-variance-authority": "0.7.1",
|
|
12
|
+
"clsx": "2.1.1",
|
|
13
|
+
"lucide-react": "1.7.0",
|
|
14
|
+
"nanoid": "5.1.7",
|
|
15
|
+
"tailwind-merge": "3.5.0"
|
|
16
16
|
},
|
|
17
17
|
"description": "Shared UI components for Genfeed workflow editor",
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@testing-library/jest-dom": "6.
|
|
20
|
-
"@testing-library/react": "16.2
|
|
21
|
-
"@types/node": "
|
|
22
|
-
"@types/react": "19.2.
|
|
19
|
+
"@testing-library/jest-dom": "6.9.1",
|
|
20
|
+
"@testing-library/react": "16.3.2",
|
|
21
|
+
"@types/node": "25.5.2",
|
|
22
|
+
"@types/react": "19.2.14",
|
|
23
23
|
"@types/react-dom": "19.2.3",
|
|
24
|
-
"@xyflow/react": "12.10.
|
|
25
|
-
"jsdom": "
|
|
24
|
+
"@xyflow/react": "12.10.2",
|
|
25
|
+
"jsdom": "29.0.1",
|
|
26
26
|
"react": "19.2.4",
|
|
27
|
-
"react-compare-slider": "
|
|
27
|
+
"react-compare-slider": "4.0.0",
|
|
28
28
|
"react-dom": "19.2.4",
|
|
29
|
-
"tsup": "8.
|
|
29
|
+
"tsup": "8.5.1",
|
|
30
30
|
"typescript": "5.9.3",
|
|
31
|
-
"vitest": "
|
|
31
|
+
"vitest": "4.1.2",
|
|
32
32
|
"zundo": "2.3.0",
|
|
33
|
-
"zustand": "5.0.
|
|
33
|
+
"zustand": "5.0.12"
|
|
34
34
|
},
|
|
35
35
|
"exports": {
|
|
36
36
|
".": {
|
|
@@ -112,5 +112,5 @@
|
|
|
112
112
|
],
|
|
113
113
|
"type": "module",
|
|
114
114
|
"types": "./dist/index.d.ts",
|
|
115
|
-
"version": "0.2.
|
|
115
|
+
"version": "0.2.7"
|
|
116
116
|
}
|
package/dist/chunk-LDN7IX4Y.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
package/dist/chunk-MLJJBBTB.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|