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>
This commit is contained in:
105
backend/frontend/static/js/modules/theme.js
Normal file
105
backend/frontend/static/js/modules/theme.js
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* 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';
|
||||
}
|
||||
Reference in New Issue
Block a user