A real <button> carrying .btn-neo-convex — the preview is the stylesheet, not a picture of it.
.btn-neo-convex {
display: inline-block;
padding: 13px 28px;
border: none;
border-radius: 14px;
background: linear-gradient(145deg, #f0f5fc, #cbd0d8);
color: #4a5568;
font-family: inherit;
font-size: 15px;
font-weight: 600;
cursor: pointer;
box-shadow: 8px 8px 16px #bec3cf, -8px -8px 16px #ffffff;
transition: box-shadow 0.2s ease;
}
.btn-neo-convex:hover {
box-shadow: 5px 5px 12px #bec3cf, -5px -5px 12px #ffffff;
}
.btn-neo-convex:active {
background: linear-gradient(145deg, #cbd0d8, #f0f5fc);
box-shadow: inset 4px 4px 8px #bec3cf, inset -4px -4px 8px #ffffff;
}
.btn-neo-convex:focus-visible {
outline: 2px solid currentColor;
outline-offset: 3px;
}
Implementation notes
About the Neo Convex CSS button
Neo Convex uses paired highlights and shadows that lift the control from its surface. Its rounded corners balance product-friendly softness with a clear boundary. It is built around a two-stop linear gradient anchored on #f0f5fc with a two-layer shadow. The interaction stays intentionally restrained.
Usage
<button class="btn-neo-convex">Button</button>Pair it with the CSS tab above — the class is self-contained.
:focus-visible state. If you retain motion, include a prefers-reduced-motion override.- Built with
- HTML + plain CSS
- Shape
- Rounded
- Exports
- CSS, Tailwind, React
- License
- MIT · commercial use
Build the interface around this button
We matched its palette, surface, geometry and motion to a complete UI system — like composing an outfit, not browsing unrelated parts.
Soft Bloom Smart Input
Soft Bloom kit
Soft Bloom Preference Toggle
Soft Bloom kit