A deep-dive reference on neumorphic (soft-UI) design principles, formulas, component patterns, motion, accessibility, tooling, and their application to the VisualLLM Tauri interface.
- Introduction and terminology
- Historical context and origin
- The physics of neumorphic shadow
- Color theory and palettes
- Light theme neumorphism
- Dark theme neumorphism
- Component patterns in detail
- Motion and micro-interactions
- Accessibility and inclusive design
- Tooling and generators
- Criticism and limitations
- VisualLLM application plan
- Source bibliography
Neumorphism — a portmanteau of "new" and "skeuomorphism" — is a digital design language that surfaced in late 2019. It replaces flat material fills with low-contrast, extruded shapes that appear to push out from or sink into the background. The effect is produced almost entirely through carefully paired box-shadow values.
:root {
--bg: #e0e5ec;
--light: #ffffff;
--dark: #a3b1c6;
}
.raised {
background: var(--bg);
box-shadow: 9px 9px 16px var(--dark), -9px -9px 16px var(--light);
border-radius: 20px;
}
.pressed {
background: var(--bg);
box-shadow: inset 6px 6px 10px var(--dark), inset -6px -6px 10px var(--light);
}Key constraints that make the style readable:
- Background and surface share the same hue.
- Contrast between light and dark shadow is low, often 15–30 % luminance shift.
- Border radius is generous.
- Edges are implied by shadow, not drawn with borders.
- Soft UI: the broader umbrella that includes neumorphism.
- Extruded / convex: an element that appears to bulge out.
- Inset / concave: an element that appears to be pressed in.
- Pillow / floating: a higher elevation variant.
- Claymorphism: a cousin style using inner highlights and more saturated colors.
- Glassmorphism: translucent blur layers, sometimes combined with neumorphism.
The style is generally credited to Ukrainian designer Alexander Plyuto, who posted a set of “Skeuomorph Mobile Banking” Dribbble shots in late 2019. The community quickly labeled the look “neumorphism.” The shots used a pale grey background, rounded rectangles, and paired shadows to suggest depth without heavy gradients or drop-shadow realism.
- 2007–2012 skeuomorphism: Apple iOS 6-era leather, linen, and realistic buttons. Heavy texture, high detail, strong metaphor.
- 2013–2019 flat design / Material Design: no shadows, bold color, typography-driven hierarchy.
- 2019+ neumorphism: reintroduces depth but keeps the minimal palette of flat design.
- 2021+ claymorphism and glassmorphism: branch off, adding color and translucency.
Neumorphism resurfaces because it offers tactile affordance on touchscreens without the visual noise of realism. It suggests “this is a surface you can press.” For desktop tools with dense controls, it risks low contrast but rewards consistency when applied carefully.
A neumorphic element is lit from the top-left. One shadow is lighter than the background and cast down-right by the imagined light source. The other is darker than the background and cast up-left as occlusion.
box-shadow:
x y blur dark-shadow-color,
-x -y blur light-shadow-color;
Instead of guessing shadow colors, derive them mathematically:
:root {
--bg: hsl(220, 20%, 93%);
--shadow-light: hsl(220, 20%, 98%);
--shadow-dark: hsl(220, 20%, 78%);
}In Sass:
$bg: #e0e5ec;
$light: lighten($bg, 10%);
$dark: darken($bg, 12%);In modern CSS with color-mix:
--dark: color-mix(in srgb, var(--bg) 70%, black);
--light: color-mix(in srgb, var(--bg) 80%, white);| Elevation | Offset X/Y | Blur radius | Spread | Usage |
|---|---|---|---|---|
| 1 subtle | 3–5 px | 8–12 px | 0–1 px | small buttons, toggles |
| 2 raised | 6–9 px | 16–20 px | 0–2 px | cards, panels |
| 3 floating | 12–18 px | 24–32 px | 0–4 px | modals, menus |
| Pressed | inset 4–6 px | 8–12 px | 1–2 px | inputs, active states |
The ratio of offset to blur is usually near 1:2. Less blur makes the shadow look crisp and cheap; more blur smudges the form.
- Convex / extruded: outset shadows only.
- Concave / pressed: both shadows inset.
- Flat: no shadow, identical to background.
- Punched hole: heavy inset shadows plus an inner gradient.
- Floating pill: large outset shadow plus slight lift on hover.
Because there are no borders, the edge of an element is defined by where the shadow fades. A sharp cutoff reads as a cut; a very soft shadow reads as haze. The sweet spot is a shadow that is visible but not harsh.
Radius must be large enough that the curve catches the light. Typical values:
- Small controls: 10–12 px
- Buttons and inputs: 14–18 px
- Cards and panels: 20–28 px
- Circular controls: 50 %
A subtle gradient can make a convex button read as curved:
.convex-btn {
background: linear-gradient(145deg, #f0f2f5, #caced4);
box-shadow: 6px 6px 12px #a3b1c6, -6px -6px 12px #ffffff;
}The highlight is shifted toward the top-left; the shadow toward the bottom-right.
Pressed controls can use an inner highlight to show the rim of the cavity:
.pressed-input {
box-shadow:
inset 3px 3px 6px #a3b1c6,
inset -3px -3px 6px #ffffff;
}Higher-level containers can stack elevations so the eye reads depth hierarchy:
- App shell: flat or very subtle.
- Sidebar / canvas: raised by e2.
- Floating action button: raised by e3.
- Modal / dropdown: raised by e3 plus z-index lift.
Neumorphism relies on the background and surface being the same color. A neutral grey maximizes the illusion because the eye interprets the shadow pair as light falling on a matte surface. Saturated backgrounds make the shadow colors harder to derive and can look muddy.
Recommended base colors:
#e0e5ec#e6e7ee#eceef1#d1d9e6#eef0f4
For a base #e0e5ec:
- Dark shadow:
#a3b1c6(about 25 % darker) - Light shadow:
#ffffff(full white or near-white)
Dark neumorphism shifts the background much darker but keeps the same shadow model:
#1f2229#2d303a#292d36#181a20#24272e
For a base #1f2229:
- Light shadow:
#2f3540or#3a3f4b - Dark shadow:
#111318or#0c0e12
Accents should be sparse:
- Primary action buttons.
- Active toggles.
- Status indicators.
- Focus rings.
Accent saturation should be moderate; a neon button on a grey field reads as a sticker rather than a soft extrusion.
Status colors still need to communicate:
- Success: green family.
- Warning: amber / orange.
- Error: red / coral.
- Info: blue / cyan.
In neumorphism these are usually applied as small indicator lamps or tinted icons rather than full colored surfaces.
A gradient can add curvature to an accent button while preserving the soft shadow:
.accent-btn {
background: linear-gradient(145deg, #ff7e79, #e14f4a);
box-shadow: 5px 5px 10px #a3b1c6, -5px -5px 10px #ffffff;
}The same-color surface makes it hard to hit WCAG contrast. Text must be dark enough and shadows must not be the only state indicator. Tools like WebAIM’s contrast checker are essential.
:root {
--bg: #eceef1;
--surface: #e6e9ef;
--light: #ffffff;
--dark: #c4cfdc;
--text: #2b2f38;
--text-muted: #6b7280;
--text-faint: #9ca3af;
--accent: #f4645f;
--accent-deep: #e14f4a;
--shadow-raised: 8px 8px 16px var(--dark), -8px -8px 16px var(--light);
--shadow-pressed: inset 5px 5px 10px var(--dark), inset -5px -5px 10px var(--light);
--radius-sm: 10px;
--radius-md: 16px;
--radius-lg: 24px;
}Do:
- Keep text dark.
- Use generous whitespace.
- Reserve white for the light shadow.
- Use subtle transitions.
Don’t:
- Use black shadows — they look like flat drop shadows.
- Stack too many raised layers — the UI becomes puffy.
- Rely on shadow alone for interactivity.
[data-theme="dark"] {
--bg: #1f2229;
--surface: #252a32;
--light: #2f3540;
--dark: #111318;
--text: #e4e6eb;
--text-muted: #8a919c;
--text-faint: #5c6370;
--accent: #60a5fa;
--accent-deep: #3b82f6;
--shadow-raised: 8px 8px 16px var(--dark), -8px -8px 16px var(--light);
--shadow-pressed: inset 5px 5px 10px var(--dark), inset -5px -5px 10px var(--light);
}- The light shadow cannot be true white or the element will look inverted.
- Contrast between surface and text must still meet standards.
- Glow effects become more visible and can feel noisy.
- Derive the light shadow from the base color, not pure white.
- Keep elevation differences subtle.
- Use accent color for focus and active states only.
- Test on OLED and IPS displays because dark greys crush differently.
.btn-neu {
border: none;
border-radius: 16px;
background: var(--bg);
box-shadow: 6px 6px 12px var(--dark), -6px -6px 12px var(--light);
transition: all 0.2s ease;
}
.btn-neu:active, .btn-neu.active {
box-shadow: inset 4px 4px 8px var(--dark), inset -4px -4px 8px var(--light);
}Icon-only buttons are often perfect circles. Hover should lift slightly; active should press.
- Track: inset shadow groove.
- Thumb: raised circular surface.
- Fill progress: tinted strip inside the track.
A neumorphic switch is a pill-shaped inset track with a movable raised orb. On activation the orb slides right and the track may show an accent glow.
Cards use large radii and soft shadows. Elevation creates hierarchy: app shell flat, panels raised, floating controls elevated.
Inputs are usually inset. Placeholder text must remain legible. Focus is shown by a faint accent glow or slight inner brightness change.
Items can be flat until hovered, then raised. Selected chips are pressed or accented. Chips in a lane are ideal candidates for raised → pressed active transitions.
Custom scrollbars can use an inset track and raised thumb to stay on-theme.
A segmented control is a raised pill with each segment flat until selected; the selected segment is pressed.
A circular loader can be a rotating gradient inside a pressed ring.
Floating menus use the strongest elevation with a tight radius and clear separation from the background.
Animation should be functional:
- Confirm a press.
- Communicate state change.
- Guide attention.
- Provide spatial continuity.
- Micro-interactions: 150–250 ms
- State transitions: 200–300 ms
- Page/section transitions: 300–500 ms
Standard:
cubic-bezier(0.25, 0.46, 0.45, 0.94)Spring-like:
cubic-bezier(0.34, 1.56, 0.64, 1)@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}- Normal text: 4.5:1 minimum.
- Large text: 3:1 minimum.
- UI components and icons: 3:1 minimum against adjacent colors.
:focus-visible {
outline: none;
box-shadow: inset 0 0 0 2px var(--accent);
}- Keep semantic HTML.
- Use
aria-pressedfor toggles. - Provide accessible names for icon-only controls.
- Avoid empty button elements.
Low-contrast neumorphism can make it harder to distinguish interactive from decorative surfaces. Use labels, icons, and consistent elevation to reinforce affordance.
The canonical generator. It produces the paired shadow code for a given color and radius.
Provides the conceptual foundation and warns about accessibility pitfalls.
Many plugins generate soft-shadow styles and component kits. They are useful for rapid exploration but still require manual contrast checks.
- ColorHexa: conversions and harmonies.
- Coolors: palette generation.
- UI Gradients: gradient inspiration.
- Color Hunt: curated palettes.
- WebAIM Contrast Checker.
- Stark plugin for Figma / Sketch.
- A11y Project resources.
The biggest criticism of neumorphism is poor accessibility. Buttons can look inactive; pressed states can look disabled.
A screen full of soft grey shapes can feel monotonous. Accent color and typographic hierarchy are necessary relief.
Shadow rendering differs across browsers and operating systems. Test on the target platform.
Soft buttons can appear larger than their hit area. Maintain minimum 44 × 44 dp touch targets.
Avoid neumorphism for dense data tables, long-form reading, or interfaces where color coding is critical.
- Make the lane track the dominant visual element.
- Shrink header and footer chrome.
- Add cohesive light/dark themes.
- Use purposeful animation for drag, press, and routing feedback.
- Preserve accessibility and reduced-motion preferences.
:root {
--bg: #eceef1;
--surface: #e6e9ef;
--light: #ffffff;
--dark: #c4cfdc;
--text: #2b2f38;
--text-muted: #6b7280;
--accent: #3b82f6;
--accent-dark: #2563e3;
--shadow-raised: 8px 8px 16px var(--dark), -8px -8px 16px var(--light);
--shadow-pressed: inset 5px 5px 10px var(--dark), inset -5px -5px 10px var(--light);
--radius-sm: 10px;
--radius-md: 16px;
--radius-lg: 24px;
}
[data-theme="dark"] {
--bg: #1f2229;
--surface: #252a32;
--light: #2f3540;
--dark: #111318;
--text: #e4e6eb;
--text-muted: #8a919c;
--accent: #60a5fa;
--accent-dark: #3b82f6;
}- Header / footer: reduce vertical padding to ~8–12 px.
- Lane: large raised card with generous radius.
- Lane head / foot: compact flex rows, same background as lane.
- Track: subtle inset groove for chips.
- Chips: raised pills; active/fallback state uses pressed inset or accent ring.
- Add-lane button: circular floating action with strong shadow.
- Theme toggle: neumorphic switch in the header.
renderer/style.css— full redesign, compact lane chrome, themes, animations.renderer/index.html— theme toggle and structural refinements.renderer/app.js— theme persistence/toggle wiring.
Original files copied to renderer-backup-original/ before modification.
The following sources informed this document. They include canonical articles, design systems, accessibility guidelines, color tools, and platform documentation.
- Plyuto, A. (2019). Skeuomorph Mobile Banking. Dribbble shot series credited with starting neumorphism.
- CSS-Tricks. Neumorphism and CSS. https://css-tricks.com/neumorphism-and-css/
- Neumorphism.io. Generate Soft-UI CSS code. https://neumorphism.io/
- UX Collective. Neumorphism: why it’s bad for accessibility.
- Smashing Magazine. Neumorphism in user interfaces.
- Material Design 3. Motion guidelines. https://m3.material.io/styles/motion/overview
- Material Design 3. Easing and duration. https://m3.material.io/styles/motion/easing-and-duration
- Material Design 3. Understanding motion. https://m3.material.io/styles/motion/understanding-motion
- Material Design 3. Elevation. https://m3.material.io/styles/elevation/overview
- Nielsen Norman Group. The role of animation and motion in UX.
- Nielsen Norman Group. Dark mode: what you need to know.
- Nielsen Norman Group. Accessibility for visually impaired users.
- Nielsen Norman Group. 10 usability heuristics for user interface design.
- Interaction Design Foundation. Microinteractions.
- Interaction Design Foundation. Visual hierarchy.
- Interaction Design Foundation. Color theory.
- Interaction Design Foundation. Affordances in UI.
- UXPin. Microinteractions in UI design.
- LogRocket. How to create microinteractions.
- Creative Bloq. Neumorphism: a new trend in UI design.
- WebdesignerDepot. Neumorphism: the design trend of 2020.
- ColorHexa. Color encyclopedia and conversions. https://www.colorhexa.com/
- CSS Gradient. Gradient generator. https://cssgradient.io/
- Color Hunt. Color palettes. https://colorhunt.co/
- Coolors. Color palette generator. https://coolors.co/
- UI Gradients. Gradient palettes. https://uigradients.com/
- Dribbble. Neumorphism tag. https://dribbble.com/tags/neumorphism
- Behance. Soft UI projects. https://www.behance.net/
- Pinterest. Neumorphism UI inspiration.
- Awwwards. Neumorphism website collection.
- Adobe XD. Neumorphism UI kit resources.
- Figma Community. Neumorphism design system files.
- Apple Human Interface Guidelines. Dark mode.
- Apple Human Interface Guidelines. Motion.
- Microsoft Fluent UI. Design tokens: shadow, depth.
- Microsoft Fluent UI. Motion.
- W3C WCAG 2.2. Contrast minimum (1.4.3). https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum
- W3C WCAG 2.2. Non-text contrast (1.4.11).
- W3C WCAG 2.2. Reduced motion (2.3.3).
- W3C WCAG 2.2. Focus appearance (2.4.13).
- MDN Web Docs. box-shadow. https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow
- MDN Web Docs. prefers-reduced-motion. https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion
- MDN Web Docs. color-mix(). https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-mix
- MDN Web Docs. CSS custom properties. https://developer.mozilla.org/en-US/docs/Web/CSS/--*
- MDN Web Docs. CSS transitions. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_transitions
- Google Material. Understanding elevation. https://m2.material.io/design/environment/elevation.html
- Google Material. Shadows. https://m3.material.io/styles/elevation/overview
- Refactoring UI. Shadows and depth.
- Refactoring UI. Color in UI design.
- Refactoring UI. Font size and hierarchy.
- Toptal. Neumorphism: a guide for designers.
- Designmodo. Neumorphism UI design tutorial.
- Envato Tuts+. Create a neumorphic UI in Figma.
- InVision. Animation in UX design.
- InVision. Design systems handbook.
- HubSpot Blog. Neumorphism: what it is and how to use it.
- UX Booth. Microinteractions: the secret to great app design.
- CareerFoundry. What is neumorphism?
- Mockplus. Neumorphism UI design examples.
- Prototypr. Neumorphism: visual principles.
- Sidebar. Neumorphism resources.
- Speckyboy Design Magazine. Neumorphism design examples.
- Hongkiat. Neumorphism UI design resources.
- A List Apart. Designing for dark mode.
- A List Apart. Accessibility: the missing ingredient.
- Deque. Understanding WCAG contrast requirements.
- WebAIM. Contrast checker. https://webaim.org/resources/contrastchecker/
- Stark. Contrast and color accessibility. https://www.getstark.co/
- A11y Project. How to design accessible animations.
- A11y Project. Dark mode accessibility.
- CSS-Tricks. A complete guide to dark mode on the web.
- CSS-Tricks. A complete guide to custom properties.
- CSS-Tricks. Animating with CSS transitions.
- CSS-Tricks. A complete guide to flexbox.
- Josh Comeau. The surprising truth about pixels and accessibility.
- Josh Comeau. Shadow palettes generator.
- Josh Comeau. CSS variables for React devs.
- Adam Argyle. Open-props style tokens.
- Open Props. UI shadows. https://open-props.style/
- Tailwind CSS. Box shadow documentation.
- Tailwind CSS. Color system.
- Bootstrap. Shadows utilities.
- Chakra UI. Style props: shadow.
- Radix UI. Themes and tokens.
- Shadcn UI. Design tokens and themes.
- GitHub Primer. Design system: color and shadow.
- Shopify Polaris. Design tokens.
- Atlassian Design System. Elevation.
- IBM Carbon. Shadows.
- Salesforce Lightning. Design tokens.
- Mozilla Protocol. Color and shadows.
- Tauri Documentation. Window customization. https://tauri.app/
- Tauri Documentation. Security and capabilities.
- Tauri Documentation. Frontend configuration.
- Electron. The official guide.
- WebKit Blog. CSS dark mode support.
- Chromium Blog. RenderingNG and performance.
- V8 Blog. Fast properties.
- Rust Cargo. The Cargo book.
- Rust By Example. Error handling.
- OpenAI API. Model routing and fallbacks.
- Anthropic. API documentation.
- OpenRouter. API documentation.
- Phosphor Icons. Icon design principles. https://phosphoricons.com/
- Heroicons. SVG icon set. https://heroicons.com/
- Feather Icons. Beautiful open-source icons. https://feathericons.com/
- Tabler Icons. Open-source icons. https://tabler-icons.io/
- Font Awesome. Accessibility best practices.
- Google Fonts. Inter / Roboto / System UI fonts.
- Typewolf. Best system font stacks.
- Modularscale. Type scale ratios.
- Every Layout. The stack / sidebar / cover primitives.
- Defensive CSS. Practical tips.
- Smashing Magazine. Designing for reduced motion.
- Web.dev. prefers-reduced-motion.
- Web.dev. Accessible animations.
- Vercel. Design engineering principles.
- Linear. Product design principles.
- Raycast. Interface design notes.
- Notion. Design system notes.
- Figma. Auto layout documentation.
- Figma. Component properties.
- Sketch. Layer styles and shadows.
- Canva. Color theory for designers.
- Hype4 Academy. Neumorphism / soft UI course.
- UX Design Institute. Visual design principles.
- Career Karma. Neumorphism vs skeuomorphism.
- SitePoint. CSS box-shadow tips.
- Scotch.io. CSS variables tutorial.
- CodePen. Neumorphism examples collection.
- Research and document neumorphic principles.
- Back up existing renderer files.
- Define
:rootand[data-theme="dark"]tokens. - Compact header and footer.
- Redesign lane, lane-head, lane-foot, track, and chips.
- Add theme toggle and persistence.
- Add purposeful micro-interactions.
- Add
prefers-reduced-motionguard. - Validate contrast and focus states.
- Test in both themes at runtime.
- All UI changes are scoped to
renderer/index.html,renderer/style.css, andrenderer/app.js. - A backup of the original renderer files is stored in
renderer-backup-original/before modifications. - The Rust backend (
src-tauri/src/) is not affected by this redesign.