Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Flat Design 2.0 (Semi-Flat). Trigger when the user wants flat design with subtle shadows and improved usability.
.claude/skills/lingxling-flat-design-2/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 112% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 106% | 0% |
> "Flat aesthetics, but with subtle hints of physics to communicate interactability."
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 { --shadow-color: rgba(43, 48, 58, 0.08); /* Tinted shadow */ } .flat2-card { background-color: var(--bg-primary); border-radius: 8px; padding: 32px; /* Very subtle, diffuse shadow */ box-shadow: 0 10px 30px var(--shadow-color); transition: transform 0.3s ease, box-shadow 0.3s ease; } .flat2-card:hover { transform: translateY(-4px); box-shadow: 0 20px 40px rgba(43, 48, 58, 0.12); } .flat2-btn { background: var(--cta-highlight); border-radius: 4px; padding: 12px 24px; color: white; border: none; box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
swiftstruct SemiFlatCard: View { @State private var isPressed = false var body: some View { VStack(alignment: .leading, spacing: 16) { Text("Semi-Flat Card") .font(.system(size: 18, weight: .semibold)) Text("Flat aesthetic with just enough depth to hint at interactivity.") .font(.system(size: 15)) .foregroundColor(.secondary) } .padding(24) .background(Color(.systemBackground)) .cornerRadius(8) // The key: very soft, tinted shadow — NOT harsh black .shadow(color: Color.black.opacity(0.06), radius: 12, x: 0, y: 4) .scaleEffect(isPressed ? 0.98 : 1.0) .animation(.easeOut(duration: 0.2), value: isPressed) .onLongPressGesture(minimumDuration: .infinity, pressing: { pressing in isPressed = pressing }, perform: {}) } } struct SemiFlatButton: View { var body: some View { Button(action: {}) { Text("Continue") .font(.system(size: 15, weight: .semibold)) .foregroundColor(.white) .padding(.horizontal, 24) .padding(.vertical, 12) .background(Color.accentColor) .cornerRadius(4) // Subtle button shadow .shadow(color: Color.accentColor.opacity(0.25), radius: 8, x: 0, y: 4) } .buttonStyle(.plain) } }
Color.accentColor.opacity(0.15)), never pure black.radius: 10...16 with opacity: 0.05...0.08 — if you can immediately see the shadow, it's too heavy.scaleEffect on press to hint at physical feedback.dartclass SemiFlatCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), // Very soft, tinted shadow boxShadow: [ BoxShadow( color: const Color(0xFF2B303A).withOpacity(0.08), blurRadius: 24, offset: const Offset(0, 8), spreadRadius: 0, ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('Semi-Flat Card', style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600)), const SizedBox(height: 16), const Text('Flat aesthetic with just enough depth to hint at interactivity.', style: TextStyle(fontSize: 15, color: Colors.black54)), const SizedBox(height: 20), ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( elevation: 2, // Very low — just enough to feel clickable shadowColor: Theme.of(context).primaryColor.withOpacity(0.3), backgroundColor: Theme.of(context).primaryColor, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), ), child: const Text('Continue', style: TextStyle(fontWeight: FontWeight.w600)), ), ], ), ); } }
elevation: 1 to elevation: 4 max. Never exceed elevation: 6.shadowColor to match the card's background or the brand color.InkWell for ripple effects and a slight Transform.translate animation on press.jsxconst SemiFlatCard = () => ( <View style={{ padding: 24, backgroundColor: '#FFFFFF', borderRadius: 8, // Very subtle, diffuse shadow shadowColor: '#2B303A', shadowOffset: { width: 0, height: 8 }, shadowOpacity: 0.08, shadowRadius: 24, // Android elevation: 3, }}> <Text style={{ fontSize: 18, fontWeight: '600', marginBottom: 16 }}> Semi-Flat Card </Text> <Text style={{ fontSize: 15, color: '#666', marginBottom: 20 }}> Flat aesthetic with just enough depth to hint at interactivity. </Text> <Pressable style={({ pressed }) => ({ backgroundColor: '#4A90D9', paddingHorizontal: 24, paddingVertical: 12, borderRadius: 4, alignSelf: 'flex-start', transform: [{ scale: pressed ? 0.97 : 1 }], shadowColor: '#4A90D9', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.25, shadowRadius: 8, })} > <Text style={{ color: '#FFF', fontWeight: '600' }}>Continue</Text> </Pressable> </View> );
shadowOpacity: 0.05...0.10 with shadowRadius: 16...24 for a diffuse spread.elevation: 2...4 is equivalent. Avoid going above elevation: 6.Pressable with ({ pressed }) style callback for animated press states.kotlin@Composable fun SemiFlatCard() { Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), colors = CardDefaults.cardColors(containerColor = Color.White), ) { Column(modifier = Modifier.padding(24.dp)) { Text("Semi-Flat Card", fontSize = 18.sp, fontWeight = FontWeight.SemiBold) Spacer(Modifier.height(16.dp)) Text("Flat aesthetic with just enough depth to hint at interactivity.", fontSize = 15.sp, color = Color(0xFF666666)) Spacer(Modifier.height(20.dp)) Button( onClick = {}, shape = RoundedCornerShape(4.dp), elevation = ButtonDefaults.buttonElevation(defaultElevation = 2.dp), contentPadding = PaddingValues(horizontal = 24.dp, vertical = 12.dp), ) { Text("Continue", fontWeight = FontWeight.SemiBold) } } } }
CardDefaults.cardElevation(defaultElevation = 2.dp) — keep it under 4dp.hoveredElevation = 4.dp, pressedElevation = 1.dp for subtle physics.Modifier.shadow(elevation, shape, ambientColor, spotColor) with custom tinted colors.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,537 | 21,228 | +84% | 1 | 1 | 0% | 2,128 | 4,514 | +112% | 0 | 0 | — |
case-02 | fail→pass | 20,609 | 13,234 | -36% | 1 | 1 | 0% | 3,256 | 4,391 | +35% | 0 | 0 | — |
case-03 | pass→pass | 20,449 | 13,965 | -32% | 1 | 1 | 0% | 2,355 | 5,443 | +131% | 0 | 0 | — |
case-04 | pass→pass | 23,136 | 15,686 | -32% | 1 | 1 | 0% | 3,482 | 4,827 | +39% | 0 | 0 | — |
case-05 | pass→fail | 28,834 | 17,914 | -38% | 1 | 1 | 0% | 3,954 | 5,263 | +33% | 0 | 0 | — |
case-06 | fail→fail | 15,266 | 8,637 | -43% | 1 | 1 | 0% | 2,229 | 4,025 | +81% | 0 | 0 | — |
case-07 | pass→pass | 19,515 | 12,443 | -36% | 1 | 1 | 0% | 2,936 | 5,075 | +73% | 0 | 0 | — |
case-08 | fail→pass | 18,385 | 12,636 | -31% | 1 | 1 | 0% | 3,275 | 4,768 | +46% | 0 | 0 | — |
case-09 | pass→pass | 9,586 | 10,068 | +5% | 1 | 1 | 0% | 2,046 | 4,371 | +114% | 0 | 0 | — |
case-10 | fail→fail | 20,951 | 14,211 | -32% | 1 | 1 | 0% | 3,761 | 4,829 | +28% | 0 | 0 | — |
case-11 | fail→pass | 16,614 | 15,248 | -8% | 1 | 1 | 0% | 3,108 | 4,723 | +52% | 0 | 0 | — |
case-12 | fail→pass | 13,079 | 11,514 | -12% | 1 | 1 | 0% | 2,005 | 4,133 | +106% | 0 | 0 | — |
case-13 | fail→pass | 22,522 | 31,111 | +38% | 1 | 1 | 0% | 4,338 | 7,347 | +69% | 0 | 0 | — |
case-14 | pass→pass | 13,926 | 17,897 | +29% | 1 | 1 | 0% | 1,981 | 5,059 | +155% | 0 | 0 | — |
case-15 | fail→fail | 14,614 | 14,177 | -3% | 1 | 1 | 0% | 2,293 | 4,531 | +98% | 0 | 0 | — |
case-16 | fail→pass | 13,210 | 6,758 | -49% | 1 | 1 | 0% | 2,004 | 3,626 | +81% | 0 | 0 | — |
case-17 | pass→pass | 14,224 | 16,803 | +18% | 1 | 1 | 0% | 2,263 | 4,853 | +114% | 0 | 0 | — |
case-18 | fail→fail | 6,656 | 10,983 | +65% | 1 | 1 | 0% | 1,318 | 4,546 | +245% | 0 | 0 | — |
case-19 | pass→pass | 17,691 | 20,962 | +18% | 1 | 1 | 0% | 3,412 | 5,643 | +65% | 0 | 0 | — |
case-20 | pass→pass | 23,453 | 19,763 | -16% | 1 | 1 | 0% | 3,945 | 5,695 | +44% | 0 | 0 | — |
case-21 | pass→pass | 11,361 | 17,051 | +50% | 1 | 1 | 0% | 2,520 | 5,205 | +107% | 0 | 0 | — |
case-22 | pass→pass | 11,884 | 14,356 | +21% | 1 | 1 | 0% | 2,288 | 5,379 | +135% | 0 | 0 | — |
case-23 | pass→pass | 20,966 | 14,154 | -32% | 1 | 1 | 0% | 3,393 | 5,351 | +58% | 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. 23 cases were attempted. The headline lift of +26 percentage points is the difference between those two pass rates over the 23 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.