Vimeo Design System Deep Dive
1. Brand Overview
Vimeo’s design language feels like it belongs to a brand that’s confident in its identity and knows its audience: creators, filmmakers, and professionals who care about craft. The vibe is clean but not sterile. Dark neutrals dominate, giving it a cinematic feel, and splashes of bright cyan-blue provide energy where interaction happens.
The site is clearly designed for people who spend a lot of time looking at pixels — the typography is precise, the spacing is controlled, and nothing feels accidental. Vimeo's audience isn't the casual scroller; it’s the person who will notice if a button radius feels off or if text alignment isn't pixel-perfect.
Philosophically, Vimeo's design says: “We’re here to showcase your work, not overshadow it.” That’s why the color palette leans heavily on neutrals. It lets video content pop while the interface stays out of the way, except when it needs to guide you — then it uses high-contrast, saturated accents.
The typography choice of ABCRepro with ABCReproMono for certain UI elements is deliberate. It’s not a generic sans-serif; it’s a designer’s typeface. The fallback stack is sensible — InterTight, Helvetica, Arial — but you can tell Vimeo wants the primary font to carry the brand voice.
UI components have a quiet consistency. Buttons follow a strict rounding scale. Cards, modals, and form elements share common radii. Breakpoints are defined for 1023px and 1024px — a subtle signal that they care about exact device widths rather than broad “mobile/tablet/desktop” categories.
This system is a mix of Tailwind CSS, Vuetify, and Radix UI primitives. That’s an interesting combination: utility-first for speed, component library for structure, and Radix for accessibility and composability.
I’d call the overall design philosophy: cinema-first minimalism with precise interaction cues. Vimeo doesn't try to entertain through UI — it tries to make the UI invisible until you need it, then make it responsive and delightful.
2. Color System
2.1 Primary Colors
The brand’s primary semantic color is rgb(10, 14, 18) (#0a0e12) — a deep, near-black neutral. This isn’t your typical “primary brand color” in the marketing sense; it’s more of a foundation tone. It’s used in text, borders, and as a base for dark UI surfaces.
The “interaction primary” is actually the bright cyan range:
rgb(19, 177, 212)(#13b1d4) — used for hover states and buttons.rgb(23, 213, 255)(#17d5ff) — used for primary CTAs and icons.
This works because bright cyan on dark backgrounds screams “click me” without feeling cheap. Compared to YouTube’s red or Twitch’s purple, Vimeo’s palette feels cooler, calmer, and more professional.
2.2 Complete Palette
| Color Name | Hex | Role | Usage |
|---|---|---|---|
| Primary Neutral | #0a0e12 | Semantic primary | Base text, borders, dark UI surfaces |
| Secondary Neutral | #141a20 | Semantic secondary | Icon backgrounds, nav items |
| White-ish Background | #fafcfd | Light UI background | Text on dark surfaces, backgrounds in light sections |
| Mid Gray | #3d4751 | UI text secondary | Navigation sub-content, caption text |
| Slate Gray | #4c5864 | Secondary UI text | Less frequent neutral use |
| Pure Black | #000000 | Text, borders | Specific border elements and dropdowns |
| Cyan Hover | #13b1d4 | Interaction accent | Hoverable elements, buttons |
| Bright Cyan | #17d5ff | Primary CTA | Buttons, modal close icons |
| Light Gray | #dfe4ea | Neutral background | Icon containers, light UI surfaces |
2.3 Color Relationships
Dark mode is clearly the default. The primary neutral (#0a0e12) and secondary (#141a20) form the base, with light text (#fafcfd) ensuring high contrast. Bright cyan accents (#13b1d4, #17d5ff) provide 4.5+ contrast ratios against the dark neutrals — safe for accessibility.
On light surfaces (#fafcfd, #dfe4ea), dark text (#0a0e12, #141a20) keeps things readable. The cyan accents against white still meet WCAG AA for large text, but for smaller text, it’s borderline — likely why they use it mostly for icons and buttons rather than body copy.
2.4 Usage Guide
- Works well: Bright cyan (#17d5ff) on deep neutral (#0a0e12) — high contrast, strong CTA.
- Avoid: Bright cyan on light gray (#dfe4ea) — low contrast, loses impact.
- Safe combo: White-ish (#fafcfd) text on deep neutral (#141a20) — clean and accessible.
- Accent restraint: Keep cyan for interactive elements, not decoration. Overuse kills its impact.
3. Typography
3.1 Font Families
- Primary:
ABCRepro— custom, geometric sans-serif with modern proportions. - Fallbacks:
ABCRepro Fallback, InterTight, InterTight Fallback, Helvetica, Arial - Mono:
ABCReproMono— for uppercase labels and system text. - Source: Not provided via Google or Adobe — custom hosted.
3.2 Type Scale
| Element | Font | Size | Weight | Line Height |
|---|---|---|---|---|
| Heading 1 | ABCRepro | 72px (4.50rem) | 500 | 1.00 |
| Heading 1 | ABCRepro | 40px (2.50rem) | 500 | 1.00 |
| Button | ABCRepro | 32px (2.00rem) | 500 | 1.10 |
| Heading 1 | ABCRepro | 32px (2.00rem) | 500 | 1.10 |
| Heading 1 | ABCRepro | 24px (1.50rem) | 500 | 1.10 |
| Heading 1 | ABCRepro | 24px (1.50rem) | 500 | null |
| Button | ABCRepro | 24px (1.50rem) | 500 | 1.10 |
| Heading 1 | ABCRepro | 22px (1.38rem) | 500 | 1.10 |
| Button | ABCRepro | 20px (1.25rem) | 400 | 1.40 |
| Button | ABCRepro | 20px (1.25rem) | 500 | 1.40 |
| Heading 1 | ABCRepro | 20px (1.25rem) | 500 | 1.40 |
| Heading 1 | ABCRepro | 20px (1.25rem) | 400 | 1.40 |
| Link | ABCRepro | 20px (1.25rem) | 500 | 1.40 |
| Button | ABCRepro | 18.72px (1.17rem) | 500 | 1.30 |
| Heading 1 | ABCRepro | 18.72px (1.17rem) | 500 | null |
| Button | ABCRepro | 18px (1.13rem) | 500 | 1.35 |
| Heading 1 | ABCRepro | 18px (1.13rem) | 400 | 1.35 |
| Heading 1 | ABCRepro | 18px (1.13rem) | 500 | 1.35 |
| Button | ABCRepro | 18px (1.13rem) | 400 | 1.35 |
| Heading 1 | ABCRepro | 16px (1.00rem) | 400 | null |
| Heading 1 | ABCRepro | 16px (1.00rem) | 500 | 1.20 |
| Link | ABCRepro | 16px (1.00rem) | 400 | null |
| Button | ABCRepro | 16px (1.00rem) | 500 | 1.10 |
| Button | ABCRepro | 16px (1.00rem) | 400 | 1.30 |
| Heading 1 | ABCRepro | 16px (1.00rem) | 400 | 1.30 |
| Heading 1 | ABCReproMono | 16px (1.00rem) | 400 | 1.00 |
| Button | ABCRepro | 16px (1.00rem) | 400 | null |
| Heading 1 | ABCRepro | 16px (1.00rem) | 700 | 1.30 |
| Link | ABCRepro | 16px (1.00rem) | 400 | 1.30 |
| Caption | ABCRepro | 14px (0.88rem) | 500 | 1.20 |
| Caption | ABCRepro | 14px (0.88rem) | 400 | 1.14 |
| Button | ABCRepro | 14px (0.88rem) | 400 | 1.14 |
| Button | ABCRepro | 13.33px (0.83rem) | 400 | null |
| Caption | ABCRepro | 13.33px (0.83rem) | 400 | null |
| Caption | ABCRepro | 12px (0.75rem) | 400 | 1.20 |
| Button | ABCRepro | 12px (0.75rem) | 400 | 1.30 |
| Caption | ABCRepro | 12px (0.75rem) | 500 | 1.33 |
| Caption | ABCRepro | 12px (0.75rem) | 500 | 1.40 |
| Caption | ABCRepro | 10px (0.63rem) | 500 | 1.20 |
3.3 Hierarchy
The scale is tight — small jumps between sizes, especially in the 16–20px range. That’s great for UI consistency. The large headline sizes (72px, 40px) are used sparingly, likely only in hero sections. Mid-range (20–24px) handles section titles and UI labels. Captions drop to 14px or lower.
Weights are mostly 500, with occasional 400 for body text. Mono uppercase at 16px adds a distinct “system” feel to certain labels.
4. Spacing & Layout
4.1 Spacing Scale
Base unit is 8px. Common values:
| Px | Rem | Count |
|---|---|---|
| 1px | 0.06rem | 22 |
| 4px | 0.25rem | 12 |
| 8px | 0.50rem | 244 |
| 10px | 0.63rem | 112 |
| 12px | 0.75rem | 22 |
| 14px | 0.88rem | 10 |
| 16px | 1.00rem | 65 |
| 20px | 1.25rem | 75 |
| 24px | 1.50rem | 48 |
| 32px | 2.00rem | 34 |
| 40px | 2.50rem | 9 |
| 56px | 3.50rem | 26 |
| 60px | 3.75rem | 21 |
| 64px | 4.00rem | 38 |
| 120px | 7.50rem | 4 |
4.2 Layout
Breakpoints at 1023px and 1024px — precise, not rounded. This is likely to target specific device classes. Tailwind is in play, so spacing tokens map directly to utility classes.
The grid is consistent — multiples of 8px everywhere. Section padding often lands at 64px or 120px on desktop.
5. Visual Elements
Border Radius System
| Radius | Count | Elements |
|---|---|---|
| 0px 0px 24px 24px | 2 | div, header |
| 4px | 3 | status, badge |
| 6px | 36 | button, combobox |
| 8px | 116 | a, div, link, button, figure |
| 12px | 169 | link, button, play button |
| 16px | 169 | card, div, modal, image |
| 24px | 33 | div, menuitem, image |
| 9999px | 51 | div, image |
Shadows
Mostly flat. Some massive 0px 0px 0px 10000px overlays for modals. Occasional subtle drop shadows like rgba(14, 18, 22, 0.24) 0px 0px 32px -5px.
Borders
1px solid #0a0e12 for buttons in certain contexts. Otherwise minimal.
6. Components
6.1 Buttons
Vimeo has multiple button styles:
Example: CTA Bright Cyan
- Default: bg
#17d5ff, color#141a20, padding12px 16px, radius12px - Hover: bg
#fafafa - Focus: none
Example: Hover Accent
- Default: bg
#13b1d4, color#141a20, radius12px - Hover: none
Example: Dark Solid
- Default: bg
#28313a, color#fafcfd, radius12px
6.2 Links
Some links are underlined, others are not. Colors map to context:
- Dark text links (#0a0e12, #141a20) often underlined.
- Light text links (#fafcfd) never underlined.
6.3 Forms
Text inputs share 6px radius, bg #dfe4ea, text #3d4751. No strong focus ring — possibly relying on outline color changes.
6.4 Cards
Radius 16px, padding mapped to 16–24px. Shadows minimal, likely flat.
7. Design Tokens (CSS Variables)
:root {
/* Colors */
--color-primary-neutral: #0a0e12;
--color-secondary-neutral: #141a20;
--color-background-light: #fafcfd;
--color-gray-mid: #3d4751;
--color-gray-slate: #4c5864;
--color-black: #000000;
--color-cyan-hover: #13b1d4;
--color-cyan-bright: #17d5ff;
--color-gray-light: #dfe4ea;
/* Typography */
--font-primary: "ABCRepro", "ABCRepro Fallback", "InterTight", "InterTight Fallback", Helvetica, Arial;
--font-mono: "ABCReproMono", "ABCReproMono Fallback";
/* Spacing */
--space-1: 1px;
--space-4: 4px;
--space-8: 8px;
--space-10: 10px;
--space-12: 12px;
--space-14: 14px;
--space-16: 16px;
--space-20: 20px;
--space-24: 24px;
--space-32: 32px;
--space-40: 40px;
--space-56: 56px;
--space-60: 60px;
--space-64: 64px;
--space-120: 120px;
/* Radius */
--radius-sm: 4px;
--radius-md: 6px;
--radius-lg: 8px;
--radius-xl: 12px;
--radius-xxl: 16px;
--radius-3xl: 24px;
--radius-full: 9999px;
}8. AI Coding Assistant Prompt
# Vimeo Design System Specification
You are a Vimeo design expert. Build UIs matching their visual language exactly.
## Brand Context
Vimeo's design is cinema-first minimalism: dark neutrals, bright cyan accents, and precise typography. UI elements are consistent in radius and spacing, with minimal shadows. Interaction cues are clear and high-contrast.
## Color Palette
- Primary Neutral: #0a0e12 — Base text, borders, dark surfaces
- Secondary Neutral: #141a20 — Icons, nav backgrounds
- Background Light: #fafcfd — Light UI sections
- Gray Mid: #3d4751 — Secondary text
- Gray Slate: #4c5864 — Less frequent neutral text
- Black: #000000 — Borders, dropdowns
- Cyan Hover: #13b1d4 — Hover states, interactive accents
- Bright Cyan: #17d5ff — Primary CTAs, modal icons
- Gray Light: #dfe4ea — Icon containers, light backgrounds
## Typography
Font Families:
- Primary: "ABCRepro", "ABCRepro Fallback", "InterTight", "InterTight Fallback", Helvetica, Arial
- Mono: "ABCReproMono", "ABCReproMono Fallback"
Type Sizes:
| Level | Size | Weight | Line Height | Use |
| H1 | 72px | 500 | 1.00 | Hero titles |
| H1 | 40px | 500 | 1.00 | Section titles |
| Button | 32px | 500 | 1.10 | Large button text |
| Body | 20px | 400 | 1.40 | Paragraph text |
| Caption | 14px | 500 | 1.20 | Labels |
## Spacing & Grid
Base: 8px grid
Scale: 1px, 4px, 8px, 10px, 12px, 14px, 16px, 20px, 24px, 32px, 40px, 56px, 60px, 64px, 120px
## Border Radius
- none: 0 — headers
- sm: 4px — badges
- md: 6px — inputs, small buttons
- lg: 8px — links, figures
- xl: 12px — buttons, play buttons
- xxl: 16px — cards, modals
- 3xl: 24px — large images
- full: 9999px — pills, avatars
## Shadows & Depth
Flat design; minimal shadows. Use rgba(14, 18, 22, 0.24) for subtle depth when needed.
## Components
### Primary Button
```css
.btn-primary {
background: #17d5ff;
color: #141a20;
padding: 12px 16px;
border-radius: 12px;
font-weight: 400;
font-size: 16px;
border: none;
}
.btn-primary:hover { background: #fafafa; }
.btn-primary:focus { outline: none; }
```
### Secondary Button
```css
.btn-secondary {
background: #13b1d4;
color: #141a20;
border-radius: 12px;
}
```
### Input Field
```css
.input {
background: #dfe4ea;
color: #3d4751;
border-radius: 6px;
padding: 1px 6px 1px 8px;
}
```
### Card
```css
.card {
border-radius: 16px;
padding: 16px;
background: #fafcfd;
}
```
## Layout & Responsive Rules
- Breakpoints: 1023px (mobile), 1024px (desktop)
- Section padding: 64px desktop, 32px mobile
- Grid gap: multiples of 8px
## Interaction Rules
- Transition: 150ms ease for hover/focus changes
- Focus indicators: subtle outline or color shift
## DO List
- Use only palette colors
- Maintain 8px grid spacing
- Keep radius consistent per component type
- Use ABCRepro for all headings and UI text
- Reserve bright cyan for interactive elements
## DON'T List
- Don't invent new colors
- Don't mix sharp and rounded corners
- Don't use heavy shadows
- Don't apply cyan to non-interactive text
## Code Examples
### Tailwind Primary Button
```html
<button class="bg-[#17d5ff] text-[#141a20] px-4 py-3 rounded-[12px] hover:bg-[#fafafa]">
Start Now
</button>
```
### Tailwind Card
```html
<div class="bg-[#fafcfd] rounded-[16px] p-4">
Card content
</div>
```
### Tailwind Input
```html
<input class="bg-[#dfe4ea] text-[#3d4751] rounded-[6px] px-2 py-1" placeholder="Search">
```9. Summary
TL;DR Vimeo's design system is built on dark neutrals, bright cyan accents, and precise typography. It’s cinematic, minimal, and interaction-focused. Every pixel feels intentional.
Brand Keywords: cinema-first, cool-minimalist, interaction-precise, creator-centric