This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
breakpilot-pwa/backend/frontend/static/js/modules/theme.js
Benjamin Admin 21a844cb8a fix: Restore all files lost during destructive rebase
A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.

This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).

Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:51:32 +01:00

106 lines
2.6 KiB
JavaScript

/**
* BreakPilot Studio - Theme Module
*
* Dark/Light Mode Toggle-Funktionalität:
* - Speichert Präferenz in localStorage
* - Unterstützt data-theme Attribut auf <html>
*
* Refactored: 2026-01-19
*/
// Initialisiere Theme sofort beim Laden (IIFE)
(function initializeTheme() {
const savedTheme = localStorage.getItem('bp-theme') || 'dark';
document.documentElement.setAttribute('data-theme', savedTheme);
console.log('Initial theme set to:', savedTheme);
})();
/**
* Holt das aktuelle Theme
* @returns {string} - 'dark' oder 'light'
*/
export function getCurrentTheme() {
return document.documentElement.getAttribute('data-theme') || 'dark';
}
/**
* Setzt das Theme
* @param {string} theme - 'dark' oder 'light'
*/
export function setTheme(theme) {
if (theme !== 'dark' && theme !== 'light') {
console.warn(`Invalid theme: ${theme}. Use 'dark' or 'light'.`);
return;
}
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('bp-theme', theme);
// Custom Event für andere Module
window.dispatchEvent(new CustomEvent('themeChanged', {
detail: { theme }
}));
}
/**
* Wechselt zwischen Dark und Light Mode
* @returns {string} - Das neue Theme
*/
export function toggleTheme() {
const current = getCurrentTheme();
const newTheme = current === 'dark' ? 'light' : 'dark';
setTheme(newTheme);
return newTheme;
}
/**
* Initialisiert den Theme-Toggle-Button
* Sucht nach Elements mit IDs: theme-toggle, theme-icon, theme-label
*/
export function initThemeToggle() {
const toggle = document.getElementById('theme-toggle');
const icon = document.getElementById('theme-icon');
const label = document.getElementById('theme-label');
if (!toggle || !icon || !label) {
console.warn('Theme toggle elements not found (theme-toggle, theme-icon, theme-label)');
return;
}
function updateToggleUI(theme) {
if (theme === 'light') {
icon.textContent = '☀️';
label.textContent = 'Light';
} else {
icon.textContent = '🌙';
label.textContent = 'Dark';
}
}
// Initialize UI based on current theme
updateToggleUI(getCurrentTheme());
// Click-Handler
toggle.addEventListener('click', function() {
console.log('Theme toggle clicked');
const newTheme = toggleTheme();
console.log('Switched to:', newTheme);
updateToggleUI(newTheme);
});
}
/**
* Prüft ob Dark Mode aktiv ist
* @returns {boolean}
*/
export function isDarkMode() {
return getCurrentTheme() === 'dark';
}
/**
* Prüft ob Light Mode aktiv ist
* @returns {boolean}
*/
export function isLightMode() {
return getCurrentTheme() === 'light';
}