Skip to main content

Neumorphism generator

Create soft UI / neumorphic design elements with live preview.

Free & unlimited
Light#ffffff
Base#e0e5ec
Dark#b0bdcf
240px
30px
12px
15
24px

Tip: Neumorphism works best with subtle colors close to the background. Avoid pure white or pure black. For dark mode, use low-saturation dark colors. The pressed state uses inset box-shadow.

.neumorphic {
  border-radius: 30px;
  background: #e0e5ec;
  box-shadow: 12px 12px 24px #b0bdcf, -12px -12px 24px #ffffff;
}
All processing happens in your browser. No data is sent to any server.

Neumorphism is one colour and two shadows: the surface is the same colour as the page behind it, and the illusion of depth comes entirely from a lighter shadow on the top-left and a darker one on the bottom-right. Pick a base colour here and both shadow colours are derived for you — the page converts your hex to HSL and shifts the lightness up and down by the intensity value, which keeps the hue and saturation intact so the shadows read as light and shade rather than as grey smudges. Four shapes cover the states you actually need: flat raised, concave, convex and pressed, which switches both shadows to inset. The preview renders the current values on a box, button, card, input, toggle or circle.

Key facts about Neumorphism generator

Key facts about Neumorphism generator
Shadow colours are derived, not pickedYour base hex is converted to HSL and the lightness moved up and down by the intensity value, so hue and saturation carry through to both shadows
ControlsSize 100-360 px on the box and circle, corner radius 0-150 px, distance 2-40 px, intensity 1-40, blur 4-80 px, plus the base colour
Shadow geometryTwo shadows at equal and opposite offsets — distance px on both axes for the dark one, minus the same for the light one, with a shared blur
Four shapesFlat is a solid surface; concave and convex replace the fill with a 145 degree linear gradient between the two derived colours in opposite directions; pressed adds inset to both shadows
Preview elements6 — box, button, card, input, toggle and circle. The input and toggle use their own reduced inset shadows, as those components need in real use
Presets8 — four light, from the classic #e0e5ec through a warm beige and a blue tint, and four dark from #2d2d3f to charcoal
Derived swatchesThe light, base and dark hex values are shown as copyable swatches, so the same palette can be reused elsewhere in your stylesheet
Output formatsCSS (a .neumorphic rule), SCSS (four variables plus the rule) and Tailwind (a div with arbitrary-value classes)
Tailwind caveatThe shadow is emitted as shadow-[...] with spaces replaced by underscores, which is the syntax Tailwind requires for a multi-part arbitrary value
HistoryThe last 20 settings are kept and restorable, so switching presets never loses what you had
No downloadOutput is copy-only — there is no file to save, since the result is a single CSS rule
The accessibility catchThe style has no borders and no colour contrast between a control and its background by design, which is why it fails contrast requirements on its own — see the FAQ

What happens to your file

Nothing is uploaded here because nothing is uploaded here at all: the page takes a hex value and five numbers and produces a CSS rule. The colour maths — hex to HSL, lightness shift, HSL back to hex — is a dozen lines of JavaScript already loaded with the page, and the preview is real DOM elements with inline styles, not an image rendered somewhere else. There is no account, no saved project and no analytics on the values you pick. Nothing is written to local storage, so a reload returns to the default #e0e5ec, and the copy button is the only thing that moves data anywhere, onto your own clipboard.

About this tool

  1. 1

    Choose the base colour first

    This is the single most important decision: the surface, the page behind it and both shadows all come from it. Muted mid-tones work; pure white and pure black do not, because there is no room to move lightness in one direction.

  2. 2

    Set distance and blur

    Distance is how far the two shadows are offset, blur is how soft they are. A common starting point is a blur roughly twice the distance — 12 px and 24 px — which reads as a surface a few millimetres above the page.

  3. 3

    Tune intensity

    Intensity is the lightness gap between the two derived shadows. Low values give a barely-there surface, high values make the element look embossed. Watch the three swatches as you drag to see how far the colours are actually moving.

  4. 4

    Pick the shape

    Flat is the default raised panel. Convex bulges toward you, concave dishes away, and pressed flips both shadows inset, which is what a toggled-on button or a focused input should look like.

  5. 5

    Preview the real component

    Switch from the plain box to the button, input, toggle or card. Each one uses proportionally smaller inset shadows, which is how the style is actually applied — a full-strength shadow on a 32 px toggle looks wrong.

  6. 6

    Copy the rule and set the parent

    Take the CSS, SCSS or Tailwind output, then make sure the container behind the element uses the same base colour. Without that, the effect does not exist.

Specs & compatibility
CSS usedbox-shadow with two comma-separated shadows, optionally inset; background is a solid colour or a linear-gradient for the curved shapes
Browser supportUniversal — multiple box-shadows and inset have worked in every browser since IE9; no prefix, no fallback needed
Requires a matching parentThe element background must equal the page background, or the effect collapses into a coloured rectangle with odd shadows
ContrastThe effect carries no contrast of its own; WCAG 1.4.11 asks for 3:1 on control boundaries, which shadows at these lightness deltas do not reach
Tailwind version3 or later for arbitrary values; underscores in the shadow value are converted to spaces at build time
Dark modeA toggle that switches the preview surroundings and loads dark presets — dark neumorphism needs a higher intensity to stay visible
PerformanceA static box-shadow is inexpensive; animating blur or spread on hover is not, so transition transform or opacity instead
NetworkNone after page load
  • Use the same colour for the element and its parent. This is the whole trick — if the background behind the card is even slightly different, the illusion collapses and you just have a rectangle with two odd shadows.
  • Avoid pure white and pure black bases. At lightness 100 there is nowhere for the light shadow to go, and at 0 the dark one has nowhere either, so one side of the effect disappears entirely.
  • Copy the derived light and dark swatches into your stylesheet as variables. They are a small consistent palette, and reusing them keeps every neumorphic surface on the page in the same light.
  • Pair pressed with an interaction state, not with a static element. Raised for resting, pressed for active or selected, is the one place the style communicates something real.
  • Give buttons and toggles an additional visible cue — a colour change, an icon, a label change. Depth alone is not an affordance that everybody can see.
  • Scale the shadow with the element. Distance 12 on a 240 px panel is subtle; the same value on a 32 px toggle is a blur that swallows the control, which is why the preview shrinks it automatically.
  • Dark neumorphism needs a higher intensity than light. Shadows lose contrast fast at low lightness, which is why the dark presets here sit at 15 to 20 rather than 10 to 14.
  • Do not animate blur or spread on hover. Shifting the offsets slightly, or moving the element with transform, produces the same impression and stays on the compositor.
  • Shadow colours derived from one base colour
  • Flat, concave, convex and pressed shapes
  • Six live preview elements
  • Eight light and dark presets
  • Copyable light, base and dark swatches
  • CSS, SCSS and Tailwind output
  • Three preview widths and a dark-mode toggle
  • 20-step history
  • Build a soft-UI button set with matching resting and pressed states.
  • Work out the shadow values for an inset input field that matches an existing raised card.
  • Derive a consistent light and dark shadow pair from a brand background colour.
  • Prototype a dark-mode variant of a soft UI without recalculating every shadow by hand.
  • Produce Tailwind arbitrary-value classes for a design that already uses Tailwind.
  • Show a client what the style actually looks like on a card and a toggle before committing to it.
In nine cases out of ten the parent background does not match the element background. The style has no fill of its own to speak of — the surface is the same colour as the page and the depth comes only from the two shadows. If the container is white and your element is #e0e5ec, you get a visible grey rectangle with shadows that make no sense. Set the section or body background to the base colour first, then apply the rule.
Not by default, and it is worth knowing why before you ship it. WCAG 2.1 criterion 1.4.11 asks for a 3:1 contrast ratio between a control's boundary and the surrounding surface, and the whole premise of this style is that there is no such boundary — a shadow a few per cent lighter or darker does not come close. Use it for surfaces and decoration, and give every interactive control an additional non-depth cue: a label, an icon, a colour change, or a real focus ring.
Desaturated mid-tones. The classic #e0e5ec works because it sits around 90 per cent lightness with a trace of blue, leaving room to move up and down without clipping. Warm greys, pale blues and muted beiges all behave. Saturated colours produce shadows that look tinted rather than lit, and pure white or black clip on one side because lightness cannot go past 100 or below 0, which leaves the surface with only one shadow.
Flat keeps a solid fill, so the surface reads as a plate lifted off the page. Convex replaces the fill with a gradient running light to dark, which makes the middle appear to bulge toward you. Concave runs the same gradient the other way so the middle appears to dish away. Pressed is different in kind: it does not change the fill, it moves both shadows inside the element with inset, which is what a control being held down looks like.
Switch the output to Tailwind and copy the class list. The shadow arrives as shadow-[...] with underscores in place of spaces, which is Tailwind's required syntax for an arbitrary value containing spaces — the build converts them back. You need Tailwind 3 or later for arbitrary values. For anything you use repeatedly, move the values into your theme as named box-shadow entries instead, so the markup stays readable.
No. The page takes one hex value and five numbers and does colour arithmetic on them in JavaScript that shipped with the page, then renders the preview as ordinary DOM elements with inline styles. There is no rendering service, no saved project, no account and no request of any kind after the page loads. Nothing is written to local storage either, so a refresh returns to the default base colour.
View all

Updated

We use anonymous analytics to improve ToolChamp. No personal data is stored or sold. Privacy Policy