/*
 * The Skanimals mark, the Scan icon and the loader built from them. The logo's colours come from these variables, so
 * it can sit on the dark app (light body) or a light card (navy body). The keyframes match
 * wwwroot/images/brand/skanimals-logo-animated.svg.
 */

.sk-logo {
    --sk-logo-body: #f3f7ff;
    --sk-logo-sclera: #ffffff;
    --sk-logo-pupil: #092350;
    --sk-logo-accent: var(--sc-primary);
    display: block;
    flex: none;
    overflow: visible;
}

.sk-logo.is-navy {
    --sk-logo-body: #092350;
}

.sk-logo .sk-body { fill: var(--sk-logo-body); }
.sk-logo .sk-sclera { fill: var(--sk-logo-sclera); stroke: var(--sk-logo-body); }
.sk-logo .sk-pupil { fill: var(--sk-logo-pupil); }
.sk-logo .sk-star { fill: var(--sk-logo-accent); }

.sk-logo .sk-body,
.sk-logo .sk-eye,
.sk-logo .sk-look,
.sk-logo .sk-star {
    transform-box: fill-box;
    transform-origin: center;
}

.sk-logo.is-animated .sk-body { animation: sk-breathe 3.2s ease-in-out infinite; }
.sk-logo.is-animated .sk-look { animation: sk-look 7s ease-in-out infinite; }
.sk-logo.is-animated .sk-eye { animation: sk-blink 7s ease-in-out infinite; }
.sk-logo.is-animated .sk-star-top { animation: sk-twinkle 1.8s ease-in-out infinite; }
.sk-logo.is-animated .sk-star-bottom { animation: sk-twinkle 1.8s ease-in-out 0.9s infinite; }

/* Loading: the eye searches side to side and the sparkles pulse faster */
.sk-logo.is-loading .sk-look { animation: sk-search 1.6s ease-in-out infinite; }
.sk-logo.is-loading .sk-eye { animation: sk-blink 4.8s ease-in-out infinite; }
.sk-logo.is-loading .sk-star-top { animation: sk-twinkle 1.1s ease-in-out infinite; }
.sk-logo.is-loading .sk-star-bottom { animation: sk-twinkle 1.1s ease-in-out 0.55s infinite; }

@keyframes sk-breathe {
    0%, 100% { transform: scale(0.985); }
    50% { transform: scale(1.02); }
}

/* Glances around: left, right, up, then settles back on you */
@keyframes sk-look {
    0%, 10% { transform: translate(0, 0); }
    16%, 30% { transform: translate(-30px, 6px); }
    36%, 50% { transform: translate(30px, -4px); }
    56%, 66% { transform: translate(8px, -30px); }
    72%, 100% { transform: translate(0, 0); }
}

@keyframes sk-search {
    0%, 100% { transform: translate(-30px, 4px); }
    50% { transform: translate(30px, -4px); }
}

@keyframes sk-blink {
    0%, 76%, 82%, 100% { transform: scaleY(1); }
    79% { transform: scaleY(0.08); }
}

@keyframes sk-twinkle {
    0%, 100% { transform: scale(0.75) rotate(-8deg); opacity: 0.55; }
    50% { transform: scale(1.12) rotate(8deg); opacity: 1; }
}

/* Scan icon */

.sk-scan-icon {
    display: block;
    flex: none;
    overflow: visible;
}

.sk-scan-icon .sk-scan-glint { fill: var(--sk-scan-glint, rgba(255, 255, 255, 0.9)); }
.sk-scan-icon .sk-scan-line { opacity: 0; }
.sk-scan-icon .sk-scan-look,
.sk-scan-icon .sk-scan-line {
    transform-box: view-box;
    transform-origin: center;
}

.sk-scan-icon.is-animated .sk-scan-line { animation: sk-scan-sweep 2.4s ease-in-out infinite; }
.sk-scan-icon.is-animated .sk-scan-look { animation: sk-scan-look 4.8s ease-in-out infinite; }

@keyframes sk-scan-sweep {
    0% { transform: translateY(-6px); opacity: 0; }
    15% { opacity: 0.9; }
    50% { transform: translateY(6px); opacity: 0.9; }
    65%, 100% { transform: translateY(6px); opacity: 0; }
}

@keyframes sk-scan-look {
    0%, 20%, 100% { transform: translateX(0); }
    30%, 45% { transform: translateX(-2px); }
    55%, 70% { transform: translateX(2px); }
}

/* Loader */

.sk-loader {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 14px;
    padding: 20px;
    color: var(--sc-text-muted);
    text-align: center;
    animation: sk-loader-in 0.3s var(--sc-ease-out) both;
}

.sk-loader-mark {
    position: relative;
    display: grid;
    place-items: center;
    width: var(--sk-loader-size, 84px);
    height: var(--sk-loader-size, 84px);
    padding: calc(var(--sk-loader-size, 84px) * 0.16);
}

.sk-loader-small { --sk-loader-size: 52px; padding: 10px; gap: 8px; }
.sk-loader-medium { --sk-loader-size: 84px; }
.sk-loader-screen { --sk-loader-size: 128px; flex: 1; min-height: 60vh; }

.sk-loader-ring {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    animation: sk-spin 1.4s linear infinite;
}

.sk-loader-track { stroke: rgba(var(--sc-primary-rgb), 0.12); }

.sk-loader-arc {
    stroke: var(--sc-primary);
    stroke-linecap: round;
    stroke-dasharray: 28 72;
    filter: drop-shadow(0 0 6px rgba(var(--sc-primary-rgb), 0.7));
}

.sk-loader-label {
    font-family: var(--sc-font-display);
    font-size: 15px;
    font-weight: 600;
    letter-spacing: 0.01em;
    color: var(--sc-text);
}

.sk-loader-label::after {
    content: "";
    display: inline-block;
    width: 1.2em;
    text-align: left;
    animation: sk-dots 1.4s steps(4, end) infinite;
}

/* Inline: a little eye that spins its lid, for buttons */

.sk-loader-eye {
    display: inline-flex;
    flex: none;
    width: 1.15em;
    height: 1.15em;
    vertical-align: -0.2em;
}

.sk-loader-eye svg {
    width: 100%;
    height: 100%;
    overflow: visible;
}

.sk-loader-eye-ring { stroke: currentColor; opacity: 0.25; }

.sk-loader-eye-arc {
    stroke: currentColor;
    stroke-linecap: round;
    stroke-dasharray: 30 70;
    transform-origin: center;
    animation: sk-spin 0.9s linear infinite;
}

.sk-loader-eye-iris {
    fill: currentColor;
    animation: sk-iris-search 1.2s ease-in-out infinite;
}

@keyframes sk-spin { to { transform: rotate(360deg); } }

@keyframes sk-iris-search {
    0%, 100% { transform: translateX(-3px); }
    50% { transform: translateX(3px); }
}

@keyframes sk-dots {
    0% { content: ""; }
    25% { content: "."; }
    50% { content: ".."; }
    75%, 100% { content: "..."; }
}

@keyframes sk-loader-in {
    from { opacity: 0; transform: scale(0.94); }
}

@media (prefers-reduced-motion: reduce) {
    .sk-logo .sk-body,
    .sk-logo .sk-eye,
    .sk-logo .sk-look,
    .sk-logo .sk-star,
    .sk-scan-icon .sk-scan-look,
    .sk-scan-icon .sk-scan-line,
    .sk-loader-eye-iris {
        animation: none !important;
    }

    .sk-loader-ring,
    .sk-loader-eye-arc {
        animation-duration: 3s;
    }
}

/* Bottom-bar icons (NavIcon). Still until their tab is active. */

.sk-nav-icon {
    display: block;
    flex: none;
    overflow: visible;
}

.sk-nav-icon * {
    transform-box: fill-box;
    transform-origin: center;
}

.sk-nav-badge .sk-nav-sweep { opacity: 0; }
.sk-nav-battle .sk-nav-slash { stroke-dasharray: 1; stroke-dashoffset: 0; }
.sk-nav-social .sk-nav-pulse { opacity: 0; }
.sk-nav-social .sk-nav-orbit { transform-box: view-box; transform-origin: 12px 12px; }

:is(.tab-button.active .sk-nav-badge, .sk-nav-badge.is-animated) .sk-nav-sweep { animation: sk-nav-sweep 2.6s ease-in-out infinite; }
:is(.tab-button.active .sk-nav-badge, .sk-nav-badge.is-animated) .sk-nav-portrait { animation: sk-nav-bob 2.6s ease-in-out infinite; }

:is(.tab-button.active .sk-nav-cached, .sk-nav-cached.is-animated) .sk-nav-lid { animation: sk-nav-lid 3s var(--sc-ease-spring) infinite; }
:is(.tab-button.active .sk-nav-cached, .sk-nav-cached.is-animated) .sk-nav-iris { animation: sk-nav-glance 3s ease-in-out infinite; }

:is(.tab-button.active .sk-nav-battle, .sk-nav-battle.is-animated) .sk-nav-slash { animation: sk-nav-slash 2.4s var(--sc-ease-out) infinite; }
:is(.tab-button.active .sk-nav-battle, .sk-nav-battle.is-animated) .sk-nav-slash-2 { animation-delay: 0.08s; }
:is(.tab-button.active .sk-nav-battle, .sk-nav-battle.is-animated) .sk-nav-slash-3 { animation-delay: 0.16s; }

:is(.tab-button.active .sk-nav-social, .sk-nav-social.is-animated) .sk-nav-pulse { animation: sk-nav-ping 3.6s ease-in-out infinite; }
:is(.tab-button.active .sk-nav-social, .sk-nav-social.is-animated) .sk-nav-orbit { animation: sk-spin 3.6s linear infinite; }
:is(.tab-button.active .sk-nav-social, .sk-nav-social.is-animated) .sk-nav-meridian { animation: sk-nav-turn 3.6s linear infinite; }
:is(.tab-button.active .sk-nav-social, .sk-nav-social.is-animated) .sk-nav-meridian-2 { animation-delay: -1.8s; }

@keyframes sk-nav-sweep {
    0% { transform: translateX(0); opacity: 0; }
    15% { opacity: 0.9; }
    70% { transform: translateX(15px); opacity: 0.9; }
    85%, 100% { transform: translateX(15px); opacity: 0; }
}

@keyframes sk-nav-bob {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-0.8px); }
}

@keyframes sk-nav-lid {
    0%, 55%, 100% { transform: translateY(0); }
    65%, 85% { transform: translateY(-2.4px); }
}

@keyframes sk-nav-glance {
    0%, 40%, 100% { transform: translateX(0); }
    50%, 62% { transform: translateX(-0.8px); }
    72%, 84% { transform: translateX(0.8px); }
}

@keyframes sk-nav-slash {
    0% { stroke-dashoffset: 1; }
    30%, 100% { stroke-dashoffset: 0; }
}

@keyframes sk-nav-ping {
    0%, 100% { opacity: 0.3; }
    50% { opacity: 1; }
}

/* Squashing a meridian to a line and back reads as the globe turning */
@keyframes sk-nav-turn {
    0% { transform: scaleX(1); opacity: 1; }
    50% { transform: scaleX(0.05); opacity: 1; }
    100% { transform: scaleX(1); opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
    .tab-button.active .sk-nav-icon * {
        animation: none !important;
    }
}

/*
 * Decode reveal (DecodeReveal.razor), 3.6s:
 * 0-1s the barcode lifts off the grid while a laser reads it, 1-1.4s it collapses into a beam,
 * 1.4-3s the beam prints the Skanimal bottom-up in glowing layers, 3s a flash and the name.
 */

.sk-decode {
    position: fixed;
    inset: 0;
    z-index: 1500;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 18px;
    overflow: hidden;
    background: radial-gradient(ellipse 80% 60% at 50% 45%, #0b2a5c 0%, #040b1e 70%);
    color: var(--sc-text);
    cursor: pointer;
    animation: sk-loader-in 0.25s ease both;
}

.sk-decode-grid {
    position: absolute;
    left: -50%;
    right: -50%;
    bottom: -10%;
    height: 55%;
    background:
        linear-gradient(rgba(var(--sc-primary-rgb), 0.55) 1px, transparent 1px) 0 0 / 100% 36px,
        linear-gradient(90deg, rgba(var(--sc-primary-rgb), 0.55) 1px, transparent 1px) 0 0 / 36px 100%;
    transform: perspective(320px) rotateX(62deg);
    transform-origin: 50% 0;
    mask-image: linear-gradient(to bottom, transparent 0%, #000 35%, #000 70%, transparent 100%);
    animation: sk-decode-grid 3.6s linear both;
}

.sk-decode-stage {
    position: relative;
    display: grid;
    place-items: center;
    width: 220px;
    height: 220px;
}

.sk-decode-bars {
    position: absolute;
    bottom: 18px;
    display: flex;
    align-items: flex-end;
    height: 120px;
    animation: sk-decode-collapse 3.6s var(--sc-ease-out) both;
}

.sk-decode-bars span {
    width: var(--w);
    height: 100%;
    margin-right: var(--g);
    background: linear-gradient(to top, #fff 0%, var(--sc-primary) 60%, rgba(var(--sc-primary-rgb), 0.2) 100%);
    box-shadow: 0 0 8px rgba(var(--sc-primary-rgb), 0.8);
    transform-origin: bottom;
    animation: sk-decode-bar 3.6s var(--sc-ease-out) both;
    animation-delay: calc(var(--i) * 12ms);
}

.sk-decode-laser {
    position: absolute;
    bottom: 10px;
    left: 50%;
    width: 3px;
    height: 140px;
    border-radius: 2px;
    background: #fff;
    box-shadow: 0 0 10px #fff, 0 0 24px var(--sc-primary), 0 0 48px var(--sc-primary);
    opacity: 0;
    animation: sk-decode-laser 3.6s ease-in-out both;
}

.sk-decode-beam {
    position: absolute;
    bottom: 10px;
    left: 50%;
    width: 140px;
    height: 4px;
    margin-left: -70px;
    border-radius: 2px;
    background: linear-gradient(90deg, transparent, #fff, transparent);
    box-shadow: 0 0 18px var(--sc-primary), 0 0 40px var(--sc-primary);
    opacity: 0;
    animation: sk-decode-beam 3.6s ease-in-out both;
}

/* The glow sits outside the mask, so it hugs the creature's outline */
.sk-decode-glow {
    filter: drop-shadow(0 0 10px rgba(var(--sc-primary-rgb), 0.9)) brightness(1.6) saturate(0.4);
    animation: sk-decode-glow 3.6s linear both;
}

.sk-decode-print {
    position: relative;
    width: 168px;
    height: 168px;
    clip-path: inset(100% 0 0 0);
    -webkit-mask: var(--sprite) center / contain no-repeat;
    mask: var(--sprite) center / contain no-repeat;
    animation: sk-decode-print 3.6s linear both;
}

.sk-decode-print img {
    display: block;
    width: 100%;
    height: 100%;
    image-rendering: auto;
    object-fit: contain;
}

/* Horizontal print layers that fade as the creature solidifies */
.sk-decode-slices {
    position: absolute;
    inset: 0;
    background: repeating-linear-gradient(to top, rgba(var(--sc-primary-rgb), 0.55) 0 2px, transparent 2px 6px);
    mix-blend-mode: screen;
    animation: sk-decode-slices 3.6s linear both;
}

/* The print head: a bright line riding the top of what's been printed */
.sk-decode-head {
    position: absolute;
    left: -16px;
    right: -16px;
    height: 3px;
    border-radius: 2px;
    background: #fff;
    box-shadow: 0 0 12px #fff, 0 0 30px var(--sc-primary);
    animation: sk-decode-head 3.6s linear both;
}

.sk-decode-ring {
    position: absolute;
    width: 200px;
    height: 200px;
    border: 2px solid var(--sc-primary);
    border-radius: 50%;
    opacity: 0;
    animation: sk-decode-ring 3.6s var(--sc-ease-out) both;
}

.sk-decode-flash {
    position: absolute;
    inset: -60%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.95) 0%, rgba(var(--sc-primary-rgb), 0.4) 30%, transparent 60%);
    opacity: 0;
    animation: sk-decode-flash 3.6s ease-out both;
    pointer-events: none;
}

.sk-decode-text {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    min-height: 92px;
}

.sk-decode-code {
    font-family: ui-monospace, 'Cascadia Code', Consolas, monospace;
    font-size: 13px;
    letter-spacing: 0.35em;
    color: var(--sc-primary);
    animation: sk-decode-code 3.6s ease both;
}

.sk-decode-title {
    font-family: var(--sc-font-display);
    font-size: 30px;
    font-weight: 700;
    letter-spacing: 0.3em;
    text-shadow: 0 0 18px rgba(var(--sc-primary-rgb), 0.9);
    animation: sk-decode-title 3.6s var(--sc-ease-out) both;
}

.sk-decode-name {
    font-family: var(--sc-font-display);
    font-size: 18px;
    color: var(--sc-text-muted);
    animation: sk-decode-late 3.6s ease both;
}

.sk-decode-rarity {
    animation: sk-decode-late 3.6s ease both;
}

.sk-decode-skip {
    position: absolute;
    bottom: calc(24px + var(--sc-safe-bottom));
    color: var(--sc-text-faint);
    font-size: 12px;
}

@keyframes sk-decode-grid {
    from { background-position: 0 0, 0 0; }
    to { background-position: 0 144px, 0 0; }
}

@keyframes sk-decode-bar {
    0% { transform: scaleY(0); opacity: 0; }
    18% { transform: scaleY(1); opacity: 1; }
    100% { transform: scaleY(1); opacity: 1; }
}

@keyframes sk-decode-collapse {
    0%, 26% { transform: scaleX(1); opacity: 1; filter: none; }
    38% { transform: scaleX(0.02); opacity: 1; filter: brightness(2); }
    40%, 100% { transform: scaleX(0); opacity: 0; }
}

@keyframes sk-decode-laser {
    0%, 6% { transform: translateX(-130px); opacity: 0; }
    10% { opacity: 1; }
    26% { transform: translateX(130px); opacity: 1; }
    28%, 100% { transform: translateX(130px); opacity: 0; }
}

@keyframes sk-decode-beam {
    0%, 34% { transform: scaleX(0); opacity: 0; }
    40% { transform: scaleX(1); opacity: 1; }
    83% { transform: scaleX(1); opacity: 1; }
    88%, 100% { transform: scaleX(0.4); opacity: 0; }
}

@keyframes sk-decode-print {
    0%, 39% { clip-path: inset(100% 0 0 0); }
    83%, 100% { clip-path: inset(0 0 0 0); }
}

@keyframes sk-decode-glow {
    0%, 83% { filter: drop-shadow(0 0 10px rgba(var(--sc-primary-rgb), 0.9)) brightness(1.6) saturate(0.35); }
    92%, 100% { filter: drop-shadow(0 0 14px rgba(var(--sc-primary-rgb), 0.5)); }
}

/* "New species!" bursts in while the creature is still printing */
.sk-decode-new {
    position: absolute;
    top: -6px;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 14px;
    border-radius: var(--sc-radius-pill);
    background: var(--sc-gradient-gold);
    color: var(--sc-navy);
    font-family: var(--sc-font-display);
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 0.04em;
    box-shadow: 0 0 24px rgba(255, 200, 61, 0.6);
    animation: sk-decode-new 3.6s var(--sc-ease-spring) both;
}

@keyframes sk-decode-new {
    0%, 55% { transform: scale(0) rotate(-10deg); opacity: 0; }
    63% { transform: scale(1.15) rotate(3deg); opacity: 1; }
    70%, 100% { transform: scale(1) rotate(-3deg); opacity: 1; }
}

@keyframes sk-decode-head {
    0%, 39% { bottom: 0; opacity: 0; }
    41% { opacity: 1; }
    83% { bottom: 100%; opacity: 1; }
    86%, 100% { bottom: 100%; opacity: 0; }
}

@keyframes sk-decode-slices {
    0%, 80% { opacity: 1; }
    92%, 100% { opacity: 0; }
}

@keyframes sk-decode-ring {
    0%, 82% { transform: scale(0.4); opacity: 0; }
    86% { opacity: 0.9; }
    100% { transform: scale(1.25); opacity: 0; }
}

@keyframes sk-decode-flash {
    0%, 82% { opacity: 0; }
    85% { opacity: 1; }
    100% { opacity: 0; }
}

@keyframes sk-decode-code {
    0% { opacity: 0; }
    8%, 80% { opacity: 1; }
    100% { opacity: 0.4; }
}

@keyframes sk-decode-title {
    0%, 82% { opacity: 0; letter-spacing: 0.8em; }
    92%, 100% { opacity: 1; letter-spacing: 0.3em; }
}

@keyframes sk-decode-late {
    0%, 88% { opacity: 0; transform: translateY(6px); }
    100% { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
    .sk-decode *,
    .sk-decode {
        animation-duration: 0.01ms !important;
        animation-delay: 0s !important;
    }
}

/* A Skanimal changing form after a battle (EvolveReveal). It borrows the decode print, on its own 4.2s timeline */

.sk-evo {
    --evo-rgb: var(--sc-primary-rgb);
    position: fixed;
    inset: 0;
    z-index: 2100;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 18px;
    overflow: hidden;
    background: radial-gradient(ellipse 80% 60% at 50% 45%, #0b2a5c 0%, #040b1e 70%);
    color: var(--sc-text);
    cursor: pointer;
    animation: sk-loader-in 0.25s ease both;
}

.sk-evo.is-demote {
    --evo-rgb: 255, 107, 107;
    background: radial-gradient(ellipse 80% 60% at 50% 45%, #3a0f1c 0%, #0d040a 70%);
}

.sk-evo .sk-decode-grid {
    background:
        linear-gradient(rgba(var(--evo-rgb), 0.55) 1px, transparent 1px) 0 0 / 100% 36px,
        linear-gradient(90deg, rgba(var(--evo-rgb), 0.55) 1px, transparent 1px) 0 0 / 36px 100%;
    animation-duration: 4.2s;
}

.sk-evo-stage {
    position: relative;
    display: grid;
    place-items: center;
    width: 220px;
    height: 220px;
}

.sk-evo-stage > * {
    grid-area: 1 / 1;
}

/* The old form: charges to a white-hot silhouette, or glitches apart, then squashes into the beam */
.sk-evo-old {
    width: 168px;
    height: 168px;
    animation: sk-evo-old-up 4.2s ease-in both;
}

.sk-evo.is-demote .sk-evo-old {
    animation-name: sk-evo-old-down;
    animation-timing-function: steps(1, end);
}

.sk-evo-old img,
.sk-evo-print img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
}

@keyframes sk-evo-old-up {
    0% { transform: scale(0.9); opacity: 0; filter: drop-shadow(0 0 0 transparent); }
    6% { transform: scale(1); opacity: 1; filter: drop-shadow(0 0 10px rgba(var(--evo-rgb), 0.5)); }
    16% { transform: scale(1.04); filter: drop-shadow(0 0 14px rgba(var(--evo-rgb), 0.8)) brightness(1.6); }
    22% { transform: scale(0.98); filter: drop-shadow(0 0 18px rgba(var(--evo-rgb), 0.9)) brightness(2.4) saturate(0.4); }
    28% { transform: scale(1.06); filter: drop-shadow(0 0 22px #fff) brightness(4) saturate(0); }
    34% { transform: scale(1, 1); opacity: 1; filter: drop-shadow(0 0 26px #fff) brightness(6) saturate(0); }
    39% { transform: scale(1.4, 0.03); opacity: 1; filter: drop-shadow(0 0 26px #fff) brightness(6) saturate(0); }
    41%, 100% { transform: scale(0, 0.03); opacity: 0; }
}

@keyframes sk-evo-old-down {
    0% { transform: none; opacity: 0; filter: none; }
    6% { transform: none; opacity: 1; filter: drop-shadow(0 0 8px rgba(var(--evo-rgb), 0.5)); }
    12% { transform: translate(-4px, 1px) skewX(6deg); filter: drop-shadow(0 0 8px rgba(var(--evo-rgb), 0.7)) hue-rotate(-40deg) saturate(1.6); }
    14% { transform: none; filter: drop-shadow(0 0 8px rgba(var(--evo-rgb), 0.5)); }
    19% { transform: translate(5px, -2px) skewX(-8deg); filter: drop-shadow(-4px 0 0 rgba(0, 255, 255, 0.7)) drop-shadow(4px 0 0 rgba(var(--evo-rgb), 0.9)); }
    21% { transform: none; filter: grayscale(0.4) drop-shadow(0 0 10px rgba(var(--evo-rgb), 0.7)); }
    25% { transform: translate(-6px, 0) scaleX(1.08); filter: drop-shadow(-6px 0 0 rgba(0, 255, 255, 0.7)) drop-shadow(6px 0 0 rgba(var(--evo-rgb), 0.9)) grayscale(0.6); }
    27% { transform: translate(3px, 2px); filter: grayscale(0.8) brightness(0.7); opacity: 0.7; }
    29% { transform: translate(-2px, -3px) skewX(12deg); opacity: 1; filter: drop-shadow(-6px 0 0 rgba(0, 255, 255, 0.8)) drop-shadow(6px 0 0 rgba(var(--evo-rgb), 1)) grayscale(1); }
    31% { transform: none; opacity: 0.5; filter: grayscale(1) brightness(0.6); }
    33% { transform: translate(8px, 0) skewX(-14deg); opacity: 1; filter: drop-shadow(0 0 16px rgba(var(--evo-rgb), 1)) brightness(2) grayscale(1); }
    36% { transform: scale(1.3, 0.04); opacity: 1; filter: brightness(4) grayscale(1); }
    39%, 100% { transform: scale(0, 0.03); opacity: 0; }
}

/* Promote: sparks drawn into the creature while it charges. Demote: shards thrown off as it breaks up */
.sk-evo-sparks {
    position: relative;
    width: 0;
    height: 0;
}

.sk-evo-sparks span {
    position: absolute;
    left: -3px;
    top: -3px;
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 8px #fff, 0 0 16px rgb(var(--evo-rgb));
    opacity: 0;
    animation: sk-evo-spark-in 4.2s ease-in both;
    animation-delay: calc(var(--i) * -55ms);
}

.sk-evo.is-demote .sk-evo-sparks span {
    width: 10px;
    height: 3px;
    border-radius: 1px;
    background: rgb(var(--evo-rgb));
    animation-name: sk-evo-spark-out;
    animation-timing-function: var(--sc-ease-out);
    animation-delay: calc(var(--i) * 18ms);
}

@keyframes sk-evo-spark-in {
    0%, 8% { transform: rotate(var(--a)) translateY(-150px) scale(0.4); opacity: 0; }
    12% { opacity: 1; }
    22% { transform: rotate(calc(var(--a) + 40deg)) translateY(-20px) scale(1); opacity: 1; }
    23% { transform: rotate(var(--a)) translateY(-150px) scale(0.4); opacity: 0; }
    25% { opacity: 1; }
    34% { transform: rotate(calc(var(--a) + 40deg)) translateY(-10px) scale(1); opacity: 1; }
    36%, 100% { transform: rotate(var(--a)) translateY(0) scale(0); opacity: 0; }
}

@keyframes sk-evo-spark-out {
    0%, 34% { transform: rotate(var(--a)) translateY(-10px) scale(0.5); opacity: 0; }
    36% { opacity: 1; }
    52% { transform: rotate(calc(var(--a) - 25deg)) translateY(-170px) scale(1); opacity: 1; }
    58%, 100% { transform: rotate(calc(var(--a) - 25deg)) translateY(-190px) scale(0.6); opacity: 0; }
}

.sk-evo-beam {
    align-self: end;
    width: 150px;
    height: 4px;
    margin-bottom: 26px;
    border-radius: 2px;
    background: linear-gradient(90deg, transparent, #fff, transparent);
    box-shadow: 0 0 18px rgb(var(--evo-rgb)), 0 0 40px rgb(var(--evo-rgb));
    opacity: 0;
    animation: sk-evo-beam 4.2s ease-in-out both;
}

@keyframes sk-evo-beam {
    0%, 37% { transform: scaleX(0); opacity: 0; }
    42% { transform: scaleX(1); opacity: 1; }
    84% { transform: scaleX(1); opacity: 1; }
    89%, 100% { transform: scaleX(0.4); opacity: 0; }
}

.sk-evo-glow {
    filter: drop-shadow(0 0 10px rgba(var(--evo-rgb), 0.9)) brightness(1.6) saturate(0.4);
    animation: sk-evo-glow 4.2s linear both;
}

.sk-evo .sk-evo-print {
    animation: sk-evo-print 4.2s linear both;
}

.sk-evo .sk-evo-slices {
    background: repeating-linear-gradient(to top, rgba(var(--evo-rgb), 0.55) 0 2px, transparent 2px 6px);
    animation: sk-evo-slices 4.2s linear both;
}

.sk-evo .sk-evo-head {
    box-shadow: 0 0 12px #fff, 0 0 30px rgb(var(--evo-rgb));
    animation: sk-evo-head 4.2s linear both;
}

.sk-evo .sk-evo-ring {
    border-color: rgb(var(--evo-rgb));
    animation: sk-evo-ring 4.2s var(--sc-ease-out) both;
}

.sk-evo .sk-evo-flash {
    background: radial-gradient(circle, rgba(255, 255, 255, 0.95) 0%, rgba(var(--evo-rgb), 0.4) 30%, transparent 60%);
    animation: sk-evo-flash 4.2s ease-out both;
}

.sk-evo .sk-evo-flash.is-mid {
    animation-name: sk-evo-flash-mid;
}

@keyframes sk-evo-print {
    0%, 43% { clip-path: inset(100% 0 0 0); }
    84%, 100% { clip-path: inset(0 0 0 0); }
}

@keyframes sk-evo-head {
    0%, 43% { bottom: 0; opacity: 0; }
    45% { opacity: 1; }
    84% { bottom: 100%; opacity: 1; }
    87%, 100% { bottom: 100%; opacity: 0; }
}

@keyframes sk-evo-slices {
    0%, 82% { opacity: 1; }
    93%, 100% { opacity: 0; }
}

@keyframes sk-evo-glow {
    0%, 84% { filter: drop-shadow(0 0 10px rgba(var(--evo-rgb), 0.9)) brightness(1.6) saturate(0.35); }
    93%, 100% { filter: drop-shadow(0 0 16px rgba(var(--evo-rgb), 0.55)); }
}

@keyframes sk-evo-ring {
    0%, 84% { transform: scale(0.4); opacity: 0; }
    88% { opacity: 0.9; }
    100% { transform: scale(1.35); opacity: 0; }
}

@keyframes sk-evo-flash-mid {
    0%, 37% { opacity: 0; }
    39% { opacity: 0.9; }
    46%, 100% { opacity: 0; }
}

@keyframes sk-evo-flash {
    0%, 84% { opacity: 0; }
    87% { opacity: 1; }
    100% { opacity: 0; }
}

.sk-evo-name {
    font-family: var(--sc-font-display);
    font-size: 18px;
    color: var(--sc-text-muted);
    animation: sk-decode-code 4.2s ease both;
}

.sk-evo-title {
    font-family: var(--sc-font-display);
    font-size: 30px;
    font-weight: 700;
    letter-spacing: 0.3em;
    text-shadow: 0 0 18px rgba(var(--evo-rgb), 0.9);
    animation: sk-evo-title 4.2s var(--sc-ease-out) both;
}

.sk-evo.is-promote .sk-evo-title {
    background: var(--sc-gradient-gold);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    text-shadow: none;
    filter: drop-shadow(0 0 14px rgba(255, 200, 61, 0.6));
}

.sk-evo.is-demote .sk-evo-title {
    color: rgb(var(--evo-rgb));
}

.sk-evo-stages {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 14px;
    color: var(--sc-text-muted);
    animation: sk-decode-late 4.2s ease both;
}

.sk-evo-stages b {
    color: rgb(var(--evo-rgb));
}

@keyframes sk-evo-title {
    0%, 85% { opacity: 0; letter-spacing: 0.8em; }
    94%, 100% { opacity: 1; letter-spacing: 0.3em; }
}

@media (prefers-reduced-motion: reduce) {
    .sk-evo *,
    .sk-evo {
        animation-duration: 0.01ms !important;
        animation-delay: 0s !important;
    }
}

/* Battle mode emblems (ModeIcon) */

.sk-mode-icon {
    display: block;
    overflow: visible;
}

.sk-mode-icon * {
    transform-box: fill-box;
    transform-origin: center;
}

.sk-mode-claw-left { animation: sk-mode-clash-left 2.4s var(--sc-ease-out) infinite; }
.sk-mode-claw-right { animation: sk-mode-clash-right 2.4s var(--sc-ease-out) infinite; }
.sk-mode-sparks { animation: sk-mode-sparks 2.4s ease-out infinite; }
.sk-mode-ring { animation: sk-mode-ring 2.6s ease-out infinite; }
.sk-mode-dart { animation: sk-mode-dart 2.6s var(--sc-ease-spring) infinite; }

@keyframes sk-mode-clash-left {
    0%, 100% { transform: translateX(-3px); }
    40% { transform: translateX(2px); }
    50% { transform: translateX(0); }
}

@keyframes sk-mode-clash-right {
    0%, 100% { transform: translateX(3px); }
    40% { transform: translateX(-2px); }
    50% { transform: translateX(0); }
}

@keyframes sk-mode-sparks {
    0%, 35% { transform: scale(0.4); opacity: 0; }
    45% { transform: scale(1.15); opacity: 1; }
    70%, 100% { transform: scale(0.9) rotate(20deg); opacity: 0; }
}

@keyframes sk-mode-ring {
    0% { transform: scale(1); opacity: 1; }
    60% { transform: scale(1.25); opacity: 0.2; }
    100% { transform: scale(1); opacity: 1; }
}

@keyframes sk-mode-dart {
    0%, 20% { transform: translate(10px, -10px); opacity: 0; }
    30% { transform: translate(0, 0); opacity: 1; }
    36% { transform: translate(-1px, 1px); }
    42%, 85% { transform: translate(0, 0); opacity: 1; }
    100% { transform: translate(0, 0); opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
    .sk-mode-icon * { animation: none !important; }
}

/*
 * Reconnecting banner (#components-reconnect-modal in _Host). Blazor toggles the components-reconnect-* classes.
 * It fades in only after a beat, so the quick reconnects that happen when a phone wakes up never show.
 */

.sk-reconnect {
    position: fixed;
    top: calc(10px + var(--sc-safe-top));
    left: 50%;
    z-index: 3000;
    display: none;
    transform: translateX(-50%);
    pointer-events: none;
}

.sk-reconnect.components-reconnect-show,
.sk-reconnect.components-reconnect-failed {
    display: block;
}

.sk-reconnect-card {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 16px;
    border: 1px solid rgba(var(--sc-primary-rgb), 0.45);
    border-radius: var(--sc-radius-pill);
    background: rgba(var(--sc-bg-rgb), 0.92);
    backdrop-filter: blur(10px);
    color: var(--sc-text);
    font-size: 14px;
    font-weight: 600;
    white-space: nowrap;
    box-shadow: var(--sc-shadow-lg), 0 0 18px rgba(var(--sc-primary-rgb), 0.25);
    pointer-events: auto;
    opacity: 0;
    animation: sk-reconnect-in 0.35s var(--sc-ease-out) 1.5s forwards;
}

.sk-reconnect.components-reconnect-failed .sk-reconnect-card {
    border-color: var(--sc-danger);
    animation-delay: 0s;
}

.sk-reconnect-spinner {
    width: 16px;
    height: 16px;
    border: 2.5px solid rgba(var(--sc-primary-rgb), 0.25);
    border-top-color: var(--sc-primary);
    border-radius: 50%;
    animation: sk-spin 0.8s linear infinite;
}

.sk-reconnect-failed { display: none; }
.sk-reconnect.components-reconnect-failed .sk-reconnect-failed { display: inline; }
.sk-reconnect.components-reconnect-failed .sk-reconnect-retrying,
.sk-reconnect.components-reconnect-failed .sk-reconnect-spinner { display: none; }

.sk-reconnect-failed a { color: var(--sc-primary); font-weight: 700; }

.sk-reconnect-dots::after {
    content: "";
    animation: sk-dots 1.4s steps(4, end) infinite;
}

@keyframes sk-reconnect-in {
    from { opacity: 0; transform: translateY(-8px); }
    to { opacity: 1; transform: none; }
}

/* Badge drawer icons (NavIcon Record, FieldLog, Unlocks, Skandex): animate while their drawer is open */

.sk-nav-record .sk-nav-shine { opacity: 0.4; }
.sk-nav-record.is-animated .sk-nav-cup { animation: sk-nav-bob 2.4s ease-in-out infinite; }
.sk-nav-record.is-animated .sk-nav-shine { animation: sk-twinkle 1.4s ease-in-out infinite; }

.sk-nav-fieldlog.is-animated .sk-nav-logline { animation: sk-nav-logscan 2s ease-in-out infinite; }

.sk-nav-unlocks.is-animated .sk-nav-lid { animation: sk-nav-lid 2.6s var(--sc-ease-spring) infinite; }
.sk-nav-unlocks.is-animated .sk-nav-shine { animation: sk-nav-pop-shine 2.6s ease-out infinite; }

.sk-nav-skandex.is-animated .sk-nav-page-eye { animation: sk-nav-page-blink 3.2s ease-in-out infinite; }

@keyframes sk-nav-logscan {
    0% { transform: translateY(-3px); opacity: 0; }
    15%, 70% { opacity: 1; }
    85%, 100% { transform: translateY(3px); opacity: 0; }
}

@keyframes sk-nav-pop-shine {
    0%, 55% { opacity: 0; transform: scale(0.4); }
    70% { opacity: 1; transform: scale(1.2); }
    100% { opacity: 0; transform: scale(0.8) translateY(-2px); }
}

@keyframes sk-nav-page-blink {
    0%, 88%, 100% { transform: scaleY(1); }
    93% { transform: scaleY(0.15); }
}
