feat(ui): F8-12 — owner feedback round 2 (#55)
* Bug fix: theme flip no longer leaves planets oversized. The camera-preserving remount now calls a new `RendererHandle.refreshCameraDerivedDraws` explicitly after the manual moveCenter/setZoom pair so the post-mount geometry tracks `viewport.scaled` even if pixi-viewport's `'zoomed'` listener races the next Ticker tick. * Doc #3: clicks on a planet label route through the same hit-test path as a click on the disc. The label `Container` now has a pointer hit area sized to the text + frame padding; pointertap simulates a click at the planet centre, so selection and pick-mode resolution behave identically. * Doc #4: battle X-crosses + cargo arrowhead wings grow sub-linearly with zoom (PLANET_SIZE_ZOOM_ALPHA). New `Style.softLengthAnchor` ('center' / 'start') makes the renderer treat the recorded endpoints as the geometry "at the reference scale" and rescale around the midpoint (X-cross) or the start endpoint (arrow wings). Arrowhead base length is halved from 6 to 3 world units to match the owner's "in half" request. * Doc #5: picker overlay loses the anchor ring at the source, the cursor line drops to a cargo-route-thin 0.6 px stroke, and the hover ring around the destination is replaced by a planet-style outline (visible disc + 1 px padding) in the `pickHighlight` accent — so candidate destinations read like selection in warm yellow. * Doc #6: regression test pins the in-disc hit zone. * Perf #1: camera-driven redraws are throttled onto the next Ticker tick. A rapid wheel / pinch burst now coalesces into at most one `clear() + redraw` pass per painted frame, which keeps the 500-planet map responsive on zoom and toggle flips. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -83,10 +83,17 @@ export interface PickOverlaySpec {
|
||||
readonly dimmedIds: ReadonlySet<PrimitiveID>;
|
||||
}
|
||||
|
||||
/** Anchor / hover outline padding in world units (the rings sit
|
||||
* outside the visible disc so the planet stays clearly visible). */
|
||||
/** Anchor / hover outline padding. F8-12 / #5 retired the anchor
|
||||
* ring from the picker overlay, so `ANCHOR_PADDING_WORLD` is now
|
||||
* dead — kept exported for legacy test coverage that asserts the
|
||||
* spec stays shaped the same way. `HOVER_PADDING_PX` is the
|
||||
* screen-pixel gap the picker hover-ring leaves between the
|
||||
* destination disc edge and the stroke; it matches the regular
|
||||
* planet outline (`OUTLINE_RADIUS_PADDING_PX` in `render.ts`) so
|
||||
* "selection" and "pick hover" outlines feel identical at every
|
||||
* zoom. */
|
||||
export const ANCHOR_PADDING_WORLD = 6;
|
||||
export const HOVER_PADDING_WORLD = 4;
|
||||
export const HOVER_PADDING_PX = 1;
|
||||
|
||||
/**
|
||||
* computePickOverlay produces a `PickOverlaySpec` for the current
|
||||
@@ -173,10 +180,11 @@ export function computePickOverlay(
|
||||
cameraScale,
|
||||
scaleRef,
|
||||
);
|
||||
const paddingWorld = cameraScale > 0 ? HOVER_PADDING_PX / cameraScale : 0;
|
||||
hoverOutline = {
|
||||
x: target.x,
|
||||
y: target.y,
|
||||
radius: targetRadius + HOVER_PADDING_WORLD,
|
||||
radius: targetRadius + paddingWorld,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -208,8 +216,13 @@ export function computePickOverlay(
|
||||
* as obviously inert against the map background.
|
||||
*/
|
||||
export const PICK_OVERLAY_STYLE = {
|
||||
anchor: { alpha: 0.9, width: 2 },
|
||||
line: { alpha: 0.5, width: 1 },
|
||||
hover: { alpha: 1, width: 2 },
|
||||
anchor: { alpha: 0.9, widthPx: 2 },
|
||||
// F8-12 / #5: cursor line uses the same screen-pixel thickness as
|
||||
// a regular cargo-route shaft (0.6 px), and the hover ring around
|
||||
// the destination matches the planet-outline stroke (1.5 px). The
|
||||
// renderer divides by `cameraScale` before drawing so the values
|
||||
// stay constant on screen at any zoom.
|
||||
line: { alpha: 0.95, widthPx: 0.6 },
|
||||
hover: { alpha: 0.95, widthPx: 1.5 },
|
||||
dimAlpha: 0.35,
|
||||
} as const;
|
||||
|
||||
Reference in New Issue
Block a user