|
|
|
|
|
* { |
|
|
margin: 0; |
|
|
padding: 0; |
|
|
box-sizing: border-box; |
|
|
} |
|
|
|
|
|
body { |
|
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
|
|
background-color: #f5f7fa; |
|
|
color: #333; |
|
|
line-height: 1.6; |
|
|
} |
|
|
|
|
|
|
|
|
.dashboard-header { |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
color: white; |
|
|
padding: 1rem 2rem; |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
align-items: center; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
position: sticky; |
|
|
top: 0; |
|
|
z-index: 1000; |
|
|
} |
|
|
|
|
|
.header-left .logo { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
} |
|
|
|
|
|
.header-left .logo i { |
|
|
font-size: 1.5rem; |
|
|
} |
|
|
|
|
|
.header-left .logo h1 { |
|
|
font-size: 1.5rem; |
|
|
font-weight: 600; |
|
|
} |
|
|
|
|
|
.user-info { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 1rem; |
|
|
position: relative; |
|
|
} |
|
|
|
|
|
.user-name { |
|
|
font-weight: 500; |
|
|
} |
|
|
|
|
|
.user-menu-btn { |
|
|
background: none; |
|
|
border: none; |
|
|
color: white; |
|
|
font-size: 1.5rem; |
|
|
cursor: pointer; |
|
|
padding: 0.5rem; |
|
|
border-radius: 50%; |
|
|
transition: background-color 0.3s; |
|
|
} |
|
|
|
|
|
.user-menu-btn:hover { |
|
|
background-color: rgba(255,255,255,0.1); |
|
|
} |
|
|
|
|
|
.user-dropdown { |
|
|
position: absolute; |
|
|
top: 100%; |
|
|
right: 0; |
|
|
background: white; |
|
|
color: #333; |
|
|
border-radius: 8px; |
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.15); |
|
|
min-width: 150px; |
|
|
display: none; |
|
|
z-index: 1001; |
|
|
} |
|
|
|
|
|
.user-dropdown.show { |
|
|
display: block; |
|
|
} |
|
|
|
|
|
.user-dropdown a { |
|
|
display: block; |
|
|
padding: 0.75rem 1rem; |
|
|
text-decoration: none; |
|
|
color: #333; |
|
|
transition: background-color 0.3s; |
|
|
} |
|
|
|
|
|
.user-dropdown a:hover { |
|
|
background-color: #f8f9fa; |
|
|
} |
|
|
|
|
|
.user-dropdown a i { |
|
|
margin-right: 0.5rem; |
|
|
width: 16px; |
|
|
} |
|
|
|
|
|
|
|
|
.dashboard-container { |
|
|
display: flex; |
|
|
min-height: calc(100vh - 80px); |
|
|
} |
|
|
|
|
|
|
|
|
.sidebar { |
|
|
width: 250px; |
|
|
background: white; |
|
|
box-shadow: 2px 0 10px rgba(0,0,0,0.1); |
|
|
position: sticky; |
|
|
top: 80px; |
|
|
height: calc(100vh - 80px); |
|
|
overflow-y: auto; |
|
|
} |
|
|
|
|
|
.sidebar-nav ul { |
|
|
list-style: none; |
|
|
padding: 1rem 0; |
|
|
} |
|
|
|
|
|
.nav-item a { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 0.75rem; |
|
|
padding: 1rem 1.5rem; |
|
|
text-decoration: none; |
|
|
color: #666; |
|
|
transition: all 0.3s; |
|
|
border-left: 3px solid transparent; |
|
|
} |
|
|
|
|
|
.nav-item a:hover, |
|
|
.nav-item.active a { |
|
|
background-color: #f8f9fa; |
|
|
color: #667eea; |
|
|
border-left-color: #667eea; |
|
|
} |
|
|
|
|
|
.nav-item a i { |
|
|
width: 20px; |
|
|
text-align: center; |
|
|
} |
|
|
|
|
|
|
|
|
.main-content { |
|
|
flex: 1; |
|
|
padding: 2rem; |
|
|
overflow-y: auto; |
|
|
} |
|
|
|
|
|
.content-section { |
|
|
display: none; |
|
|
} |
|
|
|
|
|
.content-section.active { |
|
|
display: block; |
|
|
} |
|
|
|
|
|
.section-header { |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.section-header h2 { |
|
|
font-size: 2rem; |
|
|
color: #333; |
|
|
margin-bottom: 0.5rem; |
|
|
} |
|
|
|
|
|
.section-header p { |
|
|
color: #666; |
|
|
font-size: 1.1rem; |
|
|
} |
|
|
|
|
|
.section-header .btn { |
|
|
float: right; |
|
|
margin-top: -3rem; |
|
|
} |
|
|
|
|
|
|
|
|
.stats-grid { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); |
|
|
gap: 1.5rem; |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.stat-card { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 1rem; |
|
|
transition: transform 0.3s, box-shadow 0.3s; |
|
|
} |
|
|
|
|
|
.stat-card:hover { |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.15); |
|
|
} |
|
|
|
|
|
.stat-icon { |
|
|
width: 60px; |
|
|
height: 60px; |
|
|
border-radius: 12px; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
font-size: 1.5rem; |
|
|
color: white; |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
} |
|
|
|
|
|
.stat-content h3 { |
|
|
font-size: 1.8rem; |
|
|
font-weight: 600; |
|
|
color: #333; |
|
|
margin-bottom: 0.25rem; |
|
|
} |
|
|
|
|
|
.stat-content p { |
|
|
color: #666; |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
|
|
|
.quick-actions { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.quick-actions h3 { |
|
|
margin-bottom: 1rem; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.action-buttons { |
|
|
display: flex; |
|
|
gap: 1rem; |
|
|
flex-wrap: wrap; |
|
|
} |
|
|
|
|
|
.action-btn { |
|
|
padding: 0.75rem 1.5rem; |
|
|
border: none; |
|
|
border-radius: 8px; |
|
|
cursor: pointer; |
|
|
font-weight: 500; |
|
|
text-decoration: none; |
|
|
display: inline-flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
transition: all 0.3s; |
|
|
} |
|
|
|
|
|
.action-btn.primary { |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
color: white; |
|
|
} |
|
|
|
|
|
.action-btn.primary:hover { |
|
|
transform: translateY(-1px); |
|
|
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); |
|
|
} |
|
|
|
|
|
.action-btn.secondary { |
|
|
background: #f8f9fa; |
|
|
color: #666; |
|
|
border: 1px solid #e9ecef; |
|
|
} |
|
|
|
|
|
.action-btn.secondary:hover { |
|
|
background: #e9ecef; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
|
|
|
.recent-activity { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
} |
|
|
|
|
|
.recent-activity h3 { |
|
|
margin-bottom: 1rem; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.activity-list { |
|
|
max-height: 300px; |
|
|
overflow-y: auto; |
|
|
} |
|
|
|
|
|
.activity-item { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 1rem; |
|
|
padding: 0.75rem 0; |
|
|
border-bottom: 1px solid #f1f3f4; |
|
|
} |
|
|
|
|
|
.activity-item:last-child { |
|
|
border-bottom: none; |
|
|
} |
|
|
|
|
|
.activity-item i { |
|
|
color: #667eea; |
|
|
width: 20px; |
|
|
} |
|
|
|
|
|
.activity-item span { |
|
|
flex: 1; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.activity-item time { |
|
|
color: #666; |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
|
|
|
.client-filters { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
margin-bottom: 1.5rem; |
|
|
display: flex; |
|
|
gap: 1.5rem; |
|
|
flex-wrap: wrap; |
|
|
align-items: end; |
|
|
} |
|
|
|
|
|
.filter-group { |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
gap: 0.5rem; |
|
|
} |
|
|
|
|
|
.filter-group label { |
|
|
font-weight: 500; |
|
|
color: #333; |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
.filter-group select, |
|
|
.filter-group input { |
|
|
padding: 0.5rem; |
|
|
border: 1px solid #ddd; |
|
|
border-radius: 6px; |
|
|
font-size: 0.9rem; |
|
|
min-width: 150px; |
|
|
} |
|
|
|
|
|
.filter-group input[type="text"] { |
|
|
min-width: 200px; |
|
|
} |
|
|
|
|
|
|
|
|
.clients-table-container { |
|
|
background: white; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.clients-table { |
|
|
width: 100%; |
|
|
border-collapse: collapse; |
|
|
} |
|
|
|
|
|
.clients-table th, |
|
|
.clients-table td { |
|
|
padding: 1rem; |
|
|
text-align: left; |
|
|
border-bottom: 1px solid #f1f3f4; |
|
|
} |
|
|
|
|
|
.clients-table th { |
|
|
background: #f8f9fa; |
|
|
font-weight: 600; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.clients-table tbody tr:hover { |
|
|
background: #f8f9fa; |
|
|
} |
|
|
|
|
|
.status-badge { |
|
|
padding: 0.25rem 0.75rem; |
|
|
border-radius: 20px; |
|
|
font-size: 0.8rem; |
|
|
font-weight: 500; |
|
|
text-transform: uppercase; |
|
|
} |
|
|
|
|
|
.status-badge.active { |
|
|
background: #d4edda; |
|
|
color: #155724; |
|
|
} |
|
|
|
|
|
.status-badge.inactive { |
|
|
background: #f8d7da; |
|
|
color: #721c24; |
|
|
} |
|
|
|
|
|
.status-badge.revoked { |
|
|
background: #fff3cd; |
|
|
color: #856404; |
|
|
} |
|
|
|
|
|
.client-actions { |
|
|
display: flex; |
|
|
gap: 0.5rem; |
|
|
} |
|
|
|
|
|
.client-actions .btn { |
|
|
padding: 0.25rem 0.5rem; |
|
|
font-size: 0.8rem; |
|
|
} |
|
|
|
|
|
|
|
|
.server-grid { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); |
|
|
gap: 1.5rem; |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.server-card { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
transition: transform 0.3s, box-shadow 0.3s; |
|
|
} |
|
|
|
|
|
.server-card:hover { |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.15); |
|
|
} |
|
|
|
|
|
.server-header { |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
align-items: center; |
|
|
margin-bottom: 1rem; |
|
|
} |
|
|
|
|
|
.server-header h3 { |
|
|
color: #333; |
|
|
font-size: 1.2rem; |
|
|
} |
|
|
|
|
|
.server-status { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
font-size: 0.9rem; |
|
|
font-weight: 500; |
|
|
} |
|
|
|
|
|
.status-dot { |
|
|
width: 8px; |
|
|
height: 8px; |
|
|
border-radius: 50%; |
|
|
background: #dc3545; |
|
|
} |
|
|
|
|
|
.server-status.online .status-dot { |
|
|
background: #28a745; |
|
|
} |
|
|
|
|
|
.server-status.online { |
|
|
color: #28a745; |
|
|
} |
|
|
|
|
|
.server-status.offline { |
|
|
color: #dc3545; |
|
|
} |
|
|
|
|
|
.server-info { |
|
|
margin-bottom: 1rem; |
|
|
} |
|
|
|
|
|
.server-info p { |
|
|
margin-bottom: 0.5rem; |
|
|
color: #666; |
|
|
} |
|
|
|
|
|
.server-actions { |
|
|
display: flex; |
|
|
gap: 0.5rem; |
|
|
flex-wrap: wrap; |
|
|
} |
|
|
|
|
|
|
|
|
.server-logs { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
} |
|
|
|
|
|
.server-logs h3 { |
|
|
margin-bottom: 1rem; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.logs-controls { |
|
|
display: flex; |
|
|
gap: 1rem; |
|
|
margin-bottom: 1rem; |
|
|
align-items: center; |
|
|
} |
|
|
|
|
|
.logs-controls select { |
|
|
padding: 0.5rem; |
|
|
border: 1px solid #ddd; |
|
|
border-radius: 6px; |
|
|
} |
|
|
|
|
|
.logs-container { |
|
|
background: #1e1e1e; |
|
|
color: #f8f8f2; |
|
|
padding: 1rem; |
|
|
border-radius: 8px; |
|
|
font-family: 'Courier New', monospace; |
|
|
font-size: 0.9rem; |
|
|
max-height: 400px; |
|
|
overflow-y: auto; |
|
|
} |
|
|
|
|
|
.logs-content { |
|
|
white-space: pre-wrap; |
|
|
word-break: break-all; |
|
|
} |
|
|
|
|
|
|
|
|
.protocols-grid { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); |
|
|
gap: 1.5rem; |
|
|
} |
|
|
|
|
|
.protocol-card { |
|
|
background: white; |
|
|
padding: 2rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
transition: transform 0.3s, box-shadow 0.3s; |
|
|
} |
|
|
|
|
|
.protocol-card:hover { |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.15); |
|
|
} |
|
|
|
|
|
.protocol-header { |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 1rem; |
|
|
margin-bottom: 1rem; |
|
|
} |
|
|
|
|
|
.protocol-icon { |
|
|
width: 50px; |
|
|
height: 50px; |
|
|
border-radius: 10px; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
font-size: 1.5rem; |
|
|
color: white; |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
} |
|
|
|
|
|
.protocol-header h3 { |
|
|
color: #333; |
|
|
font-size: 1.3rem; |
|
|
} |
|
|
|
|
|
.protocol-description { |
|
|
color: #666; |
|
|
margin-bottom: 1.5rem; |
|
|
line-height: 1.6; |
|
|
} |
|
|
|
|
|
.protocol-details { |
|
|
display: grid; |
|
|
grid-template-columns: 1fr 1fr; |
|
|
gap: 1rem; |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
|
|
|
.protocol-detail { |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
padding: 0.5rem 0; |
|
|
border-bottom: 1px solid #f1f3f4; |
|
|
} |
|
|
|
|
|
.protocol-detail:last-child { |
|
|
border-bottom: none; |
|
|
} |
|
|
|
|
|
.protocol-features { |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
|
|
|
.protocol-features h4 { |
|
|
color: #333; |
|
|
margin-bottom: 0.75rem; |
|
|
font-size: 1rem; |
|
|
} |
|
|
|
|
|
.protocol-features ul { |
|
|
list-style: none; |
|
|
padding: 0; |
|
|
} |
|
|
|
|
|
.protocol-features li { |
|
|
padding: 0.25rem 0; |
|
|
color: #666; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
} |
|
|
|
|
|
.protocol-features li::before { |
|
|
content: '✓'; |
|
|
color: #28a745; |
|
|
font-weight: bold; |
|
|
} |
|
|
|
|
|
|
|
|
.usage-stats { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); |
|
|
gap: 1.5rem; |
|
|
} |
|
|
|
|
|
.usage-card { |
|
|
background: white; |
|
|
padding: 1.5rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
} |
|
|
|
|
|
.usage-card h3 { |
|
|
margin-bottom: 1rem; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.usage-chart { |
|
|
height: 300px; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
background: #f8f9fa; |
|
|
border-radius: 8px; |
|
|
color: #666; |
|
|
} |
|
|
|
|
|
.time-range-selector { |
|
|
float: right; |
|
|
margin-top: -3rem; |
|
|
} |
|
|
|
|
|
.time-range-selector select { |
|
|
padding: 0.5rem; |
|
|
border: 1px solid #ddd; |
|
|
border-radius: 6px; |
|
|
} |
|
|
|
|
|
|
|
|
.security-cards { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); |
|
|
gap: 1.5rem; |
|
|
} |
|
|
|
|
|
.security-card { |
|
|
background: white; |
|
|
padding: 2rem; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1); |
|
|
transition: transform 0.3s, box-shadow 0.3s; |
|
|
} |
|
|
|
|
|
.security-card:hover { |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.15); |
|
|
} |
|
|
|
|
|
.security-card h3 { |
|
|
color: #333; |
|
|
margin-bottom: 0.5rem; |
|
|
} |
|
|
|
|
|
.security-card p { |
|
|
color: #666; |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
|
|
|
.security-actions { |
|
|
display: flex; |
|
|
gap: 0.5rem; |
|
|
flex-wrap: wrap; |
|
|
} |
|
|
|
|
|
|
|
|
.btn { |
|
|
padding: 0.75rem 1.5rem; |
|
|
border: none; |
|
|
border-radius: 8px; |
|
|
cursor: pointer; |
|
|
font-weight: 500; |
|
|
text-decoration: none; |
|
|
display: inline-flex; |
|
|
align-items: center; |
|
|
gap: 0.5rem; |
|
|
transition: all 0.3s; |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
.btn.primary { |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
color: white; |
|
|
} |
|
|
|
|
|
.btn.primary:hover { |
|
|
transform: translateY(-1px); |
|
|
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); |
|
|
} |
|
|
|
|
|
.btn.secondary { |
|
|
background: #f8f9fa; |
|
|
color: #666; |
|
|
border: 1px solid #e9ecef; |
|
|
} |
|
|
|
|
|
.btn.secondary:hover { |
|
|
background: #e9ecef; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.btn.danger { |
|
|
background: #dc3545; |
|
|
color: white; |
|
|
} |
|
|
|
|
|
.btn.danger:hover { |
|
|
background: #c82333; |
|
|
transform: translateY(-1px); |
|
|
} |
|
|
|
|
|
.btn.small { |
|
|
padding: 0.5rem 1rem; |
|
|
font-size: 0.8rem; |
|
|
} |
|
|
|
|
|
.btn:disabled { |
|
|
opacity: 0.6; |
|
|
cursor: not-allowed; |
|
|
transform: none !important; |
|
|
} |
|
|
|
|
|
|
|
|
.modal { |
|
|
display: none; |
|
|
position: fixed; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
background: rgba(0,0,0,0.5); |
|
|
z-index: 2000; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
} |
|
|
|
|
|
.modal.show { |
|
|
display: flex; |
|
|
} |
|
|
|
|
|
.modal-content { |
|
|
background: white; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 10px 40px rgba(0,0,0,0.3); |
|
|
max-width: 500px; |
|
|
width: 90%; |
|
|
max-height: 90vh; |
|
|
overflow-y: auto; |
|
|
} |
|
|
|
|
|
.modal-header { |
|
|
padding: 1.5rem; |
|
|
border-bottom: 1px solid #f1f3f4; |
|
|
display: flex; |
|
|
justify-content: space-between; |
|
|
align-items: center; |
|
|
} |
|
|
|
|
|
.modal-header h3 { |
|
|
color: #333; |
|
|
margin: 0; |
|
|
} |
|
|
|
|
|
.modal-close { |
|
|
background: none; |
|
|
border: none; |
|
|
font-size: 1.2rem; |
|
|
cursor: pointer; |
|
|
color: #666; |
|
|
padding: 0.5rem; |
|
|
border-radius: 50%; |
|
|
transition: background-color 0.3s; |
|
|
} |
|
|
|
|
|
.modal-close:hover { |
|
|
background: #f8f9fa; |
|
|
} |
|
|
|
|
|
.modal-body { |
|
|
padding: 1.5rem; |
|
|
} |
|
|
|
|
|
|
|
|
.form-group { |
|
|
margin-bottom: 1.5rem; |
|
|
} |
|
|
|
|
|
.form-group label { |
|
|
display: block; |
|
|
margin-bottom: 0.5rem; |
|
|
font-weight: 500; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.form-group input, |
|
|
.form-group select, |
|
|
.form-group textarea { |
|
|
width: 100%; |
|
|
padding: 0.75rem; |
|
|
border: 1px solid #ddd; |
|
|
border-radius: 6px; |
|
|
font-size: 1rem; |
|
|
transition: border-color 0.3s; |
|
|
} |
|
|
|
|
|
.form-group input:focus, |
|
|
.form-group select:focus, |
|
|
.form-group textarea:focus { |
|
|
outline: none; |
|
|
border-color: #667eea; |
|
|
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); |
|
|
} |
|
|
|
|
|
.form-group textarea { |
|
|
resize: vertical; |
|
|
min-height: 80px; |
|
|
} |
|
|
|
|
|
.form-actions { |
|
|
display: flex; |
|
|
gap: 1rem; |
|
|
justify-content: flex-end; |
|
|
margin-top: 2rem; |
|
|
} |
|
|
|
|
|
|
|
|
.alert-container { |
|
|
position: fixed; |
|
|
top: 100px; |
|
|
right: 20px; |
|
|
z-index: 3000; |
|
|
max-width: 400px; |
|
|
} |
|
|
|
|
|
.alert { |
|
|
background: white; |
|
|
border-radius: 8px; |
|
|
box-shadow: 0 4px 20px rgba(0,0,0,0.15); |
|
|
padding: 1rem 1.5rem; |
|
|
margin-bottom: 1rem; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
gap: 1rem; |
|
|
border-left: 4px solid #667eea; |
|
|
animation: slideIn 0.3s ease-out; |
|
|
} |
|
|
|
|
|
.alert.success { |
|
|
border-left-color: #28a745; |
|
|
} |
|
|
|
|
|
.alert.error { |
|
|
border-left-color: #dc3545; |
|
|
} |
|
|
|
|
|
.alert.warning { |
|
|
border-left-color: #ffc107; |
|
|
} |
|
|
|
|
|
.alert-icon { |
|
|
font-size: 1.2rem; |
|
|
} |
|
|
|
|
|
.alert.success .alert-icon { |
|
|
color: #28a745; |
|
|
} |
|
|
|
|
|
.alert.error .alert-icon { |
|
|
color: #dc3545; |
|
|
} |
|
|
|
|
|
.alert.warning .alert-icon { |
|
|
color: #ffc107; |
|
|
} |
|
|
|
|
|
.alert-content { |
|
|
flex: 1; |
|
|
} |
|
|
|
|
|
.alert-title { |
|
|
font-weight: 600; |
|
|
margin-bottom: 0.25rem; |
|
|
color: #333; |
|
|
} |
|
|
|
|
|
.alert-message { |
|
|
color: #666; |
|
|
font-size: 0.9rem; |
|
|
} |
|
|
|
|
|
.alert-close { |
|
|
background: none; |
|
|
border: none; |
|
|
font-size: 1.2rem; |
|
|
cursor: pointer; |
|
|
color: #666; |
|
|
padding: 0.25rem; |
|
|
} |
|
|
|
|
|
@keyframes slideIn { |
|
|
from { |
|
|
transform: translateX(100%); |
|
|
opacity: 0; |
|
|
} |
|
|
to { |
|
|
transform: translateX(0); |
|
|
opacity: 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.loading-overlay { |
|
|
display: none; |
|
|
position: fixed; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
background: rgba(255,255,255,0.9); |
|
|
z-index: 4000; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
flex-direction: column; |
|
|
gap: 1rem; |
|
|
} |
|
|
|
|
|
.loading-overlay.show { |
|
|
display: flex; |
|
|
} |
|
|
|
|
|
.loading-spinner { |
|
|
width: 40px; |
|
|
height: 40px; |
|
|
border: 4px solid #f3f3f3; |
|
|
border-top: 4px solid #667eea; |
|
|
border-radius: 50%; |
|
|
animation: spin 1s linear infinite; |
|
|
} |
|
|
|
|
|
@keyframes spin { |
|
|
0% { transform: rotate(0deg); } |
|
|
100% { transform: rotate(360deg); } |
|
|
} |
|
|
|
|
|
.loading-row .loading-spinner { |
|
|
width: 20px; |
|
|
height: 20px; |
|
|
border-width: 2px; |
|
|
margin-right: 0.5rem; |
|
|
display: inline-block; |
|
|
} |
|
|
|
|
|
|
|
|
@media (max-width: 768px) { |
|
|
.dashboard-container { |
|
|
flex-direction: column; |
|
|
} |
|
|
|
|
|
.sidebar { |
|
|
width: 100%; |
|
|
height: auto; |
|
|
position: static; |
|
|
} |
|
|
|
|
|
.main-content { |
|
|
padding: 1rem; |
|
|
} |
|
|
|
|
|
.stats-grid { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
|
|
|
.server-grid { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
|
|
|
.protocols-grid { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
|
|
|
.usage-stats { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
|
|
|
.security-cards { |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
|
|
|
.client-filters { |
|
|
flex-direction: column; |
|
|
align-items: stretch; |
|
|
} |
|
|
|
|
|
.filter-group { |
|
|
width: 100%; |
|
|
} |
|
|
|
|
|
.filter-group select, |
|
|
.filter-group input { |
|
|
min-width: auto; |
|
|
width: 100%; |
|
|
} |
|
|
|
|
|
.section-header .btn { |
|
|
float: none; |
|
|
margin-top: 1rem; |
|
|
display: block; |
|
|
width: 100%; |
|
|
} |
|
|
|
|
|
.time-range-selector { |
|
|
float: none; |
|
|
margin-top: 1rem; |
|
|
margin-bottom: 1rem; |
|
|
} |
|
|
|
|
|
.action-buttons { |
|
|
flex-direction: column; |
|
|
} |
|
|
|
|
|
.action-btn { |
|
|
justify-content: center; |
|
|
} |
|
|
|
|
|
.server-actions { |
|
|
justify-content: center; |
|
|
} |
|
|
|
|
|
.security-actions { |
|
|
justify-content: center; |
|
|
} |
|
|
|
|
|
.form-actions { |
|
|
flex-direction: column; |
|
|
} |
|
|
|
|
|
.alert-container { |
|
|
left: 20px; |
|
|
right: 20px; |
|
|
max-width: none; |
|
|
} |
|
|
} |
|
|
|
|
|
@media (max-width: 480px) { |
|
|
.dashboard-header { |
|
|
padding: 1rem; |
|
|
} |
|
|
|
|
|
.header-left .logo h1 { |
|
|
font-size: 1.2rem; |
|
|
} |
|
|
|
|
|
.main-content { |
|
|
padding: 0.5rem; |
|
|
} |
|
|
|
|
|
.section-header h2 { |
|
|
font-size: 1.5rem; |
|
|
} |
|
|
|
|
|
.modal-content { |
|
|
width: 95%; |
|
|
} |
|
|
|
|
|
.modal-header, |
|
|
.modal-body { |
|
|
padding: 1rem; |
|
|
} |
|
|
} |
|
|
|
|
|
|