Material Design 3
This skill guides implementation of Google's Material Design 3 (MD3) — a personal, adaptive, expressive design system. MD3 uses dynamic color, tonal surfaces, rounded shapes, and spring-based motion to create UIs that feel alive and personal.
Philosophy
MD3 is built on three principles:
- Personal: Dynamic color adapts UI to the user's wallpaper or content. Theming is individual, not one-size-fits-all.
- Adaptive: Layouts transform across 5 window size classes. Components resize, reposition, and change form factor responsively.
- Expressive: Shape morphing, spring physics, and emphasized typography create moments of delight without sacrificing usability.
Current Updates: Google I/O 2026
Material's Google I/O 2026 update reinforces a Compose-first Android path and expands expressive/adaptive guidance:
- Material Android is Compose-first: For new Android work, prefer Jetpack Compose Material3 for the latest components, expressive APIs, adaptive scaffolds, and Styles API integration. Android Views may remain necessary in existing apps, but they should not be treated as the default path for new Material 3 implementations.
- Expressive layout system: Use an expressive layout scaffold to adapt screens across mobile, desktop, foldables, watches, XR, and other spatial form factors. Start from adaptive scaffolds/window size classes instead of fixed phone-first layouts.
- 8dp spacing system: Apply spacing tokens for margins, padding, and gaps so layouts and components can adapt programmatically to device type and density.
- New/updated expressive components: Lists, menus, search, and search app bars have refreshed expressive guidance, with Jetpack Compose as the primary implementation target.
- Watches and XR: Watches emphasize physics-based motion, arc text, and edge-hugging containers. XR emphasizes spatial panels and depth-based elevation.
Key differences from MD2:
- Tonal surfaces replace elevation shadows as the primary depth cue
- Dynamic color generates full schemes from a single seed color
- Fully rounded corners by default (not slightly rounded)
- Spring-based motion physics replace fixed easing curves for components
- 3 levels of user-controlled contrast (standard/medium/high)
Relationship with frontend-design skill: When both skills are active, MD3 provides the design system (tokens, components, layout rules) and frontend-design provides creative direction within those constraints. MD3 rules take precedence for component structure and token usage. Note: Roboto/Roboto Flex IS the correct default typeface in MD3 — the frontend-design guidance to avoid Roboto does not apply when implementing MD3.
Decision Tree
What are you building?
What platform?
Design Token System
All MD3 tokens use the md.sys namespace. Jetpack Compose maps roles to MaterialTheme.colorScheme, MaterialTheme.typography, and MaterialTheme.shapes (same semantic roles as the spec). On the web, these map to CSS custom properties (--md-sys-*):
Color Tokens (--md-sys-color-*)
Full details: references/color-system.md
Typography Tokens (--md-sys-typescale-*)
Each style has tokens for: -font, -weight, -size, -line-height, -tracking
Plus 15 emphasized variants (higher weight) via --md-sys-typescale-emphasized-*
Full details: references/typography-and-shape.md
Shape Tokens (--md-sys-shape-corner-*)
Elevation Levels
Elevation in MD3 is communicated through tonal surface color, not shadows. Shadows are only used when needed for additional protection against busy backgrounds.
Motion
MD3 Expressive (May 2025) introduced spring-based motion physics for components. The legacy easing/duration system is still used for transitions (enter/exit/shared-axis):
CSS easing values:
- Emphasized:
cubic-bezier(0.2, 0, 0, 1) - Emphasized decelerate:
cubic-bezier(0.05, 0.7, 0.1, 1) - Emphasized accelerate:
cubic-bezier(0.3, 0, 0.8, 0.15) - Standard:
cubic-bezier(0.2, 0, 0, 1) - Standard decelerate:
cubic-bezier(0, 0, 0, 1) - Standard accelerate:
cubic-bezier(0.3, 0, 1, 1)
Component Quick Reference
Note: Components marked with — for web element don't have @material/web implementations yet. Use CSS custom properties with standard HTML for these. Compose mappings and examples live in references/component-catalog.md.
Full component details with code examples: references/component-catalog.md
Jetpack Compose (primary)
Use androidx.compose.material3 with MaterialTheme and Material 3 composables (Scaffold, Button, NavigationBar, top app bars, etc.).
- Theming:
MaterialTheme(colorScheme = …, typography = …, shapes = …). PreferdynamicLightColorScheme/dynamicDarkColorSchemeon Android 12+ (API 31+) when dynamic color is desired; otherwiselightColorScheme/darkColorSchemeor generated theme code from Material Theme Builder. - Adaptive UI: Window size classes, list-detail and supporting-pane layouts, foldables — see
references/layout-and-responsive.mdandreferences/navigation-patterns.md. - Edge-to-edge & insets: Lay out content with
WindowInsets/ scaffold padding so bars and IME behave correctly — seereferences/layout-and-responsive.md. - Experimental APIs: Some Material 3 APIs require
@OptIn(ExperimentalMaterial3Api::class)or expressive opt-ins; match your BOM and compiler.
Web (limited): @material/web
Important: Per Material Design 3 for Web, Material Web Components are in maintenance mode and M3 Expressive is not implemented on Web. Use @material/web for token-backed web UIs when appropriate, but do not treat it as equivalent to Compose for current Expressive features.
Setup
Import Components Individually
Always import only the components you use — importing the entire package bloats the bundle:
Basic Usage
Theming with CSS Custom Properties
Apply a custom theme by setting CSS custom properties on :root or any ancestor:
Component-Level Overrides
Override individual component tokens for specific customization:
Dark Theme
Apply dark theme by overriding color tokens on a class or media query:
Full theming guide: references/theming-and-dynamic-color.md
Common Patterns
App Shell
Standard MD3 app with responsive navigation + top app bar + content area:
Card Grid
Form Layout
More patterns: references/navigation-patterns.md, references/layout-and-responsive.md
Anti-Patterns
Never do these when implementing MD3:
- Mix MD2 and MD3 libraries: Don't use
@material/mdc-*(MD2) alongside@material/web(MD3). They have incompatible APIs and styling. - Hardcode colors: Always use
var(--md-sys-color-*)tokens, never raw hex/rgb values. Hardcoded colors break dynamic theming, dark mode, and contrast adjustment. - Ignore tonal pairing: Only combine colors in their intended pairs (e.g.,
primary+on-primary,surface-container+on-surface). Arbitrary pairings break contrast in dynamic color and high contrast modes. - Use
outlinefor dividers: Useoutline-variantfor dividers.outlineis for important boundaries like text field borders. - Import all of @material/web: Always import individual component modules. Barrel imports include every component and destroy bundle size.
- Use
border-radiusdirectly: Use shape tokens (var(--md-sys-shape-corner-medium)) so shapes stay consistent with theming. - Use shadows for elevation by default: MD3 communicates elevation through tonal surface color, not shadows. Only add shadows when elements need extra separation from busy backgrounds.
- Apply frontend-design "avoid Roboto" rule: On Android, Roboto is the default Material typeface; web often uses Roboto or Roboto Flex with MD3 tokens. Replace only when intentionally customizing the type scale.
- Assume SSR compatibility:
@material/webuses Web Components (custom elements) which require JavaScript to render. They won't produce meaningful HTML in SSR without additional hydration strategies. - Ignore foldables and large screens: MD3 is designed for all screen sizes. Don't ship phone-only layouts — use canonical layouts, multi-pane at 600dp+, and test on foldable/tablet emulators. Place no interactive content across the fold/hinge.
- Stretch content to fill wide screens: On Large (1200dp+) and Extra-large (1600dp+) windows, constrain content to a max width (840–1040dp). Endless-width text lines are unreadable.
Platform Notes
Flutter
Jetpack Compose
See Jetpack Compose (primary) above. Use LocalContext.current with dynamicLightColorScheme / dynamicDarkColorScheme only when Build.VERSION.SDK_INT >= Build.VERSION_CODES.S and dynamic color is enabled; otherwise supply static light/dark schemes.
Component Name Mapping
M3 Expressive (May 2025)
The Expressive update adds visual richness while maintaining usability. Availability differs by platform — do not assume one stack implements everything.
Web: Material Web is maintenance-only; M3 Expressive is not on Web. Use CSS easing/duration tokens as fallback for motion, not spring parity.
Legacy easing/duration remains valid for transitions (enter/exit/shared-axis) where the spec still references them; see the Motion table below.
MD3 Compliance Audit
When invoked with audit as the argument (e.g., /material-3 audit), or when asked to audit/review MD3 compliance, analyze the target app or page and produce a compliance report.
Audit Procedure
- Identify the target: The user provides a URL (use browser tools to inspect), file paths (read source), or a running app.
- Inspect the following categories and score each 0–10:
- Generate the report:
Audit Methods
For a live URL (browser or devtools):
- Inspect computed styles and CSS variables (
--md-sys-*) - Resize viewport or use responsive mode for breakpoints
- Capture screenshots at key widths if helpful
For source code (file paths provided):
- Compose/Kotlin:
.ktfiles —MaterialTheme, composables,Color(0x…)abuse, hard-codedDp, missingModifier.semanticswhere needed - Flutter:
.dart—ThemeData,ColorScheme - Web: HTML/JSX/Vue/Svelte; CSS/SCSS for tokens
- Check web imports for
@material/webvs@material/mdc-*(MD2)
Quick checks (adapt paths to your stack):
Browser automation (if your environment exposes MCP browser tools): navigate, snapshot DOM/CSS variables, resize for breakpoints — optional, not required.
Scoring Guide
- 9-10: Fully MD3 compliant, uses correct tokens and patterns
- 7-8: Mostly compliant, minor issues (e.g., a few hardcoded values)
- 4-6: Partially compliant, some MD3 patterns but significant gaps
- 1-3: Major violations, mostly non-MD3 or MD2 patterns
- 0: Not applicable or completely absent
Status thresholds: pass (7+), warn (4-6), fail (0-3)
Reference Documents
references/color-system.md— Color roles, tonal palettes, dynamic color, Compose + CSS mappingreferences/typography-and-shape.md— Type scale, shape corners, elevation, motion, Expressive notesreferences/component-catalog.md— Components: Compose +@material/webwhere applicablereferences/navigation-patterns.md— Navigation selection, Compose-first adaptive patternsreferences/layout-and-responsive.md— Breakpoints, canonical layouts, insets, foldablesreferences/theming-and-dynamic-color.md— Theming: Compose first, then Flutter and web

