.page-header { margin-bottom: 24px; } .page-header h2 { font-size: 24px; color: var(--text-color); margin: 0; transition: color 0.3s; } .card { background: var(--card-bg); border-radius: 8px; padding: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); transition: background-color 0.3s; } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .card-header h3 { font-size: 16px; color: var(--text-color); margin: 0; transition: color 0.3s; } .card-body { display: flex; flex-direction: column; gap: 12px; } .card-footer { display: flex; gap: 8px; } .empty-state { text-align: center; padding: 60px 20px; color: #999; font-size: 16px; } .action-btn { padding: 8px 16px; border: none; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.3s; } .delete-btn { background: #ff4d4f; color: white; } .delete-btn:hover { background: #f04142; } .edit-btn { background: #f0f0f0; color: var(--text-color); } .edit-btn:hover { background: #e0e0e0; } .start-btn { background: #52c41a; color: white; } .start-btn:hover { background: #45a049; } .stop-btn { background: #ff4d4f; color: white; } .stop-btn:hover { background: #f04142; } .add-btn { padding: 10px 20px; background: var(--primary-color); color: white; border: none; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.3s; } .add-btn:hover { background: #5568d3; } .form { display: flex; flex-direction: column; gap: 16px; } .form-group { display: flex; flex-direction: column; gap: 8px; } .form-group label { font-size: 14px; color: #666; font-weight: 500; } .form-group input, .form-group select { padding: 10px; border: 1px solid var(--border-color); border-radius: 6px; font-size: 14px; background: var(--bg-color); color: var(--text-color); transition: background-color 0.3s, color 0.3s, border-color 0.3s; } .form-group input:focus, .form-group select:focus { outline: none; border-color: var(--primary-color); } .form-group input:disabled { background: #f5f5f5; cursor: not-allowed; } .dark .form-group label { color: #b0b0b0; } .dark .form-group input, .dark .form-group select { background: #3d3d3d; color: var(--text-color); border-color: var(--border-color); } .dark .form-group input:disabled { background: #2a2a2a; color: #666; } .dark .cancel-btn { background: #3d3d3d; color: var(--text-color); } .dark .cancel-btn:hover { background: #4d4d4d; } .dark .info-row .label, .dark .info-label, .dark .detail-key, .dark .config-key { color: #b0b0b0; } .dark .log-item { background: #2a2a2a; } .dark .proxy-item, .dark .config-item { background: #2a2a2a; } .dark .back-btn { background: #3d3d3d; color: var(--text-color); } .dark .back-btn:hover { background: #4d4d4d; } .form-actions { display: flex; gap: 12px; margin-top: 8px; } .cancel-btn, .submit-btn { flex: 1; padding: 10px; border: none; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.3s; } .cancel-btn { background: #f0f0f0; color: var(--text-color); } .cancel-btn:hover { background: #e0e0e0; } .submit-btn { background: var(--primary-color); color: white; } .submit-btn:hover:not(:disabled) { background: #5568d3; } .submit-btn:disabled { opacity: 0.6; cursor: not-allowed; } .info-row { display: flex; justify-content: space-between; font-size: 14px; } .info-row .label { color: #666; } .info-row .value { color: var(--text-color); font-weight: 500; transition: color 0.3s; } .info-item { display: flex; justify-content: space-between; font-size: 14px; } .info-label { color: #666; font-weight: 500; } .info-value { color: var(--text-color); font-weight: 500; text-align: right; word-break: break-all; transition: color 0.3s; } .status-badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 500; } .status-badge.running { background: #f6ffed; color: #52c41a; } .status-badge.stopped { background: #fff1f0; color: #ff4d4f; } .status-badge.active { background: #f6ffed; color: #52c41a; } .status-badge.inactive { background: #fff1f0; color: #ff4d4f; } .type-badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; font-weight: 500; transition: background-color 0.3s, color 0.3s; } .type-badge.superuser { background: #fff7e6; color: #fa8c16; } .type-badge.admin { background: #e6f7ff; color: #1890ff; } .type-badge.visitor { background: #f9f9f9; color: #666; } .dark .type-badge.superuser { background: #3a2510; color: #ffb74d; } .dark .type-badge.admin { background: #0d2633; color: #40a9ff; } .dark .type-badge.visitor { background: #2a2a2a; color: #b0b0b0; } .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; } .modal { background: var(--card-bg); border-radius: 12px; padding: 24px; width: 400px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); transition: background-color 0.3s; } .modal h3 { font-size: 20px; color: var(--text-color); margin: 0 0 20px 0; transition: color 0.3s; } .log-list { display: flex; flex-direction: column; gap: 8px; } .log-item { display: flex; gap: 12px; padding: 12px; background: #f9f9f9; border-radius: 6px; font-size: 14px; font-family: 'Consolas', 'Monaco', monospace; } .log-time { color: #999; min-width: 160px; } .log-level { min-width: 70px; font-weight: 600; text-align: center; padding: 2px 8px; border-radius: 4px; } .log-level.DEBUG { color: #52c41a; background: #f6ffed; } .log-level.INFO { color: #1890ff; background: #e6f7ff; } .log-level.WARN { color: #faad14; background: #fffbe6; } .log-level.ERROR { color: #ff4d4f; background: #fff1f0; } .log-level.FATAL { color: #cf1322; background: #fff1f0; } .log-message { color: var(--text-color); flex: 1; word-break: break-all; transition: color 0.3s; } .avatar { width: 48px; height: 48px; border-radius: 50%; background: linear-gradient(135deg, var(--primary-color) 0%, #764ba2 100%); display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; font-size: 18px; } .back-btn { padding: 8px 16px; background: #f0f0f0; border: none; border-radius: 6px; cursor: pointer; font-size: 14px; transition: all 0.3s; } .back-btn:hover { background: #e0e0e0; } .config-item { display: flex; justify-content: space-between; padding: 12px; background: #f9f9f9; border-radius: 6px; } .config-key { color: #666; font-weight: 500; } .config-value { color: var(--text-color); transition: color 0.3s; } .proxy-item { padding: 16px; background: #f9f9f9; border-radius: 6px; } .proxy-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; } .proxy-name { font-size: 16px; font-weight: 600; color: var(--text-color); transition: color 0.3s; } .proxy-details { display: flex; flex-direction: column; gap: 8px; } .proxy-detail { display: flex; justify-content: space-between; font-size: 14px; } .detail-key { color: #666; } .detail-value { color: var(--text-color); transition: color 0.3s; } .section { background: var(--card-bg); border-radius: 8px; padding: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); transition: background-color 0.3s; } .section h3 { font-size: 18px; color: var(--text-color); margin: 0 0 16px 0; transition: color 0.3s; } .logs-container { max-height: 400px; overflow-y: auto; } .filter-controls select { padding: 8px 16px; border: 1px solid var(--border-color); border-radius: 6px; font-size: 14px; background: var(--card-bg); color: var(--text-color); cursor: pointer; transition: background-color 0.3s, color 0.3s, border-color 0.3s; } .filter-controls select:focus { outline: none; border-color: var(--primary-color); }