+
+
+
+ {event.bouts.map((bout, i) => {
+ const fighters: FighterTape[] = (bout.fighters || []).slice(0, 2).map((f) => ({
+ id: f.id,
+ name: f.name,
+ record: f.record,
+ stance: f.stance,
+ reach: f.reach,
+ blend: f.blend,
+ pedigrees: f.pedigrees,
+ }));
+ return (
+
+ );
+ })}
+
+
+ );
+}
diff --git a/web/src/app/fight/[id]/page.tsx b/web/src/app/fight/[id]/page.tsx
new file mode 100644
index 0000000..125100d
--- /dev/null
+++ b/web/src/app/fight/[id]/page.tsx
@@ -0,0 +1,20 @@
+import type { Metadata } from 'next';
+import FightCardClient from './FightCardClient';
+
+/**
+ * /fight/[id] (Wave 6 — combat intelligence). Thin server wrapper for page
+ * metadata; the interactive tale-of-the-tape cards live in the client
+ * component. Off-card windows self-hide to the shared EmptyState.
+ */
+export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise