feat: grok video reference frames, music studio, hero layout fix, and test fixes#32
Conversation
…t cascading re-renders
- Implement background persistence for music generations to prevent UI blocking. - Fix interpolation slot positions in generation controls. - Correct Suno model propagation in MusicAPI. - Optimize re-renders in MusicPlayerBar using callback ref pattern. - Robust handleDownload in music-player-bar.tsx with proper cleanup. - Migrate ClerkThemeProvider to use centralized CSS variables. - Implement runtime validation and narrowing to replace unsafe TypeScript 'as' casts. - Clamp and normalize dimensions in LightboxPane to prevent negative values and unnecessary churn. - Consolidate video frame picker logic into VideoFramesSection component. - Centralize active model count in pricing data. - Automatically filter out legacy models from MODEL_SEO_SLUGS registry. - Improved accessibility with aria-labelledby for Suno model selection. - Fix various test bugs and strengthen assertions. - Relocate and document the experimental test-grid.html prototype.
…gth array - Change handleInterpolationImagesChange to always output length-2 array - Index 0 = firstFrame, Index 1 = lastFrame, empty string for missing slots - Update consumers in studio-shell to handle fixed-length array correctly
- Extract LoadableFrameImage component with fade-in animation - Prevents layout shift and provides visual feedback during image load - Applied to both frame slots (128px) and recent image thumbnails (64px) - Follows established pattern from gallery-thumbnail.tsx
- Split 8 image models into two explicit rows of 4 for stable layout - Each row independently centered with flex justify-center - Widened container across all breakpoints for breathing room - Removed text truncation from model badges - names now fully visible - Changed from truncate/min-w-0 to whitespace-nowrap - Restored original font sizes for readability - Tighter badge padding so 4 fit per row comfortably
…s, and studio refinements - Simplify hero section model showcase to a single flex-wrap container eliminating forced row splits and orphan badge issues across breakpoints - Harden music API client with improved error handling and test coverage - Enhance use-music-generation hook with expanded state management - Refine video reference frames picker and image canvas interactions - Update Convex musicGenerations schema for consistency - Extend playground test grid
- Add in-memory localStorage mock to vitest.setup.ts (fixes 5 test files / 59 tests) window.localStorage methods were not functions in jsdom environment - Fix music generation test expectation: normalizeNetworkError wraps non-Error values via String(err), so raw string propagates as message - Convert dismissedConvexIds from ref to state to satisfy react-hooks/refs lint rule and ensure immediate mergedTracks recomputation on dismiss - Remove unused syncInFlightCount callback and prefix unused destructured vars in MusicStudioShell
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis PR introduces a comprehensive music generation studio feature powered by Suno and ElevenLabs APIs, adds Flux 2 Dev model support across the platform, refactors storage APIs from image-specific to generic file handling, enhances video reference frame management, implements theme refinements, and removes obsolete documentation files. Changes
Sequence DiagramsequenceDiagram
participant User as User
participant UI as Music UI
participant Hook as useMusicGeneration
participant API as MusicAPI
participant Upload as /api/music/upload
participant R2 as Cloudflare R2
participant Convex as Convex Backend
User->>UI: Click Generate with Prompt
UI->>Hook: generate(prompt, lyrics, options)
Hook->>Hook: Create Placeholder Track
UI->>UI: Show Generating State
par Music Generation
Hook->>API: generate(params)
API->>API: Validate Prompt
alt Suno Model
API->>API: POST /v1/audio/speech
else ElevenLabs
API->>API: GET Audio Endpoint
end
API->>API: Convert to Blob
API->>API: Create Object URL
end
API-->>Hook: MusicGenerationResult
Hook->>Upload: Upload Blob to R2
Upload->>R2: PUT Audio File
R2-->>Upload: Confirm (URL, key, size)
Upload-->>Hook: { audioUrl, r2Key, audioSizeBytes }
Hook->>Convex: create(metadata with r2Key)
Convex-->>Hook: { convexId }
Hook->>Hook: Link convexId to Track
Hook-->>UI: Updated Track with convexId
UI->>UI: Show Player Controls
User->>UI: Like/Dislike Track
UI->>Hook: setReaction(trackId, reaction)
Hook->>Convex: setReaction(mutation)
Convex-->>Hook: Confirmed Reaction
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
✨ Finishing Touches
🧪 Generate unit tests (beta)
|
Summary
Summary by CodeRabbit
Release Notes
New Features
UI & UX Improvements
Bug Fixes
Refactoring