Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Dark Mode Design. Trigger when user wants dark surfaces, reduced eye strain, and premium sleek aesthetics.
.claude/skills/lingxling-dark-mode/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 120% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 139% | 0% |
> "Not just inverted colors. A carefully constructed hierarchy of light on dark."
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the design-it skill and is not meant to be triggered directly.
#000000 causes smearing on OLED screens and extreme eye strain with white text. Use dark greys (e.g., #121212 or #0A0A0A).#121212. Elevated cards #1E1E1E, #252525. Primary text #E1E1E1 (not #FFFFFF).css:root { --bg-base: #121212; --bg-elevated-1: #1E1E1E; --bg-elevated-2: #242424; --text-high-emphasis: rgba(255, 255, 255, 0.87); --text-medium-emphasis: rgba(255, 255, 255, 0.60); /* Accent color: Desaturated purple instead of bright purple */ --accent-color: #BB86FC; } body { background-color: var(--bg-base); color: var(--text-high-emphasis); font-weight: 300; /* Thinner weight for dark mode */ } .dark-card { background-color: var(--bg-elevated-1); border-radius: 8px; padding: 24px; /* Very subtle border can help separate dark surfaces */ border: 1px solid rgba(255, 255, 255, 0.05); } .dark-card:hover { /* On hover, the element moves closer to the user, so it gets lighter */ background-color: var(--bg-elevated-2); } .dark-btn { background-color: var(--accent-color); color: #000; /* Dark text on light accent is highly readable */ font-weight: 600; border: none; padding: 12px 24px; border-radius: 4px; }
swiftstruct DarkModeView: View { // Force Dark Mode on this specific view (or use system settings) @Environment(\.colorScheme) var colorScheme var body: some View { ScrollView { VStack(spacing: 20) { // Primary elevated card VStack(alignment: .leading, spacing: 12) { Text("Elevation via Lightness") .font(.headline) .foregroundColor(.primary) // Auto-adapts Text("In dark mode, elevated surfaces are lighter grey, not shadowed.") .font(.subheadline) .foregroundColor(.secondary) // Auto-adapts } .padding() .frame(maxWidth: .infinity, alignment: .leading) // Use native semantic colors. .secondarySystemBackground is lighter than .systemBackground .background(Color(UIColor.secondarySystemBackground)) .cornerRadius(12) // Desaturated Accent Button Button(action: {}) { Text("Desaturated Accent") .fontWeight(.semibold) .foregroundColor(.black) // Dark text on light accent .padding() .frame(maxWidth: .infinity) .background(Color(red: 0.73, green: 0.52, blue: 0.98)) // #BB86FC (Desaturated purple) .cornerRadius(8) } } .padding() } // #121212 is the standard dark mode background, which systemBackground maps to closely .background(Color(UIColor.systemBackground)) } } // .preferredColorScheme(.dark) to force
Color.primary, Color.secondary, Color(UIColor.systemBackground) and Color(UIColor.secondarySystemBackground) handle perfect dark mode transitions automatically.dartimport 'package:flutter/material.dart'; class DarkModeApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( // Configure the Dark Theme themeMode: ThemeMode.dark, darkTheme: ThemeData.dark().copyWith( scaffoldBackgroundColor: const Color(0xFF121212), // Standard dark background cardColor: const Color(0xFF1E1E1E), // Elevated surface colorScheme: const ColorScheme.dark().copyWith( primary: const Color(0xFFBB86FC), // Desaturated accent onPrimary: Colors.black, // Dark text on light accent surface: const Color(0xFF1E1E1E), ), ), home: Scaffold( appBar: AppBar(title: const Text('Dark Mode', style: TextStyle(color: Colors.white70))), body: ListView( padding: const EdgeInsets.all(16), children: [ Card( elevation: 0, // Shadows don't show well anyway shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: BorderSide(color: Colors.white.withOpacity(0.05)), // Subtle border ), child: const Padding( padding: EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Elevation via Lightness', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), SizedBox(height: 8), Text('Elevated surfaces use lighter greys.', style: TextStyle(color: Colors.white60)), ], ), ), ), const SizedBox(height: 20), ElevatedButton( onPressed: () {}, child: const Text('Desaturated Accent'), ), ], ), ), ); } }
ThemeData.dark(), actively override scaffoldBackgroundColor to #121212 and cardColor to #1E1E1E.colorScheme.onPrimary is black so text is readable when placed on top of your desaturated primary accent button.jsximport { useColorScheme } from 'react-native'; const DarkModeScreen = () => { const isDark = useColorScheme() === 'dark'; // Custom dark theme dictionary const theme = { bgBase: isDark ? '#121212' : '#FFFFFF', bgElevated: isDark ? '#1E1E1E' : '#F5F5F5', textHigh: isDark ? 'rgba(255, 255, 255, 0.87)' : 'rgba(0, 0, 0, 0.87)', textMedium: isDark ? 'rgba(255, 255, 255, 0.60)' : 'rgba(0, 0, 0, 0.60)', accent: isDark ? '#BB86FC' : '#6200EE', // Desaturated for dark, vibrant for light onAccent: isDark ? '#000' : '#FFF', }; return ( <View style={{ flex: 1, backgroundColor: theme.bgBase, padding: 16 }}> <View style={{ backgroundColor: theme.bgElevated, padding: 24, borderRadius: 12, borderWidth: isDark ? 1 : 0, borderColor: 'rgba(255,255,255,0.05)', marginBottom: 20 }}> <Text style={{ color: theme.textHigh, fontSize: 18, fontWeight: 'bold', marginBottom: 8 }}> Elevation via Lightness </Text> <Text style={{ color: theme.textMedium }}> Elevated surfaces use lighter greys. </Text> </View> <TouchableOpacity style={{ backgroundColor: theme.accent, padding: 16, borderRadius: 8, alignItems: 'center' }}> <Text style={{ color: theme.onAccent, fontWeight: 'bold' }}>Desaturated Accent</Text> </TouchableOpacity> </View> ); };
useColorScheme() hook from React Native.theme.accent shifts from a vibrant purple (#6200EE) in light mode to a desaturated pastel purple (#BB86FC) in dark mode.kotlin@Composable fun DarkModeScreen() { // Typically this logic lives in your Theme.kt val darkColors = darkColorScheme( background = Color(0xFF121212), surface = Color(0xFF1E1E1E), primary = Color(0xFFBB86FC), onPrimary = Color.Black, onBackground = Color.White.copy(alpha = 0.87f), onSurface = Color.White.copy(alpha = 0.87f) ) MaterialTheme(colorScheme = darkColors) { Column( modifier = Modifier .fillMaxSize() .background(MaterialTheme.colorScheme.background) .padding(16.dp) ) { Card( colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), shape = RoundedCornerShape(12.dp), border = BorderStroke(1.dp, Color.White.copy(alpha = 0.05f)) ) { Column(modifier = Modifier.padding(24.dp)) { Text("Elevation via Lightness", style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface) Spacer(Modifier.height(8.dp)) Text("Elevated surfaces use lighter greys.", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f)) } } Spacer(Modifier.height(20.dp)) Button( onClick = {}, colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary ), modifier = Modifier.fillMaxWidth().height(50.dp) ) { Text("Desaturated Accent", fontWeight = FontWeight.Bold) } } } }
darkColorScheme.Color(0xFF1E1E1E) for surface and Color(0xFF121212) for background. Compose will automatically map these to Cards and Scaffolds.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→fail | 16,443 | 11,376 | -31% | 1 | 1 | 0% | 2,313 | 5,193 | +125% | 0 | 0 | — |
case-01 | fail→fail | 21,997 | 25,201 | +15% | 1 | 1 | 0% | 4,261 | 6,821 | +60% | 0 | 0 | — |
case-02 | fail→pass | 24,534 | 21,375 | -13% | 1 | 1 | 0% | 5,270 | 7,510 | +43% | 0 | 0 | — |
case-03 | fail→fail | 17,965 | 19,512 | +9% | 1 | 1 | 0% | 2,807 | 5,968 | +113% | 0 | 0 | — |
case-04 | pass→pass | 15,237 | 13,207 | -13% | 1 | 1 | 0% | 2,162 | 5,168 | +139% | 0 | 0 | — |
case-05 | pass→pass | 9,682 | 9,536 | -2% | 1 | 1 | 0% | 1,789 | 4,338 | +142% | 0 | 0 | — |
case-06 | pass→pass | 18,436 | 15,623 | -15% | 1 | 1 | 0% | 2,767 | 5,931 | +114% | 0 | 0 | — |
case-07 | pass→pass | 13,946 | 7,377 | -47% | 1 | 1 | 0% | 2,315 | 4,357 | +88% | 0 | 0 | — |
case-21 | pass→pass | 6,801 | 3,133 | -54% | 1 | 1 | 0% | 1,143 | 3,417 | +199% | 0 | 0 | — |
case-08 | pass→pass | 15,381 | 14,325 | -7% | 1 | 1 | 0% | 3,084 | 5,836 | +89% | 0 | 0 | — |
case-09 | pass→pass | 11,601 | 5,356 | -54% | 1 | 1 | 0% | 1,683 | 3,865 | +130% | 0 | 0 | — |
case-10 | pass→pass | 15,127 | 8,842 | -42% | 1 | 1 | 0% | 2,589 | 4,505 | +74% | 0 | 0 | — |
case-11 | fail→pass | 14,975 | 13,361 | -11% | 1 | 1 | 0% | 2,773 | 5,520 | +99% | 0 | 0 | — |
case-12 | fail→pass | 11,285 | 6,385 | -43% | 1 | 1 | 0% | 1,830 | 4,029 | +120% | 0 | 0 | — |
case-13 | fail→fail | 16,308 | 9,778 | -40% | 1 | 1 | 0% | 2,422 | 4,750 | +96% | 0 | 0 | — |
case-14 | pass→pass | 15,834 | 13,235 | -16% | 1 | 1 | 0% | 2,545 | 5,051 | +98% | 0 | 0 | — |
case-15 | fail→fail | 6,309 | 6,788 | +8% | 1 | 1 | 0% | 1,188 | 4,459 | +275% | 0 | 0 | — |
case-17 | fail→pass | 16,559 | 12,491 | -25% | 1 | 1 | 0% | 2,663 | 4,877 | +83% | 0 | 0 | — |
case-18 | pass→pass | 13,871 | 12,181 | -12% | 1 | 1 | 0% | 2,854 | 5,292 | +85% | 0 | 0 | — |
case-19 | fail→fail | 15,902 | 13,795 | -13% | 1 | 1 | 0% | 2,297 | 5,027 | +119% | 0 | 0 | — |
case-20 | pass→pass | 18,419 | 9,688 | -47% | 1 | 1 | 0% | 2,725 | 4,379 | +61% | 0 | 0 | — |
case-22 | pass→pass | 13,281 | 5,390 | -59% | 1 | 1 | 0% | 1,815 | 3,734 | +106% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.