All releases
0.0.1-beta2026-06-18

v0.0.1-beta: DaVinci-grade colour tools, Inspector refactor, freehand polish

First public beta. The Advanced colour card is now at parity with DaVinci Resolve + Kdenlive (Lift/Gamma/Gain/Offset wheels, Temperature/Tint, HSL Qualifier, Vignette, HSL Curves, live Scopes, .cube LUTs). The Inspector has been split into per-type primary tabs (Element / Text / Video / Image / Audio) and a new Image track type lets images sit on their own overlay lane. Freehand and Vector draw tools get a brushed-metal polish: live opacity, undo, Alight Motion-style 'Close path' / 'Delete last anchor' / Drawing Progress. 1,000+ asset library entries ship with the editor.

Features:

  • Advanced colour card (left rail → Adjust → Advanced) with eight facets, matched against the DaVinci Resolve + Kdenlive colour pipelines: Wheels (Lift / Gamma / Gain / Offset + 11 primary bars + Temperature / Tint / Y-only master), HSL (master + 8 per-band sliders), Qualifier (HSL channel toggles + Range / Softness + triple-handle Luma range bar), Vignette (Offset / Softness / Roundness + per-zone amount with live SVG shape preview), HSL Curves (seven HSL qualifier pairs: Hue vs Sat, Hue vs Lum, Hue vs Hue, Sat vs Sat, Sat vs Lum, Lum vs Sat, Lum vs Hue), Curves (Master / R / G / B tone curves), Scopes (live Waveform / Vectorscope with 75 % colour-bar targets / RGB Parade sampled at ~12 fps from the live preview canvas, with Freeze for A/B), and LUT (.cube import + intensity). All values are keyframable and write to the same davinci-adjust, hsl, curves, hsl-curve, or lut effect on the selected element.
  • Inspector primary tab bar now scopes each tab's secondary ids to a specific element type. The shared transform / effects / animations / masks ids no longer light up both the Video and Image primaries at once — when an image is selected only the Image primary stays highlighted, the Video primary is locked (with a tooltip explaining why). Element / Text / Audio primaries keep their single-id scopes. A new Image track type lets images sit on their own overlay lane instead of crowding the main video track, plus an 'Add image track' option in the timeline toolbar.
  • Mini audio-visualizer button in the preview toolbar now always animates. When audio is playing the bars drive off the live analyser data (same rAF tick as the large panel). When idle the bars pulse via a CSS keyframe (each bar offset by 0.18 s so they read as a left-to-right wave) so the button is visibly 'live' even before you press play. Container is 20 px tall with a 3 px min-height so the bars are always at least visible.
  • Freehand draw and Vector draw tools ship a full Opacity slider (0–100 % + 25/50/75/100 % presets), Undo button in the panel header, Alight Motion-style 'Close path' / 'Delete last anchor' actions, and a 'Drawing Progress' section (start / end percentages, keyframable for classic draw-on animation). Undo button mirrors Cmd/Ctrl+Z and is safe to spam — empty history is a no-op.
  • 1,000+ curated library entries ship with the editor: 165 effects across 13 categories, 162 transitions across 5 categories, 161 overlays across 5 categories, 150 motion presets, 320 templates, 180 stickers, 44 text presets + 77 text-animation presets, 75+ shape primitives, 1,000+ Google Fonts, and 28 marker sets. Procedural preview sources (gradient, checkerboard, SMPTE color bars, radial, diagonal stripes, portrait silhouette, noise field) are picked per-asset via a deterministic hash so blur/pixelate previews against checkerboards, color grading against color bars, vignette/glow against a radial burst, and grain/noise against a noise field.

Improvements:

  • Inspector primary tab bar fills the full row edge-to-edge (no left/right padding), shares the width equally between tabs, and locks the wrong-type tab (e.g. Video locks when an image is selected, Image locks when a video is selected) with a 'not available for the selected element' tooltip. The long tab names ('Speed Ramp', 'Adjust', 'Speed Ramp') no longer truncate.
  • AdjustmentsView (left rail card) was polished: replaced the chip row with a two-tab strip ('Adjustments' preset grid vs 'Advanced' colour card) so the colour tools live next to the preset browser instead of fighting the right inspector for the same role. Sub-tab pill row scrolls with a mask gradient on overflow, scrollbar hidden, active state uses white text on dark instead of the legacy cyan accent.
  • Text tab 'Content' textarea now auto-grows with the content. A long paste is auto-sized to fit (capped at 280 px so a giant paste doesn't push the rest of the inspector offscreen) and scrolls internally past that point. resize-none is removed so the user can no longer accidentally drag a tiny corner handle and lose content.
  • Inspector Element tab wraps long element names (the <p> showing the display name) with break-words so a 200-character text element doesn't overflow the panel's right edge. Same fix for the long ID / Group SummaryRow values — they wrap to multiple lines instead of being silently truncated.
  • Preview canvas register their DOM ref + current size with a global preview-canvas-scope handle, so the new Scopes sub-tab in the Advanced card can read live pixels from the rendered preview (downsampled to 96×64 for cheap getImageData calls at ~12 fps). The handle tears down on unmount so scopes show the empty silhouette when the preview isn't mounted (e.g. in a fullscreen pop-out).
  • AdjustmentsView and Effects/Transitions/Overlays/Plugins cards share a polished chrome — same PopOut button, same PanelView title bar, same empty-state copy ('Select a video or image…' / 'Multiple layers selected…' / 'Pick a video or image…'). Color grading presets (Grayscale, Sepia, Vintage, HSL, Duotone, Cyberpunk, Noir, Amber Grade, etc.) are exclusive to the Adjustments panel under the 'Color' category.

Fixes:

  • Inspector primary tab bar no longer collapses to a single tab when you're inside a focus category (Effect / Animation / Adjust*). The top bar stays full so Video / Audio / Text / Element stay reachable. The secondary row (transform / audio / speed chips) also stays visible — both rows are now always shown, so the user never loses access to 'Transform' or 'Opacity' just because they were tweaking an effect.
  • Long preset names no longer truncate — every asset card uses MarqueeText for its label, so a 60-character effect name scrolls in place instead of cutting off with an ellipsis. Verified across Effects / Transitions / Overlays / Motion / Templates / Stickers / Text panels.
  • Audio Effects → Noise Reduction Strength field is now wired to state (was hardcoded 50 with no-op onChange/onFocus/onBlur/onScrub handlers). Scrubbing the slider, typing a number, and pressing the reset button all update the actual noise reduction state and the engine that consumes it.
  • Freehand strokes no longer snap to the canvas center on release — the path lands exactly where the user drew it. Centring the simplified path inside the 512×512 source space before committing fixes the visual jump without changing the final position.
  • Text element Text tab no longer shows the generic Element tab. Text now goes straight to the Text tab (Content / Style / Animate / Typography / Spacing / Background / Effects) with the customizer the user wanted, no mixed metadata.
  • Inspector Audio Fade In/Out fields now stack on panels narrower than 420 px so the second field no longer clips the digit. Volume and pan sliders update the live audio mix immediately — no more silent gaps or playback restarts when scrubbing the dB/pan controls.
Technical details:
  • AI providers storage lives in localStorage and persists across sessions. POST /api/ai/test sends a 1-token probe and returns actionable errors: 401 → 'Check the API key', 404 → 'Check the base URL and model name', 429 → 'try again shortly', network drop → 'Could not reach the server'.
  • AudioVisualizer's rAF loop now allocates a single Uint8Array(frequencyBinCount) once on mount and reuses it across frames — analyser.frequencyBinCount is stable for the lifetime of the AudioContext. Removes ~60 allocations/second of GC pressure.
  • EditorFooter's per-second 'Worked on HH:MM:SS' counter now updates via direct DOM mutation (ref + setInterval) instead of setState — the surrounding fps/aspect/canvas-size chrome no longer reconciles once a second just because the clock text changed. Pop-out window close-polling dropped from requestAnimationFrame to setInterval + pagehide listener on the opener. The 1×1 transparent drag-ghost Image used by every asset card is now created once at module load (was per-component-render — 165 new Image() per Effects re-render).