2023-12-20 17:44:03 +00:00
// reactive component for displaying the menu
2024-01-03 14:23:34 +00:00
menuComponent = ( el ) => new Proxy ( {
2023-12-19 16:58:46 +01:00
2023-12-20 17:44:03 +00:00
html : `
2023-12-19 16:58:46 +01:00
< div class = "xrf footer" >
2023-12-20 17:44:03 +00:00
< div class = "menu" >
< div id = "buttons" > < / d i v >
2024-01-03 14:23:34 +00:00
< a class = "btn" id = "more" aria - title = "menu button" > < i id = "icon" class = "gg-menu" > < / i > < / a > < b r >
2023-12-19 16:58:46 +01:00
< / d i v >
< / d i v >
2023-12-20 17:44:03 +00:00
` ,
2024-01-03 14:23:34 +00:00
collapsed : false ,
logo : './../../assets/logo.png' ,
buttons : [ ` <a class="btn" aria-label="button" aria-title="share button" aria-description="this allows embedding and sharing of this URL or make a screenshot of it" id="share" onclick="frontend.share()"><i class="gg-link"></i> share</a><br> ` ] ,
$buttons : $buttons = el . querySelector ( '#buttons' ) ,
$btnMore : $btnMore = el . querySelector ( '#more' ) ,
2023-12-14 18:13:40 +01:00
2024-01-29 20:17:57 +01:00
toggle ( state ) {
this . collapsed = state !== undefined ? state : ! this . collapsed
2024-01-03 14:23:34 +00:00
el . querySelector ( "i#icon" ) . className = this . collapsed ? 'gg-close' : 'gg-menu'
document . body . classList [ this . collapsed ? 'add' : 'remove' ] ( [ 'menu' ] )
2023-12-14 18:13:40 +01:00
} ,
2024-01-03 14:23:34 +00:00
init ( opts ) {
el . innerHTML = this . html
document . body . appendChild ( el ) ;
( [ 'click' ] ) . map ( ( e ) => el . addEventListener ( e , ( ev ) => this [ e ] && this [ e ] ( ev . target . id , ev ) ) )
setTimeout ( ( ) => {
document . dispatchEvent ( new CustomEvent ( "$menu:ready" , { detail : { $menu : this , xrf } } ) )
} , 100 )
return this
2023-12-15 16:23:12 +01:00
} ,
2024-01-03 14:23:34 +00:00
click ( id , e ) {
switch ( id ) {
case "icon" :
case "more" : this . toggle ( ) ; break ;
2023-12-27 21:31:42 +00:00
}
2023-12-14 18:13:40 +01:00
}
2024-01-03 14:23:34 +00:00
} ,
{
get ( me , k , v ) { return me [ k ] } ,
set ( me , k , v ) {
me [ k ] = v
switch ( k ) {
case "buttons" : el . querySelector ( "#buttons" ) . innerHTML = this . renderButtons ( me ) ;
document . dispatchEvent ( new CustomEvent ( "$menu:buttons:render" , { detail : el . querySelector ( '.menu' ) } ) )
break ;
case "collapsed" :
el . querySelector ( "#buttons" ) . style . display = me . collapsed ? 'block' : 'none'
frontend . emit ( '$menu:collapse' , v )
break ;
2023-12-27 17:25:49 +00:00
}
2024-01-03 14:23:34 +00:00
} ,
2023-12-27 17:25:49 +00:00
2024-01-03 14:23:34 +00:00
renderButtons : ( data ) => ` ${ data . buttons . join ( '' ) } `
2023-12-27 21:31:42 +00:00
2024-01-03 14:23:34 +00:00
} )
2023-12-27 17:25:49 +00:00
2024-01-03 14:23:34 +00:00
// reactify component!
document . addEventListener ( 'frontend:ready' , ( e ) => {
window . $menu = menuComponent ( document . createElement ( 'div' ) ) . init ( e . detail )
} )