xrfragment/src/3rd/js/plugin/frontend/$menu.js

67 lines
2.1 KiB
JavaScript
Raw Normal View History

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"></div>
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><br>
2023-12-19 16:58:46 +01:00
</div>
</div>
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>&nbsp;share</a><br>`],
$buttons: $buttons = el.querySelector('#buttons'),
$btnMore: $btnMore = el.querySelector('#more'),
2023-12-14 18:13:40 +01:00
2024-01-03 14:23:34 +00:00
toggle(){
this.collapsed = !this.collapsed
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)
})