secubox-openwrt/package/secubox/luci-app-exposure/htdocs/luci-static/resources/exposure/dashboard.css
CyberMind-FR b75fbd516c feat(exposure): Add Mesh column and Emancipate modal to dashboard
- Add emancipate/revoke/get_emancipated RPCD methods
- Add Mesh toggle column with blue theme styling
- Add Emancipate button in header with multi-channel modal
- Modal allows selecting Tor/DNS/Mesh channels
- Add mesh badge to header stats
- Update ACL and API wrapper for new methods

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 04:45:04 +01:00

204 lines
3.6 KiB
CSS

/* SecuBox Service Exposure - KISS theme */
:root {
--exp-bg-primary: #0d1117;
--exp-bg-secondary: #161b22;
--exp-bg-tertiary: #1a1a2e;
--exp-border: #30363d;
--exp-text-primary: #e6edf3;
--exp-text-secondary: #8892b0;
--exp-text-muted: #6e7681;
--exp-accent: #64ffda;
--exp-tor: #9b59b6;
--exp-ssl: #27ae60;
--exp-danger: #ef4444;
}
.exposure-dashboard {
padding: 0;
max-width: 1200px;
margin: 0 auto;
}
/* Header */
.exp-page-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--exp-border);
}
/* Table */
.exp-table {
width: 100%;
border-collapse: collapse;
background: var(--exp-bg-secondary);
border: 1px solid var(--exp-border);
border-radius: 8px;
overflow: hidden;
}
.exp-table th,
.exp-table td {
padding: 10px 14px;
text-align: left;
border-bottom: 1px solid var(--exp-border);
}
.exp-table th {
color: var(--exp-text-muted);
font-weight: 500;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
background: rgba(255, 255, 255, 0.02);
}
.exp-table td {
color: var(--exp-text-primary);
font-size: 13px;
}
.exp-table tr:hover td {
background: rgba(100, 255, 218, 0.03);
}
.exp-row-internal td {
opacity: 0.45;
}
/* Helpers */
.exp-mono { font-family: 'SF Mono', Monaco, monospace; }
.exp-text-muted { color: var(--exp-text-muted); }
.exp-small { font-size: 12px; }
/* Badges */
.exp-badge {
display: inline-block;
padding: 3px 8px;
border-radius: 12px;
font-size: 11px;
font-weight: 600;
margin-right: 4px;
}
.exp-badge-tor {
background: rgba(155, 89, 182, 0.2);
color: var(--exp-tor);
}
.exp-badge-ssl {
background: rgba(39, 174, 96, 0.2);
color: var(--exp-ssl);
}
.exp-badge-mesh {
background: rgba(59, 130, 246, 0.2);
color: #3b82f6;
}
/* Buttons */
.exp-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border-radius: 6px;
font-size: 13px;
cursor: pointer;
border: 1px solid transparent;
transition: all 0.15s;
text-decoration: none;
}
.exp-btn-secondary {
background: transparent;
color: var(--exp-text-secondary);
border-color: var(--exp-border);
}
.exp-btn-secondary:hover {
background: rgba(255, 255, 255, 0.05);
border-color: var(--exp-text-secondary);
}
/* Toggle switches */
.toggle-switch {
position: relative;
display: inline-block;
width: 44px;
height: 24px;
}
.toggle-switch input {
opacity: 0;
width: 0;
height: 0;
}
.toggle-slider {
position: absolute;
cursor: pointer;
top: 0; left: 0; right: 0; bottom: 0;
background-color: #333;
transition: 0.2s;
border-radius: 24px;
}
.toggle-slider:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 3px;
bottom: 3px;
background-color: #666;
transition: 0.2s;
border-radius: 50%;
}
input:checked + .toggle-slider:before {
transform: translateX(20px);
}
input:checked + .tor-slider {
background-color: rgba(155, 89, 182, 0.3);
border: 1px solid #9b59b6;
}
input:checked + .tor-slider:before {
background-color: #9b59b6;
}
input:checked + .ssl-slider {
background-color: rgba(39, 174, 96, 0.3);
border: 1px solid #27ae60;
}
input:checked + .ssl-slider:before {
background-color: #27ae60;
}
input:checked + .mesh-slider {
background-color: rgba(59, 130, 246, 0.3);
border: 1px solid #3b82f6;
}
input:checked + .mesh-slider:before {
background-color: #3b82f6;
}
/* Action button */
.exp-btn-action {
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
color: white;
border-color: transparent;
}
.exp-btn-action:hover {
background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
}