Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Monochromatic UI. Trigger when user wants a single-color palette, high elegance, and strict color discipline.
.claude/skills/lingxling-monochromatic-ui/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 43% | 0% |
> "Elegance through constraint. A single hue, explored through all its tints, tones, and shades."
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.
css:root { /* Base Hue: Deep Blue (210) */ --mono-900: hsl(210, 80%, 10%); /* Very dark */ --mono-700: hsl(210, 70%, 30%); /* Dark */ --mono-500: hsl(210, 60%, 50%); /* Base */ --mono-300: hsl(210, 50%, 80%); /* Light */ --mono-100: hsl(210, 40%, 95%); /* Very light background */ } body { background-color: var(--mono-100); color: var(--mono-900); font-family: 'Inter', sans-serif; } .mono-card { background-color: #ffffff; /* Or mono-100 */ border: 1px solid var(--mono-300); border-radius: 8px; padding: 32px; /* Tinted shadow */ box-shadow: 0 10px 25px hsla(210, 80%, 10%, 0.05); } .mono-btn { background-color: var(--mono-500); color: #ffffff; border: none; border-radius: 4px; padding: 12px 24px; transition: background-color 0.2s; } .mono-btn:hover { background-color: var(--mono-700); } .mono-subtext { color: var(--mono-500); /* Use mid-tones for secondary text */ font-weight: 500; }
swiftstruct MonochromaticView: View { // Base Hue: Deep Blue (210 in 360-degree HSB/HSL) // In SwiftUI, hue is 0.0 to 1.0 (210/360 = 0.58) let mono900 = Color(hue: 0.58, saturation: 0.80, brightness: 0.10) let mono700 = Color(hue: 0.58, saturation: 0.70, brightness: 0.30) let mono500 = Color(hue: 0.58, saturation: 0.60, brightness: 0.50) let mono300 = Color(hue: 0.58, saturation: 0.50, brightness: 0.80) let mono100 = Color(hue: 0.58, saturation: 0.40, brightness: 0.95) var body: some View { VStack(spacing: 24) { // Card VStack(alignment: .leading, spacing: 12) { Text("Monochromatic Elegance") .font(.title2).fontWeight(.semibold) .foregroundColor(mono900) Text("Using only variations in saturation and brightness of a single hue.") .foregroundColor(mono500) } .padding(32) .background(Color.white) .border(mono300, width: 1) .shadow(color: mono900.opacity(0.1), radius: 15, y: 5) // Tinted shadow // Button Button(action: {}) { Text("Primary Action") .fontWeight(.bold) .foregroundColor(.white) .frame(maxWidth: .infinity) .padding() .background(mono500) .cornerRadius(8) } } .padding() .frame(maxWidth: .infinity, maxHeight: .infinity) .background(mono100) } }
Color(hue: saturation: brightness:). This ensures math-perfect monochromatic harmony.mono900 color. Pure black shadows look dirty in a strict monochromatic UI.dartclass MonochromaticScreen extends StatelessWidget { // Base Hue: Deep Blue (210) // Flutter HSVColor uses Hue 0-360, Saturation 0.0-1.0, Value 0.0-1.0 final Color mono900 = const HSVColor.fromAHSV(1.0, 210, 0.80, 0.10).toColor(); final Color mono500 = const HSVColor.fromAHSV(1.0, 210, 0.60, 0.50).toColor(); final Color mono300 = const HSVColor.fromAHSV(1.0, 210, 0.50, 0.80).toColor(); final Color mono100 = const HSVColor.fromAHSV(1.0, 210, 0.40, 0.95).toColor(); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: mono100, body: Center( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // Card Container( width: double.infinity, padding: const EdgeInsets.all(32), decoration: BoxDecoration( color: Colors.white, border: Border.all(color: mono300), borderRadius: BorderRadius.circular(8), boxShadow: [ BoxShadow(color: mono900.withOpacity(0.1), blurRadius: 15, offset: const Offset(0, 5)) ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Monochromatic', style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: mono900)), const SizedBox(height: 12), Text('Variations of a single hue.', style: TextStyle(fontSize: 16, color: mono500)), ], ), ), const SizedBox(height: 24), // Button ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( backgroundColor: mono500, foregroundColor: Colors.white, minimumSize: const Size(double.infinity, 56), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), elevation: 0, ), child: const Text('Primary Action', style: TextStyle(fontWeight: FontWeight.bold)), ), ], ), ), ), ); } }
HSVColor.fromAHSV() is the best way to explicitly code a monochromatic palette without guessing hex codes.jsx// Base Hue: Deep Blue (210) const theme = { mono900: 'hsl(210, 80%, 10%)', mono700: 'hsl(210, 70%, 30%)', mono500: 'hsl(210, 60%, 50%)', mono300: 'hsl(210, 50%, 80%)', mono100: 'hsl(210, 40%, 95%)', }; const MonochromaticScreen = () => { return ( <View style={{ flex: 1, backgroundColor: theme.mono100, padding: 24, justifyContent: 'center' }}> <View style={{ backgroundColor: '#FFFFFF', borderColor: theme.mono300, borderWidth: 1, borderRadius: 8, padding: 32, marginBottom: 24, // Tinted shadow (iOS) shadowColor: theme.mono900, shadowOffset: { width: 0, height: 5 }, shadowOpacity: 0.1, shadowRadius: 15, }}> <Text style={{ fontSize: 24, fontWeight: '600', color: theme.mono900, marginBottom: 12 }}> Monochromatic </Text> <Text style={{ fontSize: 16, color: theme.mono500 }}> Using HSL strings in React Native makes palette generation trivial. </Text> </View> <TouchableOpacity style={{ backgroundColor: theme.mono500, padding: 16, borderRadius: 8, alignItems: 'center' }}> <Text style={{ fontWeight: 'bold', color: '#FFFFFF', fontSize: 16 }}> Primary Action </Text> </TouchableOpacity> </View> ); };
hsl() strings natively. Use them! It makes debugging and tweaking a monochromatic palette a million times easier than using hex codes.kotlin@Composable fun MonochromaticScreen() { // Base Hue: Deep Blue (210) // Compose Color.hsv requires Hue 0-360f, Saturation 0-1f, Value 0-1f val mono900 = Color.hsv(210f, 0.80f, 0.10f) val mono500 = Color.hsv(210f, 0.60f, 0.50f) val mono300 = Color.hsv(210f, 0.50f, 0.80f) val mono100 = Color.hsv(210f, 0.40f, 0.95f) Column( modifier = Modifier .fillMaxSize() .background(mono100) .padding(24.dp), verticalArrangement = Arrangement.Center ) { // Card Box( modifier = Modifier .fillMaxWidth() .shadow(15.dp, RoundedCornerShape(8.dp), spotColor = mono900.copy(alpha = 0.2f)) .background(Color.White, RoundedCornerShape(8.dp)) .border(1.dp, mono300, RoundedCornerShape(8.dp)) .padding(32.dp) ) { Column { Text("Monochromatic", fontSize = 24.sp, fontWeight = FontWeight.SemiBold, color = mono900) Spacer(Modifier.height(12.dp)) Text("Strictly enforced hue discipline.", color = mono500) } } Spacer(Modifier.height(24.dp)) // Button Button( onClick = { }, colors = ButtonDefaults.buttonColors(containerColor = mono500, contentColor = Color.White), shape = RoundedCornerShape(8.dp), modifier = Modifier.fillMaxWidth().height(56.dp) ) { Text("Primary Action", fontWeight = FontWeight.Bold) } } }
Color.hsv() to define the palette.spotColor in your Modifier.shadow to mono900 to keep the shadows from looking muddy or disjointed from the design system.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 28,496 | 20,359 | -29% | 1 | 1 | 0% | 5,075 | 6,650 | +31% | 0 | 0 | — |
case-01 | fail→pass | 37,345 | 35,261 | -6% | 1 | 1 | 0% | 5,979 | 10,650 | +78% | 0 | 0 | — |
case-03 | fail→pass | 30,415 | 22,485 | -26% | 1 | 1 | 0% | 6,383 | 7,824 | +23% | 0 | 0 | — |
case-04 | fail→pass | 48,417 | 25,269 | -48% | 1 | 1 | 0% | 8,231 | 8,589 | +4% | 0 | 0 | — |
case-05 | fail→pass | 29,654 | 45,023 | +52% | 1 | 1 | 0% | 6,177 | 8,818 | +43% | 0 | 0 | — |
case-06 | pass→pass | 25,618 | 24,459 | -5% | 1 | 1 | 0% | 5,307 | 8,356 | +57% | 0 | 0 | — |
case-07 | fail→pass | 21,148 | 19,861 | -6% | 1 | 1 | 0% | 3,760 | 7,219 | +92% | 0 | 0 | — |
case-08 | fail→pass | 26,961 | 17,587 | -35% | 1 | 1 | 0% | 4,059 | 6,419 | +58% | 0 | 0 | — |
case-09 | pass→pass | 17,960 | 26,909 | +50% | 1 | 1 | 0% | 3,625 | 7,331 | +102% | 0 | 0 | — |
case-10 | fail→pass | 39,270 | 31,831 | -19% | 1 | 1 | 0% | 7,459 | 10,000 | +34% | 0 | 0 | — |
case-11 | fail→pass | 31,265 | 20,747 | -34% | 1 | 1 | 0% | 5,015 | 6,449 | +29% | 0 | 0 | — |
case-12 | fail→pass | 19,254 | 26,904 | +40% | 1 | 1 | 0% | 3,936 | 7,773 | +97% | 0 | 0 | — |
case-13 | fail→pass | 25,695 | 22,272 | -13% | 1 | 1 | 0% | 4,376 | 7,329 | +67% | 0 | 0 | — |
case-14 | pass→pass | 22,799 | 20,990 | -8% | 1 | 1 | 0% | 3,546 | 7,690 | +117% | 0 | 0 | — |
case-15 | fail→pass | 23,809 | 25,984 | +9% | 1 | 1 | 0% | 4,490 | 8,656 | +93% | 0 | 0 | — |
case-16 | fail→pass | 23,290 | 22,052 | -5% | 1 | 1 | 0% | 4,376 | 7,695 | +76% | 0 | 0 | — |
case-17 | fail→pass | 17,302 | 16,143 | -7% | 1 | 1 | 0% | 2,641 | 6,018 | +128% | 0 | 0 | — |
case-18 | fail→pass | 20,815 | 24,290 | +17% | 1 | 1 | 0% | 3,868 | 7,122 | +84% | 0 | 0 | — |
case-19 | fail→pass | 13,516 | 18,707 | +38% | 1 | 1 | 0% | 1,865 | 6,065 | +225% | 0 | 0 | — |
case-20 | pass→pass | 24,771 | 49,259 | +99% | 1 | 1 | 0% | 4,931 | 11,274 | +129% | 0 | 0 | — |
case-21 | pass→pass | 39,420 | 37,817 | -4% | 1 | 1 | 0% | 8,231 | 11,443 | +39% | 0 | 0 | — |
case-22 | pass→fail | 31,944 | 38,537 | +21% | 1 | 1 | 0% | 4,793 | 11,430 | +138% | 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 +68 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.