.operation-banner { position: fixed; z-index: 100000; bottom: 20px; top: auto; left: 50%; transform: translate(-50%, 12px); width: min(560px, calc(100vw - 28px)); box-sizing: border-box; padding: 14px 16px; color: #fff; background: rgba(25, 29, 36, .45); border: 1px solid rgba(255, 255, 255, .14); border-radius: 14px; box-shadow: 0 10px 35px rgba(0, 0, 0, .28); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity .22s ease, transform .22s ease, bottom .22s ease; font: 14px/1.45 system-ui, sans-serif; } .operation-banner.is-visible { opacity: 1; visibility: visible; transform: translate(-50%, 0); pointer-events: auto; } .operation-banner .ob-row { display: flex; align-items: flex-start; gap: 11px; } .operation-banner .ob-icon { flex: 0 0 24px; width: 24px; text-align: center; font-size: 19px; } .operation-banner .ob-content { flex: 1; min-width: 0; overflow-wrap: anywhere; white-space: pre-line; } .operation-banner .ob-close { border: 0; padding: 0 2px; color: #fff; background: transparent; font-size: 21px; cursor: pointer; } .operation-banner .ob-progress { height: 4px; margin-top: 12px; overflow: hidden; border-radius: 99px; background: rgba(255, 255, 255, .16); } .operation-banner .ob-progress-fill { width: 35%; height: 100%; border-radius: inherit; background: #8ab4f8; } .operation-banner .ob-progress-label { display: none; margin-top: 9px; font-size: 12px; line-height: 1.2; text-align: right; font-variant-numeric: tabular-nums; } .operation-banner.is-determinate .ob-progress-label { display: block; } .operation-banner.is-determinate .ob-progress-fill { animation: none !important; transform: none; transition: width .3s linear; } .operation-banner.is-busy .ob-progress-fill { animation: operationBannerIndeterminate 1.2s ease-in-out infinite; } .operation-banner.is-success .ob-icon { color: #8fe0a5; } .operation-banner.is-error .ob-icon { color: #ff9999; } .operation-banner.is-success .ob-progress { display: none; } @keyframes operationBannerIndeterminate { from { transform: translateX(-120%); } to { transform: translateX(330%); } } @media (prefers-reduced-motion: reduce) { .operation-banner, .operation-banner .ob-progress-fill { animation: none !important; transition: none !important; } }