hydropd / website /src /components /Spectrum.tsx
rikardsaqe's picture
Instrument redesign + copy/functional fixes
8c51b20 verified
Raw
History Blame Contribute Delete
1.32 kB
// Illustrative mass-spectrum trace for the home hero. Deterministic (no random),
// self-contained inline SVG. Big peaks use the accent; the rest are faint.
export default function Spectrum({ height = 128 }: { height?: number }) {
const W = 1000
const H = height
const pad = 6
const n = 76
const peaks = Array.from({ length: n }, (_, i) => {
const x = pad + (i / (n - 1)) * (W - 2 * pad)
const s =
Math.abs(Math.sin(i * 0.7)) *
Math.abs(Math.sin(i * 0.27 + 1)) *
(0.35 + 0.65 * Math.abs(Math.sin(i * 0.11)))
const y = H - pad - (0.06 + 0.94 * s) * (H - 2 * pad)
return { x, y, big: s > 0.55 }
})
return (
<svg
className="spectrum"
viewBox={`0 0 ${W} ${H}`}
preserveAspectRatio="none"
role="img"
aria-label="Illustrative mass spectrum: peak intensity across mass-to-charge"
>
<line x1={0} y1={H - pad} x2={W} y2={H - pad} stroke="var(--border)" strokeWidth={1} />
{peaks.map((p, i) => (
<line
key={i}
x1={p.x}
y1={H - pad}
x2={p.x}
y2={p.y}
stroke={p.big ? 'var(--accent-strong)' : 'var(--border-strong)'}
strokeWidth={p.big ? 2 : 1.4}
strokeLinecap="round"
opacity={p.big ? 1 : 0.8}
/>
))}
</svg>
)
}