@@ -177,6 +177,166 @@ test('it can generate focus-visible variants', () => {
177177 } )
178178} )
179179
180+ test ( 'it can generate motion-reduced variants' , ( ) => {
181+ const input = `
182+ @variants motion-reduced {
183+ .banana { color: yellow; }
184+ .chocolate { color: brown; }
185+ }
186+ `
187+
188+ const output = `
189+ .banana { color: yellow; }
190+ .chocolate { color: brown; }
191+ @media (prefers-reduced-motion: reduce) {
192+ .motion-reduced\\:banana { color: yellow; }
193+ .motion-reduced\\:chocolate { color: brown; }
194+ }
195+ `
196+
197+ return run ( input ) . then ( result => {
198+ expect ( result . css ) . toMatchCss ( output )
199+ expect ( result . warnings ( ) . length ) . toBe ( 0 )
200+ } )
201+ } )
202+
203+ test ( 'it can generate motion-safe variants' , ( ) => {
204+ const input = `
205+ @variants motion-safe {
206+ .banana { color: yellow; }
207+ .chocolate { color: brown; }
208+ }
209+ `
210+
211+ const output = `
212+ .banana { color: yellow; }
213+ .chocolate { color: brown; }
214+ @media (prefers-reduced-motion: no-preference) {
215+ .motion-safe\\:banana { color: yellow; }
216+ .motion-safe\\:chocolate { color: brown; }
217+ }
218+ `
219+
220+ return run ( input ) . then ( result => {
221+ expect ( result . css ) . toMatchCss ( output )
222+ expect ( result . warnings ( ) . length ) . toBe ( 0 )
223+ } )
224+ } )
225+
226+ test ( 'it can generate motion-safe and motion-reduced variants' , ( ) => {
227+ const input = `
228+ @variants motion-safe, motion-reduced {
229+ .banana { color: yellow; }
230+ .chocolate { color: brown; }
231+ }
232+ `
233+
234+ const output = `
235+ .banana { color: yellow; }
236+ .chocolate { color: brown; }
237+ @media (prefers-reduced-motion: no-preference) {
238+ .motion-safe\\:banana { color: yellow; }
239+ .motion-safe\\:chocolate { color: brown; }
240+ }
241+ @media (prefers-reduced-motion: reduce) {
242+ .motion-reduced\\:banana { color: yellow; }
243+ .motion-reduced\\:chocolate { color: brown; }
244+ }
245+ `
246+
247+ return run ( input ) . then ( result => {
248+ expect ( result . css ) . toMatchCss ( output )
249+ expect ( result . warnings ( ) . length ) . toBe ( 0 )
250+ } )
251+ } )
252+
253+ test ( 'motion-reduced variants stack with basic variants' , ( ) => {
254+ const input = `
255+ @variants motion-reduced, hover {
256+ .banana { color: yellow; }
257+ .chocolate { color: brown; }
258+ }
259+ `
260+
261+ const output = `
262+ .banana { color: yellow; }
263+ .chocolate { color: brown; }
264+ .hover\\:banana:hover { color: yellow; }
265+ .hover\\:chocolate:hover { color: brown; }
266+ @media (prefers-reduced-motion: reduce) {
267+ .motion-reduced\\:banana { color: yellow; }
268+ .motion-reduced\\:chocolate { color: brown; }
269+ .motion-reduced\\:hover\\:banana:hover { color: yellow; }
270+ .motion-reduced\\:hover\\:chocolate:hover { color: brown; }
271+ }
272+ `
273+
274+ return run ( input ) . then ( result => {
275+ expect ( result . css ) . toMatchCss ( output )
276+ expect ( result . warnings ( ) . length ) . toBe ( 0 )
277+ } )
278+ } )
279+
280+ test ( 'motion-safe variants stack with basic variants' , ( ) => {
281+ const input = `
282+ @variants motion-safe, hover {
283+ .banana { color: yellow; }
284+ .chocolate { color: brown; }
285+ }
286+ `
287+
288+ const output = `
289+ .banana { color: yellow; }
290+ .chocolate { color: brown; }
291+ .hover\\:banana:hover { color: yellow; }
292+ .hover\\:chocolate:hover { color: brown; }
293+ @media (prefers-reduced-motion: no-preference) {
294+ .motion-safe\\:banana { color: yellow; }
295+ .motion-safe\\:chocolate { color: brown; }
296+ .motion-safe\\:hover\\:banana:hover { color: yellow; }
297+ .motion-safe\\:hover\\:chocolate:hover { color: brown; }
298+ }
299+ `
300+
301+ return run ( input ) . then ( result => {
302+ expect ( result . css ) . toMatchCss ( output )
303+ expect ( result . warnings ( ) . length ) . toBe ( 0 )
304+ } )
305+ } )
306+
307+ test ( 'motion-safe and motion-reduced variants stack with basic variants' , ( ) => {
308+ const input = `
309+ @variants motion-reduced, motion-safe, hover {
310+ .banana { color: yellow; }
311+ .chocolate { color: brown; }
312+ }
313+ `
314+
315+ const output = `
316+ .banana { color: yellow; }
317+ .chocolate { color: brown; }
318+ .hover\\:banana:hover { color: yellow; }
319+ .hover\\:chocolate:hover { color: brown; }
320+ @media (prefers-reduced-motion: reduce) {
321+ .motion-reduced\\:banana { color: yellow; }
322+ .motion-reduced\\:chocolate { color: brown; }
323+ .motion-reduced\\:hover\\:banana:hover { color: yellow; }
324+ .motion-reduced\\:hover\\:chocolate:hover { color: brown; }
325+ }
326+ @media (prefers-reduced-motion: no-preference) {
327+ .motion-safe\\:banana { color: yellow; }
328+ .motion-safe\\:chocolate { color: brown; }
329+ .motion-safe\\:hover\\:banana:hover { color: yellow; }
330+ .motion-safe\\:hover\\:chocolate:hover { color: brown; }
331+ }
332+ `
333+
334+ return run ( input ) . then ( result => {
335+ expect ( result . css ) . toMatchCss ( output )
336+ expect ( result . warnings ( ) . length ) . toBe ( 0 )
337+ } )
338+ } )
339+
180340test ( 'it can generate first-child variants' , ( ) => {
181341 const input = `
182342 @variants first {
0 commit comments