secubox-openwrt/package/secubox/luci-theme-secubox/htdocs/luci-static/resources/secubox-theme/kiss-loader.js
CyberMind-FR 92ec210524 feat(theme): Add global KISS mode support to SecuBox theme
- Add setKissMode(), toggleKissMode(), isKissMode() methods to theme.js
- Add initKissMode() for automatic initialization from localStorage
- Add _injectKissCSS() for dark theme styling
- Add _injectKissSidebar() for C3BOX navigation
- Add _hideChrome()/_showChrome() for toggling LuCI UI elements
- Add kiss-loader.js for standalone auto-initialization
- KISS mode persists via localStorage across all pages

Usage:
1. Click the eye toggle (👁️) on any SecuBox page
2. Or call Theme.setKissMode(true) from JS console
3. Mode persists across page navigation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 12:19:49 +01:00

151 lines
7.7 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
/**
* KISS Mode Auto-Loader
* Automatically enables KISS mode if previously enabled via localStorage
* Include this script in the LuCI header/footer to enable global KISS mode
*/
(function() {
// Check if KISS mode is enabled
var kissEnabled = false;
try {
kissEnabled = window.localStorage.getItem('secubox.kissMode') === '1';
} catch (e) {}
// Early CSS injection for flicker-free loading
if (kissEnabled) {
var css = ':root{--kiss-bg:#0a0e17;--kiss-bg2:#111827;--kiss-card:#161e2e;--kiss-line:#1e293b;--kiss-text:#e2e8f0;--kiss-muted:#94a3b8;--kiss-green:#00C853}body{background:var(--kiss-bg)!important;color:var(--kiss-text)!important}#mainmenu,.main-left,header,footer,#topmenu,#tabmenu,nav[role="navigation"],aside{display:none!important}.main-right,#maincontent,.container{margin-left:200px!important;background:var(--kiss-bg)!important}';
var style = document.createElement('style');
style.id = 'kiss-early-css';
style.textContent = css;
document.head.appendChild(style);
}
// Full initialization after DOM ready
function initKiss() {
// Load the theme module and initialize KISS mode
if (typeof L !== 'undefined' && L.require) {
L.require('secubox-theme/theme').then(function(Theme) {
Theme.initKissMode();
}).catch(function() {
// Fallback: manual initialization
manualKissInit();
});
} else {
manualKissInit();
}
}
// Manual KISS initialization without LuCI loader
function manualKissInit() {
if (!kissEnabled) {
addToggleOnly();
return;
}
// Inject full CSS
if (!document.querySelector('#kiss-global-css')) {
var fullCss = '\
.kiss-sidebar{position:fixed;left:0;top:0;bottom:0;width:200px;background:linear-gradient(180deg,#0d1321 0%,var(--kiss-bg) 100%);border-right:1px solid var(--kiss-line);z-index:1000;display:flex;flex-direction:column;overflow-y:auto}\
.kiss-sidebar-logo{padding:16px;border-bottom:1px solid var(--kiss-line);text-align:center}\
.kiss-logo-text{font-weight:900;font-size:24px;letter-spacing:-1px}\
.kiss-logo-sub{font-size:9px;color:var(--kiss-muted);letter-spacing:2px;margin-top:4px}\
.kiss-nav{flex:1;padding:8px 0}\
.kiss-nav-section{padding:8px 12px 4px;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--kiss-muted)}\
.kiss-nav-item{display:flex;align-items:center;gap:10px;padding:8px 16px;text-decoration:none;font-size:13px;color:var(--kiss-muted);transition:all 0.2s;border-left:2px solid transparent}\
.kiss-nav-item:hover{background:rgba(255,255,255,0.03);color:var(--kiss-text)}\
.kiss-nav-item.active{color:var(--kiss-green);background:rgba(0,200,83,0.05);border-left-color:var(--kiss-green)}\
.kiss-nav-icon{font-size:16px;width:20px;text-align:center}\
body.kiss-mode .cbi-section{background:var(--kiss-card)!important;border:1px solid var(--kiss-line)!important;border-radius:12px!important;padding:20px!important}\
body.kiss-mode .table th,body.kiss-mode table th{background:var(--kiss-bg2)!important;color:var(--kiss-muted)!important;border-color:var(--kiss-line)!important}\
body.kiss-mode .table td,body.kiss-mode table td{border-color:var(--kiss-line)!important;color:var(--kiss-text)!important}\
body.kiss-mode .cbi-button,body.kiss-mode button{background:var(--kiss-bg2)!important;border:1px solid var(--kiss-line)!important;color:var(--kiss-text)!important;border-radius:8px!important}\
body.kiss-mode input,body.kiss-mode select{background:var(--kiss-bg2)!important;border:1px solid var(--kiss-line)!important;color:var(--kiss-text)!important;border-radius:6px!important}\
#kiss-toggle{position:fixed;top:10px;right:10px;z-index:99999;font-size:28px;cursor:pointer;opacity:0.7;transition:all 0.3s;background:rgba(0,0,0,0.6);border-radius:50%;width:46px;height:46px;display:flex;align-items:center;justify-content:center;border:1px solid var(--kiss-line)}\
#kiss-toggle:hover{opacity:1;transform:scale(1.1)}\
@media(max-width:768px){.kiss-sidebar{width:60px}.kiss-sidebar-logo,.kiss-nav-section{display:none}.kiss-nav-item{padding:12px;justify-content:center}.kiss-nav-item span:last-child{display:none}body.kiss-mode .main-right,body.kiss-mode #maincontent{margin-left:60px!important}}\
@media(max-width:480px){.kiss-sidebar{display:none}body.kiss-mode .main-right,body.kiss-mode #maincontent{margin-left:0!important}}\
';
var style = document.createElement('style');
style.id = 'kiss-global-css';
style.textContent = fullCss;
document.head.appendChild(style);
}
document.body.classList.add('kiss-mode');
// Inject sidebar
if (!document.querySelector('.kiss-sidebar')) {
var nav = [
{ cat: 'Main', items: [
{ icon: '🏠', name: 'Home', path: 'admin/secubox-home' },
{ icon: '📊', name: 'System Hub', path: 'admin/secubox/system/system-hub' }
]},
{ cat: 'Security', items: [
{ icon: '🧙', name: 'InterceptoR', path: 'admin/secubox/interceptor/overview' },
{ icon: '🛡️', name: 'CrowdSec', path: 'admin/secubox/security/crowdsec' },
{ icon: '🔍', name: 'mitmproxy', path: 'admin/secubox/security/mitmproxy/status' }
]},
{ cat: 'Services', items: [
{ icon: '📡', name: 'IoT Guard', path: 'admin/secubox/services/iot-guard' },
{ icon: '💾', name: 'CDN Cache', path: 'admin/services/cdn-cache' },
{ icon: '🔗', name: 'HAProxy', path: 'admin/services/haproxy' }
]},
{ cat: 'Navigate', items: [
{ icon: '🌳', name: 'LuCI Tree', path: 'admin/secubox/luci-tree' },
{ icon: '⚙️', name: 'System', path: 'admin/system/system' }
]}
];
var currentPath = window.location.pathname.replace('/cgi-bin/luci/', '');
var sidebar = document.createElement('nav');
sidebar.className = 'kiss-sidebar';
sidebar.innerHTML = '<div class="kiss-sidebar-logo"><div class="kiss-logo-text"><span style="color:#00C853">C</span><span style="color:#FF1744;font-size:14px;vertical-align:super">3</span><span style="color:#2979FF">B</span><span style="color:#37474F">O</span><span style="color:#00C853">X</span></div><div class="kiss-logo-sub">SECUBOX</div></div>';
var navEl = document.createElement('div');
navEl.className = 'kiss-nav';
nav.forEach(function(cat) {
navEl.innerHTML += '<div class="kiss-nav-section">' + cat.cat + '</div>';
cat.items.forEach(function(item) {
var isActive = currentPath.indexOf(item.path) !== -1;
navEl.innerHTML += '<a href="/cgi-bin/luci/' + item.path + '" class="kiss-nav-item' + (isActive ? ' active' : '') + '"><span class="kiss-nav-icon">' + item.icon + '</span><span>' + item.name + '</span></a>';
});
});
sidebar.appendChild(navEl);
document.body.insertBefore(sidebar, document.body.firstChild);
}
addToggleOnly();
}
function addToggleOnly() {
if (document.querySelector('#kiss-toggle')) return;
var toggle = document.createElement('div');
toggle.id = 'kiss-toggle';
toggle.innerHTML = kissEnabled ? '👁' : '👁🗨';
toggle.title = 'Toggle KISS/LuCI mode (click to switch)';
toggle.style.cssText = 'position:fixed;top:10px;right:10px;z-index:99999;font-size:28px;cursor:pointer;opacity:0.7;transition:all 0.3s;background:rgba(0,0,0,0.6);border-radius:50%;width:46px;height:46px;display:flex;align-items:center;justify-content:center;border:1px solid #1e293b';
toggle.onmouseover = function() { this.style.opacity = '1'; this.style.transform = 'scale(1.1)'; };
toggle.onmouseout = function() { this.style.opacity = '0.7'; this.style.transform = 'scale(1)'; };
toggle.onclick = function() {
try {
var newState = window.localStorage.getItem('secubox.kissMode') !== '1';
window.localStorage.setItem('secubox.kissMode', newState ? '1' : '0');
} catch (e) {}
window.location.reload();
};
document.body.appendChild(toggle);
}
// Initialize when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initKiss);
} else {
initKiss();
}
})();