// Pro Físico: Physical measurements screen function ProFisico({ onPlayerSelect }) { const { players } = window.TData; const { physicalData, evalDates } = window.TDataExt; const [selected, setSelected] = React.useState(null); const [metric, setMetric] = React.useState("sprint"); if (selected) return setSelected(null)} />; const metrics = [ {key:"sprint", label:"Velocidad 20m", unit:"seg", lower:true}, {key:"salto", label:"Salto vertical",unit:"cm", lower:false}, {key:"agilidad",label:"Agilidad", unit:"seg", lower:true}, {key:"musculo", label:"Masa muscular", unit:"%", lower:false}, {key:"vo2", label:"VO₂ est.", unit:"", lower:false}, ]; const cur = metrics.find(m=>m.key===metric); const sorted = [...players].sort((a,b)=>{ const va = physicalData[a.id]?.latest?.[metric]||0; const vb = physicalData[b.id]?.latest?.[metric]||0; return cur.lower ? va-vb : vb-va; }); const cols = [ {key:"rank", label:"#", color:T.muted}, {key:"player", label:"Jugadora"}, {key:"pos", label:"Posición"}, {key:"altura", label:"Altura", right:true}, {key:"peso", label:"Peso", right:true}, {key:"grasa", label:"Grasa %", right:true, color:T.muted}, {key:"musculo", label:"Músculo %", right:true, bold:true, color:T.accent}, {key:"sprint", label:"Sprint 20m", right:true}, {key:"salto", label:"Salto V.", right:true}, {key:"agilidad",label:"Agilidad", right:true}, {key:"vo2", label:"VO₂ est.", right:true}, {key:"trend", label:"Tendencia", right:true}, ]; const rows = sorted.map((p,i)=>{ const d = physicalData[p.id]; if (!d) return null; const lat = d.latest; const delta = d.delta; const sprintImproved = delta.sprint < 0; const musImproved = delta.musculo > 0; return { _player: p, rank: {i+1}, player: (
#{p.num} {p.name}
), pos: , altura: `${lat.altura} cm`, peso: `${lat.peso} kg`, grasa: `${lat.grasa}%`, musculo: `${lat.musculo}%`, sprint: `${lat.sprint}"`, salto: `${lat.salto} cm`, agilidad:`${lat.agilidad}"`, vo2: lat.vo2, trend: ( 0?T.yellow:T.muted }}> {sprintImproved&&musImproved?"↑ Mejorando":delta.sprint<0||delta.musculo>0?"~ Progresando":"→ Estable"} ), }; }).filter(Boolean); // Team averages (latest eval) const avg = key => (players.reduce((s,p)=>s+(physicalData[p.id]?.latest?.[key]||0),0)/players.length).toFixed(1); return (

Condición Física

Mediciones del equipo · {evalDates[evalDates.length-1]} (última evaluación)

{/* Team KPIs */}
{/* Metric selector */}
Ordenar por: {metrics.map(m=>( ))}
Comparativa por jugadora · haz clic para ver detalle
setSelected(row._player)} />
{/* Eval dates */}
Evaluaciones realizadas: {evalDates.map(d=>( {d} ))}
); } function ProFisicoDetail({ player:p, physData, evalDates, onBack }) { const [tab, setTab] = React.useState("resumen"); if (!physData) return
Sin datos
; const lat = physData.latest; const delta = physData.delta; const accentColor = posColorsP[p.pos]||T.accent; const deltaColor = (val, lower=false) => { if (val === 0) return T.muted; const improved = lower ? val < 0 : val > 0; return improved ? T.green : T.red; }; const deltaStr = (val, unit="") => `${val>0?"+":""}${val}${unit}`; return (
{/* Left */}
{p.name}
#{p.num} ·
Última medición · {lat.date} {[ {l:"Altura", v:`${lat.altura} cm`, d:null}, {l:"Peso", v:`${lat.peso} kg`, d:delta.peso, lower:true, unit:" kg"}, {l:"Grasa corporal", v:`${lat.grasa}%`, d:delta.grasa, lower:true, unit:"%"}, {l:"Masa muscular", v:`${lat.musculo}%`, d:delta.musculo, lower:false, unit:"%"}, {l:"Sprint 20m", v:`${lat.sprint}"`, d:delta.sprint, lower:true, unit:'"'}, {l:"Salto vertical", v:`${lat.salto} cm`, d:delta.salto, lower:false, unit:" cm"}, {l:"Agilidad", v:`${lat.agilidad}"`, d:delta.agilidad,lower:true, unit:'"'}, {l:"VO₂ est.", v:lat.vo2, d:delta.vo2, lower:false, unit:""}, {l:"Fuerza agarre", v:`${lat.fuerza} kg`, d:null}, ].map(s=>(
{s.l}
{s.d !== null && s.d !== undefined && ( {deltaStr(s.d,s.unit)} )} {s.v}
))}
{/* Right */}
{tab==="resumen" && (
0?T.green:T.text} sub={delta.salto>0?`+${delta.salto} cm desde inicio`:"Sin mejora aún"} /> 0?T.green:T.text} sub={delta.musculo>0?`+${delta.musculo}% desde inicio`:"Sin cambio"} />
e.sprint)} labels={evalDates.map(d=>d.slice(5))} color={accentColor} height={130} />

Menor es mejor — mejora visible entre evaluaciones

e.salto)} labels={evalDates.map(d=>d.slice(5))} color={accentColor} height={110} /> {[ {l:"Masa muscular", v:lat.musculo, max:60, color:T.accent}, {l:"Grasa corporal", v:lat.grasa, max:35, color:T.muted}, ].map(s=>(
{s.l} {s.v}%
))}
)} {tab==="progreso" && (
Historial de evaluaciones
({ date:e.date, peso:e.peso, grasa:`${e.grasa}%`, musculo:`${e.musculo}%`, sprint:`${e.sprint}"`, salto:`${e.salto} cm`, agilidad:`${e.agilidad}"`, vo2:e.vo2, fuerza:`${e.fuerza} kg` }))} />
)}
); } window.ProFisico = ProFisico;