Rewild Your Web
web
browser
dweb
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);