Dobierz swój rozmiar ramy
Wprowadź wzrost, długość ręki i długość nogi. Kalkulator podpowie rozmiar na podstawie tabeli referencyjnej GreenBike (150–200 cm). Zakres suwaka wzrostu to 150–210 cm – wartości powyżej 200 cm są ekstrapolowane.
| Zakres wzrostu [cm] |
Rozmiar ramy |
Referencyjna dł. ręki [cm] |
Referencyjna dł. nogi [cm] |
;(()=>{
// ====== Dane z arkusza "kalkulator.ods / Arkusz1" ======
// Mapowanie po wzroście co 1 cm (150–200) wraz z przewidywaną długością ręki i nogi.
const SIZE_ROWS = [
{size:"XXS",min:150,max:151},
{size:"XXS/XS",min:152,max:154},
{size:"XS",min:155,max:159},
{size:"XS/S",min:160,max:162},
{size:"S",min:163,max:169},
{size:"S/M",min:170,max:171},
{size:"M",min:172,max:177},
{size:"M/L",min:178,max:180},
{size:"L",min:181,max:187},
{size:"L/XL",min:188,max:192},
{size:"XL",min:193,max:197},
{size:"XXL",min:198,max:200},
];
// Funkcje pomocnicze – wartości referencyjne dla zadanej wysokości h.
const refArm = h => 50 + 0.4*(h-150); // 150→50.0 … 200→70.0
const refLeg = h => Math.round(h - 100); // 150→50 … 200→100 (z arkusza)
const clamp = (v,min,max)=> Math.min(max, Math.max(min, v));
function baseSizeByHeight(h){
for(const r of SIZE_ROWS){ if(h>=r.min && h0.8?1:0) + (legDelta>1.5?1:0); // progi wrażliwości
const downBias = (armDeltaupBias) return {primary:lo, alt:hi};
// neutralnie – zostaw split jako alt
return {primary:sz, alt:null};
}
// Confidence – jak bardzo pomiary odbiegają od referencji
function confidenceLabel(h, arm, leg){
const a0 = refArm(clamp(h,150,200));
const l0 = refLeg(clamp(h,150,200));
const ad = Math.abs(arm-a0);
const ld = Math.abs(leg-l0);
const score = Math.max(ad/1.2, ld/2.0); // 0…~2
if(score=r.min && h<=r.max) row.classList.add('is-match');
const a = refArm(r.min).toFixed(1) + ' – ' + refArm(r.max).toFixed(1);
const l = refLeg(r.min) + ' – ' + refLeg(r.max);
row.innerHTML = `
${r.min}–${r.max} | ${r.size} | ${a} | ${l} | `;
tbody.appendChild(row);
});
}
// Sterowanie UI
const hRange = document.getElementById('wzrost');
const hNum = document.getElementById('wzrost-num');
const aRange = document.getElementById('reka');
const aNum = document.getElementById('reka-num');
const lRange = document.getElementById('noga');
const lNum = document.getElementById('noga-num');
const vH = document.getElementById('val-wzrost');
const vA = document.getElementById('val-reka');
const vL = document.getElementById('val-noga');
const outSize = document.getElementById('gb-size');
const outAlt = document.getElementById('gb-alt');
const outConf = document.getElementById('gb-confidence');
const outNote = document.getElementById('gb-note');
function syncPairs(src, dst){ dst.value = src.value; }
function clampAndSync(input, min, max, decimals=0){
const v = clamp(parseFloat(input.value||0), min, max);
input.value = v.toFixed(decimals);
return v;
}
function calc(){
const H = clampAndSync(hNum, 150, 210, 0);
const A = clampAndSync(aNum, 50, 70, 1);
const L = clampAndSync(lNum, 50, 100, 0);
vH.textContent = H; vA.textContent = A.toFixed(1); vL.textContent = L;
hRange.value = H; aRange.value = A; lRange.value = L;
renderTable(H);
const base = baseSizeByHeight(H);
const splitResolved = resolveSplitSize(base, H, A, L);
const conf = confidenceLabel(H, A, L);
outSize.textContent = splitResolved.primary;
if(splitResolved.alt && splitResolved.primary.includes('/')){
outAlt.style.display = 'inline-block';
outAlt.textContent = `Alternatywnie: ${splitResolved.alt}`;
}else if(splitResolved.alt){
outAlt.style.display = 'inline-block';
outAlt.textContent = `Rozważ także: ${splitResolved.alt}`;
}else{
outAlt.style.display = 'none';
}
outConfidence(conf.label, conf.color);
let note = '';
if(H>200){ note += 'Twój wzrost przekracza zakres danych (200 cm). Sugerujemy kontakt z doradcą – wynik przybliżony. '; }
if(H0?'+':''}${ld} cm.`;
outNote.textContent = note;
}
function outConfidence(label, color){
outConf.style.display = 'inline-block';
outConf.textContent = label;
outConf.style.borderColor = color;
outConf.style.color = color;
outConf.style.background = '#fff';
}
// Syncing events
hRange.addEventListener('input', e=>{ syncPairs(hRange, hNum); calc(); });
aRange.addEventListener('input', e=>{ syncPairs(aRange, aNum); calc(); });
lRange.addEventListener('input', e=>{ syncPairs(lRange, lNum); calc(); });
hNum.addEventListener('input', calc);
aNum.addEventListener('input', calc);
lNum.addEventListener('input', calc);
document.getElementById('btn-calc').addEventListener('click', calc);
document.getElementById('btn-reset').addEventListener('click', ()=>{
hNum.value=175; aNum.value=(refArm(175)).toFixed(1); lNum.value=refLeg(175);
calc();
});
// Initial render
// Ustaw domyślne wartości w oparciu o 175 cm wzrostu
hNum.value = 175; aNum.value = (refArm(175)).toFixed(1); lNum.value = refLeg(175);
hRange.value = 175; aRange.value = aNum.value; lRange.value = lNum.value;
document.getElementById('val-wzrost').textContent = 175;
document.getElementById('val-reka').textContent = aNum.value;
document.getElementById('val-noga').textContent = lNum.value;
renderTable(175);
calc();
})();