@@ -30,6 +30,7 @@ import fragment from './Components/Fragment'
3030import tabs from './Components/Tabs.js'
3131import collapse from './Components/Collapse.js'
3232import bottomBarMenu from './Components/BottomBar.js'
33+ import imgPopup from './Components/ImgPopup.js'
3334import { validationInHiddenBlocks } from './Support/Forms.js'
3435
3536window . MoonShine = new MoonShine ( )
@@ -62,12 +63,60 @@ Alpine.data('fragment', fragment)
6263Alpine . data ( 'tabs' , tabs )
6364Alpine . data ( 'collapse' , collapse )
6465Alpine . data ( 'bottomBarMenu' , bottomBarMenu )
66+ Alpine . data ( 'imgPopup' , imgPopup )
6567
6668window . Alpine = Alpine
6769
6870document . addEventListener ( 'alpine:init' , ( ) => {
6971 validationInHiddenBlocks ( )
7072
73+ /* Overlay stack (modals, offcanvas, popups) for proper Escape key handling */
74+ Alpine . store ( 'overlays' , {
75+ stack : [ ] ,
76+
77+ register ( id , closeCallback ) {
78+ this . stack = this . stack . filter ( m => m . id !== id )
79+ this . stack . push ( { id, close : closeCallback } )
80+ } ,
81+
82+ unregister ( id ) {
83+ this . stack = this . stack . filter ( m => m . id !== id )
84+ } ,
85+
86+ closeTop ( ) {
87+ const top = this . stack . at ( - 1 )
88+ if ( top ) {
89+ top . close ( )
90+ }
91+ } ,
92+
93+ isTop ( id ) {
94+ return this . stack . at ( - 1 ) ?. id === id
95+ } ,
96+ } )
97+
98+ /* Global Escape handler for overlays */
99+ window . addEventListener ( 'keydown' , ( e ) => {
100+ if ( e . key === 'Escape' ) {
101+ const store = Alpine . store ( 'overlays' )
102+ if ( store . stack . length > 0 ) {
103+ e . stopImmediatePropagation ( )
104+ store . closeTop ( )
105+ }
106+ }
107+ } )
108+
109+ /* Global bind for OffCanvas click outside */
110+ Alpine . bind ( 'dismissCanvas' , ( ) => ( {
111+ '@click.outside' ( ) {
112+ // Only close if this OffCanvas is the top-most overlay
113+ // Prevents closing when clicking on a Modal that's above this OffCanvas
114+ if ( this . open && Alpine . store ( 'overlays' ) . isTop ( this . canvasId ) ) {
115+ this . closeCanvas ( )
116+ }
117+ } ,
118+ } ) )
119+
71120 /* Dark mode */
72121 Alpine . store ( 'darkMode' , {
73122 init ( ) {
0 commit comments