/* 序列帧播放器布局 */ .player-stage { width: 100%; height: 100%; padding: 0; background: transparent; flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; } .preview-card-container { width: 100%; height: 100%; display: flex; flex-direction: column; } .player-stage-inner { display: flex; justify-content: center; align-items: center; width: 100%; height: 100%; flex: 1; } .player-display { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; height: 100%; } .player-image-shell { width: 100%; height: 100%; border-radius: 16px; /* 棋盘格背景用于显示透明部分 */ background-color: #f8f9fb; background-image: linear-gradient(45deg, #e5e7eb 25%, transparent 25%), linear-gradient(-45deg, #e5e7eb 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #e5e7eb 75%), linear-gradient(-45deg, transparent 75%, #e5e7eb 75%); background-size: 20px 20px; background-position: 0 0, 0 10px, 10px -10px, -10px 0px; min-height: 75vh; display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; border: 2px dashed #d1d5db; box-shadow: inset 0 0 0 1px #edf0f6; } .player-image-shell.is-dragging { background: #f0f7ff; border: 3px dashed #3b82f6; box-shadow: inset 0 0 0 8px rgba(59, 130, 246, 0.1); } .drop-hint { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; pointer-events: none; z-index: 5; } .drop-hint[hidden] { display: none; } .hint-text { margin: 0; padding: 0; font-size: 20px; font-weight: 600; color: #ef4444; letter-spacing: 1px; text-align: center; } .player-image-shell img { max-width: 100%; max-height: 100%; object-fit: contain; image-rendering: pixelated; } .player-image-shell img:not([src]), .player-image-shell img[src=""], .player-image-shell img.is-hidden { opacity: 0; visibility: hidden; display: none; } .loading-overlay { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; background: rgba(248, 249, 251, 0.92); backdrop-filter: blur(4px); z-index: 50; opacity: 0; visibility: hidden; transition: opacity 0.25s ease, visibility 0.25s ease; } .loading-overlay.is-visible { opacity: 1; visibility: visible; } .loading-overlay .loading-spinner { width: 56px; height: 56px; border-radius: 50%; border: 4px solid rgba(59, 130, 246, 0.15); border-top-color: #3b82f6; animation: spin 0.8s cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite; position: relative; } .loading-overlay .loading-spinner::before { content: ""; position: absolute; inset: -12px; border-radius: 50%; background: radial-gradient(circle, rgba(59, 130, 246, 0.1) 0%, transparent 70%); animation: pulse-glow 1.5s ease-in-out infinite; } .loading-overlay .loading-text { margin: 0; font-size: 14px; font-weight: 500; color: #6b7280; letter-spacing: 0.02em; animation: fade-pulse 1.5s ease-in-out infinite; } @keyframes pulse-glow { 0%, 100% { transform: scale(0.9); opacity: 0.5; } 50% { transform: scale(1.1); opacity: 1; } } @keyframes fade-pulse { 0%, 100% { opacity: 0.6; } 50% { opacity: 1; } } .player-image-shell .image-error { position: absolute; top: 24px; left: 24px; padding: 10px 16px; border-radius: 12px; background: rgba(120, 124, 138, 0.92); color: #fff; font-size: 15px; z-index: 20; } .panel-card { width: 100%; flex-shrink: 0; background: transparent; border-radius: 0; box-shadow: none; padding: 16px 0; border: none; } .control-panel { display: flex; flex-direction: column; gap: 18px; } .control-row { display: flex; align-items: center; justify-content: center; gap: 18px; width: 100%; flex-wrap: wrap; } .folder-label { font-size: 14px; font-weight: 600; color: #9ca3af; letter-spacing: 0.1em; text-transform: uppercase; } .slider-container { display: flex; align-items: center; gap: 18px; flex: 1; max-width: 520px; padding: 16px 18px; border-radius: 18px; background: #f4f6fb; box-shadow: inset 0 0 0 1px #e7eaf2; } .fps-slider { flex: 1; height: 10px; -webkit-appearance: none; appearance: none; background: linear-gradient(90deg, #e5e7eb 0%, #c7ccd9 100%); border-radius: 999px; outline: none; cursor: pointer; transition: background 0.2s ease, box-shadow 0.2s ease; box-shadow: inset 0 2px 6px rgba(15, 23, 42, 0.08); } .fps-slider::-webkit-slider-runnable-track { height: 10px; border-radius: 999px; background: transparent; } .fps-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 22px; height: 22px; background: #111827; border-radius: 50%; cursor: pointer; box-shadow: 0 6px 18px rgba(17, 24, 39, 0.25); transition: transform 0.2s ease, box-shadow 0.2s ease; margin-top: -6px; } .fps-slider::-webkit-slider-thumb:hover { transform: scale(1.15); box-shadow: 0 8px 22px rgba(17, 24, 39, 0.3); } .fps-slider::-webkit-slider-thumb:active { transform: scale(1.05); } .fps-slider::-moz-range-track { height: 10px; border-radius: 999px; background: linear-gradient(90deg, #e5e7eb 0%, #c7ccd9 100%); } .fps-slider::-moz-range-thumb { width: 22px; height: 22px; background: #111827; border: none; border-radius: 50%; cursor: pointer; box-shadow: 0 6px 18px rgba(17, 24, 39, 0.25); transition: transform 0.2s ease, box-shadow 0.2s ease; } .fps-slider::-moz-range-thumb:hover { transform: scale(1.15); box-shadow: 0 8px 22px rgba(17, 24, 39, 0.3); } .fps-value { min-width: 88px; padding: 8px 14px; background: #111827; color: #ffffff; border-radius: 10px; font-size: 15px; font-weight: 600; text-align: center; font-family: "SF Mono", "Monaco", "Inconsolata", "Roboto Mono", monospace; box-shadow: 0 8px 20px rgba(15, 23, 42, 0.25); } @media (max-width: 900px) { .player-image-shell { min-height: 60vh; } .control-row { flex-direction: column; } .slider-container { width: 100%; } } @media (max-width: 520px) { .panel-card { padding: 20px 0; } .slider-container { padding: 14px; } .fps-value { width: 100%; } }