Commit Graph
355 Commits
Author SHA1 Message Date
Claude c742145b28 Merge pull request #631 from Ni-zav/fix/effect-parameter-catalog-s20261010T163100Z-6b8a 2026-10-10 18:51:15 +00:00
Claude 605b7c3a25 Scripting: scripts can't grant themselves file and network access (#590)
A running script reached `prefs.set` through `app.run` and could turn on
Settings > Scripting & Expressions > Allow Scripts to Write Files and Access
Network (or turn off Warn User When Executing Files), which the File, Socket
and system.callSystem gates then read: the permission the user withheld was
the script's to take.

Commands a script issues now go through `Session::execute_for_script`, which
marks the session as running for a script for the command and everything it
runs (engine.batch, ScriptUI callbacks, scheduled tasks). While it is,
`prefs.set` refuses any change that would leave the Application Scripting
settings different (compared on the resulting settings, so dotted keys,
whole-page objects and batches are all covered), and a script's
`prefs.reset` keeps them as the user set them. Command scripts read from a
file (File > Scripts > Run Script File... with .json/.jsonl) count as
scripts too. The UI, CLI, control channel and MCP still change them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 18:50:57 +00:00
Claude 4de11be339 Time: in Frames style a typed number is a frame count (#610 follow-up)
parse_timecode reads bare digits as timecode pairs, so 00100 went to
frame 30 (1 s) instead of frame 100.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 18:50:32 +00:00
Claude 312ece2b5c Merge pull request #610 from vbasky/fix/530-current-time 2026-10-10 18:49:52 +00:00
Claude a9c15f8bbf Merge pull request #623 from MarekSpodBiedry/issue-531 2026-10-10 18:49:51 +00:00
Claude 25adc36e21 Merge remote-tracking branch 'origin/main' into int2 2026-10-10 18:44:27 +00:00
Brandon ThomasandClaude Opus 5.5 1e61b4e04b Progress docs: target-app parity, gaps, alpha gate, readiness by audience (#617)
Progress docs per craftrules standards/progress-docs.md: target-app parity, gaps, roadmap with alpha gate, readiness by audience (full / mainstream / essentials) with Opus 5.5 hours, and feature, format, hardware, UI and localization parity docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 14:09:10 -04:00
MarekSpodBiedry 60a85e97d4 Convert Expression to Keyframes: sort the keys by layer time on a time-reversed layer (#531) 2026-10-10 19:14:28 +02:00
Nigel Ihza Firdausy 4df4d9185b fix(effect): expose parameter metadata in effect.list (#441) 2026-10-10 23:41:07 +07:00
Vikram Bhaskaran 9ae7788f8d Keep the playhead on the frame shown in the current-time field.
Timecode and Frames entries were parsed as absolute counts without the composition Start Timecode or Start Numbering Frames At offset, so committing the displayed text jumped to another frame.
2026-10-11 03:32:01 +11:00
Claude 1429921e5c Merge pull request #585 from itrycodinganditsbad/fix-fractal-reset 2026-10-10 16:29:00 +00:00
Claude bb08a6acc9 Work area: an edit never clamps with crossed bounds (#605 follow-up)
A project saved with an inverted work area, or a comp shorter than a
frame, made Tick::clamp panic on the next start or end edit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 16:28:54 +00:00
Claude 359ad52f99 Merge pull request #607 from vbasky/fix/540-separated-position
# Conflicts:
#	crates/engine/src/tests_menu_cmds.rs
2026-10-10 16:28:09 +00:00
Claude c8c0041c41 Merge pull request #606 from vbasky/fix/539-separated-canvas 2026-10-10 16:28:05 +00:00
Claude 943c42659a Merge pull request #605 from vbasky/fix/538-work-area 2026-10-10 16:28:05 +00:00
Claude 616574439e Integrate community PRs: relink's params doc and menu rows, pt-BR in the language list, MCP docs, test fixes
- file.relinkFootage (#461): close the params doc so checked execution
  (MCP, control channel) rejects unknown keys; translate its menu entry.
- general.language lists Português (Brasil) (#217).
- docs/agents.md: set_property / add_keyframe take timeBase (#522).
- #299's MCP test no longer sends get_property a value.
- The Automatically Reload Footage sequence test uses PNG frames.
- h264_frames_at_reduced_sizes (#507): the bar depends on the fixture's
  encoder; 50 dB with ffmpeg 6.1's x264.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 15:15:11 +00:00
Claude 195b862036 Text: layer.setText's schema accepts discretionaryLigatures and ss01–ss20 under checked execution (#521 follow-up)
The params parser reads ':' as the start of a value, so 'OpenType?:
discretionaryLigatures?' declared a bogus OpenType key and hid
discretionaryLigatures, and 'ss01?…ss20?' declared only ss01.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 12:58:15 +00:00
Claude 9308d8e0f0 Merge pull request #521 from mjohnson7cd/fix-layer-settext-schema-520 2026-10-10 12:57:32 +00:00
Claude 57bd68c86e Import: Automatically Reload Footage is Off / Non-Sequence Footage / All Footage, as in After Effects; a reload never shows disk-cached frames from before (#578 follow-up)
Image sequences are watched only with All Footage (the default,
Non-Sequence Footage, leaves them alone). Purge also forgets the viewer's
per-revision disk keys, which hash footage files' size and time, so a
file reloaded without a new revision is keyed again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 12:53:09 +00:00
Claude a5feb441e9 Merge pull request #499 from tylerjenningsw/enhance/project-shift-delete 2026-10-10 12:51:16 +00:00
Claude b0277f898f Merge pull request #480 from MarekSpodBiedry/issue-476 2026-10-10 12:51:15 +00:00
Claude 072c33ecf0 Merge pull request #558 from haranishi/fix/uninstall-script-name 2026-10-10 12:51:15 +00:00
Claude b7b47a0e10 Merge pull request #443 from Aavirash/fix/shape-drag-preview
# Conflicts:
#	crates/ui-egui/src/frames.rs
#	crates/ui-egui/src/panels/viewer.rs
2026-10-10 12:50:43 +00:00
Claude 5e28ecd53b Merge pull request #578 from KattKnight/footage-reload 2026-10-10 12:50:18 +00:00
Claude b5c6eb7d5e Merge pull request #461 from vbasky/feature/recursive-footage-relink 2026-10-10 12:50:18 +00:00
Claude 82d95d4c72 Merge pull request #299 from DWAA1660/fix/property-group-diagnostic-263 2026-10-10 12:50:18 +00:00
Claude a12242c806 Format the merged community fixes (#561-#566 follow-up)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 12:49:52 +00:00
Claude 20ac6189bc Scripting: Property.selected=false deselects mask and effect groups too (#566 follow-up)
prop.deselect resolved its uid through prop_ref, which only finds leaf
properties, so mask.selected=false threw. Resolve it as prop.select does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f
2026-10-10 12:49:52 +00:00
Claude 45897f0aaf Merge pull request #566 from Ni-zav/fix/548-property-selected-false-s20261010T084400Z-a6e9
# Conflicts:
#	crates/script/src/tests.rs
2026-10-10 12:49:18 +00:00
Claude b96628e154 Merge pull request #565 from Ni-zav/fix/541-locked-resize-height-s20261010T084400Z-a6e9
# Conflicts:
#	crates/engine/src/rq_tests.rs
2026-10-10 12:49:18 +00:00
Claude 6eb386002e Merge pull request #471 from sanyamsingh001/fix/parenting-3d-position 2026-10-10 12:49:17 +00:00
Claude 21a9486d8a Merge pull request #522 from sanyamsingh001/fix/property-key-time-bases 2026-10-10 12:49:17 +00:00
Claude cff0cf390d Merge pull request #524 from sanyamsingh001/fix/key-attribute-selection-order 2026-10-10 12:49:17 +00:00
Claude 380cb16369 Merge pull request #564 from Ni-zav/fix/542-render-queue-settings-template-s20261010T084400Z-a6e9 2026-10-10 12:49:10 +00:00
Fabio LussiandClaude Opus 5.5 00156ce22e Effect reset: restore parameters inside twirl-down groups
effect.reset looked parameters up by their full spec id among the effect's direct
children, so every 'group/param' id (most of Fractal, Scribble, and other grouped
effects) was skipped and Reset did nothing for them. Fixes #526

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 13:57:45 +02:00
KattandClaude Opus 5.5 e6d37c2fa6 Reload Footage shows new pixels and keeps Photoshop layers; Reload Footage Changed on Disk
Reload Footage (Cmd+Alt+L) updated an item's metadata but left the media
pool's decoded frames and the layer cache in place, so the old image kept
rendering until Edit > Purge. It also replaced the footage with a probe of
the merged document, so a Photoshop layer item lost its layer and its
Retain Layer Sizes bounds.

Reload now re-reads only what the file decides (size, a movie's duration,
streams and frame rate, codec, a data file's text), keeps the layer or
page and the interpretation, finds a Photoshop layer again by name, and
makes the media layer forget the file (FootageSource::forget, which also
drops the EXR aux-channel cache) and clears the layer cache.

Settings > Import > Reload Footage Changed on Disk (on by default): the
desktop app stamps footage files (size + modification time) on a worker
thread every two seconds and when the window comes back to the front, and
reloads what changed. Not an undo step and it doesn't modify the project;
a file still being written is retried on the next check.
footage.reloadChanged runs one check (CLI, MCP, agents).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 16:36:50 +05:30
Vikram Bhaskaran 9f53d9c6bc Move separated Position when the composition frame is resized or cropped.
Those edits offset the combined Position property, which a separated layer does not render. X and Y Position, including their keys, now move by the same amount.
2026-10-10 21:47:15 +11:00
Vikram Bhaskaran 39a0c6aa54 Move a layer when Position is edited and its dimensions are separated.
The renderer follows X, Y and Z Position once those channels exist. The Position command was writing only the combined property, so the layer stayed where it was.
2026-10-10 21:42:03 +11:00
Vikram Bhaskaran da67ea9553 Keep a composition work area inside the composition and at least one frame long.
Setting the start past the current end, or shortening the composition, stored an inverted interval. Trimming that interval then saved a negative duration.
2026-10-10 21:38:57 +11:00
Aavirash 0d2264dbed Viewer: the shape tools show the tool's own shape while dragging
The drag preview was a 1 px axis-aligned rectangle for every shape tool,
which read as no preview at all against most comps. Draw the tool's own
path instead (rectangle, rounded rectangle, ellipse, polygon, star), from
the engine's own geometry, filled with the Tools bar's Fill and outlined
in its Stroke, with a caption saying where the shape lands — a mask on
the selected layer, into the selected shape layer, or a new shape layer.

The ghost and the released shape go through one normalisation, so the
drag shows exactly what it commits: Alt (Option) draws from the press
point and Shift squares the box, both live. The drag also starts at the
press point now, not where the 6 px drag threshold was crossed, so the
shape is drawn from where the button went down, as in After Effects.
2026-10-10 12:13:21 +02:00
Nigel Ihza Firdausy 4bc619b010 fix(script): deselect individual properties via Property.selected=false (#548) 2026-10-10 15:58:22 +07:00
Nigel Ihza Firdausy c822fcdff3 fix(render-queue): honor height-only locked resize edits (#541) 2026-10-10 15:57:09 +07:00
Nigel Ihza Firdausy 65bf4702fd fix(render-queue): distinguish settings template on queue creation (#542) 2026-10-10 15:55:02 +07:00
Nigel Ihza Firdausy 9d10d84dee fix(engine): validate text layer position coordinates (#537) 2026-10-10 15:53:14 +07:00
Ikki NishiharaandClaude Sonnet 5.5 78e1c50268 Scripts: a script name is a file name, not a path
file.uninstallScript and script_code joined the name from the request into
Scripts/<name> and handed it to the settings store, so "../.." reached files
outside the settings folder (uninstall deleted them; run-by-name ran them).
Accept only bare file names (and, on Windows, none of its reserved names),
require a .jsx/.js name, and skip refused names in the script list.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 17:50:05 +09:00
sanyamsingh001andCodex 8eb77a7d1e G2: preserve keyframe selection during attribute edits
Co-authored-by: Codex <codex@openai.com>
2026-10-10 13:22:32 +10:00
sanyamsingh001andCodex a7a6295bb0 Issue 257: support explicit keyframe time bases
Co-authored-by: Codex <codex@openai.com>
2026-10-10 11:12:14 +10:00
Mara Johnson 6f0369b3a8 fix(engine): layer.setText schema requires optional OpenType keys (#520)
- Mark OpenType? and ss01? as optional in params doc
- Fix clippy lint: use as_chunks instead of chunks_exact
2026-10-09 20:57:21 -04:00
tylerjenningsw f59acb5b80 Project: Delete Project Items Without Confirmation is a command, on Shift+Delete (#484)
A frontend command (project.deleteWithoutConfirmation) so the shortcut is
listed and rebindable in Keyboard Shortcuts and runs by id over the
control channel and MCP. The UI runs project.delete for it.
2026-10-09 16:24:53 -04:00
MarekSpodBiedry 56cd3f1bf5 Expressions: Add Expression applies to the selected properties (#476) 2026-10-09 21:13:46 +02:00