Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1607 commits
Select commit Hold shift + click to select a range
1e35031
Merge pull request #560 from webadderallorg/fix/native-audio-safety-g…
meiiie May 22, 2026
9363ea2
fix(recording): abort prune on unreadable project
meiiie May 22, 2026
7353ba9
Merge pull request #561 from webadderallorg/fix/prune-unreadable-proj…
meiiie May 22, 2026
c85dc8b
feat(export): add nvidia opt-in detection
meiiie May 22, 2026
7e5121c
fix(export): handle nvidia capability probe errors
meiiie May 22, 2026
6e466a3
Merge pull request #562 from webadderallorg/feature/nvidia-export-opt-in
meiiie May 22, 2026
db0757c
refactor(editor): extract nvidia export opt-in hook
meiiie May 22, 2026
b7449d5
Merge pull request #563 from webadderallorg/refactor/editor-nvidia-ex…
meiiie May 22, 2026
87cd251
refactor(editor): extract mp4 export routing
meiiie May 22, 2026
1db58dc
Merge pull request #564 from webadderallorg/refactor/editor-mp4-expor…
meiiie May 22, 2026
9f05f58
refactor(editor): extract mp4 export settings
meiiie May 22, 2026
6cc0712
Merge pull request #565 from webadderallorg/refactor/editor-mp4-expor…
meiiie May 22, 2026
ac24952
refactor(editor): extract export status model
meiiie May 22, 2026
3ad40f7
fix(editor): sanitize export finalizing progress
meiiie May 22, 2026
9c29d4c
Merge pull request #566 from webadderallorg/refactor/editor-export-st…
meiiie May 22, 2026
bf16f05
refactor(editor): extract export start settings
meiiie May 22, 2026
18e93f7
Merge pull request #567 from webadderallorg/refactor/editor-export-st…
meiiie May 22, 2026
f778010
refactor(editor): extract export progress state
meiiie May 22, 2026
48b48dc
Merge pull request #568 from webadderallorg/refactor/editor-export-pr…
meiiie May 22, 2026
e81a242
chore(cursor): default to tahoe cursor style
codex May 24, 2026
78594eb
chore(release): bump version to 1.3.0
codex May 24, 2026
7ba7f70
fix(export): keep Windows auto off static layout first
meiiie May 24, 2026
2f010da
fix(export): align native static route gates
meiiie May 24, 2026
c51cc50
Merge pull request #582 from webadderallorg/fix/v130-lightning-auto-r…
meiiie May 24, 2026
7c863e5
fix(recording): preserve browser cursor after WGC fallback
meiiie May 24, 2026
ebac9ba
fix(recording): warn when cursor hiding fails
meiiie May 24, 2026
9f1c697
Merge pull request #583 from webadderallorg/fix/windows-wgc-browser-f…
meiiie May 24, 2026
513e79a
fix(recording): compact HUD fallback on non-passthrough Windows
meiiie May 24, 2026
ca05922
fix(recording): preserve compact HUD drag position
meiiie May 24, 2026
fbc6ec9
fix(editor): guard timeline speed overlap
meiiie May 24, 2026
b52bded
test(editor): cover clip speed edge cases
meiiie May 24, 2026
33fc855
Merge pull request #585 from webadderallorg/fix/timeline-speed-layout
meiiie May 24, 2026
d47550b
Merge pull request #584 from webadderallorg/fix/windows-recorder-hud-…
meiiie May 24, 2026
9b3270b
fix(editor): refresh companion audio preview
meiiie May 24, 2026
fe47b07
fix(editor): route companion audio resume paths
meiiie May 24, 2026
ac2b393
Merge pull request #586 from webadderallorg/fix/editor-refresh-compan…
meiiie May 24, 2026
54a96f3
Update config.ts
Eleria83 May 24, 2026
af57231
language files translated en -> de
Eleria83 May 24, 2026
c14221a
fixed some translation mistakes
Eleria83 May 24, 2026
5d3da14
fix: stabilize Windows recording preview
meiiie May 24, 2026
df95723
fix: clear source history on recording load
meiiie May 24, 2026
18626e7
Merge pull request #588 from webadderallorg/fix/video-resolution-qual…
meiiie May 24, 2026
18b2ae3
fix: reset cursor state on recording load
meiiie May 24, 2026
f9b82a9
Merge pull request #589 from webadderallorg/fix/reset-cursor-state-on…
meiiie May 24, 2026
409feb6
chore(release): bump version to 1.3.1
meiiie May 25, 2026
8d27eff
Merge pull request #592 from webadderallorg/chore/release-v1.3.1
meiiie May 25, 2026
3ef8a62
refresh readme
webadderall May 26, 2026
c1a3f07
Update acknowledgements in README.md
webadderall May 26, 2026
73bd4f1
Correct wording in acknowledgements section
webadderall May 26, 2026
31d1022
fix(capture): stabilize platform source handling
meiiie May 26, 2026
7673f12
Merge pull request #596 from webadderallorg/fix/platform-capture-stab…
meiiie May 26, 2026
035d4a6
fix(timeline): make horizontal scroll easier
meiiie May 26, 2026
24e6779
Merge pull request #597 from webadderallorg/fix/timeline-horizontal-s…
meiiie May 26, 2026
c6ab201
feat(captions): export subtitles as separate SRT/VTT file alongside v…
mvanhorn May 27, 2026
69fb2a8
docs: add JSDoc to subtitle export functions
mvanhorn May 27, 2026
fe82843
fix(recording): stabilize capture quality and CUDA export canvas
meiiie May 27, 2026
0235b4f
fix(export): address CUDA dimension review notes
meiiie May 27, 2026
747d65d
Merge pull request #601 from webadderallorg/fix/recording-audio-video…
meiiie May 27, 2026
b83911c
fix(timeline): smooth clip trim resize
meiiie May 28, 2026
338d658
Merge pull request #604 from webadderallorg/fix/timeline-trim-lag
meiiie May 28, 2026
32bb6e4
fix(linux): guard cursor overlay when portal embeds cursor
meiiie May 28, 2026
107139b
fix(linux): clear cursor overlay availability state
meiiie May 28, 2026
920b54f
Merge pull request #605 from webadderallorg/fix/linux-cursor-control-…
meiiie May 28, 2026
b00b20f
chore(release): prepare v1.3.2
meiiie May 28, 2026
4cd02b5
Merge pull request #606 from webadderallorg/release/v1.3.2
meiiie May 28, 2026
d2caa3e
Add click effects and zoom/export fixes
webadderall May 28, 2026
96c813f
Merge main into feature/click-effects-auto-zoom-fps-fixes
webadderall May 28, 2026
46810c5
fix(recording): preserve webcam preview HUD bounds
meiiie May 28, 2026
e2802bf
fix(linux): expand HUD fallback for menus
meiiie May 28, 2026
067070d
fix(linux): route X11 capture through real sources
meiiie May 28, 2026
970c473
fix(presets): preserve crop region
meiiie May 28, 2026
532d194
fix(linux): tighten portal source fallback routing
meiiie May 28, 2026
9add65b
Merge pull request #613 from webadderallorg/fix/linux-portal-screen-f…
meiiie May 28, 2026
7f7d51c
Merge pull request #614 from webadderallorg/fix/presets-crop-region
meiiie May 28, 2026
b4008f5
Merge pull request #611 from webadderallorg/fix/webcam-hud-preview-bo…
meiiie May 28, 2026
21f6d79
Merge remote-tracking branch 'origin/main' into fix/linux-hud-menu-bo…
meiiie May 28, 2026
f5e9603
Merge pull request #612 from webadderallorg/fix/linux-hud-menu-bounds
meiiie May 28, 2026
0a0c938
fix(timeline): keep clips visible during analysis
meiiie May 28, 2026
4a1e50e
Merge pull request #615 from webadderallorg/fix/fresh-recording-auto-…
meiiie May 28, 2026
0a55193
fix(hud): restore clickability after webcam preview
meiiie May 28, 2026
2464364
fix(timeline): smooth clip drag reordering
meiiie May 28, 2026
5d76193
fix(timeline): hide invalid drag previews
meiiie May 28, 2026
0259493
Merge pull request #616 from webadderallorg/fix/hud-timeline-patch-1.3.3
meiiie May 28, 2026
98a63ad
chore(release): prepare v1.3.3
meiiie May 28, 2026
966b63e
Merge pull request #617 from webadderallorg/release/v1.3.3
meiiie May 28, 2026
62b03bd
Polish click effects and preview rendering
webadderall May 29, 2026
1940b1b
Remove preview fullscreen control
webadderall May 29, 2026
f76912f
Fix export click effects and preview radius parity
webadderall May 29, 2026
b9571d5
Refine spotlight click effect preview
webadderall May 29, 2026
2a45aad
test: restore main baseline verification
meiiie May 29, 2026
b46ce42
Merge pull request #624 from webadderallorg/fix/main-baseline-test-drift
meiiie May 29, 2026
c0627d0
fix(linux): stabilize portal selection HUD
meiiie May 29, 2026
be8c97d
Merge pull request #626 from webadderallorg/fix/linux-selection-windo…
meiiie May 29, 2026
80a513b
fix: preserve mac audio sidecar tracks
meiiie May 29, 2026
0679477
Merge pull request #625 from webadderallorg/fix/mac-audio-sidecar-con…
meiiie May 29, 2026
6042e1b
Merge feature/click-effects-auto-zoom-fps-fixes into main
webadderall May 30, 2026
78ea9b5
Revert "Merge feature/click-effects-auto-zoom-fps-fixes into main"
webadderall May 30, 2026
faa9c07
Add click effects and zoom/export fixes
webadderall May 28, 2026
48daa4c
Polish click effects and preview rendering
webadderall May 29, 2026
7994406
Remove preview fullscreen control
webadderall May 29, 2026
c682f7e
Fix export click effects and preview radius parity
webadderall May 29, 2026
5ef2b82
Refine spotlight click effect preview
webadderall May 29, 2026
f2c93c5
Fix remaining click effect review issues
webadderall May 30, 2026
3f1123f
Merge pull request #630 from webadderallorg/feature/click-effects-aut…
webadderall May 30, 2026
dab0b3a
Add subtitle export IPC and keep click effects visible when cursor is…
webadderall May 30, 2026
8641491
Update Hall of Supporters with new names
webadderall May 30, 2026
b5a01a3
Remove subtitle export changes from PR
webadderall May 30, 2026
1f9912b
Merge pull request #632 from webadderallorg/feature/click-effects-aut…
webadderall May 31, 2026
0c690bd
fix: avoid duplicate mic audio in native mac recordings
webadderall Jun 2, 2026
8288b8b
fix: keep embedded audio in legacy mac mic sidecar exports
webadderall Jun 2, 2026
de5cfbe
Merge pull request #645 from webadderallorg/fix/native-mac-duplicate-…
webadderall Jun 2, 2026
70f5714
fix(webcam): stabilize frame sync
webadderall Jun 2, 2026
5fee014
docs(webcam): document sync helpers
webadderall Jun 2, 2026
05fdfa4
Merge pull request #646 from webadderallorg/fix/webcam-stutter-sync
webadderall Jun 2, 2026
8f3bbd5
fix(zoom): hold connected zoom before handoff
webadderall Jun 2, 2026
bbe821c
chore(test): drop PR-only zoom assertion
webadderall Jun 2, 2026
37533cd
feat(zoom): use camera physics for handoffs
webadderall Jun 2, 2026
6cfdf0f
Merge pull request #648 from webadderallorg/fix/animate-zoom-region-t…
webadderall Jun 4, 2026
375620b
fix macos text cursor state
webadderall Jun 4, 2026
79f1356
Revert "fix(linux): route X11 capture through real sources"
webadderall Jun 5, 2026
d2796fb
Revert "fix(linux): expand HUD fallback for menus"
webadderall Jun 5, 2026
f23a419
Revert "fix(recording): preserve webcam preview HUD bounds"
webadderall Jun 5, 2026
1804191
revert: undo linux cursor-overlay portal guards
webadderall Jun 5, 2026
489e3ca
fix(hud): keep overlay interactive while menus are open
webadderall Jun 5, 2026
e99356a
fix(linux): preserve portal screen source mapping
Jun 6, 2026
bfe0a2f
Merge pull request #656 from webadderallorg/revert/hud-linux-fallback…
webadderall Jun 6, 2026
bf99108
fix(windows): use WGC for window capture
Jun 6, 2026
7ca2de2
Merge pull request #661 from webadderallorg/fix/windows-wgc-window-ca…
webadderall Jun 6, 2026
5785180
chore(release): bump version to 1.3.4
webadderall Jun 8, 2026
7b6608e
Add export caption sidecar option
webadderall Jun 9, 2026
795cda2
Add export caption sidecar option
webadderall Jun 9, 2026
52dd842
Merge pull request #669 from webadderallorg/pr/export-caption-sidecars
webadderall Jun 9, 2026
f02f0ba
Merge branch 'webadderallorg:main' into feat/german-language
Eleria83 Jun 11, 2026
8aed819
Update settings.json in DE because of late updates in EN
Eleria83 Jun 11, 2026
8c7d23d
Handle caption sidecar save failures
webadderall Jun 12, 2026
a3a152e
fix(projects): streamline import and save flow
webadderall Jun 15, 2026
e0e6199
fix(projects): tighten import and document project files
webadderall Jun 15, 2026
ff9ccde
Restore inline caption editing
webadderall Jun 15, 2026
dfd3692
Anchor annotations to scene zoom
webadderall Jun 15, 2026
347c36a
Anchor annotations to recording coordinates
webadderall Jun 15, 2026
6c83ce2
Fix caption sidecar default and preview blur anchoring
webadderall Jun 15, 2026
b80eff4
Match annotation preview layer to camera transform
webadderall Jun 15, 2026
a51e05f
Allow advanced padding to position video vertically
surim0n Jun 15, 2026
1b2260a
Add dynamic webcam overlay dimensions
surim0n Jun 15, 2026
d1e8e7a
feat: improve project save flow
webadderall Jun 17, 2026
4b38154
feat: align preview and export rendering
webadderall Jun 17, 2026
2fffe92
feat: raise mp4 export bitrate for color fidelity
webadderall Jun 17, 2026
f0953a1
feat: refine preview cursor and dev blur UI
webadderall Jun 18, 2026
5a92685
feat: refine preview cursor and dev blur UI
webadderall Jun 18, 2026
952d63d
Merge pull request #679 from webadderallorg/pr/project-save-flow
webadderall Jun 18, 2026
063e443
Merge remote-tracking branch 'refs/remotes/origin/pr/681' into feat/e…
webadderall Jun 19, 2026
afc1fc1
Merge remote-tracking branch 'refs/remotes/origin/pr/682' into feat/e…
webadderall Jun 19, 2026
9f6cb6e
fix(captions): restore inline caption editing
webadderall Jun 19, 2026
def1bac
Merge origin/main into feat/export-caption-sidecars
webadderall Jun 22, 2026
d8e34a1
Merge pull request #686 from webadderallorg/feat/export-caption-sidecars
webadderall Jun 22, 2026
f9418f4
fix(recording): avoid doubled mic audio on macOS system+mic captures
Jun 22, 2026
6f41330
feat(captions): add timeline track and side-panel editor for captions
joehachemx Jun 25, 2026
9833a8e
fix(captions): trim silence and split phrases on real pauses
joehachemx Jun 25, 2026
0507261
feat(captions): add timeline add-by-hover and refine the caption editor
joehachemx Jun 26, 2026
1f2ddd4
feat(captions): segment captions by sentence using punctuation and pa…
joehachemx Jun 27, 2026
bd1aff5
feat(captions): add setting to toggle timeline hover-to-add
joehachemx Jun 28, 2026
a8ba050
fix(captions): address caption-editor review feedback
joehachemx Jun 28, 2026
0726a08
Merge pull request #695 from josh-abram/fix/issue-628-mac-mic-echo : …
ExtraBinoss Jul 1, 2026
aa7904b
fix: preview source audio stops around 20s due to unreliable reported…
mvanhorn Jul 2, 2026
399130f
Merge pull request #711 from joehachemx/feat/captions-editor
ExtraBinoss Jul 2, 2026
641d223
Merge pull request #722 from mvanhorn/fix/642-preview-audio-drops
ExtraBinoss Jul 2, 2026
4111959
ci: add pull-request quality checks
meiiie Jul 9, 2026
4da19fd
fix: resolve Windows helper paths consistently
meiiie Jul 9, 2026
6821069
fix(ipc): confine recorded video writes
meiiie Jul 9, 2026
eab8152
fix(electron): constrain renderer navigation
meiiie Jul 9, 2026
146dc6a
fix(electron): scope capture permissions to the HUD
meiiie Jul 10, 2026
19781b6
fix(project): make project saves atomic
meiiie Jul 10, 2026
7082547
chore(tooling): harden repository file handling
meiiie Jul 10, 2026
1193cf4
chore(deps): remove unused legacy packages
meiiie Jul 10, 2026
6ed4c37
chore(deps): patch Electron and Vitest
meiiie Jul 10, 2026
651e0cc
fix(extensions): handle marketplace outages safely
meiiie Jul 10, 2026
9f50b13
fix(export): preserve Pixi fallback after renderer init failure
meiiie Jul 10, 2026
3c12536
fix(export): keep large local media on the streaming path
meiiie Jul 10, 2026
e93babd
fix(export): preserve cropped native aspect ratio
meiiie Jul 10, 2026
dba5e35
fix(hud): keep controls visible when recording starts
meiiie Jul 10, 2026
5978782
fix(editor): refresh finalized companion audio
meiiie Jul 10, 2026
f8ccb5c
fix(recording): keep live webcam preview visible
meiiie Jul 10, 2026
c97f67e
chore(ci): address quality review feedback
meiiie Jul 10, 2026
aea12b6
Merge pull request #737 from webadderallorg/chore/ci-quality-gates
meiiie Jul 10, 2026
e7283f0
Merge branch 'main' into fix/ipc-recording-path-confinement
meiiie Jul 10, 2026
6889765
Merge pull request #738 from webadderallorg/fix/ipc-recording-path-co…
meiiie Jul 10, 2026
b175913
Merge branch 'main' into fix/electron-navigation-policy
meiiie Jul 11, 2026
eb6a7fa
fix(electron): preserve trusted navigation location
meiiie Jul 11, 2026
a2e66b0
Merge pull request #739 from webadderallorg/fix/electron-navigation-p…
meiiie Jul 11, 2026
57cae3c
Merge branch 'main' into fix/electron-permission-policy
meiiie Jul 11, 2026
b9f66e1
test(electron): cover packaged capture origins
meiiie Jul 11, 2026
3ae326a
Merge pull request #740 from webadderallorg/fix/electron-permission-p…
meiiie Jul 11, 2026
cf4416a
Merge branch 'main' into fix/project-atomic-save
meiiie Jul 11, 2026
62954f0
fix(project): address atomic save review feedback
meiiie Jul 11, 2026
1ab9d68
Merge pull request #741 from webadderallorg/fix/project-atomic-save
meiiie Jul 11, 2026
6a16b4f
Merge branch 'main' into chore/remove-unused-dependencies
meiiie Jul 11, 2026
933938a
fix(deps): make lockfile npm 10 compatible
meiiie Jul 11, 2026
4fdef86
Merge pull request #742 from webadderallorg/chore/remove-unused-depen…
meiiie Jul 11, 2026
cf6d299
Merge branch 'main' into fix/735-marketplace-error-response
meiiie Jul 11, 2026
e032f37
test(extensions): cover bounded marketplace details
meiiie Jul 11, 2026
2b4d69a
test(extensions): cover malformed marketplace details
meiiie Jul 11, 2026
9ae7302
Merge pull request #743 from webadderallorg/fix/735-marketplace-error…
meiiie Jul 11, 2026
57d72be
Merge branch 'main' into fix/lightning-pixi-lifecycle
meiiie Jul 11, 2026
d3ef314
refactor(pixi): centralize initialization timeout
meiiie Jul 11, 2026
5f64171
Merge pull request #744 from webadderallorg/fix/lightning-pixi-lifecycle
meiiie Jul 11, 2026
e374850
Merge branch 'main' into fix/493-large-media-streaming
meiiie Jul 11, 2026
8ac06cf
Merge pull request #745 from webadderallorg/fix/493-large-media-strea…
meiiie Jul 11, 2026
0d7596f
Merge branch 'main' into fix/746-remove-background-export-parity
meiiie Jul 11, 2026
855998e
perf(export): debounce crop support probes
meiiie Jul 11, 2026
3d17f87
test(export): preserve fixed aspect crop boundary
meiiie Jul 11, 2026
770536f
Merge pull request #747 from webadderallorg/fix/746-remove-background…
meiiie Jul 11, 2026
f184758
Merge remote-tracking branch 'origin/main' into fix/hud-visible-after…
meiiie Jul 11, 2026
612367a
style(hud): align hook imports
meiiie Jul 11, 2026
157d9a0
Merge pull request #750 from webadderallorg/fix/hud-visible-after-rec…
meiiie Jul 11, 2026
849f0c4
Merge remote-tracking branch 'origin/main' into fix/708-refresh-compa…
meiiie Jul 11, 2026
08e335f
style(audio): align waveform imports
meiiie Jul 11, 2026
0bd3dae
fix(audio): bound versioned waveform cache
meiiie Jul 11, 2026
9233742
Merge pull request #751 from webadderallorg/fix/708-refresh-companion…
meiiie Jul 11, 2026
aafc751
Merge remote-tracking branch 'origin/main' into fix/webcam-live-previ…
meiiie Jul 11, 2026
3252e0d
test(recording): preserve compact idle webcam bounds
meiiie Jul 11, 2026
ec82094
Merge pull request #749 from webadderallorg/fix/webcam-live-preview-b…
meiiie Jul 11, 2026
a62d92a
chore(deps): upgrade Electron to 43
meiiie Jul 11, 2026
321c465
chore(deps): support Visual Studio 2026 rebuilds
meiiie Jul 11, 2026
0d614bc
fix(ci): support Visual Studio 2026 native builds
meiiie Jul 11, 2026
93db2ac
fix(ci): rebuild native modules with VS 2026 tooling
meiiie Jul 11, 2026
844b35f
fix(ci): use v143 toolset on Visual Studio 2026
meiiie Jul 11, 2026
0933eec
Merge pull request #753 from webadderallorg/ci/windows-vs2026-native-…
meiiie Jul 11, 2026
73e1848
Merge remote-tracking branch 'origin/main' into chore/electron-43-com…
meiiie Jul 11, 2026
2005970
Merge pull request #752 from webadderallorg/chore/electron-43-compati…
meiiie Jul 11, 2026
d301179
chore(release): prepare 1.3.5-beta.2
meiiie Jul 11, 2026
15ef10c
Merge pull request #754 from webadderallorg/release/1.3.5-beta.2
meiiie Jul 11, 2026
bffd986
fix(release): support Windows and Linux prereleases
meiiie Jul 11, 2026
83a2407
fix(release): avoid tag template injection
meiiie Jul 11, 2026
360b160
Merge pull request #756 from webadderallorg/ci/windows-linux-prerelease
meiiie Jul 11, 2026
f27842e
Update settings.json
Eleria83 Jul 30, 2026
557b02b
Merge branch 'webadderallorg:main' into feat/german-language
Eleria83 Jul 30, 2026
59ddc51
Merge pull request #587 from Eleria83/feat/german-language
ExtraBinoss Jul 31, 2026
b3c3eb0
Initial plan
Copilot Jul 31, 2026
61fc9dd
fix: sync locale settings keys for i18n check
Copilot Jul 31, 2026
27bb572
fix: add missing de locale mappings for type safety
Copilot Jul 31, 2026
54ae801
Merge pull request #784 from webadderallorg/copilot/fix-repository-qu…
ExtraBinoss Jul 31, 2026
e2df84f
ci(macos): add fail-closed release candidate gate
meiiie Aug 8, 2026
b9683c8
ci(macos): reject unreviewed root entitlements
meiiie Aug 8, 2026
1819ca5
ci(macos): harden candidate verification diagnostics
meiiie Aug 8, 2026
c80ae87
Merge pull request #801 from webadderallorg/ci/macos-release-candidat…
meiiie Aug 8, 2026
10a8097
ci(macos): fail fast on invalid notary credentials
meiiie Aug 8, 2026
2a81da9
Merge pull request #802 from webadderallorg/ci/macos-notary-credentia…
meiiie Aug 8, 2026
64931d0
feat: GIF quality and compression preset
mvanhorn May 27, 2026
824d02c
Merge main and port the GIF quality preset to the export hooks
mvanhorn Oct 31, 2026
b4698a0
fix(export): make the small GIF preset reduce file size
mvanhorn Oct 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/components/video-editor/ExportSettingsMenu.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type { ReactNode } from "react";
import { renderToStaticMarkup } from "react-dom/server";
import { describe, expect, it, vi } from "vitest";
import { I18nProvider } from "@/contexts/I18nContext";
import { ExportSettingsMenu } from "./ExportSettingsMenu";

vi.mock("motion/react", () => ({
LayoutGroup: ({ children }: { children: ReactNode }) => children ?? null,
motion: {
span: ({ children }: { children?: ReactNode }) => children ?? null,
},
}));

describe("ExportSettingsMenu", () => {
it("renders the three GIF quality options", () => {
const html = renderToStaticMarkup(
<I18nProvider>
<ExportSettingsMenu
exportFormat="gif"
exportQuality="source"
exportEncodingMode="balanced"
mp4FrameRate={30}
gifFrameRate={15}
gifLoop={true}
gifSizePreset="medium"
gifQualityPreset="balanced"
gifOutputDimensions={{ width: 1280, height: 720 }}
/>
</I18nProvider>,
);

expect(html).toContain("High");
expect(html).toContain("Balanced");
expect(html).toContain("Small file");
});
});
26 changes: 25 additions & 1 deletion src/components/video-editor/ExportSettingsMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,15 @@ import type {
ExportPipelineModel,
ExportQuality,
GifFrameRate,
GifQualityPreset,
GifSizePreset,
} from "@/lib/exporter";
import { GIF_FRAME_RATES, GIF_SIZE_PRESETS, MP4_FRAME_RATES } from "@/lib/exporter";
import {
GIF_FRAME_RATES,
GIF_QUALITY_PRESETS,
GIF_SIZE_PRESETS,
MP4_FRAME_RATES,
} from "@/lib/exporter";

interface ExportSettingsMenuProps {
exportFormat: ExportFormat;
Expand All @@ -38,6 +44,8 @@ interface ExportSettingsMenuProps {
onGifLoopChange?: (loop: boolean) => void;
gifSizePreset: GifSizePreset;
onGifSizePresetChange?: (preset: GifSizePreset) => void;
gifQualityPreset: GifQualityPreset;
onGifQualityPresetChange?: (preset: GifQualityPreset) => void;
gifOutputDimensions: { width: number; height: number };
onExport?: () => void;
className?: string;
Expand Down Expand Up @@ -119,6 +127,8 @@ export function ExportSettingsMenu({
onGifLoopChange,
gifSizePreset,
onGifSizePresetChange,
gifQualityPreset,
onGifQualityPresetChange,
gifOutputDimensions,
onExport,
className,
Expand Down Expand Up @@ -257,6 +267,20 @@ export function ExportSettingsMenu({
label: preset.label,
}))}
/>
<Choices
label={tSettings("export.gifQuality", "Quality")}
value={gifQualityPreset}
onChange={onGifQualityPresetChange}
options={Object.entries(GIF_QUALITY_PRESETS).map(([key, preset]) => ({
value: key as GifQualityPreset,
label:
key === "high"
? tSettings("export.gifQualityHigh", preset.label)
: key === "balanced"
? tSettings("export.gifQualityBalanced", preset.label)
: tSettings("export.gifQualitySmall", preset.label),
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
}))}
/>
<Description>
{gifOutputDimensions.width} × {gifOutputDimensions.height}px
</Description>
Expand Down
18 changes: 18 additions & 0 deletions src/components/video-editor/editorPreferences.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,20 @@ describe("editorPreferences", () => {
expect(DEFAULT_EDITOR_PREFERENCES.exportQuality).toBe("source");
});

it("defaults GIF quality to balanced and clamps invalid stored presets", () => {
vi.stubGlobal(
"localStorage",
createStorageMock({
[EDITOR_PREFERENCES_STORAGE_KEY]: JSON.stringify({
gifQualityPreset: "tiny",
}),
}),
);

expect(DEFAULT_EDITOR_PREFERENCES.gifQualityPreset).toBe("balanced");
expect(loadEditorPreferences().gifQualityPreset).toBe("balanced");
});

it("defaults cursor preferences to Tahoe at 2.5x with gentler sway", () => {
expect(DEFAULT_EDITOR_PREFERENCES.cursorStyle).toBe("tahoe");
expect(DEFAULT_EDITOR_PREFERENCES.cursorSize).toBe(2.5);
Expand Down Expand Up @@ -192,6 +206,7 @@ describe("editorPreferences", () => {
exportFormat: "gif",
gifFrameRate: 30,
gifLoop: false,
gifQualityPreset: "small",
customAspectWidth: "21",
customAspectHeight: "9",
customWallpapers: ["data:image/jpeg;base64,abc"],
Expand All @@ -209,6 +224,7 @@ describe("editorPreferences", () => {
exportFormat: "gif",
gifFrameRate: 30,
gifLoop: false,
gifQualityPreset: "small",
customAspectWidth: "21",
customAspectHeight: "9",
customWallpapers: ["data:image/jpeg;base64,abc"],
Expand Down Expand Up @@ -305,6 +321,7 @@ describe("editorPreferences", () => {
gifFrameRate: 20,
gifLoop: false,
gifSizePreset: "large",
gifQualityPreset: "small",
customAspectWidth: "4",
customAspectHeight: "5",
customWallpapers: ["data:image/jpeg;base64,abc", "data:image/jpeg;base64,abc"],
Expand Down Expand Up @@ -335,6 +352,7 @@ describe("editorPreferences", () => {
gifFrameRate: 20,
gifLoop: false,
gifSizePreset: "large",
gifQualityPreset: "small",
customAspectWidth: "4",
customAspectHeight: "5",
customWallpapers: ["data:image/jpeg;base64,abc"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ export function useExportDialogActions({
gifFrameRate: settings.gifFrameRate,
gifLoop: settings.gifLoop,
gifSizePreset: settings.gifSizePreset,
gifQualityPreset: settings.gifQualityPreset,
});
},
[videoPath, videoPlaybackRef, hasCaptionsForSidecar, settings],
Expand Down
1 change: 1 addition & 0 deletions src/components/video-editor/export/useExportRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ export function useExportRunner(input: ExportRunnerInput) {
frameRate: settings.gifConfig.frameRate,
loop: settings.gifConfig.loop,
sizePreset: settings.gifConfig.sizePreset,
qualityPreset: settings.gifConfig.qualityPreset,
...buildExportRenderOptions({
appearance,
timeline,
Expand Down
8 changes: 8 additions & 0 deletions src/components/video-editor/export/useExportSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type {
ExportPipelineModel,
ExportQuality,
GifFrameRate,
GifQualityPreset,
GifSizePreset,
} from "@/lib/exporter";
import { projectCaptionCues } from "../captionTimeline";
Expand Down Expand Up @@ -41,6 +42,9 @@ export function useExportSettings(
const [gifFrameRate, setGifFrameRate] = useState<GifFrameRate>(preferences.gifFrameRate);
const [gifLoop, setGifLoop] = useState(preferences.gifLoop);
const [gifSizePreset, setGifSizePreset] = useState<GifSizePreset>(preferences.gifSizePreset);
const [gifQualityPreset, setGifQualityPreset] = useState<GifQualityPreset>(
preferences.gifQualityPreset,
);
useEffect(() => {
saveEditorPreferences({
publishDestination,
Expand All @@ -54,6 +58,7 @@ export function useExportSettings(
gifFrameRate,
gifLoop,
gifSizePreset,
gifQualityPreset,
});
}, [
publishDestination,
Expand All @@ -67,6 +72,7 @@ export function useExportSettings(
gifFrameRate,
gifLoop,
gifSizePreset,
gifQualityPreset,
]);

const captionSidecarCues = useMemo(
Expand Down Expand Up @@ -107,6 +113,8 @@ export function useExportSettings(
setGifLoop,
gifSizePreset,
setGifSizePreset,
gifQualityPreset,
setGifQualityPreset,
captionSidecarCues,
};
}
7 changes: 6 additions & 1 deletion src/components/video-editor/exportPreferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import type {
ExportPipelineModel,
ExportQuality,
GifFrameRate,
GifQualityPreset,
GifSizePreset,
} from "@/lib/exporter";
import { isValidMp4FrameRate } from "@/lib/exporter/types";
import { isValidGifQualityPreset, isValidMp4FrameRate } from "@/lib/exporter/types";

export interface ExportPreferences {
exportEncodingMode: ExportEncodingMode;
Expand All @@ -20,6 +21,7 @@ export interface ExportPreferences {
gifFrameRate: GifFrameRate;
gifLoop: boolean;
gifSizePreset: GifSizePreset;
gifQualityPreset: GifQualityPreset;
publishDestination: "link" | "local";
includeCaptionSidecar: boolean;
}
Expand Down Expand Up @@ -78,6 +80,9 @@ export function normalizeExportPreferences(raw: Partial<ExportPreferences>): Exp
raw.gifSizePreset === "original"
? raw.gifSizePreset
: "medium",
gifQualityPreset: isValidGifQualityPreset(raw.gifQualityPreset)
? raw.gifQualityPreset
: "balanced",
publishDestination: raw.publishDestination === "local" ? "local" : "link",
includeCaptionSidecar: raw.includeCaptionSidecar === true,
};
Expand Down
3 changes: 3 additions & 0 deletions src/components/video-editor/exportStartSettings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const baseOptions = {
gifFrameRate: 20 as const,
gifLoop: true,
gifSizePreset: "medium" as const,
gifQualityPreset: "balanced" as const,
};

describe("resolveExportStartSettings", () => {
Expand Down Expand Up @@ -53,6 +54,7 @@ describe("resolveExportStartSettings", () => {
frameRate: 15,
loop: false,
sizePreset: "medium",
qualityPreset: "balanced",
width: 1280,
height: 720,
},
Expand All @@ -70,6 +72,7 @@ describe("resolveExportStartSettings", () => {
}).gifConfig,
).toMatchObject({
sizePreset: "original",
qualityPreset: "balanced",
width: 1234,
height: 678,
});
Expand Down
4 changes: 4 additions & 0 deletions src/components/video-editor/exportStartSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
type ExportSettings,
GIF_SIZE_PRESETS,
type GifFrameRate,
type GifQualityPreset,
type GifSizePreset,
} from "@/lib/exporter";

Expand All @@ -25,6 +26,7 @@ export function resolveExportStartSettings({
gifFrameRate,
gifLoop,
gifSizePreset,
gifQualityPreset,
}: {
sourceWidth: number;
sourceHeight: number;
Expand All @@ -38,6 +40,7 @@ export function resolveExportStartSettings({
gifFrameRate: GifFrameRate;
gifLoop: boolean;
gifSizePreset: GifSizePreset;
gifQualityPreset: GifQualityPreset;
}): ExportSettings {
const gifDimensions =
exportFormat === "gif"
Expand All @@ -58,6 +61,7 @@ export function resolveExportStartSettings({
frameRate: gifFrameRate,
loop: gifLoop,
sizePreset: gifSizePreset,
qualityPreset: gifQualityPreset,
width: gifDimensions.width,
height: gifDimensions.height,
}
Expand Down
4 changes: 4 additions & 0 deletions src/components/video-editor/layout/EditorExportMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ export function EditorExportMenu(props: Props) {
setGifLoop,
gifSizePreset,
setGifSizePreset,
gifQualityPreset,
setGifQualityPreset,
includeCaptionSidecar,
setIncludeCaptionSidecar,
} = exportSettings;
Expand Down Expand Up @@ -151,6 +153,8 @@ export function EditorExportMenu(props: Props) {
onGifLoopChange={setGifLoop}
gifSizePreset={gifSizePreset}
onGifSizePresetChange={setGifSizePreset}
gifQualityPreset={gifQualityPreset}
onGifQualityPresetChange={setGifQualityPreset}
showCaptionSidecarOption={hasCaptionsForSidecar && exportFormat === "mp4"}
includeCaptionSidecar={includeCaptionSidecar}
onIncludeCaptionSidecarChange={setIncludeCaptionSidecar}
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/de/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "FPS",
"loop": "Wiederholen",
"gifQuality": "Qualität",
"gifQualityHigh": "Hoch",
"gifQualityBalanced": "Ausgewogen",
"gifQualitySmall": "Kleine Datei",
"outputDimensions": "Ausgabe: {{dimensions}}px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Med",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@
},
"fpsTitle": "FPS",
"loop": "Loop",
"gifQuality": "Quality",
"gifQualityHigh": "High",
"gifQualityBalanced": "Balanced",
"gifQualitySmall": "Small file",
"outputDimensions": "Output: {{dimensions}}px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Med",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/es/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "FPS",
"loop": "Bucle",
"gifQuality": "Calidad",
"gifQualityHigh": "Alta",
"gifQualityBalanced": "Equilibrada",
"gifQualitySmall": "Archivo pequeño",
"outputDimensions": "Salida: {{dimensions}}px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Med",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/fr/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "IPS",
"loop": "Boucle",
"gifQuality": "Qualité",
"gifQualityHigh": "Élevée",
"gifQualityBalanced": "Équilibrée",
"gifQualitySmall": "Petit fichier",
"outputDimensions": "Sortie : {{dimensions}} px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Moy",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/it/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "FPS",
"loop": "Loop",
"gifQuality": "Qualità",
"gifQualityHigh": "Alta",
"gifQualityBalanced": "Bilanciata",
"gifQualitySmall": "File piccolo",
"outputDimensions": "Output: {{dimensions}}px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Med",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/ko/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "FPS",
"loop": "반복",
"gifQuality": "품질",
"gifQualityHigh": "높음",
"gifQualityBalanced": "균형",
"gifQualitySmall": "작은 파일",
"outputDimensions": "출력: {{dimensions}}px",
"sizePresetOriginalShort": "원본",
"sizePresetMediumShort": "중간",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/nl/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "FPS",
"loop": "Herhalen",
"gifQuality": "Kwaliteit",
"gifQualityHigh": "Hoog",
"gifQualityBalanced": "Gebalanceerd",
"gifQualitySmall": "Klein bestand",
"outputDimensions": "Uitvoer: {{dimensions}}px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Gem",
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/locales/pt-BR/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@
},
"fpsTitle": "FPS",
"loop": "Repetir",
"gifQuality": "Qualidade",
"gifQualityHigh": "Alta",
"gifQualityBalanced": "Equilibrada",
"gifQualitySmall": "Arquivo pequeno",
"outputDimensions": "Saída: {{dimensions}}px",
"sizePresetOriginalShort": "Orig",
"sizePresetMediumShort": "Med",
Expand Down
Loading
Loading