Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Material Design. Trigger when user wants Google's aesthetic, elevation, motion, and consistent components.
.claude/skills/lingxling-material-design/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 105% | 0% |
> "Digital paper and ink. Interfaces built on the physical properties of stacked material."
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 or Google Sans (or equivalent clean geometric sans). Stick strictly to the Material Type Scale (H1-H6, Subtitle, Body, Caption, Overline).css.material-card { background: var(--bg-surface); border-radius: 8px; padding: 16px; /* Material Elevation 2 */ box-shadow: 0 3px 1px -2px rgba(0,0,0,0.2), 0 2px 2px 0 rgba(0,0,0,0.14), 0 1px 5px 0 rgba(0,0,0,0.12); transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); } .material-btn { text-transform: uppercase; font-weight: 500; letter-spacing: 1.25px; padding: 0 16px; height: 36px; border-radius: 4px; background: var(--cta-highlight); color: #fff; border: none; /* Ripple effect is usually handled via JS, but structure is key */ }
swiftstruct MaterialCard: View { var body: some View { VStack(alignment: .leading, spacing: 12) { Text("Material Card") .font(.system(size: 20, weight: .medium)) Text("Digital paper and ink. Shadows communicate where this surface sits.") .font(.system(size: 14)) .foregroundColor(.secondary) HStack { Spacer() Button("ACTION") {} .font(.system(size: 14, weight: .medium)) .foregroundColor(.accentColor) .padding(.horizontal, 12) .padding(.vertical, 8) } } .padding(16) .background(Color(.systemBackground)) .cornerRadius(8) // Material Elevation 2 equivalent .shadow(color: Color.black.opacity(0.12), radius: 3, x: 0, y: 1) .shadow(color: Color.black.opacity(0.08), radius: 2, x: 0, y: 2) } } // Material FAB struct MaterialFAB: View { var body: some View { Button(action: {}) { Image(systemName: "plus") .font(.system(size: 24)) .foregroundColor(.white) .frame(width: 56, height: 56) .background(Color.accentColor) .cornerRadius(16) .shadow(color: Color.black.opacity(0.2), radius: 6, x: 0, y: 3) .shadow(color: Color.black.opacity(0.14), radius: 4, x: 0, y: 2) } } }
.shadow() modifiers at different blur/offset values..cornerRadius(8...16) — Material Design 3 uses more rounded shapes than M2..animation(.easeInOut(duration: 0.28)) — Material uses 280ms transitions.dart// Flutter IS Material Design — use it natively class MaterialScreen extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( useMaterial3: true, colorSchemeSeed: const Color(0xFF6750A4), // Material You seed // Map your universal palette here ), home: Scaffold( appBar: AppBar( title: const Text('Material Design'), // M3 appbar elevation is 0 by default, scrolled = 3 ), body: Padding( padding: const EdgeInsets.all(16), child: Card( elevation: 2, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text('Material Card', style: Theme.of(context).textTheme.titleLarge), const SizedBox(height: 8), Text('Digital paper and ink.', style: Theme.of(context).textTheme.bodyMedium), const SizedBox(height: 16), Align( alignment: Alignment.centerRight, child: TextButton( onPressed: () {}, child: const Text('ACTION'), ), ), ], ), ), ), ), floatingActionButton: FloatingActionButton( onPressed: () {}, child: const Icon(Icons.add), // M3 FAB automatically gets correct elevation & shape ), ), ); } }
MaterialApp, ThemeData(useMaterial3: true), and standard widgets.colorSchemeSeed or manually build a ColorScheme.Theme.of(context).textTheme.InkWell and ElevatedButton.jsximport { Provider as PaperProvider, Card, Button, Title, Paragraph } from 'react-native-paper'; const materialTheme = { ...DefaultTheme, roundness: 8, colors: { ...DefaultTheme.colors, primary: '#6750A4', // Material You purple surface: '#FFFBFE', background: '#FFFBFE', }, }; const MaterialScreen = () => ( <PaperProvider theme={materialTheme}> <ScrollView style={{ flex: 1, padding: 16 }}> <Card style={{ marginBottom: 16 }} elevation={2}> <Card.Content> <Title>Material Card</Title> <Paragraph>Digital paper and ink. Shadows communicate hierarchy.</Paragraph> </Card.Content> <Card.Actions> <Button mode="text" onPress={() => {}}>ACTION</Button> </Card.Actions> </Card> {/* Filled button — Material M3 style */} <Button mode="contained" onPress={() => {}} style={{ alignSelf: 'flex-start', borderRadius: 20 }} labelStyle={{ fontWeight: '500', letterSpacing: 1.25 }} > Filled Button </Button> </ScrollView> </PaperProvider> );
react-native-paper — it implements Material Design 3 natively for React Native.Card (with elevation prop), Button (with mode prop), and TextInput for correct Material behavior.Pressable; on iOS, use react-native-paper's TouchableRipple.kotlin// Jetpack Compose IS Material Design — use it natively @Composable fun MaterialScreen() { MaterialTheme( colorScheme = lightColorScheme( primary = Color(0xFF6750A4), onPrimary = Color.White, surface = Color(0xFFFFFBFE), ), typography = Typography( titleLarge = TextStyle(fontSize = 22.sp, fontWeight = FontWeight.Medium), bodyMedium = TextStyle(fontSize = 14.sp, lineHeight = 20.sp), ), ) { Scaffold( topBar = { TopAppBar(title = { Text("Material Design") }) }, floatingActionButton = { FloatingActionButton(onClick = {}) { Icon(Icons.Default.Add, contentDescription = "Add") } }, ) { padding -> Column(modifier = Modifier.padding(padding).padding(16.dp)) { Card( modifier = Modifier.fillMaxWidth(), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), shape = RoundedCornerShape(12.dp), ) { Column(modifier = Modifier.padding(16.dp)) { Text("Material Card", style = MaterialTheme.typography.titleLarge) Spacer(Modifier.height(8.dp)) Text("Digital paper and ink.", style = MaterialTheme.typography.bodyMedium) Spacer(Modifier.height(16.dp)) TextButton( onClick = {}, modifier = Modifier.align(Alignment.End), ) { Text("ACTION") } } } } } } }
MaterialTheme, Card, Scaffold, TopAppBar, and FloatingActionButton as-is.lightColorScheme() or darkColorScheme().MaterialTheme.typography for the complete type scale.animateFloatAsState with Material easing: FastOutSlowInEasing (equivalent to cubic-bezier(0.4, 0.0, 0.2, 1)).cubic-bezier(0.4, 0.0, 0.2, 1)).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→pass | 23,141 | 19,296 | -17% | 1 | 1 | 0% | 3,734 | 5,780 | +55% | 0 | 0 | — |
case-08 | fail→fail | 17,812 | 22,495 | +26% | 1 | 1 | 0% | 3,587 | 7,160 | +100% | 0 | 0 | — |
case-01 | fail→pass | 38,087 | 34,387 | -10% | 1 | 1 | 0% | 5,729 | 7,272 | +27% | 0 | 0 | — |
case-13 | pass→pass | 17,466 | 15,276 | -13% | 1 | 1 | 0% | 2,787 | 5,155 | +85% | 0 | 0 | — |
case-03 | fail→pass | 19,175 | 15,323 | -20% | 1 | 1 | 0% | 3,137 | 4,995 | +59% | 0 | 0 | — |
case-04 | pass→pass | 11,961 | 15,008 | +25% | 1 | 1 | 0% | 2,286 | 4,843 | +112% | 0 | 0 | — |
case-05 | pass→pass | 22,807 | 17,533 | -23% | 1 | 1 | 0% | 3,606 | 5,082 | +41% | 0 | 0 | — |
case-06 | fail→pass | 20,017 | 14,229 | -29% | 1 | 1 | 0% | 3,177 | 5,760 | +81% | 0 | 0 | — |
case-07 | fail→pass | 15,521 | 13,267 | -15% | 1 | 1 | 0% | 2,266 | 4,647 | +105% | 0 | 0 | — |
case-09 | pass→pass | 9,047 | 7,338 | -19% | 1 | 1 | 0% | 1,623 | 3,964 | +144% | 0 | 0 | — |
case-10 | fail→fail | 11,027 | 9,574 | -13% | 1 | 1 | 0% | 1,961 | 4,262 | +117% | 0 | 0 | — |
case-11 | pass→pass | 16,146 | 10,923 | -32% | 1 | 1 | 0% | 2,673 | 4,403 | +65% | 0 | 0 | — |
case-12 | pass→pass | 17,516 | 13,427 | -23% | 1 | 1 | 0% | 2,424 | 4,512 | +86% | 0 | 0 | — |
case-14 | pass→pass | 18,899 | 2,290 | -88% | 1 | 1 | 0% | 2,398 | 2,944 | +23% | 0 | 0 | — |
case-15 | pass→pass | 12,883 | 7,219 | -44% | 1 | 1 | 0% | 1,929 | 3,917 | +103% | 0 | 0 | — |
case-16 | pass→pass | 15,260 | 11,206 | -27% | 1 | 1 | 0% | 2,051 | 4,441 | +117% | 0 | 0 | — |
case-17 | pass→pass | 11,739 | 10,754 | -8% | 1 | 1 | 0% | 2,116 | 4,209 | +99% | 0 | 0 | — |
case-18 | fail→fail | 20,236 | 15,675 | -23% | 1 | 1 | 0% | 3,172 | 5,922 | +87% | 0 | 0 | — |
case-19 | pass→pass | 13,289 | 15,846 | +19% | 1 | 1 | 0% | 2,412 | 5,830 | +142% | 0 | 0 | — |
case-20 | pass→pass | 8,916 | 4,496 | -50% | 1 | 1 | 0% | 1,210 | 3,288 | +172% | 0 | 0 | — |
case-21 | pass→pass | 11,904 | 16,387 | +38% | 1 | 1 | 0% | 2,522 | 5,315 | +111% | 0 | 0 | — |
case-22 | fail→fail | 18,894 | 19,218 | +2% | 1 | 1 | 0% | 3,488 | 5,835 | +67% | 0 | 0 | — |
case-23 | pass→fail | 15,274 | 17,497 | +15% | 1 | 1 | 0% | 2,501 | 5,527 | +121% | 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 +17 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.