diff --git a/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp b/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp index 181dfcb1b0de..4f14165d7e97 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp @@ -558,6 +558,7 @@ bool layoutAbsoluteDescendants( // we need to mutate these descendents. Make sure the path of // nodes to them is mutable before positioning. child->cloneChildrenIfNeeded(); + cleanupContentsNodesRecursively(child); const Direction childDirection = child->resolveDirection(currentNodeDirection); // By now all descendants of the containing block that are not absolute diff --git a/packages/react-native/ReactCommon/yoga/yoga/node/Node.cpp b/packages/react-native/ReactCommon/yoga/yoga/node/Node.cpp index d42bd5f9e707..d04127733d3f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/node/Node.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/node/Node.cpp @@ -392,7 +392,12 @@ void Node::cloneChildrenIfNeeded() { child = resolveRef(config_->cloneNode(child, this, i)); child->setOwner(this); - if (child->hasContentsChildren()) [[unlikely]] { + if (child->style().display() == Display::Contents) [[unlikely]] { + // The contents node's children are treated as children of the + // contents node's parent for layout purposes, so they need + // to be cloned as well. + child->cloneChildrenIfNeeded(); + } else if (child->hasContentsChildren()) [[unlikely]] { child->cloneContentsChildrenIfNeeded(); } }