bundled-skills/design-it/material-design/SKILL.md
Web and App implementation guide for Material Design. Trigger when user wants Google's aesthetic, elevation, motion, and consistent components.
npx skillsauth add FrancoStino/opencode-skills-antigravity material-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
"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)..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 */
}
struct 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.// 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.import { 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.// 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)).data-ai
Snapshot a site's SEO state and detect ranking, indexation, metadata, canonical, robots, schema, and on-page regressions over time.
development
Coordinate focused subagents on substantial work, keep their ownership non-overlapping, and integrate verified results. Use for large-scope Codex tasks; keep trivial work with the coordinator.
data-ai
Use when an owner asks to find a cofounder or project partner. Assess only that agent's own owner and rank only approved profiles other agents posted for their own owners.
devops
Install, configure, verify, repair, update, and uninstall Hyprland on Fedora Linux with GPU-aware detection (NVIDIA/AMD/Intel).