Nystrom Gear Ratio & Tire Size Calculator

GearRatioOverallMPH @ 2500RPM @ 65
const ratios=parseRatios(); const rear=parseFloat(rearInput.value)||3.54; const dia=parseFloat(diaInput.value)||28; const refRpm=parseFloat(refRpmInput.value)||2500; const refMph=parseFloat(refMphInput.value)||65; const redline=parseFloat(redlineInput.value)||6000; headRpm.textContent = Math.round(refRpm); headMph.textContent = Math.round(refMph); body.innerHTML=''; ratios.forEach((g,i)=>{ const overall=g*rear; const mph=mphAtRpm(refRpm,dia,overall); const rpm=rpmAtMph(refMph,dia,overall); const row=document.createElement('tr'); row.innerHTML = `${i+1}${g.toFixed(2)}${overall.toFixed(3)}${mph.toFixed(1)}${Math.round(rpm)}`; body.appendChild(row); }); if(!chart){ chart = new Chart(chartEl.getContext('2d'),{type:'line',data:{labels:[],datasets:[]},options:{responsive:true,maintainAspectRatio:false, scales:{ x:{title:{display:true,text:'MPH'},ticks:{color:'#d4d4d8'}, grid:{color:'#333'}}, y:{title:{display:true,text:'RPM'},ticks:{color:'#d4d4d8'}, grid:{color:'#333'}, suggestedMax:9000}}, plugins:{legend:{labels:{color:'#d4d4d8'}}, redline:{value:redline}} },plugins:[{id:'redline', afterDraw(chart,args,opts){ const y=chart.scales.y.getPixelForValue(opts.value||6000); const ctx=chart.ctx; ctx.save(); ctx.strokeStyle='#e06600'; ctx.setLineDash([5,5]); ctx.beginPath(); ctx.moveTo(chart.scales.x.left,y); ctx.lineTo(chart.scales.x.right,y); ctx.stroke(); ctx.fillStyle='#e06600'; ctx.fillText('Redline',chart.scales.x.left+4,y-4); ctx.restore(); }}] }); } const mphs=[]; for(let m=10;m<=90;m+=10){mphs.push(m);} const colors=['#c8a45e','#2dd4bf','#22d3ee','#a78bfa','#fb923c','#94a3b8','#f472b6','#4ade80']; const datasets=ratios.map((g,i)=>{ const overall=g*rear; const data=mphs.map(m=>rpmAtMph(m,dia,overall)); return {label:'Gear '+(i+1),data, borderColor:colors[i%colors.length],borderWidth:2,pointRadius:0,tension:0.25}; }); chart.data.labels=mphs; chart.data.datasets=datasets; chart.options.scales.y.suggestedMax=Math.max(9000,redline+1000); chart.options.plugins.redline.value=redline; chart.update(); } nction(){