.update-progress-capsule { position: fixed; top: 38px; // Just below title bar left: 50%; transform: translateX(-50%); z-index: 9998; cursor: pointer; animation: capsuleSlideDown 0.4s cubic-bezier(0.16, 1, 0.3, 1); user-select: none; &:hover { .capsule-content { background: rgba(255, 255, 255, 0.95); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12); transform: scale(1.02); } } .capsule-content { background: var(--bg-primary); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); padding: 8px 18px; border-radius: 24px; border: 1px solid var(--border-color); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.12); display: flex; align-items: center; gap: 12px; height: 40px; position: relative; overflow: hidden; transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); .icon-wrapper { display: flex; align-items: center; justify-content: center; color: var(--text-primary); .download-icon { animation: capsulePulse 2s infinite ease-in-out; } } .info-wrapper { display: flex; align-items: baseline; gap: 10px; z-index: 1; .percent-text { font-size: 15px; font-weight: 700; color: var(--text-primary); font-variant-numeric: tabular-nums; } .speed-text { font-size: 13px; color: var(--text-tertiary); font-weight: 500; font-variant-numeric: tabular-nums; } .error-text { font-size: 15px; color: #ff4d4f; font-weight: 600; } .available-text { font-size: 15px; color: var(--text-primary); font-weight: 600; } } .progress-bg { position: absolute; bottom: 0; left: 0; right: 0; height: 3px; background: rgba(0, 0, 0, 0.05); .progress-fill { height: 100%; background: var(--primary); transition: width 0.3s ease; } } .capsule-close { background: none; border: none; padding: 4px; margin-left: -4px; margin-right: -8px; cursor: pointer; opacity: 0.5; transition: all 0.2s ease; display: flex; align-items: center; color: var(--text-secondary); &:hover { opacity: 1; background: var(--bg-tertiary); border-radius: 50%; } } } // State Modifiers &.state-available { .capsule-content { background: var(--primary); border-color: rgba(255, 255, 255, 0.1); color: white; .icon-wrapper { color: white; } .info-wrapper { .available-text { color: white; } } .capsule-close { color: rgba(255, 255, 255, 0.8); &:hover { background: rgba(255, 255, 255, 0.1); } } } } &.state-downloading { .capsule-content { background: var(--bg-primary); } } &.state-error { .capsule-content { background: #fff1f0; border-color: #ffa39e; .icon-wrapper { color: #ff4d4f; } .info-wrapper .error-text { color: #cf1322; } .capsule-close { color: #cf1322; } } } } @keyframes capsuleSlideDown { from { transform: translate(-50%, -40px); opacity: 0; } to { transform: translate(-50%, 0); opacity: 1; } } @keyframes capsulePulse { 0%, 100% { transform: translateY(0); opacity: 1; } 50% { transform: translateY(2px); opacity: 0.6; } }