/* Pure display transforms for the player profile page (Session 42). CommonJS so it's unit-testable + importable from the .tsx page. */ /** Two-letter mono initials for the hero avatar. */ function initials(name) { const parts = String(name || '').trim().split(/\s+/).filter(Boolean); if (parts.length === 0) return '??'; if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase(); return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase(); } const SPORT_LABELS = { nba: 'NBA', mlb: 'MLB', wnba: 'WNBA', soccer: 'SOC' }; function sportLabel(sport) { return SPORT_LABELS[String(sport || '').toLowerCase()] || String(sport || '').toUpperCase(); } /** Prop DNA → flat list of { prop, state, color } for the grid (reliable first). */ function dnaRows(propDNA) { const dna = propDNA || { reliable: [], volatile: [] }; const pretty = (s) => String(s).replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()); return [ ...(dna.reliable || []).map((p) => ({ prop: pretty(p), state: 'RELIABLE', color: '#00D4A0' })), ...(dna.volatile || []).map((p) => ({ prop: pretty(p), state: 'VOLATILE', color: '#FFB347' })), ]; } /** Short human readout under the DNA bar, e.g. "Primary lane: Power Pull". */ function blendReadout(archetype) { if (!archetype || !archetype.primary) return ''; const prim = archetype.primary.name; const sec = archetype.secondary ? `, supported by ${title(archetype.secondary.name)}` : ''; return `Primary lane: ${title(prim)}${sec}.`; } function title(s) { return String(s || '').toLowerCase().replace(/\b\w/g, (c) => c.toUpperCase()); } module.exports = { initials, sportLabel, dnaRows, blendReadout, title };