From 771d8b0ba4c9814689da6bff905826096a46a1d9 Mon Sep 17 00:00:00 2001 From: Kev Date: Thu, 16 Jul 2026 21:23:59 -0400 Subject: [PATCH] =?UTF-8?q?Rev=203=20glyphs:=20wire=20the=209=20classifier?= =?UTF-8?q?-legacy=20marks=20(74=E2=86=9283),=20all=20backend=20archetypes?= =?UTF-8?q?=20now=20render=20real=20marks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design Rev 3 drew the 9 legacy classifier marks (BRUSH #E0B84A, WHIFF #E86A6A, CONNECTOR #9AB0C4, DISTRIBUTOR #7AB8D8, FASTBREAK #4AA0E8, FLEX #A08AC8, HYBRID #C88AB0, SWITCH #C0B08A, SWITCHBOARD #90A0E8). Wired each to its own Design mark + color (front lib/archetypes.js + backend archetypeService.js, color-synced). These were the 9 NO-MARK backend keys — now none are on a generic placeholder. They're classifier-side fallback renders (never user-facing archetype names, per MANIFEST). Re-imported Rev 3 package over specs/design-reference/ (83 glyph SVGs + MANIFEST regenerated from the authoritative glyphDefs(); HANDOFF Rev 3 note). Co-Authored-By: Claude Opus 4.8 (1M context) --- specs/design-reference/HANDOFF.md | 4 ++ .../assets/glyphs/MANIFEST.md | 11 ++++- .../design-reference/assets/glyphs/brush.svg | 1 + .../assets/glyphs/connector.svg | 1 + .../assets/glyphs/distributor.svg | 1 + .../assets/glyphs/fastbreak.svg | 1 + specs/design-reference/assets/glyphs/flex.svg | 1 + .../design-reference/assets/glyphs/hybrid.svg | 1 + .../design-reference/assets/glyphs/switch.svg | 1 + .../assets/glyphs/switchboard.svg | 1 + .../design-reference/assets/glyphs/whiff.svg | 1 + specs/design-reference/vyndr-system.html | 46 +++++++++++-------- src/services/archetypeService.js | 18 ++++---- web/src/lib/archetypes.js | 29 ++++++++---- 14 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 specs/design-reference/assets/glyphs/brush.svg create mode 100644 specs/design-reference/assets/glyphs/connector.svg create mode 100644 specs/design-reference/assets/glyphs/distributor.svg create mode 100644 specs/design-reference/assets/glyphs/fastbreak.svg create mode 100644 specs/design-reference/assets/glyphs/flex.svg create mode 100644 specs/design-reference/assets/glyphs/hybrid.svg create mode 100644 specs/design-reference/assets/glyphs/switch.svg create mode 100644 specs/design-reference/assets/glyphs/switchboard.svg create mode 100644 specs/design-reference/assets/glyphs/whiff.svg diff --git a/specs/design-reference/HANDOFF.md b/specs/design-reference/HANDOFF.md index 6d43bbc..2e1221a 100644 --- a/specs/design-reference/HANDOFF.md +++ b/specs/design-reference/HANDOFF.md @@ -37,3 +37,7 @@ Desktop /u profile also carries the TIER RECORD calibration strip (matches mobil ## Laws Alive = punctuated stillness (react to truth, then rest). Dense but RANKED — one bold mono hero figure among muted context; dim ranks progressively (1 / .86 / .64 / .48). One animated hero per zone. Real entities always (team-colored monograms until licensed assets drop in — headshot slots marked). No trial: free tier is the trial. Premium is produced, never claimed. + +## Rev 3 (Jul 16) +- Matchup lines carry inline team chips (10-12px before each abbr) — swap for licensed TeamLogo imgs at the same size (resolver built). +- 9 classifier-legacy marks added (BRUSH/WHIFF/CONNECTOR/DISTRIBUTOR/FASTBREAK/FLEX/HYBRID/SWITCH/SWITCHBOARD) — 83 total. Fallback renders, never user-facing names. diff --git a/specs/design-reference/assets/glyphs/MANIFEST.md b/specs/design-reference/assets/glyphs/MANIFEST.md index 02b2a53..4c790ae 100644 --- a/specs/design-reference/assets/glyphs/MANIFEST.md +++ b/specs/design-reference/assets/glyphs/MANIFEST.md @@ -75,6 +75,15 @@ | AGGRESSOR | `#FF6B4A` | `assets/glyphs/aggressor.svg` | | SURGEON | `#7AA6D8` | `assets/glyphs/surgeon.svg` | | TOPSPIN | `#B36CFF` | `assets/glyphs/topspin.svg` | +| BRUSH | `#E0B84A` | `assets/glyphs/brush.svg` | +| WHIFF | `#E86A6A` | `assets/glyphs/whiff.svg` | +| CONNECTOR | `#9AB0C4` | `assets/glyphs/connector.svg` | +| DISTRIBUTOR | `#7AB8D8` | `assets/glyphs/distributor.svg` | +| FASTBREAK | `#4AA0E8` | `assets/glyphs/fastbreak.svg` | +| FLEX | `#A08AC8` | `assets/glyphs/flex.svg` | +| HYBRID | `#C88AB0` | `assets/glyphs/hybrid.svg` | +| SWITCH | `#C0B08A` | `assets/glyphs/switch.svg` | +| SWITCHBOARD | `#90A0E8` | `assets/glyphs/switchboard.svg` | | RETURNER | `#6C9CB0` | `assets/glyphs/returner.svg` | -Marks use `currentColor` — recolor by setting CSS `color` on the svg or a wrapper. +Marks use `currentColor`. 74 display names + 9 classifier-legacy aliases (never user-facing). diff --git a/specs/design-reference/assets/glyphs/brush.svg b/specs/design-reference/assets/glyphs/brush.svg new file mode 100644 index 0000000..683b5a6 --- /dev/null +++ b/specs/design-reference/assets/glyphs/brush.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/connector.svg b/specs/design-reference/assets/glyphs/connector.svg new file mode 100644 index 0000000..92b927b --- /dev/null +++ b/specs/design-reference/assets/glyphs/connector.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/distributor.svg b/specs/design-reference/assets/glyphs/distributor.svg new file mode 100644 index 0000000..bef6c00 --- /dev/null +++ b/specs/design-reference/assets/glyphs/distributor.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/fastbreak.svg b/specs/design-reference/assets/glyphs/fastbreak.svg new file mode 100644 index 0000000..f4b1fb1 --- /dev/null +++ b/specs/design-reference/assets/glyphs/fastbreak.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/flex.svg b/specs/design-reference/assets/glyphs/flex.svg new file mode 100644 index 0000000..bae259f --- /dev/null +++ b/specs/design-reference/assets/glyphs/flex.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/hybrid.svg b/specs/design-reference/assets/glyphs/hybrid.svg new file mode 100644 index 0000000..7e76c33 --- /dev/null +++ b/specs/design-reference/assets/glyphs/hybrid.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/switch.svg b/specs/design-reference/assets/glyphs/switch.svg new file mode 100644 index 0000000..52ff040 --- /dev/null +++ b/specs/design-reference/assets/glyphs/switch.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/switchboard.svg b/specs/design-reference/assets/glyphs/switchboard.svg new file mode 100644 index 0000000..14e1159 --- /dev/null +++ b/specs/design-reference/assets/glyphs/switchboard.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/assets/glyphs/whiff.svg b/specs/design-reference/assets/glyphs/whiff.svg new file mode 100644 index 0000000..ed61c1b --- /dev/null +++ b/specs/design-reference/assets/glyphs/whiff.svg @@ -0,0 +1 @@ + diff --git a/specs/design-reference/vyndr-system.html b/specs/design-reference/vyndr-system.html index 5f2587f..47b8a04 100644 --- a/specs/design-reference/vyndr-system.html +++ b/specs/design-reference/vyndr-system.html @@ -225,13 +225,13 @@
01 -
Jokić o27.5 PTS
NBA · DEN @ MIN
+
Jokić o27.5 PTS
NBA · DEN @ MIN
A+ +8.4%
02 -
Skenes o6.5 K
MLB · PIT @ CHC
+
Skenes o6.5 K
MLB · PIT @ CHC
A +6.1%
@@ -243,7 +243,7 @@
04 -
Judge o1.5 TB
MLB · NYY @ BOS
+
Judge o1.5 TB
MLB · NYY @ BOS
B +3.4%
@@ -261,7 +261,7 @@
07 -
Betts o1.5 TB
MLB · LAD @ SD
+
Betts o1.5 TB
MLB · LAD @ SD
C +2.1%
@@ -279,7 +279,7 @@
10 -
LaVine o22.5 PTS
NBA · CHI @ MIL
+
LaVine o22.5 PTS
NBA · CHI @ MIL
D -1.2%
@@ -409,7 +409,7 @@ 28.6
#4 of 82 C
-
vs MIN allows 26.1
+
vs MIN allows 26.1
@@ -535,7 +535,7 @@
ARCHETYPE GLYPHS - FULL SYSTEM · 74 UNIQUE MARKS · 8 SPORTS + FULL SYSTEM · 83 UNIQUE MARKS · 8 SPORTS + CLASSIFIER LEGACY
@@ -759,19 +759,19 @@
RECENT SETTLED
-
Jokić o27.5 PTS
DEN · settled 30 · CLV +2.4%
+
Jokić o27.5 PTS
DEN · settled 30 · CLV +2.4%
AHIT
-
Judge o1.5 TB
NYY · settled 2 · CLV +1.1%
+
Judge o1.5 TB
NYY · settled 2 · CLV +1.1%
BHIT
-
Edwards o5.5 REB
MIN · settled 4 · CLV −0.8%
+
Edwards o5.5 REB
MIN · settled 4 · CLV −0.8%
CMISS
-
Skenes o6.5 K
PIT · settled 8 · CLV +4.0%
+
Skenes o6.5 K
PIT · settled 8 · CLV +4.0%
A+HIT
@@ -981,7 +981,7 @@
LIVE GRADE
- Q3 4:12 · DEN @ MIN + Q3 4:12 · DEN @ MIN
@@ -1073,7 +1073,7 @@
PIT
Paul SkenesCONFIRMED
-
RHP · #30 · Pittsburgh · vs CHC
+
RHP · #30 · Pittsburgh · vs CHC
IDENTITY BLEND
@@ -1126,25 +1126,25 @@
-
Jokić o27.5 PTS
NBA · DEN @ MIN
+
Jokić o27.5 PTS
NBA · DEN @ MIN
A+ +105
-
Edwards o5.5 AST
NBA · DEN @ MIN
+
Edwards o5.5 AST
NBA · DEN @ MIN
A +130
-
Skenes o6.5 K
MLB · PIT @ CHC
+
Skenes o6.5 K
MLB · PIT @ CHC
A -120
-
Judge o1.5 TB
MLB · NYY @ BOS
+
Judge o1.5 TB
MLB · NYY @ BOS
B +140
@@ -1282,6 +1282,15 @@ class Component extends DCLogic { AGGRESSOR:{c:'#FF6B4A',g:''}, SURGEON:{c:'#7AA6D8',g:''}, TOPSPIN:{c:'#B36CFF',g:''}, + BRUSH:{c:'#E0B84A',g:''}, + WHIFF:{c:'#E86A6A',g:''}, + CONNECTOR:{c:'#9AB0C4',g:''}, + DISTRIBUTOR:{c:'#7AB8D8',g:''}, + FASTBREAK:{c:'#4AA0E8',g:''}, + FLEX:{c:'#A08AC8',g:''}, + HYBRID:{c:'#C88AB0',g:''}, + SWITCH:{c:'#C0B08A',g:''}, + SWITCHBOARD:{c:'#90A0E8',g:''}, RETURNER:{c:'#6C9CB0',g:''} }; } @@ -1295,7 +1304,8 @@ class Component extends DCLogic { {sport:'HOCKEY', names:['SNIPER','SETUP','WALL','REARGUARD','PEST','WORKHORSE','ENFORCER','SPARK','VAULT','HOWITZER']}, {sport:'SOCCER', names:['FINISHER','MAESTRO','TOWER','MOTOR','BLADE','WALL']}, {sport:'BOXING / MMA', names:['PRESSURE','COUNTER','TECHNICIAN','SLUGGER','PHANTOM','SOUTHPAW','GRAPPLER','STRIKER','IRON','FINISHER']}, - {sport:'TENNIS', names:['CANNON','GRINDER','AGGRESSOR','SURGEON','TOPSPIN','RETURNER']} + {sport:'TENNIS', names:['CANNON','GRINDER','AGGRESSOR','SURGEON','TOPSPIN','RETURNER']}, + {sport:'CLASSIFIER LEGACY · BASKETBALL / BASEBALL', names:['BRUSH','WHIFF','CONNECTOR','DISTRIBUTOR','FASTBREAK','FLEX','HYBRID','SWITCH','SWITCHBOARD']} ]; } diff --git a/src/services/archetypeService.js b/src/services/archetypeService.js index 0610211..d6d7301 100644 --- a/src/services/archetypeService.js +++ b/src/services/archetypeService.js @@ -55,13 +55,13 @@ const ARCHETYPES = { education: 'Dual Threats score and create in equal measure, so points and assists both stay in play. Rebounds are the volatile leg for their size.', }, CONNECTOR: { - legacyName: 'ROLE GLUE', tag: 'CONNECTOR', sport: 'nba', color: '#9499A8', glyph: 'chain', + legacyName: 'ROLE GLUE', tag: 'CONNECTOR', sport: 'nba', color: '#9AB0C4', glyph: 'chain', description: 'Low-usage specialist', propDNA: { reliable: [], volatile: ['points', 'assists', 'rebounds'] }, education: 'Connectors do the little things at low usage. Their counting props are thin and matchup-dependent — they reward unders more often than overs.', }, FASTBREAK: { - legacyName: 'TRANSITION ENGINE', tag: 'FASTBREAK', sport: 'nba', color: '#22D3EE', glyph: 'chevrons', + legacyName: 'TRANSITION ENGINE', tag: 'FASTBREAK', sport: 'nba', color: '#4AA0E8', glyph: 'chevrons', description: 'Pace-pushing fast-break threat', propDNA: { reliable: ['points'], volatile: ['assists', 'threes'] }, education: 'Fastbreaks feast in the open floor. Their points correlate with game pace — target overs in projected up-tempo matchups.', @@ -79,7 +79,7 @@ const ARCHETYPES = { education: 'Lockdowns earn minutes with their on-ball defense. Steals and blocks carry their card; offensive props are low-volume and streaky.', }, SWITCHBOARD: { - legacyName: 'POINT FORWARD', tag: 'SWITCHBOARD', sport: 'nba', color: '#38BDF8', glyph: 'half', + legacyName: 'POINT FORWARD', tag: 'SWITCHBOARD', sport: 'nba', color: '#90A0E8', glyph: 'half', description: 'Oversized primary creator', propDNA: { reliable: ['points', 'assists', 'rebounds'], volatile: ['threes'] }, education: 'Switchboards run the offense from a wing or big body, so points, assists, and rebounds all stay live. Their three-point output is the swing factor.', @@ -111,7 +111,7 @@ const ARCHETYPES = { // ───────── WNBA-unique (5) ───────── DISTRIBUTOR: { - legacyName: 'POST FACILITATOR', tag: 'DISTRIBUTOR', sport: 'wnba', color: '#C084FC', glyph: 'node', + legacyName: 'POST FACILITATOR', tag: 'DISTRIBUTOR', sport: 'wnba', color: '#7AB8D8', glyph: 'node', description: 'Playmaking hub from the post', propDNA: { reliable: ['assists', 'rebounds'], volatile: ['threes'] }, education: 'Distributors orchestrate from the elbow and block. Assists and rebounds are reliable; perimeter shooting is the volatile leg.', @@ -149,7 +149,7 @@ const ARCHETYPES = { education: 'Bombers drive the ball over the fence. Total bases and home-run props carry their value; their batting-average-driven props (hits) are the volatile leg from strikeout risk.', }, BRUSH: { - legacyName: 'CONTACT', tag: 'BRUSH', sport: 'mlb', color: '#C0C63C', glyph: 'crosshair', + legacyName: 'CONTACT', tag: 'BRUSH', sport: 'mlb', color: '#E0B84A', glyph: 'crosshair', description: 'High average, low strikeout', propDNA: { reliable: ['hits'], volatile: ['home_runs', 'total_bases'] }, education: 'Brush hitters rarely strike out, so their hits props are among the most reliable in baseball. Power props (HR, TB) are the volatile leg.', @@ -167,7 +167,7 @@ const ARCHETYPES = { education: 'Alphas miss bats and go deep. Strikeout and innings props are their most reliable; earned-run props are noisier because one swing can change a line.', }, WHIFF: { - legacyName: 'STRIKEOUT ARTIST', tag: 'WHIFF', sport: 'mlb', color: '#FFB347', glyph: 'bolt', + legacyName: 'STRIKEOUT ARTIST', tag: 'WHIFF', sport: 'mlb', color: '#E86A6A', glyph: 'bolt', description: 'Bat-missing arm, high K with traffic', propDNA: { reliable: ['strikeouts'], volatile: ['earned_runs', 'innings_pitched'] }, education: 'Whiffs rack up strikeouts but allow more baserunners than an Alpha. The strikeout prop is reliable; earned-run and innings props swing with their traffic.', @@ -179,13 +179,13 @@ const ARCHETYPES = { education: 'Ghosts turn singles into runs. Stolen-base and runs props are their lane; power props rarely clear.', }, HYBRID: { - legacyName: 'TWO-WAY PLAYER', tag: 'HYBRID', sport: 'mlb', color: '#F472B6', glyph: 'half', + legacyName: 'TWO-WAY PLAYER', tag: 'HYBRID', sport: 'mlb', color: '#C88AB0', glyph: 'half', description: 'Bats and pitches at elite level', propDNA: { reliable: ['total_bases', 'strikeouts'], volatile: ['hits'] }, education: 'Hybrids produce on both sides of the ball. Read which role they fill that day — their batting and pitching props live on different lines.', }, FLEX: { - legacyName: 'UTILITY PLAYER', tag: 'FLEX', sport: 'mlb', color: '#22D3EE', glyph: 'plus', + legacyName: 'UTILITY PLAYER', tag: 'FLEX', sport: 'mlb', color: '#A08AC8', glyph: 'plus', description: 'Multi-position lineup flex', propDNA: { reliable: [], volatile: ['hits', 'total_bases', 'rbi'] }, education: 'Flex players move around the lineup and the diamond. Their props are matchup- and slot-dependent — confirm they are starting before betting.', @@ -227,7 +227,7 @@ const ARCHETYPES = { education: 'Bridges throw short, high-leverage outings. Strikeout props can hit in one inning; innings and earned-run props are too small a sample to trust.', }, SWITCH: { - legacyName: 'DEFENSIVE WIZARD', tag: 'SWITCH', sport: 'mlb', color: '#FF5C5C', glyph: 'batball', + legacyName: 'DEFENSIVE WIZARD', tag: 'SWITCH', sport: 'mlb', color: '#C0B08A', glyph: 'batball', description: 'Platoon-leveraged, glove-first bat', propDNA: { reliable: [], volatile: ['hits', 'total_bases', 'rbi'] }, education: 'Switch bats earn their spot with the glove and favorable platoon splits. Their offensive props are thin and matchup-dependent — lean unders outside their platoon edge.', diff --git a/web/src/lib/archetypes.js b/web/src/lib/archetypes.js index e3e7c81..3a6a8d2 100644 --- a/web/src/lib/archetypes.js +++ b/web/src/lib/archetypes.js @@ -8,6 +8,17 @@ /* Glyph SVG inner-markup keyed by name (drawn in a 0 0 16 16 viewBox). */ const GLYPHS = { + /* Rev 3 — 9 classifier-legacy marks (fallback renders, never user-facing) */ + 'brush': '', + 'whiff': '', + 'connector': '', + 'distributor': '', + 'fastbreak': '', + 'flex': '', + 'hybrid': '', + 'switch': '', + 'switchboard': '', + /* Design 74-mark library — real archetype marks (HANDOFF) */ 'alpha': '', 'anchor': '', @@ -75,37 +86,37 @@ const ARCHETYPE_MAP = { ARTILLERY: { c: '#C98A5A', d: 'Floor-spacing shooting big', g: 'artillery', legacy: 'STRETCH BIG' }, SURGE: { c: '#FFA24A', d: 'Usage spikes when stars sit', g: 'surge', legacy: 'USAGE SPONGE' }, 'DUAL THREAT': { c: '#1EA6D8', d: 'Scoring + playmaking hybrid', g: 'twin', legacy: 'COMBO GUARD' }, - CONNECTOR: { c: '#9499A8', d: 'Low-usage specialist', g: 'chain', legacy: 'ROLE GLUE' }, - FASTBREAK: { c: '#22D3EE', d: 'Pace-pushing fast-break threat', g: 'chevrons', legacy: 'TRANSITION ENGINE' }, + CONNECTOR: { c: '#9AB0C4', d: 'Low-usage specialist', g: 'connector', legacy: 'ROLE GLUE' }, + FASTBREAK: { c: '#4AA0E8', d: 'Pace-pushing fast-break threat', g: 'fastbreak', legacy: 'TRANSITION ENGINE' }, 'PAINT BOSS': { c: '#FF5C5C', d: 'Back-to-basket interior scorer', g: 'postup', legacy: 'POST SCORER' }, LOCKDOWN: { c: '#5A6474', d: 'Perimeter stopper, low usage', g: 'lockdown', legacy: 'DEFENSIVE SPECIALIST' }, - SWITCHBOARD: { c: '#38BDF8', d: 'Oversized primary creator', g: 'half', legacy: 'POINT FORWARD' }, + SWITCHBOARD: { c: '#90A0E8', d: 'Oversized primary creator', g: 'switchboard', legacy: 'POINT FORWARD' }, ARCHITECT: { c: '#B07CFF', d: 'Self-created shot maker, rim-attacking', g: 'architect', legacy: 'SLASHER' }, PISTON: { c: '#E87B4A', d: 'Lob and putback finisher', g: 'piston', legacy: 'RIM RUNNER' }, SENTINEL: { c: '#4FA0C4', d: 'Catch-and-shoot plus defense', g: 'sentinel', legacy: '3-AND-D' }, IGNITER: { c: '#FF8A3D', d: 'Bench scoring spark', g: 'igniter', legacy: 'SIXTH MAN' }, // WNBA-unique - DISTRIBUTOR: { c: '#C084FC', d: 'Playmaking hub from the post', g: 'node', legacy: 'POST FACILITATOR' }, + DISTRIBUTOR: { c: '#7AB8D8', d: 'Playmaking hub from the post', g: 'distributor', legacy: 'POST FACILITATOR' }, SHIELD: { c: '#5A8CA8', d: 'Two-way perimeter forward', g: 'shield', legacy: 'TWO-WAY WING' }, RANGE: { c: '#C77CE0', d: 'Floor-spacing forward', g: 'range', legacy: 'STRETCH FORWARD' }, SPARK: { c: '#F0A93D', d: 'Downhill scoring guard', g: 'spark', legacy: 'SLASHING GUARD' }, ANCHOR: { c: '#4C86C4', d: 'Dominant paint defender and rebounder', g: 'anchor', legacy: 'INTERIOR ANCHOR' }, // MLB BOMBER: { c: '#FF9F45', d: 'Middle-of-the-order power producer', g: 'bomber', legacy: 'POWER SLUGGER' }, - BRUSH: { c: '#C0C63C', d: 'High average, low strikeout', g: 'crosshair', legacy: 'CONTACT' }, + BRUSH: { c: '#E0B84A', d: 'High average, low strikeout', g: 'brush', legacy: 'CONTACT' }, DRIVER: { c: '#5A7D9A', d: 'RBI-dependent, lineup context', g: 'driver', legacy: 'RUN PRODUCER' }, ALPHA: { c: '#7C5CFF', d: 'High K/9, low WHIP, deep games', g: 'alpha', legacy: 'ACE' }, - WHIFF: { c: '#FFB347', d: 'Bat-missing arm, high K with traffic', g: 'bolt', legacy: 'STRIKEOUT ARTIST' }, + WHIFF: { c: '#E86A6A', d: 'Bat-missing arm, high K with traffic', g: 'whiff', legacy: 'STRIKEOUT ARTIST' }, GHOST: { c: '#3FD8E0', d: 'Stolen bases, speed score', g: 'ghost', legacy: 'SPEED THREAT' }, - HYBRID: { c: '#F472B6', d: 'Bats and pitches at elite level', g: 'half', legacy: 'TWO-WAY PLAYER' }, - FLEX: { c: '#22D3EE', d: 'Multi-position lineup flex', g: 'plus', legacy: 'UTILITY PLAYER' }, + HYBRID: { c: '#C88AB0', d: 'Bats and pitches at elite level', g: 'hybrid', legacy: 'TWO-WAY PLAYER' }, + FLEX: { c: '#A08AC8', d: 'Multi-position lineup flex', g: 'flex', legacy: 'UTILITY PLAYER' }, WORKHORSE: { c: '#C89B5A', d: 'Durable, deep-start arm', g: 'workhorse', legacy: 'INNINGS EATER' }, CATALYST: { c: '#E88AC0', d: 'On-base leadoff catalyst', g: 'catalyst', legacy: 'TABLE SETTER' }, MIRROR: { c: '#B0B6C8', d: 'Gap-to-gap line-drive bat', g: 'mirror', legacy: 'GAP HITTER' }, HAMMER: { c: '#FF4D6D', d: 'Ninth-inning save specialist', g: 'hammer', legacy: 'CLOSER' }, SINKER: { c: '#5A9AB0', d: 'Groundball spot-starter / long relief', g: 'sinker', legacy: 'SWINGMAN' }, BRIDGE: { c: '#6C9CB0', d: 'Setup / high-leverage middle relief', g: 'bridge', legacy: 'BULLPEN ARM' }, - SWITCH: { c: '#FF5C5C', d: 'Platoon-leveraged, glove-first bat', g: 'batball', legacy: 'DEFENSIVE WIZARD' }, + SWITCH: { c: '#C0B08A', d: 'Platoon-leveraged, glove-first bat', g: 'switch', legacy: 'DEFENSIVE WIZARD' }, // Soccer FINISHER: { c: '#FF5C5C', d: 'Penalty-box finisher', g: 'crosshair', legacy: 'POACHER' }, MAESTRO: { c: '#D9A441', d: 'Chance-creating playmaker', g: 'maestro', legacy: 'CREATOR' },