Spaces:
Running
Running
Commit History
-
Player grid: gate skull on availability, not on round-final survivalβ
The skull icon was shown whenever the POV's chunks-preview row had survived_chunk=false β i.e. for any player who died at any point in the round. But that summary doesn't move with playback time, so at the start of a round non-survivors got a skull while still being alive on video and with their button still enabled. Now the skull only fires once the player has actually died by the current virtualTime (mirroring grid-tile which already did this). Survivors still get the shield.9d3dfa1 -
Trust ticks.parquet `t` and `event_seconds`β
Upstream fixed the time bases: ticks `t` is monotonic video time and `event_seconds` is already on the POV video timeline. So: - world.ts uses `r.t` directly; drop the tick-derived recompute and the TICK_RATE constant. - map-results.ts drops the Γ2 multiplier for `event_seconds`. - Recipes drop `event_seconds * 2.0` and the pov_rounds join that was only there for path lookups we don't need.1632a07
-
Home: POV tab + DuckDB advanced filterβ
- New POV tab listing one row per (round, player). SQL filter results drop into the same table so the user goes from query to clip. - DuckDB-wasm singleton, hf:// β https URL rewrite, 1000-row cap. - CodeMirror SQL editor with light/dark theme via a Compartment; Cmd/Ctrl+Enter runs the query. - Six preset recipes adapted from the dataset card (AWP 1v1, smoke kill, noscope/wallbang, knife, 5-kill burst, long-distance). - Kill/duel-derived seek times land 2.5s before the event so the lead-up is visible; tick `t` and explicit start_t stay exact. - Match page reads ?t= on first land (one-shot, stripped on internal nav) so deep links from the filter open at the right moment.5a67aa1 -
Video: drive virtualTime emission off rAF for smooth minimap
dd360a4
-
Eval: 2-round policy + sync-start gate + no auto-advanceβ
- Sample 2 rounds per (match, map) instead of 4: one endpoint (round 1 or last, picked deterministically) plus one PRNG-chosen middle round. - Eval mode no longer auto-advances when the round ends β reviewers drive navigation explicitly via the eval bar's Prev/Next. - New sync-start gate in eval mode: the round starts paused and only auto-plays once every POV tile has emitted `loadeddata` (first frame decoded), so the comparison view never starts mid-buffer with some panes blank. A small "Loading N / 10 POVsβ¦" indicator overlays the grid while we wait; touching play or leaving eval mode releases the gate immediately. preloadAllPlayers is force-on in eval mode so the HTTP-level prefetch runs alongside the MSE attach.7f23fd2
-
Match table: add Uploaded column, sort by it by defaultβ
Surface the per-row uploaded_at timestamp so freshly ingested matches float to the top by default. The match-row roll-up takes the latest upload across the series' maps; rounds use their own per-round uploaded_at; the legacy Date (match_date) column stays so users can still browse by when matches were originally played.e66c992
-
Video player: cycle-through playback speed control (0.5/1/1.5/2)β
Adds a single button next to mute that cycles through the four rates; state lifted to the match page so it persists across rounds, player swaps, and single/grid mode toggles. The browser resets playbackRate to 1 on each MSE source swap, so both video-player and grid-tile re-apply it on chunk change.ec62d48
-
Match table: prepend match_id column, truncate event; add stats sectionβ
- New MatchIdCell + matchIdColumn helper, prepended to all 3 column sets (rounds / maps / matches). Match id rendered as monospace tabular-nums. - eventColumn helper with meta.cellClass = max-w-[16rem] so long event names truncate; EventCell wrapper also gets max-w-[16rem]. - match-table.svelte: thread column meta.cellClass / meta.headClass through Table.Cell + Table.Head so per-column widths actually apply. - New StatsSection between the table and BibTeX: * Maps distribution: horizontal bars per CS2 map (count + share %), colored using mapColorClasses for visual tie-in with badges. * Rounds-per-map histogram: 4-round buckets. Restructure layout β bars are direct children of h-32 flex items-end so % heights resolve against a definite parent height; labels render in a separate row below to avoid collapsing to zero in flex-col wrappers.0f00bbc -
Fix eval-flag-dialog infinite effect loop on openβ
The `storeBump++` inside the effect read + wrote the same state, making it a tracked dependency that re-fired the effect β exceeding Svelte's update depth and freezing the page so the dialog Close button couldn't fire. Wrap the body in untrack() so only `open` is observed.8e5c0f0 -
Evaluation: 4-round policy, validations store, prev/next, copy/clear, build flagβ
- Bump policy from 3 β 4 rounds per (match, map): first, last, 2 PRNG-picked middle rounds (deterministic on match_id+map). Fully reviewing all 4 without flagging implies the (match, map) is good. - New localStorage store opencs2:eval:validations:v1: clicking Next validates the current candidate. firstUnreviewed/nextUnreviewed skip already-flagged or already-validated candidates so a returning reviewer resumes where they left off (header eval entry jumps to first unreviewed). - Eval bar adds Previous (β) for backtracking and a "N reviewed" counter. - Flag dialog gets a "Local review data" footer with live flag/validation counts, a Copy button (full JSON to clipboard via exportReviews), and a Trash button to clear both stores. Note field already free-text. - New "Don't flag" entry: "Recording ends right at death" β POVs cut on the exact death tick (intentional, to avoid camera glitches). - Build flag PUBLIC_DISABLE_EVAL=1 hides the entire eval surface (header toggle, eβ¦6d55c38 -
Add evaluation mode: queue, flag bar, info dialogβ
- src/lib/eval.ts: deterministic eval queue (per match-map: round 1, last, + 1 PRNG-picked middle), flag reasons, localStorage flag store - src/lib/components/eval-bar.svelte: amber strip below the header with position N/total, Flag dropdown (6 reasons w/ descriptions), Info button, Next, Exit - src/lib/components/eval-info-dialog.svelte: explains the policy and what to flag (missing audio, AV misalignment, POV desync, uninteresting, missing video, other) - header.svelte: ListChecks toggle button β start eval (jump to candidate 0) or exit; reads matches from page.data so any match page can launch eval - match page: render <EvalBar /> when ?eval=1; route effect now also reacts to URL round/player/view changes (so eval Next on the same map reloads the new round); ?eval=1&i=N stays preserved by syncUrl()'s URL clone Flags persist in localStorage (opencs2:eval:flags:v1) β export manually for now, no backend round-tripping yet.e355be5 -
Don't let dead players cap the grid-mode buffer indicatorβ
Strict-intersecting all 10 tiles' buffered ranges meant a player who died at t=30 capped the unified bar at 30 even when every other tile was buffered to the round end. Pad each player's buffer with [dur, roundEnd] before intersecting β there's no stream there for them to buffer, so they should drop out as a constraint past their own death.0ce2f31
-
Fix navigation state bugs (round/player URL, map switch, table state on back)β
Bug 1: Map dropdown changed the URL but kept the previous map's video, player positions, etc. Same component instance was reused across `[mapName]` route changes, so $state and onMount didn't re-fire. Replace onMount with an $effect that watches a routeKey derived from data.match.{match_id,map_name}; when it changes, re-read URL params and reset round/player/view + reload previews. Bug 2: Home links omitted defaults so the destination URL wasn't self-contained. matchUrl() now always emits ?round=&player=&view= so reloads, shares, and back-nav stay deterministic. Bug 3: Tab choice + search/sort/pagination/filter were all internal MatchTable state and got lost on back-nav. Lift the state to the home page (one slot per tab) via $bindable props on MatchTable, and use SvelteKit's snapshot API (capture/restore) on +page to persist {view, tables} across history navigation.c92e42a -
Drop π― emoji from match-page header link
79f37ad -
Apply Tailwind v4 shorthand fixes; narrow eslint disables to real FPsβ
Auto-fixes from eslint-plugin-better-tailwindcss (enforce-canonical-classes re-enabled β these are real Tailwind v4 shorthands, not stylistic preferences): - h-full w-full β size-full - h-5 w-5 β size-5 - px-2 py-2 β p-2 - text-{sm,xs} leading-relaxed β text-{sm,xs}/relaxed - -translate-x-1/2 -translate-y-1/2 β -translate-1/2 - data-[disabled]:foo β data-disabled:foo - break-words β wrap-break-word Only no-unknown-classes stays disabled β it can't see classes defined in Svelte <style> blocks (.vs-beam, .vp-freeze, ...).0a96402 -
Add eslint with eslint-plugin-better-tailwindcssβ
- Replace prettier-plugin-tailwindcss with eslint-plugin-better-tailwindcss (the two disagreed on ordering β keep one source of truth for class order) - ESLint flat config with svelte-eslint-parser + @typescript-eslint/parser, scoped to non-shadcn source. Tailwind v4 entrypoint = src/routes/layout.css - Disable no-unknown-classes (custom Svelte <style> classes like vs-beam) and enforce-canonical-classes (h-full w-full β size-full when parent is asymmetric) - Auto-fix sorts every Tailwind class list and removes a few duplicates - New scripts: bun run lint (prettier + eslint check), bun run lint:fix8899818 -
Nerfies-style home, paper-style match header, prettier setup, dataset READMEβ
- Redesign home page: centered title, author + links, abstract, motivation cards, BibTeX - Slim down match-page header to a minimal back-link + theme toggle - Replace ternary class injections with data-attributes (score, match-info, view mode) - Drop unused shadcn surface (accordion, alert-dialog, breadcrumb, ...) and pnpm artifacts - Expand README with usage, schema, dev/build, viewer internals, BibTeX - Improve <svelte:head> meta tags and robots.txt - Add Prettier with svelte + tailwindcss plugins; format the entire codebase95e3d2a -
Cut first-paint payload: per-icon phosphor imports + WebP radars + non-sticky headerβ
- Switch every `import { X } from 'phosphor-svelte'` barrel to `import XIcon from 'phosphor-svelte/lib/XIcon'`. The barrel form was eagerly bundling all ~9000 icons into a single 8.5MB chunk (1.07MB gzipped); largest chunk now drops to 612KB / 156KB gzip - Convert all 17 radar PNGs to WebP @ q90 (visually indistinguishable, 2.4MB β 584KB total) and update `radarUrl()` accordingly. Modern browser support for WebP is universal so the .png fallback is unnecessary - Drop the sticky page header; round-list aside on the match page now sticks to top-2 (h: 100vh - 1rem) instead of the old 72px header offset15d8696 -
Rich data table on home page, interactive bigger minimap, tactical-reveal player swapβ
- Replace home-page card grid with a TanStack data table (Rounds default / Maps / Matches via Tabs); global search, map filter, sort, pagination, column-visibility, deep-link to specific round - Minimap: bigger badges + wider/fainter vision cones, halo on the active POV, click-to-switch with hover/focus ring (works in single + grid) - Player swap tactical reveal: diagonal beam sweep, corner reticle brackets, edge vignette, HUD chip slide-in (bottom-left), and a clip-path wipe on the freeze-frame so the old POV transitions out instead of snapping - Don't echo currentTime=0 from the freshly-mounted <video> back to the parent β kept the minimap and timeline from flashing to round-start during a swap; also don't drop bufferedRanges91677d6 -
Use real HF logo, show progress vs 2540-map target, default to grid view, scroll rounds list
c3540d6
-
Initial CS2 render dataset viewer
31d3580