/** * 预览播放器样式 — V21 设计系统 * 任务 2.16 */ /* ============================================================ 预览播放器容器 ============================================================ */ .ep-preview { flex-shrink: 0; display: flex; flex-direction: column; border-bottom: 1px solid var(--border-color); background: var(--bg-primary); } /* ── 预览画面 ── */ .ep-preview-screen { position: relative; width: 100%; aspect-ratio: 16 / 9; max-height: 280px; overflow: hidden; background: #0f0f14; border-radius: 0; } .ep-preview-visual { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-md); transition: background 0.4s ease; } /* 片段类型大图标 */ .ep-preview-type-icon { font-size: 56px; opacity: 0.7; filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.3)); animation: ep-preview-float 3s ease-in-out infinite; } @keyframes ep-preview-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } } /* 文案字幕 */ .ep-preview-subtitle { max-width: 80%; padding: 8px 20px; background: rgba(0, 0, 0, 0.55); backdrop-filter: blur(8px); border-radius: var(--radius-md); color: #fff; font-size: 14px; line-height: 1.6; text-align: center; letter-spacing: 0.02em; } /* 片段序号角标 */ .ep-preview-clip-badge { position: absolute; top: 12px; left: 12px; padding: 3px 10px; border-radius: var(--radius-sm); color: #fff; font-size: 12px; font-weight: 700; letter-spacing: 0.04em; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25); } /* 素材类型标签 */ .ep-preview-material-tag { position: absolute; top: 12px; right: 12px; padding: 3px 10px; border-radius: var(--radius-sm); background: rgba(0, 0, 0, 0.45); backdrop-filter: blur(6px); color: rgba(255, 255, 255, 0.85); font-size: 11px; text-transform: capitalize; } /* 空状态 */ .ep-preview-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: rgba(255, 255, 255, 0.4); } .ep-preview-empty-icon { font-size: 48px; margin-bottom: var(--space-sm); opacity: 0.5; } .ep-preview-empty p { margin: 0; font-size: var(--font-size-sm); } /* ============================================================ 控制栏 ============================================================ */ .ep-preview-controls { display: flex; align-items: center; gap: var(--space-md); padding: 8px var(--space-lg); border-top: 1px solid rgba(255, 255, 255, 0.06); background: #16161e; } /* 时间显示 */ .ep-preview-time { display: flex; align-items: center; gap: 4px; font-size: 12px; font-variant-numeric: tabular-nums; min-width: 90px; } .ep-preview-time-current { color: #fff; font-weight: 600; } .ep-preview-time-sep { color: rgba(255, 255, 255, 0.3); } .ep-preview-time-total { color: rgba(255, 255, 255, 0.5); } /* 播放按钮组 */ .ep-preview-buttons { display: flex; align-items: center; gap: 4px; flex: 1; justify-content: center; } .ep-preview-btn { width: 32px; height: 32px; border: none; background: transparent; color: rgba(255, 255, 255, 0.7); font-size: 14px; cursor: pointer; border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; transition: var(--transition-all); } .ep-preview-btn:hover { background: rgba(255, 255, 255, 0.1); color: #fff; } .ep-preview-btn-play { width: 40px; height: 40px; background: var(--primary-color); color: #fff; font-size: 16px; border-radius: 50%; box-shadow: 0 2px 8px rgba(79, 70, 229, 0.4); } .ep-preview-btn-play:hover { background: var(--primary-hover); transform: scale(1.05); box-shadow: 0 4px 12px rgba(79, 70, 229, 0.5); } /* 片段信息 */ .ep-preview-clip-info { display: flex; align-items: center; gap: var(--space-sm); font-size: 12px; min-width: 90px; justify-content: flex-end; } .ep-preview-clip-idx { color: rgba(255, 255, 255, 0.6); } .ep-preview-clip-dur { color: var(--primary-color); font-weight: 600; background: rgba(79, 70, 229, 0.15); padding: 1px 8px; border-radius: 999px; } /* ============================================================ 进度条(可拖拽) ============================================================ */ .ep-preview-progress { position: relative; height: 20px; padding: 7px var(--space-lg); cursor: pointer; user-select: none; background: #16161e; } .ep-preview-progress-track { position: relative; height: 6px; display: flex; background: rgba(255, 255, 255, 0.08); border-radius: 3px; overflow: hidden; } .ep-preview-progress-segment { height: 100%; transition: opacity 0.2s ease; } .ep-preview-progress-fill { position: absolute; top: 0; left: 0; height: 100%; background: rgba(255, 255, 255, 0.25); border-radius: 3px; pointer-events: none; } .ep-preview-progress-handle { position: absolute; top: 50%; width: 14px; height: 14px; background: #fff; border-radius: 50%; transform: translate(-50%, -50%); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4); transition: transform 0.1s ease; pointer-events: none; z-index: 2; } .ep-preview-progress:hover .ep-preview-progress-handle { transform: translate(-50%, -50%) scale(1.2); } /* ============================================================ 迷你时间线 ============================================================ */ .ep-preview-timeline { position: relative; display: flex; height: 28px; gap: 2px; padding: 0 var(--space-lg); background: #12121a; overflow: hidden; } .ep-preview-timeline-seg { height: 100%; border-radius: 3px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: var(--transition-all); min-width: 8px; position: relative; } .ep-preview-timeline-seg:hover { opacity: 0.85; transform: scaleY(1.08); } .ep-preview-timeline-seg.active { opacity: 1; box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.3); } .ep-preview-timeline-seg.selected { box-shadow: 0 0 0 2px var(--primary-color); } .ep-preview-timeline-seg-label { font-size: 10px; opacity: 0.8; pointer-events: none; } /* 播放头 */ .ep-preview-playhead { position: absolute; top: 0; width: 2px; height: 100%; background: #fff; transform: translateX(-50%); pointer-events: none; z-index: 3; box-shadow: 0 0 4px rgba(255, 255, 255, 0.5); } /* ============================================================ 片段内进度条 ============================================================ */ .ep-preview-clip-progress { height: 3px; background: rgba(255, 255, 255, 0.06); } .ep-preview-clip-progress-fill { height: 100%; transition: width 0.1s linear; border-radius: 0 2px 2px 0; } /* ============================================================ 响应式 ============================================================ */ @media (max-width: 1200px) { .ep-preview-screen { max-height: 240px; } } @media (max-width: 900px) { .ep-preview-screen { max-height: 200px; } .ep-preview-type-icon { font-size: 40px; } .ep-preview-subtitle { font-size: 13px; padding: 6px 14px; } .ep-preview-time { min-width: 70px; font-size: 11px; } .ep-preview-clip-info { min-width: 70px; font-size: 11px; } } @media (max-width: 768px) { .ep-preview-screen { max-height: 180px; } .ep-preview-controls { padding: 6px var(--space-md); gap: var(--space-sm); } .ep-preview-btn-play { width: 36px; height: 36px; font-size: 14px; } .ep-preview-timeline { height: 22px; padding: 0 var(--space-md); } } @media (max-width: 480px) { .ep-preview-screen { max-height: 140px; } .ep-preview-type-icon { font-size: 32px; } .ep-preview-subtitle { font-size: 12px; max-width: 90%; } .ep-preview-clip-badge, .ep-preview-material-tag { font-size: 10px; padding: 2px 6px; } .ep-preview-clip-info { display: none; } .ep-preview-time { min-width: auto; } }