feat(studio): hide text panel for elements inside locked compositions

Elements inside a data-timeline-locked sub-composition now have the
TEXT property panel hidden. These elements are JS-generated — editing
them in the panel won't persist since the script rebuilds the DOM on
load. Uses findClosestByAttribute to detect the locked ancestor.
This commit is contained in:
Miguel Ángel
2026-05-20 02:13:25 -04:00
parent 335ec45bc2
commit 8371f42aed
2 changed files with 8 additions and 1 deletions
@@ -12,6 +12,7 @@ import type {
} from "./domEditingTypes";
import {
buildStableSelector,
findClosestByAttribute,
getCuratedComputedStyles,
getDataAttributes,
getInlineStyles,
@@ -318,6 +319,7 @@ export function resolveDomEditSelection(
compositionPath,
compositionSrc,
isCompositionHost: Boolean(compositionSrc),
isInsideLockedComposition: Boolean(findClosestByAttribute(current, ["data-timeline-locked"])),
label: buildElementLabel(current),
tagName: current.tagName.toLowerCase(),
boundingBox: {
@@ -488,7 +490,11 @@ export function getDomEditTargetKey(
}
export function isTextEditableSelection(selection: DomEditSelection): boolean {
return selection.textFields.length > 0 && !selection.isCompositionHost;
return (
selection.textFields.length > 0 &&
!selection.isCompositionHost &&
!selection.isInsideLockedComposition
);
}
// buildElementAgentPrompt is in domEditingAgentPrompt.ts
@@ -78,6 +78,7 @@ export interface DomEditSelection extends PatchTarget {
compositionPath: string;
compositionSrc?: string;
isCompositionHost: boolean;
isInsideLockedComposition: boolean;
boundingBox: { x: number; y: number; width: number; height: number };
textContent: string | null;
dataAttributes: Record<string, string>;