Files
boker/static/css/style.css

3355 lines
85 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ================================================================
RESET + BASE
================================================================ */
*, *::before, *::after { box-sizing: border-box; }
html {
color-scheme: dark;
scroll-behavior: smooth;
width: 100%;
overflow-x: hidden;
}
body {
margin: 0;
width: 100%;
min-width: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
font-family: var(--font-ui);
font-size: 15px;
line-height: 1.5;
color: var(--text-body);
background: var(--bg);
-webkit-font-smoothing: antialiased;
overflow-x: hidden;
}
img, canvas, svg { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button, input, select, textarea { font: inherit; }
button { color: inherit; cursor: pointer; }
h1, h2, h3, h4 { margin: 0; }
::-webkit-scrollbar { width: 7px; height: 7px; }
::-webkit-scrollbar-track { background: var(--surface); }
::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 4px; }
/* ================================================================
FONTS
================================================================ */
:root {
--font-ui: Aptos, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--font-display: var(--font-ui);
--font-mono: ui-monospace, "SFMono-Regular", "Cascadia Mono", "Roboto Mono", "Liberation Mono", monospace;
--font-money: var(--font-ui);
}
/* ================================================================
SUBNAV
================================================================ */
.subnav {
position: sticky; top: 62px; z-index: 40;
background: rgba(15,15,18,.92);
backdrop-filter: blur(6px);
border-bottom: 1px solid var(--border);
}
.subnav__inner {
max-width: var(--w-admin);
margin: 0 auto;
padding: 0 var(--gutter);
height: 44px;
display: flex;
align-items: center;
gap: 4px;
overflow-x: auto;
scrollbar-width: none;
}
.subnav__inner::-webkit-scrollbar { display: none; }
.subnav__name {
font-size: .8125rem;
font-weight: 600;
color: var(--text-strong);
white-space: nowrap;
text-decoration: none;
flex-shrink: 0;
}
.subnav__name:hover { color: var(--accent); }
.subnav__divider {
display: block;
width: 1px;
height: 16px;
background: var(--border);
margin: 0 8px;
flex-shrink: 0;
}
.subnav__nav {
display: flex;
align-items: center;
gap: 2px;
flex: 1;
min-width: 0;
}
.subnav__link {
padding: 4px 10px;
font-size: .8125rem;
color: var(--text-muted);
text-decoration: none;
border-radius: 6px;
white-space: nowrap;
transition: color .15s, background .15s;
}
.subnav__link:hover { color: var(--text); background: var(--panel-hover); }
.subnav__link.is-active { color: var(--accent); font-weight: 600; }
/* ================================================================
APP SHELL
================================================================ */
.topbar {
position: sticky; top: 0; z-index: 50;
background: rgba(15,15,18,.86);
backdrop-filter: blur(8px);
border-bottom: 1px solid var(--border);
}
.topbar__inner {
max-width: var(--w-admin);
margin: 0 auto;
padding: 0 var(--gutter);
height: 62px;
display: flex;
align-items: center;
gap: 28px;
min-width: 0;
}
.brand {
display: flex;
align-items: center;
gap: 11px;
flex: none;
}
.brand__mark {
width: 26px; height: 26px;
border-radius: 5px;
background: var(--accent);
box-shadow: 0 0 0 1px var(--accent-a30), 0 4px 14px var(--accent-a22);
position: relative;
flex: none;
}
.brand__mark::after {
content: "";
position: absolute;
inset: 0; margin: auto;
width: 11px; height: 11px;
border-radius: 2px;
background: var(--bg);
transform: rotate(45deg);
}
.brand__name {
font-family: var(--font-display);
font-size: 19px;
font-weight: 600;
letter-spacing: 0;
color: var(--text);
white-space: nowrap;
}
.mainnav { display: flex; gap: 4px; }
.nav-toggle {
display: none;
width: 42px;
height: 42px;
padding: 0;
border: 1px solid var(--border-strong);
border-radius: 10px;
background: var(--field);
color: var(--text-2);
position: relative;
transition: border-color 180ms ease, color 180ms ease, background 180ms ease;
}
.nav-toggle span {
display: block;
position: absolute;
left: 50%;
top: 50%;
width: 19px;
height: 2px;
margin-left: -9.5px;
margin-top: -1px;
border-radius: 999px;
background: currentColor;
transform-origin: 50% 50%;
transition:
transform 220ms cubic-bezier(.2,.8,.2,1),
opacity 160ms ease;
}
.nav-toggle span:nth-child(1) { transform: translateY(-6px); }
.nav-toggle span:nth-child(2) { transform: scaleX(.82); }
.nav-toggle span:nth-child(3) { transform: translateY(6px); }
.nav-is-open .nav-toggle {
color: var(--text-strong);
border-color: var(--accent-chip-bd);
background: var(--accent-chip);
}
.nav-is-open .nav-toggle span:nth-child(1) { transform: rotate(45deg) scaleX(1.04); }
.nav-is-open .nav-toggle span:nth-child(2) { opacity: 0; transform: scaleX(.2); }
.nav-is-open .nav-toggle span:nth-child(3) { transform: rotate(-45deg) scaleX(1.04); }
.navlink {
font-size: 13.5px;
font-weight: 600;
padding: 7px 12px;
border-radius: var(--r-pill);
color: var(--muted);
transition: color 140ms, background 140ms;
}
.navlink:hover { color: var(--text-strong); }
.navlink.is-active { color: var(--text-strong); background: var(--field-alt); }
.navlink--mobile-auth { display: none; }
.topbar__spacer { flex: 1; }
.topbar__season {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--faintest);
}
.topbar__admin-actions { display: flex; align-items: center; gap: 8px; }
.page {
flex: 1;
display: flex;
flex-direction: column;
margin: 0 auto;
padding: clamp(22px,3.4vw,46px) var(--gutter) 96px;
width: 100%;
min-width: 0;
}
.page--public { max-width: var(--w-public); }
.page--session { max-width: var(--w-session); }
.page--admin { max-width: var(--w-admin); }
@media (min-width: 1280px) {
.page--admin,
.page--session {
padding-left: 28px;
padding-right: 28px;
}
}
.site-footer {
margin-top: auto;
padding-top: clamp(44px, 6vw, 76px);
border-top: 1px solid var(--divider);
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: center;
gap: 8px 18px;
color: var(--faintest);
font-size: 12.5px;
}
.site-footer span {
white-space: nowrap;
}
.site-footer span:nth-child(2) {
color: var(--muted);
justify-self: center;
}
.site-footer span:nth-child(3) {
justify-self: end;
}
@media (max-width: 640px) {
.site-footer {
grid-template-columns: 1fr;
justify-items: center;
gap: 6px;
margin-top: 36px;
padding: 18px 0 max(20px, env(safe-area-inset-bottom));
text-align: center;
}
.site-footer span:nth-child(2),
.site-footer span:nth-child(3) {
justify-self: center;
}
}
/* ================================================================
FLASH MESSAGES
================================================================ */
.flash-stack { display: grid; gap: 10px; margin-bottom: 24px; }
.flash {
padding: 11px 16px;
border-radius: var(--r-sm);
font-size: 14px;
border: 1px solid var(--border);
background: var(--surface);
}
.flash.success {
color: var(--pos);
border-color: var(--pos-tint-bd);
background: var(--pos-tint);
}
.flash.error {
color: var(--neg);
border-color: var(--neg-tint-bd);
background: var(--neg-tint);
}
/* ================================================================
TYPOGRAPHY
================================================================ */
.kicker {
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .14em;
text-transform: uppercase;
color: var(--faintest);
margin: 0 0 6px;
display: block;
}
.kicker--dot {
display: inline-flex;
align-items: center;
gap: 7px;
}
.kicker--dot::before {
content: "";
width: 7px;
height: 7px;
border-radius: 50%;
flex: none;
}
.kicker--dot-accent::before { background: var(--accent); }
.kicker--dot-warn::before { background: var(--warn); }
.eyebrow {
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .14em;
text-transform: uppercase;
color: var(--accent);
margin: 0 0 8px;
}
h1 {
font-family: var(--font-display);
font-size: clamp(30px,4.4vw,46px);
font-weight: 600;
letter-spacing: 0;
color: var(--text);
line-height: 1.05;
}
h2 {
font-family: var(--font-display);
font-size: 18px;
font-weight: 600;
color: var(--text-strong);
}
h3 {
font-size: 15px;
font-weight: 600;
color: var(--text-strong);
}
/* page intro */
.hero { padding: 28px 0 22px; }
.hero__kicker {
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .14em;
text-transform: uppercase;
color: var(--accent);
margin: 0 0 10px;
}
.session-number {
color: var(--accent);
font-size: 12.5px;
margin-bottom: 9px;
}
.hero__title {
font-family: var(--font-display);
font-size: clamp(30px,4.4vw,46px);
font-weight: 600;
letter-spacing: 0;
color: var(--text);
line-height: 1.05;
margin: 0 0 10px;
}
.currency-symbol {
font-family: var(--font-money);
font-variant-numeric: normal;
}
.hero__sub {
color: var(--muted);
font-size: 14.5px;
margin: 0;
max-width: 54ch;
}
/* ================================================================
PANEL / CARD
================================================================ */
.panel {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r-lg);
overflow: hidden;
min-width: 0;
}
.panel__head {
padding: 16px 22px;
border-bottom: 1px solid var(--field-alt);
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
background: var(--surface-head);
}
.panel__title {
font-family: var(--font-display);
font-weight: 600;
font-size: 18px;
margin: 0;
color: var(--text-strong);
}
.panel__tag { font-family: var(--font-mono); font-size: 11px; color: var(--faintest); }
.panel__body { padding: 20px; }
/* panel-header — old utility kept for admin forms */
.panel-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 14px;
padding: 20px 20px 0;
}
.panel-header--center { align-items: center; }
.panel-actions { display: flex; align-items: center; gap: 10px; }
/* ================================================================
STAT / METRIC TILE
================================================================ */
.stat {
padding: 15px 16px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r-md);
}
.stat__val {
font-family: var(--font-display);
font-size: 26px;
font-weight: 600;
line-height: 1;
margin: 4px 0 0;
}
.stat__sub {
font-family: var(--font-mono);
font-size: 11.5px;
color: var(--muted);
margin-top: 8px;
}
.stat--hero .stat__val { font-size: 34px; }
.player-rank {
margin: 0 0 7px;
color: var(--accent);
font-family: var(--font-mono);
font-size: 12.5px;
letter-spacing: .12em;
text-transform: uppercase;
}
.player-stat-grid {
display: grid;
grid-template-columns: repeat(8, minmax(0, 1fr));
gap: var(--s3);
}
.player-stat-grid .stat {
min-width: 0;
}
.player-stat-grid .stat__val {
font-size: clamp(19px, 1.7vw, 24px);
word-break: keep-all;
}
.stat-pair {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 4px 10px;
margin-top: 4px;
}
.stat-pair__val {
font-family: var(--font-display);
font-size: clamp(17px, 1.55vw, 22px);
font-weight: 600;
line-height: 1;
white-space: nowrap;
}
.stat--rail { position: relative; padding-left: 20px; }
.stat--rail::before {
content: "";
position: absolute;
left: 0; top: 0; bottom: 0;
width: 3px;
background: var(--rail, var(--accent));
}
/* hero stat row (small inline tiles) */
.stat-row-inline {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
/* ================================================================
TOOLBAR
================================================================ */
.toolbar {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 14px;
margin: 24px 0 12px;
}
.toolbar__left { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.toolbar__right { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.toolbar__hint {
font-size: 12.5px;
color: var(--muted);
max-width: 42ch;
line-height: 1.4;
margin: 0;
}
.sortnote { font-family: var(--font-mono); font-size: 11.5px; color: var(--faintest); }
.sortnote b { color: var(--text-2); font-weight: 500; }
/* ================================================================
SEGMENTED CONTROL
================================================================ */
.segmented {
display: inline-flex;
padding: 3px;
gap: 2px;
background: var(--surface-raised);
border: 1px solid var(--border);
border-radius: var(--r-sm);
}
.seg {
display: flex;
align-items: center;
gap: 7px;
padding: 7px 13px;
border: 0;
border-radius: var(--r-pill);
background: transparent;
color: var(--muted);
font: 600 13px var(--font-ui);
cursor: pointer;
white-space: nowrap;
transition: background 120ms, color 120ms;
}
.seg:hover { color: var(--text-2); }
.seg.is-on {
background: var(--accent-chip);
color: var(--text-strong);
box-shadow: inset 0 0 0 1px var(--accent-chip-bd);
}
.seg__count { font-family: var(--font-mono); font-size: 11px; font-weight: 500; color: var(--faintest); }
.seg.is-on .seg__count { color: var(--accent); }
/* ================================================================
INPUTS / SELECTS
================================================================ */
.fieldlabel {
display: block;
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: .10em;
text-transform: uppercase;
color: var(--faintest);
margin-bottom: 7px;
}
.field-input, .field-select {
width: 100%;
padding: 10px 12px;
background: var(--field);
border: 1px solid var(--border-strong);
border-radius: var(--r-sm);
color: var(--text-strong);
font: 14px var(--font-ui);
outline: none;
appearance: none;
}
.field-input:focus, .field-select:focus {
border-color: var(--accent-chip-bd);
box-shadow: 0 0 0 3px var(--accent-a22);
}
.field-input::placeholder { color: var(--faintest-2); }
/* form-card (admin forms) */
.form-card { display: grid; gap: 16px; align-content: start; padding: 22px; }
.form-card label { display: grid; gap: 6px; }
.form-card label > span {
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: .10em;
text-transform: uppercase;
color: var(--faintest);
}
.form-card input, .form-card select, .form-card textarea {
width: 100%;
padding: 10px 12px;
background: var(--field);
border: 1px solid var(--border-strong);
border-radius: var(--r-sm);
color: var(--text-strong);
font: 14px var(--font-ui);
outline: none;
appearance: none;
}
.form-card input:focus, .form-card select:focus, .form-card textarea:focus {
border-color: var(--accent-chip-bd);
box-shadow: 0 0 0 3px var(--accent-a22);
}
.form-card textarea { resize: vertical; min-height: 92px; }
.form-card input::placeholder, .form-card textarea::placeholder { color: var(--faintest-2); }
.session-locked-banner {
display: flex;
flex-direction: column;
gap: 2px;
padding: 10px 14px;
background: var(--field);
border: 1px solid var(--border);
border-left: 3px solid var(--warn);
border-radius: var(--r-sm);
font-size: .8125rem;
}
.session-locked-banner strong { color: var(--warn); }
.session-locked-banner span { color: var(--text-muted); }
fieldset[disabled] input,
fieldset[disabled] select,
fieldset[disabled] textarea,
fieldset[disabled] button {
opacity: .45;
cursor: not-allowed;
pointer-events: none;
}
.session-filter-form { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.session-filter-select {
min-width: 200px;
padding: 8px 12px;
background: var(--field);
border: 1px solid var(--border-strong);
border-radius: var(--r-sm);
color: var(--text-strong);
font: 13.5px var(--font-ui);
outline: none;
appearance: none;
}
.session-filter-select:focus {
border-color: var(--accent-chip-bd);
box-shadow: 0 0 0 3px var(--accent-a22);
}
/* ================================================================
TABLE
================================================================ */
.tbl-scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.tbl {
width: 100%;
border-collapse: collapse;
font-size: 14px;
min-width: 700px;
}
.tbl thead tr { background: var(--surface-head); }
.tbl th {
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .10em;
text-transform: uppercase;
color: var(--muted);
font-weight: 500;
padding: 13px 14px;
text-align: right;
white-space: nowrap;
border-bottom: 1px solid var(--border);
}
.tbl th.col-player, .tbl th.col-left { text-align: left; }
.tbl td {
padding: 12px 14px;
text-align: right;
border-top: 1px solid var(--divider);
font-family: var(--font-mono);
font-variant-numeric: tabular-nums;
color: var(--num);
white-space: nowrap;
}
.tbl td.col-player, .tbl td.col-left {
text-align: left;
font-family: var(--font-ui);
color: var(--text-body);
}
.tbl tbody tr { cursor: pointer; transition: background 80ms; }
.tbl tbody tr:hover { background: #1e1e25; }
.tbl .num-net { font-weight: 600; font-size: 15px; }
.tbl .num-pos { color: var(--pos); }
.tbl .num-neg { color: var(--neg); }
.tbl .num-neutral { color: var(--muted-2); }
.tbl .num-muted { color: var(--muted-2); }
.tbl .rank-num { font-family: var(--font-display); font-size: 15px; font-weight: 600; color: var(--num); }
.tbl .rank-1 { color: var(--rank-1); }
.tbl .rank-2 { color: var(--rank-2); }
.tbl .rank-3 { color: var(--rank-3); }
/* accounting columns (hidden until .is-full) */
.tbl .col-acct { display: none; }
.tbl.is-full .col-acct { display: table-cell; }
.tbl--session {
min-width: 860px;
font-size: 13.5px;
}
.tbl--session.is-full {
min-width: 1180px;
}
.tbl--session th,
.tbl--session td {
padding-inline: 12px;
}
.tbl--session th:nth-child(7),
.tbl--session td:nth-child(7) {
width: 1%;
}
.tbl--session .badge {
padding-inline: 7px;
font-size: 10px;
}
/* sticky rank+player on horizontal scroll */
.tbl .col-rank { position: sticky; left: 0; background: var(--surface); z-index: 1; }
.tbl .col-player { position: sticky; left: 52px; background: var(--surface); z-index: 1; }
.tbl thead .col-rank { background: var(--surface-head); z-index: 2; }
.tbl thead .col-player { background: var(--surface-head); z-index: 2; }
.tbl--session .col-player { left: 0; min-width: 148px; }
/* sort button inside th */
.sort-btn {
display: inline-flex;
align-items: center;
gap: 4px;
background: transparent;
border: 0;
color: inherit;
font: inherit;
cursor: pointer;
padding: 0;
}
.sort-btn.is-active { color: var(--text-2); }
.sort-arrow { color: var(--accent); font-size: 10px; }
/* rank delta cell */
.tbl .col-rank-delta { text-align: center; }
.rank-delta {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 34px;
height: 22px;
padding: 0 8px;
border-radius: var(--r-pill);
font-family: var(--font-mono);
font-size: 11px;
font-weight: 700;
}
.rank-delta--up { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.rank-delta--down { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.rank-delta--flat { color: var(--faintest-2); background: var(--surface-sunk); box-shadow: inset 0 0 0 1px var(--border); }
/* old positive/negative/neutral utility (kept for compatibility) */
.positive { color: var(--pos) !important; font-weight: 600; }
.negative { color: var(--neg) !important; font-weight: 600; }
.neutral { color: var(--muted-2) !important; font-weight: 600; }
/* old table-wrap (admin uses plain table still) */
.table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { width: 100%; border-collapse: collapse; }
th, td { padding: 11px 14px; text-align: left; white-space: nowrap; vertical-align: middle; }
th {
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .10em;
text-transform: uppercase;
color: var(--muted);
font-weight: 500;
background: var(--surface-head);
border-bottom: 1px solid var(--border);
}
tbody tr { transition: background 80ms; }
tbody tr:hover { background: #1e1e25; }
tbody tr:not(:last-child) td { border-bottom: 1px solid var(--divider); }
td { font-size: 13.5px; color: var(--text-body); }
td a { font-weight: 600; color: var(--text-strong); }
td a:hover { color: var(--accent); }
/* ================================================================
BADGES / STATUS PILLS
================================================================ */
.badge {
display: inline-block;
padding: 3px 9px;
border-radius: 5px;
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .05em;
text-transform: uppercase;
font-weight: 500;
white-space: nowrap;
}
.badge--paid { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.badge--settled { color: var(--rolled); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.badge--partial { color: var(--warn); background: var(--warn-tint); box-shadow: inset 0 0 0 1px var(--warn-tint-bd); }
.badge--unpaid { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.badge--owes { color: var(--owes); background: var(--owes-tint); box-shadow: inset 0 0 0 1px var(--owes-tint-bd); }
.badge--none { color: var(--faintest-2); }
.badge--open { color: var(--warn); background: var(--warn-tint); box-shadow: inset 0 0 0 1px var(--warn-tint-bd); }
.badge--closed { color: var(--muted-2); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.badge--written_off { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.badge--collected { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
/* old status-badge pattern (kept for templates) */
.status-badge {
display: inline-flex;
align-items: center;
padding: 3px 9px;
border-radius: 5px;
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .05em;
text-transform: uppercase;
font-weight: 500;
white-space: nowrap;
}
.status-open { color: var(--warn); background: var(--warn-tint); box-shadow: inset 0 0 0 1px var(--warn-tint-bd); }
.status-closed { color: var(--muted-2); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.status-paid { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.status-settled { color: var(--rolled); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.status-partial { color: var(--warn); background: var(--warn-tint); box-shadow: inset 0 0 0 1px var(--warn-tint-bd); }
.status-unpaid { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.status-owes { color: var(--owes); background: var(--owes-tint); box-shadow: inset 0 0 0 1px var(--owes-tint-bd); }
.status-none { color: var(--faintest-2); }
.status-written_off { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.status-collected { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
/* event-type pills */
.pill {
display: inline-flex;
align-items: center;
padding: 3px 9px;
border-radius: 5px;
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .05em;
text-transform: uppercase;
font-weight: 500;
}
.pill-buyin { color: var(--accent); background: var(--accent-tint); box-shadow: inset 0 0 0 1px var(--accent-chip-bd); }
.pill-front { color: var(--warn); background: var(--warn-tint); box-shadow: inset 0 0 0 1px var(--warn-tint-bd); }
.pill-cashout { color: var(--rank-2); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.pill-paid { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.pill-rollover_in { color: var(--rolled); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.pill-payout_carry_in { color: var(--rolled); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.pill-rollover_out { color: var(--rolled); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.pill-paid_out { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.pill-debt_repayment { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.pill-writeoff { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.pill-front_collected { color: var(--pos); background: var(--pos-tint); box-shadow: inset 0 0 0 1px var(--pos-tint-bd); }
.pill-front_writeoff { color: var(--neg); background: var(--neg-tint); box-shadow: inset 0 0 0 1px var(--neg-tint-bd); }
.pill-note { color: var(--muted-2); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
.pill-session_open { color: var(--warn); background: var(--warn-tint); box-shadow: inset 0 0 0 1px var(--warn-tint-bd); }
.pill-session_close { color: var(--muted-2); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
/* ================================================================
CHARTS
================================================================ */
.chart-wrap { padding: 0 20px 20px; position: relative; }
.chart-frame {
position: relative;
height: clamp(220px, 30vw, 300px);
}
.chart-frame--tall { height: clamp(260px, 36vw, 340px); }
.chart-frame canvas { width: 100% !important; height: 100% !important; }
.session-net-bars {
display: grid;
gap: 11px;
min-height: clamp(220px, 30vw, 300px);
align-content: center;
padding-top: 4px;
}
.session-net-bars__row {
display: grid;
grid-template-columns: minmax(92px, 150px) minmax(160px, 1fr) minmax(86px, max-content);
gap: 12px;
align-items: center;
}
.session-net-bars__name {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-2);
font-size: 13px;
font-weight: 600;
}
.session-net-bars__track {
position: relative;
height: 18px;
border-radius: 5px;
background: var(--surface-sunk);
overflow: hidden;
}
.session-net-bars__track::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 50%;
width: 1px;
background: var(--border-hi);
z-index: 1;
}
.session-net-bars__bar {
position: absolute;
top: 4px;
height: 10px;
min-width: 2px;
border-radius: 5px;
}
.session-net-bars__bar--pos { left: 50%; }
.session-net-bars__bar--neg { right: 50%; }
.session-net-bars__amount {
font-family: var(--font-mono);
font-size: 12.5px;
color: var(--num);
text-align: right;
white-space: nowrap;
}
.result-mix {
min-height: clamp(220px, 30vw, 300px);
display: grid;
align-content: center;
gap: 18px;
}
.result-mix__bar {
display: flex;
height: 24px;
overflow: hidden;
border-radius: 6px;
background: var(--surface-sunk);
box-shadow: inset 0 0 0 1px var(--border);
}
.result-mix__seg {
min-width: 0;
flex-basis: 0;
}
.result-mix__seg--win { background: var(--pos); }
.result-mix__seg--even { background: var(--muted-2); }
.result-mix__seg--loss { background: var(--neg); }
.result-mix__legend {
display: grid;
gap: 10px;
color: var(--muted);
font-family: var(--font-mono);
font-size: 11.5px;
}
.result-mix__legend-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 16px;
align-items: center;
}
.result-mix__legend-row span {
display: inline-flex;
align-items: center;
gap: 6px;
}
.result-mix__legend-row strong {
display: grid;
grid-template-columns: minmax(2ch, auto) 6ch;
gap: 8px;
color: var(--text-2);
font-weight: 600;
text-align: right;
white-space: nowrap;
font-variant-numeric: tabular-nums;
}
.result-mix__legend-row strong b,
.result-mix__legend-row strong em {
font: inherit;
text-align: right;
}
.result-mix__key {
width: 8px;
height: 8px;
border-radius: 50%;
flex: none;
}
.result-mix__key--win { background: var(--pos); }
.result-mix__key--even { background: var(--muted-2); }
.result-mix__key--loss { background: var(--neg); }
.result-mix__note {
color: var(--faintest);
font-family: var(--font-mono);
font-size: 11px;
}
/* ================================================================
RECON CARDS (session cash flow / open items)
================================================================ */
.recon-grid { display: grid; gap: var(--s3); grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.recon-card-head { padding: 14px 20px 0; }
.recon-metric-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
background: var(--border);
border-top: 1px solid var(--border);
margin-top: 12px;
}
.recon-cell { background: var(--surface); padding: 14px 20px; }
.recon-val {
font-family: var(--font-display);
font-size: 22px;
font-weight: 600;
color: var(--text-strong);
line-height: 1;
margin: 4px 0 0;
}
.recon-val--pos { color: var(--pos); }
.recon-val--neg { color: var(--neg); }
.recon-val--warn { color: var(--warn); }
.recon-val--num { color: var(--num); }
/* ================================================================
QUICK SNAPSHOT (2×2 grid inside a panel)
================================================================ */
.snapshot-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
background: var(--border);
border-top: 1px solid var(--border);
}
.snapshot-cell { background: var(--surface); padding: 16px 20px; }
.snapshot-val {
font-family: var(--font-display);
font-size: 22px;
font-weight: 600;
color: var(--text-strong);
line-height: 1;
margin: 4px 0 0;
}
/* ================================================================
AUDIT / RAW-EVENTS FEED
================================================================ */
.feed { max-height: 360px; overflow-y: auto; }
.feed__row {
display: flex;
align-items: center;
gap: 11px;
padding: 9px 20px;
border-top: 1px solid var(--divider);
}
.feed__row:first-child { border-top: none; }
.feed__name { flex: 1; font-size: 13px; color: var(--text-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.feed__amt { font-family: var(--font-mono); font-size: 12.5px; color: var(--num); white-space: nowrap; }
.feed__time { font-family: var(--font-mono); font-size: 10.5px; color: var(--faintest-2); white-space: nowrap; }
.feed__tag { font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .06em; font-weight: 500; text-transform: uppercase; white-space: nowrap; }
/* old event-card (used in session detail and admin) */
.event-feed { display: grid; gap: 0; }
.event-card {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 20px;
border-top: 1px solid var(--divider);
}
.event-card:first-child { border-top: none; }
.event-card-top {
display: flex;
align-items: center;
gap: 10px;
flex: 1;
min-width: 0;
}
.event-card-top strong {
font-size: 13px;
color: var(--text-strong);
white-space: nowrap;
}
.event-card--inline {
display: grid;
grid-template-columns: minmax(82px, 120px) max-content minmax(0, 1fr) minmax(88px, auto) minmax(74px, auto);
gap: 12px;
align-items: center;
padding: 9px 16px;
}
.event-card--inline .event-card-top {
display: contents;
}
.event-card--inline .event-card-top strong {
grid-column: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
}
.event-card--inline .pill {
grid-column: 2;
justify-self: start;
padding: 2px 7px;
font-size: 9.5px;
}
.event-card--inline .event-note {
grid-column: 3;
}
.event-card--inline .event-amount {
grid-column: 4;
}
.event-card--inline .tiny-text {
grid-column: 5;
}
.event-note {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--muted);
font-size: 12.5px;
}
.event-amount { font-family: var(--font-mono); font-size: 13px; font-weight: 600; color: var(--num); margin: 0; white-space: nowrap; text-align: right; }
.muted-text { color: var(--muted); font-size: 13.5px; margin: 0; }
.muted-text.small, .tiny-text { font-size: 12px; }
.tiny-text { color: var(--faintest); margin: 0; text-align: right; white-space: nowrap; }
.note-list { margin: 0; padding-left: 16px; color: var(--muted); font-size: 13px; }
.note-list li + li { margin-top: 4px; }
/* ================================================================
BUTTONS
================================================================ */
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 20px;
border: 0;
border-radius: var(--r-sm);
font: 700 14px var(--font-ui);
cursor: pointer;
white-space: nowrap;
transition: opacity 120ms, box-shadow 120ms;
}
.btn--primary { background: var(--accent); color: var(--accent-ink); box-shadow: 0 4px 16px var(--accent-a30); }
.btn--primary:hover { opacity: .88; }
.btn--ghost { background: var(--field); color: var(--text-2); border: 1px solid var(--border-strong); font-weight: 600; }
.btn--ghost:hover { border-color: var(--border-hi); color: var(--text-strong); }
.btn--outline { background: var(--accent-tint); color: var(--accent); border: 1px solid var(--accent-chip-bd); }
.btn--outline:hover { background: var(--accent-chip); }
.btn--sm { padding: 7px 13px; font-size: 13px; }
/* legacy button classes mapped to new */
.primary-button {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 20px;
border: 0;
border-radius: var(--r-sm);
font: 700 14px var(--font-ui);
cursor: pointer;
background: var(--accent);
color: var(--accent-ink);
box-shadow: 0 4px 16px var(--accent-a30);
text-decoration: none;
transition: opacity 120ms;
}
.primary-button:hover { opacity: .88; }
.secondary-button, .ghost-button {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
border-radius: var(--r-sm);
font: 600 13.5px var(--font-ui);
cursor: pointer;
background: var(--field);
color: var(--text-2);
border: 1px solid var(--border-strong);
text-decoration: none;
transition: border-color 120ms, color 120ms;
}
.secondary-button:hover, .ghost-button:hover {
border-color: var(--border-hi);
color: var(--text-strong);
}
.secondary-button:disabled, .ghost-button:disabled {
cursor: not-allowed;
opacity: .45;
}
.table-action-button {
display: inline-flex;
align-items: center;
padding: 5px 11px;
border-radius: var(--r-pill);
font: 600 12px var(--font-ui);
cursor: pointer;
background: var(--field);
color: var(--text-2);
border: 1px solid var(--border-strong);
transition: border-color 120ms, color 120ms;
}
.table-action-button:hover { border-color: var(--accent-chip-bd); color: var(--accent); }
/* ================================================================
LAYOUT UTILITIES
================================================================ */
.cards { display: grid; gap: var(--s3); grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.cards-2 { display: grid; gap: var(--s4); grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.leaderboard-hero-stats {
display: flex;
gap: 12px;
flex-wrap: wrap;
align-self: center;
justify-content: flex-end;
}
.leaderboard-hero-stats .stat {
min-width: 132px;
}
.leaderboard-hero-stats .stat:last-child {
min-width: 168px;
}
.split { display: flex; flex-wrap: wrap; gap: var(--s4); align-items: flex-start; }
.split > .col-main { flex: 2; min-width: 360px; }
.split > .col-side { flex: 1; min-width: 300px; }
.debt-row { display: flex; flex-direction: column; gap: 8px; padding: 14px 0; border-bottom: 1px solid var(--border); }
.debt-row:last-child { border-bottom: none; }
.debt-row__info { display: flex; flex-direction: column; gap: 2px; }
.debt-row__info strong { font-size: .9375rem; color: var(--text-strong); }
.debt-row__info span { font-size: .8125rem; color: var(--text-muted); }
.debt-row__form { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.debt-row__form input[type=number] { width: 100px; }
.debt-row__form select { flex: 1; min-width: 120px; }
.stack { display: grid; gap: 20px; }
.inline-action-form { margin: 0; }
.button-row { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
/* Breadcrumb */
.breadcrumb {
display: flex;
align-items: center;
gap: 6px;
font-family: var(--font-mono);
font-size: 11.5px;
color: var(--faintest);
margin-bottom: 20px;
flex-wrap: wrap;
}
.breadcrumb a { color: var(--text-2); }
.breadcrumb a:hover { color: var(--accent); }
.breadcrumb__sep { color: var(--slash); }
/* Admin workspace */
.admin-workspace {
display: grid;
grid-template-columns: minmax(280px, 1fr) minmax(280px, 1fr) minmax(260px, .9fr);
gap: var(--s4);
align-items: stretch;
}
.admin-workspace > .panel {
display: flex;
flex-direction: column;
min-width: 0;
}
.admin-bottom-grid {
--admin-bottom-body-h: 340px;
display: grid;
grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr);
gap: var(--s4);
align-items: stretch;
margin-top: var(--s4);
}
.admin-bottom-grid > .panel {
display: flex;
flex-direction: column;
min-width: 0;
}
.admin-bottom-grid .table-wrap,
.admin-bottom-grid .event-feed {
height: var(--admin-bottom-body-h);
min-height: 0;
overflow-y: auto;
}
.admin-bottom-grid .table-wrap {
overflow-x: auto;
}
.admin-bottom-grid .event-feed {
align-content: start;
}
/* Cash position strip */
.cash-strip {
display: grid;
gap: var(--s3);
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
margin-bottom: 28px;
}
/* Live indicator dot */
.live-badge {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .08em;
text-transform: uppercase;
color: var(--pos);
font-weight: 500;
}
.live-badge::before {
content: "";
width: 7px; height: 7px;
border-radius: 50%;
background: var(--pos);
animation: livepulse 2.2s ease-in-out infinite;
}
@keyframes livepulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: .5; transform: scale(.78); }
}
/* Provisional (sub-threshold players) */
.provisional-grid {
display: grid;
gap: var(--s3);
grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
}
.provisional-card {
padding: 14px 16px;
background: var(--surface-sunk);
border: 1px dashed var(--border-hi);
border-radius: var(--r-md);
transition: border-color 120ms;
}
.provisional-card:hover { border-color: var(--accent-chip-bd); }
.provisional-card__name {
font-weight: 600;
font-size: 14px;
color: var(--text-2);
margin: 0 0 6px;
}
.provisional-card__meta {
display: flex;
gap: 12px;
font-family: var(--font-mono);
font-size: 11px;
color: var(--faintest);
}
/* Perf / Cash section separator dot */
.section-marker {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--faintest);
margin-bottom: 16px;
}
.section-marker__dot {
width: 8px; height: 8px;
border-radius: 50%;
flex: none;
}
.section-marker__dot--accent { background: var(--accent); }
.section-marker__dot--rolled { background: var(--rolled); }
/* Debt / admin tools */
.debt-panel {
display: grid;
gap: 0;
margin-top: var(--s4);
}
.debt-summary { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.debt-layout {
display: grid;
grid-template-columns: minmax(240px, .85fr) minmax(0, 2fr);
gap: 16px;
padding: 16px 20px 18px;
}
.debt-list {
display: grid;
align-content: start;
gap: 8px;
max-height: 245px;
overflow-y: auto;
}
.debt-list-item {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 12px;
align-items: center;
padding: 10px 12px;
background: var(--surface-sunk);
border: 1px solid var(--border);
border-radius: var(--r-sm);
}
.debt-list-item strong {
display: block;
color: var(--text-strong);
font-size: 13.5px;
margin-bottom: 2px;
}
.debt-list-item span {
display: block;
color: var(--faintest);
font-family: var(--font-mono);
font-size: 10.5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.debt-list-item b {
color: var(--owes);
font-family: var(--font-mono);
font-size: 13px;
white-space: nowrap;
}
.debt-empty {
display: grid;
place-items: center;
gap: 8px;
padding: 30px 20px 34px;
color: var(--muted);
text-align: center;
}
.debt-empty__mark {
display: grid;
place-items: center;
min-width: 64px;
height: 40px;
padding: 0 14px;
border-radius: var(--r-pill);
background: var(--surface-sunk);
border: 1px solid var(--border);
color: var(--pos);
font-family: var(--font-mono);
font-weight: 700;
}
.debt-empty p {
margin: 0;
font-size: 13.5px;
}
.debt-action-grid {
display: grid;
gap: 16px;
grid-template-columns: repeat(2, minmax(260px, 1fr));
}
.debt-form {
gap: 10px;
padding: 0;
background: transparent;
}
.debt-form h3 {
margin-bottom: 2px;
}
.debt-form textarea {
min-height: 58px;
}
.import-form input[type="file"] { width: 100%; margin: 4px 0 8px; color: var(--muted); }
.import-form input[type="file"]::file-selector-button {
appearance: none;
border: 1px solid var(--border-strong);
background: var(--field);
color: var(--text-2);
border-radius: var(--r-pill);
padding: 5px 11px;
font: 600 13px var(--font-ui);
margin-right: 8px;
cursor: pointer;
}
.import-form input[type="file"]::file-selector-button:hover {
border-color: var(--accent-chip-bd);
color: var(--accent);
}
/* Admin: append ledger event */
.append {
min-width: 0;
}
.append__body {
padding: 18px 20px;
}
.append__grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 12px;
margin-bottom: 14px;
}
.field { display: block; }
.field__label {
display: block;
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: .10em;
text-transform: uppercase;
color: var(--faintest);
margin-bottom: 7px;
}
.field__opt { text-transform: none; letter-spacing: 0; }
.control {
width: 100%;
padding: 10px 12px;
background: var(--field);
border: 1px solid var(--border-strong);
border-radius: 8px;
color: var(--text-strong);
font: 14px var(--font-ui);
outline: none;
}
select.control { cursor: pointer; }
.control--money {
display: flex;
align-items: center;
gap: 0;
padding: 0 12px;
}
.control__prefix { color: var(--faint); font-family: var(--font-mono); }
.control--money input {
width: 100%;
padding: 10px 6px;
background: transparent;
border: 0;
outline: none;
color: var(--text-strong);
font-family: var(--font-mono);
font-size: 14px;
}
.control:focus,
.control--money:focus-within {
border-color: var(--accent-chip-bd);
box-shadow: 0 0 0 3px var(--accent-a22);
}
.append__note {
margin-bottom: 14px;
}
.append__textarea {
min-height: 96px;
resize: vertical;
}
.append__footer { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.append__preview { display: inline-flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--faint); }
.evtag-pill {
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .05em;
font-weight: 500;
padding: 3px 8px;
border-radius: 5px;
background: rgba(255,255,255,.03);
box-shadow: inset 0 0 0 1px var(--border-strong);
}
/* Admin: session controls */
.panel--pad { padding: 18px 20px; }
.panel__title--mb { margin: 0 0 16px; }
.session-control-panel {
min-width: 0;
}
.session-summary-strip {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
overflow: hidden;
margin-bottom: 14px;
border: 1px solid var(--border);
border-radius: var(--r-sm);
background: var(--border);
}
.session-summary-strip > div {
min-width: 0;
padding: 9px 10px;
background: var(--surface-sunk);
}
.session-summary-strip strong {
display: block;
margin-top: 3px;
color: var(--text-strong);
font-family: var(--font-mono);
font-size: 12.5px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.import-export-panel {
min-width: 0;
}
.livecard {
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: 140px;
padding: 15px 16px;
background: var(--surface-sunk);
border: 1px solid var(--border-strong);
border-radius: 11px;
margin-bottom: 14px;
}
.livecard__head { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.dot { width: 7px; height: 7px; border-radius: 50%; }
.dot--live { background: var(--pos); animation: livepulse 1.6s ease-in-out infinite; }
.dot--idle { background: var(--muted-2); }
.livecard__name { font-weight: 600; color: var(--text-strong); font-size: 14px; }
.livecard__no { font-family: var(--font-mono); font-size: 10.5px; color: var(--faintest); }
.livecard__metrics { display: flex; gap: 18px; margin-bottom: 14px; }
.micro {
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: .10em;
text-transform: uppercase;
color: var(--faintest);
margin-bottom: 4px;
}
.mono16 { font-family: var(--font-mono); font-size: 16px; color: var(--text-strong); }
.mono16--warn { color: var(--warn); }
.btn-close {
display: block;
width: 100%;
text-align: center;
padding: 9px;
border-radius: 8px;
background: var(--accent-tint);
border: 1px solid var(--accent-chip-bd);
color: var(--accent);
font: 600 13px var(--font-ui);
cursor: pointer;
}
.btn-close:hover { background: var(--accent-chip); }
.btn-newsession {
display: flex;
width: 100%;
align-items: center;
justify-content: center;
gap: 8px;
padding: 12px;
border-radius: 9px;
background: transparent;
border: 1px dashed var(--border-hi);
color: var(--text-2);
font: 600 14px var(--font-ui);
cursor: pointer;
}
.btn-newsession:hover { border-color: var(--accent); color: var(--accent); }
.btn-newsession--primary {
background: var(--accent);
border-style: solid;
border-color: var(--accent);
color: var(--accent-ink);
box-shadow: 0 4px 16px var(--accent-a30);
}
.btn-newsession--primary:hover { color: var(--accent-ink); opacity: .88; }
.prune-session-form {
display: flex;
justify-content: center;
padding-top: 12px;
}
.prune-session-form .secondary-button {
justify-content: center;
}
.carry-recs {
display: grid;
gap: 8px;
margin-top: 14px;
padding-top: 14px;
border-top: 1px solid var(--divider);
}
.carry-rec {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
gap: 10px;
align-items: center;
padding: 8px 10px;
background: var(--surface-sunk);
border: 1px solid var(--border);
border-radius: var(--r-sm);
}
.carry-rec span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-strong);
font-size: 13px;
font-weight: 600;
}
.carry-rec strong {
color: var(--rolled);
font-family: var(--font-mono);
font-size: 12.5px;
white-space: nowrap;
}
.carry-rec form {
margin: 0;
}
.carry-rec em {
color: var(--faintest);
font-size: 11.5px;
font-style: normal;
white-space: nowrap;
}
/* Admin: CSV tools */
.csv__desc { margin: 0 0 12px; font-size: 12.5px; color: var(--faint); }
.import-form {
display: flex;
flex: 1;
flex-direction: column;
}
.csv__btns { display: flex; gap: 10px; margin-bottom: 12px; }
.csv-btn-ghost {
flex: 1;
text-align: center;
padding: 9px 10px;
border-radius: 8px;
background: var(--field);
border: 1px solid var(--border-strong);
color: var(--text-2);
font: 600 13px var(--font-ui);
text-decoration: none;
cursor: pointer;
}
.csv-btn-ghost:hover { border-color: var(--border-hi); }
.csv__drop {
display: grid;
flex: 1;
min-height: 112px;
place-items: center;
padding: 18px 14px;
border: 1px dashed var(--border-strong);
border-radius: 9px;
text-align: center;
font-family: var(--font-mono);
font-size: 11.5px;
color: var(--faintest);
cursor: pointer;
}
.csv__drop.is-drag { border-color: var(--accent); color: var(--accent); }
/* Form shell (admin login) */
.form-shell { display: grid; justify-content: center; padding-top: 40px; }
.form-shell.narrow { grid-template-columns: minmax(320px, 480px); }
/* Account / league shell */
.league-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 14px;
}
.league-action-grid,
.league-manage-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
}
.league-manage-grid {
align-items: start;
}
.league-card {
display: grid;
gap: 8px;
padding: 18px;
color: inherit;
transition: border-color 140ms, transform 140ms;
}
.league-card:hover {
border-color: var(--border-hi);
transform: translateY(-1px);
}
.league-card--disabled {
opacity: .72;
}
.league-card--disabled:hover {
border-color: var(--border-strong);
transform: none;
}
.league-card strong {
color: var(--text-strong);
font-size: 18px;
}
.league-card span:last-child {
color: var(--muted);
line-height: 1.45;
}
.league-hub-summary {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin-bottom: 16px;
}
.league-board {
display: grid;
gap: 14px;
}
.league-row {
display: grid;
grid-template-columns: minmax(260px, 1.2fr) minmax(420px, 1.6fr) minmax(240px, .9fr);
grid-template-areas:
"identity metrics leaders"
"actions actions leaders";
align-items: stretch;
overflow: hidden;
border-top: 2px solid var(--accent);
}
.league-row__identity {
grid-area: identity;
display: grid;
align-content: start;
gap: 10px;
padding: 20px;
border-right: 1px solid var(--divider);
}
.league-row__chips {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.league-row__title {
display: flex;
justify-content: space-between;
gap: 16px;
align-items: flex-start;
color: inherit;
text-decoration: none;
}
.league-row__title h2 {
margin: 4px 0 0;
color: var(--text-strong);
font-size: 24px;
transition: color 140ms;
}
.league-row__title:hover h2 {
color: var(--accent);
}
.league-row__desc {
margin: 0;
color: var(--muted);
line-height: 1.45;
}
.league-row__meta {
display: flex;
flex-wrap: wrap;
gap: 8px 12px;
color: var(--faintest);
font-size: 12.5px;
}
.league-row__metrics {
grid-area: metrics;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 1px;
background: var(--divider);
border-right: 1px solid var(--divider);
}
.league-row__metrics div {
min-width: 0;
display: grid;
align-content: center;
gap: 6px;
padding: 18px 14px;
background: var(--surface);
}
.league-row__metrics span {
color: var(--muted);
font-size: 11px;
font-weight: 700;
letter-spacing: .08em;
text-transform: uppercase;
}
.league-row__metrics strong {
color: var(--text-strong);
font-family: var(--font-mono);
font-size: 16px;
font-variant-numeric: tabular-nums;
overflow-wrap: anywhere;
}
.league-row__leaders {
grid-area: leaders;
display: grid;
align-content: start;
gap: 12px;
padding: 18px;
background: var(--surface-subtle);
}
.league-row__section-head {
display: flex;
justify-content: space-between;
gap: 10px;
align-items: center;
}
.league-row__section-head a {
color: var(--accent);
font-size: 12.5px;
font-weight: 700;
text-decoration: none;
}
.league-row__actions {
grid-area: actions;
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: flex-start;
gap: 8px;
padding: 14px 20px;
border-top: 1px solid var(--divider);
border-right: 1px solid var(--divider);
background: rgba(255,255,255,.018);
}
.league-top-list {
display: grid;
gap: 1px;
margin: 0;
padding: 0;
list-style: none;
background: var(--divider);
border: 1px solid var(--divider);
border-radius: var(--r-sm);
overflow: hidden;
}
.league-top-list li {
display: flex;
justify-content: space-between;
gap: 12px;
padding: 10px 12px;
background: var(--surface);
}
.league-top-list span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-strong);
}
.league-top-list strong {
flex: none;
font-family: var(--font-mono);
font-size: 12.5px;
font-variant-numeric: tabular-nums;
}
.league-row__empty {
display: grid;
gap: 6px;
padding: 16px;
border: 1px dashed var(--border-strong);
border-radius: var(--r-sm);
color: var(--muted);
}
.league-row__empty a {
color: var(--accent);
font-size: 13px;
font-weight: 700;
text-decoration: none;
}
.empty-panel {
display: grid;
gap: 12px;
justify-items: start;
padding: 22px;
}
.player-list {
display: grid;
}
.player-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
padding: 14px 18px;
border-top: 1px solid var(--border);
}
.player-row:first-child {
border-top-color: var(--border-strong);
}
.player-row strong {
display: block;
color: var(--text-strong);
}
.player-row span {
color: var(--muted);
font-size: 13px;
}
.player-row__actions {
display: flex;
align-items: center;
gap: 10px;
}
.player-row__actions form {
margin: 0;
}
/* Player card grid */
.player-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
gap: 12px;
padding: 16px;
}
.player-card {
border: 1px solid var(--border);
border-radius: 8px;
padding: 16px;
display: flex;
flex-direction: column;
gap: 12px;
text-decoration: none;
transition: border-color 0.15s;
}
.player-card:hover { border-color: var(--accent); }
.player-card--archived { opacity: 0.5; }
.player-card__head {
display: flex;
align-items: center;
gap: 10px;
}
.player-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: var(--surface-2);
color: var(--muted);
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 700;
flex-shrink: 0;
letter-spacing: 0.02em;
}
.player-avatar--pos { background: color-mix(in srgb, var(--pos) 18%, transparent); color: var(--pos); }
.player-avatar--neg { background: color-mix(in srgb, var(--neg) 18%, transparent); color: var(--neg); }
.player-card__name-block { flex: 1; min-width: 0; }
.player-card__name {
font-weight: 600;
color: var(--text);
text-decoration: none;
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.player-card__name:hover { color: var(--accent); }
.player-card__sub { font-size: 12px; color: var(--muted); display: block; margin-top: 1px; }
.player-card__stats {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 6px;
border-top: 1px solid var(--border);
padding-top: 12px;
}
.player-card__stat {
display: flex;
flex-direction: column;
gap: 2px;
}
.player-card__stat .kicker { font-size: 9px; }
.player-card__stat-val { font-size: 13px; font-weight: 600; color: var(--text); }
/* Danger zone row (description left, action button right) */
.danger-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 20px;
flex-wrap: wrap;
}
.danger-row__title {
display: block;
color: var(--text-strong);
margin-bottom: 4px;
}
/* Danger button */
.btn--danger {
background: var(--neg);
color: #fff;
}
.btn--danger:hover { opacity: .88; }
.btn--danger:disabled { opacity: .4; cursor: not-allowed; }
/* Session date block (used in session list rows) */
.session-date-block {
flex: none;
display: grid;
text-align: center;
padding: 6px 10px;
background: var(--surface-sunk);
border: 1px solid var(--border);
border-radius: 8px;
min-width: 48px;
}
.session-date-block__mon {
display: block;
font-family: var(--font-mono);
font-size: 9.5px;
letter-spacing: .12em;
text-transform: uppercase;
color: var(--faintest);
line-height: 1;
}
.session-date-block__day {
display: block;
font-family: var(--font-display);
font-size: 20px;
font-weight: 700;
color: var(--text-strong);
line-height: 1.1;
}
/* Session create form — horizontal 3-col grid */
.session-create-row {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 14px;
}
@media (max-width: 860px) {
.session-create-row {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 540px) {
.session-create-row {
grid-template-columns: 1fr;
}
}
/* Optional field hint inside label */
.form-opt-hint {
font-family: var(--font-mono);
font-size: 9px;
letter-spacing: .06em;
color: var(--faintest-2);
text-transform: none;
font-weight: 400;
}
.status-pill {
display: inline-flex;
align-items: center;
min-height: 26px;
padding: 4px 9px;
border-radius: var(--r-pill);
border: 1px solid var(--border-strong);
color: var(--muted);
font: 11px var(--font-mono);
text-transform: uppercase;
}
.status-pill--active {
border-color: var(--pos-tint-bd);
color: var(--pos);
background: var(--pos-tint);
}
.status-pill--open {
border-color: var(--pos-tint-bd);
color: var(--pos);
background: var(--pos-tint);
}
.status-pill--closed,
.status-pill--archived {
border-color: var(--border-strong);
color: var(--faint);
background: var(--field);
}
/* Session list row with left accent */
.session-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 20px;
border-bottom: 1px solid var(--border);
border-left: 3px solid transparent;
}
.session-row:last-child { border-bottom: none; }
.session-row--open { border-left-color: var(--pos); }
.session-row--closed { border-left-color: var(--border-strong); }
.session-row__info { display: flex; align-items: center; gap: 14px; min-width: 0; }
.session-row__text { min-width: 0; }
.session-row__title { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.session-row__title a { color: var(--text-strong); text-decoration: none; }
.session-row__title a:hover { color: var(--accent); }
.session-row__meta { font-size: 12px; color: var(--muted); margin-top: 2px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.session-row__stat { display: inline-flex; align-items: center; gap: 4px; }
.session-row__actions { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
.session-row__actions form { margin: 0; }
/* Session detail — full-width player ledger rows */
.player-ledger-list {
display: flex;
flex-direction: column;
max-height: 480px;
overflow-y: auto;
border-radius: 0 0 var(--r-lg) var(--r-lg);
}
.player-ledger-row {
padding: 14px 20px;
border-bottom: 1px solid var(--border);
border-left: 3px solid var(--border-strong);
display: flex;
flex-direction: column;
gap: 10px;
}
.player-ledger-row:last-child { border-bottom: none; }
.player-ledger-row--pos { border-left-color: var(--pos); }
.player-ledger-row--neg { border-left-color: var(--neg); }
.player-ledger-row__header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.player-ledger-row__name { font-size: 15px; font-weight: 700; color: var(--text-strong); }
.player-ledger-row__fields {
display: grid;
grid-template-columns: repeat(4, 1fr);
border: 1px solid var(--border);
border-radius: var(--r-sm);
overflow: hidden;
}
.player-ledger-row__fields--secondary {
grid-template-columns: repeat(3, 1fr);
background: var(--surface-sunk);
}
.player-ledger-row__field {
padding: 8px 12px;
display: flex;
flex-direction: column;
gap: 3px;
border-right: 1px solid var(--border);
background: var(--surface);
}
.player-ledger-row__fields--secondary .player-ledger-row__field {
background: var(--surface-sunk);
}
.player-ledger-row__field:last-child { border-right: none; }
.player-ledger-row__field--net { background: var(--surface-subtle); }
.player-ledger-row__lbl {
font-size: 9.5px;
text-transform: uppercase;
letter-spacing: .08em;
color: var(--faintest);
font-family: var(--font-mono);
white-space: nowrap;
}
.player-ledger-row__val {
font-size: 14px;
font-weight: 600;
color: var(--text);
font-variant-numeric: tabular-nums;
}
@media (max-width: 600px) {
.player-ledger-row__fields { grid-template-columns: repeat(2, 1fr); }
.player-ledger-row__field { border-bottom: 1px solid var(--border); }
.player-ledger-row__fields--secondary { grid-template-columns: repeat(2, 1fr); }
}
/* Modal */
.modal-backdrop {
position: fixed;
inset: 0;
z-index: 50;
display: grid;
place-items: center;
padding: 20px;
background: rgba(5, 5, 8, .68);
backdrop-filter: blur(5px);
}
.modal-backdrop[hidden] { display: none; }
.modal-card {
width: min(100%, 440px);
overflow: hidden;
border-radius: var(--r-md);
background: var(--surface);
border: 1px solid var(--border-strong);
box-shadow: 0 24px 70px rgba(0, 0, 0, .45);
}
.modal-card__head {
padding: 18px 20px 0;
}
.modal-card__text {
margin: 0;
padding: 14px 20px 18px;
color: var(--muted);
font-size: 13.5px;
line-height: 1.5;
}
.modal-card__actions {
display: flex;
justify-content: flex-end;
gap: 10px;
padding: 16px 20px;
border-top: 1px solid var(--divider);
background: var(--surface-sunk);
flex-wrap: wrap;
}
/* ================================================================
RESPONSIVE
================================================================ */
@media (max-width: 860px) {
.split > .col-main, .split > .col-side { min-width: 100%; }
.admin-workspace { grid-template-columns: 1fr; }
.append__textarea { min-height: 120px; }
.debt-layout {
grid-template-columns: 1fr;
}
.admin-bottom-grid { grid-template-columns: 1fr; }
}
@media (min-width: 861px) and (max-width: 1180px) {
.admin-workspace {
grid-template-columns: repeat(2, minmax(280px, 1fr));
}
}
@media (max-width: 1180px) {
.player-stat-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
h1 { font-size: 28px; }
.hero { padding: 18px 0 14px; }
.topbar__season { display: none; }
.page {
padding: 18px 12px 72px;
}
.panel {
border-radius: 12px;
}
.panel__head {
padding: 14px 14px;
}
.panel__body,
.form-card,
.append__body,
.panel--pad {
padding: 16px 14px;
}
.chart-wrap {
padding: 0 10px 14px;
}
.chart-frame {
height: 230px;
}
.chart-frame--tall {
height: 260px;
}
.cards,
.cards-2,
.provisional-grid,
.recon-grid,
.append__grid {
grid-template-columns: 1fr;
}
.form-shell {
padding-top: 20px;
}
.form-shell.narrow {
grid-template-columns: minmax(0, 480px);
}
.cash-strip { grid-template-columns: 1fr 1fr; }
.debt-action-grid { grid-template-columns: 1fr; }
.snapshot-grid { grid-template-columns: 1fr; }
.recon-metric-grid { grid-template-columns: 1fr; }
.player-stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.event-card--inline {
grid-template-columns: minmax(0, 1fr) max-content auto;
}
.event-card--inline .event-card-top strong {
grid-column: 1;
}
.event-card--inline .pill {
grid-column: 2;
}
.event-card--inline .event-amount {
grid-column: 3;
}
.event-card--inline .event-note {
grid-column: 1 / -1;
}
.event-card--inline .tiny-text {
grid-column: 1 / -1;
justify-self: end;
}
.leaderboard-hero-stats {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
width: 100%;
}
.leaderboard-hero-stats .stat,
.leaderboard-hero-stats .stat:last-child {
min-width: 0;
}
.tbl-scroll,
.table-wrap {
width: 100%;
max-width: 100%;
overscroll-behavior-x: contain;
}
.tbl {
min-width: 620px;
}
.tbl--session,
.tbl--session.is-full {
min-width: 760px;
}
.feed,
.debt-list,
.admin-bottom-grid .table-wrap,
.admin-bottom-grid .event-feed {
max-height: none;
height: auto;
}
.csv__btns,
.append__footer,
.button-row,
.modal-card__actions {
align-items: stretch;
}
.csv__btns > *,
.append__footer > *,
.button-row > *,
.modal-card__actions > * {
flex: 1 1 auto;
justify-content: center;
}
}
@media (max-width: 440px) {
.cash-strip { grid-template-columns: 1fr; }
}
/* ================================================================
MOBILE — additional responsive rules
================================================================ */
/* Topbar: app-style single row with an anchored menu on phones. */
@media (max-width: 700px) {
.topbar__inner {
height: 58px;
padding-inline: 12px;
gap: 10px;
}
.brand {
flex: 1 1 auto;
min-width: 0;
}
.brand__name {
overflow: hidden;
text-overflow: ellipsis;
}
.nav-toggle {
display: grid;
flex: none;
order: 20;
}
.topbar__spacer { display: none; }
.mainnav {
position: fixed;
top: calc(58px + env(safe-area-inset-top));
left: 10px;
right: 10px;
z-index: 60;
display: grid;
gap: 4px;
padding: 8px;
border: 1px solid var(--border-strong);
border-radius: 12px;
background: rgba(22, 22, 28, .98);
box-shadow: 0 18px 48px rgba(0,0,0,.42);
transform: translateY(-6px) scale(.985);
transform-origin: top center;
opacity: 0;
pointer-events: none;
visibility: hidden;
transition:
opacity 180ms ease,
transform 220ms cubic-bezier(.2,.8,.2,1),
visibility 180ms;
overflow: hidden;
}
.nav-is-open .mainnav {
transform: translateY(0) scale(1);
opacity: 1;
pointer-events: auto;
visibility: visible;
}
.navlink {
display: flex;
align-items: center;
min-height: 44px;
padding: 11px 12px;
border-radius: 8px;
font-size: 14px;
}
.topbar__admin-actions .btn {
height: 38px;
padding-inline: 11px;
}
.topbar__account-actions {
display: none;
}
}
/* Toolbar: stack left/right sections vertically on narrow viewports */
@media (max-width: 700px) {
.toolbar {
flex-direction: column;
align-items: stretch;
gap: 10px;
}
.toolbar__left,
.toolbar__right { width: 100%; }
.session-filter-form { width: 100%; }
.session-filter-select { min-width: 0; flex: 1; width: 100%; }
}
/* Panel head: let title + action button wrap on narrow panels */
@media (max-width: 580px) {
.panel__head { flex-wrap: wrap; row-gap: 6px; }
}
/* Segmented control: scroll horizontally if it overflows on very small phones */
@media (max-width: 380px) {
.segmented {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
max-width: 100%;
}
.segmented::-webkit-scrollbar { display: none; }
}
/* Session net bars: tighter name column so bars have room */
@media (max-width: 540px) {
.session-net-bars__row {
grid-template-columns: minmax(68px, 100px) minmax(80px, 1fr) minmax(70px, max-content);
gap: 8px;
}
.session-net-bars__name { font-size: 12px; }
.session-net-bars__amount { font-size: 11px; }
}
/* Very small phones: reduce nav / segment padding to keep everything touchable */
@media (max-width: 360px) {
.navlink { padding: 6px 10px; font-size: 12.5px; }
.seg { padding: 6px 10px; font-size: 12px; }
.hero__title, h1 { font-size: 24px; }
}
/* ================================================================
LEAGUE DASHBOARD
================================================================ */
/* Hero */
.db-hero {
position: relative;
overflow: hidden;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 20px;
padding: 28px 0 26px;
flex-wrap: wrap;
}
.db-hero__bg-letter {
position: absolute;
right: -12px;
top: -24px;
font-family: var(--font-display);
font-size: 210px;
font-weight: 800;
line-height: 1;
color: var(--surface-raised);
user-select: none;
pointer-events: none;
z-index: 0;
letter-spacing: -6px;
}
.db-hero__body {
position: relative;
z-index: 1;
flex: 1;
min-width: 0;
}
.db-hero__actions {
position: relative;
z-index: 1;
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
flex: none;
padding-top: 6px;
}
.db-hero__chips {
display: flex;
gap: 6px;
margin-bottom: 12px;
}
.db-chip {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 3px 10px;
border-radius: var(--r-pill);
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: .08em;
text-transform: uppercase;
font-weight: 500;
background: var(--surface-raised);
border: 1px solid var(--border-strong);
color: var(--muted);
}
.db-chip--accent {
background: var(--accent-chip);
border-color: var(--accent-chip-bd);
color: var(--accent);
}
.db-chip--public {
background: var(--pos-tint);
border-color: var(--pos-tint-bd);
color: var(--pos);
}
.league-back-link {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 13px;
font-weight: 600;
color: var(--muted);
text-decoration: none;
margin-bottom: 4px;
transition: color 120ms;
}
.league-back-link:hover { color: var(--accent); }
/* Live session banner */
.db-live-bar {
display: flex;
align-items: center;
gap: 14px;
padding: 12px 18px;
background: var(--pos-tint);
border: 1px solid var(--pos-tint-bd);
border-radius: var(--r-lg);
margin-bottom: 16px;
flex-wrap: wrap;
}
.db-live-bar__text {
flex: 1;
min-width: 0;
color: var(--pos);
font-size: 13.5px;
font-weight: 500;
}
.db-live-bar__btn {
background: var(--pos);
color: #0f0f12;
font-weight: 700;
flex: none;
}
.db-live-bar__btn:hover { opacity: .88; }
/* Stats row — uses existing stat + stat--rail */
.db-stats {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: var(--s3);
margin-bottom: 20px;
}
/* Navigation card grid */
.dashboard-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.dashboard-card {
position: relative;
display: grid;
grid-template-rows: auto auto 1fr auto;
gap: 8px;
padding: 20px;
padding-top: 22px;
color: inherit;
text-decoration: none;
overflow: hidden;
transition: border-color 140ms, transform 140ms, box-shadow 140ms;
min-height: 152px;
}
.dashboard-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--card-accent, var(--border-strong));
border-radius: var(--r-lg) var(--r-lg) 0 0;
transition: opacity 140ms;
}
.dashboard-card:hover {
border-color: var(--border-hi);
transform: translateY(-2px);
box-shadow: 0 10px 28px rgba(0,0,0,.22);
}
.dashboard-card--live {
border-color: var(--pos-tint-bd);
background: linear-gradient(160deg, rgba(111,192,147,.07) 0%, transparent 55%), var(--surface);
}
.dashboard-card--live:hover { border-color: var(--pos); }
.dashboard-card__top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.dashboard-card__top .kicker { margin: 0; }
.dashboard-card__count {
font-family: var(--font-mono);
font-size: 10.5px;
color: var(--faintest);
}
.dashboard-card__title {
display: block;
font-size: 21px;
font-weight: 700;
color: var(--text-strong);
}
.dashboard-card__desc {
margin: 0;
color: var(--muted);
font-size: 13.5px;
line-height: 1.45;
}
.dashboard-card__arrow {
font-size: 18px;
color: var(--faintest);
justify-self: end;
transition: color 140ms, transform 140ms;
}
.dashboard-card:hover .dashboard-card__arrow {
color: var(--card-accent, var(--accent));
transform: translateX(3px);
}
@media (max-width: 640px) {
.db-stats { grid-template-columns: 1fr 1fr; }
.dashboard-grid { grid-template-columns: 1fr; }
.db-hero { flex-direction: column; gap: 14px; }
.db-hero__bg-letter { font-size: 140px; }
}
/* Landing page */
.l-bg {
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(ellipse 70% 55% at 12% 18%, rgba(155,140,240,.11) 0%, transparent 65%),
radial-gradient(ellipse 50% 45% at 88% 78%, rgba(111,192,147,.07) 0%, transparent 55%),
radial-gradient(ellipse 55% 50% at 68% -8%, rgba(155,140,240,.06) 0%, transparent 60%);
}
.l-bg::after {
content: "";
position: absolute;
inset: 0;
background-image: radial-gradient(circle, rgba(255,255,255,.032) 1px, transparent 1px);
background-size: 28px 28px;
mask-image: radial-gradient(ellipse 90% 90% at 50% 40%, black 30%, transparent 100%);
}
.l-hero {
padding: clamp(52px, 8vw, 96px) 0 clamp(36px, 5vw, 52px);
max-width: 700px;
}
.l-hero__kicker {
display: inline-block;
padding: 4px 12px;
border-radius: var(--r-pill);
background: var(--accent-chip);
border: 1px solid var(--accent-chip-bd);
color: var(--accent);
font-family: var(--font-mono);
font-size: 10.5px;
letter-spacing: .10em;
text-transform: uppercase;
font-weight: 500;
margin-bottom: 22px;
}
.l-hero__h1 {
font-size: clamp(36px, 5.8vw, 66px);
font-weight: 700;
line-height: 1.04;
letter-spacing: -.02em;
color: var(--text);
margin: 0 0 18px;
}
.l-hero__sub {
font-size: clamp(15px, 1.8vw, 17px);
color: var(--muted);
line-height: 1.65;
margin: 0 0 28px;
max-width: 54ch;
}
.l-hero__cta {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
/* Preview strip */
.l-preview {
display: grid;
grid-template-columns: 1fr 1.25fr 1fr;
gap: 10px;
margin-bottom: clamp(48px, 7vw, 76px);
align-items: start;
}
.l-preview__panel {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r-lg);
overflow: hidden;
}
.l-preview__panel--featured {
border-color: var(--accent-chip-bd);
box-shadow: 0 0 0 1px var(--accent-chip-bd), 0 8px 32px rgba(155,140,240,.10);
}
.l-preview__head {
display: flex;
align-items: center;
justify-content: space-between;
padding: 11px 14px;
border-bottom: 1px solid var(--divider);
background: var(--surface-head);
}
.l-preview__panel--featured .l-preview__head {
background: var(--accent-tint);
border-bottom-color: var(--accent-chip-bd);
}
.l-preview__tag {
font-family: var(--font-mono);
font-size: 9.5px;
letter-spacing: .08em;
color: var(--faintest);
text-transform: uppercase;
}
.l-preview__rows {
display: grid;
}
.l-preview__row {
display: flex;
align-items: center;
gap: 10px;
padding: 9px 14px;
border-bottom: 1px solid var(--divider);
font-size: 13px;
}
.l-preview__row:last-child { border-bottom: none; }
.l-preview__row--faded { opacity: .4; }
.l-preview__rank {
font-family: var(--font-mono);
font-size: 10.5px;
color: var(--faintest);
min-width: 12px;
}
.l-preview__player {
flex: 1;
font-weight: 600;
color: var(--text-2);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.l-preview__val {
font-family: var(--font-mono);
font-size: 12px;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.l-preview__val--pos { color: var(--pos); }
.l-preview__val--neg { color: var(--neg); }
.l-preview__stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1px;
background: var(--divider);
border-bottom: 1px solid var(--divider);
}
.l-preview__stat {
padding: 12px 12px;
background: var(--surface);
display: grid;
gap: 5px;
}
.l-preview__panel--featured .l-preview__stat {
background: color-mix(in srgb, var(--accent) 4%, var(--surface));
}
.l-preview__stat strong {
display: block;
font-family: var(--font-mono);
font-size: 15px;
font-variant-numeric: tabular-nums;
color: var(--text-strong);
}
.l-preview__evts {
display: grid;
gap: 0;
}
.l-preview__evt {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-bottom: 1px solid var(--divider);
font-size: 12px;
}
.l-preview__evt:last-child { border-bottom: none; }
.l-preview__evt-name {
flex: 1;
color: var(--text-2);
font-weight: 600;
font-size: 12px;
}
.l-preview__evt-val {
font-family: var(--font-mono);
font-size: 11.5px;
color: var(--num);
}
/* Feature grid */
.l-features {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1px;
background: var(--border);
border: 1px solid var(--border);
border-radius: var(--r-lg);
overflow: hidden;
margin-bottom: clamp(40px, 6vw, 64px);
}
.l-feature {
background: var(--surface);
padding: 26px 22px;
display: grid;
align-content: start;
gap: 10px;
}
.l-feature__icon {
display: flex;
align-items: center;
justify-content: center;
width: 42px;
height: 42px;
border-radius: var(--r-sm);
background: var(--accent-chip);
border: 1px solid var(--accent-chip-bd);
color: var(--accent);
margin-bottom: 4px;
}
.l-feature__title {
font-size: 15px;
font-weight: 600;
color: var(--text-strong);
margin: 0;
}
.l-feature__desc {
font-size: 13.5px;
color: var(--muted);
line-height: 1.6;
margin: 0;
}
/* Explore page */
.explore-search {
display: flex;
gap: 8px;
max-width: 480px;
margin-bottom: 24px;
}
.explore-search__input {
flex: 1;
width: auto;
}
.explore-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 12px;
}
.explore-card {
display: flex;
flex-direction: column;
gap: 14px;
padding: 18px 20px;
border: 1px solid var(--border);
border-radius: var(--r-lg);
background: var(--surface);
text-decoration: none;
color: inherit;
transition: border-color 0.15s, box-shadow 0.15s;
}
.explore-card:hover {
border-color: var(--accent);
box-shadow: 0 2px 12px color-mix(in srgb, var(--accent) 10%, transparent);
}
.explore-card__head { display: flex; flex-direction: column; gap: 4px; }
.explore-card__name { font-size: 16px; font-weight: 700; color: var(--text-strong); margin: 0; }
.explore-card__desc { font-size: 13px; color: var(--muted); margin: 0; line-height: 1.4; }
.explore-card__stats {
display: flex;
gap: 16px;
padding: 10px 0;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.explore-card__stat { display: flex; flex-direction: column; gap: 2px; }
.explore-card__stat strong { font-size: 18px; font-weight: 700; color: var(--text-strong); }
.explore-card__footer { margin-top: auto; }
.explore-card__link { font-size: 13px; color: var(--accent); font-weight: 500; }
/* Info tip */
.info-tip {
position: relative;
display: inline-flex;
align-items: center;
margin-left: 5px;
color: var(--faintest-2);
cursor: default;
vertical-align: middle;
transition: color 120ms;
}
.info-tip:hover,
.info-tip:focus,
.info-tip.is-open { color: var(--accent); outline: none; }
.info-tip__bubble {
position: fixed;
width: max-content;
max-width: 260px;
padding: 9px 13px;
background: var(--surface-head);
border: 1px solid var(--border-strong);
border-radius: var(--r-sm);
box-shadow: 0 8px 24px rgba(0,0,0,.35);
font: 400 12.5px/1.5 var(--font-ui);
color: var(--text-2);
text-transform: none;
letter-spacing: 0;
white-space: normal;
pointer-events: none;
opacity: 0;
visibility: hidden;
transition: opacity 120ms;
z-index: 1000;
}
.info-tip.is-open .info-tip__bubble { opacity: 1; visibility: visible; }
/* Docs / help page */
.docs-grid {
display: grid;
grid-template-columns: 200px 1fr;
gap: 48px;
align-items: start;
padding-top: 12px;
}
.docs-nav {
position: sticky;
top: 80px;
display: grid;
gap: 4px;
}
.docs-nav .kicker { margin-bottom: 6px; }
.docs-nav a {
display: block;
font-size: 13.5px;
color: var(--muted);
text-decoration: none;
padding: 4px 0;
border-left: 2px solid var(--divider);
padding-left: 12px;
transition: color 120ms, border-color 120ms;
}
.docs-nav a:hover { color: var(--accent); border-left-color: var(--accent); }
.docs-body {
display: grid;
gap: 52px;
padding-bottom: 80px;
}
.docs-section { display: grid; gap: 14px; }
.docs-h2 {
font-size: 22px;
font-weight: 700;
color: var(--text-strong);
margin: 0;
padding-bottom: 12px;
border-bottom: 1px solid var(--divider);
}
.docs-section p {
margin: 0;
color: var(--muted);
font-size: 14.5px;
line-height: 1.7;
}
.docs-section p strong { color: var(--text-2); }
.docs-callout {
padding: 12px 16px;
background: var(--accent-tint);
border: 1px solid var(--accent-chip-bd);
border-left: 3px solid var(--accent);
border-radius: var(--r-sm);
font-size: 13.5px;
color: var(--text-2);
line-height: 1.6;
}
.docs-callout strong { color: var(--accent); }
.docs-term-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 10px;
}
.docs-term {
display: grid;
gap: 4px;
padding: 14px 16px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r-sm);
}
.docs-term strong {
font-size: 13px;
color: var(--text-strong);
}
.docs-term span {
font-size: 12.5px;
color: var(--muted);
line-height: 1.5;
}
.docs-events {
display: grid;
gap: 12px;
}
.docs-event {
display: flex;
gap: 14px;
align-items: flex-start;
padding: 14px 16px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r-sm);
}
.docs-event .pill { flex: none; margin-top: 2px; }
.docs-event div { display: grid; gap: 4px; }
.docs-event strong { font-size: 13.5px; color: var(--text-strong); }
.docs-event p { margin: 0; font-size: 13px; color: var(--muted); line-height: 1.55; }
@media (max-width: 760px) {
.docs-grid {
grid-template-columns: 1fr;
gap: 24px;
}
.docs-nav {
position: static;
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.docs-nav .kicker { width: 100%; }
.docs-nav a {
border-left: none;
padding-left: 0;
border-bottom: 2px solid var(--divider);
padding-bottom: 4px;
}
}
@media (max-width: 900px) {
.l-preview {
grid-template-columns: 1fr;
}
.l-preview__panel:not(.l-preview__panel--featured) {
display: none;
}
.l-features {
grid-template-columns: 1fr 1fr;
}
.league-row {
grid-template-columns: 1fr;
grid-template-areas:
"identity"
"metrics"
"leaders"
"actions";
}
.league-row__identity,
.league-row__metrics,
.league-row__actions {
border-right: 0;
}
.league-row__identity,
.league-row__metrics,
.league-row__leaders {
border-bottom: 1px solid var(--divider);
}
}
@media (max-width: 560px) {
.l-features {
grid-template-columns: 1fr;
}
.league-hub-summary,
.league-row__metrics {
grid-template-columns: 1fr 1fr;
}
.league-row__title {
display: grid;
}
.league-row__actions .btn {
flex: none;
}
}
/* ── Audit page ─────────────────────────────────────────────────── */
.audit-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--s3);
margin-top: 24px;
}
.audit-alert { padding: 0; }
.audit-alert .panel__head { padding: 14px 20px; }
.audit-item-list { display: flex; flex-direction: column; }
.audit-item {
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
padding: 12px 20px;
border-top: 1px solid var(--divider);
}
.audit-item:first-child { border-top: none; }
.audit-item > div {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.audit-item__right {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
/* ── Void events ────────────────────────────────────────────────── */
.event-card--voided {
opacity: 0.45;
}
.event-card--voided .event-amount,
.event-card--voided strong {
text-decoration: line-through;
}
.void-badge {
font: 600 10px/1 var(--font-ui);
text-transform: uppercase;
letter-spacing: .04em;
color: var(--neg);
background: color-mix(in srgb, var(--neg) 12%, transparent);
border: 1px solid color-mix(in srgb, var(--neg) 30%, transparent);
border-radius: var(--r-sm);
padding: 2px 6px;
}
.void-reason { color: var(--neg); font-style: italic; }
.btn-void-toggle {
all: unset;
cursor: pointer;
display: block;
font: 400 10px/1 var(--font-ui);
letter-spacing: .04em;
color: var(--text-3);
margin-top: 6px;
opacity: 0;
transition: opacity 150ms, color 150ms;
}
.event-card:hover .btn-void-toggle { opacity: 0.3; }
.btn-void-toggle:hover { opacity: 1 !important; color: var(--neg); }
.member-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 20px;
border-bottom: 1px solid var(--border);
}
.member-row:last-child { border-bottom: none; }
.member-row > div { min-width: 0; }
.member-row strong { font: 600 14px/1.4 var(--font-ui); color: var(--text-1); }
.card-menu { position: relative; flex-shrink: 0; }
.card-menu__trigger {
all: unset;
cursor: pointer;
padding: 4px 8px;
border-radius: var(--r-sm);
color: var(--faint);
font-size: 15px;
font-weight: 700;
letter-spacing: 3px;
line-height: 1;
transition: color 120ms, background 120ms;
}
.card-menu__trigger:hover { color: var(--text-2); background: var(--surface-raised); }
.card-menu__dropdown {
position: absolute;
right: 0;
top: calc(100% + 4px);
z-index: 200;
background: var(--surface-raised);
border: 1px solid var(--border-strong);
border-radius: var(--r-sm);
min-width: 136px;
padding: 4px;
box-shadow: 0 8px 24px rgba(0,0,0,.55);
}
.card-menu__item {
all: unset;
cursor: pointer;
display: block;
width: 100%;
padding: 8px 12px;
font: 400 13px/1 var(--font-ui);
color: var(--text-2);
border-radius: calc(var(--r-sm) - 3px);
transition: background 100ms, color 100ms;
box-sizing: border-box;
}
.card-menu__item:hover { background: var(--field); color: var(--text); }
.card-menu__item--warn { color: var(--neg); }
.card-menu__item--warn:hover { background: var(--neg-tint); color: var(--neg); }