/*
* Seasonals Plugin (Client Side Manager Logic)
*/
const ThemeConfigs = {
snowflakes: {
css: '/Seasonals/Resources/snowflakes.css',
js: '/Seasonals/Resources/snowflakes.js',
containerClass: 'snowflakes'
},
snowfall: {
css: '/Seasonals/Resources/snowfall.css',
js: '/Seasonals/Resources/snowfall.js',
containerClass: 'snowfall-container'
},
snowstorm: {
css: '/Seasonals/Resources/snowstorm.css',
js: '/Seasonals/Resources/snowstorm.js',
containerClass: 'snowstorm-container'
},
fireworks: {
css: '/Seasonals/Resources/fireworks.css',
js: '/Seasonals/Resources/fireworks.js',
containerClass: 'fireworks'
},
halloween: {
css: '/Seasonals/Resources/halloween.css',
js: '/Seasonals/Resources/halloween.js',
containerClass: 'halloween-container'
},
hearts: {
css: '/Seasonals/Resources/hearts.css',
js: '/Seasonals/Resources/hearts.js',
containerClass: 'hearts-container'
},
christmas: {
css: '/Seasonals/Resources/christmas.css',
js: '/Seasonals/Resources/christmas.js',
containerClass: 'christmas-container'
},
santa: {
css: '/Seasonals/Resources/santa.css',
js: '/Seasonals/Resources/santa.js',
containerClass: 'santa-container'
},
autumn: {
css: '/Seasonals/Resources/autumn.css',
js: '/Seasonals/Resources/autumn.js',
containerClass: 'autumn-container'
},
easter: {
css: '/Seasonals/Resources/easter.css',
js: '/Seasonals/Resources/easter.js',
containerClass: 'easter-container'
},
summer: {
css: '/Seasonals/Resources/summer.css',
js: '/Seasonals/Resources/summer.js',
containerClass: 'summer-container'
},
spring: {
css: '/Seasonals/Resources/spring.css',
js: '/Seasonals/Resources/spring.js',
containerClass: 'spring-container'
},
none: {
containerClass: 'none'
},
};
const SeasonalSettingsManager = {
initialized: false,
config: null,
init(config) {
if (this.initialized) return;
this.config = config;
// Only inject settings if enabled on server by admin
if (this.config && this.config.EnableClientSideToggle !== false) {
this.injectSettingsIcon();
this.initialized = true;
console.log("Seasonals: Client-Side Settings Manager initialized.");
}
},
getSetting(key, defaultValue) {
const value = localStorage.getItem(`seasonals-${key}`);
return value !== null ? value : defaultValue;
},
setSetting(key, value) {
localStorage.setItem(`seasonals-${key}`, value);
},
createIcon() {
const button = document.createElement('button');
button.type = 'button';
button.className = 'paper-icon-button-light headerButton seasonal-settings-button';
button.title = 'Seasonal Settings';
// button.innerHTML = '';
// button.innerHTML = '';
button.innerHTML = '
';
button.style.verticalAlign = 'middle';
button.addEventListener('click', (e) => {
e.stopPropagation();
this.toggleSettingsPopup(button);
});
return button;
},
injectSettingsIcon() {
const observer = new MutationObserver((mutations, obs) => {
const headerRight = document.querySelector('.headerRight');
if (headerRight && !document.querySelector('.seasonal-settings-button')) {
const icon = this.createIcon();
headerRight.prepend(icon);
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
},
createPopup(anchorElement) {
const existing = document.querySelector('.seasonal-settings-popup');
if (existing) existing.remove();
const popup = document.createElement('div');
popup.className = 'seasonal-settings-popup dialog';
Object.assign(popup.style, {
position: 'fixed',
zIndex: '10000',
backgroundColor: '#202020',
padding: '1em',
borderRadius: '0.3em',
boxShadow: '0 0 20px rgba(0,0,0,0.5)',
minWidth: '200px',
color: '#fff',
maxWidth: '250px'
});
const rect = anchorElement.getBoundingClientRect();
// Positioning logic
let rightPos = window.innerWidth - rect.right;
if (window.innerWidth < 450 || (window.innerWidth - rightPos) < 260) {
popup.style.right = '1rem';
popup.style.left = 'auto';
} else {
popup.style.right = `${rightPos}px`;
popup.style.left = 'auto';
}
popup.style.top = `${rect.bottom + 10}px`;
// Popup HTML
let html = `