explorer / frontend /src /styles /components /position.css
noobpwnftw's picture
Deploy ChessTB Explorer on Hugging Face Spaces
c03d895
Raw History Blame
5.54 kB
/* ── FEN block ──────────────────────────────────────────────────────── */
.fen-block {
display: flex;
flex-direction: column;
flex-shrink: 0;
gap: 0.375rem;
}
.fen-input-wrap {
position: relative;
width: 100%;
display: flex;
align-items: center;
gap: var(--fen-row-gap);
}
.fen-input-wrap__label {
position: absolute;
left: 0.625rem; top: 50%;
transform: translateY(-50%);
font-size: var(--text-xs); font-weight: 700;
letter-spacing: 0.16em; text-transform: uppercase;
color: var(--text-muted);
pointer-events: none; user-select: none; z-index: 1;
}
.fen-input {
flex: 1 1 auto;
min-width: 0;
width: auto;
height: var(--control-h);
padding: 0 0.625rem 0 2.75rem;
font-family: var(--font-mono);
font-size: var(--text-xs);
color: var(--text);
background: var(--surface-2);
border: 1px solid var(--border);
border-radius: var(--r-md);
outline: none;
letter-spacing: 0.02em;
transition: border-color var(--tr), box-shadow var(--tr);
}
.fen-input:focus { border-color: var(--gold-dim); box-shadow: 0 0 0 2px var(--gold-glow); }
.fen-input::placeholder { color: var(--text-muted); font-size: var(--text-xs); }
.fen-input.is-invalid {
border-color: var(--loss) !important;
box-shadow: 0 0 0 2px rgba(248,113,113,0.15) !important;
}
.fen-actions {
display: flex;
gap: var(--fen-row-gap);
flex-wrap: nowrap;
}
/* Lock button - sits beside the FEN input, height matched to it. Width comes
from the FEN-row rule below. .lock-icon is drawn in a 0.6875rem layout box
and scaled up to its 0.875rem appearance at paint time. .is-locked uses
the same gold border/background as other active controls. */
.btn--lock {
height: var(--control-h);
}
/* Lock, Back and Next share one fixed width from --fen-icon-btn-w,
independent of icon size and padding. Scoped to the FEN row; other
icon-only buttons size from their own padding. */
.fen-input-wrap > .btn--lock,
.fen-actions > .btn--icon-only {
flex: 0 0 var(--fen-icon-btn-w);
width: var(--fen-icon-btn-w);
padding: 0;
justify-content: center;
}
.btn--lock .lock-icon {
width: 0.6875rem;
height: 0.6875rem;
transform: scale(1.2727);
}
.btn--lock.is-locked {
border-color: var(--gold);
color: var(--gold);
background: var(--gold-glow);
}
.btn--lock.is-locked:hover:not(.is-autoplay-disabled) { background: var(--gold-glow); border-color: var(--gold); }
.btn--lock.is-locked .btn__icon { opacity: 1; }
/* Soft-disabled during an auto-play run - see lockAutoplayDisabled in
FenBar.jsx. Uses a class/aria-disabled rather than the native disabled
attribute so the button stays hoverable. */
.btn--lock.is-autoplay-disabled { opacity: 0.38; cursor: not-allowed; }
/* Two icons are always present; CSS toggles which is visible via .is-locked. */
.lock-icon--unlocked { display: block; }
.lock-icon--locked { display: none; }
.btn--lock.is-locked .lock-icon--unlocked { display: none; }
.btn--lock.is-locked .lock-icon--locked { display: block; }
/* Spare-piece trays - dimmed while locked. Kept clickable (not
pointer-events:none) so they still show a not-allowed cursor; the
actual placement is refused at the source in board.js. */
.spare-tray.is-locked { opacity: 0.35; }
.spare-tray.is-locked .spare-piece { cursor: not-allowed; }
/* ── Error / coverage line ──────────────────────────────────────────── */
.error-line {
flex-shrink: 0;
min-height: 0.875rem;
font-size: var(--text-xs);
font-weight: 500;
color: var(--loss);
padding-left: 0.125rem;
display: flex;
align-items: center;
gap: 0.3125rem;
line-height: 1.4;
}
.error-line:empty { visibility: hidden; }
.error-line.is-coverage-error { color: var(--amber); }
/* ── Turn toggle ────────────────────────────────────────────────────── */
.turn-row { display: flex; gap: 0.3125rem; }
.turn-btn {
flex: 1;
height: var(--control-h);
display: flex; align-items: center; justify-content: center; gap: 0.375rem;
border-radius: var(--r-md);
border: 1px solid var(--border);
background: var(--surface-2);
color: var(--text-dim);
font-size: var(--text-xs); font-weight: 600;
font-family: var(--font-ui);
letter-spacing: 0.03em;
cursor: pointer;
transition: background var(--tr), border-color var(--tr), color var(--tr);
user-select: none;
}
.turn-btn:hover { background: var(--surface-3); border-color: var(--border-2); color: var(--text); }
.turn-btn:active { transform: scale(0.97); }
.turn-pip {
width: 0.5rem; height: 0.5rem;
border-radius: 50%;
flex-shrink: 0;
transition: background var(--tr), box-shadow var(--tr);
}
.turn-pip--w { background: var(--board-light); border: 1.5px solid var(--board-dark); }
.turn-pip--b { background: var(--pip-black-bg); border: 1.5px solid var(--pip-black-border); }
.turn-btn.is-active {
background: var(--turn-active-bg);
border-color: var(--gold-dim);
color: var(--gold);
}
.turn-btn.is-active .turn-pip--w { box-shadow: 0 0 5px color-mix(in srgb, var(--board-light) 50%, transparent); }
.turn-btn.is-active .turn-pip--b { border-color: var(--text-dim); }