Cal.com Design System

Scheduling infrastructure · High-contrast minimalist calendar layout...
Back to Home
01

Visual Theme & Atmosphere

Cal.com's marketing surface is a clean, friendly modern-SaaS interface — white canvas ({colors.canvas} — #ffffff) with black primary CTAs ({colors.primary} — #111111), custom Cal Sans display typography, and {colors.surface-card} (#f5f5f5) light-gray cards holding product UI fragments. The system reads as confidently engineered without trying to impress — every band has clear hierarchy, generous whitespace, and a single primary action.

Type voice splits cleanly into two roles: Cal Sans (the brand's custom geometric display face — used for h1, h2, h3, and hero headlines) and Inter (used for everything else — body, buttons, nav, captions). Cal Sans uses weight 600 with negative letter-spacing (-0.5px to -2px depending on size) — it feels modern, slightly condensed, distinctly Cal.com.

...

Key Characteristics:

  • White canvas with black primary CTA ({colors.primary} — #111111). Buttons are {rounded.md} (8px) with confident weight-600 labels. Standard friendly-SaaS button.
  • ...

Live Visual Theme Representation:

Minimalist, software-first scheduling.
02

Color Palette & Roles

Brand & Accent

  • Primary ({colors.primary} — #111111): The dominant action color. All primary CTAs, h1/h2 display type. Press state shifts to {colors.primary-active} (#242424).
  • Brand Accent ({colors.brand-accent} — #3b82f6): Used sparely on inline links and on a small badge / "Customer story" highlight. Cal.com is a near-monochrome brand — the blue appears rarely.
  • ...

Surface

  • Canvas ({colors.canvas} — #ffffff): The default page floor.
  • Surface Soft ({colors.surface-soft} — #f8f9fa): Nav-pill-group background, very-soft section dividers.
  • ...

Text

  • Ink ({colors.ink} — #111111): All headlines and primary text.
  • Body ({colors.body} — #374151): Default running-text color.
  • ...

Semantic

  • Success ({colors.success} — #10b981): Confirmation states, success badges in product UI.
  • Warning ({colors.warning} — #f59e0b): Warning callouts.
  • ...
primary
#111111
primary-active
#242424
primary-disabled
#e5e7eb
ink
#111111
body
#374151
muted
#6b7280
muted-soft
#898989
hairline
#e5e7eb
hairline-soft
#f3f4f6
canvas
#ffffff
surface-soft
#f8f9fa
surface-card
#f5f5f5
surface-strong
#e5e7eb
surface-dark
#101010
surface-dark-elevated
#1a1a1a
on-primary
#ffffff
on-dark
#ffffff
on-dark-soft
#a1a1aa
brand-accent
#3b82f6
success
#10b981
warning
#f59e0b
error
#ef4444
badge-orange
#fb923c
badge-pink
#ec4899
badge-violet
#8b5cf6
badge-emerald
#34d399
03

Typography Rules

Font Family

The system runs Cal Sans for display + brand wordmark and Inter for everything else. Cal Sans is Cal.com's custom geometric display typeface — slightly condensed, weight 600, negative letter-spacing. Inter handles body, buttons, navigation, captions, and tabular code blocks. The fallback stack walks -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif for both families.

The split is functional:

  • Cal Sans (display, 600 weight, -0.5 to -2px tracking) — h1, h2, h3
  • Inter (body + UI, 400-600 weight, 0 letter-spacing) — paragraphs, labels, buttons, nav

Hierarchy

TokenSizeWeightLine HeightLetter SpacingUse
..................

Principles

...

Note on Font Substitutes

Dynamic Preview:
display-xl size: 64px | weight: 600 | height: 1.05 | spacing: -2px
The quick brown fox jumps over the lazy dog
display-lg size: 48px | weight: 600 | height: 1.1 | spacing: -1.5px
The quick brown fox jumps over the lazy dog
display-md size: 36px | weight: 600 | height: 1.15 | spacing: -1px
The quick brown fox jumps over the lazy dog
display-sm size: 28px | weight: 600 | height: 1.2 | spacing: -0.5px
The quick brown fox jumps over the lazy dog
title-lg size: 22px | weight: 600 | height: 1.3 | spacing: -0.3px
The quick brown fox jumps over the lazy dog
title-md size: 18px | weight: 600 | height: 1.4 | spacing: 0
The quick brown fox jumps over the lazy dog
title-sm size: 16px | weight: 600 | height: 1.4 | spacing: 0
The quick brown fox jumps over the lazy dog
body-md size: 16px | weight: 400 | height: 1.5 | spacing: 0
The quick brown fox jumps over the lazy dog
body-sm size: 14px | weight: 400 | height: 1.5 | spacing: 0
The quick brown fox jumps over the lazy dog
caption size: 13px | weight: 500 | height: 1.4 | spacing: 0
The quick brown fox jumps over the lazy dog
code size: 14px | weight: 400 | height: 1.5 | spacing: 0
The quick brown fox jumps over the lazy dog
button size: 14px | weight: 600 | height: 1 | spacing: 0
The quick brown fox jumps over the lazy dog
nav-link size: 14px | weight: 500 | height: 1.4 | spacing: 0
The quick brown fox jumps over the lazy dog
04

Layout Principles

Spacing System

  • Base unit: 4px.
  • Tokens: {spacing.xxs} 4px · {spacing.xs} 8px · {spacing.sm} 12px · {spacing.md} 16px · {spacing.lg} 24px · {spacing.xl} 32px · {spacing.xxl} 48px · {spacing.section} 96px.
  • ...

Grid & Container

  • Max content width: ~1200px centered on marketing pages.
  • Editorial body: Single 12-column grid; hero band often uses 7/5 split (h1 left, app mockup card right).
  • ...

Whitespace Philosophy

Cal.com uses generous but not excessive whitespace — section padding sits at 96px (modern-SaaS standard), and card internal padding stays at 32px. The rhythm is calibrated for fast scanning: every band has a single h1 + h2 + supporting cards, never densely packed lists. The result reads as confident-not-shouting.

Grid Layout Wireframe Mockup:

Mon
Tue
Wed
Thu
Layout Wireframe blueprint
1
2
3
4
5
6
7
8
9
10
11
12
Gutter spacing: 16px / 24px
Side Margins: 24px (Mobile) / 48px (Desktop)
Max Container Width: 1200px
05

Depth & Elevation

LevelTreatmentUse
.........
The elevation philosophy is soft and modern — small drop shadows on elevated cards, color-block contrast for emphasis. No heavy shadows, no neumorphism, no glassmorphism.

Decorative Depth

  • Calendar widgets and product UI fragments embedded inside marketing cards carry their own internal shadows from the product UI itself — these are not system tokens, they're product chrome shown as content.
  • Avatar circles in testimonial sections sometimes carry pastel fill colors ({colors.badge-orange}, {colors.badge-pink}, etc.) — adds a small chromatic flourish without breaking the monochrome brand voice.

Elevation Level Showcase:

Soft Shadows
Cal.com uses extremely soft shadows (`rgba(0,0,0,0.03)`) with 12px rounded cards.
Flat Surface (Level 0)

Used for background layers, sidebar headers, or baseline borders.

Low Elevation (Level 1 / Card)

Used for floating product elements, cards, and hover states.

High Elevation (Level 2 / Popover & Dropdown)

Used for modals, select menus, code editor tooltips, and overlay headers.

Border Radius & Shape Scale:

radius-sm 4px
radius-md 8px
radius-lg 12px
radius-pill Pill / Tag
06

Component Stylings

Border Radius Scale

TokenValueUse
.........

Photography Geometry

Avatar photos use {rounded.full} (perfect circles) at 36px or 40px. Product UI fragments inside marketing cards retain their native chrome (which often has its own internal radii — e.g., calendar grid cells, button rows). Hero illustration zones use 16:9 or 4:3 ratios with {rounded.xl} corners.

Top Navigation

top-nav — White nav bar pinned to the top of every page. 64px tall, {colors.canvas} background. Carries the Cal.com wordmark + logo at left (the lowercase "Cal.com" with the brand circle), primary horizontal menu (Product, Solutions, Resources, Pricing, Enterprise) center, right-side cluster with "Sign in" text-link, "Sign up free" {component.button-primary}, and a sometimes-visible language selector. Menu items in {typography.nav-link} (Inter 14px / 500).

nav-pill-group — A small pill-radius wrapper around 2-3 sub-nav segments (e.g., the product-mode switcher between "Personal" / "Teams" / "Enterprise"). Background {colors.surface-soft} with internal padding 6px, rounded {rounded.pill}. Active segment renders as a white-canvas pill with a subtle drop shadow inside the wrapper. The pill-in-pill treatment is one of Cal.com's signature interactive components.

Buttons

button-primary — The signature primary CTA. Background {colors.primary} (#111111), text {colors.on-primary}, type {typography.button} (Inter 14px / 600), padding 12px × 20px, height 40px, rounded {rounded.md} (8px). Active state button-primary-active shifts to {colors.primary-active} (#242424).

button-secondary — White button with hairline outline. Background {colors.canvas}, text {colors.ink}, 1px hairline border, same padding + height + radius as primary.

button-icon-circular — 36 × 36px circular icon button. Background {colors.canvas}, hairline border, ink-color icon. Used for share, "view more", carousel arrows.

button-text-link — Inline text button, no background. Used for "Sign in" in the top nav and inline CTA links inside cards.

text-link — Inline body links in {colors.ink} (the brand keeps inline links monochrome). Underlined on hover (not documented per the no-hover policy, but mentioned for context).

Cards & Containers

hero-band — White-canvas hero with a 7-5 grid: h1 + sub-headline + button row on the left, {component.hero-app-mockup-card} on the right. Vertical padding {spacing.section} (96px).

hero-app-mockup-card — A larger product-UI mockup card showing the actual Cal.com booking widget with calendar grid, time slots, and a primary "Confirm" button inside. Background {colors.canvas}, 1px hairline border, rounded {rounded.xl} (16px), subtle drop shadow. Used as the hero's right-side artifact.

feature-card — Used in 3-up feature grids ("With us, appointment scheduling is easy"). Background {colors.surface-card} (#f5f5f5), rounded {rounded.lg} (12px), internal padding {spacing.xl} (32px). Carries a small icon at top, an {typography.title-md} headline, and a body description in {typography.body-md}.

feature-icon-card — A simpler card variant used in 4-up feature grids on lower-density bands. Background {colors.canvas} with hairline border, rounded {rounded.lg}, padding {spacing.lg} (24px). Carries a small icon, {typography.title-sm} title, short description.

product-mockup-card — A card showing actual Cal.com product UI fragments (workflow editor, calendar grid, integration grid, automation flow). Background {colors.canvas}, rounded {rounded.lg}, padding {spacing.lg} (24px). The product UI inside has its own internal chrome — these cards display the product, they don't decorate around it.

testimonial-card — Used in customer-quote grids. Background {colors.surface-card}, rounded {rounded.lg}, padding {spacing.lg} (24px). Top row carries a {component.avatar-circle} + name + role; below sits the testimonial quote in {typography.body-md}.

pricing-tier-card — Standard tier card. Background {colors.canvas}, rounded {rounded.lg}, padding {spacing.xl} (32px). Carries the plan name in {typography.title-lg}, price in {typography.display-sm}, feature checklist in {typography.body-md}, and a {component.button-primary} at the bottom.

pricing-tier-card-featured — The featured tier (typically "Teams"). Background flips to {colors.surface-dark} (#101010), text inverts to {colors.on-dark}. The dark surface IS the featured-tier signal — no accent border, no badge, no scale shift.

Inputs & Forms

text-input — Standard text input. Background {colors.canvas}, text {colors.ink}, type {typography.body-md}, rounded {rounded.md} (8px), padding 10px × 14px, height 40px. 1px hairline border in {colors.hairline}.

text-input-focused — Focus state. Border thickens or shifts to {colors.ink} for emphasis.

Tags / Badges

badge-pill — Small pill label used for category tags ("Product", "Article", "New") and pastel-fill avatar substitutes. Background {colors.surface-card} or one of the badge pastels ({colors.badge-orange}, {colors.badge-pink}, etc.), text {colors.ink}, type {typography.caption} (13px / 500), rounded {rounded.pill}, padding 4px × 12px.

avatar-circle — 36px diameter, rounded {rounded.full}. Either holds a photo or a pastel fill with initials in {typography.caption}.

rating-stars — Inline star rating in {colors.badge-orange} (#fb923c). Used near testimonial avatars to display a 5-star satisfaction score.

Tab / Filter

category-tab + category-tab-active — Used inside the nav-pill-group. Inactive: transparent background, {colors.muted} text. Active: {colors.canvas} background, {colors.ink} text, subtle drop shadow inside the pill-group wrapper. Padding 8px × 14px, rounded {rounded.md}.

CTA / Footer

cta-band-light — A pre-footer "Smarter, simpler scheduling" CTA card. Background {colors.surface-card}, rounded {rounded.lg}, padding {spacing.xxl} (48px). Carries an h2 in {typography.display-sm}, a sub-line, and a {component.button-primary} centered.

footer — Dark navy footer that closes every page. Background {colors.surface-dark} (#101010), text {colors.on-dark-soft}. 4-column link list at desktop covering Product / Solutions / Company / Resources. Vertical padding 64px. The Cal.com wordmark sits at the top-left in {colors.on-dark}. The footer is the only dark surface on every page — the deliberate inversion visually closes the page.

Interactive Component Demonstrations:

07

Do's and Don'ts

Do

  • Reserve {colors.primary} (#111111) for primary CTAs and h1/h2 type. Cal.com's button is near-black, not blue.
  • Use Cal Sans for every display headline. Pair with Inter body. Never blur the boundary.
  • Apply negative letter-spacing on display sizes (-0.5 to -2px). Cal Sans without it reads as off-brand.
  • Use {component.feature-card} (light gray) and {component.product-mockup-card} (white with chrome) deliberately — the gray cards signal "abstract feature claim", white cards signal "look at the actual product".
  • Embed real product UI fragments inside marketing cards. Don't paint marketing illustrations of the product when you can show the product itself.
  • Keep avatar circles at 36px, perfect circles, sometimes with pastel fills. Avatars are the only place where badge pastels appear.
  • Use {component.nav-pill-group} for grouped sub-nav segments. The pill-in-pill treatment is signature.
  • End every page with the dark footer. The light-to-dark transition is part of the editorial rhythm.

Don't

  • Don't use accent colors ({colors.brand-accent}, badge pastels) on primary CTAs. The system is monochrome at the action layer.
  • Don't bold display weight beyond 600. Cal Sans at 700 reads as bombastic.
  • Don't use rounded radius beyond {rounded.xl} (16px) on cards. Larger radii read as consumer-app, not professional booking software.
  • Don't put dark surface cards anywhere except the footer and the featured pricing tier. The dark surface is a deliberate, scarce signal.
  • Don't repeat the same surface mode in two consecutive bands. Cal.com's pacing alternates white → light-gray → white → product-mockup-card → white → dark-footer.
  • Don't add hover state styling beyond what the system already encodes — primary darkens on press; nothing else changes.
✅ Recommended / Do
  • Reserve {colors.primary} (#111111) for primary CTAs and h1/h2 type. Cal.com's button is near-black, not blue.
  • Use Cal Sans for every display headline. Pair with Inter body. Never blur the boundary.
  • Apply negative letter-spacing on display sizes (-0.5 to -2px). Cal Sans without it reads as off-brand.
  • Use {component.feature-card} (light gray) and {component.product-mockup-card} (white with chrome) deliberately — the gray cards signal "abstract feature claim", white cards signal "look at the actual product".
  • Embed real product UI fragments inside marketing cards. Don't paint marketing illustrations of the product when you can show the product itself.
  • Keep avatar circles at 36px, perfect circles, sometimes with pastel fills. Avatars are the only place where badge pastels appear.
  • Use {component.nav-pill-group} for grouped sub-nav segments. The pill-in-pill treatment is signature.
  • End every page with the dark footer. The light-to-dark transition is part of the editorial rhythm.
❌ Discouraged / Don't
  • Don't use accent colors ({colors.brand-accent}, badge pastels) on primary CTAs. The system is monochrome at the action layer.
  • Don't bold display weight beyond 600. Cal Sans at 700 reads as bombastic.
  • Don't use rounded radius beyond {rounded.xl} (16px) on cards. Larger radii read as consumer-app, not professional booking software.
  • Don't put dark surface cards anywhere except the footer and the featured pricing tier. The dark surface is a deliberate, scarce signal.
  • Don't repeat the same surface mode in two consecutive bands. Cal.com's pacing alternates white → light-gray → white → product-mockup-card → white → dark-footer.
  • Don't add hover state styling beyond what the system already encodes — primary darkens on press; nothing else changes.
08

Responsive Behavior

Breakpoints

NameWidthKey Changes
.........

Touch Targets

  • {component.button-primary} at minimum 40 × 40px.
  • {component.button-icon-circular} at exactly 36 × 36 — slightly under WCAG's 44 × 44 but the centered icon and full-circle silhouette compensate.
  • ...

Collapsing Strategy

  • Top nav collapses to hamburger at < 768px; menu opens as a full-screen sheet.
  • Hero band's 7-5 grid collapses to single-column on mobile — h1 + sub-head + buttons first, then the app-mockup card below.
  • ...

Image Behavior

  • Product UI fragments inside cards retain native aspect ratios; the cards themselves resize.
  • Avatar photos crop to circles at every breakpoint.
  • ...

Responsive Adaptation Note:

📱 On mobile screens, calendar days collapse to a vertical list view, showing single day slots at a time.
Interactive Viewport Simulator
Width: 800px (Desktop Mode) Grid Container
Primary Column

Adjusts layout width

Secondary Column

Folds on viewport change

Sidebar Column

Stacks to bottom on mobile

09

Agent Prompt Guide

1. Focus on ONE component at a time. Reference its YAML key directly ({component.feature-card}, {component.pricing-tier-card-featured}). 2. Variants of an existing component (-active, -disabled, -focused) live as separate entries in components:.

  • ...

Copyable Agent Integration Prompt:

"Design a scheduling UI: clean white background, black CTAs (#111111), and border-radius of 12px."
10

Full System Design Tokens

The parsed design tokens extracted from the core stylesheet of this design system:

Design TokenHex ValueSystem Palette Role
--primary#111111System color representation for primary
--primary-active#242424System color representation for primary-active
--primary-disabled#e5e7ebSystem color representation for primary-disabled
--ink#111111System color representation for ink
--body#374151System color representation for body
--muted#6b7280System color representation for muted
--muted-soft#898989System color representation for muted-soft
--hairline#e5e7ebSystem color representation for hairline
--hairline-soft#f3f4f6System color representation for hairline-soft
--canvas#ffffffSystem color representation for canvas
--surface-soft#f8f9faSystem color representation for surface-soft
--surface-card#f5f5f5System color representation for surface-card
--surface-strong#e5e7ebSystem color representation for surface-strong
--surface-dark#101010System color representation for surface-dark
--surface-dark-elevated#1a1a1aSystem color representation for surface-dark-elevated
--on-primary#ffffffSystem color representation for on-primary
--on-dark#ffffffSystem color representation for on-dark
--on-dark-soft#a1a1aaSystem color representation for on-dark-soft
--brand-accent#3b82f6System color representation for brand-accent
--success#10b981System color representation for success
--warning#f59e0bSystem color representation for warning
--error#ef4444System color representation for error
--badge-orange#fb923cSystem color representation for badge-orange
--badge-pink#ec4899System color representation for badge-pink
--badge-violet#8b5cf6System color representation for badge-violet
--badge-emerald#34d399System color representation for badge-emerald