ui/configbrowser.razor.scss
// Config browser — save/load modal over the lobby.
//
// ⚠️ Rendered inside the lobby's root, which is `pointer-events: none`, so this
// has to opt back in. A panel that declares neither is silently un-hit-testable
// in s&box — that was the lobby's own bug.
.configbrowser
{
font-family: Inter;
// Full-screen scrim, so a click outside the sheet cannot reach the lobby
// behind it. A modal that lets you press the button underneath it is worse
// than no modal.
position: absolute;
top: 0px; left: 0px;
width: 100%;
height: 100%;
align-items: center;
justify-content: center;
pointer-events: all;
background-color: rgba( 4, 6, 10, 0.72 );
.sheet
{
flex-direction: column;
width: 460px;
max-height: 70%;
background-color: rgba( 16, 18, 22, 0.98 );
border: 1px solid rgba( 255, 255, 255, 0.14 );
border-radius: 8px;
overflow: hidden;
}
.head
{
flex-direction: row;
align-items: center;
flex-shrink: 0;
padding: 14px 18px;
background-color: rgba( 255, 255, 255, 0.05 );
border-bottom: 1px solid rgba( 255, 255, 255, 0.08 );
.title { font-size: 17px; color: #fff; }
.map
{
margin-left: 10px;
font-size: 12px;
color: rgba( 255, 255, 255, 0.35 );
flex-grow: 1;
}
.x
{
font-size: 15px;
color: rgba( 255, 255, 255, 0.35 );
padding: 2px 6px;
border-radius: 4px;
cursor: pointer;
&:hover { color: #fff; background-color: rgba( 255, 255, 255, 0.10 ); }
}
}
// ── save ────────────────────────────────────────────────────────────────
.body
{
flex-direction: column;
padding: 18px;
.fieldlabel
{
font-size: 12px;
color: rgba( 255, 255, 255, 0.40 );
margin-bottom: 6px;
}
.nameentry
{
height: 34px;
padding: 0px 10px;
font-size: 15px;
color: #fff;
background-color: rgba( 0, 0, 0, 0.45 );
border: 1px solid rgba( 255, 255, 255, 0.14 );
border-radius: 4px;
&:focus { border-color: #ffd479; }
}
.warn
{
margin-top: 8px;
font-size: 12px;
color: #ff8a8a;
// Overwriting is a warning, not an error — the button still works.
&.overwrite { color: #ffcf5c; }
}
.summary
{
margin-top: 14px;
font-size: 12px;
color: rgba( 255, 255, 255, 0.35 );
}
}
// ── load ────────────────────────────────────────────────────────────────
.list
{
flex-direction: column;
flex-grow: 1;
flex-shrink: 1;
overflow-y: scroll;
padding: 8px;
.empty
{
padding: 22px;
font-size: 13px;
color: rgba( 255, 255, 255, 0.30 );
align-items: center;
justify-content: center;
}
.row
{
flex-direction: row;
align-items: center;
padding: 11px 14px;
margin-bottom: 4px;
border-radius: 4px;
background-color: rgba( 255, 255, 255, 0.04 );
cursor: pointer;
&:hover { background-color: rgba( 255, 255, 255, 0.09 ); }
.name { font-size: 15px; color: #fff; flex-grow: 1; }
.badge
{
font-size: 11px;
color: #7ad17a;
padding: 2px 8px;
border: 1px solid rgba( 122, 209, 122, 0.45 );
border-radius: 10px;
}
&.sel
{
background-color: rgba( 255, 212, 121, 0.16 );
border: 1px solid rgba( 255, 212, 121, 0.45 );
}
}
}
// ── footer ──────────────────────────────────────────────────────────────
.foot
{
flex-direction: row;
justify-content: flex-end;
flex-shrink: 0;
padding: 12px 18px;
border-top: 1px solid rgba( 255, 255, 255, 0.08 );
.btn
{
padding: 9px 20px;
margin-left: 8px;
font-size: 14px;
color: #0e1014;
background-color: #ffd479;
border-radius: 4px;
cursor: pointer;
&:hover { background-color: #ffe1a0; }
&.ghost
{
color: rgba( 255, 255, 255, 0.65 );
background-color: rgba( 255, 255, 255, 0.07 );
&:hover { color: #fff; background-color: rgba( 255, 255, 255, 0.14 ); }
&.armed { color: #ff8a8a; border: 1px solid rgba( 255, 138, 138, 0.5 ); }
}
// Destructive actions never wear the same colour as the safe one.
&.danger
{
color: #fff;
background-color: #c0392b;
&:hover { background-color: #e04b3c; }
}
&.disabled
{
color: rgba( 255, 255, 255, 0.25 );
background-color: rgba( 255, 255, 255, 0.05 );
cursor: default;
}
}
}
}