secubox-openwrt/package/secubox/luci-app-exposure/htdocs/luci-static/resources/exposure/dashboard.css
CyberMind-FR 1056026168 feat(luci): Add LuCI interface for Service Exposure Manager
Complete LuCI app with:
- Overview dashboard with stats (services, Tor, SSL counts)
- Port conflict detection and warnings
- Services list with quick actions
- Tor hidden services management (add/list/remove)
- HAProxy SSL backends management (add/list/remove)

Views: overview.js, services.js, tor.js, ssl.js
RPCD: luci.exposure backend
Menu: admin/secubox/network/exposure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 15:49:29 +01:00

242 lines
4.2 KiB
CSS

/* SecuBox Service Exposure Manager - Dashboard Styles */
.exposure-dashboard {
padding: 1rem;
}
.exposure-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-bottom: 2rem;
}
.exposure-stat-card {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
border: 1px solid #0f3460;
border-radius: 12px;
padding: 1.5rem;
text-align: center;
}
.exposure-stat-icon {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.exposure-stat-value {
font-size: 2rem;
font-weight: 700;
color: #00d4ff;
}
.exposure-stat-label {
font-size: 0.85rem;
color: #8892b0;
margin-top: 0.25rem;
}
.exposure-section {
background: #16213e;
border: 1px solid #0f3460;
border-radius: 12px;
padding: 1.5rem;
margin-bottom: 1.5rem;
}
.exposure-section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid #0f3460;
}
.exposure-section-title {
font-size: 1.1rem;
font-weight: 600;
color: #ccd6f6;
display: flex;
align-items: center;
gap: 0.5rem;
}
.exposure-section-title .icon {
font-size: 1.25rem;
}
/* Service Table */
.exposure-table {
width: 100%;
border-collapse: collapse;
}
.exposure-table th,
.exposure-table td {
padding: 0.75rem 1rem;
text-align: left;
border-bottom: 1px solid #0f3460;
}
.exposure-table th {
color: #8892b0;
font-weight: 500;
font-size: 0.85rem;
text-transform: uppercase;
}
.exposure-table td {
color: #ccd6f6;
}
.exposure-table tr:hover {
background: rgba(0, 212, 255, 0.05);
}
/* Status badges */
.badge {
display: inline-block;
padding: 0.25rem 0.75rem;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 600;
}
.badge-external {
background: rgba(0, 212, 255, 0.15);
color: #00d4ff;
}
.badge-local {
background: rgba(255, 193, 7, 0.15);
color: #ffc107;
}
.badge-tor {
background: rgba(116, 78, 182, 0.15);
color: #9b59b6;
}
.badge-ssl {
background: rgba(46, 204, 113, 0.15);
color: #2ecc71;
}
/* Onion address */
.onion-address {
font-family: monospace;
font-size: 0.85rem;
color: #9b59b6;
word-break: break-all;
}
/* Buttons */
.btn-action {
padding: 0.5rem 1rem;
border-radius: 6px;
border: none;
cursor: pointer;
font-size: 0.85rem;
transition: all 0.2s;
}
.btn-primary {
background: linear-gradient(135deg, #00d4ff, #0099cc);
color: #fff;
}
.btn-primary:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 212, 255, 0.3);
}
.btn-danger {
background: rgba(231, 76, 60, 0.2);
color: #e74c3c;
border: 1px solid #e74c3c;
}
.btn-danger:hover {
background: #e74c3c;
color: #fff;
}
.btn-tor {
background: rgba(155, 89, 182, 0.2);
color: #9b59b6;
border: 1px solid #9b59b6;
}
.btn-ssl {
background: rgba(46, 204, 113, 0.2);
color: #2ecc71;
border: 1px solid #2ecc71;
}
/* Forms */
.exposure-form {
display: flex;
gap: 1rem;
align-items: flex-end;
flex-wrap: wrap;
}
.exposure-form-group {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.exposure-form-group label {
font-size: 0.85rem;
color: #8892b0;
}
.exposure-form-group input,
.exposure-form-group select {
padding: 0.5rem 0.75rem;
border-radius: 6px;
border: 1px solid #0f3460;
background: #1a1a2e;
color: #ccd6f6;
font-size: 0.9rem;
}
.exposure-form-group input:focus,
.exposure-form-group select:focus {
outline: none;
border-color: #00d4ff;
}
/* Empty state */
.exposure-empty {
text-align: center;
padding: 2rem;
color: #8892b0;
}
.exposure-empty .icon {
font-size: 3rem;
margin-bottom: 1rem;
opacity: 0.5;
}
/* Port conflict warning */
.conflict-warning {
background: rgba(231, 76, 60, 0.1);
border: 1px solid #e74c3c;
border-radius: 8px;
padding: 1rem;
margin-bottom: 1rem;
}
.conflict-warning-header {
display: flex;
align-items: center;
gap: 0.5rem;
color: #e74c3c;
font-weight: 600;
margin-bottom: 0.5rem;
}