---
phase: 10-node-autosizing
plan: 01
type: execute
---
Auto-size generate nodes to match output image/video aspect ratio after generation completes.
Purpose: Nodes should visually reflect their output dimensions, making the canvas layout more intuitive and allowing users to see aspect ratios at a glance.
Output: GenerateImageNode and GenerateVideoNode automatically resize to match output aspect ratio.
~/.claude/get-shit-done/workflows/execute-phase.md
~/.claude/get-shit-done/templates/summary.md
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
# Prior phase context
@.planning/phases/09-video-history/09-01-SUMMARY.md
# Key source files
@src/store/workflowStore.ts
@src/components/nodes/BaseNode.tsx
@src/components/nodes/GenerateImageNode.tsx
@src/components/nodes/GenerateVideoNode.tsx
**Relevant codebase patterns:**
- Node dimensions set via `node.style.width/height` in workflowStore.ts:469-494
- `defaultDimensions` defines initial sizes per node type
- `useReactFlow().setNodes()` updates node styles from within components
- Generate nodes already use `setNodes` for parameter panel expansion (GenerateImageNode.tsx:244)
- Output images stored in `outputImage` (NanoBananaNodeData) and `outputVideo` (GenerateVideoNodeData)
**Constraints from prior phases:**
- Phase 9 noted: "Carousel UI may need adjustment when node autosizing is implemented"
Task 1: Create node dimension calculation utility
src/utils/nodeDimensions.ts
Create a utility module with functions to:
1. `getImageDimensions(base64DataUrl: string): Promise<{width: number, height: number}>` - Extract dimensions from base64 image by loading into Image element
2. `calculateNodeSize(aspectRatio: number, baseWidth: number = 300): {width: number, height: number}` - Calculate node dimensions that maintain aspect ratio with constraints:
- Minimum width: 200px
- Maximum width: 500px
- Minimum height: 200px
- Maximum height: 600px
- Base width defaults to 300px
The utility should handle edge cases:
- Return null/default for invalid input
- Handle both portrait and landscape orientations
- Account for node chrome (header ~40px, controls ~60px) when calculating content area
Export both functions for use in generate nodes.
File exists at src/utils/nodeDimensions.ts with both exported functions. TypeScript compiles without errors: `npm run build`
Utility module exists with getImageDimensions and calculateNodeSize functions, build passes
Task 2: Auto-resize generate nodes on output
src/components/nodes/GenerateImageNode.tsx, src/components/nodes/GenerateVideoNode.tsx
Update both generate node components to resize when output is set:
**GenerateImageNode.tsx:**
1. Import the utility functions from nodeDimensions.ts
2. Add useEffect that triggers when `nodeData.outputImage` changes:
- If outputImage exists, call getImageDimensions()
- Calculate appropriate node size with calculateNodeSize()
- Use setNodes() to update the node's style.width and style.height
- Only resize if dimensions actually changed (avoid infinite loops)
**GenerateVideoNode.tsx:**
1. Same pattern as GenerateImageNode
2. For videos, use a hidden video element to get dimensions:
- Create video element, set src to outputVideo
- On loadedmetadata event, read videoWidth and videoHeight
- Calculate and apply node size
**Important considerations:**
- Don't resize while loading (only on complete output)
- Preserve user's manual resize if they've adjusted the node (track with a `userResized` flag in node data, or skip resize if current size differs significantly from default)
- Use requestAnimationFrame or setTimeout(0) to avoid React Flow update conflicts
1. `npm run build` passes
2. Manual test: Generate an image with different aspect ratios (1:1, 16:9, 9:16) and verify node resizes appropriately
- GenerateImageNode resizes to match output image aspect ratio
- GenerateVideoNode resizes to match output video aspect ratio
- Build passes without errors
Before declaring plan complete:
- [ ] `npm run build` succeeds without errors
- [ ] No TypeScript errors in new/modified files
- [ ] Generate nodes resize when output is set
- [ ] Aspect ratio is maintained in node dimensions
- All tasks completed
- All verification checks pass
- No errors or warnings introduced
- Generate nodes auto-size to output aspect ratio