Design system

One system, every surface

This is the central place for our branding, theming, and components. The same color tokens and components power the coach app, the client app, and our emails. Use the theme toggle in the top navigation to preview everything in light and dark mode.

Brand

fitcomrade helps fitness coaches build workouts once and share them with every client. Our voice is warm, simple, and value-driven. We write in sentence case and avoid jargon.

fitcomrade
fitcomrade
  • Sentence case everywhere: headings, buttons, and labels.
  • Value first: say what coaches get, not what the feature is.
  • Simple words a 6th grader understands.
  • No em dashes. Use commas, periods, or parentheses.

Colors

Every color comes from a semantic token defined in globals.css. Components never hardcode hex values, so light and dark mode work everywhere for free. Emails and video use matching hex constants from lib/brand-colors.ts.

Primary (brand green)

primary
Buttons, links, brand moments
primary-hover
Hover state for primary
primary-light
Badges, soft highlights
primary-soft
Mid-emphasis fills
primary-muted
Disabled, low emphasis

Neutrals & surfaces

background
Page background
card
Cards and panels
muted
Subtle backgrounds, secondary text
surface
Sidebars and panels
surface-elevated
Cards within panels
hero
Dark marketing bands, footer

Support & status

secondary
Secondary buttons
accent
Hover fills, selected items
destructive
Errors, delete actions
success
Positive states
warning
Caution states
info
Informational states
accent-secondary
Purple accent, AI features

Charts

chart-1
Series 1
chart-2
Series 2
chart-3
Series 3
chart-4
Series 4
chart-5
Series 5

Typography

Our type scale lives in components/ui/typography.tsx. Each component accepts an as prop to pick the right HTML tag and a className to fine-tune sizes.

Display

Hero moments and big statements

Coach more

Heading

Page and section titles

Build workouts once

Subheading

Card titles and sub-sections

Assign to every client

Body

Paragraphs and supporting copy

Notice the client who needs you before they drift, and keep everyone moving toward their goals.

Kicker

Small labels above headings

Progress tracking
StatNumber

Decorative background numbers in stat cards

28

Buttons

One Button component with semantic variants. Use cta for the single most important action on a screen, default for everyday primary actions, and AnimatedButton when an animated icon helps the action stand out.

Variants

Sizes

States and animated icons

Forms

Form controls come from components/ui. Pair every control with a Label, validate with zod, and show errors inline under the field.

Cards and surfaces

Cards group related content. Add the interactive prop when the whole card is clickable, and it gains a gentle lift and primary border on hover.

Default card
For grouping content that is not clickable.
ActiveStrengthWeek 3

Program progress

Interactive card
Hover me. Use for cards that link somewhere or open something.

Feedback and states

Reusable pieces for empty states, errors, ratings, and inline help. Toasts use sonner with the same tokens.

No programs yet

Create your first program and assign it to a client to see it here.

Star rating
Help tooltip

Animated icons

Hover a tile to see the animation. Use AnimatedButton for buttons, or the useAnimatedIcon hook for menu items and links. For static icons, use lucide-react.

BookIcon
BulbIcon
CopyIcon
GearIcon
HomeIcon
LayersIcon
LogoutIcon
MailIcon
MessageCircleIcon
PenIcon
RocketIcon
SendIcon
SparklesIcon
StackIcon
TelephoneIcon
TrashIcon
UsersIcon