'use client'; import React from 'react'; import { Card } from '@/ui/Card'; import { Box } from '@/ui/Box'; import { Stack } from '@/ui/Stack'; import { Text } from '@/ui/Text'; import { Heading } from '@/ui/Heading'; import { Badge } from '@/ui/Badge'; import { Grid } from '@/ui/Grid'; import { Table, TableHead, TableBody, TableRow, TableHeader, TableCell } from '@/ui/Table'; import { PointsTable } from '@/ui/PointsTable'; import { RulebookTabs, type RulebookSection } from '@/ui/RulebookTabs'; import type { LeagueRulebookViewData } from '@/lib/view-data/LeagueRulebookViewData'; import { Surface } from '@/ui/Surface'; import { Clock } from 'lucide-react'; interface LeagueRulebookTemplateProps { viewData: LeagueRulebookViewData; activeSection: RulebookSection; onSectionChange: (section: RulebookSection) => void; loading?: boolean; } export function LeagueRulebookTemplate({ viewData, activeSection, onSectionChange, loading = false, }: LeagueRulebookTemplateProps) { if (loading) { return ( Loading rulebook... ); } if (!viewData || !viewData.scoringConfig) { return ( Unable to load rulebook ); } const { scoringConfig } = viewData; const primaryChampionship = scoringConfig.championships.find(c => c.type === 'driver') ?? scoringConfig.championships[0]; const positionPoints = viewData.positionPoints; return ( {/* Header */} Rulebook Official rules and regulations {scoringConfig.scoringPresetName || 'Custom Rules'} {/* Navigation Tabs */} {/* Content Sections */} {activeSection === 'scoring' && ( {/* Quick Stats */} {/* Weekend Structure */} Weekend Structure & Timings PRACTICE 20 min QUALIFYING 30 min SPRINT MAIN RACE 40 min {/* Points Table */} {/* Bonus Points */} {primaryChampionship?.bonusSummary && primaryChampionship.bonusSummary.length > 0 && ( Bonus Points {primaryChampionship.bonusSummary.map((bonus, idx) => ( + {bonus} ))} )} {/* Drop Policy */} {!scoringConfig.dropPolicySummary.includes('All results count') && ( Drop Policy {scoringConfig.dropPolicySummary} Drop rules are applied automatically when calculating championship standings. )} )} {activeSection === 'conduct' && ( Driver Conduct )} {activeSection === 'protests' && ( Protest Process )} {activeSection === 'penalties' && ( Penalty Guidelines Infraction Typical Penalty
Penalties are applied at steward discretion based on incident severity and driver history.
)}
); } function StatItem({ label, value }: { label: string, value: string | number }) { return ( {label.toUpperCase()} {value} ); } function ConductItem({ number, title, text }: { number: number, title: string, text: string }) { return ( {number}. {title} {text} ); } function PenaltyRow({ infraction, penalty, color }: { infraction: string, penalty: string, color?: string }) { return ( {infraction} {penalty} ); }