fix(studio): make the player store the single source of truth for selection

setSelectedElementId now always collapses to one element (genuine user intent); a new
setSelectionAnchor moves the anchor within a multi-selection without collapsing it, used
only by the DOM-to-store sync echoes so a group survives a gesture.

applyDomSelection mirrors the whole DOM group into the store via setSelection instead of
writing only the anchor, so the store stays authoritative and a preview click collapses
while a preserved-group echo keeps every member.
This commit is contained in:
Miguel Angel Simon Sierra
2026-07-09 16:54:35 -04:00
parent 6673c32868
commit 9cf575c6f9
4 changed files with 53 additions and 18 deletions
+14 -2
View File
@@ -203,12 +203,24 @@ export function useDomSelection({
setRightCollapsed(false);
setRightPanelTab("design");
}
const nextSelectedTimelineId = resolveTimelineIdForSelection(
// Mirror the whole DOM group to the store so it stays the single source of
// truth: a single selection collapses to one id; a preserved group (echo
// during a gesture) keeps every member instead of shrinking to the anchor.
const anchorId = resolveTimelineIdForSelection(
nextSelection,
timelineElements,
activeCompPath,
);
setSelectedTimelineElementId(nextSelectedTimelineId);
const groupIds = nextGroup
.map((selection) =>
resolveTimelineIdForSelection(selection, timelineElements, activeCompPath),
)
.filter((id): id is string => Boolean(id));
if (groupIds.length > 0) {
usePlayerStore.getState().setSelection(groupIds, anchorId);
} else {
setSelectedTimelineElementId(anchorId);
}
return;
}