/* 状态动画：提交、排队、生成中均提供持续反馈；完成或失败时停止。 */
.preview-empty:not(:has(.preview-error)) .empty-icon{animation:previewSpin 1.8s linear infinite,previewPulse 1.35s ease-in-out infinite}
.preview-empty:has(.preview-error) .empty-icon{animation:none;color:#ff9ea5;border-color:#b96c79}
@keyframes previewSpin{to{transform:rotate(360deg)}}
@keyframes previewPulse{0%,100%{box-shadow:inset 0 0 25px #35d7cf18,0 0 0 0 #73efd500}50%{box-shadow:inset 0 0 25px #35d7cf40,0 0 0 9px #73efd51c}}
.preview-info .download-link{display:inline-flex;align-items:center;padding:7px 11px;border:1px solid #61d8c577;border-radius:7px;background:#0c2b38;color:#8bf3d8;white-space:nowrap}.preview-info .download-link:hover{background:#12485a;color:#fff}
.auth-gate{position:fixed;inset:0;z-index:20;display:grid;place-items:center;background:#07111ff5;backdrop-filter:blur(10px)}.auth-card{width:min(390px,calc(100% - 32px));padding:30px;border:1px solid #456080;border-radius:18px;background:#101f34;box-shadow:0 25px 80px #0008}.auth-card h1{margin:5px 0 20px}.auth-card form{display:grid;gap:12px}.auth-card input{padding:12px;border:1px solid #456080;border-radius:8px;background:#091524;color:#fff}.auth-card button{padding:11px;border:0;border-radius:8px;background:#73efd5;color:#06111d;font-weight:800;cursor:pointer}.auth-link{margin-top:14px!important;background:transparent!important;color:#73efd5!important}.auth-message{min-height:18px;color:#ffb5b5;font-size:12px}
