/* Stable button dimensions: the spinner occupies the centre, original label stays accessible. */
.launch-loader { position: fixed; inset: 0; z-index: 200; display: none; place-items: center; padding: 24px; background: var(--color-page); color: var(--color-text); opacity: 1; visibility: visible; transition: opacity 360ms ease, visibility 0s linear 360ms; }
html.launch-loader-pending .launch-loader { display: grid; }
.launch-loader-content { position: relative; z-index: 1; display: grid; justify-items: center; transform: translateY(-12px); animation: launch-arrive 700ms cubic-bezier(.2,.8,.2,1) both; }
.launch-loader-mark { position: relative; display: grid; place-items: center; width: 92px; height: 92px; margin-bottom: 24px; border: 1px solid color-mix(in srgb, var(--color-primary) 28%, transparent); border-radius: 28px; background: linear-gradient(145deg, color-mix(in srgb, var(--color-primary) 15%, var(--color-surface)), var(--color-surface)); box-shadow: 0 0 56px color-mix(in srgb, var(--color-primary) 8%, transparent), inset 0 1px color-mix(in srgb, var(--color-text) 4%, transparent); }
.launch-loader-cross { position: relative; width: 4px; height: 39px; border-radius: 4px; background: var(--color-primary); box-shadow: 0 0 18px color-mix(in srgb, var(--color-primary) 60%, transparent); }
.launch-loader-cross::before { position: absolute; content: ''; left: -12px; top: 9px; width: 28px; height: 4px; border-radius: inherit; background: inherit; }
.launch-loader-glow { position: absolute; inset: -1px; border: 1px solid color-mix(in srgb, var(--color-primary) 35%, transparent); border-radius: inherit; animation: launch-pulse 2.2s ease-in-out infinite; }
.launch-loader-brand { color: var(--color-text); font: 800 22px/1.2 system-ui, -apple-system, "Segoe UI", sans-serif; letter-spacing: -.04em; text-transform: uppercase; }
.launch-loader-caption { margin-top: 10px; color: var(--color-text-muted); font: 13px/1.4 system-ui, -apple-system, "Segoe UI", sans-serif; letter-spacing: .13em; }
.launch-loader-spinner { display: flex; align-items: center; gap: 5px; height: 22px; margin-top: 28px; }
.launch-loader-spinner i { width: 3px; height: 9px; border-radius: 3px; background: var(--color-primary); opacity: .35; transform: scaleY(.65); animation: launch-wave 900ms ease-in-out infinite; }
.launch-loader-spinner i:nth-child(2) { animation-delay: 100ms; } .launch-loader-spinner i:nth-child(3) { animation-delay: 200ms; } .launch-loader-spinner i:nth-child(4) { animation-delay: 300ms; }
.launch-loader-spinner i:nth-child(5) { animation-delay: 400ms; } .launch-loader-spinner i:nth-child(6) { animation-delay: 500ms; } .launch-loader-spinner i:nth-child(7) { animation-delay: 600ms; } .launch-loader-spinner i:nth-child(8) { animation-delay: 700ms; }
html.launch-loader-is-leaving .launch-loader { opacity: 0; visibility: hidden; }
@keyframes launch-arrive { from { opacity: 0; transform: translateY(4px) scale(.98); } to { opacity: 1; transform: translateY(-12px) scale(1); } }
@keyframes launch-pulse { 50% { transform: scale(1.12); opacity: .35; } }
@keyframes launch-wave { 50% { opacity: 1; transform: scaleY(1.7); } }
button.button-is-loading { position: relative; color: transparent !important; opacity: .8 !important; cursor: wait; }
button.button-is-loading > * { opacity: 0; }
button.button-is-loading::after { content: ''; position: absolute; left: calc(50% - 8px); top: calc(50% - 8px); width: 16px; height: 16px; box-sizing: border-box; border: 2px solid #aaa5; border-top-color: #eee; border-radius: 50%; animation: busy-spin .7s linear infinite; }
button.button.button-is-loading::after { border-color: #071b0e40; border-top-color: #071b0e; }
button.button-secondary.button-is-loading::after, button.button-danger.button-is-loading::after, button.service-notify-button.button-is-loading::after { border-color: #aaa5; border-top-color: #eee; }
@keyframes busy-spin { to { transform: rotate(360deg); } }
/* Navigation keeps the current page visible, showing only a slim progress bar. */
body.app-is-navigating::after { display: none; }
.app-loader { inset: 0 0 auto; width: 100%; height: 3px; min-height: 0; padding: 0; border: 0; border-radius: 0; box-shadow: none; background: transparent; transform: none; }
.app-is-navigating .app-loader { transform: none; }
.app-loader > * { display: none; }
.app-is-navigating .app-loader::after { inset: 0; height: 3px; background: var(--color-primary); }
.loading-skeleton { display: grid; gap: 12px; }
.skeleton-row { display: flex; align-items: center; gap: 14px; min-height: 80px; padding: 12px; }
.skeleton-copy { display: grid; flex: 1; gap: 10px; }
.skeleton-block { display: block; border-radius: 6px; background: #ffffff0a; animation: skeleton-breathe 1.6s ease-in-out infinite; }
.skeleton-tile { width: 48px; height: 48px; border-radius: 8px; }
.skeleton-line { width: 72%; height: 16px; }
.skeleton-line.short { width: 43%; height: 12px; }
.skeleton-key { width: 40px; height: 28px; }
.skeleton-section { display: grid; gap: 14px; padding: 18px; border-radius: 14px; background: #191919; }
.skeleton-section:first-child { background: #1b251f; }
.skeleton-section .skeleton-line { height: 18px; }
body:has(#songs-skeleton:not([hidden])) main > .song-hero { display: none; }
#songs-status.is-loading { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
.services-is-switching .service-list, .services-is-switching .service-list-toolbar { opacity: 1; transform: none; pointer-events: auto; }
.services-is-switching .services-page-tabs, .services-is-switching .service-sort-actions { pointer-events: none; opacity: .65; }
@keyframes skeleton-breathe { 50% { background: #ffffff12; } }
.services-load-status[aria-busy="true"]::before { content: ''; display: inline-block; width: 14px; height: 14px; margin-right: 8px; border: 2px solid #ffffff25; border-top-color: var(--color-primary); border-radius: 50%; vertical-align: -2px; animation: busy-spin .7s linear infinite; }
.app-intro-pending .app-intro { transition-duration: 160ms; }
@media (prefers-reduced-motion: reduce) { .launch-loader-content, .launch-loader-glow, .launch-loader-spinner i, .skeleton-block, button.button-is-loading::after, .services-load-status[aria-busy="true"]::before { animation: none; } .launch-loader { transition: none; } }
