CurseForge Design System Deep Dive
1. Brand Overview
CurseForge is the cornerstone of the modding world — the bridge between players, creators, and the games they love. The brand’s design system sits at the intersection of gaming utility and community-driven creativity. It’s a UI for builders, tinkerers, and explorers — people who live inside mod lists, compatibility charts, and server configs. And it shows.
The visual language of CurseForge is unapologetically dark-tech. You won’t find gradients or delicate drop shadows here. The design is stripped-down, high-contrast, and focused on utility. Its purpose: get mod packs downloaded fast and make creators’ tools feel reliable.
This site works on the assumption that users already know what they want — no “onboarding” fluff, no storytelling banners. Just search, navigate, download. The color palette — anchored by that bright orange #f16436 — runs hot against dark grays, producing a visual rhythm you remember after one glance. It’s gaming energy without neon excess.
Typographically, it deploys Montserrat for headline authority and Lato for function. The combination is clean, readable, and distinctly modern — the kind of dual font pairing that says “tool, but built by designers.” The system has range: from a bold 44px Montserrat headline to compact 13px Lato labels. They’ve clearly tuned it for both fullscreen desktop dashboards and dense data views.
The brand doesn’t chase visual softness; it’s angular and grounded. Border radii are restrained (4px–5px), and most interactive elements are flat. Many buttons use border-radius: 0px. This gives everything a slightly industrial feel — fitting for a digital forge. Hover states flip hard: dark to orange bursts, instantly visible. It creates a satisfying feedback loop without animation bloat.
In short: CurseForge is built for clarity over charm. It’s a gamer’s utility UI — dense with function, trimmed of flair. Every decision reinforces this: multitone grays for neutrality, orange for heat, typography for efficiency.
2. Color System
2.1 Primary Colors
The entire identity revolves around one unmistakable hue: Orange (#f16436) — officially rgb(241, 100, 54). It’s fiery, confident, and unmistakably “forge.” The orange suggests heat, creation, and motion — entirely consistent with the brand name. Against a predominantly gray-black environment, it grabs attention immediately.
Where some gaming brands overuse their neon accents, CurseForge uses its orange sparingly. It's saved for primary CTAs — like download buttons and highlights — ensuring it always commands attention.
The secondary core tone — Dark Gray (#333333) — grounds the UI. It forms the structural base for navs, headers, and cards. This high-contrast relationship between orange (#f16436) and gray (#333333) defines the entire ecosystem: light-on-dark legibility with hot accent contrast.
2.2 Complete Palette
| Color Name | Hex | Role | Usage |
|---|---|---|---|
| Primary Orange | #f16436 | Primary | CTAs, download buttons, primary accents |
| Secondary Gray | #333333 | Secondary | Navigation background, button backgrounds |
| Neutral Light | #b2b2b2 | Neutral | Sub-nav link, help center link |
| White | #ffffff | Neutral / Text | Logo, text on dark backgrounds |
| Light Gray | #dfdfdf | Neutral | Buttons, icons |
| Mid Gray | #9f9f9f | Neutral | Text, icons, dividers |
| Darkest Gray | #0d0d0d | Accent | Logo base, hover effects |
| Pale Gray 1 | #e7e7e7 | Neutral | Hover/focus states |
| Pale Gray 2 | #dadada | Neutral | Hover/focus variants |
| Pale Gray 3 | #e1e1e1 | Neutral | Hover/focus variants |
| Success Green | #32A100 | Functional | Success text |
| Warning Orange | #E07400 | Functional | Alerts, warning text |
| Critical Red | #fe3737 | Functional | Error text |
| Info Blue | #2690E7 | Functional | Info text |
| Info Background Blue | #102534 | Functional | Info background |
| Success Background | #2C302D | Functional | Success background |
| Critical Background | #3E150C | Functional | Error background |
| Warning Background | #443611 | Functional | Warning background |
| Brand Hover Orange | #ff784d | Interactive | Hover state for primary buttons |
2.3 Color Relationships
CurseForge’s palette lives in the high-contrast zone. Most background-to-text pairs are above 7:1, easily meeting WCAG AAA contrast when using white (#fff) on the dark secondary backgrounds (#333333, #0d0d0d).
The primary orange (#f16436) on dark gray yields a ratio near 4.4:1 — sufficient for normal-sized text but tight for body text, so it’s wisely confined to large CTAs or icons. Text is usually light gray (#dfdfdf or #b2b2b2) for softer contrast that avoids eye strain.
Functional colors (success, warning, critical) are heavily muted backgrounds with vibrant text overlays. For example, warning text (#E07400) placed over #443611 is comfortably legible. The system feels tested for dark mode first — there’s no indication of a light variant.
2.4 Usage Guide
- Use #f16436 only for action-driven highlight elements. It's too strong for icons or paragraphs. Keep it to buttons and key states.
- Avoid white backgrounds. This palette is engineered for dark mode. White breaks the atmosphere.
- Hover states push warmth: orange brightens to #ff784d; keep transitions quick (under 150ms).
- Text clarity comes before hierarchy. Use whites and mid-grays to differentiate hierarchy, not color blending.
- Error and warning systems are background-first: text pops, not neon.
- Never overlay orange on gray text. The harmony collapses instantly.
This color system thrives on simplicity — minimal hues, maximum purpose.
3. Typography
3.1 Font Families
CurseForge runs two distinct font stacks:
- Montserrat (
montserratLocalFont, montserratLocalFont Fallback) - Lato (
latoLocalFont, latoLocalFont Fallback)
It’s worth noting that no Google Font CDN is used; they’re locally served — clear signal of performance and brand control. No variable fonts or Adobe integrations are active.
Montserrat handles headings and brand-weight text — geometric, bold, modern. Lato fills everything else: body text, links, buttons, forms. The difference is subtle but real: Montserrat gives visual strength; Lato provides readability and warmth.
3.2 Type Scale
| Element | Font | Size | Weight | Line Height |
|---|---|---|---|---|
| H1 (large) | montserratLocalFont | 44px (2.75rem) | 700 | 1.18 |
| H1 (medium) | montserratLocalFont | 32px (2.00rem) | 700 | 1.25 |
| H1 (small) | montserratLocalFont | 24px (1.50rem) | 700 | 1.33 |
| Subheading | latoLocalFont | 20px (1.25rem) | 600 | 1.20 |
| Subheading alt | latoLocalFont | 20px (1.25rem) | 500 | 1.20 |
| Title small | montserratLocalFont | 18px (1.13rem) | 700 | 1.50 |
| Paragraph strong | latoLocalFont | 18px (1.13rem) | 700 | 1.33 |
| Paragraph | latoLocalFont | 18px (1.13rem) | 400 | 1.44 |
| Link | latoLocalFont | 16px (1rem) | 400 | 1.50 |
| Link alt | montserratLocalFont | 16px (1rem) | 500 | 1.50 (uppercase) |
| Button text | latoLocalFont | 16px (1rem) | 600 | 1.25 |
| Button alt | montserratLocalFont | 16px (1rem) | 500 | 1.50 (capitalize) |
| Caption | latoLocalFont | 14px (0.88rem) | 400 | 1.50 |
| Small label | latoLocalFont | 13px (0.81rem) | 400 | 1.62 |
3.3 Hierarchy
The hierarchy here is clear-cut. Size and weight carry all the load; color doesn’t vary much. Headlines scream authority through size jumps (44 → 32 → 24 px). Lato’s lighter stroke width provides legibility for dense data tables and mod lists.
Text line heights are tuned for dark surfaces — lower than typical white-background UIs. That prevents “halos” of space around each line and feels tighter, more grounded. There’s no typographic experimentation or italics — a disciplined, functional rhythm that fits its utilitarian purpose.
Montserrat and Lato complement each other without friction. Headings sit assertively above muted body content. It’s the typographic equivalent of tool steel with clean welds.
4. Spacing & Layout
4.1 Spacing Scale
CurseForge is built around an 8px grid, which anchors everything. The common spacing values show disciplined multiples of 4, with 8 at the core.
| Value | Rem | Frequency | Usage |
|---|---|---|---|
| 4px | 0.25rem | 16 | Tight padding, icon gaps |
| 6px | 0.38rem | 4 | Rare adjustments (micro alignments) |
| 8px | 0.50rem | 76 | Buttons, form fields |
| 12px | 0.75rem | 36 | Inner padding on cards |
| 16px | 1.00rem | 27 | Component margins, nav links |
| 20px | 1.25rem | 9 | Component grouping |
| 24px | 1.50rem | 4 | Card padding |
| 32px | 2.00rem | 19 | Section spacing |
| 40px | 2.50rem | 5 | Page section separation |
| 48px | 3.00rem | 7 | Larger vertical spacing |
| 64px | 4.00rem | 7 | Hero / container spacing |
| 80px | 5.00rem | 8 | Page margin blocks |
Everything fits cleanly into this system — nothing out of sequence except a few hybrid values (34px, 35px) that likely come from specific component tweaks.
4.2 Layout
The only breakpoint detected: 1530px. That’s a single high-end breakpoint — so the responsive scheme probably relies on flex or grid collapse rather than multiple fixed breakpoints. Smart for a modern web app that runs in Electron-like containers (the CurseForge desktop app mirrors this site’s layout).
Expect content width capping around 1200px to 1440px inside that. The spacing rhythm remains 8-based even on large screens — no ornamental breathing space, just functional alignment.
5. Visual Elements
Border Radius System
| Radius | Count | Elements | Confidence |
|---|---|---|---|
| 0px | implied | Buttons | high |
| 4px | 7 | div, card | medium |
| 5px | 6 | div | medium |
| 10px | 1 | div | low |
| 12px | 1 | image | low |
| 50% | 7 | Round icons, buttons | medium |
The sharp edges dominate. Most UI pieces use 0px or 4px — a boxy, industrial feel. Rounded shapes (50%) are clearly reserved for icons or back-to-top buttons — circular actions, not content containers. No mixing of corner systems, which is great: consistent geometry gives confidence.
Shadows
Single shadow token:
rgba(0, 0, 0, 0.5) 0px 2px 10px 0pxUsed sparingly — probably hover or modals. Overall, it’s basically flat design. The UI relies on color contrast and layering, not shadow depth.
Borders
Borders are minimal. Most combinations use 1px solid neutral tones like #999999 or rgba(255,255,255,0.16) — soft dividers instead of strong outlines. The few inset borders (2px inset #999999) feel like legacy or embedded-frame styling.
CurseForge leans more on spacing and color than on borders for separation. The single-pixel logic backs the flat aesthetic.
6. Components
6.1 Buttons
Four main button styles extracted.
Primary Button
Classes: link-btn btn-primary link-btn-icon
| State | Property | Value |
|---|---|---|
| Default | Background | rgb(241, 100, 54) (#f16436) |
| Text Color | rgb(255, 255, 255) (#ffffff) | |
| Padding | 8px 16px | |
| Border Radius | 0px | |
| Border | none | |
| Hover | Background | rgb(255, 120, 77) (#ff784d) |
| Text Color | rgb(13, 13, 13) (#0d0d0d) |
Purposeful, clean, assertive. This button owns visual attention. Zero radius keeps it tech-looking. The hover color creates satisfying visual feedback by warming the orange and inverting text tone.
Secondary Button
Classes: link-btn btn-secondary premium-button-container
| State | Property | Value |
|---|---|---|
| Default | Background | rgb(51, 51, 51) (#333333) |
| Text Color | rgb(229, 229, 229) (#e5e5e5 approx) | |
| Padding | 8px 16px | |
| Radius | 0px | |
| Hover | Background | rgb(255, 120, 77) (#ff784d) |
| Text | rgb(13, 13, 13) |
It flips from subdued gray to warm orange on hover — consistent with the brand feedback pattern.
Lined/Login Button
Classes: link-btn btn-login btn-lined login-button-contain
| State | Property | Value |
|---|---|---|
| Default | Background | transparent |
| Text Color | rgb(229, 229, 229) | |
| Border | 1px solid rgb(128, 128, 128) | |
| Hover | Background | #ff784d |
| Text | #0d0d0d |
This one’s more understated. The lined style matches “login” patterns: minimal visual weight, strong on hover.
Icon Button
Classes: btn-single-icon btn-search
| State | Property | Value |
|---|---|---|
| Default | Background | rgb(48, 48, 48) |
| Text | rgb(223, 223, 223) | |
| Border | 1px solid rgba(255,255,255,0.16) | |
| Padding | 0px | |
| Radius | 0px |
Compact, functional. The 13px font size confirms it’s meant for UI controls (search icons, tool actions).
6.2 Links
Multiple link variants — all slight variations in gray intensity.
| Default Color | Hover Color | Decoration | Use |
|---|---|---|---|
| #ffffff | #0d0d0d | none | Primary nav or footer |
| #9f9f9f | #0d0d0d | none | Secondary nav |
| #b2b2b2 | #0d0d0d | underline default | Inline documentation |
| #e5e5e5 | #0d0d0d | none | Light mode text links |
| #999999 | #0d0d0d | none | In-content, less prominent |
| #0d0d0d | #0d0d0d | underline | Likely dark-on-light variant |
Hover pattern: almost every link changes to black (#0d0d0d) on hover, which fits if a hover background is orange — maintaining strong contrast.
6.3 Inputs
Search input has a solid, minimal style.
| Property | Default Value |
|---|---|
| Background | #202020 |
| Text Color | #9f9f9f |
| Border | none |
| Padding | 8px 12px |
| Radius | 0px |
No border, just background tone changes. This feels consistent with the dark, integrated look. Shadows are off — all about color layers.
6.4 Cards
Card-level visual data:
- Border-radius: 4px or 5px
- Shadow: rgba(0,0,0,0.5) 0px 2px 10px 0px (light and wide)
Cards are restrained — just enough shadow to lift, no depth noise. Likely used for mod previews and downloads.
7. Design Tokens
/* === CurseForge Design Tokens === */
/* Colors */
--color-primary: #f16436;
--color-secondary: #333333;
--color-neutral-light: #b2b2b2;
--color-white: #ffffff;
--color-light-gray: #dfdfdf;
--color-mid-gray: #9f9f9f;
--color-darkest: #0d0d0d;
--color-hover-orange: #ff784d;
--color-success: #32A100;
--color-warning: #E07400;
--color-critical: #fe3737;
--color-info: #2690E7;
/* Semantic backgrounds */
--background-info: #102534;
--background-success: #2C302D;
--background-warning: #443611;
--background-critical: #3E150C;
/* Typography */
--font-heading: "montserratLocalFont", sans-serif;
--font-body: "latoLocalFont", sans-serif;
--font-size-h1: 44px;
--font-size-h2: 32px;
--font-size-h3: 24px;
--font-size-h4: 20px;
--font-size-h5: 18px;
--font-size-body: 16px;
--font-size-small: 14px;
--font-size-xs: 13px;
/* Spacing */
--space-4: 4px;
--space-8: 8px;
--space-12: 12px;
--space-16: 16px;
--space-20: 20px;
--space-24: 24px;
--space-32: 32px;
--space-40: 40px;
--space-48: 48px;
--space-64: 64px;
--space-80: 80px;
/* Border radius */
--radius-none: 0px;
--radius-sm: 4px;
--radius-md: 5px;
--radius-lg: 10px;
--radius-xl: 12px;
--radius-full: 50%;
/* Shadow */
--shadow-default: rgba(0, 0, 0, 0.5) 0px 2px 10px 0px;
/* Breakpoints */
--breakpoint-desktop: 1530px;8. AI Coding Assistant Prompt
# CurseForge Design System Specification
You are a CurseForge design expert. Build UIs matching their visual language exactly.
## Brand Context
CurseForge’s design is dark, structured, and purpose-driven. It feels like a developer tool built for gamers — dense UI, high contrast, practical hierarchy. Every pixel serves function, not decoration. Orange heat on forged dark steel.
## Color Palette
- Primary Orange: #f16436 — primary CTAs, highlights, buttons
- Brand Hover Orange: #ff784d — hover states for actions
- Secondary Gray: #333333 — app background, navigation
- White: #ffffff — text on dark
- Neutral Light: #b2b2b2 — sub-links, metadata
- Light Gray: #dfdfdf — buttons, icons
- Mid Gray: #9f9f9f — text, placeholders
- Darkest Gray: #0d0d0d — hover text, logo base
- Success Green: #32A100 — success messages
- Warning Orange: #E07400 — warnings
- Critical Red: #fe3737 — errors
- Info Blue: #2690E7 — information tone
- Info Background: #102534 — info container
- Success Background: #2C302D — success container
- Warning Background: #443611 — low warning background
- Critical Background: #3E150C — low error background
## Typography
- Headings: "montserratLocalFont", sans-serif
- Body: "latoLocalFont", sans-serif
| Level | Font | Size | Weight | Line Height | Use |
|-------|------|------|--------|-------------|-----|
| H1 | Montserrat | 44px | 700 | 1.18 | Page titles |
| H2 | Montserrat | 32px | 700 | 1.25 | Section headings |
| H3 | Montserrat | 24px | 700 | 1.33 | Subsections |
| Subhead | Lato | 20px | 600 | 1.20 | Headings below titles |
| Body | Lato | 16px | 400 | 1.50 | Standard content |
| Caption | Lato | 14px | 400 | 1.50 | Secondary info |
| Small Label | Lato | 13px | 400 | 1.62 | Inline labels and UI controls |
## Spacing & Grid
Base: 8px grid
Scale: 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80
Use:
- 8px for button padding
- 16px for card body padding
- 32px+ for section spacing
## Border Radius
- none: 0px — buttons, inputs
- sm: 4px — cards, small panels
- md: 5px — containers
- lg: 10px — rare rounded blocks
- xl: 12px — image thumbnails
- full: 50% — circular buttons and avatars
## Shadows & Depth
- rgba(0, 0, 0, 0.5) 0px 2px 10px 0px — use sparingly for cards or modals
Mostly flat; depth created through tone, not elevation.
## Component Specifications
### Primary Button
```css
.btn-primary {
background: #f16436;
color: #ffffff;
padding: 8px 16px;
border-radius: 0;
border: none;
font-size: 16px;
font-weight: 400;
transition: background 150ms ease;
}
.btn-primary:hover {
background: #ff784d;
color: #0d0d0d;
}
```
### Secondary Button
```css
.btn-secondary {
background: #333333;
color: #e5e5e5;
padding: 8px 16px;
border: none;
border-radius: 0;
font-size: 16px;
}
.btn-secondary:hover {
background: #ff784d;
color: #0d0d0d;
}
```
### Lined Button
```css
.btn-lined {
background: transparent;
border: 1px solid #808080;
color: #e5e5e5;
padding: 8px 16px;
}
.btn-lined:hover {
background: #ff784d;
color: #0d0d0d;
}
```
### Input Field
```css
.input-search {
background: #202020;
color: #9f9f9f;
border: none;
padding: 8px 12px;
border-radius: 0;
}
.input-search:focus {
outline: 1px solid #f16436;
}
```
### Card
```css
.card {
background: #333333;
border-radius: 4px;
padding: 16px;
box-shadow: rgba(0,0,0,0.5) 0px 2px 10px 0px;
}
```
## Layout & Responsive Rules
- Max container width: 1530px breakpoint
- Maintain grid-based layout with 8px increments
- Section padding: 32px–64px
- Use flex/grid to adapt content; minimal fixed breakpoints
## Interaction Rules
- Hover feedback via color only (150ms ease)
- No transitions on text color
- Focus state: outline or orange glow acceptable
- Disabled states use 50% opacity, no hover effect
## DO List
1. Use only defined HEX colors — no improvisation.
2. Keep border-radius consistent (0 or 4px).
3. Use 8px spacing grid religiously.
4. Primary orange only for CTAs or brand highlights.
5. Keep typography pair: Montserrat (headings), Lato (body).
6. Use #ff784d hover consistently.
7. Keep interfaces dark — avoid white backgrounds.
8. Enforce contrast; never overlay orange text on gray.
## DON'T List
1. Don’t mix rounded and square corners in one module.
2. Don’t alter font stacks — no Roboto, no Helvetica.
3. Don’t apply gradients or multi-color backgrounds.
4. Don’t soften shadows; keep the flat industrial look.
5. Don’t alter hover timing.
6. Don’t alter spacing scale — multiples of 8px only.
7. Don’t use orange for passive text elements.
## Code Examples
### Tailwind Implementations
```html
<!-- Primary Button -->
<button class="bg-[#f16436] text-white px-4 py-2 hover:bg-[#ff784d] hover:text-[#0d0d0d] uppercase">Download</button>
<!-- Secondary Button -->
<button class="bg-[#333333] text-[#e5e5e5] px-4 py-2 hover:bg-[#ff784d] hover:text-[#0d0d0d]">Learn More</button>
<!-- Input -->
<input class="bg-[#202020] text-[#9f9f9f] px-3 py-2 border-0 focus:outline-[#f16436]" placeholder="Search mods" />
<!-- Card -->
<div class="bg-[#333333] p-4 rounded-[4px] shadow-[0_2px_10px_rgba(0,0,0,0.5)]">
<h3 class="text-white font-[Montserrat] text-2xl">Mod Title</h3>
<p class="text-[#b2b2b2]">Description snippet...</p>
</div>
```9. Summary
TL;DR: CurseForge’s design system is disciplined, dark, and precise. It’s a forge of function — everything hot, metallic, and utilitarian. You get heat from the orange and structure from the gray. Flat, sharp, and honest.
Brand Keywords:
- gamer-industrial
- tech-functional
- dark-forge
- high-contrast
- utilitarian-minimalist