Drop the 6 px added to expression editor rows (and the matching offset in
the drag-to-resize maths), so the row is a whole number of row heights.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rows stripe by their index among the non-expression rows, so adding or
removing an expression leaves every other row's stripe unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
anim.reveal keyframes/animation only matched keyframed top-level properties,
so Time Remap vanished from U once its keys were deleted even though enabling
remapping is itself the modification (and freshly enabled remaps, which get
two keys, kept showing). Match the bare timeRemap prop for both kinds, as
modified already did.
Collapsing and expanding an effect that shows only its revealed parameters
(U, UU) now lists every parameter. The next reveal on the layer filters it
again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Properties panel kept its own ephemeral per-layer link toggle, so
unlinking Scale there left the Timeline linked and vice versa, and its edit
math differed from the Timeline's. Use the shared per-property unlinked set
and widgets::constrained, with the stable match id instead of the display
name, plus Alt-edits-one-axis like the Timeline.
The viewer.nudge shortcuts bailed out unless Composition, Viewer or Timeline
had focus, so with any other panel focused the arrows silently did nothing.
After Effects nudges from almost anywhere; only the Project panel owns the
arrows for its own keyboard navigation. Typing, dialogs, menus and selected
mask vertices still keep the keys.
Tests: arrow nudge from Effect Controls, no nudge from Project, Shift+arrow
10x, time untouched, click-row path.
`interface_symbols_have_a_glyph_in_every_family` (01400f0) is red on main: it asks
`Fonts::has_glyph` per symbol, which answers "does this family resolve `c` to a face other than the
family's replacement face" - and the replacement face is the first in the chain carrying epaint's
PRIMARY_REPLACEMENT_CHAR ('◻'). Inter has neither a replacement glyph nor triangles, so in the
`medium` and `semibold` families that face is the weight face itself: everything it owns (the whole
Latin set, `•`, `›`, `·`, `▶`, `◀`, `●`, `○`, `⚠`, `…`, `×`) came back as "no glyph" and only the
characters it leaves to JetBrains Mono (`▸`) answered true. Rendering is not affected - the atlas
resolves through the same chain and does find the weight face - so the assertion was wrong, not the
fonts: the bundled Inter faces carry ten of the eleven symbols and JetBrains Mono carries all eleven.
The test now asserts what the wiring promises, from the definitions that were installed: each family
draws with its own first face and its chain reaches the symbol fallback.
Verified on Linux (the test is red before and green after) with cargo fmt --all --check and
cargo test -p effectcraft-ui-egui --lib theme::tests.
Right-clicking a footage item or solid in the Project panel offers
"Replace with Precomposition (used N times)": the item goes into a new
composition of its size, pixel aspect and frame rate, in the same folder, and
every layer in every composition that used it switches to that composition,
keeping timing, transforms, effects and masks. One undo step. Agents run it as
`file.replaceWithPrecomp`.
The Project panel's details header also shows how often the selected item is
used ("Name ▾, used 3 times"); the ▾ lists and opens the comps that use it.
`Project::item_users` and the `project.usedIn` query back both.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The modified reveal showed every effect in full. It now compares each effect
with a new instance and reveals the parameters whose value differs, plus the
groups a new instance lacks (puppet meshes and pins, paint strokes). An effect
whose plug-in is missing still shows in full.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The message box's only button is OK, the default; Enter now dismisses it
(back to Settings when opened from there), as Escape already does.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Numpad * always added a composition marker. As in After Effects, it now
adds a layer marker to the selected layers at the current time, and a
composition marker only when no layer is selected.
Right-clicking a layer offered no way to mark it. The layer context menu
now has After Effects' Markers submenu with Add Marker (layer.addMarker,
as Layer ▸ Markers ▸ Add Marker), which marks the right-clicked layer, or
the selection it belongs to, at the current time. The submenu title reuses
the menu catalogs' "Markers" translation in the panel catalogs.
The viewer's Rotation tool wrote start rotation + (atan2 angle now - atan2 angle at
press), so the value jumped a full revolution back whenever the pointer crossed
atan2's ±180° seam (left of the anchor) and could never pass 360°. Sum the
per-frame angle change, wrapped to (-180°, 180°], instead: the value keeps
growing across revolutions in both directions (1x +0.0°, -1x -90.0°…), Shift
snaps the accumulated value to 45°, other selected layers follow, and one drag
is still one undo step. Non-finite angles turn by nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
506 rows, the Chinese catalogs' source list, read by catalog("es");
a test pins it to that list and checks a few lookups.
Models: Opus 5.5, Sol 6.1, DeepSeek V4 Flash
- Renderer: no cover step for adjustment layers (#686); their buffer is the comp below.
Restores a single CPU step in split adjustment stacks.
- Effect Controls rename (#953): focus the name field the frame it exists. Focusing an id
not yet drawn left AccessKit with a focus outside its tree (a panic in the consumer).
The tests double-click at 60 fps, within egui's double-click time.
- i18n: Russian, French and German entries for Copy Frame to Clipboard and the extrusion
Front/Bevel/Side/Back Color submenus added by today's other PRs.
- Tests: "fr" is now a valid language; the marker dialog's comment is focused on open
(#922), so Enter-is-OK is tested with the focus elsewhere; the toolbar gradient tests
give the selected layer its paint kind, since the toolbar mirrors it (#732).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Footage sources: the cancellable wrapper (#784) forwards frame_with (#752 float curves)
and problem (#887); problem's default lives on the trait.
- Media: a called-off decode (#784) is not a footage problem (#887).
- Effect Controls rename (#953): Escape cancels (egui drops focus on Escape the same
frame), the Rename item is translated; regression test.
- i18n (#873): drop the /out-i18n/ ignore rule and the note about an uncommitted script.
- Tests: text range selector caps (#926) re-borrow the layer; the RAM preview test (#793)
sets the comp's own Resolution (#462).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Viewer: each composition keeps its Resolution in the project, as in After Effects (#417)
# Conflicts:
# crates/ui-egui/src/control.rs
# crates/ui-egui/src/menus.rs
# crates/ui-egui/src/panels/viewer_tools.rs