/** * Video Learning Sessions Page - Industrial Cyber Console * 任务列表页面样式 */ /* 导入核心样式 */ @import url('./cyber-core.css'); /* ==================== 页面容器 ==================== */ .sessions-page { min-height: 100vh; padding: 2rem; } /* ==================== 页面标题 ==================== */ .page-header { text-align: center; margin-bottom: 3rem; position: relative; } .page-header h1 { font-size: 2rem; font-weight: 700; color: var(--cyber-green); text-transform: uppercase; letter-spacing: 0.2em; text-shadow: 0 0 30px var(--cyber-green-dim); margin-bottom: 0.5rem; } .page-header h1::before { content: '>'; margin-right: 0.75rem; animation: blink 1s step-end infinite; } .page-header p { color: var(--cyber-text-secondary); font-family: var(--cyber-font-mono); font-size: 0.85rem; } .page-header p::before { content: '// '; color: var(--cyber-green); } /* ==================== Sessions Grid ==================== */ .sessions-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(380px, 1fr)); gap: 1.5rem; padding: 1rem 0; } /* ==================== Session Card ==================== */ .session-card { background: linear-gradient(135deg, var(--cyber-bg-secondary) 0%, var(--cyber-bg-tertiary) 100%); border: 1px solid var(--cyber-border); padding: 1.5rem; position: relative; transition: var(--cyber-transition-normal); overflow: hidden; } .session-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, transparent, var(--cyber-green), transparent); opacity: 0; transition: var(--cyber-transition-normal); } .session-card::after { content: ''; position: absolute; top: 1rem; right: 1rem; width: 8px; height: 8px; border-radius: 50%; background: var(--cyber-text-muted); box-shadow: 0 0 10px currentColor; transition: var(--cyber-transition-normal); } .session-card:hover { border-color: var(--cyber-green); box-shadow: 0 0 30px var(--cyber-green-dim); transform: translateY(-4px); } .session-card:hover::before { opacity: 1; } .session-card.completed { opacity: 0.7; } .session-card.completed::after { background: var(--cyber-text-muted); } /* ==================== Session Header ==================== */ .session-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; position: relative; } .session-platform { font-size: 0.95rem; font-weight: 600; display: flex; align-items: center; gap: 0.75rem; font-family: var(--cyber-font-display); text-transform: uppercase; letter-spacing: 0.1em; color: var(--cyber-text-primary); } .session-platform::before { content: '◆'; color: var(--cyber-green); font-size: 0.7rem; } /* ==================== Session Status ==================== */ .session-status { padding: 0.3rem 0.75rem; font-size: 0.65rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.1em; font-family: var(--cyber-font-display); border: 1px solid; } .session-status.status-active { background: var(--cyber-green-dim); color: var(--cyber-green); border-color: var(--cyber-green); animation: pulse 2s infinite; } .session-status.status-paused { background: var(--cyber-amber-dim); color: var(--cyber-amber); border-color: var(--cyber-amber); } .session-status.status-completed { background: rgba(148, 163, 184, 0.15); color: var(--cyber-text-secondary); border-color: var(--cyber-text-muted); } /* ==================== Session ID ==================== */ .session-id { margin-bottom: 1rem; padding: 0.75rem; background: var(--cyber-bg-primary); border: 1px solid var(--cyber-border); position: relative; } .session-id::before { content: 'SESSION_ID'; position: absolute; top: -0.5rem; left: 0.5rem; background: var(--cyber-bg-secondary); padding: 0 0.5rem; font-size: 0.55rem; font-family: var(--cyber-font-display); color: var(--cyber-text-muted); letter-spacing: 0.05em; } .session-id small { display: block; font-size: 0.65rem; color: var(--cyber-text-muted); margin-bottom: 0.35rem; font-family: var(--cyber-font-mono); } .session-id small::before { content: '// '; color: var(--cyber-border-bright); } .session-id code { font-family: var(--cyber-font-mono); font-size: 0.75rem; color: var(--cyber-green); word-break: break-all; display: block; } /* ==================== Session Progress ==================== */ .session-progress { margin-bottom: 1rem; } .progress-info { display: flex; justify-content: space-between; font-size: 0.75rem; color: var(--cyber-text-secondary); margin-bottom: 0.5rem; font-family: var(--cyber-font-mono); } .progress-info span:first-child::before { content: 'PROGRESS::'; color: var(--cyber-green); margin-right: 0.35rem; } .progress-bar { height: 6px; background: var(--cyber-bg-primary); border: 1px solid var(--cyber-border); overflow: hidden; position: relative; } .progress-bar::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: repeating-linear-gradient( 90deg, transparent, transparent 2px, rgba(0, 0, 0, 0.3) 2px, rgba(0, 0, 0, 0.3) 4px ); } .progress-fill { height: 100%; background: linear-gradient(90deg, var(--cyber-green), var(--cyber-blue)); transition: width 0.5s ease; box-shadow: 0 0 10px var(--cyber-green-glow); position: relative; } .progress-fill::after { content: ''; position: absolute; right: 0; top: 0; bottom: 0; width: 15px; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3)); animation: shimmer 2s infinite; } /* ==================== Session Duration ==================== */ .session-duration { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1.25rem; font-size: 0.75rem; color: var(--cyber-text-muted); font-family: var(--cyber-font-mono); } .session-duration::before { content: '⏱'; color: var(--cyber-green); font-size: 0.85rem; } /* ==================== Session Actions ==================== */ .session-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; } .session-actions .btn { flex: 1; min-width: 80px; font-size: 0.7rem; padding: 0.5rem 0.75rem; } /* ==================== Empty State ==================== */ .empty-state { text-align: center; padding: 6rem 2rem; color: var(--cyber-text-muted); position: relative; } .empty-state::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 300px; height: 300px; border: 1px dashed var(--cyber-border); border-radius: 50%; animation: pulse 4s infinite; } .empty-state svg { margin-bottom: 2rem; color: var(--cyber-text-muted); opacity: 0.3; position: relative; z-index: 1; } .empty-state h2 { font-size: 1.5rem; margin-bottom: 0.75rem; color: var(--cyber-text-secondary); font-family: var(--cyber-font-display); text-transform: uppercase; letter-spacing: 0.1em; position: relative; z-index: 1; } .empty-state p { font-size: 0.9rem; margin-bottom: 2rem; position: relative; z-index: 1; } .empty-state .btn { position: relative; z-index: 1; } /* ==================== Button Styles ==================== */ .btn-sm { padding: 0.5rem 0.75rem; font-size: 0.7rem; } /* ==================== Toast Notifications ==================== */ .toast-container { position: fixed; bottom: 2rem; right: 2rem; z-index: 1000; display: flex; flex-direction: column; gap: 0.5rem; } .toast { padding: 0.75rem 1rem; border: 1px solid; font-size: 0.8rem; font-family: var(--cyber-font-mono); position: relative; overflow: hidden; animation: slideIn 0.3s ease; backdrop-filter: blur(10px); } .toast::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; } .toast.info { background: var(--cyber-blue-dim); color: var(--cyber-blue); border-color: var(--cyber-blue); } .toast.info::before { background: var(--cyber-blue); } .toast.success { background: rgba(16, 185, 129, 0.2); color: #10b981; border-color: #10b981; } .toast.success::before { background: #10b981; } .toast.error { background: var(--cyber-red-dim); color: var(--cyber-red); border-color: var(--cyber-red); } .toast.error::before { background: var(--cyber-red); } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* ==================== Loading State ==================== */ .loading-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 4rem 2rem; color: var(--cyber-text-muted); } .loading-state svg { width: 48px; height: 48px; margin-bottom: 1rem; color: var(--cyber-green); animation: spin 1s linear infinite; } .loading-state p { font-family: var(--cyber-font-mono); font-size: 0.85rem; } .loading-state p::before { content: 'LOADING...'; color: var(--cyber-green); animation: blink 1s step-end infinite; } /* ==================== 装饰性元素 ==================== */ .sessions-grid::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(circle at 20% 30%, rgba(0, 255, 159, 0.03) 0%, transparent 50%), radial-gradient(circle at 80% 70%, rgba(0, 212, 255, 0.03) 0%, transparent 50%); pointer-events: none; z-index: -1; } /* ==================== Responsive Design ==================== */ @media (max-width: 768px) { .sessions-page { padding: 1rem; } .sessions-grid { grid-template-columns: 1fr; } .page-header h1 { font-size: 1.5rem; } .session-actions { flex-direction: column; } .session-actions .btn { width: 100%; } .toast-container { left: 1rem; right: 1rem; bottom: 1rem; } } /* ==================== 删除按钮特殊样式 ==================== */ .btn-delete { background: var(--cyber-red-dim); color: var(--cyber-red); border-color: var(--cyber-red); } .btn-delete:hover:not(:disabled) { background: var(--cyber-red); color: white; box-shadow: var(--cyber-glow-red); } /* ==================== 详情按钮特殊样式 ==================== */ .btn-details { background: var(--cyber-blue-dim); color: var(--cyber-blue); border-color: var(--cyber-blue); } .btn-details:hover:not(:disabled) { background: var(--cyber-blue); color: var(--cyber-bg-primary); box-shadow: var(--cyber-glow-blue); } /* ==================== 控制按钮 ==================== */ .btn-control { background: var(--cyber-green-dim); color: var(--cyber-green); border-color: var(--cyber-green); } .btn-control:hover:not(:disabled) { background: var(--cyber-green); color: var(--cyber-bg-primary); box-shadow: var(--cyber-glow-green); } .btn-control.paused { background: var(--cyber-amber-dim); color: var(--cyber-amber); border-color: var(--cyber-amber); } .btn-control.paused:hover:not(:disabled) { background: var(--cyber-amber); color: var(--cyber-bg-primary); } /* ==================== 过滤器样式 ==================== */ .sessions-filter { display: flex; gap: 1rem; margin-bottom: 2rem; justify-content: center; flex-wrap: wrap; } .filter-btn { padding: 0.5rem 1rem; background: transparent; border: 1px solid var(--cyber-border); color: var(--cyber-text-secondary); font-family: var(--cyber-font-display); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; cursor: pointer; transition: var(--cyber-transition-fast); } .filter-btn:hover { border-color: var(--cyber-green); color: var(--cyber-green); } .filter-btn.active { background: var(--cyber-green-dim); border-color: var(--cyber-green); color: var(--cyber-green); }