/** * GRAMATON Theme Switcher * Переключение между 3 темами: Neon, Cosmic, Old Money * v1.0 — 2026-07-18 * * Themes: * - 'neon' → css/themes.css (фиолетовый неон, glassmorphism) * - 'cosmic' → css/cosmic.css (сдержанный люкс, Playfair + Inter) * - 'old-money' → css/oldmoney.css (золото/кремовый, премиум — базовая) */ (function() { 'use strict'; // ─── Конфигурация тем ───────────────────────────────────── var THEMES = { 'neon': { label: 'Neon', css: '/css/themes.css', icon: '💜', description: 'Фиолетовый неон, glassmorphism' }, 'cosmic': { label: 'Cosmic', css: '/css/cosmic.css', icon: '🌌', description: 'Сдержанный люкс, Playfair' }, 'old-money': { label: 'Old Money', css: null, // Загружен по умолчанию icon: '🏛️', description: 'Золото, кремовый, премиум' } }; var STORAGE_KEY = 'gramaton_theme'; var DEFAULT_THEME = 'old-money'; var currentTheme = null; // ─── Загрузка CSS-файла темы ────────────────────────────── function loadThemeCSS(href) { // Удаляем старые CSS темы document.querySelectorAll('[data-theme-css]').forEach(function(el) { el.remove(); }); if (!href) return; // null → тема уже загружена (old-money) var link = document.createElement('link'); link.rel = 'stylesheet'; link.href = href; link.setAttribute('data-theme-css', ''); document.head.appendChild(link); } // ─── Применение темы ────────────────────────────────────── function applyTheme(theme) { if (!theme || !THEMES[theme]) { theme = DEFAULT_THEME; } // data-theme на → CSS-переменные переопределяются document.documentElement.setAttribute('data-theme', theme); localStorage.setItem(STORAGE_KEY, theme); // Загружаем CSS файл темы loadThemeCSS(THEMES[theme].css); currentTheme = theme; // Событие для других скриптов document.dispatchEvent(new CustomEvent('theme-changed', { detail: { theme: theme, meta: THEMES[theme] } })); } // ─── Получение сохранённой темы ─────────────────────────── function getSavedTheme() { try { var saved = localStorage.getItem(STORAGE_KEY); if (saved && THEMES[saved]) return saved; } catch(e) {} return DEFAULT_THEME; } // ─── Инициализация при загрузке ─────────────────────────── function init() { var saved = getSavedTheme(); applyTheme(saved); } // ─── Публичный API ──────────────────────────────────────── window.themeSwitcher = { THEMES: THEMES, current: function() { return currentTheme; }, apply: applyTheme, getSaved: getSavedTheme }; // ─── Auto-init (немедленный вызов из ) ───────────── // DocumentElement и localStorage доступны сразу, init безопасен. init(); })();