feat: v5 — boxing poster fight cards, 12-char names, diverse mock bots

- Fight Card page: dramatic poster background with cross-hatch, spotlights,
  vignettes, corner brackets, scan lines; 3D VS orb with punch animation;
  selectable undercard with main event always pinned at top
- PosterSprite: high-quality 480px poster frame with 6-pass renderer
  (aura, glow, bevel, specular, particles); PixelGlove component
- 12-char bot name limit across all forms and server validation
- Mock bots: all 100 now have diverse archetypes (25 types), 25% human
  fighters; seedMockBots updates existing bots on restart
- Leaderboard: inline SpritePreview next to each bot name
- Nostr auth: persistent login, nsec copy button
- Wallet: NWC + Lightning Address, ranked fight flow
- Server: payments, ranked queue, customization endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-08 10:33:30 +00:00
co-authored by Claude Opus 4.6
parent ccf4196647
commit f6eb7d2845
32 changed files with 1743 additions and 467 deletions
+13 -3
View File
@@ -1,10 +1,13 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { RouterLink } from 'vue-router'
import SpritePreview from '../components/SpritePreview.vue'
interface Bot {
id: string
name: string
avatarSeed: string
archetype: string
eloRating: number
wins: number
losses: number
@@ -50,7 +53,7 @@ const record = (b: Bot) => `${b.wins}W - ${b.losses}L`
</div>
<!-- Table -->
<div class="flex-1 min-h-0 overflow-y-auto border border-border rounded-lg bg-surface-raised/50 neon-border-purple">
<div class="flex-1 min-h-0 overflow-y-auto border border-border rounded-lg bg-surface-raised/50">
<table class="w-full">
<thead class="sticky top-0 bg-surface-raised z-10">
<tr class="border-b border-border text-text-muted font-display text-[10px] uppercase tracking-[0.15em]">
@@ -73,8 +76,15 @@ const record = (b: Bot) => `${b.wins}W - ${b.losses}L`
{{ index + 1 }}
</td>
<td class="px-4 py-3">
<RouterLink :to="`/bot/${bot.name}`" class="hover:text-neon-cyan transition-colors">
<span class="font-display font-bold text-sm tracking-wide text-text-primary">
<RouterLink :to="`/bot/${bot.name}`" class="flex items-center gap-2 hover:text-neon-cyan transition-colors">
<SpritePreview
:seed="bot.avatarSeed || bot.name"
:archetype="bot.archetype || 'standard'"
:tier="bot.tier"
:size="24"
class="shrink-0"
/>
<span class="font-display font-bold text-sm tracking-wide text-text-primary truncate">
{{ bot.name }}
</span>
</RouterLink>