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>
106 lines
2.6 KiB
JavaScript
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';
|
|
}
|