Gauge: short rim pointer so the needle never covers the center readout

The full center-to-rim needle crossed the digital readout at low/mid
values. Draw it as a short marker riding just inside the arc (with a dark
outline for contrast) and recenter the readout.
This commit is contained in:
Dreamodus 2026-07-13 19:36:28 -07:00
parent 5b97091902
commit 89c7a7f603

View file

@ -91,8 +91,10 @@ export const Gauge: React.FC<GaugeProps> = ({
const valueAngle = angleFromNormalized(n, angleOffset, angleRange); const valueAngle = angleFromNormalized(n, angleOffset, angleRange);
const trackPath = describeArc(c, c, r, angleOffset, angleOffset + angleRange); const trackPath = describeArc(c, c, r, angleOffset, angleOffset + angleRange);
const valuePath = n > 0.001 ? describeArc(c, c, r, angleOffset, valueAngle) : ''; const valuePath = n > 0.001 ? describeArc(c, c, r, angleOffset, valueAngle) : '';
const tip = polarToCartesian(c, c, r - t * 0.1, valueAngle); // A short pointer riding the rim — it never crosses the center, so it can't
const tail = polarToCartesian(c, c, t * 0.4, valueAngle); // cover the digital readout that sits there.
const tip = polarToCartesian(c, c, r + t * 0.15, valueAngle);
const tail = polarToCartesian(c, c, r - t * 1.2, valueAngle);
return ( return (
<div <div
@ -117,18 +119,28 @@ export const Gauge: React.FC<GaugeProps> = ({
{valuePath && ( {valuePath && (
<path d={valuePath} fill="none" stroke={litColor} strokeWidth={t} strokeLinecap="round" /> <path d={valuePath} fill="none" stroke={litColor} strokeWidth={t} strokeLinecap="round" />
)} )}
{needle && ( {needle && n > 0.001 && (
<line <line
x1={tail.x} x1={tail.x}
y1={tail.y} y1={tail.y}
x2={tip.x} x2={tip.x}
y2={tip.y} y2={tip.y}
stroke={litColor} stroke="#0b0d0e"
strokeWidth={Math.max(2, size * 0.022)} strokeWidth={Math.max(3, size * 0.05)}
strokeLinecap="round"
/>
)}
{needle && n > 0.001 && (
<line
x1={tail.x}
y1={tail.y}
x2={tip.x}
y2={tip.y}
stroke="#fff"
strokeWidth={Math.max(1.5, size * 0.022)}
strokeLinecap="round" strokeLinecap="round"
/> />
)} )}
{needle && <circle cx={c} cy={c} r={Math.max(2.5, size * 0.04)} fill={litColor} />}
</svg> </svg>
{showValue && ( {showValue && (
<div <div
@ -136,7 +148,7 @@ export const Gauge: React.FC<GaugeProps> = ({
position: 'absolute', position: 'absolute',
left: 0, left: 0,
right: 0, right: 0,
top: needle ? '58%' : '50%', top: '50%',
transform: 'translateY(-50%)', transform: 'translateY(-50%)',
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',