Spaces:
Running
fix: drop medals from the full leaderboard table, hold the dark theme
Browse filesThe full leaderboard table already carries a # column, so the 🥇🥈🥉 on its Elo
cells were a second, competing ordering. Removed upstream in
`tabarena.plot.interactive._leaderboard_table_template` and the 72
`leaderboard_table.html` artifacts re-rendered from their sibling
`website_leaderboard.csv` — the same call the conversion step makes, verified by
re-rendering before the change and getting all 72 back byte-identical. The
app's own fallback table lost them too. The cross-subset overview keeps its
medals: no # column there.
Theme: `FORCE_DARK_THEME_JS` reloaded the page to append `__theme=dark`, but
Gradio 6 resolves the `theme-mode` attribute and `system` (which follows the
viewer's OS and re-applies itself on change) ahead of that parameter, so a
light-OS or light-embed visitor beat it — and reloading only lost the same race
one page load later. Force the `dark` class instead, which is what Gradio's
stylesheet keys off, and hold it with a MutationObserver.
`THEME` covers the frame that HEAD cannot: Gradio ships `head` inside
`window.gradio_config` and injects it after the bundle has already picked a
theme, and its served index.html paints a splash from the theme's *light* body
colours. Pointing those at the dark pair makes the first frame dark for
everyone.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- data/imputation_no/splits_all/tasks_all/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_all/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_all/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_binary/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_binary/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_binary/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_classification/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_classification/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_classification/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_multiclass/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_multiclass/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_multiclass/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_regression/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_regression/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_all/tasks_regression/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_all/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_all/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_all/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_binary/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_binary/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_binary/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_classification/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_classification/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_classification/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_multiclass/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_multiclass/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_multiclass/datasets_small/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_regression/datasets_all/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_regression/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_no/splits_lite/tasks_regression/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_all/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_all/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_all/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_binary/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_binary/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_binary/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_classification/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_classification/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_classification/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_multiclass/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_multiclass/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_multiclass/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_regression/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_regression/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_yes/splits_all/tasks_regression/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_lite/tasks_all/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_lite/tasks_all/datasets_medium/leaderboard_table.html +5 -15
- data/imputation_yes/splits_lite/tasks_all/datasets_small/leaderboard_table.html +5 -15
- data/imputation_yes/splits_lite/tasks_binary/datasets_all/leaderboard_table.html +5 -15
- data/imputation_yes/splits_lite/tasks_binary/datasets_medium/leaderboard_table.html +5 -15
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|
|
@@ -299,10 +299,6 @@
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
| 302 |
-
/* A fixed-width medal slot keeps the digits in their own sub-column whether or
|
| 303 |
-
not a medal is present. */
|
| 304 |
-
.cell { display: inline-flex; align-items: baseline; }
|
| 305 |
-
.medal { flex: 0 0 1.45em; width: 1.45em; text-align: left; font-size: 0.78em; }
|
| 306 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 307 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 308 |
.verified { font-size: 0.85em; }
|
|
@@ -914,11 +910,8 @@
|
|
| 914 |
postHeight();
|
| 915 |
return;
|
| 916 |
}
|
| 917 |
-
//
|
| 918 |
-
//
|
| 919 |
-
const ranked = rows.filter(p => isFinite(p[RANK_KEY]))
|
| 920 |
-
.sort((a, b) => (colByKey.get(RANK_KEY).lowerBetter ? a[RANK_KEY] - b[RANK_KEY] : b[RANK_KEY] - a[RANK_KEY]));
|
| 921 |
-
const medalOf = new Map(ranked.slice(0, 3).map((p, i) => [p, ["\u{1F947}", "\u{1F948}", "\u{1F949}"][i]]));
|
| 922 |
const heat = new Map();
|
| 923 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 924 |
|
|
@@ -946,7 +939,7 @@
|
|
| 946 |
} else if (col.key === "model") {
|
| 947 |
html += nameCell(p);
|
| 948 |
} else {
|
| 949 |
-
html += valueCell(p, col, heat.get(col.key)
|
| 950 |
}
|
| 951 |
}
|
| 952 |
html += "</tr>";
|
|
@@ -963,7 +956,7 @@
|
|
| 963 |
postHeight();
|
| 964 |
}
|
| 965 |
|
| 966 |
-
function valueCell(p, col, span
|
| 967 |
const v = p[col.key];
|
| 968 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 969 |
if (col.text) {
|
|
@@ -980,11 +973,8 @@
|
|
| 980 |
if (col.key === "elo" && p.elo_ci) {
|
| 981 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 982 |
}
|
| 983 |
-
const inner = medal !== undefined || col.key === RANK_KEY
|
| 984 |
-
? '<span class="cell"><span class="medal">' + (medal || "") + '</span><span>' + text + ci + "</span></span>"
|
| 985 |
-
: text + ci;
|
| 986 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 987 |
-
style + ">" +
|
| 988 |
}
|
| 989 |
|
| 990 |
function sortBy(key) {
|
|
|
|
| 299 |
table.lbt td.num { font-weight: 600; }
|
| 300 |
table.lbt td.na { color: var(--pt-muted); }
|
| 301 |
table.lbt tbody tr:hover td { filter: brightness(1.12); }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
.ci { opacity: 0.5; font-weight: 400; font-size: 0.82em; }
|
| 303 |
.pill { padding: 1px 7px; border-radius: 999px; font-size: 0.95em; white-space: nowrap; }
|
| 304 |
.verified { font-size: 0.85em; }
|
|
|
|
| 910 |
postHeight();
|
| 911 |
return;
|
| 912 |
}
|
| 913 |
+
// No medals here: this table is the full ranking and already carries the
|
| 914 |
+
// position column, so podium marks only added a second, competing ordering.
|
|
|
|
|
|
|
|
|
|
| 915 |
const heat = new Map();
|
| 916 |
for (const col of cols) if (col.heatmap) heat.set(col.key, bounds(rows, col));
|
| 917 |
|
|
|
|
| 939 |
} else if (col.key === "model") {
|
| 940 |
html += nameCell(p);
|
| 941 |
} else {
|
| 942 |
+
html += valueCell(p, col, heat.get(col.key));
|
| 943 |
}
|
| 944 |
}
|
| 945 |
html += "</tr>";
|
|
|
|
| 956 |
postHeight();
|
| 957 |
}
|
| 958 |
|
| 959 |
+
function valueCell(p, col, span) {
|
| 960 |
const v = p[col.key];
|
| 961 |
if (v == null || (typeof v === "number" && !isFinite(v))) return '<td class="na">–</td>';
|
| 962 |
if (col.text) {
|
|
|
|
| 973 |
if (col.key === "elo" && p.elo_ci) {
|
| 974 |
ci = ' <span class="ci">(' + escapeHtml(p.elo_ci) + ")</span>";
|
| 975 |
}
|
|
|
|
|
|
|
|
|
|
| 976 |
return '<td class="num" data-sort="' + v + '"' + (ci ? ' data-ci="' + escapeHtml(p.elo_ci) + '"' : "") +
|
| 977 |
+
style + ">" + text + ci + "</td>";
|
| 978 |
}
|
| 979 |
|
| 980 |
function sortBy(key) {
|