/* BT historical comps on player pages v3 */ window.BTHC_INDEX_URL="https://storage.ghost.io/c/f2/85/f285ce72-40e3-409f-ae3b-2ef371936c02/content/files/2026/10/bt-hc-2026c-index.json"; window.BTHC_ALLOW=null; (function __hc(){ var IDX=window.BTHC_INDEX_URL, ALLOW=window.BTHC_ALLOW; if(!IDX)return; var PN={C:'C','1':'1B','2':'2B','3':'3B',S:'SS',L:'LF',M:'CF',R:'RF',O:'OF',D:'DH'}; var PF={C:'catchers','1':'first basemen','2':'second basemen','3':'third basemen',S:'shortstops',L:'left fielders',M:'center fielders',R:'right fielders',O:'outfielders',D:'designated hitters'}; var BS={R:'right-handed hitting',L:'left-handed hitting',B:'switch-hitting'}; var CSS="#bt-hc{margin:28px 0}#bt-hc details{background:#11161f;border:1px solid #2a3444;border-radius:12px;color:#e9eef5}#bt-hc summary{cursor:pointer;list-style:none;padding:14px 16px;display:flex;justify-content:space-between;align-items:center;gap:12px}#bt-hc summary::-webkit-details-marker{display:none}#bt-hc .hc-st{font-size:20px;font-weight:800;color:#fff}#bt-hc .hc-tz{font-size:14px;color:#a9b4c4;margin-top:3px}#bt-hc .hc-ar{font-size:22px;color:#2fa4ff;transition:transform .2s}#bt-hc details[open] .hc-ar{transform:rotate(90deg)}#bt-hc .hc-body{padding:0 16px 16px}#bt-hc .hc-tabs{display:flex;flex-wrap:wrap;gap:8px;margin:4px 0 14px}#bt-hc .hc-btn,#bt-hc .hc-sel{background:#18202c;color:#e9eef5;border:1px solid #2a3444;border-radius:999px;padding:8px 14px;font-size:14px;font-weight:600;cursor:pointer;font-family:inherit}#bt-hc .hc-btn.on,#bt-hc .hc-sel.on{background:#2fa4ff;border-color:#2fa4ff;color:#06121f}#bt-hc .hc-target{border-left:4px solid #d9b25b;background:#18202c;padding:12px 14px;border-radius:8px}#bt-hc .hc-tl{font-weight:800;font-size:17px}#bt-hc .hc-tline{font-size:14px;margin-top:4px}#bt-hc .hc-tnote,#bt-hc .hc-sub{font-size:13px;color:#a9b4c4;margin-top:6px}#bt-hc .hc-h{font-size:18px;font-weight:800;margin:20px 0 6px;color:#fff}#bt-hc .hc-card{background:#18202c;border:1px solid #2a3444;border-radius:10px;padding:12px 14px;margin:10px 0}#bt-hc .hc-dec{font-size:12px;font-weight:800;letter-spacing:.08em;color:#d9b25b;margin-bottom:4px}#bt-hc .hc-top{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}#bt-hc .hc-name{font-weight:800;font-size:16px}#bt-hc .hc-meta{font-size:13px;color:#a9b4c4;margin-top:2px}#bt-hc .hc-tag{display:inline-block;font-size:11px;font-weight:800;background:#3a2f17;color:#d9b25b;border-radius:4px;padding:1px 6px;vertical-align:middle}#bt-hc .hc-sim{text-align:right;line-height:1}#bt-hc .hc-sim b{font-size:22px;color:#2fa4ff}#bt-hc .hc-sim span{display:block;font-size:11px;color:#a9b4c4;margin-top:3px}#bt-hc .hc-bar{height:5px;background:#2a3444;border-radius:3px;margin:8px 0;overflow:hidden}#bt-hc .hc-bar i{display:block;height:100%;background:#2fa4ff}#bt-hc .hc-stats{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:14px}#bt-hc .hc-eq,#bt-hc .hc-after{font-size:13px;color:#a9b4c4;margin-top:6px}#bt-hc .hc-foot{font-size:12px;color:#a9b4c4;margin-top:16px}#bt-hc .hc-lock{background:#18202c;border-radius:10px;padding:16px;text-align:center}#bt-hc .hc-lock a{display:inline-block;margin-top:10px;background:#2fa4ff;color:#06121f;font-weight:800;border-radius:999px;padding:9px 18px;text-decoration:none}"; function f3(x){return x==null?'':Number(x).toFixed(3).replace(/^0/,'');} function n(x){return Number(x).toLocaleString('en-US');} function yrs(a,b){return a===b?String(a):a+'–'+String(b).slice(-2);} function ages(a,b){return a===b?'age '+a:'ages '+a+'–'+b;} function getJ(u){var k='bthc:'+u;try{var c=sessionStorage.getItem(k);if(c)return Promise.resolve(JSON.parse(c));}catch(e){} return fetch(u).then(function(r){return r.json()}).then(function(j){try{if(u===IDX)sessionStorage.setItem(k,JSON.stringify(j));}catch(e){}return j;});} function card(x){var tag=x.t>0?' '+PN[x.p]+'':'';var a=x.af,af; if(a[3]>=2026){af=a[0]?'Afterward so far: '+a[0]+' season'+(a[0]>1?'s':'')+', '+a[1]+' fWAR, '+a[2]+' wRC+':'Active player';} else af=a[0]?'Afterward: '+a[0]+' more season'+(a[0]>1?'s':'')+', '+a[1]+' fWAR, '+a[2]+' wRC+ (career ended '+a[3]+')':'Afterward: none (career ended '+a[3]+')'; var e=x.e;return '
'+(x.d!=null?'
'+x.d+'s
':'')+ '
'+x.n+tag+'
'+yrs(x.y0,x.y1)+' · '+ages(x.a0,x.a1)+' · '+n(x.pa)+' PA
'+x.s+'similarity
'+ '
'+x.w+' wRC+'+x.f+' fWAR'+f3(x.av)+' AVG'+x.hr+' HR'+x.sb+' SB
'+ '
In 2026 terms, per season: '+f3(e[0])+'/'+f3(e[1])+'/'+f3(e[2])+', '+e[3]+' HR, '+e[4]+' SB, '+e[5]+'% BB, '+e[6]+'% K
'+af+'
';} function body(el,P){var modes=[['career','Career'],['last3','Last 3 Seasons'],['last1','Last Season']].filter(function(m){return P.m[m[0]]}); var seas=Object.keys(P.m).filter(function(k){return k[0]==='s'}).map(function(k){return +k.slice(1)}).sort();var st={m:modes.length?modes[0][0]:'s'+seas[seas.length-1]}; function draw(){var R=P.m[st.m],T=R.T,l=T.l; var tabs=modes.map(function(m){return ''}).join('')+ (seas.length?'':''); var h='
'+tabs+'
'+P.n+', '+yrs(T.y0,T.y1)+' ('+ages(T.a0,T.a1)+')
'+ '
'+n(T.pa)+' PA · '+f3(l[0])+'/'+f3(l[1])+'/'+f3(l[2])+' · '+l[3]+' HR · '+l[4]+' SB · '+l[5]+'% BB · '+l[6]+'% K · '+T.w+' wRC+ · '+T.f+' fWAR
'+ '
Compared only with '+(BS[P.b]||'')+' '+(PF[T.p]||'hitters')+' at the same age (within a year)'+(st.m==='career'?', with a similar number of seasons and plate appearances':'')+'.
'+ (R.act?'
Most Similar Active Player

The established player still active in 2026 whose seasons at the same age, at least three years ago, look most like his.

'+card(R.act):'')+'
Five Closest Comps
'+(R.top.length?R.top.map(card).join(''):'

No close matches at his position.

')+ '
Closest Comp by Decade

One player per decade, newest first. A position tag means no '+(PF[T.p]||'player')+' matched closely enough in that decade.

'+R.dec.map(card).join('')+ '

Every stat is measured against its own season, so a 20% strikeout rate in 2001 and a 27% rate in 2026 count the same if both are equally far above that year’s league. wRC+ and fWAR are already adjusted for era and park. Similarity is 100 for an identical profile. Sources: FanGraphs, Lahman Baseball Database, Chadwick Bureau.

'; el.innerHTML=h;el.querySelectorAll('.hc-btn').forEach(function(b){b.onclick=function(){st.m=b.getAttribute('data-m');draw();}}); var s=el.querySelector('.hc-sel');if(s)s.onchange=function(){if(s.value){st.m=s.value;draw();}};} draw();} function mount(){var bp=document.getElementById('bt-player');if(!bp||document.getElementById('bt-hc'))return;var m=+bp.getAttribute('data-mlbam');if(!m)return; if(ALLOW&&ALLOW.indexOf(m)<0)return; var anchor=bp.querySelector('.btp-stats');if(!anchor)return false; getJ(IDX).then(function(ix){var t=ix.t&&ix.t[m];if(!t)return; var st=document.createElement('style');st.textContent=CSS;document.head.appendChild(st); var sec=document.createElement('section');sec.id='bt-hc';sec.className='btp-sec'; sec.innerHTML='
Historical Comps
Closest historical comp: '+t[0]+' ('+t[1]+' similarity) · one comp from every decade since the 1870s
▸
Loading…
'; anchor.parentNode.insertBefore(sec,anchor.nextSibling); var det=sec.querySelector('details'),b=sec.querySelector('.hc-body'),done=false; det.addEventListener('toggle',function(){if(!det.open||done)return;done=true; fetch('/members/api/member/',{credentials:'include'}).then(function(r){return r.status===200}).catch(function(){return false}).then(function(mem){ if(!mem){b.innerHTML='
Historical Comps are free for members.
See the five closest comps and one from every decade, for any season or his whole career.
Sign up free Sign in
';done=false;return;} getJ(ix.shards[m%ix.ns]).then(function(sh){var P=sh[m];if(!P){b.innerHTML='

No comps available.

';return;}body(b,P);}).catch(function(){b.innerHTML='

Could not load comps.

';done=false;});});}); }).catch(function(){});return true;} var tries=0;function tick(){if(mount()===false&&tries++<60)setTimeout(tick,250);} if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',tick);else tick(); })();