interface CoverageReport { currentPercent: number; thresholdPercent: number; baselinePercent: number | null; } interface GateState { canAccept: boolean; reasons: string[]; warning: string | null; summary: { total: number; passed: number; failed: number; }; missingCategories: string[]; coverageReport: CoverageReport | null; } interface GatePanelProps { gateState: GateState | null; gateStatusLabel: string; gateStatusColor: string; isGateLoading: boolean; gateError: string | null; coverageError: string | null; lastGateRefresh: Date | null; onRefresh: () => void; onCollectCoverage: () => void; isCollectingCoverage: boolean; } const formatTimestamp = (value: Date | null): string => { if (!value) return "—"; return value.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit", }); }; export function GatePanel({ gateState, gateStatusLabel, gateStatusColor, isGateLoading, gateError, coverageError, lastGateRefresh, onRefresh, onCollectCoverage, isCollectingCoverage, }: GatePanelProps) { return (