@@ -524,6 +524,161 @@ describe("useFullscreenGallery", () => {
524524 expect ( result . current . currentIndex ) . toBe ( 1 ) ;
525525 } ) ;
526526
527+ it ( "handles Enter key for zoom cycling in fullscreen" , async ( ) => {
528+ const { result } = renderHook ( ( ) =>
529+ useFullscreenGallery ( mockImages , mockCarouselApi )
530+ ) ;
531+
532+ await setupFullscreen ( result ) ;
533+
534+ expect ( result . current . scale ) . toBe ( 1 ) ;
535+
536+ // Press Enter to cycle zoom
537+ await act ( async ( ) => {
538+ const event = new KeyboardEvent ( "keydown" , { key : "Enter" } ) ;
539+ document . dispatchEvent ( event ) ;
540+ } ) ;
541+
542+ expect ( result . current . scale ) . toBe ( 1.5 ) ;
543+ } ) ;
544+
545+ it ( "handles Space key for zoom cycling in fullscreen" , async ( ) => {
546+ const { result } = renderHook ( ( ) =>
547+ useFullscreenGallery ( mockImages , mockCarouselApi )
548+ ) ;
549+
550+ await setupFullscreen ( result ) ;
551+
552+ expect ( result . current . scale ) . toBe ( 1 ) ;
553+
554+ // Press Space to cycle zoom
555+ await act ( async ( ) => {
556+ const event = new KeyboardEvent ( "keydown" , { key : " " } ) ;
557+ document . dispatchEvent ( event ) ;
558+ } ) ;
559+
560+ expect ( result . current . scale ) . toBe ( 1.5 ) ;
561+ } ) ;
562+
563+ it ( "handles wheel zoom in fullscreen" , async ( ) => {
564+ const { result } = renderHook ( ( ) =>
565+ useFullscreenGallery ( mockImages , mockCarouselApi )
566+ ) ;
567+
568+ const mockContainer = document . createElement ( "div" ) ;
569+ mockContainer . requestFullscreen = vi . fn ( ) . mockResolvedValue ( ) ;
570+ mockContainer . addEventListener = vi . fn ( ) ;
571+ mockContainer . removeEventListener = vi . fn ( ) ;
572+ result . current . containerRef . current = mockContainer ;
573+
574+ await act ( async ( ) => {
575+ result . current . open ( 0 ) ;
576+ } ) ;
577+
578+ // Simulate fullscreen being active
579+ Object . defineProperty ( document , "fullscreenElement" , {
580+ value : mockContainer ,
581+ writable : true ,
582+ configurable : true ,
583+ } ) ;
584+
585+ await act ( async ( ) => {
586+ document . dispatchEvent ( new Event ( "fullscreenchange" ) ) ;
587+ } ) ;
588+
589+ // The wheel handler should have been added
590+ expect ( mockContainer . addEventListener ) . toHaveBeenCalledWith (
591+ "wheel" ,
592+ expect . any ( Function ) ,
593+ { passive : false }
594+ ) ;
595+ } ) ;
596+
597+ it ( "handles wheel zoom up (zoom in)" , async ( ) => {
598+ const { result } = renderHook ( ( ) =>
599+ useFullscreenGallery ( mockImages , mockCarouselApi )
600+ ) ;
601+
602+ const mockContainer = document . createElement ( "div" ) ;
603+ mockContainer . requestFullscreen = vi . fn ( ) . mockResolvedValue ( ) ;
604+
605+ let wheelHandler ;
606+ mockContainer . addEventListener = vi . fn ( ( event , handler ) => {
607+ if ( event === "wheel" ) wheelHandler = handler ;
608+ } ) ;
609+ mockContainer . removeEventListener = vi . fn ( ) ;
610+ result . current . containerRef . current = mockContainer ;
611+
612+ await act ( async ( ) => {
613+ result . current . open ( 0 ) ;
614+ } ) ;
615+
616+ Object . defineProperty ( document , "fullscreenElement" , {
617+ value : mockContainer ,
618+ writable : true ,
619+ configurable : true ,
620+ } ) ;
621+
622+ await act ( async ( ) => {
623+ document . dispatchEvent ( new Event ( "fullscreenchange" ) ) ;
624+ } ) ;
625+
626+ // Simulate wheel scroll up (zoom in)
627+ await act ( async ( ) => {
628+ wheelHandler ( { deltaY : - 100 , preventDefault : vi . fn ( ) } ) ;
629+ } ) ;
630+
631+ expect ( result . current . scale ) . toBeGreaterThan ( 1 ) ;
632+ } ) ;
633+
634+ it ( "handles wheel zoom down (zoom out) and resets position at scale 1" , async ( ) => {
635+ const { result } = renderHook ( ( ) =>
636+ useFullscreenGallery ( mockImages , mockCarouselApi )
637+ ) ;
638+
639+ const mockContainer = document . createElement ( "div" ) ;
640+ mockContainer . requestFullscreen = vi . fn ( ) . mockResolvedValue ( ) ;
641+
642+ let wheelHandler ;
643+ mockContainer . addEventListener = vi . fn ( ( event , handler ) => {
644+ if ( event === "wheel" ) wheelHandler = handler ;
645+ } ) ;
646+ mockContainer . removeEventListener = vi . fn ( ) ;
647+ result . current . containerRef . current = mockContainer ;
648+
649+ await act ( async ( ) => {
650+ result . current . open ( 0 ) ;
651+ } ) ;
652+
653+ Object . defineProperty ( document , "fullscreenElement" , {
654+ value : mockContainer ,
655+ writable : true ,
656+ configurable : true ,
657+ } ) ;
658+
659+ await act ( async ( ) => {
660+ document . dispatchEvent ( new Event ( "fullscreenchange" ) ) ;
661+ } ) ;
662+
663+ // First zoom in
664+ await act ( async ( ) => {
665+ wheelHandler ( { deltaY : - 100 , preventDefault : vi . fn ( ) } ) ;
666+ } ) ;
667+
668+ expect ( result . current . scale ) . toBeGreaterThan ( 1 ) ;
669+
670+ // Then zoom out back to 1
671+ await act ( async ( ) => {
672+ wheelHandler ( { deltaY : 100 , preventDefault : vi . fn ( ) } ) ;
673+ wheelHandler ( { deltaY : 100 , preventDefault : vi . fn ( ) } ) ;
674+ wheelHandler ( { deltaY : 100 , preventDefault : vi . fn ( ) } ) ;
675+ wheelHandler ( { deltaY : 100 , preventDefault : vi . fn ( ) } ) ;
676+ } ) ;
677+
678+ expect ( result . current . scale ) . toBe ( 1 ) ;
679+ expect ( result . current . position ) . toEqual ( { x : 0 , y : 0 } ) ;
680+ } ) ;
681+
527682 it ( "handles mouse down correctly when zoomed" , async ( ) => {
528683 const { result } = renderHook ( ( ) =>
529684 useFullscreenGallery ( mockImages , mockCarouselApi )
0 commit comments