Rewild Your Web
web browser dweb
at main 94 lines 2.6 kB view raw
1// SPDX-License-Identifier: AGPL-3.0-or-later 2 3import { MenuBase, html, css } from "./menu_base.js"; 4 5export class SystemMenu extends MenuBase { 6 constructor() { 7 super(); 8 this.handleKeyDown = this.handleKeyDown.bind(this); 9 } 10 11 disconnectedCallback() { 12 super.disconnectedCallback(); 13 this.removeEventListeners(); 14 } 15 16 updated(changedProperties) { 17 if (changedProperties.has("open")) { 18 if (this.open) { 19 document.addEventListener("keydown", this.handleKeyDown); 20 } else { 21 this.removeEventListeners(); 22 } 23 } 24 } 25 26 removeEventListeners() { 27 document.removeEventListener("keydown", this.handleKeyDown); 28 } 29 30 handleKeyDown(e) { 31 if (e.key === "Escape") { 32 this.close(); 33 } 34 } 35 36 handleBackdropClick(e) { 37 if (e.target.classList.contains("backdrop")) { 38 this.close(); 39 } 40 } 41 42 static styles = css` 43 @import url(//system.localhost:8888/system_menu.css); 44 `; 45 46 render() { 47 return html` 48 <div class="backdrop" @click=${this.handleBackdropClick}></div> 49 <div class="menu"> 50 <div class="menu-item" @click=${() => this.handleItemClick("new-tab")}> 51 <lucide-icon name="plus"></lucide-icon> 52 <span>New View</span> 53 </div> 54 <div 55 class="menu-item" 56 @click=${() => this.handleItemClick("new-search")} 57 > 58 <lucide-icon name="search"></lucide-icon> 59 <span>Floating Search</span> 60 </div> 61 <div 62 class="menu-item" 63 @click=${() => this.handleItemClick("new-window")} 64 > 65 <lucide-icon name="app-window"></lucide-icon> 66 <span>New Window</span> 67 </div> 68 <div class="menu-separator"></div> 69 <div class="menu-item" @click=${() => this.handleItemClick("overview")}> 70 <lucide-icon name="layout-grid"></lucide-icon> 71 <span>Overview</span> 72 </div> 73 <div class="menu-item" @click=${() => this.handleItemClick("settings")}> 74 <lucide-icon name="settings"></lucide-icon> 75 <span>Settings</span> 76 </div> 77 <div class="menu-separator"></div> 78 <div 79 class="menu-item" 80 @click=${() => this.handleItemClick("reload-ui")} 81 > 82 <lucide-icon name="refresh-cw"></lucide-icon> 83 <span>Reload UI</span> 84 </div> 85 <div class="menu-item" @click=${() => this.handleItemClick("quit")}> 86 <lucide-icon name="power"></lucide-icon> 87 <span>Quit</span> 88 </div> 89 </div> 90 `; 91 } 92} 93 94customElements.define("system-menu", SystemMenu);