Commit Graph
778 Commits
Author SHA1 Message Date
Mahdy Arief c162346ceb feat(blur): implement video blur annotation support 2026-04-11 07:39:35 +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
webadderall 88debe9ad3 chore: remove release notes from repo 2026-04-10 20:51:22 +10:00
webadderall ca76f738f5 Merge pull request #209 from lout33/fix/export-stream-offset-timeline
fix(export): preserve stream-start offsets during decode
2026-04-10 12:50:30 +10: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 904b3f749f Merge branch 'pr-207' 2026-04-09 23:31:08 +10: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
Mohamed 779172c379 fix(hud): resolve overlay snap to primary on multi-monitor
- Add getHudOverlayDisplay() helper using getDisplayMatching()
  to detect which display the HUD is currently on
- Replace getPrimaryDisplay() in getHudOverlayBounds(),
  set-hud-overlay-compact-width, set-hud-overlay-measured-height
  handlers, and createHudOverlayWindow() maxHeight constraint
- Falls back to primary display when HUD window doesn't exist

Tested on Windows 11 with dual-monitor setup. HUD stays on
the external monitor through recording start/stop and
expand/collapse cycles.
2026-04-09 14:00:50 +02: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 ee0c3a67f3 fix(windows): use per-display scale factor for window cursor position
When recording a window on a secondary monitor with a different DPI,
getNormalizedCursorPoint() used the primary display's scale factor for
both cursor and window-bounds conversion. This produced incorrect
normalised coordinates. Now resolves the display that contains the
target window and uses that display's scale factor instead.

Fixes #204
2026-04-09 21:23:48 +10:00
webadderall 4467b144a0 fix(macos): lower deployment target to macOS 13.0 for native helpers
The Swift helper binaries were compiled with -target macos14.0, causing
dyld symbol-not-found crashes on macOS 13. The ScreenCaptureKit audio
APIs require macOS 13.0 minimum, so the deployment target is lowered to
13.0 and an #available guard is added for the macOS 14-only
ignoreShadowsSingleWindow API. README updated accordingly.

Fixes #199, fixes #200
2026-04-09 21:23:33 +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 022c2d372f fix: anchor winget installers-regex to exclude .blockmap files 2026-04-09 17:31:01 +10:00
webadderall ddeca02a62 ci: add workflow_dispatch to winget releaser 2026-04-09 17:12:18 +10:00
webadderall 6b6e50e900 fix: pass release-tag to winget-releaser for workflow_run trigger 2026-04-09 17:07:44 +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 24234fabaf fix: winget workflow triggers after release build completes
Changed from release:released (races with build) to workflow_run
that waits for the Publish Release workflow to succeed first.
v1.1.20
2026-04-09 16:52:55 +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
webadderall 4d721ac92c Add Tobias and Roberto Marcelino to supporters list 2026-04-09 16:11:06 +10:00
webadderall fffb47c1a4 fix: harden cursor-monitor spawn against ENOENT on Windows
Use F_OK instead of X_OK for Windows fs.access check (X_OK is meaningless
on Windows). Wrap spawn() in try/catch to prevent uncaught exception if the
binary is missing or blocked by antivirus.
2026-04-09 16:07:57 +10:00
webadderall 26186b6fb2 fix: cursor DPI normalization for Windows/Linux scaled displays
On non-macOS platforms, platform APIs (iohook, GetWindowRect, xwininfo)
return physical pixel coordinates while Electron returns DIP coordinates.
Apply scaleFactor correction so cursor normalization uses a consistent
coordinate space. Fixes ~30-40px cursor offset on Windows 11 and Linux
Mint when display scaling is >100%.

Also fixes winget-releaser workflow (use v2 tag instead of invalid @latest).
2026-04-09 15:58:17 +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 55dc9619c6 chore: bump version to 1.1.19 v1.1.19 2026-04-09 01:04:55 +10: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
webadderall 5c4f96e584 feat(zoom): add cursor follow camera with edge snap focus
Cursor follow camera tracks cursor position for auto zoom regions
with edge snapping and zoom-out freeze. Edge snap focus remaps cursor
to clamp near screen boundaries.
2026-04-08 21:43:03 +10:00
webadderall 30ff7918f9 feat(zoom): inline damped harmonic oscillator spring solver
Replace motion library spring() with custom solver supporting
configurable smoothness. Add getZoomSpringConfig and getCursorSpringConfig.
2026-04-08 21:42:54 +10:00
webadderall 73372dbfa4 feat(zoom): add auto/manual zoom mode type and default auto zoom depth 2026-04-08 21:42:44 +10:00
webadderall 8316e8d2a4 fix(i18n): add Korean label to locale switchers
Add ko: '한국어' to LOCALE_LABELS in LaunchWindow and VideoEditor so the language switcher shows the native name instead of falling back to the raw code.
2026-04-08 19:46:43 +10:00
webadderall bcb14df592 Merge pull request #175 from rofeels/feat/i18n-ko
feat(i18n): add Korean (ko) locale
2026-04-08 19:31:01 +10:00
webadderall 88d81d93b9 Merge pull request #192 from MohamedV0/fix/windows-path-resolution
fix(windows): use path.posix for URL path resolution
2026-04-08 15:07:43 +10:00
webadderall 0bb8c417f4 Merge pull request #191 from octo-patch/feat/issue-177-winget-releaser
feat: add winget-releaser workflow for automatic WinGet releases
2026-04-07 23:42:40 +10:00
Mohamed 9619f7ed9f fix(windows): use path.posix for URL path resolution
- replace path.normalize() with path.posix.normalize() in
  resolveRequestedFilePath to preserve forward slashes on Windows
- add empty-string guard for degenerate pathnames
- remove win32 bypass in loadPackagedEditorWindow

path.normalize() converts / to \ on Windows, causing path.resolve
to escape to the drive root and return 403 Forbidden.
2026-04-07 06:18:45 +02:00
Octopus 47bcc31d53 feat: add winget-releaser workflow for automatic WinGet releases (fixes #177) 2026-04-06 21:38:38 +08:00
webadderall aa912a8f3b Hotfix 1.1.18 v1.1.18 2026-04-06 22:39:31 +10:00
webadderall f56f39ddb3 Hotfix 1.1.17 v1.1.17 2026-04-06 18:10:29 +10:00