'use strict'; 'require baseclass'; 'require rpc'; /** * System Hub Theme Manager * Uses centralized theme from SecuBox configuration * Version: 1.0.0 */ console.log('🎨 System Hub Theme Manager v1.0.0 loaded'); // RPC call to get theme from secu-box config var callGetTheme = rpc.declare({ object: 'luci.secubox', method: 'get_theme', expect: {} }); return baseclass.extend({ /** * Initialize theme system * Loads theme preference from SecuBox and applies it to the page */ init: function() { var self = this; return callGetTheme().then(function(data) { var themePref = data.theme || 'dark'; self.applyTheme(themePref); // Listen for system theme changes if preference is 'system' if (themePref === 'system' && window.matchMedia) { var darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)'); darkModeQuery.addListener(function() { self.applyTheme('system'); }); } }).catch(function(err) { console.error('Failed to load theme preference from SecuBox, using dark theme:', err); self.applyTheme('dark'); }); }, /** * Apply theme to the page * @param {string} theme - Theme preference: 'dark', 'light', or 'system' */ applyTheme: function(theme) { var effectiveTheme = theme; // If 'system', detect from OS if (theme === 'system' && window.matchMedia) { effectiveTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } // Apply theme to document root document.documentElement.setAttribute('data-theme', effectiveTheme); console.log('🎨 System Hub theme applied:', theme, '(effective:', effectiveTheme + ')'); }, /** * Get current effective theme * @returns {string} 'dark' or 'light' */ getCurrentTheme: function() { return document.documentElement.getAttribute('data-theme') || 'dark'; }, /** * Get theme preference from SecuBox * @returns {Promise} Promise resolving to theme data */ getTheme: function() { return callGetTheme(); } });