Conversation
Replace the old gray/orange playback UI with a modern dark-navy glassmorphism design matching the mission selector page. - New components: TopBar, BottomBar (with custom timeline scrubber and speed selector), SidePanel (tabbed: Units/Events/Stats/Chat), MapControls, KeyboardHints - Merge left+right panels into single tabbed SidePanel - Move layer toggles from Leaflet control into TopBar dropdown, including MapLibre-specific layers (map icons, 3D buildings) - Add deathCount tracking to Unit, keyboard shortcut for events tab - Delete 15 old panel components and their tests
Kill and death counts were computed once at load time and stored on Unit objects, causing the UI to show final totals from frame 0. Add EventManager.getKillDeathCounts(frame) that scans events up to the current frame, and use it in UnitsTab and StatsTab so counts update as the recording plays.
Remove top:50px from .leaflet-left that pinned controls near the old top panel. Use --pb-bottom-height for .leaflet-bottom offset so the scale ruler sits above the bottom bar, aligned with the side panel.
The early break assumed events were sorted by frame, but the event array order depends on the source data and isn't guaranteed. Changed break to continue so all events up to the current frame are counted.
Cover frame boundaries, accumulation, self-kills, vehicle victims, hit-vs-killed filtering, non-kill events, and out-of-order events.
The default attribution control overlapped the map style switcher buttons. Pin it just above the bottom bar at reduced opacity.
Add getMapStyles/setMapStyle/getActiveStyleIndex to MapRenderer interface. Leaflet renderer probes available styles, generates 128×128 preview thumbnails, and exposes them to MapControls via the renderer API. Remove old basemap/maplibre-style circular switcher CSS and controls.
Style switching is now handled through the renderer interface and MapControls component. Remove the unused Leaflet control classes, their factory functions, and associated tests.
…dcoded colors Promote mission-selector --ms-* variables to app-wide unprefixed names (--accent-blue, --text-primary, --font-mono, etc.) and replace ~100 hardcoded hex colors in playback components with variable references. Delete 12 unused legacy variables, keep --highlight/--bg-modal for MissionModal/Hint compatibility.
Promote shared dirs (hooks/, i18n/, styles/) to top-level src/ peers. Colocate all playback components under pages/recording-playback/components/. Delete the confusing ui/src/ui/ double-nesting entirely. Fix "Operation not found" false positive caused by engine.loadOperation() triggering snapshot effects before renderer.init() — the renderer's map was undefined when useRenderBridge tried to create markers. Solved by passing an onWorldResolved callback so setWorldConfig (and thus renderer.init) fires before engine snapshots propagate. Also split the bare catch block to distinguish API failures from load errors.
Replace the separate /loading route with an overlay inside RecordingPlayback that shows during actual data loading and fades out smoothly when done.
The Go parser was dropping messages for generalEvent, endMission, captured, capturedFlag, and terminalHack events — their string data fell into the hit/killed parsing path and was lost. The frontend protobuf decoder also lacked cases for these types, silently discarding them. Add comprehensive roundtrip and parser-level tests for all event types.
- Replace lightning bolt (ZapIcon) with horizontal BulletIcon for hit events - Show "(suicide)" instead of duplicate names when victim === killer - Hide hit events by default (toggle still available) - Event click pans to victim without persistent follow - Add panToEntity() to engine; followEntity() now also pans immediately
- Show "Link copied!" toast below share button for 2s - Replace hardcoded background colors with var(--bg-panel)
- Global kbd style in base.css replaces duplicates across components - Redesign AboutModal to match playback design system (blur panel, sections) - Remove R shortcut (keep only Space + E), update tests - Show E shortcut badge on Panel button in bottom bar - Remove floating KeyboardHints overlay - Use import.meta.env.BASE_URL for download href and logo
Add 35 new translation keys (en, ru, de, cs, it, fr) and wire useI18n into 10 playback components. Replace native select dropdowns with custom popups matching the speed selector styling.
Flow date and timeMultiplier from TimeSample through decoders into the engine's timeConfig. Replace disabled time button with working dropdown that enables mission and system time modes when data is available.
- Floating chip above bottom bar shows followed unit name with side color dot - Clicking a followed unit in the list toggles follow off - Dragging the map auto-unfollows so panning no longer snaps back
Summary of ChangesHello @fank, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces a significant overhaul of the recording playback user interface, moving to a modern glassmorphism design. It streamlines the project's frontend architecture by reorganizing core UI elements and enhancing user interaction with new, intuitive controls. The changes also include backend improvements for event parsing and robust testing to ensure data integrity during conversion and playback. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request introduces a major and impressive redesign of the recording playback UI, along with a significant refactoring of the frontend project structure. The new UI looks modern, and the code organization is much cleaner with the consolidation of hooks, styles, and i18n resources. The backend changes to support more event types are also well-implemented and come with thorough tests.
I have one minor suggestion to reduce some code duplication in the Go parser, but overall this is an excellent set of changes that greatly improves the user experience and maintainability of the codebase.
Add 60 new tests covering FollowIndicator, UnitsTab, EventsTab, StatsTab, SidePanel, TopBar, BottomBar, MapControls, and useRenderBridge. Shared test helpers provide engine/renderer setup and entity/event factories. Total test count: 582 → 642.
…TimelineScrubber Covers remaining untested playback components: auto-dismiss hints, counter state display, speed dropdown, about modal open/close and versions, timeline scrubber progress and event markers. 642 → 670 tests.
479810d to
821339d
Compare
Two issues caused inaccurate Go coverage reporting: 1. Multiple test binaries each write coverage entries for the same source file when using -coverpkg. fgrosse/go-coverage-report doesn't merge duplicates, counting each entry as a separate statement. This inflated statement counts ~4x and deflated percentages. 2. actions/setup-go restores the Go build/test cache across CI runs. When a -coverpkg target file changes but a test package doesn't import it (e.g. internal/maptool doesn't import internal/storage), the cached test binary retains stale coverage instrumentation with old line numbers. These "ghost blocks" appear as uncovered phantom statements. Verified: ghost blocks in the PR profile are a 100% exact match with the main branch's coverage blocks (161 blocks, lines 4-486 vs current file lines 6-526). Fix: add -count=1 to disable test result caching (forces fresh coverage data), and deduplicate the profile by merging entries per block (takes max count), eliminating both duplicate entries and ghost blocks.
821339d to
99f669a
Compare
Merging this branch will increase overall coverage
Coverage by fileChanged files (no unit tests)
Please note that the "Total", "Covered", and "Missed" counts above refer to code statements instead of lines of code. The value in brackets refers to the test coverage of that file in the old version of the code. Changed unit test files
|
Summary
ui/wrapper, consolidated CSS variables, moved hooks/i18n/styles to top-levelTest plan
npx tsc --noEmit— no new type errors in changed filesnpx vitest run— all 582 tests pass