@@ -72,6 +72,85 @@ describe("layout alignment", () => {
7272 } ) ;
7373 } ) ;
7474
75+ describe ( "gap suppression with SPACE_BETWEEN" , ( ) => {
76+ test ( "primary: itemSpacing suppressed when SPACE_BETWEEN" , ( ) => {
77+ const node = makeFrame ( {
78+ primaryAxisAlignItems : "SPACE_BETWEEN" ,
79+ itemSpacing : 10 ,
80+ } ) ;
81+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBeUndefined ( ) ;
82+ } ) ;
83+
84+ test ( "primary: itemSpacing preserved for other alignment modes" , ( ) => {
85+ const node = makeFrame ( {
86+ primaryAxisAlignItems : "MIN" ,
87+ itemSpacing : 10 ,
88+ } ) ;
89+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBe ( "10px" ) ;
90+ } ) ;
91+
92+ test ( "counter: counterAxisSpacing suppressed when SPACE_BETWEEN" , ( ) => {
93+ const node = makeFrame ( {
94+ layoutWrap : "WRAP" ,
95+ counterAxisAlignContent : "SPACE_BETWEEN" ,
96+ counterAxisSpacing : 24 ,
97+ primaryAxisAlignItems : "SPACE_BETWEEN" ,
98+ itemSpacing : 10 ,
99+ } ) ;
100+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBeUndefined ( ) ;
101+ } ) ;
102+
103+ test ( "counter: counterAxisSpacing preserved when AUTO" , ( ) => {
104+ const node = makeFrame ( {
105+ layoutWrap : "WRAP" ,
106+ counterAxisAlignContent : "AUTO" ,
107+ counterAxisSpacing : 24 ,
108+ itemSpacing : 10 ,
109+ } ) ;
110+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBe ( "24px 10px" ) ;
111+ } ) ;
112+
113+ test ( "wrapped row: both gaps emit CSS shorthand (row-gap column-gap)" , ( ) => {
114+ const node = makeFrame ( {
115+ layoutMode : "HORIZONTAL" ,
116+ layoutWrap : "WRAP" ,
117+ itemSpacing : 10 ,
118+ counterAxisSpacing : 24 ,
119+ } ) ;
120+ // row layout: counterAxisSpacing=row-gap, itemSpacing=column-gap
121+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBe ( "24px 10px" ) ;
122+ } ) ;
123+
124+ test ( "wrapped column: both gaps emit CSS shorthand (row-gap column-gap)" , ( ) => {
125+ const node = makeFrame ( {
126+ layoutMode : "VERTICAL" ,
127+ layoutWrap : "WRAP" ,
128+ itemSpacing : 10 ,
129+ counterAxisSpacing : 24 ,
130+ } ) ;
131+ // column layout: itemSpacing=row-gap, counterAxisSpacing=column-gap
132+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBe ( "10px 24px" ) ;
133+ } ) ;
134+
135+ test ( "wrapped: equal gaps collapse to single value" , ( ) => {
136+ const node = makeFrame ( {
137+ layoutWrap : "WRAP" ,
138+ itemSpacing : 16 ,
139+ counterAxisSpacing : 16 ,
140+ } ) ;
141+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBe ( "16px" ) ;
142+ } ) ;
143+
144+ test ( "counterAxisSpacing ignored for non-wrapped layouts" , ( ) => {
145+ const node = makeFrame ( {
146+ layoutWrap : "NO_WRAP" ,
147+ itemSpacing : 10 ,
148+ counterAxisSpacing : 24 ,
149+ } ) ;
150+ expect ( buildSimplifiedLayout ( node ) . gap ) . toBe ( "10px" ) ;
151+ } ) ;
152+ } ) ;
153+
75154 describe ( "alignItems stretch detection" , ( ) => {
76155 test ( "row: all children fill cross axis → stretch" , ( ) => {
77156 const node = makeFrame ( {
0 commit comments