@@ -257,4 +257,61 @@ context('Basic', () => {
257257 cy . get ( '#slideshow .slidev-page-13 .cy-wrapdecorate > ul > .slidev-vclick-target:not(.slidev-vclick-hidden)' )
258258 . should ( 'have.text' , 'AEFZ' )
259259 } )
260+
261+ it ( 'click animation presets' , ( ) => {
262+ goPage ( 14 )
263+
264+ // Check animation classes are set on mount
265+ cy . get ( '#slideshow .slidev-page-14 .cy-animation-presets .slidev-vclick-target' ) . eq ( 0 ) . should ( 'have.class' , 'slidev-vclick-anim-fade' ) . and ( 'have.class' , 'slidev-vclick-anim-up' )
266+ cy . get ( '#slideshow .slidev-page-14 .cy-animation-presets .slidev-vclick-target' ) . eq ( 1 ) . should ( 'have.class' , 'slidev-vclick-anim-scale' )
267+ cy . get ( '#slideshow .slidev-page-14 .cy-animation-presets .slidev-vclick-target' ) . eq ( 2 ) . should ( 'have.class' , 'slidev-vclick-anim-none' )
268+
269+ // After clicks, elements become visible
270+ cy . rightArrow ( )
271+ cy . get ( '#slideshow .slidev-page-14 .cy-animation-presets .slidev-vclick-target:not(.slidev-vclick-hidden)' )
272+ . should ( 'have.text' , 'fade-up' )
273+
274+ cy . rightArrow ( )
275+ cy . get ( '#slideshow .slidev-page-14 .cy-animation-presets .slidev-vclick-target:not(.slidev-vclick-hidden)' )
276+ . should ( 'have.length' , 2 )
277+
278+ cy . rightArrow ( )
279+ cy . get ( '#slideshow .slidev-page-14 .cy-animation-presets .slidev-vclick-target:not(.slidev-vclick-hidden)' )
280+ . should ( 'have.length' , 3 )
281+ } )
282+
283+ it ( 'click animation from frontmatter' , ( ) => {
284+ goPage ( 15 )
285+
286+ cy . get ( '#slideshow .slidev-page-15 .cy-animation-frontmatter .slidev-vclick-target' )
287+ . should ( 'have.class' , 'slidev-vclick-anim-fade' )
288+ . and ( 'have.class' , 'slidev-vclick-anim-down' )
289+
290+ cy . rightArrow ( )
291+ cy . get ( '#slideshow .slidev-page-15 .cy-animation-frontmatter .slidev-vclick-target:not(.slidev-vclick-hidden)' )
292+ . should ( 'have.text' , 'from-frontmatter' )
293+ } )
294+
295+ it ( 'click animation hierarchy and override' , ( ) => {
296+ goPage ( 16 )
297+
298+ const targets = '#slideshow .slidev-page-16 .cy-animation-hierarchy .slidev-vclick-target'
299+
300+ // custom frontmatter still gets reflected for elements without modifiers
301+ cy . get ( targets ) . eq ( 0 ) . should ( 'have.class' , 'slidev-vclick-anim-foo' )
302+
303+ // element modifiers override slide frontmatter preset
304+ cy . get ( targets ) . eq ( 1 ) . should ( 'not.have.class' , 'slidev-vclick-anim-foo' ) . and ( 'have.class' , 'slidev-vclick-anim-fade' ) . and ( 'have.class' , 'slidev-vclick-anim-right' )
305+
306+ // none modifier also overrides slide frontmatter preset
307+ cy . get ( targets ) . eq ( 2 ) . should ( 'not.have.class' , 'slidev-vclick-anim-foo' ) . and ( 'have.class' , 'slidev-vclick-anim-none' ) . invoke ( 'css' , 'transition' ) . should ( 'match' , / ^ n o n e / )
308+
309+ // another valid modifier should also override invalid frontmatter
310+ cy . get ( targets ) . eq ( 3 ) . should ( 'not.have.class' , 'slidev-vclick-anim-foo' ) . and ( 'have.class' , 'slidev-vclick-anim-scale' )
311+
312+ // reveal sequence remains functional with mixed presets
313+ cy . rightArrow ( 4 )
314+ cy . get ( `${ targets } :not(.slidev-vclick-hidden)` )
315+ . should ( 'have.length' , 4 )
316+ } )
260317} )
0 commit comments