+ {/* Header */}
+
+
+ ← Back to Genlockes
+
+
+
+ {genlocke.name}
+
+
+ {genlocke.status}
+
+
+
+
+ {/* Progress Timeline */}
+
+
+ Progress
+
+
+
+ {genlocke.legs.map((leg, i) => (
+
+
+ {i < genlocke.legs.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+ {/* Cumulative Stats */}
+
+
+ Cumulative Stats
+
+
+
+
+
+
+
+
+
+ {/* Configuration */}
+
+
+ Configuration
+
+
+
+
+ Genlocke Rules
+
+
+ {genlocke.genlockeRules.retireHoF ? (
+
+ Retire HoF Teams
+
+ ) : (
+
+ No genlocke-specific rules enabled
+
+ )}
+
+
+
+
+ Nuzlocke Rules
+
+
+
+
+
+
+ {/* Retired Families */}
+ {genlocke.genlockeRules.retireHoF && retiredByLeg.length > 0 && (
+
+
+ Retired Families
+
+
+ {retiredByLeg.map((leg) => (
+
+
+ Leg {leg.legOrder} — {leg.gameName}
+
+
+ {leg.pokemonIds.map((pid) => {
+ const pokemon = genlocke.retiredPokemon[pid]
+ if (!pokemon) return null
+ return
+ })}
+
+
+ ))}
+
+
+ )}
+
+ {/* Quick Actions */}
+
+
+ Quick Actions
+
+
+ {activeLeg && (
+
+ Go to Active Leg (Leg {activeLeg.legOrder})
+
+ )}
+
+
+
+
+
+ )
+}
diff --git a/frontend/src/pages/GenlockeList.tsx b/frontend/src/pages/GenlockeList.tsx
new file mode 100644
index 0000000..bcb91fd
--- /dev/null
+++ b/frontend/src/pages/GenlockeList.tsx
@@ -0,0 +1,93 @@
+import { Link } from 'react-router-dom'
+import { useGenlockes } from '../hooks/useGenlockes'
+import type { RunStatus } from '../types'
+
+const statusStyles: Record