Neumorphism (also called Soft UI or Neo-skeuomorphism) is a UI design aesthetic that creates the illusion of elements extruding from or recessing into the background surface, as if molded from a single sheet of soft material. The effect is achieved through carefully paired light and dark shadows on elements that share the same color as their parent background, producing a subtle, tactile dimensionality that sits between flat design and full skeuomorphism. Coined by designer Jason Kelley and popularized by Alexander Plyuto’s Dribbble explorations in late 2019, the style evokes extruded plastic, embossed paper, or molded rubber – surfaces that feel physically continuous rather than layered.
Neumorphism is inherently monochromatic. The entire palette derives from a single background hue with shadows computed as darker and lighter variants of that base.
| Role | Hex | Description |
|---|---|---|
| Background base | #e0e5ec |
The canonical neumorphic background; a cool, slightly blue-tinted light gray |
| Dark shadow | #a3b1c6 |
Shadow cast away from light source (~15-20% darker than base) |
| Light shadow | #ffffff |
Highlight shadow toward light source (pure white or near-white) |
| Text primary | #2d3436 |
Dark charcoal for primary text; sufficient contrast on light gray |
| Text secondary | #636e72 |
Medium gray for secondary text and labels |
| Text muted | #b2bec3 |
Light gray for placeholders and disabled text |
| Name | Hex | Shadow Dark | Shadow Light | Vibe |
|---|---|---|---|---|
| Warm gray | #e8e0d8 |
#c4bdb6 |
#ffffff |
Warmer, organic feel |
| Cool lavender | #e6e7ee |
#b8b9bf |
#ffffff |
The Themesberg Neumorphism UI default |
| Neutral gray | #e0e0e0 |
#bebebe |
#ffffff |
Pure neutral, no color cast |
| Soft mint | #dce8e0 |
#b5c2b8 |
#ffffff |
Subtle green undertone |
| Pale blue | #dde4f0 |
#b0b8c6 |
#ffffff |
Slightly more saturated cool tone |
| Role | Hex | Description |
|---|---|---|
| Background base | #2d2d2d |
Deep neutral dark gray |
| Dark shadow | #252525 |
~10% darker than base |
| Light shadow | #353535 |
~10% lighter than base |
| Alt background | #303030 |
Slightly lighter variant for layering |
| Text primary | #e0e0e0 |
Light text for dark surfaces |
| Text secondary | #a0a0a0 |
Muted light text |
Used sparingly for interactive states, toggles, progress indicators, and focus rings:
| Role | Hex | Description |
|---|---|---|
| Primary accent | #4d7cff |
Soft blue for active states and links |
| Success | #55efc4 |
Muted mint green |
| Warning | #ffeaa7 |
Soft warm yellow |
| Danger | #ff7675 |
Soft coral red |
| Info | #74b9ff |
Light sky blue |
| Active toggle | #6c5ce7 |
Muted purple for on-state indicators |
:root {
/* Base surface */
--neu-bg: #e0e5ec;
--neu-shadow-dark: #a3b1c6;
--neu-shadow-light: #ffffff;
/* Text */
--neu-text-primary: #2d3436;
--neu-text-secondary: #636e72;
--neu-text-muted: #b2bec3;
/* Accent */
--neu-accent: #4d7cff;
--neu-accent-soft: rgba(77, 124, 255, 0.15);
--neu-success: #55efc4;
--neu-warning: #ffeaa7;
--neu-danger: #ff7675;
/* Shadow distances */
--neu-distance: 8px;
--neu-blur: 15px;
--neu-distance-sm: 4px;
--neu-blur-sm: 8px;
--neu-distance-lg: 12px;
--neu-blur-lg: 24px;
}
For any base background color, compute shadows as follows:
Neumorphism typography should be:
| Font | Weight(s) | Usage | Link |
|---|---|---|---|
| Nunito Sans | 400, 600, 700 | Primary UI font; the default for the Neumorphism UI framework | Nunito Sans |
| Nunito | 400, 600, 700 | Rounded terminals; ideal match for soft neumorphic surfaces | Nunito |
| Inter | 400, 500, 600 | Excellent screen legibility at small sizes; tall x-height | Inter |
| Poppins | 300, 400, 500, 600 | Geometric and modern; works well for headings | Poppins |
| Quicksand | 400, 500, 700 | Rounded geometric; reinforces the soft material metaphor | Quicksand |
| Varela Round | 400 | Single-weight rounded sans; clean and friendly | Varela Round |
| DM Sans | 400, 500, 700 | Clean geometric sans-serif; good body text alternative | DM Sans |
| Heading Font | Body Font | Character |
|---|---|---|
| Poppins (600) | Nunito Sans (400) | Modern, geometric, polished |
| Quicksand (700) | Nunito (400) | Soft, rounded, cohesive |
| Nunito (700) | Inter (400) | Friendly headings, legible body |
| DM Sans (700) | Nunito Sans (400) | Clean and minimal |
@import url('https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700&family=Poppins:wght@400;500;600&display=swap');
body {
font-family: 'Nunito Sans', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.6;
color: var(--neu-text-primary);
-webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Poppins', 'Nunito Sans', sans-serif;
font-weight: 600;
color: var(--neu-text-primary);
line-height: 1.2;
letter-spacing: -0.01em;
}
.neu-display {
font-family: 'Poppins', sans-serif;
font-size: clamp(2.5rem, 5vw, 4rem);
font-weight: 600;
letter-spacing: -0.02em;
line-height: 1.1;
}
.neu-label {
font-family: 'Nunito Sans', sans-serif;
font-weight: 700;
font-size: 0.85rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--neu-text-secondary);
}
--neu-distance-sm below 768px)The fundamental neumorphic effect – element appears to push out from the background:
.neu-raised {
background: var(--neu-bg);
border-radius: 20px;
padding: 32px;
box-shadow:
8px 8px 15px var(--neu-shadow-dark),
-8px -8px 15px var(--neu-shadow-light);
}
Element appears dented into the surface – used for active states and input fields:
.neu-pressed {
background: var(--neu-bg);
border-radius: 20px;
padding: 32px;
box-shadow:
inset 5px 5px 10px var(--neu-shadow-dark),
inset -5px -5px 10px var(--neu-shadow-light);
}
Resting state with no elevation – useful for transitional states:
.neu-flat {
background: var(--neu-bg);
border-radius: 20px;
padding: 32px;
box-shadow: none;
}
.neu-card {
background: var(--neu-bg);
border-radius: 20px;
padding: 40px;
box-shadow:
8px 8px 15px rgba(163, 177, 198, 0.5),
-8px -8px 15px rgba(255, 255, 255, 0.6);
}
.neu-button {
background: var(--neu-bg);
color: var(--neu-text-primary);
border: none;
border-radius: 12px;
padding: 14px 32px;
font-family: 'Nunito Sans', sans-serif;
font-weight: 600;
font-size: 1rem;
cursor: pointer;
transition: box-shadow 0.2s ease;
box-shadow:
5px 5px 10px rgba(163, 177, 198, 0.5),
-5px -5px 10px rgba(255, 255, 255, 0.6);
}
.neu-button:hover {
box-shadow:
3px 3px 6px rgba(163, 177, 198, 0.5),
-3px -3px 6px rgba(255, 255, 255, 0.6);
}
.neu-button:active {
box-shadow:
inset 3px 3px 6px rgba(163, 177, 198, 0.5),
inset -3px -3px 6px rgba(255, 255, 255, 0.8);
}
.neu-button-accent {
background: var(--neu-accent);
color: #ffffff;
border: none;
border-radius: 12px;
padding: 14px 32px;
font-family: 'Nunito Sans', sans-serif;
font-weight: 600;
font-size: 1rem;
cursor: pointer;
transition: box-shadow 0.2s ease, transform 0.15s ease;
box-shadow:
5px 5px 10px rgba(163, 177, 198, 0.5),
-5px -5px 10px rgba(255, 255, 255, 0.6);
}
.neu-button-accent:hover {
transform: translateY(-1px);
box-shadow:
6px 6px 12px rgba(163, 177, 198, 0.6),
-6px -6px 12px rgba(255, 255, 255, 0.7);
}
.neu-button-accent:active {
transform: translateY(0);
box-shadow:
inset 3px 3px 6px rgba(50, 80, 180, 0.3),
inset -3px -3px 6px rgba(120, 170, 255, 0.4);
}
.neu-input {
background: var(--neu-bg);
border: none;
border-radius: 10px;
padding: 14px 20px;
font-family: 'Nunito Sans', sans-serif;
font-size: 1rem;
color: var(--neu-text-primary);
outline: none;
box-shadow:
inset 5px 5px 10px rgba(163, 177, 198, 0.5),
inset -5px -5px 12px rgba(255, 255, 255, 0.8);
}
.neu-input::placeholder {
color: var(--neu-text-muted);
}
.neu-input:focus {
box-shadow:
inset 5px 5px 10px rgba(163, 177, 198, 0.5),
inset -5px -5px 12px rgba(255, 255, 255, 0.8),
0 0 0 3px var(--neu-accent-soft);
}
.neu-toggle {
width: 56px;
height: 30px;
background: var(--neu-bg);
border-radius: 999px;
position: relative;
cursor: pointer;
box-shadow:
inset 4px 4px 8px rgba(163, 177, 198, 0.5),
inset -4px -4px 8px rgba(255, 255, 255, 0.7);
transition: background 0.3s ease;
}
.neu-toggle::after {
content: '';
width: 24px;
height: 24px;
background: var(--neu-bg);
border-radius: 50%;
position: absolute;
top: 3px;
left: 3px;
transition: transform 0.3s ease, box-shadow 0.3s ease;
box-shadow:
3px 3px 6px rgba(163, 177, 198, 0.5),
-3px -3px 6px rgba(255, 255, 255, 0.6);
}
.neu-toggle.active {
background: var(--neu-accent);
}
.neu-toggle.active::after {
transform: translateX(26px);
box-shadow:
3px 3px 6px rgba(50, 80, 180, 0.3),
-3px -3px 6px rgba(120, 170, 255, 0.4);
}
.neu-circle {
width: 100px;
height: 100px;
background: var(--neu-bg);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow:
8px 8px 15px rgba(163, 177, 198, 0.5),
-8px -8px 15px rgba(255, 255, 255, 0.6);
}
.neu-progress-track {
background: var(--neu-bg);
border-radius: 999px;
height: 14px;
box-shadow:
inset 3px 3px 6px rgba(163, 177, 198, 0.5),
inset -3px -3px 6px rgba(255, 255, 255, 0.7);
overflow: hidden;
padding: 3px;
}
.neu-progress-fill {
background: var(--neu-accent);
height: 100%;
border-radius: 999px;
box-shadow:
2px 2px 4px rgba(50, 80, 180, 0.3),
-2px -2px 4px rgba(120, 170, 255, 0.3);
transition: width 0.4s ease;
}
Adding a subtle gradient to the element surface enhances the 3D illusion:
.neu-raised-convex {
background: linear-gradient(145deg, #e6ebf2, #ccd1d8);
border-radius: 20px;
padding: 32px;
box-shadow:
8px 8px 15px #a3b1c6,
-8px -8px 15px #ffffff;
}
.neu-pressed-concave {
background: linear-gradient(145deg, #ccd1d8, #e6ebf2);
border-radius: 20px;
padding: 32px;
box-shadow:
inset 5px 5px 10px #a3b1c6,
inset -5px -5px 10px #ffffff;
}
.neu-divider {
height: 2px;
background: var(--neu-bg);
border: none;
margin: 24px 0;
box-shadow:
0px 1px 2px rgba(163, 177, 198, 0.5),
0px -1px 1px rgba(255, 255, 255, 0.6);
}
html, body {
background: var(--neu-bg);
min-height: 100vh;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Neumorphism Layout</title>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700&family=Poppins:wght@400;600&display=swap" rel="stylesheet">
<style>
:root {
--neu-bg: #e0e5ec;
--neu-shadow-dark: rgba(163, 177, 198, 0.6);
--neu-shadow-light: rgba(255, 255, 255, 0.7);
--neu-text-primary: #2d3436;
--neu-text-secondary: #636e72;
--neu-text-muted: #b2bec3;
--neu-accent: #4d7cff;
}
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Nunito Sans', sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.6;
color: var(--neu-text-primary);
background: var(--neu-bg);
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
padding: 3rem 1.5rem;
gap: 2.5rem;
-webkit-font-smoothing: antialiased;
}
h1, h2, h3 {
font-family: 'Poppins', sans-serif;
font-weight: 600;
line-height: 1.2;
}
/* Navigation */
nav {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
max-width: 900px;
background: var(--neu-bg);
border-radius: 16px;
padding: 16px 28px;
box-shadow:
6px 6px 12px var(--neu-shadow-dark),
-6px -6px 12px var(--neu-shadow-light);
}
nav a.logo {
font-family: 'Poppins', sans-serif;
font-weight: 700;
font-size: 1.2rem;
color: var(--neu-text-primary);
text-decoration: none;
}
nav ul {
display: flex;
gap: 24px;
list-style: none;
}
nav ul a {
color: var(--neu-text-secondary);
text-decoration: none;
font-weight: 600;
font-size: 0.9rem;
padding: 8px 16px;
border-radius: 10px;
transition: box-shadow 0.2s ease;
}
nav ul a:hover {
box-shadow:
inset 3px 3px 6px var(--neu-shadow-dark),
inset -3px -3px 6px var(--neu-shadow-light);
}
/* Hero */
.hero {
text-align: center;
max-width: 600px;
padding: 2rem 0;
}
.hero h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
margin-bottom: 1rem;
letter-spacing: -0.02em;
}
.hero p {
color: var(--neu-text-secondary);
font-size: 1.1rem;
margin-bottom: 2rem;
}
/* Cards grid */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 28px;
max-width: 900px;
width: 100%;
}
.neu-card {
background: var(--neu-bg);
border-radius: 20px;
padding: 36px;
box-shadow:
8px 8px 15px var(--neu-shadow-dark),
-8px -8px 15px var(--neu-shadow-light);
}
.neu-card h3 {
margin-bottom: 0.75rem;
font-size: 1.15rem;
}
.neu-card p {
color: var(--neu-text-secondary);
font-size: 0.95rem;
line-height: 1.6;
}
/* Icon circle */
.icon-circle {
width: 56px;
height: 56px;
background: var(--neu-bg);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 1.25rem;
font-size: 1.5rem;
box-shadow:
4px 4px 8px var(--neu-shadow-dark),
-4px -4px 8px var(--neu-shadow-light);
}
/* Button */
.btn {
display: inline-block;
background: var(--neu-accent);
color: #ffffff;
border: none;
border-radius: 12px;
padding: 14px 36px;
font-family: 'Nunito Sans', sans-serif;
font-weight: 700;
font-size: 1rem;
cursor: pointer;
text-decoration: none;
box-shadow:
5px 5px 10px var(--neu-shadow-dark),
-5px -5px 10px var(--neu-shadow-light);
transition: box-shadow 0.2s ease, transform 0.15s ease;
}
.btn:hover {
transform: translateY(-1px);
}
.btn:active {
transform: translateY(0);
box-shadow:
inset 3px 3px 6px rgba(50, 80, 180, 0.3),
inset -3px -3px 6px rgba(120, 170, 255, 0.4);
}
/* Footer */
footer {
color: var(--neu-text-muted);
font-size: 0.85rem;
padding: 2rem 0;
text-align: center;
}
@media (max-width: 768px) {
body { padding: 2rem 1rem; }
nav { flex-direction: column; gap: 12px; }
nav ul { gap: 12px; }
}
</style>
</head>
<body>
<nav>
<a href="#" class="logo">SoftUI</a>
<ul>
<li><a href="#">Features</a></li>
<li><a href="#">Pricing</a></li>
<li><a href="#">About</a></li>
</ul>
</nav>
<div class="hero">
<h1>Design that feels real</h1>
<p>Soft shadows and subtle depth create interfaces that look like they are molded from a single surface.</p>
<a href="#" class="btn">Get Started</a>
</div>
<div class="card-grid">
<div class="neu-card">
<div class="icon-circle">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="9" stroke="#4d7cff" stroke-width="2"/><path d="M12 7v5l3 3" stroke="#4d7cff" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<h3>Subtle Depth</h3>
<p>Dual shadows create a tactile illusion of elements rising from the background surface.</p>
</div>
<div class="neu-card">
<div class="icon-circle">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><rect x="4" y="4" width="16" height="16" rx="4" stroke="#4d7cff" stroke-width="2"/><path d="M9 12l2 2 4-4" stroke="#4d7cff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
</div>
<h3>Soft Interaction</h3>
<p>Pressed states invert the shadow direction, giving buttons a satisfying physical response.</p>
</div>
<div class="neu-card">
<div class="icon-circle">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="4" fill="#4d7cff"/><circle cx="12" cy="12" r="9" stroke="#4d7cff" stroke-width="2" stroke-dasharray="4 3"/></svg>
</div>
<h3>Monochrome Calm</h3>
<p>A restrained palette keeps the focus on form and shadow rather than color competition.</p>
</div>
</div>
<footer>
<p>Molded from a single surface. Neumorphism in action.</p>
</footer>
</body>
</html>
box-shadow with multiple values is well-optimized in modern browsers, but avoid animating shadow blur values directly; transition box-shadow as a whole property instead.| Aesthetic | Relationship to Neumorphism |
|---|---|
| Flat Design | Direct predecessor; neumorphism reintroduces depth that flat design deliberately eliminated, but retains the minimal, clean sensibility |
| Skeuomorphism | Historical ancestor; neumorphism inherits the physical-object metaphor but strips away realistic textures, reflections, and glossy surfaces in favor of pure shadow |
| Claymorphism | Successor; elements float above the background (vs. extruding from it) and use vivid colors instead of monochrome; shares the soft, rounded, tactile quality |
| Glassmorphism | Contemporary sibling; uses transparency and blur for depth rather than shadow and extrusion; colorful and layered vs. monochromatic and continuous |
| Material Design | Google’s elevation system shares the concept of shadow-based depth, but uses distinct surface colors and sharper shadow hierarchies; more structured and less organic |
| Minimalism | Parent philosophy; neumorphism applies minimalist reduction to interface decoration while adding controlled physical depth |
| Cyberminimalism | Shares the clean, reduced approach but relies on stark contrast and flat surfaces rather than soft shadows |