05 — Components
Inputs & Form Controls
All controls are real interactive components — try clicking, typing, and toggling. Built on shadcn/ui + Radix UI primitives with CPSL design tokens.
Text Input — All States
Enter your full registered club name
Primary contact email
Please enter a valid email address
League code cannot be changed
tsx
import { CPSLInput } from "@/components/cpsl/CPSLInput"
// Default
<CPSLInput label="Team Name" placeholder="e.g. Charlotte FC Academy" />
// With left icon
<CPSLInput
label="Email"
type="email"
leftIcon={<MailIcon size={14} />}
hint="We'll send your confirmation here"
/>
// Error state
<CPSLInput
label="Email"
type="email"
error="Please enter a valid email address"
/>
// Disabled
<CPSLInput label="League Code" value="CPSL-2025" disabled />Select / Dropdown
Default placeholder
Pre-selected value
Disabled state
tsx
import {
Select, SelectContent, SelectItem,
SelectTrigger, SelectValue,
} from "@/components/ui/select"
<Select>
<SelectTrigger>
<SelectValue placeholder="Choose division..." />
</SelectTrigger>
<SelectContent>
<SelectItem value="premier">Premier Division</SelectItem>
<SelectItem value="elite">Elite Division</SelectItem>
<SelectItem value="academy">Academy Division</SelectItem>
</SelectContent>
</Select>Checkbox, Radio & Toggle — Interactive
Checkbox
Radio Group
Switch / Toggle
Textarea
Max 500 characters
tsx
import { Checkbox } from "@/components/ui/checkbox"
import { Label } from "@/components/ui/label"
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"
import { Switch } from "@/components/ui/switch"
// Checkbox
<div className="flex items-center gap-2">
<Checkbox id="terms" />
<Label htmlFor="terms">Accept terms & conditions</Label>
</div>
// Radio group
<RadioGroup defaultValue="premier">
<div className="flex items-center gap-2">
<RadioGroupItem value="premier" id="premier" />
<Label htmlFor="premier">Premier Division</Label>
</div>
<div className="flex items-center gap-2">
<RadioGroupItem value="elite" id="elite" />
<Label htmlFor="elite">Elite Division</Label>
</div>
</RadioGroup>
// Switch
<div className="flex items-center gap-2">
<Switch id="notifications" />
<Label htmlFor="notifications">Match alerts</Label>
</div>Complete Form — Register a Team
Register Team for 2025–26 Season
Enter your full registered club name