ae629d1dc2
- Camada de banco unificada (src/database.js): drivers Postgres/Firebird, tradutor de SQL, suporte a schema e pool de conexões - Conexões: novo_local (Postgres externo) e firebird_local (legado) - Tela de rotas da API redesenhada (auth, params, exemplos de body) - Correções de segurança (críticos/altos/médios/baixos): XSS no chat, escalonamento de privilégio, mídia autenticada, SQL restrito a gerente, JWT sem fallback + issuer, IDOR em conversas, CORS por allowlist, rate-limit no login, limites de corpo por rota - Deploy alinhado: install.sh grava .env com PG_*, migracoes.js driver-aware Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
45 lines
1.7 KiB
JavaScript
45 lines
1.7 KiB
JavaScript
// Dark Mode Controller - Only handles initialization/persistence
|
|
(function() {
|
|
if (typeof window.darkModeToggle !== 'function') {
|
|
// Ensure function exists (inline script in head should have defined it)
|
|
window.darkModeToggle = function() {
|
|
var el = document.body;
|
|
if (!el) return;
|
|
var isDark = localStorage.getItem('chatc2_dark_mode') === 'true';
|
|
var enable = !isDark;
|
|
el.classList.toggle('dark-mode', enable);
|
|
localStorage.setItem('chatc2_dark_mode', enable ? 'true' : 'false');
|
|
document.querySelectorAll('.dark-mode-toggle').forEach(function(btn) {
|
|
btn.innerHTML = enable ? '☀️ Claro' : '🌙 Escuro';
|
|
});
|
|
};
|
|
window.darkModeApply = function(enable) {
|
|
var el = document.body;
|
|
if (!el) return;
|
|
el.classList.toggle('dark-mode', enable);
|
|
localStorage.setItem('chatc2_dark_mode', enable ? 'true' : 'false');
|
|
document.querySelectorAll('.dark-mode-toggle').forEach(function(btn) {
|
|
btn.innerHTML = enable ? '☀️ Claro' : '🌙 Escuro';
|
|
});
|
|
};
|
|
window.darkModeIsDark = function() { return localStorage.getItem('chatc2_dark_mode') === 'true'; };
|
|
}
|
|
|
|
// Apply on load
|
|
if (localStorage.getItem('chatc2_dark_mode') === 'true') {
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
document.body.classList.add('dark-mode');
|
|
document.querySelectorAll('.dark-mode-toggle').forEach(function(btn) {
|
|
btn.innerHTML = '☀️ Claro';
|
|
});
|
|
});
|
|
} else {
|
|
document.body.classList.add('dark-mode');
|
|
document.querySelectorAll('.dark-mode-toggle').forEach(function(btn) {
|
|
btn.innerHTML = '☀️ Claro';
|
|
});
|
|
}
|
|
}
|
|
})();
|