game/2d/gameplay/hypemeter.razor.scss
root {
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    pointer-events: none;
    z-index: 20;
}

.hype-wrap {
    position: absolute;
    top: 160px;
    bottom: 55px;
    right: 1650px;
    width: 12px;
    display: flex;
    flex-direction: column;
    align-items: center;
}

.hype-track {
    flex: 1;
    width: 20px;
    background-color: rgba(255,255,255,0.06);
    border-radius: 4px;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    overflow: hidden;
    position: relative;
}

.hype-fill {
    width: 100%;
    border-radius: 4px;
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
}

.hype-fill-empty { background-color: rgba(167,139,250,0.40); }
.hype-fill-low   { background-color: rgba(96,165,250,0.70); }
.hype-fill-mid   { background-color: rgba(52,211,153,0.80); }

.hype-fill-high {
    background-color: rgba(251,191,36,0.90);
    animation: hype-high-pulse 0.4s ease-in-out infinite alternate;
}

@keyframes hype-high-pulse {
    0%   { background-color: rgba(251,191,36,0.70); }
    100% { background-color: rgba(251,191,36,1.00); }
}

.hype-fill-max {
    background-color: rgba(239,68,68,0.90);
    animation: hype-max-pulse 0.25s ease-in-out infinite alternate;
}

@keyframes hype-max-pulse {
    0%   { background-color: rgba(239,68,68,0.80); }
    100% { background-color: rgba(251,191,36,1.00); }
}

.hype-bubble {
    position: absolute;
    left: 1px;
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background-color: rgba(255,255,255,0.30);
    animation-name: bubble-rise;
    animation-timing-function: ease-in;
    animation-iteration-count: infinite;
}

@keyframes bubble-rise {
    0%   { transform: translateY(0px); opacity: 0; }
    20%  { opacity: 1; }
    100% { transform: translateY(-40px); opacity: 0; }
}

.hype-mult-label {
    position: absolute;
    top: -14px;
    left: -10px;
    font-size: 10px;
    font-weight: 900;
    color: rgba(255,255,255,0.80);
    pointer-events: none;
}

/* SCREEN SHAKE */
.hype-wrap.shake-small  { animation: shake-small  0.25s ease-out; }
.hype-wrap.shake-medium { animation: shake-medium 0.35s ease-out; }
.hype-wrap.shake-strong { animation: shake-strong 0.45s ease-out; }
.hype-wrap.shake-insane { animation: shake-insane 0.55s ease-out; }

@keyframes shake-small {
    0%,100% { transform: translate(0,0); }
    25%     { transform: translate(-2px, 1px); }
    50%     { transform: translate(2px, -1px); }
    75%     { transform: translate(-1px, 2px); }
}
@keyframes shake-medium {
    0%,100% { transform: translate(0,0); }
    20%     { transform: translate(-4px, 2px) rotate(-0.3deg); }
    40%     { transform: translate(4px,-3px) rotate(0.3deg); }
    60%     { transform: translate(-3px, 3px) rotate(-0.2deg); }
    80%     { transform: translate(3px,-2px) rotate(0.2deg); }
}
@keyframes shake-strong {
    0%,100% { transform: translate(0,0); }
    15%     { transform: translate(-6px, 3px) rotate(-0.5deg); }
    30%     { transform: translate(6px,-4px) rotate(0.5deg); }
    45%     { transform: translate(-5px, 5px) rotate(-0.4deg); }
    60%     { transform: translate(5px,-4px) rotate(0.4deg); }
    75%     { transform: translate(-3px, 2px); }
    90%     { transform: translate(2px,-2px); }
}
@keyframes shake-insane {
    0%,100% { transform: translate(0,0); }
    10%     { transform: translate(-9px, 5px) rotate(-0.7deg); }
    20%     { transform: translate(9px,-6px) rotate(0.7deg); }
    30%     { transform: translate(-8px, 7px) rotate(-0.6deg); }
    40%     { transform: translate(8px,-6px) rotate(0.6deg); }
    50%     { transform: translate(-6px, 5px) rotate(-0.4deg); }
    60%     { transform: translate(6px,-5px) rotate(0.4deg); }
    70%     { transform: translate(-4px, 3px); }
    80%     { transform: translate(3px,-3px); }
    90%     { transform: translate(-1px, 1px); }
}