M3.6 glyph lift — 29 archetypes now render Design's real 74-mark set

Replaced the generic reused shapes (triangle/star/plus/bolt…) with Design's
real per-archetype marks from the authoritative glyphDefs() (HANDOFF), and
aligned each archetype's color to Design's deduped palette — frontend
lib/archetypes.js + backend archetypeService.js kept in color-sync (the
cross-file test iterates the backend set). Badge test color expectations
updated to Design (BOMBER #FF9F45, CONDUCTOR #6C8CFF, ALPHA #7C5CFF,
FORTRESS #4C6FA5, …).

Scope + honesty:
- 29 non-combat archetypes wired to real marks + Design colors.
- COMBAT namespace (STRIKER/GRAPPLER/PRESSURE/COUNTER/FINISHER/GRINDER) left
  untouched — it uses unicode CHAR glyphs + its own pinned colors + test
  (FINISHER deliberately doesn't collide with the soccer FINISHER). Combat
  could adopt Design's SVG marks in a follow-up.
- 39 Design marks are INERT (no classify() producer yet) — the 74 SVGs live in
  specs/design-reference/assets/glyphs/; they light up when classify() expands.
- 9 backend archetypes have NO Design mark (BRUSH/CONNECTOR/DISTRIBUTOR/
  FASTBREAK/FLEX/HYBRID/SWITCH/SWITCHBOARD/WHIFF) — kept on their generic glyph,
  flagged for Design.

VISUALLY UNVERIFIED at 390px/desktop — archetype marks + colors on the audit list.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-16 17:01:48 -04:00
parent c3d469e964
commit 77d8fd658d
3 changed files with 96 additions and 65 deletions
+8 -8
View File
@@ -11,27 +11,27 @@ const svc = require('../../src/services/archetypeService');
describe('archetypes lib — badge styling', () => {
it('full variant fills with the archetype color + white text', () => {
const s = arch.badgeStyle('BOMBER', 'full', 'md');
expect(s.bg).toBe('#FF6B4A');
expect(s.bg).toBe('#FF9F45');
expect(s.textColor).toBe('#FFFFFF');
expect(s.borderColor).toBe('#FF6B4A');
expect(s.borderColor).toBe('#FF9F45');
});
it('ghost variant is transparent with a colored border', () => {
const s = arch.badgeStyle('CONDUCTOR', 'ghost', 'sm');
expect(s.bg).toBe('transparent');
expect(s.textColor).toBe('#4A9EFF');
expect(s.borderColor).toBe('#4A9EFFCC');
expect(s.textColor).toBe('#6C8CFF');
expect(s.borderColor).toBe('#6C8CFFCC');
});
it('tint variant (default) uses a low-alpha tinted background', () => {
const s = arch.badgeStyle('ALPHA');
expect(s.bg).toBe('#A78BFA1F');
expect(s.borderColor).toBe('#A78BFA52');
expect(s.bg).toBe('#7C5CFF1F');
expect(s.borderColor).toBe('#7C5CFF52');
});
it('archetypeColor matches and is case-insensitive', () => {
expect(arch.archetypeColor('ace')).toBe('#A78BFA');
expect(arch.archetypeColor('Two-Way Anchor')).toBe('#A78BFA');
expect(arch.archetypeColor('ace')).toBe('#7C5CFF');
expect(arch.archetypeColor('Two-Way Anchor')).toBe('#4C6FA5');
});
it('glyphSvg returns a 16x16 svg wrapper', () => {