chore: sync upstream (63 Commits) #11

Merged
alf merged 63 commits from chore/sync-upstream-20261026 into main 2026-10-26 08:40:08 +00:00
Owner

Upstream-Sync von upstream/main (63 Commits). Fast-Forward.

  • 29612588 Merge pull request #2458 from aiongg/comp-tabs
  • d58f1570 Merge pull request #2459 from aiongg/docking-text-keys
  • 5a16de09 Pin craft-libs crates to main 512b5435
  • 99e882f4 Merge remote-tracking branch 'upstream/main' into comp-tabs
  • 0eefbc68 Merge pull request #2432 from aiongg/craft-ui-docking
  • fce4a88c Timeline: comp tabs draw through craft-ui's extra-tabs hook
  • ec32863c Merge branch 'craft-ui-docking' into docking-text-keys
  • 917c44cd Edit menu keys edit a focused text field, docked and in panel windows
  • ca0ff9e9 Merge branch 'craft-ui-docking' into comp-tabs
  • 1c7fbfd5 Timeline: each open comp is a tab in the group's tab row, with an overflow menu
  • 7c776d0b Pin craft-libs crates to main 1e6f1278
  • 6d063fc9 Merge upstream main into craft-ui-docking
  • 938289fa packaging(linux): name the repeated sha256 check (S1192) (#2456)
  • f31a6b0a sonar: optional chaining (S6582) and for-of loops (S4138) in engine-owned JS (#2273)
  • 966719d4 Merge pull request #2443 from WaldemarLehner/ui/resizehorizontal-cursor-on-workarea
Upstream-Sync von `upstream/main` (63 Commits). Fast-Forward. - 29612588 Merge pull request #2458 from aiongg/comp-tabs - d58f1570 Merge pull request #2459 from aiongg/docking-text-keys - 5a16de09 Pin craft-libs crates to main 512b5435 - 99e882f4 Merge remote-tracking branch 'upstream/main' into comp-tabs - 0eefbc68 Merge pull request #2432 from aiongg/craft-ui-docking - fce4a88c Timeline: comp tabs draw through craft-ui's extra-tabs hook - ec32863c Merge branch 'craft-ui-docking' into docking-text-keys - 917c44cd Edit menu keys edit a focused text field, docked and in panel windows - ca0ff9e9 Merge branch 'craft-ui-docking' into comp-tabs - 1c7fbfd5 Timeline: each open comp is a tab in the group's tab row, with an overflow menu - 7c776d0b Pin craft-libs crates to main 1e6f1278 - 6d063fc9 Merge upstream main into craft-ui-docking - 938289fa packaging(linux): name the repeated sha256 check (S1192) (#2456) - f31a6b0a sonar: optional chaining (S6582) and for-of loops (S4138) in engine-owned JS (#2273) - 966719d4 Merge pull request #2443 from WaldemarLehner/ui/resizehorizontal-cursor-on-workarea
alf added 63 commits 2026-10-26 08:40:07 +00:00
The RAM preview keyed every frame by one identity of the whole comp, so any
edit (a cut, a trim, a nudge) made every cached frame a miss and the whole
comp recached. When only some of a comp's layers change, frames outside their
In-Out span now move to the new identity. Settings changes, reorders,
expressions, and edits that reach other layers (parents, track mattes, effect
layer pickers) still recache everything.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Validate the previous content identity using the selected comp's layers
as well as its address. Otherwise a new solid changes the reachable
source set and prevents all frame carry. Read sources removed by undo
from the saved base snapshot, while still checking current values of
existing dependencies, project settings and nested comps.

Add regressions for short-solid add/delete, addition undo/redo, and
simultaneous edits to existing solid or nested-comp dependencies.
Both the addition and undo regressions failed before their fixes.

Validation on macOS:
- Frame-cache tests: 23 passed.
- cargo xtask ci: passed (3452 tests passed, 31 ignored), including
  workspace release Clippy, tests, docs, PDF deps, layers, assets and wasm.
  Local release builds used LTO=false and codegen-units=16; repository
  profile settings are unchanged.
- Release UI driver: cut, move, add and delete; all 15 cache audits pass.
  Adding/deleting a 2-3s solid retains 567/600 frames (only 59-91 recache).
  Undo/redo immediately restores all 600 frames.
- All 4,800 CPU cached-vs-fresh frame comparisons match at Quarter preview
  resolution; four full-comp playback sweeps have zero waiting steps.
Turning Solo on or off hides or shows every other layer at every frame, so it
now recaches the whole comp. The kept span is widened by the comp's shutter
(phase and angle), since a frame's motion blur samples cameras, lights and
transforms up to three frames away. Comp::any_solo is shared with the
renderer so both read Solo the same way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Poison recovery, OsStr::to_str and char predicates only; S4325 casts are
f64 to f32 and stay.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Preview: an edit keeps the cached frames outside the layers it changes (#1641)
Reconcile main 991904888a and preserve the reviewed lifecycle, IME, rendering and lockfile changes.

Formatting, strict lint, layers, assets and WASM passed. Full CI retained 3,961 passes, 14 baseline-matching GPU failures and 31 ignored executions. The local review commit has explicit approval to retain these documented failures; native/browser acceptance and paired app performance remain open.
Every craft-libs crate and the hayro-syntax and hayro-jbig2 patches are
pinned to storytold/craft-libs 2869b8cc. The workspace is a craft-ui
Workspace<PanelKind>: craft-ui draws the frames, tab strips, stacked
panels, floating windows and drop previews and owns the gestures.
EffectCraft keeps PanelKind, its built-in workspaces, the panel bodies,
the Timeline's comp tabs, viewer locks and the panel menu in each group
header, and the rule that no move or float empties the docked area.

window.dockAction applies craft-ui Actions; craft-ui's window.panel.*
commands, ui.dock and ui.dock.reset parse as DockCommand. Saved
workspaces are version 2 snapshots of craft-ui Workspaces; an earlier
file loads as the default layout and is left untouched.
A panel never laid out opens at EffectCraft's default place for it; a
closed panel reopens at its recorded place. The panel menu keeps Move
Panel to New Window, which records the window's place.
A version 1 file (craft-libs 5c874d51) and the unversioned named-workspace record
load with every panel in place, floating groups and their native window places
kept. The first save writes the current format and keeps the earlier file as
workspaces.old.json. The fixture is a file written by upstream main.
craft-ui's native-windows feature is on for every non-wasm build. Keys and
dropped files from a floating window reach the main window's next frame, and
while a modal dialog is open the dock area blocks input in floating windows.
Move Panel to Main Window docks the panel again. The web, Wayland and embedded
viewports keep floating windows in the main window.
Tab and stacked-header automation labels name what the panel shows
("Composition A"), as the tabs do. The top border above a group's tabs,
a craft-ui drag source, registers panel.border.<Panel>, which the agent
audit found without an id.
- Focus and traversal tests use DockArea::hit_id for tabs and dividers; the
  focus outline is checked as craft-ui draws it (inset 2 pt, accent colour)
  while the tab has keyboard focus from traversal.
- Floating resize grips are checked under craft-ui's accessibility label.
- Stack resizes compare rendered heights: craft-ui shares a stack by the
  entries' heights as proportions, so the saved heights are checked as ratios.
- Drops into a split use the side zone depth (SIDE_EDGE_ZONE_DEPTH).
- Panels that need their whole area (scroll audit, automation audit) are
  docked alone: maximizing a stacked panel maximizes its whole stack.
- ui_tabs: dragging by the panel menu button is gone (craft-ui drags by tab,
  drag bar or border); the test docks by the tab. A stacked header's -/+
  button collapses and expands, a click on a closed header opens it; a
  click on an open header no longer collapses it.
- ui_tabs (#302): a panel dropped on a stacked panel joins the stack as its
  own entry below it; craft-ui stack entries hold one panel each.
- ui_panel_focus: a reopened Composition goes back to its own index
  ([Composition, Layer]), craft-ui's restore order.
- ui_menus probes the Effect menu with Remove All, since Effect Controls
  also names a tab.
- Default's right column is a short Preview frame (fixed 76 pt: tab strip and a 46 pt body)
  over a Properties frame with Align, Audio and Effects & Presets as tabs. Essential Graphics'
  right column is one Properties / Effects & Presets frame. No built-in workspace uses
  accordions, so a frame there takes tabs and Maximize acts on one frame.
- Workspace files of version 1: a column of stacked frames becomes tab groups split top to
  bottom. Each open frame keeps all its tabs and its height as a fixed size; a closed frame's
  tabs join the open frame above it.
- Version 1 stored a native panel window's outer position; craft-ui places windows by their
  content. The migrated rect moves by the main window's frame offset once the main window
  reports it, and workspaces are not saved before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On macOS rfd put an unparented sheet on AppKit's main window, which after a
click in a floating panel's OS window is that window. With the sheet holding
the keyboard no app window was focused, so craft-ui hid the floating window,
the sheet ended without answering, and later sheets queued behind it: Save As
flashed and closed, and Cmd-S did nothing after. The commands' dialogs now
open at the end of the frame with the main window as parent (macOS; Linux's
portal dialog stays unparented). While one is up the dock area blocks
floating OS windows, as for a modal dialog, and a dialog that ends without
answering never leaves them blocked.
A failing atomic batch restored the project, history and state but left the
events its steps had already published, so the UI could open the comp the
rollback had just undone. Snapshot the event count with the other snapshots and
truncate before the rollback bumps.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
Migrate EffectCraft to egui 0.37
Integrate `craft-update` pinned to storytold/craft-libs fe61243 to check for
updates on startup, display the standard suite update modal with changelog notes,
and support one-click in-app updating and restart.

Ref: storytold/craft-libs#319
Keeps the worker's failure visible instead of leaving the prompt installing, repaints while a check runs, and no longer calls process::exit past the unsaved-work prompt.
Satisfies cargo-deny: no MPL-2.0 option-ext, no zip 8 advisories, and a versioned git dependency instead of a wildcard.
Startup check is opt-in for the desktop app, the Windows update helper is dispatched before argument parsing, and a successful update closes through the app's own close path.
# Conflicts:
#	Cargo.lock
#	Cargo.toml
#	apps/effectcraft/src/main.rs
#	crates/ui-egui/src/control.rs
#	crates/ui-egui/src/dock.rs
#	crates/ui-egui/src/dock_ui.rs
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/tests/it/shared_docking_ui.rs
#	crates/ui-egui/tests/it/ui_dock_resize.rs
#	crates/ui-egui/tests/it/ui_panel_windows.rs
#	crates/ui-egui/tests/it/ui_workspace_focus.rs
The check at start is opt-in for the desktop app, a successful update closes through the app's own close path, and no update starts over unsaved work.
finish_ime after a body drawn before the Viewer cleared the preedit and
made the Viewer's publication a new context, so a window with another
group before the Viewer interrupted the composition every pass. Each
native window now counts its bodies from the layout and publishes once
its editor has recorded its geometry, or after its last body. A window
that drew fewer bodies than counted publishes after every body in its
next pass.
feat: startup update prompt modal and direct self-updating
Picks up the fix that keeps the close request pending while the app holds unsaved work, the executable-name check in the Windows update helper, and the zip 9 / dirs-free build.

Part of tracking issue storytold/craft-libs#319
build: pin craft-update to craft-libs main (db19c37)
# Conflicts:
#	Cargo.toml
#	crates/ui-egui/Cargo.toml
sonar: method paths instead of closures (rust:S1612)
Picks up the update prompt fix that draws its close mark and version pill
without glyphs a font may lack, so the prompt no longer takes the app down
when a bundled face has no ✕ or →.

Part of tracking issue storytold/craft-libs#319

🤖 Generated with Codebuff

Co-authored-by: Codebuff <noreply@codebuff.com>
Picks up the startup prompt without the glyphs a font may lack (storytold/craft-libs#343, #344): the close mark is painted and the version pill is ASCII, so apps that panic on a missing glyph no longer take the prompt down.

Part of tracking issue storytold/craft-libs#319
serde_json 1.0.154, proptest 1.12.0, objc2 0.6.5, winresource 0.1.34, pollster 1.0.1, miniz_oxide 0.9.1, linesweeper 0.5.0, lz4_flex 0.14.0, muda 0.21.2.
chore(deps): safe dependency refresh
fix(ui-egui): make hover over workarea selector set cursor to `ResizeHorizontal`
ExtendScript .jsx files are left alone (ES3, no ?. or for-of).
Route the four identical sha256sum checks through verify_sha256.
craft-libs crates move to one rev, 37c907d2 (contains main's craft-update and craft-docpath pins).
Docs: native floating windows are Windows, macOS and X11 only; the UI estimate drops the
multi-monitor panel work that is done.
The comp tabs follow the panel tabs and are drawn like them (craft-ui's
tab widget and the dock style's font and colours). The panel tabs keep
their full width; comps without room are listed in a » menu at the end
of the row, and picking one shows it. The shown comp's tab always stays
in the row, and the comp tabs stay while another panel of the group is
shown.
The macOS menu bar takes Cmd+C, Cmd+X, Cmd+V, Cmd+A, Cmd+Z and Shift+Cmd+Z
before any window sees them. The menu only checked the main window's
keyboard focus, so with a text field focused in a floating panel's own OS
window those keys ran Copy, Paste or Undo on the project. The menu now asks
craft-ui which window is typing and sends the field its keys there (the
window fetches the clipboard text for Paste), and keeps the Edit items a
field takes enabled while one has the keyboard: Paste followed the project
clipboard and was greyed out with nothing copied there.
Pin craft-libs crates to 3723e32a, which adds the group extra-tabs hook.
The comp tabs follow the panel tabs directly, with no drag bar between
them, and the group header holds only the lock and the panel menu.
Panels: move onto craft-ui's shared docking
Edit menu keys edit a focused text field, docked and in panel windows
Merge pull request #2458 from aiongg/comp-tabs
Some checks failed
ci.yml / Merge pull request #2458 from aiongg/comp-tabs (pull_request) Failing after 0s
nix.yml / Merge pull request #2458 from aiongg/comp-tabs (pull_request) Failing after 0s
packaging-lint.yml / Merge pull request #2458 from aiongg/comp-tabs (pull_request) Failing after 0s
sonarcloud.yml / Merge pull request #2458 from aiongg/comp-tabs (pull_request) Failing after 0s
ci.yml / Merge pull request #2458 from aiongg/comp-tabs (push) Failing after 0s
nix.yml / Merge pull request #2458 from aiongg/comp-tabs (push) Failing after 0s
packaging-lint.yml / Merge pull request #2458 from aiongg/comp-tabs (push) Failing after 0s
sonarcloud.yml / Merge pull request #2458 from aiongg/comp-tabs (push) Failing after 0s
2961258879
Timeline: each open comp is a tab in the group's tab row, with an overflow menu
alf merged commit 2961258879 into main 2026-10-26 08:40:08 +00:00
alf deleted branch chore/sync-upstream-20261026 2026-10-26 08:40:08 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/effectcraft!11
No description provided.