feature: nade QoL enhancements - #568
Merged
Merged
Conversation
…icked Three defects in the add-lineup flow, all reported from live use. The aim fields are type="number", so v-model casts and hands back a Number the moment either is touched. hasAim called .trim() on it, threw out of a computed the step strip and the footer both read, and took the whole panel subtree down -- leaving the page-level CANCEL as the only thing on screen. It now tests the value rather than its spelling, and the refs are typed for what they actually hold. Picking silently stopped working at any zoom above 1. The viewport took a pointer capture on press, and while a capture is set the compatibility click is dispatched at the capturing element instead of the element under the pointer -- so the click never reached the svg. Capture is taken on first movement instead, by which point the gesture is a pan and there is no click to lose. The drag/pick threshold is now measured from where the press started rather than between consecutive move events, so a slow drag pans without also picking. Re-picking an end never worked: the two coordinate buttons were the only affordance and they were inside the place step, which the panel leaves on its own the moment both ends are set, while onPick kept handing the mode back to landing so every later click moved the wrong end. The markers are now what the hint always claimed -- press one to aim the next pick at it, drag it to move it -- the coordinates stay visible on every step, and the mode only auto-advances while the pair is still being placed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JTocnM98q1YiSRN4Z73REh
Saving an execute with no name did nothing and said nothing. The field is quiet until hovered and its placeholder read "A Site default", so an empty required field looked like a filled-in one -- and the disabled Save had no entry in the notice list every other blocker uses. The missing name is now a notice, the field draws itself while it is blocking, and the placeholder no longer reads like a value. The scope tallies were a one-shot query that only moved when something else happened to refetch it, and neither submitting for review nor saving a lineup was one of those things -- so REVIEW never incremented and the way to find out whether anything had registered was to switch tabs. They are a subscription now, which also covers changes made by anyone else, and the eight scattered refetch calls are gone with it. Switching tabs flashed the "Add a Lineup" button up and away again: panelEmpty was reset to false on every switch, asserting a full panel for as long as the new one took to load. It is tri-state now -- null is "has not said yet" -- and only the two panels that actually draw their own offer when bare can silence the footer. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JTocnM98q1YiSRN4Z73REh
The first thing the feedback asked for: "constant issues with server making, and getting a connection -- please add console or a way to manage server / see logs". A practice pod is a game server like any other, but the panel offered no way to ask it anything, so a server that refused connections was a dead end. The match page has had both for a long time, and neither needed backend work: the log socket takes m-<match_id>, which the session already carries, and RCON takes the server id, which is one relationship away. Both are staff-gated here because both are staff-gated on the server -- logs are administrator only, and RCON also accepts the moderator running the match, which the practice host is. Showing them any lower would render a console that only ever answers with an error. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JTocnM98q1YiSRN4Z73REh
This was referenced Aug 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pairs with api#401 and game-server#177. Mostly feedback from live use of #396.
Map callouts.
scripts/extract-map-callouts.mjspulls each map'senv_cs_placevolumes out of its VPK.useMapCallouts()reads them back and auto-names throws in four places: the add-lineup panel, save-from-match, meta spots, and a callouts layer on the 2D replay (off by default).RadarCallouts.vuedraws them — each box at its own centre Z, or Nuke's two floors stack.Map assets rebuilt and rehosted. Meshes came from the awpy pack, which was many CS2 builds behind what the nodes run, so reworked maps were raycast against old geometry —
extract-map-meshes.mjsbuilds them straight from the CS2 install instead. And jsDelivr 403s anything over ~20 MiB, which the 3D viewer reads as "no mesh", so assets moved to the panel's own worker in front of B2, keyedmaps/<cs2 build>/. Meshes ship as.tri.gzand are decompressed in the browser: Cloudflare stripsContent-Encodingand won't re-compressapplication/octet-stream, so inferno was arriving 18.6 MB instead of 2.4 MB.The clip filter was dead. Source2Viewer moved these names from materials to meshes, so a material-only test matched nothing and every clip brush shipped as world geometry — 9,576 triangles of invisible playerclip and skybox on Mirage alone.
Console and pod logs for practice servers, staff-gated, reusing what the match page already has.
Add-lineup fixes. The yaw stepper threw out of a computed and took the whole panel down (
type="number"hands back a Number;hasAimcalled.trim()). Picking silently stopped working above zoom 1 (pointer capture ate the click). Re-picking an end never worked — the markers are now the affordance.Also: execute save was silently blocked by an empty name; scope tab counts are a subscription instead of a one-shot query; the footer no longer flickers on tab switch.