diff --git a/src/routes/tools/beatleader-headtohead/+page.svelte b/src/routes/tools/beatleader-headtohead/+page.svelte index 941dbce..c2f6c3e 100644 --- a/src/routes/tools/beatleader-headtohead/+page.svelte +++ b/src/routes/tools/beatleader-headtohead/+page.svelte @@ -53,8 +53,17 @@ let sortDir: 'asc' | 'desc' = 'desc'; let page = 1; let pageSize: number | string = 24; + let filterWinMargin: string = 'all'; // 'all', '1', '2' $: pageSizeNum = Number(pageSize) || 24; - $: sorted = [...items].sort((a, b) => (sortDir === 'asc' ? a.timeset - b.timeset : b.timeset - a.timeset)); + $: filtered = (() => { + if (filterWinMargin === 'all') return items; + const margin = Number(filterWinMargin); + return items.filter(i => { + if (i.accA == null || i.accB == null) return false; + return i.accA > i.accB && (i.accA - i.accB) > margin; + }); + })(); + $: sorted = [...filtered].sort((a, b) => (sortDir === 'asc' ? a.timeset - b.timeset : b.timeset - a.timeset)); $: totalPages = Math.max(1, Math.ceil(sorted.length / pageSizeNum)); $: page = Math.min(page, totalPages); $: pageItems = sorted.slice((page - 1) * pageSizeNum, (page - 1) * pageSizeNum + pageSizeNum); @@ -246,6 +255,8 @@ if (dir === 'asc' || dir === 'desc') sortDir = dir; const size = sp.get('size') ?? sp.get('ps'); if (size) pageSize = Number(size) || pageSize; + const filter = sp.get('filter'); + if (filter && ['all', '1', '2'].includes(filter)) filterWinMargin = filter; initialized = true; }); @@ -272,6 +283,7 @@ if (page > 1) sp.set('page', String(page)); else sp.delete('page'); if (sortDir !== 'desc') sp.set('dir', sortDir); else sp.delete('dir'); if (pageSizeNum !== 24) sp.set('size', String(pageSizeNum)); else sp.delete('size'); + if (filterWinMargin !== 'all') sp.set('filter', filterWinMargin); else sp.delete('filter'); const qs = sp.toString(); const url = location.pathname + (qs ? `?${qs}` : ''); if (replace) history.replaceState(null, '', url); else history.pushState(null, '', url); @@ -508,53 +520,62 @@ - -
-
Win Margin Histogram (A − B, %)
-
- {#each histogram as count, i} -
= 0 ? 'rgba(0,255,204,0.8)' : 'rgba(255,0,170,0.8)'};`} - >
- {/each} -
+ +
+
+
Win Margin Histogram (A − B, %)
+
+ {#each histogram as count, i} +
= 0 ? 'rgba(0,255,204,0.8)' : 'rgba(255,0,170,0.8)'};`} + >
+ {/each} +
+
+
Left (magenta) favors {idShortB}, Right (cyan) favors {idShortA}
+
+
+
Cumulative Wins Over Time
+ + + + {#if cumSeries.length > 1} + {#key cumSeries.length} + + `${mapX(p.t, 600)},${mapY(p.a, 120)}`).join(' ')} /> + + `${mapX(p.t, 600)},${mapY(p.b, 120)}`).join(' ')} /> + {/key} + {/if} +
-
Left (magenta) favors {idShortB}, Right (cyan) favors {idShortA}
-
- - -
-
Cumulative Wins Over Time
- - - - {#if cumSeries.length > 1} - {#key cumSeries.length} - - `${mapX(p.t, 600)},${mapY(p.a, 120)}`).join(' ')} /> - - `${mapX(p.t, 600)},${mapY(p.b, 120)}`).join(' ')} /> - {/key} - {/if} -
{/if} {#if items.length > 0} -
-
- {items.length} songs - · +
+
+ {filtered.length} / {items.length} songs +
+
+