Files
BetterDesk/web-nodejs/public/css/dashboard.css
T
UNITRONIX 7a0b3b7387 fix: resolve 8 GitHub issues (#90 #97 #100 #82 #78 #75 #98 #68)
- #90: Bump z-index hierarchy (modal 1100, toast 1200, tooltip 1300)
- #97: Block old peer ID re-registration after ID change (IsRenamedPeerID)
- #100: Add broken pipe/connection refused to isNormalClose(), reduce TCP log spam
- #82: Reset cookie secure flag + CSRF downgrade on SSL cert fallback
- #78: Docker entrypoint write-check before start with clear error message
- #75: Replace transition:all with specific properties in 6 CSS files
- #98: Show HTTPS URL in Docker startup banner when SSL enabled
- #68: Add %% escaping for systemd specifiers alongside web-nodejs/server.js escaping

Files: 5 Go (signal, db), 2 Node.js (server, csrf), 6 CSS, 1 Docker, 1 installer
2026-04-10 00:00:04 +02:00

549 lines
11 KiB
CSS

/**
* BetterDesk Console - Dashboard Styles
*/
.dashboard-header {
margin-bottom: var(--space-lg);
}
.dashboard-header h1 {
font-size: var(--font-size-2xl);
font-weight: var(--font-weight-bold);
margin-bottom: var(--space-xs);
}
.dashboard-header p {
color: var(--text-secondary);
}
/* Stats cards grid */
.dashboard-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--space-md);
margin-bottom: var(--space-xl);
}
.dashboard-stat-card {
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
padding: var(--space-lg);
display: flex;
align-items: flex-start;
gap: var(--space-md);
transition: border-color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast);
transform: translateY(0);
}
.dashboard-stat-card:hover {
border-color: var(--border-hover);
transform: translateY(-2px);
}
.dashboard-stat-icon {
width: 52px;
height: 52px;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.dashboard-stat-icon .material-icons {
font-size: 28px;
}
.dashboard-stat-icon.devices {
background: var(--accent-blue-muted);
color: var(--accent-blue);
}
.dashboard-stat-icon.online {
background: var(--accent-green-muted);
color: var(--accent-green);
}
.dashboard-stat-icon.banned {
background: var(--accent-red-muted);
color: var(--accent-red);
}
.dashboard-stat-icon.connections {
background: var(--accent-purple-muted);
color: var(--accent-purple);
}
.dashboard-stat-icon.offline {
background: var(--accent-orange-muted, rgba(255, 152, 0, 0.1));
color: var(--accent-orange, #ff9800);
}
.dashboard-stat-content {
flex: 1;
}
.dashboard-stat-value {
font-size: var(--font-size-3xl);
font-weight: var(--font-weight-bold);
line-height: 1;
margin-bottom: var(--space-xs);
}
.dashboard-stat-label {
font-size: var(--font-size-sm);
color: var(--text-secondary);
}
.dashboard-stat-change {
font-size: var(--font-size-xs);
margin-top: var(--space-xs);
display: flex;
align-items: center;
gap: var(--space-xs);
}
.dashboard-stat-change.positive {
color: var(--accent-green);
}
.dashboard-stat-change.negative {
color: var(--accent-red);
}
/* Server status */
.server-status-section {
margin-bottom: var(--space-xl);
}
.server-status-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--space-md);
}
.server-status-card {
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
padding: var(--space-lg);
}
.server-status-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-md);
}
.server-status-title {
display: flex;
align-items: center;
gap: var(--space-sm);
font-weight: var(--font-weight-semibold);
}
.server-status-title .material-icons {
font-size: 20px;
color: var(--accent-blue);
}
.server-status-indicator {
display: flex;
align-items: center;
gap: var(--space-xs);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
}
.server-status-indicator .status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.server-status-indicator.running {
color: var(--accent-green);
}
.server-status-indicator.running .status-dot {
background: var(--accent-green);
animation: pulse 2s infinite;
}
.server-status-indicator.stopped {
color: var(--accent-red);
}
.server-status-indicator.stopped .status-dot {
background: var(--accent-red);
}
.server-status-indicators.unknown {
color: var(--text-tertiary);
}
.server-status-details {
display: grid;
gap: var(--space-sm);
}
.server-detail-row {
display: flex;
justify-content: space-between;
font-size: var(--font-size-sm);
}
.server-detail-label {
color: var(--text-secondary);
}
.server-detail-value {
color: var(--text-primary);
font-family: var(--font-mono);
}
/* Recent activity */
.recent-activity-section {
margin-bottom: var(--space-xl);
}
.section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-md);
}
.section-title {
font-size: var(--font-size-lg);
font-weight: var(--font-weight-semibold);
display: flex;
align-items: center;
gap: var(--space-sm);
}
.section-title .material-icons {
color: var(--accent-blue);
}
.activity-list {
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
overflow: hidden;
}
.activity-item {
display: flex;
align-items: flex-start;
gap: var(--space-md);
padding: var(--space-md);
border-bottom: 1px solid var(--border-primary);
transition: background var(--transition-fast);
}
.activity-item:last-child {
border-bottom: none;
}
.activity-item:hover {
background: var(--bg-tertiary);
}
.activity-icon {
width: 36px;
height: 36px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.activity-icon.connect {
background: var(--accent-green-muted);
color: var(--accent-green);
}
.activity-icon.disconnect {
background: var(--bg-elevated);
color: var(--text-secondary);
}
.activity-icon.ban {
background: var(--accent-red-muted);
color: var(--accent-red);
}
.activity-icon.unban {
background: var(--accent-yellow-muted);
color: var(--accent-yellow);
}
.activity-icon .material-icons {
font-size: 18px;
}
.activity-content {
flex: 1;
min-width: 0;
}
.activity-text {
font-size: var(--font-size-sm);
}
.activity-text strong {
font-family: var(--font-mono);
color: var(--accent-blue);
}
.activity-time {
font-size: var(--font-size-xs);
color: var(--text-tertiary);
margin-top: var(--space-xs);
}
.activity-empty {
text-align: center;
padding: var(--space-xl);
color: var(--text-secondary);
}
/* Quick actions */
.quick-actions {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: var(--space-md);
}
.quick-action-card {
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
padding: var(--space-lg);
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
cursor: pointer;
transition: all var(--transition-fast);
}
.quick-action-card:hover {
border-color: var(--accent-blue);
background: var(--accent-blue-muted);
}
.quick-action-icon {
width: 48px;
height: 48px;
border-radius: 50%;
background: var(--bg-tertiary);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: var(--space-md);
transition: all var(--transition-fast);
}
.quick-action-card:hover .quick-action-icon {
background: var(--accent-blue);
color: white;
}
.quick-action-icon .material-icons {
font-size: 24px;
}
.quick-action-title {
font-weight: var(--font-weight-medium);
margin-bottom: var(--space-xs);
}
.quick-action-desc {
font-size: var(--font-size-xs);
color: var(--text-secondary);
}
/* Responsive */
@media (max-width: 768px) {
.dashboard-stats {
grid-template-columns: 1fr;
}
.server-status-grid {
grid-template-columns: 1fr;
}
.quick-actions {
grid-template-columns: repeat(2, 1fr);
}
.dashboard-bottom-grid {
grid-template-columns: 1fr;
}
.health-cards {
grid-template-columns: repeat(2, 1fr);
}
.welcome-greeting h1 {
font-size: var(--font-size-xl);
}
}
/* Welcome Section */
.dashboard-welcome {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-lg);
margin-bottom: var(--space-lg);
}
.welcome-greeting h1 {
font-size: var(--font-size-2xl);
font-weight: var(--font-weight-bold);
margin-bottom: var(--space-xs);
}
.welcome-subtitle {
color: var(--text-secondary);
}
.welcome-tip {
display: flex;
align-items: center;
gap: var(--space-sm);
background: var(--accent-blue-muted);
border: 1px solid var(--accent-blue);
border-radius: var(--radius-md);
padding: var(--space-sm) var(--space-md);
font-size: var(--font-size-sm);
max-width: 380px;
flex-shrink: 0;
animation: tipSlideIn 0.4s ease;
}
@keyframes tipSlideIn {
from { opacity: 0; transform: translateX(12px); }
to { opacity: 1; transform: translateX(0); }
}
.tip-icon {
color: var(--accent-blue);
font-size: 20px;
flex-shrink: 0;
}
.tip-text {
flex: 1;
color: var(--text-primary);
line-height: 1.4;
}
.tip-dismiss {
background: none;
border: none;
cursor: pointer;
color: var(--text-secondary);
padding: 2px;
border-radius: var(--radius-sm);
display: flex;
align-items: center;
flex-shrink: 0;
transition: color var(--transition-fast);
}
.tip-dismiss:hover {
color: var(--text-primary);
}
.tip-dismiss .material-icons {
font-size: 16px;
}
/* Health Overview */
.dashboard-bottom-grid {
display: grid;
grid-template-columns: 340px 1fr;
gap: var(--space-lg);
margin-bottom: var(--space-xl);
}
.health-cards {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-sm);
}
.health-card {
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-md);
padding: var(--space-md);
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: var(--space-xs);
transition: border-color var(--transition-fast);
}
.health-card:hover {
border-color: var(--border-hover);
}
.health-card .material-icons {
font-size: 24px;
}
.health-card-value {
font-size: var(--font-size-xl);
font-weight: var(--font-weight-bold);
line-height: 1;
}
.health-card-label {
font-size: var(--font-size-xs);
color: var(--text-secondary);
}
.health-online .material-icons { color: var(--accent-green); }
.health-alerts .material-icons { color: var(--accent-yellow, #d29922); }
.health-connections .material-icons { color: var(--accent-blue); }
.health-uptime .material-icons { color: var(--accent-purple, #a371f7); }
/* Activity Feed */
.activity-feed-section .activity-list {
max-height: 320px;
overflow-y: auto;
}
.activity-item .activity-icon {
width: 32px;
height: 32px;
}
.activity-item .activity-icon .material-icons {
font-size: 16px;
}
.activity-icon.login {
background: var(--accent-blue-muted);
color: var(--accent-blue);
}
.activity-icon.alert {
background: var(--accent-yellow-muted, rgba(210, 153, 34, 0.1));
color: var(--accent-yellow, #d29922);
}
.activity-icon.file {
background: var(--accent-purple-muted, rgba(163, 113, 247, 0.1));
color: var(--accent-purple, #a371f7);
}