92fd5e034d
The routes page loaded ~924KB of API data upfront (summary 366KB + token-candidates 558KB), but token-candidates was only needed when expanding cards, opening panels, or using filters. This caused a ~3s element render delay blocking LCP. Changes: - Split load() so first paint only fetches routesSummary (366KB) - Preload token-candidates in background via requestIdleCallback - Wrap candidates state updates in startTransition to avoid UI jank - Convert 3 heavy O(routes×models) useMemo indices to lazy per-route computation with ref-based cache (candidateIndex, missingTokenIndex, missingTokenGroupIndex) - Guard 4 ManualRoutePanel-only useMemos with showManual check - Convert 2 derived useMemos to per-route getter functions - Add loadCandidates() calls at 7 interaction trigger points