Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for the Flat Design style. Trigger when the user wants no shadows, simple shapes, and bold colors.
.claude/skills/lingxling-flat-design/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 44% | 0% |
> "Digital surfaces should look digital. Embrace the 2D plane."
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.
Roboto, Open Sans). Keep it medium to bold.css.flat-card { background-color: var(--secondary-base); border: 2px solid var(--primary-text); border-radius: 0; /* Sharp corners preferred */ padding: 32px; /* NO box-shadow */ } .flat-btn { background-color: var(--cta-highlight); color: #fff; border: none; padding: 16px 32px; font-weight: 700; text-transform: uppercase; transition: opacity 0.2s; } .flat-btn:hover { opacity: 0.8; /* Only change opacity or solid color on hover, no lifting */ }
swiftstruct FlatCard: View { var body: some View { VStack(alignment: .leading, spacing: 16) { Text("Card Title") .font(.system(size: 18, weight: .bold)) Text("Content without any depth effects.") .font(.system(size: 15)) .foregroundColor(.secondary) Button(action: {}) { Text("ACTION") .font(.system(size: 14, weight: .bold)) .foregroundColor(.white) .padding(.horizontal, 24) .padding(.vertical, 12) .background(Color.blue) // No cornerRadius — sharp edges } } .padding(24) .background(Color(.secondarySystemBackground)) // NO .shadow() — ever // NO .cornerRadius() — sharp rectangles .overlay( Rectangle().stroke(Color.primary.opacity(0.2), lineWidth: 1) ) } }
.shadow() or .cornerRadius(). Elements are flat rectangles..overlay(Rectangle().stroke(...)) for visible borders instead of shadows to delineate space.opacity or swap a solid background color.dartclass FlatCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: Colors.grey[100], border: Border.all(color: Colors.black26, width: 1), // borderRadius: NONE — sharp corners // boxShadow: NONE — zero depth ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('Card Title', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), const SizedBox(height: 16), const Text('Content without any depth effects.', style: TextStyle(fontSize: 15, color: Colors.black54)), const SizedBox(height: 16), ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( elevation: 0, // Critical: no shadow backgroundColor: Colors.blue, foregroundColor: Colors.white, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.zero, // Sharp corners ), padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), ), child: const Text('ACTION', style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 1)), ), ], ), ); } }
ThemeData globally to kill all elevation:dart ThemeData( cardTheme: const CardTheme(elevation: 0, shape: RoundedRectangleBorder()), appBarTheme: const AppBarTheme(elevation: 0), floatingActionButtonTheme: const FloatingActionButtonThemeData(elevation: 0), )
Container with BoxDecoration instead of Card widget to avoid default elevation.jsxconst FlatCard = () => ( <View style={{ padding: 24, backgroundColor: '#F0F0F0', borderWidth: 1, borderColor: '#CCCCCC', // NO borderRadius // NO elevation or shadow properties }}> <Text style={{ fontSize: 18, fontWeight: '700', marginBottom: 16 }}> Card Title </Text> <Text style={{ fontSize: 15, color: '#666', marginBottom: 16 }}> Content without any depth effects. </Text> <TouchableOpacity style={{ backgroundColor: '#2196F3', paddingHorizontal: 24, paddingVertical: 12, alignSelf: 'flex-start', // NO borderRadius, NO elevation }} activeOpacity={0.7} > <Text style={{ color: '#FFF', fontWeight: '700', letterSpacing: 1 }}> ACTION </Text> </TouchableOpacity> </View> );
elevation: 0 and remove ALL shadow properties (shadowColor, shadowOffset, etc.).const theme = { ...DefaultTheme, roundness: 0, }.backgroundColor directly, not add glow or lift.kotlin@Composable fun FlatCard() { Column( modifier = Modifier .background(Color(0xFFF0F0F0)) .border(1.dp, Color(0xFFCCCCCC)) .padding(24.dp) ) { Text("Card Title", fontSize = 18.sp, fontWeight = FontWeight.Bold) Spacer(Modifier.height(16.dp)) Text("Content without any depth effects.", fontSize = 15.sp, color = Color(0xFF666666)) Spacer(Modifier.height(16.dp)) Button( onClick = {}, shape = RectangleShape, // Sharp corners elevation = ButtonDefaults.buttonElevation( defaultElevation = 0.dp, // No shadow pressedElevation = 0.dp, ), colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF2196F3)), contentPadding = PaddingValues(horizontal = 24.dp, vertical = 12.dp), ) { Text("ACTION", fontWeight = FontWeight.Bold, letterSpacing = 1.sp) } } }
MaterialTheme shapes: shapes = Shapes(small = RectangleShape, medium = RectangleShape, large = RectangleShape).0.dp on Card, TopAppBar, and FloatingActionButton.Modifier.border() instead of elevation to separate UI regions.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,136 | 17,152 | +31% | 1 | 1 | 0% | 2,602 | 4,585 | +76% | 0 | 0 | — |
case-02 | fail→pass | 18,417 | 11,523 | -37% | 1 | 1 | 0% | 2,873 | 4,205 | +46% | 0 | 0 | — |
case-03 | fail→fail | 11,470 | 10,278 | -10% | 1 | 1 | 0% | 2,298 | 4,105 | +79% | 0 | 0 | — |
case-04 | fail→pass | 23,181 | 13,935 | -40% | 1 | 1 | 0% | 3,660 | 4,307 | +18% | 0 | 0 | — |
case-05 | fail→fail | 19,639 | 14,683 | -25% | 1 | 1 | 0% | 3,131 | 4,210 | +34% | 0 | 0 | — |
case-06 | fail→pass | 10,559 | 12,128 | +15% | 1 | 1 | 0% | 2,017 | 3,769 | +87% | 0 | 0 | — |
case-07 | fail→pass | 14,115 | 10,904 | -23% | 1 | 1 | 0% | 2,440 | 3,504 | +44% | 0 | 0 | — |
case-08 | fail→pass | 11,075 | 13,266 | +20% | 1 | 1 | 0% | 1,759 | 4,454 | +153% | 0 | 0 | — |
case-09 | pass→pass | 20,885 | 17,263 | -17% | 1 | 1 | 0% | 3,056 | 4,488 | +47% | 0 | 0 | — |
case-10 | fail→pass | 21,019 | 16,528 | -21% | 1 | 1 | 0% | 3,238 | 4,550 | +41% | 0 | 0 | — |
case-11 | fail→pass | 15,106 | 15,654 | +4% | 1 | 1 | 0% | 2,697 | 4,128 | +53% | 0 | 0 | — |
case-12 | fail→pass | 20,463 | 9,082 | -56% | 1 | 1 | 0% | 3,258 | 3,726 | +14% | 0 | 0 | — |
case-13 | fail→pass | 17,727 | 14,475 | -18% | 1 | 1 | 0% | 2,634 | 4,005 | +52% | 0 | 0 | — |
case-14 | fail→pass | 15,625 | 12,065 | -23% | 1 | 1 | 0% | 2,661 | 3,876 | +46% | 0 | 0 | — |
case-15 | fail→pass | 15,808 | 8,793 | -44% | 1 | 1 | 0% | 2,561 | 3,495 | +36% | 0 | 0 | — |
case-16 | fail→fail | 17,008 | 10,254 | -40% | 1 | 1 | 0% | 2,993 | 3,797 | +27% | 0 | 0 | — |
case-17 | pass→pass | 18,620 | 13,803 | -26% | 1 | 1 | 0% | 2,488 | 4,015 | +61% | 0 | 0 | — |
case-18 | pass→pass | 14,921 | 12,822 | -14% | 1 | 1 | 0% | 1,912 | 3,685 | +93% | 0 | 0 | — |
case-19 | fail→pass | 18,206 | 17,771 | -2% | 1 | 1 | 0% | 2,834 | 4,722 | +67% | 0 | 0 | — |
case-20 | pass→pass | 13,968 | 11,323 | -19% | 1 | 1 | 0% | 2,548 | 4,170 | +64% | 0 | 0 | — |
case-21 | fail→pass | 30,192 | 10,778 | -64% | 1 | 1 | 0% | 2,101 | 3,879 | +85% | 0 | 0 | — |
case-22 | pass→pass | 18,445 | 15,593 | -15% | 1 | 1 | 0% | 3,005 | 4,350 | +45% | 0 | 0 | — |
case-23 | fail→pass | 10,540 | 11,389 | +8% | 1 | 1 | 0% | 1,742 | 3,694 | +112% | 0 | 0 | — |
case-24 | pass→pass | 12,755 | 10,014 | -21% | 1 | 1 | 0% | 1,785 | 3,502 | +96% | 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. 24 cases were attempted. The headline lift of +63 percentage points is the difference between those two pass rates over the 24 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.