Commit Graph
443 Commits
Author SHA1 Message Date
webadderall a84b83f91b feat: ui overhaul — Phosphor icons, redesigned launcher, editor layout, and component refresh
- Replace all lucide-react imports with @phosphor-icons/react across every
  component (LaunchWindow, AnnotationSettingsPanel, ExtensionManager,
  ExtensionIcon, VideoPlayback, AnnotationOverlay, CropControl, TutorialHelp,
  PlaybackControls, all shadcn ui/ primitives, etc.)
- ExtensionIcon: new Phosphor-based resolver with Lucide name alias map for
  backwards-compatible extension manifests
- LaunchWindow / SourceSelector: full redesign — new icon rail layout,
  updated backgrounds, improved source selection UX, audio/video controls,
  countdown overlay
- VideoPlayback: overhaul playback controls and preview panel layout
- Timeline items: border-radius 16px→8px, cyan→blue unification, pill height
  85% for breathing room, resize handle vertical centering
- shadcn ui/: refresh accordion, dialog, dropdown, select, slider, switch,
  tabs, toggle, popover, button, card, input, label, sonner, content-clamp,
  audio-level-meter
- App.tsx / index.css / App.css / tailwind.config: global style updates
- types.ts, captionLayout.ts, captionStyle.ts, webcamOverlay.ts: data model
  updates to support new timeline and export features
- package.json: add @phosphor-icons/react, bump dependencies
- scripts/, .eslintrc, biome, tsconfig, vite.config: tooling alignment
- extension-sources: update built-in extension bundles
2026-04-16 18:01:04 +10:00
webadderall abda1e05e1 fix: hotfix export regressions 2026-04-15 17:19:49 +10:00
Wing900 63f8ff27ae Fix silent MP4 exports with FFmpeg audio fallback 2026-04-12 20:55:34 +08:00
webadderall a3eb3c1ddc chore: bump version to 1.1.21 2026-04-12 18:08:30 +10:00
webadderall 8396b89d60 feat(editor): full-width timeline, extension i18n, lifecycle fixes
- Move timeline below preview+settings so it spans full editor width
- Remove react-resizable-panels vertical split
- Add scoped i18n for ExtensionManager (en/zh/ko/ja/es)
- Fix stale extension activation cleanup and deactivation on uninstall
- Cache-bust extension module URLs on reinstall
- Move bundled cursor packs to extension-sources/ for marketplace upload
- Track marketplace download counts (fire-and-forget POST)
2026-04-12 16:59:07 +10:00
webadderall 20f42d3fca fix(audio): add browser microphone fallback for macOS < 14
On macOS versions before Sonoma (14.0), SCStreamConfiguration does not
support the captureMicrophone/microphoneCaptureDeviceID selectors. The
native helper was throwing a fatal error, blocking recording entirely
when microphone was enabled.

Now the Swift helper logs MICROPHONE_CAPTURE_UNAVAILABLE and continues
capture without microphone. The Node handler detects this signal and
returns microphoneFallbackRequired to the renderer, which starts a
browser-side MediaRecorder capturing the mic via getUserMedia. On stop,
the audio blob is saved as a .mic.webm sidecar alongside the native
recording, where the existing companion audio detection picks it up.

Fixes: 'Native microphone capture is unavailable on this macOS/Xcode
runtime' error on older macOS versions.
2026-04-12 16:59:06 +10:00
Long 070c44983f Merge main into feature branch and resolve LaunchWindow conflict.
Keep the floating webcam preview container and pointer-drag behavior while integrating latest main changes.

Made-with: Cursor
2026-04-12 00:57:52 +07:00
webadderall 3a11981bc2 feat(extensions): marketplace integration, wallpaper thumbnails, cursor packs, and bug fixes
- Extension marketplace UI with browsing, installing, screenshot gallery
- Wallpaper & cursor style registration API for extensions
- Wallpaper thumbnail system (nativeImage resize + disk cache, OOM-safe)
- Fix HUD crash: check configurable before redefining electronAPI
- Fix zip-slip false positive on macOS (fs.realpath for symlinks)
- Extension icon sizing and description truncation improvements
- Eager extension activation in SettingsPanel
2026-04-12 01:38:36 +10:00
webadderall c84ab6d931 feat(editor): wire extension lifecycle and update docs
- Connect extension activation/deactivation in VideoEditor
- Update CONTRIBUTING.md and README.md with extension development info
2026-04-12 01:38:36 +10:00
webadderall 5bef938dc1 feat(export): add extension render hooks to export pipeline
- Integrate extension render hooks into frameRenderer and modernFrameRenderer
- Add modernFrameRenderer for compositing extensions during export
- Wire extension audio processing in audioEncoder
- Support extension hooks in gif and video export paths
2026-04-12 01:38:36 +10:00
webadderall cf09dc9111 fix(playback): improve cursor rendering and layout calculations
- Refine cursor telemetry loop with extension coordinate support
- Improve DPI-aware cursor rendering pipeline
- Extend layout utilities for extension-driven scene transforms
2026-04-12 01:37:28 +10:00
webadderall 072ca8a014 refactor(timeline): extract zoom suggestion logic into standalone utility
- Move zoom suggestion computation out of TimelineEditor into zoomSuggestionUtils
- Simplify TimelineEditor by delegating zoom calculations
2026-04-12 01:37:28 +10:00
webadderall 6af018ec01 feat(extensions): integrate extension hooks into editor playback and settings
- Wire render hooks and cursor effects into VideoPlayback canvas pipeline
- Add extension settings panels to SettingsPanel
- Persist extension-related editor preferences and project state
2026-04-12 01:37:28 +10:00
webadderall 18d5a091f8 feat: extension system with marketplace, permissions, and security hardening
- Extension loader with manifest validation, ID sanitization, and path traversal protection
- Permission-gated runtime API (render, cursor, audio, timeline, ui, assets, export)
- Extension host with lifecycle management (activate/deactivate)
- Marketplace client for browsing, downloading, and installing extensions
- Extension Manager UI panel with enable/disable/uninstall
- IPC bridge for extension discovery, management, and marketplace operations
- Proxy guard on window.electronAPI to block extension access to privileged IPC
- Zip-slip protection via post-extraction directory traversal validation
- Safe PowerShell invocation for Windows zip extraction (no string interpolation)
- File URL resolution with path escape prevention
2026-04-12 01:37:28 +10:00
webadderall 7e1cef7493 fix(export): render blur annotations in modern pipeline 2026-04-11 21:40:37 +10:00
Mahdy Arief 309156e25f feat(editor): enhance blur annotations with custom intensity, censorship color, and rounded corners 2026-04-11 08:06:45 +07:00
Mahdy Arief b5d74e9061 fix(annotations): robust blurIntensity normalization and initialization 2026-04-11 07:44:01 +07:00
Mahdy Arief 97b7b2e83d fix(annotations): preserve blur type and intensity on reload 2026-04-11 07:39:36 +07:00
Mahdy Arief d8e4eb919a fix(video-editor): wrap blur case in block for lexical scope 2026-04-11 07:39:35 +07:00
Mahdy Arief 205cae8d96 feat(editor): standardize blur strength, localize help text, and optimize export performance 2026-04-11 07:39:35 +07:00
Mahdy Arief c162346ceb feat(blur): implement video blur annotation support 2026-04-11 07:39:35 +07:00
Long 9b8a341a26 fix HUD bar drag uses document events instead of pointer capture. 2026-04-11 02:05:35 +07:00
Long 8f919a7ad2 fix Outside-click handler attached to full-viewport wrapper. 2026-04-11 01:56:52 +07:00
Long a000c6921e reformat 2026-04-11 01:26:50 +07:00
Long 77de9ed67c fix an issue where the webcam preview following the hud movement 2026-04-11 01:01:41 +07:00
webadderall 29c8df8353 fix: preserve clip duration during drag & scope collision detection per row
- Add rowId to allRegionSpans so collision detection only considers
  siblings on the same timeline row
- Split clampToNeighbours into clampResizedSpanToNeighbours and
  clampDraggedSpanToNeighbours for resize vs drag semantics
- Preserve original clip duration on drag (pure translation) to prevent
  pixel-to-ms rounding drift at different zoom levels
2026-04-10 22:18:13 +10:00
webadderall a68772ad2a test: update spring convergence threshold for higher-accuracy velocity
The analytical velocity fix makes the spring settle more precisely,
slightly increasing frame count to convergence. Relax threshold
from 120 to 400 frames.
2026-04-10 20:51:22 +10:00
webadderall 2689391d31 fix: eliminate zoom spring overshoot wobble
Use analytical velocity (closed-form derivative) instead of frame-to-frame
finite differences for spring state propagation. Add overshoot clamp for
overdamped springs (ζ ≥ 1) to prevent counter-oscillation when the zoom
easing target reverses direction mid-animation.
2026-04-10 20:51:22 +10:00
Long 828d16b804 update PR 2026-04-10 02:41:22 +07:00
Lout 0e94582685 fix(export): preserve stream-start offsets during decode
Align decoded frame timestamps with the media timeline so trimmed exports do not end early on recordings whose video stream starts after the container timeline.
2026-04-09 12:19:55 -05:00
webadderall a114f5b05f fix(whisper): reset download state on model deletion failure
When deleting the Whisper model failed, the frontend kept stale state
(whisperModelDownloadStatus stayed as 'downloaded'), which blocked
re-downloading because the download handler saw the model as already
present. On the backend, no progress event was sent on failure, leaving
the renderer out of sync.

Frontend: reset whisperModelDownloadStatus and progress to idle on
delete failure so re-download is unblocked.
Backend: verify whether the file was actually removed despite the error
and send appropriate progress events in either case.

Closes #152
2026-04-09 23:27:14 +10:00
webadderall 8a82849a29 fix(timeline): prevent clip regions from overlapping during drag/resize
The hasOverlap function in TimelineEditor checked zoom, trim, speed, and
audio regions for overlap but was missing clip regions entirely. This
caused clips to freely overlap each other when dragged or resized,
leading to playback bugs when trimmed clips intersected.

Add clip region overlap detection so the existing clampToNeighbours
logic in TimelineWrapper correctly constrains clip boundaries.

Closes #166
2026-04-09 23:25:00 +10:00
webadderall 6ed30ff244 fix(settings): restore user preferences after loading project on startup
When loading a saved project on startup, applyLoadedProject() overwrites
all editor state — including user preference settings like padding,
aspect ratio, and export format — with potentially stale project values.
The subsequent save effect then writes those stale values back to
localStorage, effectively erasing the user's latest preferences.

Now re-applies preference-level settings from localStorage after project
load so that per-user settings (padding, border radius, aspect ratio,
export format/quality/encoding, gif settings) survive across sessions.

Fixes #197
2026-04-09 21:24:19 +10:00
webadderall bafd6fa657 feat: show real-time audio rendering progress during export finalization
Instead of freezing at 'Finalizing 99%' while audio renders in real-time,
the export UI now shows 'Rendering audio XX%' with a live progress bar and
an explanatory note about why real-time playback is required.

Progress is reported every 250ms from the RAF tick loop in AudioProcessor
and piped through VideoExporter to the UI via the existing onProgress callback.
2026-04-09 18:25:25 +10:00
webadderall ed8b83d08a Merge pull request #198 from gillesserrien/feat/i18n-nl
feat(i18n): add Dutch (nl) locale
2026-04-09 17:01:52 +10:00
webadderall 0101d8cf49 fix: export animation desync — use content time for zoom spring delta
The zoom spring animation in both frameRenderer and modernFrameRenderer
was using performance.now() (wall-clock time) to compute spring deltas.
During export, wall-clock time and content time are decoupled — a frame
representing 33ms of video may render in 3ms or 500ms. This caused zoom
animations to appear choppy/laggy in exports while previews were smooth.

Switched to content-time deltas (timeMs) so the spring advances at the
same rate as the video regardless of actual render speed.

Also bumps version to 1.1.20.
2026-04-09 16:51:21 +10:00
Gilles Serrien 6d2435622d fix(i18n): phrasing 2026-04-08 23:56:40 +02:00
Gilles Serrien b9df10ad99 fix(i18n): remove extra keys from nl locale 2026-04-08 20:56:51 +02:00
Gilles Serrien b6468dbb8b feat(i18n): add Dutch (nl) locale 2026-04-08 20:51:10 +02:00
webadderall ea330bf9d1 feat: classic zoom toggle, clip speed support, restore zoom durations
- Add Classic Animation toggle (disables cursor follow + spring smoothing)
- Remap zoomSmoothness slider from 0-2 to 0-1 range, default 0.5
- Fix clip speed: merge clip speeds into effectiveSpeedRegions
- Restore zoom duration constants to original values
  (ZOOM_IN_TRANSITION_WINDOW_MS: 700ms -> 1522ms, TRANSITION_WINDOW_MS: 1000 -> 1015.05)
- Pass missing zoomSmoothness to VideoPlayback and GIF exporter
- Persist zoomSmoothness and zoomClassicMode in project files
2026-04-09 00:55:27 +10:00
webadderall 023d5212a9 fix: cursor desync in exports — remove erroneous startup offset from cursor timestamp 2026-04-08 23:39:35 +10:00
webadderall 13ea2f01cf test(zoom): add 50 zoom animation unit tests
Cover spring solver, cursor follow camera, edge snap focus,
zoom region utilities, and motion smoothing edge cases.
2026-04-08 22:19:27 +10:00
webadderall d8f2e1fe43 feat(zoom): merge nearby auto zoom suggestions within 1.5s
Suggested zoom regions with gaps <= 1500ms are merged into single
contiguous spans before being added to the timeline.
2026-04-08 22:00:28 +10:00
webadderall b48c2901b8 fix(export): audio encoder reliability and gif exporter compat 2026-04-08 22:00:23 +10:00
webadderall e4902c5abb feat(zoom): add mode switcher and smoothness slider to zoom UI
Add auto/manual pill-button mode switcher in zoom region detail.
Move Zoom Smoothness slider from cursor section to zoom section.
2026-04-08 22:00:16 +10:00
webadderall 811d25b66e fix(zoom): hide focus overlay for auto zoom regions
Auto zoom regions use cursor follow, so the blue draggable focus
boundary is hidden and pointer events disabled.
2026-04-08 22:00:07 +10:00
webadderall bb9a5c8788 feat(zoom): tag zoom regions as auto or manual in VideoEditor
handleZoomSuggested creates regions with mode: 'auto',
handleZoomAdded creates regions with mode: 'manual'.
Wire zoomSmoothness state and mode change handler.
2026-04-08 22:00:00 +10:00
webadderall ea1bc87cf0 feat(zoom): add spring animation and cursor follow to export pipeline
Both legacy (FrameRenderer) and modern (ModernFrameRenderer) exporters
now use inlined spring solver and cursor follow camera for auto zooms.
Wire zoomSmoothness config through both exporter paths.
2026-04-08 21:43:27 +10:00
webadderall c372bd19d5 feat(zoom): integrate spring animation and cursor follow in preview
Add spring state for scale/x/y, cursor follow camera state.
Auto zoom regions use cursor-follow focus with edge snapping.
2026-04-08 21:43:18 +10:00
webadderall 8011f38982 feat(zoom): tune zoom timing constants
ZOOM_IN_TRANSITION_WINDOW_MS reduced to 0.7x for 800ms delay.
CHAINED_ZOOM_PAN_GAP_MS = 1350, CONNECTED_ZOOM_PAN_DURATION_MS = 1000.
ZOOM_OUT_EARLY_START_MS = 150.
2026-04-08 21:43:10 +10:00