Skip to content

Commit 2844d39

Browse files
vursenclaude
andcommitted
defer recalculateLayout in _finishTransition to fix Lit element detail sizing
Wrapping recalculateLayout in queueMicrotask ensures Lit elements have completed their rendering before layout measurement occurs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 6984280 commit 2844d39

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

packages/master-detail-layout/src/vaadin-master-detail-layout.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ class MasterDetailLayout extends ElementMixin(ThemableMixin(PolylitMixin(LitElem
663663
* @protected
664664
*/
665665
_finishTransition() {
666-
this.recalculateLayout();
666+
queueMicrotask(() => this.recalculateLayout());
667667
}
668668

669669
/**

packages/master-detail-layout/test/detail-auto-size.test.js

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { expect } from '@vaadin/chai-plugins';
22
import { defineCE, fixtureSync } from '@vaadin/testing-helpers';
33
import sinon from 'sinon';
44
import '../src/vaadin-master-detail-layout.js';
5+
import { css, html, LitElement } from 'lit';
56
import { onceResized } from './helpers.js';
67

78
window.Vaadin ||= {};
@@ -11,6 +12,10 @@ window.Vaadin.featureFlags.masterDetailLayoutComponent = true;
1112
describe('detail auto size', () => {
1213
let layout;
1314

15+
function getCachedSize(layout) {
16+
return layout.style.getPropertyValue('--_detail-cached-size');
17+
}
18+
1419
describe('basic', () => {
1520
beforeEach(async () => {
1621
layout = fixtureSync(`
@@ -54,13 +59,52 @@ describe('detail auto size', () => {
5459
});
5560
});
5661

62+
describe('Lit element detail', () => {
63+
const detailElementTag = defineCE(
64+
class extends LitElement {
65+
static get styles() {
66+
return css`
67+
:host {
68+
display: block;
69+
}
70+
71+
div {
72+
width: 200px;
73+
}
74+
`;
75+
}
76+
77+
render() {
78+
return html`<div>Detail</div>`;
79+
}
80+
},
81+
);
82+
83+
beforeEach(async () => {
84+
layout = fixtureSync(`
85+
<vaadin-master-detail-layout master-size="100px">
86+
<div>Master</div>
87+
</vaadin-master-detail-layout>
88+
`);
89+
await onceResized(layout);
90+
});
91+
92+
it('should measure correct detail size for a Lit element set via _setDetail', async () => {
93+
await layout._setDetail(document.createElement(detailElementTag));
94+
await onceResized(layout);
95+
expect(getCachedSize(layout)).to.equal('201px');
96+
});
97+
98+
it('should measure correct detail size for a Lit element set via _setDetail without transition', async () => {
99+
await layout._setDetail(document.createElement(detailElementTag), true);
100+
await onceResized(layout);
101+
expect(getCachedSize(layout)).to.equal('201px');
102+
});
103+
});
104+
57105
describe('nested layouts', () => {
58106
let outer, middle, inner;
59107

60-
function getCachedSize(layout) {
61-
return layout.style.getPropertyValue('--_detail-cached-size');
62-
}
63-
64108
const shadowElement = defineCE(
65109
class extends HTMLElement {
66110
constructor() {

0 commit comments

Comments
 (0)