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.
…keyframe graph panel Add min-h-0 and h-full to InteractionLockRegion to prevent flex overflow, and move KeyframeGraphPanel above the bottom status bar so it renders in the correct stacking position.
… pen placement When completing a pen-mode mask shape and all existing tracks are occupied at the playhead, create a new track above to preserve the intended time position instead of failing silently.
Masks now only clip items on tracks below the mask track (higher order), matching standard NLE behavior. Extracts shared doesMaskAffectTrack utility and threads track order through preview, export, and composition runtime pipelines.
…d toolbar controls Add a full path edit mode for mask shapes: vertex/handle dragging with live clip-path preview, marquee box-selection, shape body translation via gizmo, double-click edge insertion, right-click vertex deletion, and corner/bezier knot conversion from toolbar buttons. Thread preview path vertex overrides through the composition runtime, export canvas renderer, and fast-scrub pipeline so mask geometry updates are visible in real time during editing. Move pen/edit mode HUD from the mask overlay into the preview-area toolbar and broaden interaction locks to cover all mask editing modes, not just pen mode.
Intercept Delete and Backspace in path edit mode to remove selected vertices instead of letting the event bubble to the timeline's item deletion handler. Supports single and multi-vertex deletion while preserving the minimum 3-vertex constraint.
… deferred drag commits Redesign the dopesheet editor with per-row prev/next navigation, keyframe toggle, auto-key toggle, and inline value input fields that commit on Enter or blur. Add local/global frame readout inputs in the header for repositioning selected keyframes by typing exact frames. Defer keyframe drag commits to pointer-up (preview positions via direct DOM manipulation during drag). Extract layout, row-controls, and property-value-ranges into shared modules. Move the K hotkey from timeline editing shortcuts into the keyframe graph panel so it targets the active editor property. Clip value graph content to the graph area and zoom around the keyframe cluster centroid.
|
Too many files changed for review. ( |
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis PR introduces per-track mask ordering and scoping semantics, enabling masks to affect only lower tracks. It adds preview-based path-vertex editing for masks, significantly expands the dopesheet editor with property-value editing and auto-key toggles, and updates rendering pipelines to support track-scoped mask application and path-vertex overrides. Changes
Sequence DiagramssequenceDiagram
participant Client as Render Client
participant FrameRes as Frame Resolution
participant MaskFilter as Mask Filtering
participant MaskApply as Track-Scoped Apply
participant Canvas as Canvas Renderer
Client->>FrameRes: resolveFrameCompositionScene(scene, masks, getPreviewPathVertices)
FrameRes->>FrameRes: resolveActiveShapeMasksAtFrame(masks, getPreviewPathVertices)
FrameRes->>FrameRes: Apply preview vertex overrides to shapes
FrameRes->>Client: Return resolved masks with trackOrder
Client->>MaskFilter: Collect visible tracks with trackOrder
loop For each track
MaskFilter->>MaskFilter: getMasksForTrackOrder(activeMasks, trackOrder)
MaskFilter->>MaskFilter: Filter via doesMaskAffectTrack(maskTrackOrder < itemTrackOrder)
end
MaskFilter->>Client: Return scoped masks per track
Client->>MaskApply: applyTrackScopedMasks(itemCanvas, scopedMasks)
MaskApply->>MaskApply: For each mask, apply clip-path to canvas
MaskApply->>Canvas: Draw masked result to output
Canvas->>Client: Composite final rendered frame
sequenceDiagram
participant Editor as Mask Editor
participant Store as Mask Editor Store
participant PathUtil as Path Utils
participant Preview as Preview Renderer
participant Cache as Frame Cache
Editor->>Editor: User drags path vertex
Editor->>Store: updatePreviewVertices(vertices)
Store->>Store: Store preview vertex state (previewVertices, editingItemId)
Preview->>Store: getPreviewPathVerticesOverride()
Store->>Preview: Return getPreviewPathVertices callback
Preview->>PathUtil: applyPreviewPathVerticesToShape(shape, getPreviewPathVertices)
PathUtil->>PathUtil: Override shape.pathVertices with preview
PathUtil->>Preview: Return shape with preview vertices
Preview->>Cache: invalidateFrameCache([currentFrame])
Cache->>Preview: Re-render frame with preview geometry
Preview->>Editor: Display updated preview rendering
Editor->>Editor: User finishes edit
Editor->>Store: stopEditing() or confirm changes
Store->>Preview: Clear preview state
Preview->>Cache: Invalidate cache again (commit preview)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment Tip You can make CodeRabbit's review stricter and more nitpicky using the `assertive` profile, if that's what you prefer.Change the |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
# Conflicts: # src/features/editor/components/editor.tsx # src/features/editor/components/interaction-lock-region.tsx # src/features/editor/components/preview-area.tsx # src/features/export/utils/canvas-item-renderer.ts # src/features/export/utils/client-render-engine.ts # src/features/preview/components/mask-editor-overlay.test.tsx # src/features/preview/components/mask-editor-overlay.tsx # src/features/preview/components/video-preview.sync.test.tsx # src/features/preview/components/video-preview.tsx # src/features/timeline/components/keyframe-graph-panel.tsx # src/features/timeline/components/timeline.tsx
💡 Codex Reviewfreecut/src/features/media-library/transcription/lib/bridge.ts Lines 73 to 75 in ed731bc This branch unconditionally commits to the WebCodecs worker path whenever ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
Summary
Test plan
Summary by CodeRabbit
Release Notes
New Features
Bug Fixes