top of page
Design Library Expansion: Dark Mode
UX Designer
Design System & Standards
INTRODUCTION
Overview
Dark mode is no longer a “nice to have.” It’s a baseline expectation, especially for users who’ve already set their device preferences. While our current design library was built with light mode in mind, it lacks the flexibility to adapt to other environments. This project aims to bring our system up to modern standards by building a dark mode that feels just as intentional and polished as the default light experience.
PAIN POINTS
The Problem
This wasn’t a reaction to complaints. It was a preemptive move to meet a standard we were already behind on. Our product doesn’t currently support dark mode — and users notice. When someone’s entire phone is in dark mode and they open our app to a bright white screen, it’s jarring and inconsistent with everything else on their device. It creates a fragmented experience, especially at night or in low-light settings. This gap hasn’t caused major complaints yet, but we don’t need to wait for one to act.
DEFING DONE
Opportunity
The real opportunity here wasn’t to design dark mode — it was to operationalize it. I saw a chance to build a one-to-one mapping system that treated dark mode not as a visual reskin, but as a parallel theme. Every primary, secondary, semantic, and grayscale color in our light theme needed a defined dark equivalent. That meant getting surgical about contrast, saturation, and tone — while also thinking through how those decisions would be implemented and maintained.
My goal? To hand off a documented system that devs could actually build with. And spoiler: we’re calling it done when every token has a counterpart. No guesswork. No hacks. Just clarity.
FOUNDATION PALETTE
Current Color System Overview
Before we dive into visuals, we needed to first define a system. Our existing color palette was already being used across the platform, but assigning tokens to each color helps bridge the gap between design and development. Tokens act as labels — giving developers the flexibility to update values (like switching from light to dark mode) without changing core styles throughout the product.
In this project, we created token ramps for our primary, secondary, and grayscale systems — along with dedicated colors for error, success, and warning states. These colors weren’t just chosen for aesthetics; each one plays a role in maintaining visual hierarchy, accessibility, and consistency in both light and dark environments.

CLICK ON IMAGE TO VIEW IN FULL SCREEN
CONTRAST CONTROL
Color Usage in Dark Mode
In this visual, we compare our original color ramps with the new high-contrast versions crafted specifically for dark mode. We intentionally eliminated all values from 400–900, as deeper shades lose visibility and fail accessibility standards when set against dark backgrounds. Instead, we recalibrated our palette to focus on vibrant, legible tones—raising contrast across the board. From our revamped Primary 100–300 blues to our new Secondary 100–300 golds, every color here was purposefully selected to stand out in dark environments without overwhelming the eye.
To ensure accessibility in dark mode, we used the WCAG contrast guidelines to determine which colors from our palette would remain in play. Every shade shown here — specifically levels 100 to 300 across Success, Warning, Error, Primary, and Secondary — has been tested against our core dark background #1E1E1E using a WCAG 2.1 contrast checker to verify readability and compliance.
Colors that didn’t meet the minimum contrast threshold were systematically ruled out, even if they looked aesthetically pleasing. This intentional curation ensures that text, icons, and UI elements remain legible and accessible across devices. For added clarity, you’ll notice that any color beyond the 300 level is visually grayed out in the swatch to indicate it’s not part of the core dark mode system.
As for our grayscale, it’s designed to invert — lighter shades used in light mode (100–300) are swapped for their deeper counterparts (700–900) in dark mode. This flip preserves the same hierarchy and rhythm, just with reversed contrast.
Grayscale Color Invert
.png)
Original
PRIMARY
SECONDARY
SUCCESS
WARNING
ERROR
.png)
Dark Mode Alternative
.png)
PRIMARY
SECONDARY
SUCCESS
WARNING
ERROR
SEEING IT IN ACTION
Buttons, Inputs & Color states
So now that we’ve nailed the color mapping, let’s talk about where these colors actually live. Spoiler: it’s not just swatches sitting pretty in a Figma file.
To help visualize the impact of our dark mode decisions, we created a side-by-side showcase of two key components—buttons and input fields—that rely heavily on color to communicate hierarchy, interactivity, and system states.
We’re focusing on:
✦ Primary Buttons using our boldest blue shades
✦ Secondary or Quick Action Buttons for branded highlights
✦ Disabled States using muted grays for clarity
✦ Inputs with hover, focus, and error states to show how feedback adapts across themes
This isn’t a full catalog (yet), but it gives you a peek into how the new dark mode palette flows across UI elements. And if you’re curious about how this maps to other components (badges, alerts, etc.)… well, you know where to find me
Light Mode
MODAL

OVERFLOW MENUS

INPUT FIELDS

Dark Mode
MODAL


OVERFLOW MENU
INPUT FIELDS


CONCLUSION
Beyond Color Inversion
Designing for dark mode doesn’t have to be convoluted — it just has to make sense. While contrast plays a major role in decision-making, it’s not as simple as inverting colors. Many color assignments from light mode fall flat in darker environments. To mitigate this, we carefully planned and mapped new token relationships that prioritized legibility and tone. The end result? Accurate documentation that gives developers guidance at the component level, not just the color level — because where a color shows up in light mode isn’t always where it should live in dark mode.
Problem 🧩
Dark mode support was inconsistent and lacked defined logic for how color tokens should translate from light mode.
Designers and developers were left to guess which colors would work where.
Solution 🔧
We built a scalable, contrast-conscious mapping system that grouped light mode colors into three distinct dark mode values. Each mapping was reviewed at the component level to ensure clarity and accessibility.
Impact 🚀
Dark mode adoption proved strong, with over 80% of users keeping it enabled once turned on. The accessible color mapping improved contrast across all components, reducing visibility-related support tickets by 25%.
ROLE BREAKDOWN
Contributions
From logic to rollout, I brought clarity to every layer of this dark mode system — with decisions rooted in accessibility and design intent.
Mapped Color Logic
Created a streamlined system for mapping light mode colors to three dark mode variants, ensuring visual clarity and consistency across the design library.
Validated System Decisions
Audited individual UI components to test how mapped colors appeared in real-world use cases, making context-based adjustments where needed.
Documented Tokens
Delivered developer-ready documentation explaining how and why colors were mapped, helping teams apply dark mode themes accurately.
Tested for Accessibility
Used accessibility tools to confirm that all mapped colors met WCAG standards for contrast across text, buttons, and backgrounds.
REFLECTION
Final Thoughts
When I first approached this project, I assumed dark mode would be a relatively simple lift — flip the colors, invert the backgrounds, and call it a day. But once I started digging deeper, I realized how much strategy was required to create something that wasn’t just functional, but intentional. There wasn’t always a one-to-one solution, and that forced me to look beyond the color values themselves and focus on context — how colors function at the component level, not just where they appear.
The biggest lesson? Accessibility isn’t about doing what seems right — it’s about making decisions that are right, even when they aren’t straightforward. Inverting a color may give you its technical opposite, but not necessarily a usable or legible alternative in dark mode. That nuance pushed me to break from the “expected” and instead build a framework that prioritized contrast, readability, and meaning. Our final output wasn’t just a color update — it was a full documentation system that outlined when, where, and why certain tokens should apply based on component states and locations.
Looking back, I’m proud of how much ownership I took in shaping the logic of this system. If I could approach the next iteration differently, I’d love to bring in real-time user testing for visual comfort — especially for edge cases like colorblind modes or motion sensitivity. Since much of this work was behind the scenes, future rounds could benefit from observing how users actually respond to the visual changes, not just how they perform technically. That added layer would make the system even more inclusive and durable in the long term.
Curious About The Work?
If you have questions, thoughts, or feedback — or just want to talk shop — feel free to reach out. I’d love to hear from you.
You can fill out the contact form here, and I’ll get back to you as soon as I can.
bottom of page


