skills/dark-mode-design-expert/SKILL.md
--- license: Apache-2.0 category: Design & Creative tags: - dark-mode - theming - design - accessibility - contrast --- # Dark Mode Design Expert Master dark mode UI design with atmospheric theming, WCAG accessibility, and cross-platform best practices. Specializes in weather/sky/ocean-inspired color systems that adapt to time of day and environmental conditions. ## Decision Points ### When Dark Mode is Right for the User ``` IF user environment = bright (outdoor/office) AND devic
npx skillsauth add curiositech/windags-skills skills/dark-mode-design-expertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Master dark mode UI design with atmospheric theming, WCAG accessibility, and cross-platform best practices. Specializes in weather/sky/ocean-inspired color systems that adapt to time of day and environmental conditions.
IF user environment = bright (outdoor/office) AND device ≠ OLED
→ Recommend light mode (better readability)
ELSE IF user environment = low light (evening/bedroom)
→ Activate dark mode (reduce eye strain)
ELSE IF device = OLED AND battery concern = high
→ Suggest dark mode (39-47% power savings at max brightness)
ELSE IF user has astigmatism flags (accessibility preference)
→ Default to light mode (dark text prevents halation)
ELSE
→ Respect system preference (prefers-color-scheme)
FOR text content:
IF text size ≥ 24px (large text)
→ Target 4.5:1 minimum, 7:1 ideal
ELSE IF body text
→ Target 7:1+ (AAA compliance)
ELSE IF disabled/decorative
→ 3:1 acceptable
FOR interactive elements:
IF primary action button
→ 4.5:1+ against background
ELSE IF border/icon
→ 3:1+ minimum
IF theme = light mode
→ Use box-shadow for elevation
→ Shadows = rgba(0,0,0,0.1-0.3)
ELSE IF theme = dark mode
→ Use lighter surface colors
→ Each level = base + 5-11% white overlay
→ NO shadows (invisible on dark)
ELSE IF theme = atmospheric (storm/night)
→ Use colored glow effects
→ box-shadow with theme accent color
IF switching light → dark:
IF color lightness > 70%
→ Increase saturation 10-20%
→ Reduce lightness to 40-60%
IF color is brand primary
→ Use 400-level instead of 600-level
→ Test against dark background
IF color is gray/neutral
→ Invert but avoid pure white/black
→ Use #f1f5f9 instead of #ffffff
ELSE IF switching dark → light:
→ Reverse above rules
→ Test readability on white background
Symptoms: Background is #000000, text is #ffffff, harsh contrast Detection: Check if background HSL lightness = 0% Fix: Replace with near-black (#0c1222, #121212) and off-white (#f1f5f9)
Symptoms: Cards have no elevation in dark mode, UI feels flat Detection: box-shadow values unchanged between themes Fix: Replace shadows with lighter surface colors in dark mode
/* Wrong */
.card { box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
/* Right */
:root.theme-dark .card {
background: var(--surface-elevated);
box-shadow: none;
}
Symptoms: Colors look washed out or invisible in dark mode Detection: Same hex values used in both themes Fix: Manually adjust each color for its new background context
Symptoms: Page loads light, then flashes to dark after 100-200ms
Detection: Theme change visible during page load
Fix: Inline blocking script in <head> before any CSS:
<script>
(function(){
if(localStorage.theme==='dark')
document.documentElement.classList.add('theme-dark');
})();
</script>
Symptoms: App forces one theme regardless of user's OS setting
Detection: No prefers-color-scheme media queries
Fix: Default to system preference, allow manual override
Scenario: Building a weather app that shows current conditions with background that matches the weather and time of day.
User Context:
Decision Process:
Implementation:
/* Night + Clear Weather */
:root.atmosphere-night-clear {
--bg-primary: #0c1222; /* Deep navy, not pure black */
--bg-elevated: #1a1f3a; /* Lighter for cards */
--text-primary: #f1f5f9; /* Off-white, not pure white */
--accent: #22d3ee; /* Cyan for bioluminescent feel */
/* Starry effect */
background-image: radial-gradient(
circle at 20% 30%, rgba(34, 211, 238, 0.1) 0%, transparent 50%
);
}
What novice would miss:
Expert catches:
Scenario: Enterprise dashboard needs to support users with astigmatism (prefer light mode) and users with light sensitivity (prefer dark mode).
Conflict: Astigmatism users experience "halation" (text bleeding) in dark mode, while light-sensitive users get eye strain from light mode.
Decision Process:
prefers-reduced-contrast and user-set preferencesImplementation:
/* Medium contrast theme */
:root.theme-accessible {
--bg-primary: #1e293b; /* Not too dark */
--bg-elevated: #334155; /* Clear hierarchy */
--text-primary: #e2e8f0; /* Not pure white */
--contrast-ratio: 12:1; /* Between 7:1 and 21:1 */
}
/* High contrast escape hatch */
:root.theme-high-contrast {
--bg-primary: #000000;
--text-primary: #ffffff;
--contrast-ratio: 21:1;
}
Expert considerations:
Scenario: Mobile news app user reports poor battery life, but switching to dark mode makes article text harder to read.
Analysis:
Decision Process:
Implementation:
/* Brightness-adaptive contrast */
:root.brightness-high {
/* Higher contrast for outdoor reading */
--text-primary: #000000; /* Pure black for maximum contrast */
--bg-primary: #ffffff; /* Pure white background */
}
:root.brightness-low {
/* Lower contrast for indoor comfort */
--text-primary: #f1f5f9;
--bg-primary: #0c1222;
}
What novice would miss:
Expert solution:
This skill handles dark mode implementation. For other needs:
color-theory-palette-harmony-expert insteadtypography-expert for font selection and sizingdesign-system-creator for broader architecturecolor-contrast-auditor for testing color pairsweb-design-expert for overall visual directionfrontend-expert for theme transition animationsDelegate when you see:
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.