diff --git a/miniapp/assets/app.js b/miniapp/assets/app.js
index 0002c1e..7db679d 100644
--- a/miniapp/assets/app.js
+++ b/miniapp/assets/app.js
@@ -9,12 +9,35 @@ const BACKEND_URL = "https://api.wasrusgen1.pro";
const app = document.getElementById("app");
+/* ----------------- Theme / variant helpers ----------------- */
+const THEME_KEY = "zov_variant";
+const THEMES = [
+ { id: "", name: "ЗОВ", dotA: "#003E7E", dotB: "#76BD22", outline: false },
+ { id: "b", name: "Foundry", dotA: "#15140F", dotB: "#B68A1A", outline: false },
+ { id: "c", name: "Boardroom",dotA: "#0E2A2E", dotB: "#D08A55", outline: false },
+ { id: "d", name: "Atelier", dotA: "#2E5266", dotB: "#E9EBEF", outline: true },
+];
+
+function applyVariant(id) {
+ const html = document.documentElement;
+ if (id) {
+ html.setAttribute("data-variant", id);
+ } else {
+ html.removeAttribute("data-variant");
+ }
+ try { localStorage.setItem(THEME_KEY, id); } catch(e) {}
+}
+
+function savedVariant() {
+ try { return localStorage.getItem(THEME_KEY) ?? ""; } catch(e) { return ""; }
+}
+
/* ----------------- Telegram WebApp setup ----------------- */
function setupTelegram() {
const scheme = tg?.colorScheme || (window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light");
document.documentElement.setAttribute("data-theme", scheme);
- // Зафиксирован вариант A — Editorial Calm
- document.documentElement.setAttribute("data-variant", "a");
+ // Восстанавливаем тему из localStorage (по умолч. — brand)
+ applyVariant(savedVariant());
if (!tg) return;
try {
@@ -36,6 +59,38 @@ function haptic(type = "selection") {
} catch (e) {}
}
+/* ----------------- Palette switcher UI ----------------- */
+function renderPaletteSwitcher() {
+ const current = savedVariant();
+ const wrap = el(`
`);
+ // Маленький ярлык слева
+ const lbl = el(`Тема`);
+ wrap.appendChild(lbl);
+
+ THEMES.forEach(t => {
+ const btn = el(`
+
+ `);
+ btn.addEventListener("click", () => {
+ haptic();
+ applyVariant(t.id);
+ // Перерисовываем все кнопки
+ wrap.querySelectorAll(".ps-btn").forEach((b, i) => {
+ b.classList.toggle("active", THEMES[i].id === t.id);
+ });
+ });
+ wrap.appendChild(btn);
+ });
+
+ return wrap;
+}
+
/* ----------------- Data ----------------- */
async function fetchMe() {
if (!BACKEND_URL) {
@@ -122,6 +177,9 @@ async function renderManagerHome(me) {
app.innerHTML = "";
document.body.classList.add("has-bottom-nav");
+ // Palette (theme) switcher — вверху экрана
+ app.appendChild(renderPaletteSwitcher());
+
// Greeting + bell (placeholder)
const greetingEl = el(`
@@ -683,7 +741,7 @@ function renderRoleChooser() {