diff --git a/packages/transient-render-engine/src/flow/__tests__/__snapshots__/collapse.test.ts.snap b/packages/transient-render-engine/src/flow/__tests__/__snapshots__/collapse.test.ts.snap
index 33a016c4..5152de51 100644
--- a/packages/transient-render-engine/src/flow/__tests__/__snapshots__/collapse.test.ts.snap
+++ b/packages/transient-render-engine/src/flow/__tests__/__snapshots__/collapse.test.ts.snap
@@ -140,6 +140,18 @@ exports[`collapse function should not collapse when white-space CSS property is
`;
+exports[`collapse function should preserve boundary spaces wrapped in nested inline phrasing tags 1`] = `
+
+
+
+
+
+
+
+
+
+`;
+
exports[`collapse function should remove children from TPhrasing nodes which are empty after timming 1`] = `
diff --git a/packages/transient-render-engine/src/flow/__tests__/collapse.test.ts b/packages/transient-render-engine/src/flow/__tests__/collapse.test.ts
index 21bf4329..2769cee7 100644
--- a/packages/transient-render-engine/src/flow/__tests__/collapse.test.ts
+++ b/packages/transient-render-engine/src/flow/__tests__/collapse.test.ts
@@ -37,6 +37,21 @@ describe('collapse function', () => {
const ttree = makeTTree('foo bar');
expect(ttree).toMatchSnapshot();
});
+ it('should preserve boundary spaces wrapped in nested inline phrasing tags', () => {
+ const ttree = makeTTree(
+ 'foo bar'
+ );
+ expect(ttree).toMatchSnapshot();
+ });
+ it('should collapse consecutive boundary spaces wrapped in nested inline phrasing tags', () => {
+ const twoSpaces = makeTTree(
+ 'foo bar'
+ );
+ const oneSpace = makeTTree(
+ 'foo bar'
+ );
+ expect(twoSpaces).toEqual(oneSpace);
+ });
it('should handle nested anchors', () => {
const ttree = makeTTree(nestedHyperlinksSource);
expect(ttree).toMatchSnapshot();
diff --git a/packages/transient-render-engine/src/tree/TPhrasingCtor.ts b/packages/transient-render-engine/src/tree/TPhrasingCtor.ts
index bcf61313..5ad6bacb 100644
--- a/packages/transient-render-engine/src/tree/TPhrasingCtor.ts
+++ b/packages/transient-render-engine/src/tree/TPhrasingCtor.ts
@@ -48,8 +48,12 @@ TPhrasingCtor.prototype.collapseChildren = function collapseChildren() {
}
previous = childK;
});
- this.trimLeft();
- this.trimRight();
+ // Preserve boundary spaces for named inline wrappers (e.g. styled spans) so
+ // their parent phrasing container can collapse sibling boundaries correctly.
+ if (this.tagName === null) {
+ this.trimLeft();
+ this.trimRight();
+ }
return null;
};