TeamFitting Design System
Every component on this page is a live import from src/components/. Change a token in globals.css or a variant in a component file, and it cascades here and throughout the entire app.
Brand
The TeamFitting mark. Use the Logo atom in headers, auth screens, and any surface where the brand should be present. Sourced from /logo.png in every consuming app.
72pxUse showWordmark in primary navigation headers where the brand should be legible.
Color
Monochrome foundations with a single hot-pink brand accent. Semantic colors for success, warning, destructive, informative.
Background
--backgroundCard
--cardMuted
--mutedAccent
--accentForeground
--foregroundMuted Foreground
--muted-foregroundCard Foreground
--card-foregroundPrimary Foreground
--primary-foregroundBrand
--brandBrand Light
--brand-lightBrand Hover
--brand-hoverBrand Glow
--brand-glow--primary and --ring both alias to --brand for shadcn compatibility. Change --brand in globals.css and the Light / Hover / Glow variants recompute automatically via color-mix().
Success
--successWarning
--warningDestructive
--destructiveInformative
--informativeBorder
--borderInput
--inputTypography
Inter on the Apple/editorial scale (13/15/17/20/24/30/36/48/60/72). Every heading and text node in the app flows through these components.
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
Default foreground color
Muted foreground color
Primary (brand) color
Normal weight (400)
Bold weight (700)
An introductory paragraph that sits below the page title. Reserved for the one hero lead per page — everything else uses Text color="muted".
Radius
Tight radii for a precise, engineered feel. Base 4px, integer multiples only.
Elevation
Shadows for depth. Used sparingly — most surfaces sit flat on the canvas.
Button
All variants and sizes. Imported from @/components/ui/button.
Badge
Inline status and label badges. Imported from @/components/ui/badge.
Card
Container for grouped content. Composable header, content, footer.
Forms
Input, Textarea, Label, and FormField. Same primitives used on the Generate page.
Any additional context for the research.
This field is required
Progress
Linear progress indicator.
Tabs
Accessible tab group.
Overview content.
Accordion
Expand/collapse groups.
Table
Semantic tabular data.
| Player | Team | Fit |
|---|---|---|
| Sample Player A | Sample Team | 92% |
| Sample Player B | Sample Team | 78% |
| Sample Player C | Sample Team | 64% |
Layout
Container, Section, Stack, PageLayout. Used by every page in the app.
Select
Native select dropdown with styled chevron.
Selection Controls
Checkbox, Radio, and Switch for forms and settings.
Alert
Inline banners for success, warning, destructive, and informative states.
Avatar
Single avatars at four sizes, plus stacked avatar groups.
Skeleton
Loading placeholders for content that is still fetching.
Spinner
Indeterminate loading indicator.
Loading results…
Empty State
Placeholder for sections with no data yet.
No reports yet
Create your first player, team, or compatibility report to see it here.
Breadcrumb
Hierarchical navigation trail.
Pagination
Navigate paged lists of records.
Dialog
Modal overlay for focused tasks and confirmations.
Dropdown Menu
Contextual menu anchored to a trigger.
Toast
Transient notification that slides in and auto-dismisses.
Tooltip
Hover-triggered contextual help.
Keyboard
Inline keyboard key indicators.
Press ⌘ K to search
Press Esc to close
Press Shift Enter to submit
Code Block
Preformatted code display with monospace font.
import { Button } from "@/components/ui/button"
export function Example() {
return <Button>Click me</Button>
}Score Gauge
Animated circular progress meter for compatibility scores. Color cascades from semantic tokens (success/warning/destructive) based on score thresholds.
Near-Perfect Fit
Solid Fit
Challenging Fit
Critical Mismatch