ui/playerslots.razor.scss
@import "theme";
@import "avatar";
// Player palette mapped to theme accents
$p1: $accent-red;
$p2: $accent-blue;
$p3: $accent-yellow;
$p4: $accent-green;
$p5: $accent-orange;
$p6: $accent-pink;
$p7: $accent-cyan;
$p8: $accent-purple;
PlayerSlots
{
flex-direction: row;
gap: 18px;
padding: 4px;
}
.slot
{
width: 84px;
height: 84px;
border-radius: 50%;
background-color: rgba( 22, 20, 30, 0.35 );
border: 2px solid $pill-inner;
align-items: center;
justify-content: center;
position: relative;
box-shadow:
0px 4px 0px rgba( 0, 0, 0, 0.1 ),
0px 10px 22px $shadow-soft;
transition: transform 0.3s ease-out;
&:intro
{
transform: scale( 0.1 ) translateY( 0px );
}
}
// Empty slots are smoked glass so the background bleeds through.
.slot.empty
{
background-color: rgba( 22, 20, 30, 0.35 );
border-color: $pill-inner;
pointer-events: all;
cursor: pointer;
&:intro
{
transform: scale( 0 );
}
// Hover swaps the ? for a + to hint at inviting friends
.invite { display: none; }
&:hover
{
background-color: $pill-hover;
.question { display: none; }
.invite { display: flex; }
}
}
.slot.occupied
{
border-width: 3px;
}
@keyframes slot-bob
{
0% { transform: translateY( 0px ); }
50% { transform: translateY( -4px ); }
100% { transform: translateY( 0px ); }
}
// Per-slot staggered bob (on inner content to not conflict with intro scale)
.slot.slot-1 .avatar-wrap, .slot.slot-1 .placeholder { animation: slot-bob 3s ease-in-out 0s infinite; }
.slot.slot-2 .avatar-wrap, .slot.slot-2 .placeholder { animation: slot-bob 3s ease-in-out 0.4s infinite; }
.slot.slot-3 .avatar-wrap, .slot.slot-3 .placeholder { animation: slot-bob 3s ease-in-out 0.8s infinite; }
.slot.slot-4 .avatar-wrap, .slot.slot-4 .placeholder { animation: slot-bob 3s ease-in-out 1.2s infinite; }
.slot.slot-5 .avatar-wrap, .slot.slot-5 .placeholder { animation: slot-bob 3s ease-in-out 1.6s infinite; }
.slot.slot-6 .avatar-wrap, .slot.slot-6 .placeholder { animation: slot-bob 3s ease-in-out 2.0s infinite; }
.slot.slot-7 .avatar-wrap, .slot.slot-7 .placeholder { animation: slot-bob 3s ease-in-out 2.4s infinite; }
.slot.slot-8 .avatar-wrap, .slot.slot-8 .placeholder { animation: slot-bob 3s ease-in-out 2.8s infinite; }
// Per-player colored ring + chunky shadow
.slot.slot-1.occupied { border-color: $p1; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 255, 77, 106, 0.45 ); }
.slot.slot-2.occupied { border-color: $p2; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 108, 143, 224, 0.45 ); }
.slot.slot-3.occupied { border-color: $p3; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 255, 210, 61, 0.45 ); }
.slot.slot-4.occupied { border-color: $p4; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 124, 217, 168, 0.45 ); }
.slot.slot-5.occupied { border-color: $p5; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 244, 162, 97, 0.45 ); }
.slot.slot-6.occupied { border-color: $p6; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 255, 132, 163, 0.45 ); }
.slot.slot-7.occupied { border-color: $p7; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 126, 212, 217, 0.45 ); }
.slot.slot-8.occupied { border-color: $p8; box-shadow: 0px 4px 0px rgba(0,0,0,0.18), 0px 12px 24px rgba( 123, 45, 139, 0.45 ); }
.avatar-wrap
{
@include avatar(64px);
}
.bot-avatar
{
background-color: $pill-inner;
font-size: 34px;
align-items: center;
justify-content: center;
}
.placeholder
{
font-family: $display-font;
font-size: 38px;
font-weight: 800;
color: rgba( 255, 255, 255, 0.45 );
padding-bottom: 4px;
}
.number
{
position: absolute;
bottom: -4px;
right: -4px;
width: 28px;
height: 28px;
border-radius: 50%;
font-family: $display-font;
font-size: 14px;
font-weight: 800;
align-items: center;
justify-content: center;
padding-bottom: 2px;
border: 2px solid white;
box-shadow: 0px 3px 0px rgba( 0, 0, 0, 0.18 );
}
.slot.is-ready
{
background-color: $accent-green;
border-color: $accent-green;
}
.ready-check
{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background-color: transparent;
font-family: $display-font;
font-size: 32px;
font-weight: 800;
color: $accent-green;
text-shadow: 0px 3px 6px rgba( 0, 0, 0, 0.4 );
align-items: center;
justify-content: center;
z-index: 20;
transition: transform 0.3s ease-out;
&:intro
{
transform: scale( 2.0 );
}
}
.slot.slot-1 .number { background-color: $p1; color: white; }
.slot.slot-2 .number { background-color: $p2; color: white; }
.slot.slot-3 .number { background-color: $p3; color: $text-on-yellow; }
.slot.slot-4 .number { background-color: $p4; color: $text-on-green; }
.slot.slot-5 .number { background-color: $p5; color: white; }
.slot.slot-6 .number { background-color: $p6; color: white; }
.slot.slot-7 .number { background-color: $p7; color: $text-on-green; }
.slot.slot-8 .number { background-color: $p8; color: white; }
.device
{
position: absolute;
top: 80%;
left: 50%;
margin-top: -14px;
margin-left: -14px;
width: 28px;
height: 28px;
border-radius: 50%;
background-color: white;
font-size: 14px;
align-items: center;
justify-content: center;
padding-bottom: 2px;
border: 2px solid rgba( 42, 31, 48, 0.12 );
box-shadow: 0px 3px 0px rgba( 0, 0, 0, 0.15 );
}
.player-label
{
position: absolute;
bottom: -28px;
left: 50%;
margin-left: -18px;
width: 36px;
height: 18px;
border-radius: 9px;
font-family: $display-font;
font-size: 10px;
font-weight: 800;
letter-spacing: 1px;
color: white;
align-items: center;
justify-content: center;
text-align: center;
padding-top: 1px;
box-shadow: 0px 2px 0px rgba( 0, 0, 0, 0.15 );
}
.slot.slot-1 .player-label { background-color: $p1; }
.slot.slot-2 .player-label { background-color: $p2; }
.slot.slot-3 .player-label { background-color: $p3; color: $text-on-yellow; }
.slot.slot-4 .player-label { background-color: $p4; color: $text-on-green; }
.slot.slot-5 .player-label { background-color: $p5; }
.slot.slot-6 .player-label { background-color: $p6; }
.slot.slot-7 .player-label { background-color: $p7; color: $text-on-green; }
.slot.slot-8 .player-label { background-color: $p8; color: white; }