DEV Community

RAXXO Studios
RAXXO Studios

Posted on • Originally published at raxxo.shop

Dark Mode Design That Doesn't Look AI

  • Every AI-built dark site uses the same #000 bg, neon accent, and glass blur combo

  • Use #1f1f21 not #000 and #F5F5F7 not #fff to fix the two biggest color mistakes

  • One accent color per viewport. Spend contrast like currency or nothing stands out

  • A 4/8/16/32/64 spacing system creates visual rhythm that templates never achieve

  • Glass morphism works on consumer SaaS dashboards but ruins developer tools

  • Typography and contrast hierarchy do more for dark UI than any decoration

The Copy-Paste Dark Mode Problem

I have been designing interfaces for nearly 20 years. In that time, I have watched dark mode go from a niche developer preference to the default for every new product. And somewhere around 2024, it all started looking the same.

Open any landing page built with an AI coding tool. You will see it instantly. Dark background. Neon accent (usually purple or cyan). Rounded corners on everything. A glass blur card floating in the center. Maybe a gradient orb in the background. It is the Claude Code aesthetic, the v0 aesthetic, the Cursor aesthetic. Pick your tool. The output is identical.

This is not a criticism of those tools. I use Claude Code daily. But when the defaults become the design, you have a problem. Your product looks like a demo. Your brand looks like a template. And your users notice, even if they cannot articulate why.

I spent the last 3 years building products in dark mode exclusively. Every interface at RAXXO Studios ships dark. I have made every mistake on this list, fixed them, and documented what actually moved the needle. This is that document.

Your Colors Are Wrong (Both of Them)

The most common dark mode error is reaching for #000000. It feels logical. Dark mode means dark, right? But pure black creates a problem that most designers do not catch until the product is live: it has maximum contrast with white text, and maximum contrast causes eye fatigue.

Your screen is not paper. It emits light. When you put #ffffff text on #000000 background, you get a contrast ratio of 21:1. That sounds great for accessibility. In practice, it creates a halation effect where light text appears to bleed into the dark background. Users will not complain about it. They will just leave your site 40 seconds earlier.

The fix is boring. Use an off-black. I use #1f1f21 across every RAXXO product. It is dark enough to feel like dark mode. It is warm enough to reduce halation. And it gives you room to create depth with even darker values for inset elements.


:root {
  --bg-base: #1f1f21;
  --bg-raised: #2a2a2d;
  --bg-inset: #161618;
  --bg-overlay: rgba(109, 109, 109, 0.2);
}

Enter fullscreen mode Exit fullscreen mode

Three background layers. One base, one for cards and raised surfaces, one for inputs and inset areas. Compare that to the typical AI output: one background color, one card color, zero depth system.

Same principle applies to text. Pure white (#ffffff) is the default in every AI template. It is also wrong. I switched every RAXXO product from #ffffff to #F5F5F7 in early 2025. The difference is 3% brightness. You cannot see it in a side-by-side screenshot. But you can feel it over a 5-minute reading session. The slight warmth reduces halation. Your eyes relax. You read longer.

Apple uses #F5F5F7 as their primary text color on apple.com. Linear uses a similar off-white. The best dark mode interfaces in production all avoid #ffffff. Every AI template uses it anyway.


:root {
  --text-primary: #F5F5F7;
  --text-secondary: rgba(245, 245, 247, 0.6);
  --text-tertiary: rgba(245, 245, 247, 0.3);
}

Enter fullscreen mode Exit fullscreen mode

Three text levels. Primary for headings and body. Secondary for supporting content. Tertiary for metadata and dividers. This alone eliminates 80% of the "everything looks the same" problem in dark UIs.

Contrast Hierarchy Is the Real Design System

Here is what actually separates a designed dark interface from a generated one: intentional contrast hierarchy.

AI tools default to the same visual weight for everything. Every card has the same border. Every button has the same radius. Every section has the same padding. The result is a flat wall of content where nothing guides the eye.

In a well-designed dark UI, contrast is currency. You spend it intentionally. A bright lime accent (#e3fc02) on a dark background screams for attention. If you put that on every button, link, and icon, you have spent all your currency in the first fold. Nothing stands out because everything stands out.

The rule I follow: one accent color per viewport. One element gets the high-contrast treatment. Everything else uses your text hierarchy. If you need a second call to action, use a ghost button (border only, no fill). If you need a third, use a text link in your secondary color.

This is the opposite of what AI tools produce. They love to generate neon-on-dark everything. Three gradient buttons. Glowing borders on cards. Animated accent colors in the background. It looks impressive in a screenshot. It is unusable in production.

Real products need clear paths. Where do I click? What is the primary action? What is secondary? Dark mode makes these questions harder because you have less dynamic range to work with. Spending contrast wisely is the entire game.

The 4/8/16/32/64 Spacing System

Spacing is the most underrated differentiator in dark mode design. And it is the thing AI tools get most consistently wrong.

Templates use arbitrary padding. 15px here, 24px there, 40px somewhere else. The result looks fine at first glance. But your eye detects the inconsistency subconsciously. It registers as "cheap" even if the colors and typography are perfect.

I use a strict base-4 spacing scale across every RAXXO product:


:root {
  --space-xs: 4px;
  --space-sm: 8px;
  --space-md: 16px;
  --space-lg: 32px;
  --space-xl: 64px;
}

Enter fullscreen mode Exit fullscreen mode

Every margin, padding, and gap in the entire interface uses one of these 5 values. No exceptions. The mathematical relationship between values (each is 2x the previous) creates a visual rhythm that users feel but cannot name. It is the difference between "this feels polished" and "this looks like a Tailwind template."

In dark mode specifically, spacing does even more work. Without visible borders and shadows to separate content (both are harder to see on dark backgrounds), whitespace becomes your primary separator. A 64px gap between sections communicates "new topic" more clearly than any divider line on a dark surface.

I ripped out every border-b border-gray-800 in my interfaces and replaced them with spacing. The result looks cleaner and performs better because the browser renders fewer elements.

When Glass Morphism Works (and When It Does Not)

Glass morphism (backdrop blur with a semi-transparent background) is the default decoration in AI-generated dark UIs. It is also the most misused effect in modern web design.

Here is when glass actually works: consumer SaaS dashboards where the user expects visual richness. Music apps. Social platforms. Design tools. Anywhere the brand promise includes "beautiful" or "premium." In these contexts, a glass card floating over a gradient background adds perceived value.

Here is when glass fails: developer tools, documentation, productivity apps, and anything where the user needs to focus on content. A glass effect adds visual noise. It makes text slightly harder to read. The blur computation costs performance on lower-end devices. And it signals "style over substance" to technical users who value clarity.

I use glass in exactly one context at RAXXO Studios: overlay modals and dropdown menus. The glass effect communicates "this is floating above the main content" without needing a heavy drop shadow (which looks wrong on dark backgrounds anyway). For everything else, I use a solid --bg-raised value.


.rx-glass {
  background: rgba(109, 109, 109, 0.2);
  backdrop-filter: blur(5px);
  -webkit-backdrop-filter: blur(5px);
}

Enter fullscreen mode Exit fullscreen mode

Notice the blur value: 5px. Not 20px. Not 40px. Most AI-generated glass uses aggressive blur values that turn the background into soup. A subtle 5px blur is enough to communicate "layered surface" without destroying readability.

Typography Carries Dark Mode More Than Color

If I had to pick one thing that separates a professional dark UI from a template, it would not be the background color or the accent. It would be the type system.

Dark mode amplifies typography problems. On a light background, mediocre font sizing and spacing can hide behind visual density. On a dark background, every heading, every line of body text, every label is isolated against empty space. Bad type sticks out.

Here is what I run across every RAXXO product:


:root {
  --font-sans: 'Outfit', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', monospace;
  --text-base: 16px;
  --text-lg: 20px;
  --text-xl: 28px;
  --text-2xl: 40px;
  --line-height-body: 1.6;
  --line-height-heading: 1.1;
}

Enter fullscreen mode Exit fullscreen mode

Two fonts. Four sizes. Two line heights. That is the entire type system. I do not use 12 size variants. I do not use font-weight as a primary differentiator (on dark backgrounds, weight differences below 600 are nearly invisible). I use size and spacing to create hierarchy, and the accent color for emphasis.

The line height matters more than you think. Body text at 1.6 line height reads comfortably on dark backgrounds. Headings at 1.1 feel tight and intentional. Most templates use 1.5 for everything, which makes headings look loose and body text feel cramped.

Typography-first design means making font decisions before color decisions. If your type system is solid, you can run a dark UI with zero accent color and it will still look professional. If your type system is generic, no amount of neon glow will save it.

Most dark mode interfaces look identical because designers skip these boring parts. Background depth, text hierarchy, spacing rhythm, typography scale. They do not screenshot well. You cannot show them in a 15-second demo. But after nearly 20 years in this industry, I can tell you the boring decisions compound. One right background color. One right text value. One right spacing scale. Stack enough of those and you get an interface that feels inevitable.

The template aesthetic will keep evolving. Next year it will be something other than glass blur and neon accents. The fundamentals will not change. Get those right and your dark mode design will outlast whatever trend the AI tools default to next. Stop copying the defaults. Start designing the system.

Top comments (1)

Collapse
 
mrlinuncut profile image
Mr. Lin Uncut

dark mode is so hard to get right bc most devs just slap a dark background on and call it done... the real trick is getting your surface elevation levels right so cards and modals actually feel lifted instead of flat