CSS & UI Design
NEUMORPHISM GENERATOR
Generate soft-UI Neumorphic CSS components (Flat, Concave, Convex, Pressed/Inset) with dual light/dark drop shadow controls.
Shape Type
Size
200px
Border Radius
30px
Distance / Offset
12px
Blur Radius
24px
Surface Color
NEUMORPHIC
Developer Reference
Core Algorithm & Standalone Script
Standalone, zero-dependency JavaScript implementation powering this tool. Free to inspect, copy, and build upon.
let shape = 'flat';
const elSize = document.getElementById('input-size');
const elRadius = document.getElementById('input-radius');
const elDist = document.getElementById('input-dist');
const elBlur = document.getElementById('input-blur');
const elBg = document.getElementById('input-bg');
const stageBg = document.getElementById('stage-bg');
const box = document.getElementById('neu-box');
const cssOut = document.getElementById('css-output');
const toast = document.getElementById('toast');
function showToast(msg) {
toast.textContent = msg;
toast.classList.add('show');
setTimeout(() => toast.classList.remove('show'), 2000);
}
function renderNeumorphism() {
const size = parseInt(elSize.value);
const radius = parseInt(elRadius.value);
const dist = parseInt(elDist.value);
const blur = parseInt(elBlur.value);
const bg = elBg.value;
document.getElementById('val-size').textContent = size + 'px';
document.getElementById('val-radius').textContent = radius + 'px';
document.getElementById('val-dist').textContent = dist + 'px';
document.getElementById('val-blur').textContent = blur + 'px';
stageBg.style.backgroundColor = bg;
box.style.width = size + 'px';
box.style.height = size + 'px';
box.style.borderRadius = radius + 'px';
box.style.backgroundColor = bg;
// Dark shadow & light highlight calculation
const darkShadow = `rgba(0, 0, 0, 0.45)`;
const lightShadow = `rgba(255, 255, 255, 0.08)`;
let shadowCss = '';
if (shape === 'flat') {
shadowCss = `${dist}px ${dist}px ${blur}px ${darkShadow}, -${dist}px -${dist}px ${blur}px ${lightShadow}`;
} else if (shape === 'pressed') {
shadowCss = `inset ${dist}px ${dist}px ${blur}px ${darkShadow}, inset -${dist}px -${dist}px ${blur}px ${lightShadow}`;
} else if (shape === 'concave') {
shadowCss = `${dist}px ${dist}px ${blur}px ${darkShadow}, -${dist}px -${dist}px ${blur}px ${lightShadow}`;
box.style.background = `linear-gradient(145deg, #18181d, #22222a)`;
} else if (shape === 'convex') {
shadowCss = `${dist}px ${dist}px ${blur}px ${darkShadow}, -${dist}px -${dist}px ${blur}px ${lightShadow}`;
box.style.background = `linear-gradient(145deg, #22222a, #18181d)`;
}
box.style.boxShadow = shadowCss;
const css = `border-radius: ${radius}px;
background: ${bg};
box-shadow: ${shadowCss};`;
cssOut.textContent = css;
}
document.querySelectorAll('.btn-shape').forEach(btn => {
btn.addEventListener('click', () => {
document.querySelectorAll('.btn-shape').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
shape = btn.dataset.shape;
renderNeumorphism();
});
});
[elSize, elRadius, elDist, elBlur, elBg].forEach(el => el.addEventListener('input', renderNeumorphism));
document.getElementById('btn-copy-css').addEventListener('click', () => {
navigator.clipboard.writeText(cssOut.textContent);
showToast('Neumorphic CSS copied!');
});
renderNeumorphism();