Rev 3 glyphs: wire the 9 classifier-legacy marks (74→83), all backend archetypes now render real marks

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) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-16 21:23:59 -04:00
parent ebaab007d4
commit 771d8b0ba4
14 changed files with 80 additions and 37 deletions
+4
View File
@@ -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.
@@ -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).
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" d="M5 19 15 9"/><path fill="currentColor" fill-opacity=".2" d="M15 9l4-4 1.6 1.6-4 4z"/><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M15 9l4-4M5 19l-1 1M7 20l-2 1"/></svg>

After

Width:  |  Height:  |  Size: 389 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><circle cx="6" cy="7" r="2.4" fill="currentColor"/><circle cx="18" cy="17" r="2.4" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" d="M8 8.5C13 11 11 13 16 15.5"/></svg>

After

Width:  |  Height:  |  Size: 320 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><circle cx="12" cy="12" r="2.6" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 9V4M10 6l2-2 2 2M9.5 13.8 5 16.5M7.5 14.2l-2.5 2.3.8 3.2M14.5 13.8 19 16.5M16.5 14.2l2.5 2.3-.8 3.2"/></svg>

After

Width:  |  Height:  |  Size: 368 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><path fill="currentColor" fill-opacity=".18" d="M10 5l8 7-8 7z"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" d="M10 5l8 7-8 7z"/><path stroke="currentColor" stroke-width="2.2" stroke-linecap="round" d="M5 8h3M4 12h4M5 16h3"/></svg>

After

Width:  |  Height:  |  Size: 364 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M8 4C4 8 4 16 8 20M16 4c4 4 4 12 0 16"/><circle cx="12" cy="12" r="2" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 278 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><circle cx="10" cy="12" r="6" fill="none" stroke="currentColor" stroke-width="2"/><path fill="currentColor" fill-opacity=".18" d="M15 6l6 12H9z"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" d="M15 6l6 12H9z"/></svg>

After

Width:  |  Height:  |  Size: 348 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round" d="M5 8h11M13 4l4 4-4 4M19 16H8M11 12l-4 4 4 4"/></svg>

After

Width:  |  Height:  |  Size: 257 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><circle cx="6" cy="6" r="1.8" fill="currentColor"/><circle cx="18" cy="6" r="1.8" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="6" cy="18" r="1.8" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="18" cy="18" r="1.8" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M7.5 7.5c4 4 5 4 9 9"/></svg>

After

Width:  |  Height:  |  Size: 482 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none"><path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M4 16c5 3 11 3 16-2"/><path fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-dasharray="2.5 3" d="M4 11c5 3 10 3 15-1.5"/><circle cx="18" cy="6" r="2.2" fill="currentColor"/></svg>

After

Width:  |  Height:  |  Size: 395 B

+28 -18
View File
@@ -225,13 +225,13 @@
<div data-row="jokic" style="--o:1;opacity:1;display:grid;grid-template-columns:20px 1fr auto 58px;align-items:center;gap:12px;padding:9px 16px;border-top:1px solid #101018;box-shadow:inset 2px 0 0 rgba(0,212,160,.55);animation:vy-rowin .5s cubic-bezier(.2,.8,.2,1) both;animation-delay:.14s">
<span class="mono" style="font-size:11px;color:#00D4A0;font-weight:700">01</span>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#4C8BF5;flex:none"></span><span style="font-size:13px;font-weight:700">Jokić <span style="color:#B8BCC8;font-weight:500">o27.5 PTS</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">NBA · DEN @ MIN</div></div>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#4C8BF5;flex:none"></span><span style="font-size:13px;font-weight:700">Jokić <span style="color:#B8BCC8;font-weight:500">o27.5 PTS</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">NBA · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0E4DA4,#4C8BF5);vertical-align:-1.5px;margin-right:3px"></span>DEN @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0C2340,#236192);vertical-align:-1.5px;margin-right:3px"></span>MIN</div></div>
<span class="mono" style="justify-self:end;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.14);color:#00D4A0;font-weight:800;font-size:10.5px;border:1px solid rgba(0,212,160,.3)">A+</span>
<span class="mono" data-react data-fmt="edge" style="justify-self:end;text-align:right;font-size:12.5px;font-weight:700;color:#00D4A0;padding:1px 4px;border-radius:5px">+8.4%</span>
</div>
<div data-row="skenes" style="--o:1;opacity:1;display:grid;grid-template-columns:20px 1fr auto 58px;align-items:center;gap:12px;padding:9px 16px;border-top:1px solid #101018;animation:vy-rowin .5s cubic-bezier(.2,.8,.2,1) both;animation-delay:.2s">
<span class="mono" style="font-size:11px;color:#707080;font-weight:600">02</span>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#C9A227;flex:none"></span><span style="font-size:13px;font-weight:700">Skenes <span style="color:#B8BCC8;font-weight:500">o6.5 K</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">MLB · PIT @ CHC</div></div>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#C9A227;flex:none"></span><span style="font-size:13px;font-weight:700">Skenes <span style="color:#B8BCC8;font-weight:500">o6.5 K</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">MLB · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#2b2b2b,#c9a227);vertical-align:-1.5px;margin-right:3px"></span>PIT @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0E3386,#CC3433);vertical-align:-1.5px;margin-right:3px"></span>CHC</div></div>
<span class="mono" style="justify-self:end;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.1);color:#00D4A0;font-weight:800;font-size:10.5px;border:1px solid rgba(0,212,160,.24)">A</span>
<span class="mono" data-react data-fmt="edge" style="justify-self:end;text-align:right;font-size:12.5px;font-weight:700;color:#00D4A0;padding:1px 4px;border-radius:5px">+6.1%</span>
</div>
@@ -243,7 +243,7 @@
</div>
<div data-row="judge" style="--o:.86;opacity:.86;display:grid;grid-template-columns:20px 1fr auto 58px;align-items:center;gap:12px;padding:9px 16px;border-top:1px solid #101018;animation:vy-rowin .5s cubic-bezier(.2,.8,.2,1) both;animation-delay:.32s">
<span class="mono" style="font-size:11px;color:#707080;font-weight:600">04</span>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#1b3a6b;flex:none"></span><span style="font-size:13px;font-weight:600">Judge <span style="color:#B8BCC8;font-weight:500">o1.5 TB</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">MLB · NYY @ BOS</div></div>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#1b3a6b;flex:none"></span><span style="font-size:13px;font-weight:600">Judge <span style="color:#B8BCC8;font-weight:500">o1.5 TB</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">MLB · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#1b3a6b,#0C2340);vertical-align:-1.5px;margin-right:3px"></span>NYY @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#BD3039,#6b1c22);vertical-align:-1.5px;margin-right:3px"></span>BOS</div></div>
<span class="mono" style="justify-self:end;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:#14141E;color:#F0F0F0;font-weight:800;font-size:10.5px;border:1px solid #1E1E2A">B</span>
<span class="mono" data-react data-fmt="edge" style="justify-self:end;text-align:right;font-size:12.5px;font-weight:700;color:#00D4A0;padding:1px 4px;border-radius:5px">+3.4%</span>
</div>
@@ -261,7 +261,7 @@
</div>
<div data-row="betts" style="--o:.64;opacity:.64;display:grid;grid-template-columns:20px 1fr auto 58px;align-items:center;gap:12px;padding:9px 16px;border-top:1px solid #101018;animation:vy-rowin .5s cubic-bezier(.2,.8,.2,1) both;animation-delay:.5s">
<span class="mono" style="font-size:11px;color:#707080;font-weight:600">07</span>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#2f7fd0;flex:none"></span><span style="font-size:13px;font-weight:600">Betts <span style="color:#B8BCC8;font-weight:500">o1.5 TB</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">MLB · LAD @ SD</div></div>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#2f7fd0;flex:none"></span><span style="font-size:13px;font-weight:600">Betts <span style="color:#B8BCC8;font-weight:500">o1.5 TB</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">MLB · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#005A9C,#2f7fd0);vertical-align:-1.5px;margin-right:3px"></span>LAD @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#2F241D,#8a6d4a);vertical-align:-1.5px;margin-right:3px"></span>SD</div></div>
<span class="mono" style="justify-self:end;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:#14141E;color:#B8BCC8;font-weight:800;font-size:10.5px;border:1px solid #1E1E2A">C</span>
<span class="mono" data-react data-fmt="edge" style="justify-self:end;text-align:right;font-size:12.5px;font-weight:700;color:#00D4A0;padding:1px 4px;border-radius:5px">+2.1%</span>
</div>
@@ -279,7 +279,7 @@
</div>
<div data-row="lavine" style="--o:.48;opacity:.48;display:grid;grid-template-columns:20px 1fr auto 58px;align-items:center;gap:12px;padding:9px 16px;border-top:1px solid #101018;animation:vy-rowin .5s cubic-bezier(.2,.8,.2,1) both;animation-delay:.68s">
<span class="mono" style="font-size:11px;color:#707080;font-weight:600">10</span>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#CE1141;flex:none"></span><span style="font-size:13px;font-weight:600">LaVine <span style="color:#B8BCC8;font-weight:500">o22.5 PTS</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">NBA · CHI @ MIL</div></div>
<div style="min-width:0"><div style="display:flex;align-items:center;gap:8px"><span style="width:7px;height:7px;border-radius:2px;background:#CE1141;flex:none"></span><span style="font-size:13px;font-weight:600">LaVine <span style="color:#B8BCC8;font-weight:500">o22.5 PTS</span></span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:3px;padding-left:15px">NBA · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#CE1141,#6d0a22);vertical-align:-1.5px;margin-right:3px"></span>CHI @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#00471B,#0a7a3a);vertical-align:-1.5px;margin-right:3px"></span>MIL</div></div>
<span class="mono" style="justify-self:end;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(255,71,87,.1);color:#FF4757;font-weight:800;font-size:10.5px;border:1px solid rgba(255,71,87,.28)">D</span>
<span class="mono" data-react data-fmt="edge" style="justify-self:end;text-align:right;font-size:12.5px;font-weight:700;color:#FF4757;padding:1px 4px;border-radius:5px">-1.2%</span>
</div>
@@ -409,7 +409,7 @@
<span class="mono" style="font-size:46px;font-weight:800;line-height:.9;color:#F0F0F0">28.6</span>
<div style="padding-bottom:6px">
<div class="mono" style="font-size:11px;color:#00D4A0;font-weight:700">#4 <span style="color:#707080;font-weight:400">of 82 C</span></div>
<div class="mono" style="font-size:10px;color:#707080">vs MIN allows 26.1</div>
<div class="mono" style="font-size:10px;color:#707080">vs <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0C2340,#236192);vertical-align:-1.5px;margin-right:3px"></span>MIN allows 26.1</div>
</div>
</div>
<div style="display:flex;align-items:center;gap:4px;margin-top:14px">
@@ -535,7 +535,7 @@
<div id="glyphs" data-screen-label="Archetype glyphs" style="margin-top:64px">
<div style="display:flex;align-items:center;gap:12px;margin-bottom:6px">
<span class="mono" style="font-size:12px;letter-spacing:.28em;color:#F0F0F0;font-weight:700">ARCHETYPE GLYPHS</span>
<span class="mono" style="font-size:10.5px;letter-spacing:.18em;color:#707080">FULL SYSTEM · 74 UNIQUE MARKS · 8 SPORTS</span>
<span class="mono" style="font-size:10.5px;letter-spacing:.18em;color:#707080">FULL SYSTEM · 83 UNIQUE MARKS · 8 SPORTS + CLASSIFIER LEGACY</span>
</div>
<div style="height:1px;background:#14141E;margin:14px 0 20px"></div>
@@ -759,19 +759,19 @@
<div class="mono" style="font-size:10px;letter-spacing:.2em;color:#B8BCC8;margin-bottom:16px">RECENT SETTLED</div>
<div style="display:flex;flex-direction:column;gap:2px">
<div style="display:flex;align-items:center;justify-content:space-between;padding:9px 0;border-bottom:1px solid #12121A">
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Jokić o27.5 PTS</div><div class="mono" style="font-size:9.5px;color:#707080">DEN · settled 30 · CLV +2.4%</div></div>
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Jokić o27.5 PTS</div><div class="mono" style="font-size:9.5px;color:#707080"><span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0E4DA4,#4C8BF5);vertical-align:-1.5px;margin-right:3px"></span>DEN · settled 30 · CLV +2.4%</div></div>
<div style="display:flex;align-items:center;gap:10px"><span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.14);color:#00D4A0;font-weight:800;font-size:10px">A</span><span class="mono" style="font-size:10px;color:#00D4A0;letter-spacing:.1em;font-weight:700">HIT</span></div>
</div>
<div style="display:flex;align-items:center;justify-content:space-between;padding:9px 0;border-bottom:1px solid #12121A">
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Judge o1.5 TB</div><div class="mono" style="font-size:9.5px;color:#707080">NYY · settled 2 · CLV +1.1%</div></div>
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Judge o1.5 TB</div><div class="mono" style="font-size:9.5px;color:#707080"><span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#1b3a6b,#0C2340);vertical-align:-1.5px;margin-right:3px"></span>NYY · settled 2 · CLV +1.1%</div></div>
<div style="display:flex;align-items:center;gap:10px"><span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:#14141E;color:#B8BCC8;font-weight:800;font-size:10px">B</span><span class="mono" style="font-size:10px;color:#00D4A0;letter-spacing:.1em;font-weight:700">HIT</span></div>
</div>
<div style="display:flex;align-items:center;justify-content:space-between;padding:9px 0;border-bottom:1px solid #12121A">
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Edwards o5.5 REB</div><div class="mono" style="font-size:9.5px;color:#707080">MIN · settled 4 · CLV 0.8%</div></div>
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Edwards o5.5 REB</div><div class="mono" style="font-size:9.5px;color:#707080"><span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0C2340,#236192);vertical-align:-1.5px;margin-right:3px"></span>MIN · settled 4 · CLV 0.8%</div></div>
<div style="display:flex;align-items:center;gap:10px"><span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:#14141E;color:#707080;font-weight:800;font-size:10px">C</span><span class="mono" style="font-size:10px;color:#FF4757;letter-spacing:.1em;font-weight:700">MISS</span></div>
</div>
<div style="display:flex;align-items:center;justify-content:space-between;padding:9px 0">
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Skenes o6.5 K</div><div class="mono" style="font-size:9.5px;color:#707080">PIT · settled 8 · CLV +4.0%</div></div>
<div style="min-width:0"><div style="font-size:12.5px;font-weight:600">Skenes o6.5 K</div><div class="mono" style="font-size:9.5px;color:#707080"><span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#2b2b2b,#c9a227);vertical-align:-1.5px;margin-right:3px"></span>PIT · settled 8 · CLV +4.0%</div></div>
<div style="display:flex;align-items:center;gap:10px"><span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.14);color:#00D4A0;font-weight:800;font-size:10px">A+</span><span class="mono" style="font-size:10px;color:#00D4A0;letter-spacing:.1em;font-weight:700">HIT</span></div>
</div>
</div>
@@ -981,7 +981,7 @@
<div style="position:relative;border-radius:16px;background:#0E0E14;border:1px solid #1E1E2A;overflow:hidden;box-shadow:inset 0 1px 0 rgba(255,255,255,.03)">
<div style="display:flex;align-items:center;justify-content:space-between;padding:15px 18px;border-bottom:1px solid #14141E">
<div style="display:flex;align-items:center;gap:9px"><span style="width:7px;height:7px;border-radius:50%;background:#00D4A0;animation:vy-livedot 1.5s ease-in-out infinite"></span><span class="mono" style="font-size:10px;letter-spacing:.2em;color:#00D4A0;font-weight:700">LIVE GRADE</span></div>
<span class="mono" style="font-size:10px;letter-spacing:.14em;color:#707080">Q3 4:12 · DEN @ MIN</span>
<span class="mono" style="font-size:10px;letter-spacing:.14em;color:#707080">Q3 4:12 · <span style="display:inline-block;width:12px;height:12px;border-radius:3px;background:linear-gradient(135deg,#0E4DA4,#4C8BF5);vertical-align:-1.5px;margin-right:3px"></span>DEN @ <span style="display:inline-block;width:12px;height:12px;border-radius:3px;background:linear-gradient(135deg,#0C2340,#236192);vertical-align:-1.5px;margin-right:3px"></span>MIN</span>
</div>
<div style="padding:20px 18px">
<div style="display:flex;align-items:center;gap:18px">
@@ -1073,7 +1073,7 @@
<div style="width:58px;height:58px;flex:none;border-radius:13px;background:linear-gradient(135deg,#2b2b2b,#c9a227);display:flex;align-items:center;justify-content:center;font-family:'JetBrains Mono',monospace;font-weight:800;font-size:15px;color:#fff">PIT</div>
<div>
<div style="display:flex;align-items:center;gap:8px"><span style="font-weight:700;font-size:17px">Paul Skenes</span><span class="mono" style="display:inline-flex;align-items:center;height:17px;padding:0 6px;border-radius:4px;background:rgba(0,212,160,.12);border:1px solid rgba(0,212,160,.3);color:#00D4A0;font-size:9px;font-weight:700;letter-spacing:.06em">CONFIRMED</span></div>
<div class="mono" style="font-size:10.5px;color:#707080;margin-top:3px;letter-spacing:.05em">RHP · #30 · Pittsburgh · vs CHC</div>
<div class="mono" style="font-size:10.5px;color:#707080;margin-top:3px;letter-spacing:.05em">RHP · #30 · Pittsburgh · vs <span style="display:inline-block;width:11px;height:11px;border-radius:3px;background:linear-gradient(135deg,#0E3386,#CC3433);vertical-align:-1.5px;margin-right:3px"></span>CHC</div>
</div>
</div>
<div class="mono" style="font-size:9px;letter-spacing:.2em;color:#707080;margin-bottom:10px">IDENTITY BLEND</div>
@@ -1126,25 +1126,25 @@
<div ref="{{ parlayLegsRef }}">
<div data-leg="jokic" data-dec="2.05" data-game="DENMIN" data-grade="A+" data-label="Jokić o27.5 PTS" data-sub="NBA · DEN @ MIN" data-odds="+105" style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid #101018;cursor:pointer">
<span data-check style="width:18px;height:18px;flex:none;border-radius:5px;border:1.5px solid #2A2A38;display:flex;align-items:center;justify-content:center"></span>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Jokić <span style="color:#B8BCC8;font-weight:500">o27.5 PTS</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">NBA · DEN @ MIN</div></div>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Jokić <span style="color:#B8BCC8;font-weight:500">o27.5 PTS</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">NBA · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0E4DA4,#4C8BF5);vertical-align:-1.5px;margin-right:3px"></span>DEN @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0C2340,#236192);vertical-align:-1.5px;margin-right:3px"></span>MIN</div></div>
<span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.14);color:#00D4A0;font-weight:800;font-size:10px;border:1px solid rgba(0,212,160,.3)">A+</span>
<span class="mono" style="font-size:11.5px;color:#F0F0F0;width:42px;text-align:right">+105</span>
</div>
<div data-leg="edwards" data-dec="2.30" data-game="DENMIN" data-grade="A" data-label="Edwards o5.5 AST" data-sub="NBA · DEN @ MIN" data-odds="+130" style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid #101018;cursor:pointer">
<span data-check style="width:18px;height:18px;flex:none;border-radius:5px;border:1.5px solid #2A2A38;display:flex;align-items:center;justify-content:center"></span>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Edwards <span style="color:#B8BCC8;font-weight:500">o5.5 AST</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">NBA · DEN @ MIN</div></div>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Edwards <span style="color:#B8BCC8;font-weight:500">o5.5 AST</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">NBA · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0E4DA4,#4C8BF5);vertical-align:-1.5px;margin-right:3px"></span>DEN @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0C2340,#236192);vertical-align:-1.5px;margin-right:3px"></span>MIN</div></div>
<span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.1);color:#00D4A0;font-weight:800;font-size:10px;border:1px solid rgba(0,212,160,.24)">A</span>
<span class="mono" style="font-size:11.5px;color:#F0F0F0;width:42px;text-align:right">+130</span>
</div>
<div data-leg="skenes" data-dec="1.83" data-game="PITCHC" data-grade="A" data-label="Skenes o6.5 K" data-sub="MLB · PIT @ CHC" data-odds="-120" style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid #101018;cursor:pointer">
<span data-check style="width:18px;height:18px;flex:none;border-radius:5px;border:1.5px solid #2A2A38;display:flex;align-items:center;justify-content:center"></span>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Skenes <span style="color:#B8BCC8;font-weight:500">o6.5 K</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">MLB · PIT @ CHC</div></div>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Skenes <span style="color:#B8BCC8;font-weight:500">o6.5 K</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">MLB · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#2b2b2b,#c9a227);vertical-align:-1.5px;margin-right:3px"></span>PIT @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#0E3386,#CC3433);vertical-align:-1.5px;margin-right:3px"></span>CHC</div></div>
<span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:rgba(0,212,160,.1);color:#00D4A0;font-weight:800;font-size:10px;border:1px solid rgba(0,212,160,.24)">A</span>
<span class="mono" style="font-size:11.5px;color:#F0F0F0;width:42px;text-align:right">-120</span>
</div>
<div data-leg="judge" data-dec="2.40" data-game="NYYBOS" data-grade="B" data-label="Judge o1.5 TB" data-sub="MLB · NYY @ BOS" data-odds="+140" style="display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid #101018;cursor:pointer">
<span data-check style="width:18px;height:18px;flex:none;border-radius:5px;border:1.5px solid #2A2A38;display:flex;align-items:center;justify-content:center"></span>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Judge <span style="color:#B8BCC8;font-weight:500">o1.5 TB</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">MLB · NYY @ BOS</div></div>
<div style="flex:1;min-width:0"><div style="font-size:13px;font-weight:600">Judge <span style="color:#B8BCC8;font-weight:500">o1.5 TB</span></div><div class="mono" style="font-size:8.5px;letter-spacing:.1em;color:#707080;margin-top:2px">MLB · <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#1b3a6b,#0C2340);vertical-align:-1.5px;margin-right:3px"></span>NYY @ <span style="display:inline-block;width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#BD3039,#6b1c22);vertical-align:-1.5px;margin-right:3px"></span>BOS</div></div>
<span class="mono" style="display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:5px;background:#14141E;color:#F0F0F0;font-weight:800;font-size:10px;border:1px solid #1E1E2A">B</span>
<span class="mono" style="font-size:11.5px;color:#F0F0F0;width:42px;text-align:right">+140</span>
</div>
@@ -1282,6 +1282,15 @@ class Component extends DCLogic {
AGGRESSOR:{c:'#FF6B4A',g:'<path fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" d="M4 20 15 9M15 9h-5M15 9v5"/><path stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M17 16l3 3"/><circle cx="19" cy="6" r="1.8" fill="currentColor"/>'},
SURGEON:{c:'#7AA6D8',g:'<path fill="none" stroke="currentColor" stroke-width="2" d="M4 5h16v14H4z"/><path stroke="currentColor" stroke-width="1.6" d="M4 12h16M12 5v14"/><circle cx="16.5" cy="8.5" r="2" fill="currentColor"/>'},
TOPSPIN:{c:'#B36CFF',g:'<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M18.5 8a7 7 0 1 0 1.2 6"/><path fill="currentColor" d="M20 5l-.3 4.6L16 7.4z"/><path stroke="currentColor" stroke-width="1.6" stroke-linecap="round" d="M9 12.5c1.5-1.5 4.5-1.5 6 0"/>'},
BRUSH:{c:'#E0B84A',g:'<path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" d="M5 19 15 9"/><path fill="currentColor" fill-opacity=".2" d="M15 9l4-4 1.6 1.6-4 4z"/><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M15 9l4-4M5 19l-1 1M7 20l-2 1"/>'},
WHIFF:{c:'#E86A6A',g:'<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M4 16c5 3 11 3 16-2"/><path fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-dasharray="2.5 3" d="M4 11c5 3 10 3 15-1.5"/><circle cx="18" cy="6" r="2.2" fill="currentColor"/>'},
CONNECTOR:{c:'#9AB0C4',g:'<circle cx="6" cy="7" r="2.4" fill="currentColor"/><circle cx="18" cy="17" r="2.4" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" d="M8 8.5C13 11 11 13 16 15.5"/>'},
DISTRIBUTOR:{c:'#7AB8D8',g:'<circle cx="12" cy="12" r="2.6" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 9V4M10 6l2-2 2 2M9.5 13.8 5 16.5M7.5 14.2l-2.5 2.3.8 3.2M14.5 13.8 19 16.5M16.5 14.2l2.5 2.3-.8 3.2"/>'},
FASTBREAK:{c:'#4AA0E8',g:'<path fill="currentColor" fill-opacity=".18" d="M10 5l8 7-8 7z"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" d="M10 5l8 7-8 7z"/><path stroke="currentColor" stroke-width="2.2" stroke-linecap="round" d="M5 8h3M4 12h4M5 16h3"/>'},
FLEX:{c:'#A08AC8',g:'<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M8 4C4 8 4 16 8 20M16 4c4 4 4 12 0 16"/><circle cx="12" cy="12" r="2" fill="currentColor"/>'},
HYBRID:{c:'#C88AB0',g:'<circle cx="10" cy="12" r="6" fill="none" stroke="currentColor" stroke-width="2"/><path fill="currentColor" fill-opacity=".18" d="M15 6l6 12H9z"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" d="M15 6l6 12H9z"/>'},
SWITCH:{c:'#C0B08A',g:'<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round" d="M5 8h11M13 4l4 4-4 4M19 16H8M11 12l-4 4 4 4"/>'},
SWITCHBOARD:{c:'#90A0E8',g:'<circle cx="6" cy="6" r="1.8" fill="currentColor"/><circle cx="18" cy="6" r="1.8" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="6" cy="18" r="1.8" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="18" cy="18" r="1.8" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M7.5 7.5c4 4 5 4 9 9"/>'},
RETURNER:{c:'#6C9CB0',g:'<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round" d="M20 6 8 18M8 18h6M8 18v-6"/><path stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M4 4l3.5 3.5"/>'}
};
}
@@ -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']}
];
}
+9 -9
View File
@@ -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.',
+20 -9
View File
@@ -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': '<path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" d="M5 19 15 9"/><path fill="currentColor" fill-opacity=".2" d="M15 9l4-4 1.6 1.6-4 4z"/><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M15 9l4-4M5 19l-1 1M7 20l-2 1"/>',
'whiff': '<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M4 16c5 3 11 3 16-2"/><path fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-dasharray="2.5 3" d="M4 11c5 3 10 3 15-1.5"/><circle cx="18" cy="6" r="2.2" fill="currentColor"/>',
'connector': '<circle cx="6" cy="7" r="2.4" fill="currentColor"/><circle cx="18" cy="17" r="2.4" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" d="M8 8.5C13 11 11 13 16 15.5"/>',
'distributor': '<circle cx="12" cy="12" r="2.6" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M12 9V4M10 6l2-2 2 2M9.5 13.8 5 16.5M7.5 14.2l-2.5 2.3.8 3.2M14.5 13.8 19 16.5M16.5 14.2l2.5 2.3-.8 3.2"/>',
'fastbreak': '<path fill="currentColor" fill-opacity=".18" d="M10 5l8 7-8 7z"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" d="M10 5l8 7-8 7z"/><path stroke="currentColor" stroke-width="2.2" stroke-linecap="round" d="M5 8h3M4 12h4M5 16h3"/>',
'flex': '<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" d="M8 4C4 8 4 16 8 20M16 4c4 4 4 12 0 16"/><circle cx="12" cy="12" r="2" fill="currentColor"/>',
'hybrid': '<circle cx="10" cy="12" r="6" fill="none" stroke="currentColor" stroke-width="2"/><path fill="currentColor" fill-opacity=".18" d="M15 6l6 12H9z"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" d="M15 6l6 12H9z"/>',
'switch': '<path fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round" d="M5 8h11M13 4l4 4-4 4M19 16H8M11 12l-4 4 4 4"/>',
'switchboard': '<circle cx="6" cy="6" r="1.8" fill="currentColor"/><circle cx="18" cy="6" r="1.8" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="6" cy="18" r="1.8" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="18" cy="18" r="1.8" fill="currentColor"/><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M7.5 7.5c4 4 5 4 9 9"/>',
/* Design 74-mark library — real archetype marks (HANDOFF) */
'alpha': '<path fill="currentColor" fill-opacity=".16" d="M12 3 4 20h16z"/><path fill="none" stroke="currentColor" stroke-width="2.2" stroke-linejoin="round" d="M12 3 4 20h16zM8.5 14h7"/>',
'anchor': '<circle cx="12" cy="5" r="2.2" fill="none" stroke="currentColor" stroke-width="2.1"/><path fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round" d="M12 7v12M6 13c0 4 3 6 6 6s6-2 6-6M4 13h4M16 13h4"/>',
@@ -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' },