ui/cherryshockhud.razor.scss
// CHERRY SHOCK — Elemental Pop's reload discharge, a baked 21-frame overlay.
//
// ⚠️ The image, opacity and shake offset are all written from code per frame. No
// keyframe animation: the sequence has to start on a gameplay event and a CSS
// animation cannot be triggered from C# without rebuilding the panel.

.cherry-shock {
    position: absolute;
    width: 100%;
    height: 100%;
    pointer-events: none;

    // ⛔ BEHIND THE HUD, IN FRONT OF THE WORLD — the same choice DamageOverlay
    // documents, and for the same reason: an effect that hides your ammo count and
    // your health at the moment you are reloading in a crowd is actively hostile.
    // A separate PanelComponent, so a separate ScreenPanel layer, rather than a
    // child of SurvivalHud.
    z-index: -1;
}

.frame {
    position: absolute;

    // ⚠️ OVERSIZED AND OFFSET, because the panel is SHAKEN. At exactly 100% the
    // shake would drag an empty edge in from whichever side it moved away from.
    // 8px of bleed on all sides covers the 3.5px default with room to raise it.
    left: -8px;
    top: -8px;
    width: 100%;
    height: 100%;
    margin-right: -16px;
    margin-bottom: -16px;

    // ⚠️ 100% 100%, NOT cover. The frames are authored 16:9 with the vignette's
    // dark edge landing ON the screen edge; `cover` would crop that away on any
    // other aspect ratio and leave a hard line where the falloff should be. Same
    // reasoning as the blood overlay.
    background-size: 100% 100%;
    background-repeat: no-repeat;

    // Set from code. Starting at 0 means a fresh spawn cannot flash frame zero for
    // the one frame before OnUpdate first runs.
    opacity: 0;
}