@@ -11,17 +11,17 @@ window.Vaadin.featureFlags.masterDetailLayoutComponent = true;
1111describe ( 'detail auto size' , ( ) => {
1212 let layout ;
1313
14- beforeEach ( async ( ) => {
15- layout = fixtureSync ( `
16- <vaadin-master-detail-layout>
17- <div>Master</div>
18- <div slot="detail">Detail</div>
19- </vaadin-master-detail-layout>
20- ` ) ;
21- await onceResized ( layout ) ;
22- } ) ;
14+ describe ( 'basic' , ( ) => {
15+ beforeEach ( async ( ) => {
16+ layout = fixtureSync ( `
17+ <vaadin-master-detail-layout>
18+ <div>Master</div>
19+ <div slot="detail">Detail</div>
20+ </vaadin-master-detail-layout>
21+ ` ) ;
22+ await onceResized ( layout ) ;
23+ } ) ;
2324
24- describe ( 'recalculateLayout' , ( ) => {
2525 it ( 'should not be called when masterSize and detailSize are provided initially' , async ( ) => {
2626 const newLayout = fixtureSync ( `
2727 <vaadin-master-detail-layout master-size="200px" detail-size="200px">
@@ -53,4 +53,73 @@ describe('detail auto size', () => {
5353 expect ( ( ) => layout . recalculateLayout ( ) ) . to . not . throw ( ) ;
5454 } ) ;
5555 } ) ;
56+
57+ describe ( 'nested layouts' , ( ) => {
58+ let outer , middle , inner ;
59+
60+ function getCachedSize ( layout ) {
61+ return layout . style . getPropertyValue ( '--_detail-cached-size' ) ;
62+ }
63+
64+ beforeEach ( async ( ) => {
65+ outer = fixtureSync ( `
66+ <vaadin-master-detail-layout style="width: 1200px;" master-size="100px" expand="both">
67+ <div>Outer Master</div>
68+ <vaadin-master-detail-layout slot="detail" master-size="100px">
69+ <div>Middle Master</div>
70+ <vaadin-master-detail-layout slot="detail" master-size="100px">
71+ <div>Inner Master</div>
72+ <div slot="detail" style="width: 100px;">Inner Detail</div>
73+ </vaadin-master-detail-layout>
74+ </vaadin-master-detail-layout>
75+ </vaadin-master-detail-layout>
76+ ` ) ;
77+ middle = outer . querySelector ( 'vaadin-master-detail-layout' ) ;
78+ inner = middle . querySelector ( 'vaadin-master-detail-layout' ) ;
79+ await onceResized ( outer ) ;
80+ await onceResized ( middle ) ;
81+ await onceResized ( inner ) ;
82+ } ) ;
83+
84+ it ( 'should cache detail intrinsic size plus border at each level' , ( ) => {
85+ // Inner: 100px detail content + 1px border = 101px
86+ expect ( getCachedSize ( inner ) ) . to . equal ( '101px' ) ;
87+ // Middle: inner layout min-content (100px master + 101px detail) + 1px border = 202px
88+ expect ( getCachedSize ( middle ) ) . to . equal ( '202px' ) ;
89+ // Outer: middle layout min-content (100px master + 202px detail) + 1px border = 303px
90+ expect ( getCachedSize ( outer ) ) . to . equal ( '303px' ) ;
91+ } ) ;
92+
93+ it ( 'should not cache detail size when detailSize is explicitly set' , async ( ) => {
94+ outer . detailSize = '300px' ;
95+ await onceResized ( outer ) ;
96+ expect ( getCachedSize ( outer ) ) . to . equal ( '' ) ;
97+ } ) ;
98+
99+ describe ( 'recalculateLayout' , ( ) => {
100+ it ( 'should update cached sizes on ancestors after detail content changes' , ( ) => {
101+ inner . querySelector ( '[slot="detail"]' ) . style . width = '200px' ;
102+ inner . recalculateLayout ( ) ;
103+
104+ expect ( getCachedSize ( inner ) ) . to . equal ( '201px' ) ;
105+ expect ( getCachedSize ( middle ) ) . to . equal ( '302px' ) ;
106+ expect ( getCachedSize ( outer ) ) . to . equal ( '403px' ) ;
107+ } ) ;
108+
109+ it ( 'should toggle overlay on ancestors when detail content outgrows or fits available space' , ( ) => {
110+ // Outer: 100px master + 303px detail = 403px, host is 1200px → no overlay
111+ expect ( outer . hasAttribute ( 'overlay' ) ) . to . be . false ;
112+
113+ // Grow inner detail so outer needs 100px + 1103px = 1203px > 1200px
114+ inner . querySelector ( '[slot="detail"]' ) . style . width = '1000px' ;
115+ inner . recalculateLayout ( ) ;
116+ expect ( outer . hasAttribute ( 'overlay' ) ) . to . be . true ;
117+
118+ // Shrink back so outer needs 100px + 303px = 403px < 1200px
119+ inner . querySelector ( '[slot="detail"]' ) . style . width = '100px' ;
120+ inner . recalculateLayout ( ) ;
121+ expect ( outer . hasAttribute ( 'overlay' ) ) . to . be . false ;
122+ } ) ;
123+ } ) ;
124+ } ) ;
56125} ) ;
0 commit comments