fix(studio): keep a remounted clip marked active when it stays at the playhead

The structural refresh now force-syncs data-active on freshly queried clip
nodes instead of diffing. A clip that changes lanes on a reorder remounts as
a new DOM node; if it stayed under the playhead the diff skipped it and it
rendered as inactive.
This commit is contained in:
Miguel Angel Simon Sierra
2026-07-08 23:46:29 -04:00
parent eb6a311d82
commit ffd513130b
2 changed files with 35 additions and 4 deletions
@@ -78,6 +78,26 @@ describe("updateTimelineActiveClipClasses", () => {
expect(previous).toEqual(new Set());
});
it("re-applies data-active to a fresh DOM node that stayed active across a re-render", () => {
// A clip that moves lanes on a reorder remounts as a new element. It stays
// in the previous active set, so the plain diff would skip it and leave the
// new node without data-active. syncAll must force the attribute on.
const container = document.createElement("div");
appendClip(container, "hero", "0", "5");
const previous = new Set<string>();
updateTimelineActiveClipClasses(container, previous, 2);
expect(previous).toEqual(new Set(["hero"]));
// Simulate a remount: replace the hero clip's DOM node (no data-active).
container.replaceChildren();
const heroReborn = appendClip(container, "hero", "0", "5");
expect(heroReborn.hasAttribute("data-active")).toBe(false);
// Diff-only would skip it (still active → unchanged); syncAll re-applies.
updateTimelineActiveClipClasses(container, previous, 2, true);
expect(heroReborn.hasAttribute("data-active")).toBe(true);
});
it("ignores clips with invalid timing data", () => {
const container = document.createElement("div");
const missingId = appendClip(container, "", "0", "2");