Conversation
…ion generation Add end-to-end local speech-to-text pipeline using browser-based Whisper inference with SharedArrayBuffer support (COEP/COOP headers). Includes transcript storage (IndexedDB v10), settings for default model/quantization/ language, per-clip caption generation from timeline context menu with progress overlays, and media library transcription controls. Replaces landing page YouTube iframe with a static thumbnail link for cross-origin isolation compatibility.
Move direct cross-feature import of settings-store through a deps/* adapter module to satisfy the boundary check.
Add a centralized editor layout system with compact and default density presets, driven by CSS custom properties. Compact (the new default) fits more of the editor on a 1080p screen by shrinking toolbar, sidebars, preview controls, timeline headers, track heights, and clip row sizes. Users can switch between presets in Settings > Interface. Also adds @vercel/analytics and tightens various UI element sizes for the denser layout.
Move color scopes out of the keyframe graph panel into a dedicated resizable side panel in the preview area. The scopes toggle now opens a ColorScopesMonitor alongside the program monitor (right side), with independent drag-to-resize handles that respect min/max constraints when both source monitor and scopes are open simultaneously.
- Extract renderOffscreenFrame to deduplicate frame rendering across capture methods - Add in-flight guards for captureCanvasSource and GPU scope rendering - Replace decay compute shader with encoder.clearBuffer for accumulator clearing - Split waveform render into accumulate + renderAccumulated with renderBatch API - Add configurable 3-up/all stack layout for embedded scopes panel - Use aspect-ratio-based canvas resize instead of square constraint
Add a camera button to playback controls that captures the current preview frame, downloads it as PNG, and imports it into the media library. Simplify timecode display layout by using a single reserved width for the entire component instead of per-span sizing. Add importGeneratedImage method to media library service for editor- generated assets with rollback on failure.
…errides - Fix halftone shader bright edge by replacing outOfFrame geometric bounds check with alpha-based source coverage and clamped UV sampling - Snap halftone grid to whole cells to prevent fractional border columns - Disable importExternalTexture fast path which produced different edge pixel values than canvas 2D due to YUV→RGB conversion differences - Use VideoFrame.visibleRect cropping in video extractor and tier-2 frame drawing to avoid codec padding artifacts - Pass preview effects overrides through to adjustment layer resolution so live-edited adjustment effects are reflected during preview
… stamp Even cell counts land texture edges at cell boundaries (fract=0), exposing paper/background color as a rectangular border. Forcing odd counts centers the grid so edges land at fract=0.5 (dot centers), making the pattern bleed seamlessly to the boundary.
…zmo cache invalidation - Canvas panel snaps width/height to nearest even on commit and steps by 2, preventing odd dimensions that video codecs reject - LinkedDimensions accepts a step prop for callers that need non-default steps - Export validateSettings auto-rounds odd dimensions as a safety net instead of rejecting with an error - Fix stale fast-scrub cache during single-item gizmo transforms by invalidating the current frame when previewTransform changes
Store the active clip inspector tab (transform/effects/media) in the editor store so it survives selection changes. Falls back gracefully when the remembered tab is unavailable for the current item type.
… utilities Enable drag-and-drop media placement directly onto the preview canvas, positioning items at the drop point with smart track selection. Refactor timeline track drop logic to share item-building and file-extraction utilities, reducing duplication across canvas and timeline drop targets.
Lock non-canvas UI regions (toolbar, sidebars, timeline, controls) during pen mode via InteractionLockRegion overlay. Add a Drawing Mode HUD with progress hints and finish/cancel buttons. Place new mask shapes at the playhead on the best available track using shared drop-placement logic, and prevent timeline overlaps in addItem/addItems via collision detection. Also swallow all non-modifier keyboard shortcuts while pen mode is active and fix vectorscope overflow in color scopes.
|
Too many files changed for review. ( |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis pull request introduces a comprehensive editor layout density system, browser-based media transcription with caption generation, multi-panel preview layout with draggable splits, collision-aware timeline item placement, and extensive UI refinements across the editor, settings, and preview components. New features include settings for editor density and Whisper transcription defaults, Popover and Combobox UI components, and support for media frame capture to the library. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
✨ Finishing Touches
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b921dbbb0a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (hasWebCodecs) { | ||
| this.decoderWorker.postMessage({ type: 'init', file }); | ||
| return; |
There was a problem hiding this comment.
Fall back to AudioContext when WebCodecs decode is unsupported
When AudioDecoder exists, start() always takes the WebCodecs path and returns immediately, but the decoder worker can reject specific codecs (AudioDecoder.isConfigSupported(...)), which then hard-fails transcription instead of using the existing decodeWithAudioContext fallback. In browsers that expose WebCodecs but lack support for a given audio codec, users will be unable to transcribe files that the AudioContext path could still decode; this regression is introduced by the unconditional early return in the WebCodecs branch.
Useful? React with 👍 / 👎.
Summary
Test plan
npm run test:runto confirm all tests passSummary by CodeRabbit
New Features
Improvements
Bug Fixes