diff --git a/packages/core/src/kiwi/instance-overrides/index.ts b/packages/core/src/kiwi/instance-overrides/index.ts index 0a4cbfbb5..04d4598b3 100644 --- a/packages/core/src/kiwi/instance-overrides/index.ts +++ b/packages/core/src/kiwi/instance-overrides/index.ts @@ -92,7 +92,7 @@ export function populateAndApplyOverrides( const propModified = applyComponentProperties(ctx) if (propModified.size > 0) { - propagateOverridesTransitively(graph, propModified, ctx.swappedInstances, ctx.componentIdRoot) + propagateOverridesTransitively(graph, propModified, ctx.swappedInstances, ctx.componentIdRoot, overriddenNodes) } applyDerivedSymbolData(ctx) diff --git a/packages/core/src/kiwi/instance-overrides/sync.ts b/packages/core/src/kiwi/instance-overrides/sync.ts index 809dff62a..a0c13087f 100644 --- a/packages/core/src/kiwi/instance-overrides/sync.ts +++ b/packages/core/src/kiwi/instance-overrides/sync.ts @@ -131,7 +131,8 @@ export function propagateOverridesTransitively( graph: SceneGraph, seeds: Set, swappedInstances: Set, - componentIdRoot: Map + componentIdRoot: Map, + protect?: Set ): void { if (seeds.size === 0) return @@ -140,6 +141,11 @@ export function propagateOverridesTransitively( const expandedSeeds = expandSeedsToParents(graph, seeds) const needsSync = buildNeedsSyncSet(expandedSeeds, clonesOf) + // Merge seeds + protect into a single skip set for syncChildrenDeep + const skip = protect && protect.size > 0 + ? new Set([...seeds, ...protect]) + : seeds + const visited = new Set() const syncQueue = [...expandedSeeds] for (let sourceId = syncQueue.shift(); sourceId !== undefined; sourceId = syncQueue.shift()) { @@ -154,7 +160,7 @@ export function propagateOverridesTransitively( const node = graph.getNode(cloneId) if (!node) continue - if (seeds.has(cloneId)) { + if (skip.has(cloneId)) { syncQueue.push(cloneId) continue } @@ -166,7 +172,7 @@ export function propagateOverridesTransitively( graph.populateInstanceChildren(node.id, sourceId) } } else if (source.childIds.length > 0 && node.childIds.length > 0) { - syncChildrenDeep(graph, sourceId, node.id, swappedInstances, seeds) + syncChildrenDeep(graph, sourceId, node.id, swappedInstances, skip) } syncQueue.push(cloneId) }