b37f0cbec7
Power-user shortcut: hold right-click on a face-up card, a small ring of icons appears around the cursor with one entry per legal destination, release over an icon to fire MoveRequestEvent. Skips the drag motion entirely while preserving the existing RightClickHighlight tint on the actual pile markers. A new RadialMenuPlugin owns the flow. RightClickRadialState is a two-state enum (Idle / Active) carrying the source pile, lifted cards, pre-computed legal destinations + their world anchors, the ring centre, and the currently hovered icon index. Four chained systems handle press → cursor track → release/cancel → redraw, in that order so a single-tick test can't observe a half-state. Mutual exclusion with the left-button mouse drag is implicit — RadialMenuPlugin only listens to MouseButton::Right while the existing drag pipeline only listens to Left. RightClickHighlight co-exists at a lower z (50) than the radial overlay (Z_RADIAL_MENU = 60), so the brief pile-marker tint reads as the same set of legal destinations the radial offers. Cancel paths: release the right button outside any icon, press Esc, or press the left button. All three reset state to Idle without dispatching a move. Visual: a centre dot at the press location plus N icons at radius 80 px around it. For one destination the icon sits at 12 o'clock; for N icons they spread evenly clockwise. Hovered icon scales to 1.15× and tints STATE_SUCCESS so the focused choice is unambiguous. Twelve new tests pin the contract — five system-level (open on press over face-up card, release over destination fires move event, release in dead space cancels, Esc cancels, face-down doesn't open), seven on the pure helpers (radial_anchor_for_index, radial_hovered_index, legal_destinations_for_card). Tests inject cursor positions through a RadialCursorOverride resource so they work under MinimalPlugins where there's no PrimaryWindow or Camera. help_plugin's controls reference gains a new "Mouse" section covering double-click auto-move, right-click highlight, and the new "Hold RMB" radial. Onboarding slide 3 is intentionally left keyboard-only — the radial is a power-user discovery, not a first-run teach. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>