Repository navigation
refactor: shared module layout (craft-contrib#20) - #2491
Merged
Merged
Conversation
This was referenced Oct 29, 2026
nanox333
pushed a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
The parent-space code moved to cmd/layer/parent.rs (storytold#2491); this branch's changes to it are carried over unchanged. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
nanox333
pushed a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
The Effect Controls viewer hook moved to effect_controls/viewer.rs and the frame loop to app/frame.rs (storytold#2491); the popup eyedropper is carried over as its own function there. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
nanox333
pushed a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
The shape-tool double-click, Cmd+W handling and their tests move to the split header, menus/invoke and engine test modules (storytold#2491); the docking check in the Cmd+W test uses the craft_ui dock API. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
nanox333
pushed a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
lib.rs and menus.rs were split (storytold#2491): the dialog_state accessors, the undimmed canvas while a dialog previews, and Escape-as-Cancel for the Gradient Editor and Preview move to app/window.rs, app/frame.rs and menus/shortcuts.rs. Layer Styles' rollback keeps main's text-editor handling inside the shared restore(). The dialog preview integration test joins the tests/it binary. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
nanox333
pushed a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
Footage.markers is added to the split footage.rs (storytold#2491); the host integration test joins the shared tests/it binary. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
nanox333
pushed a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
output_guard joins the split engine lib.rs; the overwrite tests move to tests/render_overwrite.rs (storytold#2491) and the regression workflow's test filter follows. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RDvxCS8xcR28VArjzn1x7U
Kaedo17
added a commit
to Kaedo17/effectcraft-mobile
that referenced
this pull request
Oct 29, 2026
storytold#2491 moved the code this PR touches: the menu-side file-dialog dispatch lands in menus/frontend.rs beside the async-hook block it extends, the touch widening is called from the split app/frame.rs frame, the picker's view preference lands in the settings module split (choices, section, document validation), and media_panels keeps main's listing while its thumbnails go through thumbs::media. Android-only Hooks cfgs came off (the in-app browser serves any host that sets app_files_dir), egui 0.37's deprecated Id::new became Id::unique in the new files, and the icon grid bundles its content into Grid to hold storytold#2496's argument limit.
Kaedo17
added a commit
to Kaedo17/effectcraft-mobile
that referenced
this pull request
Oct 29, 2026
storytold#2491 moved the code this PR touches: the menu-side file-dialog dispatch lands in menus/frontend.rs beside the async-hook block it extends, the touch widening is called from the split app/frame.rs frame, the picker's view preference lands in the settings module split (choices, section, document validation), and media_panels keeps main's listing while its thumbnails go through thumbs::media. Android-only Hooks cfgs came off (the in-app browser serves any host that sets app_files_dir), egui 0.37's deprecated Id::new became Id::unique in the new files, and the icon grid bundles its content into Grid to hold storytold#2496's argument limit.
bflatastic
added a commit
to nanox333/effectcraft-fork
that referenced
this pull request
Oct 29, 2026
…orytold#2491) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kaedo17
added a commit
to Kaedo17/effectcraft-mobile
that referenced
this pull request
Oct 29, 2026
storytold#2491 moved the code this PR touches: the menu-side file-dialog dispatch lands in menus/frontend.rs beside the async-hook block it extends, the touch widening is called from the split app/frame.rs frame, the picker's view preference lands in the settings module split (choices, section, document validation), and media_panels keeps main's listing while its thumbnails go through thumbs::media. Android-only Hooks cfgs came off (the in-app browser serves any host that sets app_files_dir), egui 0.37's deprecated Id::new became Id::unique in the new files, and the icon grid bundles its content into Grid to hold storytold#2496's argument limit.
Kaedo17
added a commit
to Kaedo17/effectcraft-mobile
that referenced
this pull request
Oct 29, 2026
The stamp moved out of the monolithic lib.rs with the storytold#2491 split, and its file-private visibility did not move with it: on Android the app's raw_input_hook could not call it. pub(crate), found by the Android target check this branch's aarch64 verification needs.
Kaedo17
added a commit
to Kaedo17/effectcraft-mobile
that referenced
this pull request
Oct 29, 2026
The stamp moved out of the monolithic lib.rs with the storytold#2491 split, and its file-private visibility did not move with it: on Android the app's raw_input_hook could not call it. pub(crate), found by the Android target check.
vangel76
added a commit
to vangel76/effectcraft
that referenced
this pull request
Oct 29, 2026
Removes the two committed __pycache__ files under tests/fixtures/tools and ignores __pycache__. Moves src/container/mod.rs, src/import/mod.rs and the matching integration test modules to their parent-named files, as main does since storytold#2491 (tests/it/common/mod.rs stays, as on main). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pure-move reorganisation of EffectCraft's modules to the shared layout proposed in storytold/craft-contrib#20, done during the merge freeze. No behaviour changes: each commit moves code with
git mvorra-move, and public paths stay the same throughpub usealiases in the old parents. Rewriting callers to the defining modules, and removing the aliases, is after-freeze work, so open PRs see fewer conflicts now.Merge without squashing, so the history keeps one commit per move.
What moved
Large files split
Line counts are
wc -l(including comments, tests and blank lines) at main (c6184292) and at this PR (b7b75ed3).crates/ui-egui/src/lib.rsstate.rs(794)crates/ui-egui/src/panels/viewer.rsviewer/geometry.rs(304)crates/ui-egui/src/menus.rsmenus/invoke.rs(692)crates/effects/src/sim2.rssim2/surfaces.rs(524)crates/render/src/lib.rspipeline.rs(886)crates/effects/src/generate3.rsgenerate3/paths.rs(553)crates/pdf/src/ps.rsps/builtin.rs(956)crates/effects/src/sim.rssim/tests.rs(407)crates/engine/src/commands/layer.rs(original replaced bycrates/engine/src/cmd/layer.rs)crates/engine/src/cmd/layer/parent.rs(452)crates/effects/src/ocio.rsocio/effects.rs(467)crates/ui-egui/src/panels/effect_controls.rseffect_controls/rows.rs(626)crates/project/src/lib.rscomp.rs(427)crates/engine/src/lib.rssession/edit.rs(303)crates/psd/src/lib.rspixels.rs(545)crates/engine/src/prefs.rs(original replaced bycrates/engine/src/settings/prefs.rs)settings/prefs/dialog.rs(430)Also: 19 test modules moved out to
tests.rsfiles, 7mod.rsfiles renamed, 111 loose test files moved undertestspaths.crates/ui-egui/src/lib.rs(3,517 → 424 + 15 files)state.rs(existing file)app/frame.rslifecycle_tests.rsapp/prefetch.rsapp/screenshot.rsapp/gpu.rsapp/playback.rsapp.rsapp/viewer_frames.rsapp/prefs.rsapp/window.rshooks.rsclock.rsapp/clipboard.rsapp/input.rscrates/ui-egui/src/panels/viewer.rs(2,942 → 1,427 + 7 files)viewer/geometry.rsviewer/tools.rsviewer/view.rsviewer/shapes.rsviewer/gesture.rsviewer/frame.rsviewer/tests.rscrates/ui-egui/src/menus.rs(2,748 → 44 + 7 files)menus/invoke.rsmenus/frontend.rsmenus/tests.rsmenus/shortcuts.rsmenus/bar.rsmenus/entries.rsmenus/commands.rscrates/effects/src/sim2.rs(2,698 → 43 + 7 files)sim2/surfaces.rssim2/tests.rssim2/shatter.rssim2/foam.rssim2/registry.rssim2/pieces.rssim2/pixels.rscrates/render/src/lib.rs(2,460 → 102 + 7 files)pipeline.rslayers.rsaccel.rsfootage.rsfx_host.rsframes.rsopts.rscrates/effects/src/generate3.rs(2,446 → 42 + 7 files)generate3/paths.rsgenerate3/tests.rsgenerate3/raster.rsgenerate3/fill.rsgenerate3/audio.rsgenerate3/registry.rsgenerate3/fractal.rscrates/pdf/src/ps.rs(2,038 → 49 + 7 files)ps/builtin.rsps/text.rsps/scanner.rsps/paths.rsps/exec.rsps/value.rsps/eps.rscrates/effects/src/sim.rs(2,033 → 42 + 7 files)sim/tests.rssim/particle_fx.rssim/sprites.rssim/weather.rssim/engine.rssim/registry.rssim/common.rscrates/engine/src/commands/layer.rs(2,002 → 212 + 8 files)crates/engine/src/cmd/layer/parent.rscrates/engine/src/cmd/layer/create.rscrates/engine/src/cmd/layer/timing.rscrates/engine/src/cmd/layer/switches.rscrates/engine/src/cmd/layer/contents.rscrates/engine/src/cmd/layer/transform.rscrates/engine/src/cmd/layer/replace.rscrates/engine/src/cmd/layer/select.rscrates/effects/src/ocio.rs(1,838 → 67 + 7 files)ocio/effects.rsocio/lut.rsocio/tests.rsocio/program.rsocio/space.rsocio/registry.rsocio/cdl.rscrates/ui-egui/src/panels/effect_controls.rs(1,682 → 41 + 5 files)effect_controls/rows.rseffect_controls/editors.rseffect_controls/panel.rseffect_controls/viewer.rseffect_controls/common.rscrates/project/src/lib.rs(1,662 → 65 + 5 files)comp.rslayer.rssettings.rsitem.rsfootage.rscrates/engine/src/lib.rs(1,593 → 354 + 9 files)session/edit.rssession/comps.rsdoc_state.rssession/render.rsfonts.rssession/dispatch.rsservices.rsevent.rserror.rscrates/psd/src/lib.rs(1,523 → 72 + 5 files)pixels.rsparse.rsmodel.rslimits.rscounters.rscrates/engine/src/prefs.rs(1,518 → 128 + 6 files)settings/prefs/dialog.rssettings/prefs/sections.rssettings/prefs/document.rssettings/prefs/queries.rssettings/prefs/choices.rssettings/prefs/recent.rsTotals: 15 files split, 28,230 lines moved out of them, 108 new files.
Engine top level: 93 files became 17 (
lib.rs,cmd.rs,menus.rs,history.rs,viewer.rs,scriptui.rs,render_queue.rs,preview.rs,rq_tests.rs,tests.rsand the group rootsanalysis,settings,footage,interchange,home,background,system). Each group root holds onlypub modlines;lib.rsre-exports every moved module (pub use analysis::roto;), soeffectcraft_engine::roto::…andcrate::roto::…still work.commands/iscmd/, withpub use cmd as commands;becauseui-egui,scriptand the CLI useeffectcraft_engine::commands::….Edits besides moved lines
Inside move commits, only what the move needs to compile (
pure-move-checkshows these as the only unmatched lines):include_str!path depth:ui-egui/src/i18n/ui.rs(panels/mod.rs→panels.rs,commands/viewer_cmds.rs→cmd/viewer_cmds.rs,prefs.rs→settings/prefs.rs),ui-egui/src/workspace_state/tests.rs, and the engine tests that includedocs/preferences.mdandpresets/text_animators.json.crate::tests_<x>::→crate::tests::<x>::, and a moved file's top-leveluse super::→use crate::.tests.rsdeclarestrack,rotoandstubspub(crate)because code outsidetests/uses them.#[path = "fbx_tests.rs"]removed with the move ofmodel/src/fbx_tests.rstofbx/tests.rs.ui-egui/src/i18n/ui.rsCONVERTEDrows: a split file's row is replaced by rows for the files that now hold its strings (settings/prefs.rs→prefs/dialog.rs,prefs/choices.rs;menus.rs,panels/effect_controls.rsandpanels/viewer.rs→ their new files). Without themevery_row_is_used_by_a_converted_panelfails.settings/prefs.rsre-exports the 19 settings page types that thepage!macro defines (pub use sections::{Appearance, …});app/clipboard.rshas#[cfg(test)] use super::*;for its moved test module.counters→counters.rs, ui-eguilifecycle_tests→lifecycle_tests.rs, viewertests→viewer/tests.rs.tests_prefix is dropped (tests_roto.rs→tests/roto.rs);tests_3d.rs→tests/three_d.rs(an identifier can't start with a digit); rendertests_aux.rs→tests/aux_channels.rs(auxis a reserved file name on Windows). Suffix files declared inlib.rs(rq_tests.rs, psdmemory_tests.rs) stay this round.Separate commits:
cargo fmt --allon its parent: the trees match)Log targets
logrecords use the module path as their target. Records from moved modules get new targets; every target still starts with its crate name, and the filters (engine/src/logging.rslevel_for,RUST_LOG) match by prefix, so crate-level filters keep working. Changed:effectcraft_engine::offload→…::background::offload,…::session_settings→…::settings::session_settings,…::guard→…::system::guard,…::logging→…::system::logging,…::commands::{scripts,render_queue,warp_cmds}→…::cmd::…. In ui-egui, records from the app's methods change fromeffectcraft_ui_eguitoeffectcraft_ui_egui::app::{frame,gpu,playback,window}. The splits move no other code that logs.Open PRs this conflicts with
Counts per commit, then per file (old path), from the open PRs on the day of this PR. Edits to a moved file usually rebase cleanly through git's rename detection; PRs that add files under
commands/or at the engine top level need their newmodline placed by hand.Conflicts per commit and file
refactor(ui-egui): move src/panels/mod.rs to src/panels.rs: 45 PRs
crates/ui-egui/src/i18n/ui.rs(37): Add German panel and dialog translations #666, Window ▸ AI Chat: a chat panel for local models and bridged agents #802, #804: hardware video decoding (NVDEC / VA-API / VideoToolbox / Media Foundation) via filmcraft-platform #819, Feat/settings search and updates #981, Add Arabic (العربية) interface translation #1150, Colour picker: eyedropper that samples the Composition monitor (#1211) #1289, Timeline: parent and matte selected layers together (#1260) #1291, UI: Rescan Fonts in the font menu; assert the Linux system scan (#1089) #1298, Timeline: pick whip for the Track Matte column, as in After Effects #1336, i18n: add Polish (pl) interface language #1340, Update Russian localization #1418, Android arm64 port: in-app file browser with view modes, touch input, and the fixes it surfaced #1508, i18n: the 31 tool names are translated (zh-hans, zh-hant) #1514, Add Craft AI: the family's built-in local assistant (Gemma 4 catalogue, loopback runtimes, shared models folder) #1515, i18n: add Korean menus and panel/settings translations #1529, i18n: Swedish (sv) interface translation #1541, i18n: the labels the call-shape scan cannot see #1581, Translate remaining Japanese panel labels #1772, i18n: complete the Brazilian Portuguese (pt-br) panel catalog #1774, i18n: add Brazilian Portuguese (pt-br) effect-name catalog #1775, i18n: add Finnish (fi) interface #1779, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Evaluate mask feather beyond source bounds before cropping #1974, Improve mask bounds and shared mask/shape path editing #1978, Replace selected layer sources with geometry and Audio preservation #1980, Apply Timeline parenting to selected unlocked child layers #1981, Add Korean support #2000, i18n(ja): panels and dialogs (27% → 39%) #2054, i18n: translate panel tabs, search fields, Project and Timeline headers and workspace names in zh-Hans (#2186) #2230, i18n: fill in the Simplified Chinese catalog for panels, dialogs and tooltips #2253, i18n: route the remaining property names and dialogs through the catalogs #2281, i18n(fr): French panels, dialogs, tooltips and effect names #2343, android: the in-app file browser, shared storage and the picker view sizes #2366, i18n(ka): shorter Georgian for 14 labels that didn't fit #2422, i18n: the Preview panel's labels reach the catalog #2427, Add Blender scene export for the 3D Camera Tracker #2442crates/ui-egui/src/panels/mod.rs(17): Window ▸ AI Chat: a chat panel for local models and bridged agents #802, Console Effect: a built-in keyboard launcher for effects and presets (Ctrl+Space) #918, Viewer trackpad gestures: two-finger scroll pans, pinch zooms #1036, feat(ui): Effect Console (Ctrl+Space) to search and apply effects and presets at the pointer #1105, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, #1436: settings dialogs preview live and leave the window undimmed (Gradient Editor, Solid, Camera, Light, Composition) #1439, Android arm64 port: in-app file browser with view modes, touch input, and the fixes it surfaced #1508, Add Craft AI: the family's built-in local assistant (Gemma 4 catalogue, loopback runtimes, shared models folder) #1515, i18n: the labels the call-shape scan cannot see #1581, Translate remaining Japanese panel labels #1772, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Preserve existing exports until rendering succeeds and confirm overwrites #1922, Improve mask bounds and shared mask/shape path editing #1978, feat(ui): Effect Console (Ctrl+Space) to search and apply effects and presets at the pointer #1983, android: the in-app file browser, shared storage and the picker view sizes #2366refactor(track): move src/roto/mod.rs to src/roto.rs: 3 PRs
crates/track/src/roto/mod.rs(3): Roto Brush: follow the object with SAM 2.1 (Tiny, Small, Base+, Large; optional models) #1539, Roto Brush: apply correction strokes in drawing order (#1646) #1804, Roto Brush: propagate on the band bounding box #2335refactor(track): move src/camtrack/mod.rs to src/camtrack.rs: 1 PRs
crates/track/src/camtrack/mod.rs(1): Camera tracking: validate solver input and bound workspaces #2341refactor(effects): move src/puppet/mod.rs to src/puppet.rs: 2 PRs
crates/effects/src/puppet/mod.rs(2): fix: crash and hang fixes from fuzzing, Puppet overlay off the UI thread, memory release on open, CLI and test fixes #855, feat(aep): import After Effects projects through an external py-aep converter #860refactor(render): move src/three_d/mod.rs to src/three_d.rs: 1 PRs
crates/render/src/three_d/mod.rs(1): Fix Auto-Orient flipping at the end of a motion path #1729refactor(opusenc): move src/silk/mod.rs to src/silk.rs: 1 PRs
crates/opusenc/src/silk/mod.rs(1): opusenc: memoise SILK rate-loop trials, ring buffer for noise feedback #2399refactor(engine): move src/commands/mod.rs to src/commands.rs: 14 PRs
crates/engine/src/commands/mod.rs(14): feat(aep): import After Effects projects through an external py-aep converter #860, Console Effect: a built-in keyboard launcher for effects and presets (Ctrl+Space) #918, feat(design): native Figma transfer and FigCraft copy/paste #1103, feat(shapes): path marquees, Reverse Path Direction, Round Corners, Layer Contents and per-shape SVG rasterising #1107, feat(xtask): ci --affected, a fast CI profile and replayable crash repros #1224, feat(mcp): structured results, resource templates, prompts, notifications, progress and cancel, get_layout, analyze_audio #1225, Batches: a rollback restores the whole document; refuse what it can't undo (#1232) #1358, Superseded: one pull request per remaining bug #1408, Scripts: system file dialogs, progress with Window.update(), and File ▸ Import ▸ Converted Project… #1554, Replace selected layer sources with geometry and Audio preservation #1980, Fix three out-of-memory crashes (Camera Lens Blur, Fast Box Blur, Content-Aware Fill) #2219, MCP: get_property and get_layer list an enum property's options (#2085) #2236, Add Blender scene export for the 3D Camera Tracker #2442, Apple Motion (OZML) import and export #2490refactor(engine): move commands/ to cmd/, keeping commands as an alias: 145 PRs
crates/ui-egui/src/i18n/ui.rs(37): Add German panel and dialog translations #666, Window ▸ AI Chat: a chat panel for local models and bridged agents #802, #804: hardware video decoding (NVDEC / VA-API / VideoToolbox / Media Foundation) via filmcraft-platform #819, Feat/settings search and updates #981, Add Arabic (العربية) interface translation #1150, Colour picker: eyedropper that samples the Composition monitor (#1211) #1289, Timeline: parent and matte selected layers together (#1260) #1291, UI: Rescan Fonts in the font menu; assert the Linux system scan (#1089) #1298, Timeline: pick whip for the Track Matte column, as in After Effects #1336, i18n: add Polish (pl) interface language #1340, Update Russian localization #1418, Android arm64 port: in-app file browser with view modes, touch input, and the fixes it surfaced #1508, i18n: the 31 tool names are translated (zh-hans, zh-hant) #1514, Add Craft AI: the family's built-in local assistant (Gemma 4 catalogue, loopback runtimes, shared models folder) #1515, i18n: add Korean menus and panel/settings translations #1529, i18n: Swedish (sv) interface translation #1541, i18n: the labels the call-shape scan cannot see #1581, Translate remaining Japanese panel labels #1772, i18n: complete the Brazilian Portuguese (pt-br) panel catalog #1774, i18n: add Brazilian Portuguese (pt-br) effect-name catalog #1775, i18n: add Finnish (fi) interface #1779, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Evaluate mask feather beyond source bounds before cropping #1974, Improve mask bounds and shared mask/shape path editing #1978, Replace selected layer sources with geometry and Audio preservation #1980, Apply Timeline parenting to selected unlocked child layers #1981, Add Korean support #2000, i18n(ja): panels and dialogs (27% → 39%) #2054, i18n: translate panel tabs, search fields, Project and Timeline headers and workspace names in zh-Hans (#2186) #2230, i18n: fill in the Simplified Chinese catalog for panels, dialogs and tooltips #2253, i18n: route the remaining property names and dialogs through the catalogs #2281, i18n(fr): French panels, dialogs, tooltips and effect names #2343, android: the in-app file browser, shared storage and the picker view sizes #2366, i18n(ka): shorter Georgian for 14 labels that didn't fit #2422, i18n: the Preview panel's labels reach the catalog #2427, Add Blender scene export for the 3D Camera Tracker #2442crates/engine/src/lib.rs(36): feat(aep): Initial native After Effects (.aep / .aepx) project decoder and import (Early Stage) (#190) #251, fix: crash and hang fixes from fuzzing, Puppet overlay off the UI thread, memory release on open, CLI and test fixes #855, feat(aep): import After Effects projects through an external py-aep converter #860, Plug-ins: external effect helpers (safe, out-of-process native effects) + plug-in API 2 #889, Console Effect: a built-in keyboard launcher for effects and presets (Ctrl+Space) #918, feat(design): native Figma transfer and FigCraft copy/paste #1103, feat(xtask): ci --affected, a fast CI profile and replayable crash repros #1224, feat(mcp): structured results, resource templates, prompts, notifications, progress and cancel, get_layout, analyze_audio #1225, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Fix #1743: protect render outputs from replacing project sources #1758, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Agents over the bridge:file.import {alpha}and modal dialogs that report themselves #1859, Report the build's git commit inapp.capabilitiesandeffectcraft-cli info#1860, Clipboard: export keyframes as After Effects-compatible text #1921, Preserve existing exports until rendering succeeds and confirm overwrites #1922, Reveal in Explorer selects the file in the file manager instead of opening the browser (#1961) #1970, Improve mask bounds and shared mask/shape path editing #1978, Replace selected layer sources with geometry and Audio preservation #1980, Offset all selected keyframes when a value is edited on one of them (#1963) #2007, Close, New and Open Project free the closed project's memory #2042, Fix #2091 copy/paste masks between layers #2216, Fix legacy CC particle compositing (#1898) #2222, Scale Composition: comp.scale resizes a comp and scales its layers, keys, cameras and guides by one factor #2248, Scripts: Recent Script Files lists the last ten scripts and Cmd+Alt+Shift+D reruns the newest #2291, Interpret Footage: Cineon Settings convert DPX and Cineon log scans #2300, Cineon Converter: Gamma 1 gives linear output and saved projects keep their render #2312, EffectCraft — no polling while idle: a deadline worker that sleeps, and a footage watcher that wakes the UI only on change #2369, layer.create: implement the instance3d op - a 2D copy of a 3D model layer (#2100) #2410, Add Blender scene export for the 3D Camera Tracker #2442, Shapes: Wiggle Paths has Spatial Phase, which slides its wiggle along the path #2450, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/file_more.rs(22): feat(aep): import After Effects projects through an external py-aep converter #860, feat(mcp): structured results, resource templates, prompts, notifications, progress and cancel, get_layout, analyze_audio #1225, Shortcuts: default keys shared between a panel and the application [skip ci] #1270, Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Collect attached proxies without overwriting archive media #1359, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, Agents over the bridge:file.import {alpha}and modal dialogs that report themselves #1859, Reveal in Explorer selects the file in the file manager instead of opening the browser (#1961) #1970, engine: Replace Footage keeps a still a still (#2073) #2107, Scripts: the Startup and Shutdown folders run at launch and quit #2279, Scripts: Recent Script Files lists the last ten scripts and Cmd+Alt+Shift+D reruns the newest #2291, Interpret Footage: Cineon Settings convert DPX and Cineon log scans #2300, Interpret Footage: the params docs list every key the commands read #2309, Fixes: macOS quit crash, soft shadow jitter, Interpret Footage params, preset upgrade, composition proxies, font menu names #2466, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/layer.rs(21): feat(shapes): path marquees, Reverse Path Direction, Round Corners, Layer Contents and per-shape SVG rasterising #1107, Parented cameras and lights keep their static and keyed Orientation (refs #1010) #1165, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Timeline: parent and matte selected layers together (#1260) #1291, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Timeline: pick whip for the Track Matte column, as in After Effects #1336, Timeline: trimming the Out point to the playhead keeps its frame visible #1737, Text: language-aware All Caps (Turkish İ) and multi-character capitals #1858, 3D rotation order, keyed Orientation, linear-to-eased keyframes, Timewarp and image-sequence gaps behave as in After Effects #1876, Fix #1747: keep collapsed precomp instance overrides unclipped #1951, Improve mask bounds and shared mask/shape path editing #1978, Replace selected layer sources with geometry and Audio preservation #1980, Apply Timeline parenting to selected unlocked child layers #1981, Text: add stroke Line Join (Miter / Round / Bevel) #2089, Transform: Fit to Comp sizes shape and text layers by their painted bounds (#2198) #2262, Integration batch 6: 8 contributor PRs (roadmap test hygiene, crash guards, text-edit routing, EPS hardening, viewer parity) #2284, Shapes: add the Wiggle Transform path operation, which wiggles paths and each Repeater copy #2355, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/render_queue.rs(21): Make sRGB transfer tags optional for ProRes exports #464, perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856, Shortcuts: default keys shared between a panel and the application [skip ci] #1270, Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, project: output_size never asks for sides past the comp limit #1568, Fix #1743: protect render outputs from replacing project sources #1758, Audio: honor Time Remap in preview and export #1827, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Add cross-platform hardware video encoding to EffectCraft #1840, Preserve existing exports until rendering succeeds and confirm overwrites #1922, Export: animated WebP output (lossy VP8 or lossless, with alpha) #2258, Export: add 16-bpc uncompressed QuickTime intermediates #2424, Export: Targa (.tga) sequence output, 24-bit RGB or 32-bit RGB + Alpha #2476crates/engine/src/commands/frontend.rs(15): Window ▸ AI Chat: a chat panel for local models and bridged agents #802, Console Effect: a built-in keyboard launcher for effects and presets (Ctrl+Space) #918, feat(ui): Effect Console (Ctrl+Space) to search and apply effects and presets at the pointer #1105, Shortcuts: default keys shared between a panel and the application [skip ci] #1270, Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, iOS: add initial native UIKit and Metal port #1401, Add in-app updates with verified downloads and coordinated restart #1671, feat(ui): Effect Console (Ctrl+Space) to search and apply effects and presets at the pointer #1983crates/engine/src/commands/layer_menu.rs(13): Shortcuts: default keys shared between a panel and the application [skip ci] #1270, Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Timeline: parent and matte selected layers together (#1260) #1291, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Reveal in Explorer selects the file in the file manager instead of opening the browser (#1961) #1970, Improve mask bounds and shared mask/shape path editing #1978, comp.deleteAllMarkers: add Delete All Markers for composition markers #2169crates/engine/src/commands/edit.rs(11): Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Clipboard: export keyframes as After Effects-compatible text #1921, Improve mask bounds and shared mask/shape path editing #1978, Fix #2091 copy/paste masks between layers #2216, Edit: duplicating during a text edit ends the edit (#2226) #2266, Text: duplicate ends the open text edit and selects the copy (#2226) #2268, Integration batch 6: 8 contributor PRs (roadmap test hygiene, crash guards, text-edit routing, EPS hardening, viewer parity) #2284crates/engine/src/commands/nav_more.rs(10): Shortcuts: panel and context scopes, one chord per scope #1266, Shortcuts: default keys shared between a panel and the application [skip ci] #1270, Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304crates/engine/src/commands/comp.rs(9): Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, comp.deleteAllMarkers: add Delete All Markers for composition markers #2169crates/engine/src/commands/effect.rs(8): Plug-ins: external effect helpers (safe, out-of-process native effects) + plug-in API 2 #889, Add Swap Colors to Gradient Ramp #1749, Clipboard: export keyframes as After Effects-compatible text #1921, Fix #1747: keep collapsed precomp instance overrides unclipped #1951, Support selecting all effects with Ctrl+A in Effect Controls #2170, Fix #2091 copy/paste masks between layers #2216, MCP: get_property and get_layer list an enum property's options (#2085) #2236, Animation presets: anchor saved effect keyframes at the playhead #2452crates/engine/src/commands/prop.rs(8): fix(animation): preserve AE keyframe and expression behavior #1574, Puppet: Shift-select several pins in the Timeline and edit them together #1755, Keep exact sub-frame key times for script setValueAtTime/addKey #1848, Keyframes: mute keyframes without deleting them (#1894) #1895, Fix #1747: keep collapsed precomp instance overrides unclipped #1951, Improve mask bounds and shared mask/shape path editing #1978, Offset all selected keyframes when a value is edited on one of them (#1963) #2007, MCP: get_property and get_layer list an enum property's options (#2085) #2236crates/engine/src/commands/paint.rs(7): Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304crates/engine/src/commands/viewer_cmds.rs(7): Reduce preview and cache resource pressure #885, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Improve mask bounds and shared mask/shape path editing #1978crates/engine/src/commands/animation.rs(6): #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, Cineon Converter: Gamma 1 gives linear output and saved projects keep their render #2312, Animation presets: effects saved by an earlier version are upgraded on apply, as in a project #2336, Animation presets: anchor saved effect keyframes at the playhead #2452, Fixes: macOS quit crash, soft shadow jitter, Interpret Footage params, preset upgrade, composition proxies, font menu names #2466, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/essential.rs(6): Project files: compact .ecproj JSON, with a setting for indented files #1094, Templates: refuse ids that would collide instead of merging items (#1229) #1337, Templates: extract media only inside the template's media folder (#1227) #1343, Templates: a confined export packs only footage inside the read roots (#1228) #1346, Superseded: one pull request per remaining bug #1408, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829crates/engine/src/commands/proxy.rs(6): Fix #1743: protect render outputs from replacing project sources #1758, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Interpret Footage: Cineon Settings convert DPX and Cineon log scans #2300, Interpret Footage: the params docs list every key the commands read #2309, Fixes: macOS quit crash, soft shadow jitter, Interpret Footage params, preset upgrade, composition proxies, font menu names #2466, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/query.rs(6): feat(mcp): structured results, resource templates, prompts, notifications, progress and cancel, get_layout, analyze_audio #1225, Media: enable AVI import across supported entry points #1739, Report the build's git commit inapp.capabilitiesandeffectcraft-cli info#1860, Physical Glow: energy-conserving power-law glow on CPU and GPU (#1845) #2154, Add RGB Split, Halftone, Pixel Sort and Dither (Stylize) #2233, MCP: get_property and get_layer list an enum property's options (#2085) #2236crates/engine/src/commands/roto_cmds.rs(6): Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Roto Brush: follow the object with SAM 2.1 (Tiny, Small, Base+, Large; optional models) #1539crates/engine/src/commands/scripts.rs(6): Scripts: system file dialogs, progress with Window.update(), and File ▸ Import ▸ Converted Project… #1554, Scripts: the Startup and Shutdown folders run at launch and quit #2279, Scripts: subfolders of the Scripts and ScriptUI Panels folders become submenus #2289, Scripts: Recent Script Files lists the last ten scripts and Cmd+Alt+Shift+D reruns the newest #2291, Scripts: File ▸ Scripts entries take keyboard shortcuts #2356, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/comp_more.rs(5): Fix #1743: protect render outputs from replacing project sources #1758, fix(engine): preserve alpha channel when saving still PNG frames #1820, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Scale Composition: comp.scale resizes a comp and scales its layers, keys, cameras and guides by one factor #2248crates/engine/src/commands/file.rs(5): feat(aep): Initial native After Effects (.aep / .aepx) project decoder and import (Early Stage) (#190) #251, feat(aep): import After Effects projects through an external py-aep converter #860, Project files: compact .ecproj JSON, with a setting for indented files #1094, Wire EffectCraft to CollabCraft for Open, Save, Share, and invite open #1623, Agents over the bridge:file.import {alpha}and modal dialogs that report themselves #1859crates/engine/src/commands/paths.rs(5): Improve mask bounds and shared mask/shape path editing #1978, Viewer: AE-style point editing; pick whips act on the selection #2111, Shapes: add the Wiggle Transform path operation, which wiggles paths and each Repeater copy #2355, Fix #2201: one undo reverts a whole mask free-transform drag #2426, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/shape_tool.rs(5): feat(shapes): path marquees, Reverse Path Direction, Round Corners, Layer Contents and per-shape SVG rasterising #1107, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, UI: double-clicking a creation tool in the Tools bar makes an instance (#1072) #1654, Improve mask bounds and shared mask/shape path editing #1978crates/engine/src/commands/app_more.rs(4): #804: hardware video decoding (NVDEC / VA-API / VideoToolbox / Media Foundation) via filmcraft-platform #819, Project files: compact .ecproj JSON, with a setting for indented files #1094, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, Reveal in Explorer selects the file in the file manager instead of opening the browser (#1961) #1970crates/engine/src/commands/batch.rs(4): Batches: a rollback restores the whole document; refuse what it can't undo (#1232) #1358, Superseded: one pull request per remaining bug #1408, Scripts: the Startup and Shutdown folders run at launch and quit #2279, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/footage_panel.rs(3): Media: enable AVI import across supported entry points #1739, Interpret Footage: Cineon Settings convert DPX and Cineon log scans #2300, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/import_project.rs(3): Project: refuse a file whose id counter is exhausted (#1251) #1323, Templates: refuse ids that would collide instead of merging items (#1229) #1337, Superseded: one pull request per remaining bug #1408crates/engine/src/commands/mask.rs(3): Pen tool: hold S/L/D/I while closing a mask to set its mode #949, Superseded: one pull request per remaining bug #1408, Improve mask bounds and shared mask/shape path editing #1978crates/engine/src/commands/prop_groups.rs(3): Timeline: move shape contents between groups and expose Path timing graphs #1352, Improve mask bounds and shared mask/shape path editing #1978, Fix #2091 copy/paste masks between layers #2216crates/engine/src/commands/settings.rs(3): #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, Scripts: File ▸ Scripts entries take keyboard shortcuts #2356, Startup and shortcut scripts, Cineon Settings and Gamma, Wiggle Transform #2471crates/engine/src/commands/three_d.rs(3): 3D rotation order, keyed Orientation, linear-to-eased keyframes, Timewarp and image-sequence gaps behave as in After Effects #1876, Fix #1747: keep collapsed precomp instance overrides unclipped #1951, Light Environment lights: default environment, Casts Shadows, Advanced 3D switch #2474crates/engine/src/commands/timeline.rs(3): perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856, Audio: honor Time Remap in preview and export #1827, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829crates/engine/src/commands/content_fill.rs(2): gpu: run Content-Aware Fill's PatchMatch and flow on the GPU #1856, Fix three out-of-memory crashes (Camera Lens Blur, Fast Box Blur, Content-Aware Fill) #2219crates/engine/src/commands/focus.rs(2): fix: bound Classic 3D depth-of-field blur and reject non-finite focus distances (#2092) #2118, Integration batch 6: 8 contributor PRs (roadmap test hygiene, crash guards, text-edit routing, EPS hardening, viewer parity) #2284crates/engine/src/commands/link.rs(2): Expressions: Alt-pickwhip references effect parameters by index (refs #1072) #1385, Viewer: AE-style point editing; pick whips act on the selection #2111crates/engine/src/commands/watch_folder.rs(2): #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830crates/engine/src/commands/anim.rs(1): Clipboard: export keyframes as After Effects-compatible text #1921crates/engine/src/commands/anim_presets.rs(1): #1510: Behaviors animation presets (22 original, expression-driven) #1513crates/engine/src/commands/camera_cmds.rs(1): Add Blender scene export for the 3D Camera Tracker #2442crates/engine/src/commands/create.rs(1): layer.create: implement the instance3d op - a 2D copy of a 3D model layer (#2100) #2410crates/engine/src/commands/expr_tools.rs(1): Expressions: cubic-Bezier easing helper (bezier(...)) (#1884) #1887crates/engine/src/commands/frame_export.rs(1): #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829crates/engine/src/commands/help.rs(1): Feat/settings search and updates #981crates/engine/src/commands/keys_more.rs(1): Audio: honor Time Remap in preview and export #1827crates/engine/src/commands/layer_time.rs(1): Fix #1747: keep collapsed precomp instance overrides unclipped #1951crates/engine/src/commands/lottie.rs(1): #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829crates/engine/src/commands/markers.rs(1): #1417: WAV markers show on the audio layer #1423crates/engine/src/commands/mask_interp.rs(1): Clipboard: export keyframes as After Effects-compatible text #1921crates/engine/src/commands/model3d.rs(1): Light Environment lights: default environment, Casts Shadows, Advanced 3D switch #2474crates/engine/src/commands/path_nulls.rs(1): Fix #1747: keep collapsed precomp instance overrides unclipped #1951crates/engine/src/commands/puppet.rs(1): Fix #1747: keep collapsed precomp instance overrides unclipped #1951crates/engine/src/commands/rig3d.rs(1): Fix #1747: keep collapsed precomp instance overrides unclipped #1951crates/engine/src/commands/shape_stroke.rs(1): feat(shapes): path marquees, Reverse Path Direction, Round Corners, Layer Contents and per-shape SVG rasterising #1107crates/engine/src/commands/styles.rs(1): Layer Styles: changed Blending Options outlive the last style and only pixel-changing styles block a clip export (#1389) #1601crates/engine/src/commands/text_anim.rs(1): Scripts: text animator properties resolve by their After Effects names (refs #1063) #1164crates/engine/src/commands/track.rs(1): Tracking: bound feature/search sizes, coordinates and candidate selection inside the tracker #1374crates/engine/src/commands/view.rs(1): #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829crates/engine/src/commands/vr_editor.rs(1): 3D rotation order, keyed Orientation, linear-to-eased keyframes, Timewarp and image-sequence gaps behave as in After Effects #1876refactor(effects): move src/distort3.rs tests to src/distort3/tests.rs: 1 PRs
crates/effects/src/distort3.rs(1): Distort: keep CC Blobbylize matte through Softness and Cut Away #1965refactor(effects): move src/generate2.rs tests to src/generate2/tests.rs: 1 PRs
crates/effects/src/generate2.rs(1): perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856refactor(effects): move src/sim.rs tests to src/sim/tests.rs: 4 PRs
crates/effects/src/sim.rs(4): Particles: preserve emitted particles when Birth Rate changes (#1373) #1382, Particles: CC Particle Systems II and CC Mr. Mercury keep emitted particles when Birth Rate changes (#1373) #1390, fix(effects): let CC Particle World's Textured Square use a Texture Layer #1610, Fix legacy CC particle compositing (#1898) #2222refactor(engine): move src/offload.rs tests to src/offload/tests.rs: 4 PRs
crates/engine/src/offload.rs(4): Superseded: one pull request per remaining bug #1408, gpu: run Content-Aware Fill's PatchMatch and flow on the GPU #1856, Preserve existing exports until rendering succeeds and confirm overwrites #1922, Fix three out-of-memory crashes (Camera Lens Blur, Fast Box Blur, Content-Aware Fill) #2219refactor(engine): move src/remote.rs tests to src/remote/tests.rs: 1 PRs
crates/engine/src/remote.rs(1): GPU: free effect working textures after each call instead of at frame end #1523refactor(host): move src/lib.rs tests to src/tests.rs: 7 PRs
crates/host/src/lib.rs(7): perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856, Plug-ins: external effect helpers (safe, out-of-process native effects) + plug-in API 2 #889, Audio: honor Time Remap in preview and export #1827, #1743, part 2: commands that write to a path never replace footage, a proxy or the project file #1829, #1743, part 3: two Render Queue outputs never write the same file, and default names avoid the queue's other outputs #1830, Preserve existing exports until rendering succeeds and confirm overwrites #1922, Fix #1747: keep collapsed precomp instance overrides unclipped #1951refactor(keyframe): move src/lib.rs tests to src/tests.rs: 9 PRs
crates/keyframe/src/lib.rs(9): feat(aep): import After Effects projects through an external py-aep converter #860, Keyframes: two identical Position keys hold instead of detouring (#1196, #1197) #1262, Timeline: move shape contents between groups and expose Path timing graphs #1352, fix(animation): preserve AE keyframe and expression behavior #1574, 3D rotation order, keyed Orientation, linear-to-eased keyframes, Timewarp and image-sequence gaps behave as in After Effects #1876, Keyframes: mute keyframes without deleting them (#1894) #1895, Negate temporal ease speeds in time_reverse #1949, Ease a roving span as one curve between its fixed keys #1984, Text: add stroke Line Join (Miter / Round / Bevel) #2089refactor(text): move src/fonts.rs tests to src/fonts/tests.rs: 15 PRs
crates/text/src/fonts.rs(15): Fonts: use craft-fonts as an optional build input #132, Add German panel and dialog translations #666, perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856, feat(aep): import After Effects projects through an external py-aep converter #860, UI: Rescan Fonts in the font menu; assert the Linux system scan (#1089) #1298, M7: separate portable font discovery from native host checks #1591, M7: discover deep font libraries without recursive calls #1592, web: add fixed cache policy builds and a licensed CJK fallback #1621, Makecargo xtask cipass on Windows #1864, test(text): isolate metric-font fallback tests from host fonts #1890, fix(text): refresh cached layouts after font registration #1972, Text: Chinese Han text uses the installed Chinese face (#453) #2039, tests: count variable font named instances as styles (#2072) #2109, Integration batch 6: 8 contributor PRs (roadmap test hygiene, crash guards, text-edit routing, EPS hardening, viewer parity) #2284, Fonts: read the interface's installed fallback faces when text needs them, and hold each once (271 → 140 MB at idle on macOS) #2425refactor(text): move src/layout.rs tests to src/layout/tests.rs: 6 PRs
crates/text/src/layout.rs(6): perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856, feat(aep): import After Effects projects through an external py-aep converter #860, Text: language-aware All Caps (Turkish İ) and multi-character capitals #1858, Text lays out as in After Effects: box text baseline, right-to-left text, Justify All, animator tracking, per-character 3D rotation #1875, fix(text): refresh cached layouts after font registration #1972, Text: Chinese Han text uses the installed Chinese face (#453) #2039refactor(ui-egui): move src/frames.rs tests to src/frames/tests.rs: 8 PRs
crates/ui-egui/src/frames.rs(8): fix: crash and hang fixes from fuzzing, Puppet overlay off the UI thread, memory release on open, CLI and test fixes #855, perf: faster effects, expressions, text, caches, movie reading, project open, export and UI playback #856, Reduce preview and cache resource pressure #885, Markers: adding one during playback no longer stops the audio (#1083, #1085) #1092, #595: RAM preview no longer stalls on a gap right after the playhead #1121, GPU: contain frame-local validation failures (refs #1319) #1326, iOS: add initial native UIKit and Metal port #1401, GPU: free effect working textures after each call instead of at frame end #1523refactor(ui-egui): move src/menus.rs tests to src/menus/tests.rs: 50 PRs
crates/ui-egui/src/menus.rs(50): feat(aep): Initial native After Effects (.aep / .aepx) project decoder and import (Early Stage) (#190) #251, UI: Add appearance styles aligned with PhotoCraft #400, feat(aep): import After Effects projects through an external py-aep converter #860, Plug-ins: external effect helpers (safe, out-of-process native effects) + plug-in API 2 #889, Add bounded Sony ARW sensor import (A7R IV / ARW2) #894, Console Effect: a built-in keyboard launcher for effects and presets (Ctrl+Space) #918, Feat/settings search and updates #981, feat(design): native Figma transfer and FigCraft copy/paste #1103, feat(ui): Effect Console (Ctrl+Space) to search and apply effects and presets at the pointer #1105, Shortcuts: panel and context scopes, one chord per scope #1266, Shortcuts: default keys shared between a panel and the application [skip ci] #1270, Shortcuts: main-keyboard keys for the numeric-keypad shortcuts on macOS [skip ci] #1273, Shortcuts: text formatting, mask mode and paint keys in their contexts [skip ci] #1276, Shortcuts editor: Undo, Clear, drag to assign, clickable conflicts, double presses [skip ci] #1277, Docs: where the keyboard shortcuts stand [skip ci] #1278, Shortcuts: snapshot slots, numbered markers, momentary tools and the smaller missing keys [skip ci] #1286, Shortcuts: Cmd+T puts the free-transform box around the selected mask [skip ci] #1296, Menus: a pointer coming back into the window over another title switches menus (#1290) #1297, Shortcuts: the keys of a shape being dragged out, Cmd+T on a shape path [skip ci] #1300, Shortcuts: the arrow keys move the track point pressed in the viewer [skip ci] #1304, Composition Mini-Flowchart: Tab from the Timeline and viewer, focus navigation with every branch, as in After Effects #1338, Accessibility (gap 25): an AccessKit audit test; names, roles and keyboard operation for Effects & Presets, Settings and Render Queue #1339, Accessibility (gap 25), slice 2: Info, Flowchart, Script Console and the 3D Camera Tracker block named, described and keyboard-operable (builds on #1339) #1341, Graph Editor: share keyframe menus and close the Render Queue with Cmd+W #1342, iOS: add initial native UIKit and Metal port #1401, #1436: settings dialogs preview live and leave the window undimmed (Gradient Editor, Solid, Camera, Light, Composition) #1439, Android arm64 port: in-app file browser with view modes, touch input, and the fixes it surfaced #1508, #1623, #1671, #1739, #1829, #1830, #1921, #1922, #1951, #1978, #1983, #2030, #2170, #2216, #2250, #2263, #2284, #2289, #2291, #2356, #2366, #2442, #2471, #2490refactor(ui-egui): move src/panels/timeline.rs tests to src/panels/timeline/tests.rs: 34 PRs
crates/ui-egui/src/panels/timeline.rs(34): #400, #855, #995, #1107, #1226, #1291, #1314, #1336, #1352, #1370, #1385, #1581, #1600, #1755, #1772, #1821, #1844, #1895, #1951, #1978, #1980, #1981, #2047, #2111, #2230, #2236, #2253, #2254, #2256, #2270, #2277, #2281, #2355, #2471refactor(ui-egui): move src/panels/viewer_text.rs tests to src/panels/viewer_text/tests.rs: 10 PRs
crates/ui-egui/src/panels/viewer_text.rs(10): #1276, #1277, #1278, #1286, #1296, #1300, #1304, #1370, #2268, #2284refactor(engine): move tests_.rs files to src/tests/, tests.rs content to tests/session.rs: 107 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/tests_settings.rs(21): #802, #885, #981, #1094, #1224, #1266, #1270, #1273, #1276, #1277, #1278, #1286, #1296, #1300, #1304, #1340, #1408, #1508, #1541, #2365, #2366crates/engine/src/tests_menu_cmds.rs(11): #802, #855, #860, #1336, #1895, #1978, #1980, #2042, #2216, #2262, #2284crates/engine/src/tests_effects.rs(9): #1094, #1749, #2170, #2222, #2312, #2336, #2452, #2466, #2471crates/engine/src/session_settings.rs(8): #819, #855, #856, #918, #1408, #1729, #2356, #2471crates/engine/src/tests_proxy.rs(6): #1359, #2300, #2309, #2352, #2466, #2471crates/engine/src/tests_shortcut_cmds.rs(6): #1278, #1286, #1296, #1300, #1304, #1737crates/engine/src/tests_viewer.rs(6): #885, #1300, #1304, #1408, #1654, #1978crates/engine/src/rq_tests.rs(5): #464, #1922, #2258, #2424, #2476crates/engine/src/tests_timeline.rs(5): #949, #1342, #1385, #1574, #1984crates/engine/src/tests_essential.rs(4): #1337, #1343, #1408, #1951crates/engine/src/tests_m145.rs(4): #1970, #2291, #2424, #2471crates/engine/src/tests_tail.rs(4): #1107, #1858, #2118, #2284crates/engine/src/tests_text_edit.rs(4): #2109, #2266, #2268, #2284crates/engine/src/tests.rs(3): #1342, #2089, #2450crates/engine/src/tests_disk_cache.rs(3): #855, #885, #1092crates/engine/src/tests_roto.rs(3): #855, #1539, #1804crates/engine/src/tests_stubs.rs(3): #1874, #1978, #2426crates/engine/src/tests_import_project.rs(2): #1323, #1408crates/engine/src/tests_limits.rs(2): #1323, #1408crates/engine/src/tests_panels.rs(2): #1739, #2219crates/engine/src/tests_rig3d.rs(2): #1165, #1951crates/engine/src/tests_anim_presets.rs(1): #1513crates/engine/src/tests_codec_options.rs(1): #1840crates/engine/src/tests_essential_more.rs(1): #1710crates/engine/src/tests_frame_export.rs(1): #1820crates/engine/src/tests_markers.rs(1): #2169crates/engine/src/tests_mask_warp.rs(1): #1408crates/engine/src/tests_models.rs(1): #1539crates/engine/src/tests_paint.rs(1): #1755crates/engine/src/tests_sequence.rs(1): #2107crates/engine/src/tests_styles.rs(1): #1601crates/engine/src/tests_3d.rs(1): #2474crates/engine/src/tests_track.rs(1): #1374refactor(gpu): move loose test files to src/tests/: 26 PRs
crates/gpu/src/lib.rs(10): #1326, #1441, #1523, #1550, #1571, #1631, #1632, #1706, #1840, #1856crates/gpu/src/tests.rs(8): #1326, #1441, #1490, #1523, #1571, #1705, #1801, #1873crates/gpu/src/tests_fx_stylize.rs(4): #1490, #1599, #1836, #2154crates/gpu/src/tests_3d.rs(3): #1571, #1918, #2463crates/gpu/src/tests_adv3d.rs(2): #1951, #2474crates/gpu/src/tests_init.rs(2): #1224, #1571crates/gpu/src/tests_particles.rs(2): #1382, #1390crates/gpu/src/tests_adjust.rs(1): #2154crates/gpu/src/tests_fx_key.rs(1): #1583crates/gpu/src/tests_fx_transition.rs(1): #1965refactor(render): move loose test files to src/tests/: 35 PRs
crates/render/src/lib.rs(28): #819, #856, #889, #1279, #1382, #1390, #1400, #1441, #1505, #1523, #1631, #1632, #1710, #1739, #1801, #1827, #1853, #1856, #1874, #1951, #1956, #1978, #2012, #2300, #2352, #2410, #2466, #2471crates/render/src/tests.rs(8): #701, #1382, #1390, #1421, #1505, #1632, #2039, #2284crates/render/src/tests_mask_expansion.rs(2): #1853, #1974crates/render/src/tests_styles.rs(2): #860, #1103crates/render/src/tests_audio_fx.rs(1): #1827crates/render/src/tests_remap.rs(1): #889crates/render/src/tests_roi.rs(1): #2012crates/render/src/tests_time.rs(1): #1951refactor(script): move loose test files to src/tests/: 17 PRs
crates/script/src/tests.rs(9): #1107, #1164, #1380, #1848, #1858, #1980, #2355, #2450, #2471crates/script/src/lib.rs(4): #1554, #1574, #2279, #2471crates/script/src/tests_services.rs(3): #1164, #1359, #1380crates/script/src/tests_ui_more.rs(2): #1224, #1951crates/script/src/tests_ease_presets.rs(1): #1876crates/script/src/tests_panels.rs(1): #2289crates/script/src/tests_ui.rs(1): #1554refactor(pdf): move loose test files to src/tests/: 3 PRs
crates/pdf/src/tests_import.rs(2): #2247, #2284crates/pdf/src/tests.rs(1): #855refactor(engine): move tracking, camera_track, mask_track, warp, roto, models to analysis/: 39 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/tracking.rs(3): #1951, #2300, #2471crates/engine/src/models.rs(1): #1539crates/engine/src/roto.rs(1): #1539crates/engine/src/warp.rs(1): #2347refactor(engine): move prefs, session_settings, config, shortcuts, autosave to settings/: 85 PRs
crates/ui-egui/src/i18n/ui.rs(37): #666, #802, #819, #981, #1150, #1289, #1291, #1298, #1336, #1340, #1418, #1508, #1514, #1515, #1529, #1541, #1581, #1772, #1774, #1775, #1779, #1829, #1830, #1974, #1978, #1980, #1981, #2000, #2054, #2230, #2253, #2281, #2343, #2366, #2422, #2427, #2442crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/prefs.rs(22): #400, #802, #819, #885, #981, #1094, #1150, #1281, #1287, #1340, #1401, #1508, #1515, #1529, #1541, #1779, #2000, #2291, #2365, #2366, #2369, #2471crates/engine/src/shortcuts.rs(13): #1266, #1270, #1273, #1276, #1277, #1278, #1286, #1296, #1300, #1304, #2291, #2356, #2471crates/engine/src/session_settings.rs(8): #819, #855, #856, #918, #1408, #1729, #2356, #2471crates/engine/src/config.rs(2): #1408, #2289crates/engine/src/autosave.rs(1): #1408refactor(engine): move doc_path, footage_check, footage_reload, sequence, media_browser, media_cache to footage/: 41 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/doc_path/tests.rs(3): #1864, #1970, #1978crates/engine/src/footage_reload.rs(2): #1969, #2369crates/engine/src/media_browser.rs(2): #894, #1739crates/engine/src/footage_check.rs(1): #464crates/engine/src/sequence.rs(1): #894refactor(engine): move psd_import, vector, xml_project to interchange/: 36 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/psd_import.rs(1): #860crates/engine/src/vector.rs(1): #860refactor(engine): move learn, templates, demo, links to home/: 37 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/demo.rs(1): #860crates/engine/src/templates.rs(1): #1094refactor(engine): move jobs, offload, remote to background/: 40 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/offload.rs(4): #1408, #1856, #1922, #2219crates/engine/src/jobs.rs(1): #1225crates/engine/src/remote.rs(1): #1523refactor(engine): move guard, logging, perf, sysinfo, storage to system/: 38 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471crates/engine/src/guard.rs(1): #1224crates/engine/src/logging.rs(1): #1651crates/engine/src/sysinfo.rs(1): #819refactor(engine): move error, services, document state, event, fonts and Session methods out of lib.rs: 36 PRs
crates/engine/src/lib.rs(36): #251, #855, #860, #889, #918, #1103, #1224, #1225, #1278, #1286, #1296, #1300, #1304, #1758, #1829, #1830, #1859, #1860, #1921, #1922, #1970, #1978, #1980, #2007, #2042, #2216, #2222, #2248, #2291, #2300, #2312, #2369, #2410, #2442, #2450, #2471refactor(engine): move settings model, page types and schema to settings/prefs/*.rs: 37 PRs
crates/ui-egui/src/i18n/ui.rs(37): #666, #802, #819, #981, #1150, #1289, #1291, #1298, #1336, #1340, #1418, #1508, #1514, #1515, #1529, #1541, #1581, #1772, #1774, #1775, #1779, #1829, #1830, #1974, #1978, #1980, #1981, #2000, #2054, #2230, #2253, #2281, #2343, #2366, #2422, #2427, #2442refactor(render): move footage, effect host, accelerators, options, pipeline, layers and frames out of lib.rs: 28 PRs
crates/render/src/lib.rs(28): #819, #856, #889, #1279, #1382, #1390, #1400, #1441, #1505, #1523, #1631, #1632, #1710, #1739, #1801, #1827, #1853, #1856, #1874, #1951, #1956, #1978, #2012, #2300, #2352, #2410, #2466, #2471refactor(project): move settings, comp, layer, footage and item types out of lib.rs: 13 PRs
crates/project/src/lib.rs(13): #860, #1092, #1094, #1323, #1408, #1423, #1739, #1969, #2222, #2236, #2300, #2312, #2471refactor(ui-egui): move Effect Controls panel parts to panels/effect_controls/*.rs: 50 PRs
crates/ui-egui/src/i18n/ui.rs(37): #666, #802, #819, #981, #1150, #1289, #1291, #1298, #1336, #1340, #1418, #1508, #1514, #1515, #1529, #1541, #1581, #1772, #1774, #1775, #1779, #1829, #1830, #1974, #1978, #1980, #1981, #2000, #2054, #2230, #2253, #2281, #2343, #2366, #2422, #2427, #2442crates/ui-egui/src/panels/effect_controls.rs(16): #400, #889, #1226, #1314, #1328, #1370, #1581, #1749, #1772, #1821, #1951, #2170, #2254, #2277, #2280, #2281refactor(ui-egui): move lifecycle_tests to lifecycle_tests.rs: 53 PRs
crates/ui-egui/src/lib.rs(53): #400, #802, #855, #856, #885, #918, #981, #1105, #1121, #1177, #1266, #1270, #1273, #1276, #1277, #1278, #1286, #1296, #1298, #1300, #1304, #1328, #1338, #1339, #1341, #1401, #1439, #1508, #1515, #1554, #1623, #1671, #1762, #1827, #1829, #1830, #1859, #1922, #1970, #1978, #1983, #2030, #2162, #2359, #2361, #2364, #2365, #2366, #2368, #2369, #2425, #2466, #2472refactor(ui-egui): move app constructors and eframe::App to app.rs, clock and hooks to their own files, screenshot and playback state to state.rs: 55 PRs
crates/ui-egui/src/lib.rs(53): #400, #802, #855, #856, #885, #918, #981, #1105, #1121, #1177, #1266, #1270, #1273, #1276, #1277, #1278, #1286, #1296, #1298, #1300, #1304, #1328, #1338, #1339, #1341, #1401, #1439, #1508, #1515, #1554, #1623, #1671, #1762, #1827, #1829, #1830, #1859, #1922, #1970, #1978, #1983, #2030, #2162, #2359, #2361, #2364, #2365, #2366, #2368, #2369, #2425, #2466, #2472crates/ui-egui/src/state.rs(5): #802, #1304, #1338, #1821, #2047refactor(ui-egui): move menu commands, dispatch, entries, shortcuts and the menu bar to menus/*.rs: 80 PRs
crates/ui-egui/src/menus.rs(50): #251, #400, #860, #889, #894, #918, #981, #1103, #1105, #1266, #1270, #1273, #1276, #1277, #1278, #1286, #1296, #1297, #1300, #1304, #1338, #1339, #1341, #1342, #1401, #1439, #1508, #1623, #1671, #1739, #1829, #1830, #1921, #1922, #1951, #1978, #1983, #2030, #2170, #2216, #2250, #2263, #2284, #2289, #2291, #2356, #2366, #2442, #2471, #2490crates/ui-egui/src/i18n/ui.rs(37): #666, #802, #819, #981, #1150, #1289, #1291, #1298, #1336, #1340, #1418, #1508, #1514, #1515, #1529, #1541, #1581, #1772, #1774, #1775, #1779, #1829, #1830, #1974, #1978, #1980, #1981, #2000, #2054, #2230, #2253, #2281, #2343, #2366, #2422, #2427, #2442refactor(ui-egui): move viewer tests to panels/viewer/tests.rs: 24 PRs
crates/ui-egui/src/panels/viewer.rs(24): #400, #855, #856, #949, #1036, #1107, #1287, #1289, #1300, #1304, #1342, #1370, #1581, #1739, #1772, #1821, #1851, #1911, #1951, #1978, #2111, #2255, #2270, #2284refactor(ui-egui): move viewer frame, geometry, gestures, shapes, tools and view parts to panels/viewer/*.rs: 57 PRs
crates/ui-egui/src/i18n/ui.rs(37): #666, #802, #819, #981, #1150, #1289, #1291, #1298, #1336, #1340, #1418, #1508, #1514, #1515, #1529, #1541, #1581, #1772, #1774, #1775, #1779, #1829, #1830, #1974, #1978, #1980, #1981, #2000, #2054, #2230, #2253, #2281, #2343, #2366, #2422, #2427, #2442crates/ui-egui/src/panels/viewer.rs(24): #400, #855, #856, #949, #1036, #1107, #1287, #1289, #1300, #1304, #1342, #1370, #1581, #1739, #1772, #1821, #1851, #1911, #1951, #1978, #2111, #2255, #2270, #2284refactor(effects): split sim.rs into sim/*.rs: 4 PRs
crates/effects/src/sim.rs(4): #1382, #1390, #1610, #2222refactor(pdf): split the PostScript interpreter ps.rs into ps/*.rs: 2 PRs
crates/pdf/src/ps.rs(2): #2247, #2284style: cargo fmt on the moved files: 27 PRs
crates/script/src/tests.rs(9): #1107, #1164, #1380, #1848, #1858, #1980, #2355, #2450, #2471crates/gpu/src/tests.rs(8): #1326, #1441, #1490, #1523, #1571, #1705, #1801, #1873crates/render/src/tests.rs(8): #701, #1382, #1390, #1421, #1505, #1632, #2039, #2284crates/engine/src/tests.rs(3): #1342, #2089, #2450After the freeze
ui-egui/src/panels/timeline.rs(5,045 lines):showis one ~2,200-line function that needs a frame context struct and adraw_rowfirst (a refactor PR, not a move).showinui-egui/src/panels/viewer.rs(1,323 lines) the same way.pub usealiases.tests/menu_cmds.rs,script/src/tests.rs, ui-eguitests/it/ui_text_edit.rsandui_viewer.rs.Other targets
cargo check --tests --target x86_64-pc-windows-msvcand--target aarch64-apple-darwinpass for every touched crate excepteffectcraft-ui-egui, whose dependencyringruns a C build script that needs a cross C toolchain. For Windows,cargo xwin clippy -p effectcraft-ui-egui --all-targets --target x86_64-pc-windows-msvc -- -D warningspasses. On macOS, the OS-specific code in the split ui-egui files iscfg!(target_os = …)expressions, which the Linux build compiles.cargo xtask wasmpasses.pure-move-check
pure-move-check upstream/main..layout: 57 commits ok, 13 with unmatched lines. Every unmatched line in those is one of the edits listed above; none removes a///,//!or#[…]line.include_str!path ini18n/ui.rsinclude_str!path ini18n/ui.rsinclude_str!depthcrate::tests_<x>::paths andinclude_str!depthscrate::tests_deferred::pathinclude_str!path ini18n/ui.rsCONVERTEDrows ini18n/ui.rssuper::paths rewritten tocrate::cmd::…super::paths rewritten tocrate::panels::…, signatures rewrapped afterpub(super),CONVERTEDrowsCONVERTEDrowssuper::paths, signatures rewrapped afterpub(super),CONVERTEDrowscargo fmt --allon its parent