.ui-loader { box-sizing: border-box; display: flex; align-items: center; justify-content: center; gap: 10px; color: inherit; font: 13px/1.5 system-ui, sans-serif; opacity: 1; transition: opacity 120ms; }
.ui-loader [hidden] { display: none !important; }
.ui-loader-logo { display: inline-flex; flex: 0 0 auto; width: 40px; height: 40px; animation: ui-loader-breathe 1.2s ease-in-out infinite; }
.ui-loader-logo img { display: block; width: 100%; height: 100%; object-fit: contain; user-select: none; }
.ui-loader--inline { display: inline-flex; vertical-align: middle; gap: 6px; }
.ui-loader--inline .ui-loader-logo { width: 16px; height: 16px; }
.ui-loader--block { flex-direction: column; min-height: 96px; padding: 16px; }
.ui-loader--full { position: fixed; inset: 0; z-index: 20000; flex-direction: column; padding: 24px; background: #FFFFFF; color: #1F1E1D; font-size: 15px; }
.ui-loader--full[data-theme="dark"] { background: #1F1E1C; color: #F2F0EA; }
.ui-loader--full .ui-loader-logo { width: 96px; height: 96px; animation-delay: 1.6s; }
.ui-loader-text { max-width: 100%; overflow-wrap: anywhere; }
.ui-loader-meter { display: grid; gap: 8px; text-align: center; max-width: 100%; }
.ui-loader-bar { width: 240px; max-width: 100%; height: 3px; overflow: hidden; background: rgb(128 128 128 / .2); border-radius: 2px; }
.ui-loader-bar i { display: block; width: 100%; height: 100%; background: #4285F4; transform-origin: left; transition: transform 160ms linear; }
.ui-loader-percent { font-size: 13px; font-variant-numeric: tabular-nums; }
.ui-loader-actions { display: flex; gap: 12px; }
.ui-loader-actions button { min-height: 48px; padding: 0 24px; border-radius: 999px; border: 1px solid currentColor; background: transparent; color: inherit; font: inherit; cursor: pointer; }
.ui-loader--leaving { opacity: 0; pointer-events: none; }
/* 官方 logo 的轻量等待动画：呼吸（≤1.2s 循环）；整屏在 logo 动画播完（1.6s）后才开始 */
@keyframes ui-loader-breathe { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(.92); opacity: .72; } }
@media (prefers-reduced-motion: reduce) {
  .ui-loader, .ui-loader * { animation: none !important; transition: none !important; }
}
