@@ -177,6 +177,166 @@ test('it can generate focus-visible variants', () => {
177
177
} )
178
178
} )
179
179
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
+
180
340
test ( 'it can generate first-child variants' , ( ) => {
181
341
const input = `
182
342
@variants first {
0 commit comments