diff --git a/includes/header.ejs b/includes/header.ejs index 4c321b8d88..158363d011 100644 --- a/includes/header.ejs +++ b/includes/header.ejs @@ -85,28 +85,14 @@ - - - + + + + - Themes + Settings - - <% if (page != 'api') { %> - - - - - Packs - - - - <% } %> + header #themes-button, - :not(.page-index) > header #packs-button, - .lookup-player.show-user-search ~ #themes-button, - .lookup-player.show-user-search ~ #packs-button { + :not(.page-index) > header #settings-button, + .lookup-player.show-user-search ~ #settings-button { span { transform: scaleX(0); padding: 0; font-size: 0; opacity: 0; } - - & + #packs-box { - --clip-center: 100% 0; - } - - & + #themes-box { - --clip-center: 85% 0; - } } } @@ -1214,19 +1193,10 @@ body { } @media (max-width: 480px) { - #themes-button, - #packs-button { + #settings-button { display: none; } - #themes-box, - #packs-box { - left: env(safe-area-inset-left, 0); - right: env(safe-area-inset-right, 0); - width: unset; - border-radius: 0; - } - .page-index header { justify-content: center; } diff --git a/public/resources/scss/stats.scss b/public/resources/scss/stats.scss index 7120e55cb4..c1874f4783 100644 --- a/public/resources/scss/stats.scss +++ b/public/resources/scss/stats.scss @@ -384,7 +384,8 @@ } } - .author { + .author, + .description { color: rgba(var(--text-rgb), 0.6); span { diff --git a/public/resources/ts/common-defer.ts b/public/resources/ts/common-defer.ts index f43bfe8dc5..5addd43750 100644 --- a/public/resources/ts/common-defer.ts +++ b/public/resources/ts/common-defer.ts @@ -109,12 +109,8 @@ const expanders = document.querySelectorAll(".expander"); for (const expander of expanders) { expander.addEventListener("click", () => { switch (expander.id) { - case "packs-button": - import("./elements/pack-list"); - break; - - case "themes-button": - import("./elements/theme-list"); + case "settings-button": + import("./elements/settings"); break; } diff --git a/public/resources/ts/elements/settings.ts b/public/resources/ts/elements/settings.ts new file mode 100644 index 0000000000..3b099a2363 --- /dev/null +++ b/public/resources/ts/elements/settings.ts @@ -0,0 +1,97 @@ +import { html, LitElement, TemplateResult } from "lit"; +import { customElement } from "lit/decorators.js"; +import { ThemeList } from "../elements/theme-list"; + +@customElement("settings-list") +export class SettingList extends LitElement { + constructor() { + super(); + } + + protected render(): TemplateResult { + return html` + this.openModule("theme-list")}"> + + + + + Themes + + + Customize look of the website + + + + + + + + this.openModule("pack-list")}"> + + + + + Packs + + + Change the resource pack + + + + `; + } + + private async openModule(moduleName: string) { + const moduleInstance = (await this.getModule(moduleName)) as ThemeList; + const settingsBox = document.querySelector("#settings-box"); + if (settingsBox) { + settingsBox.innerHTML = ""; + settingsBox.appendChild(moduleInstance); + } + + document.addEventListener("click", this.closeSettings); + } + + private async getModule(moduleName: string) { + switch (moduleName) { + case "theme-list": { + const module = await import(`../elements/theme-list`); + return new module.ThemeList(); + } + + case "pack-list": { + const module = await import(`../elements/pack-list`); + return new module.PackList(); + } + + default: + throw new Error("Module not found"); + } + } + + private closeSettings = (event: MouseEvent) => { + const settingsBox = document.querySelector("#settings-box"); + if (settingsBox && !settingsBox?.contains(event.target as Node)) { + settingsBox.innerHTML = ""; + settingsBox.appendChild(new SettingList()); + document.removeEventListener("click", this.closeSettings); + } + }; + + // disable shadow root + protected createRenderRoot(): Element | ShadowRoot { + return this; + } +} + +declare global { + interface HTMLElementTagNameMap { + "settings-list": SettingList; + } +}