/* 响应式表格 - 移动端横向滚动,保持表格结构 */ @media (max-width: 768px) { .results-table { font-size: 12px; } .results-table th, .results-table td { padding: 8px 6px; white-space: nowrap; } } /* 卡片视图模式 */ .card-view-mode .athlete-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; padding: 16px; } .card-view-mode .athlete-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 16px; transition: transform 0.2s ease, box-shadow 0.2s ease; } .card-view-mode .athlete-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); } /* ========== Loading Skeleton System ========== */ .loading-skeleton { background: linear-gradient(90deg, var(--border) 25%, var(--glass) 50%, var(--border) 75%); background-size: 200% 100%; animation: skeleton-shimmer 1.5s ease-in-out infinite; border-radius: 8px; } @keyframes skeleton-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* Skeleton variants */ .skeleton-text { height: 14px; margin-bottom: 8px; border-radius: 4px; } .skeleton-text.short { width: 40%; } .skeleton-text.medium { width: 65%; } .skeleton-text.long { width: 90%; } .skeleton-avatar { width: 48px; height: 48px; border-radius: 50%; } .skeleton-card { height: 120px; border-radius: var(--radius-md); margin-bottom: 12px; } .skeleton-row { display: flex; gap: 12px; align-items: center; padding: 12px 0; } .skeleton-row .skeleton-avatar { flex-shrink: 0; } .skeleton-row .skeleton-lines { flex: 1; } /* Loading overlay */ .loading-overlay { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px 20px; gap: 16px; color: var(--text-light); } .loading-spinner { width: 32px; height: 32px; border: 3px solid var(--border); border-top-color: var(--deep-blue); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Loading placeholder for athlete grid */ .athlete-grid-skeleton { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; padding: 16px; } .athlete-grid-skeleton .skeleton-card { display: flex; align-items: center; gap: 12px; padding: 16px; height: auto; } /* 可访问性增强 */ .results-table th, .results-table td { color: var(--text); } /* 屏幕阅读器支持 */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } /* ========== Error State ========== */ .error-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px 20px; gap: 12px; color: var(--text-light); text-align: center; } .error-state .error-icon { font-size: 48px; margin-bottom: 8px; } .error-state .error-message { font-size: 14px; max-width: 300px; line-height: 1.5; } .error-state .retry-btn { padding: 8px 20px; background: var(--deep-blue); color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; transition: opacity 0.2s; } .error-state .retry-btn:hover { opacity: 0.9; } /* ========== Empty State ========== */ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px 20px; gap: 8px; color: var(--text-light); text-align: center; } .empty-state .empty-icon { font-size: 48px; margin-bottom: 8px; opacity: 0.6; } .empty-state .empty-text { font-size: 14px; } /* ========== Offline Banner ========== */ .offline-banner { position: fixed; bottom: 60px; left: 50%; transform: translateX(-50%); background: var(--speed-red); color: white; padding: 8px 20px; border-radius: 20px; font-size: 13px; font-weight: 500; z-index: 9999; box-shadow: 0 4px 12px rgba(0,0,0,0.2); animation: slideUp 0.3s ease-out; display: none; } .offline-banner.visible { display: block; } @keyframes slideUp { from { transform: translateX(-50%) translateY(20px); opacity: 0; } to { transform: translateX(-50%) translateY(0); opacity: 1; } }