forked from mirrors/material_3_expressive
3.4 KiB
3.4 KiB
Material 3 Expressive – Flutter Monorepo (Starter)
This is a starter monorepo for Material 3 Expressive (M3E) Flutter packages.
packages/m3e_design– design language core (tokens, ThemeExtension, motion)packages/m3e_collection– re-exports all component packagespackages/icon_button_m3e– example componentpackages/split_button_m3e– example split button componentpackages/app_bar_m3epackages/button_group_m3epackages/button_m3epackages/fab_m3epackages/loading_indicator_m3epackages/navigation_rail_m3epackages/navigation_bar_m3epackages/progress_indicator_m3epackages/slider_m3epackages/toolbar_m3eapps/gallery– showcase app that consumesm3e_collection
Quick start
dart pub global activate melos
melos bootstrap
# run the gallery
cd apps/gallery
flutter run
Structure
See melos.yaml, analysis_options.yaml, and the package-level READMEs.
Using the M3E Theme
The design tokens and helpers live in the m3e_design package. Import it once in files where you access the theme:
import 'package:m3e_design/m3e_design.dart';
- Install the theme once at the app level (one-liner):
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ColorScheme.fromSeed(seedColor: Colors.teal).toM3EThemeData(),
home: const MyHomePage(),
);
}
}
- With dynamic color (Android 12+), setting both light and dark themes:
Widget buildDynamicApp() {
return DynamicColorBuilder(
builder: (lightDynamic, darkDynamic) {
final light = lightDynamic ?? ColorScheme.fromSeed(seedColor: Colors.teal);
final dark = darkDynamic ??
ColorScheme.fromSeed(seedColor: Colors.teal, brightness: Brightness.dark);
return MaterialApp(
theme: light.toM3EThemeData(),
darkTheme: dark.toM3EThemeData(),
home: const MyHomePage(),
);
},
);
}
- Access M3E tokens anywhere using the new ThemeData accessor:
final m3e = Theme.of(context).m3e; // ThemeData extension
// Examples
final br = m3e.shapes.round.sm; // BorderRadius
final pad = EdgeInsets.all(m3e.spacing.md); // Spacing scale
final bg = m3e.colors.surfaceContainerHigh; // Colors mapped to ColorScheme
final curve = m3e.motion.emphasized; // Motion/curves
final title = m3e.typography.base.titleLarge; // Typography
- Apply a rounded shape to a widget:
Widget roundedExample(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: Theme.of(context).m3e.shapes.round.sm,
),
);
}
- Optional context sugar if you prefer:
// Provided by BuildContext extension in m3e_design
final m3e = context.m3e;
Notes:
- In debug, accessing
Theme.of(context).m3easserts if the extension isn't installed, helping catch setup issues. - In release, it safely falls back to sensible defaults derived from the active
ColorScheme.
Live demo (Gallery)
A web demo of the M3E components is published via GitHub Pages using the provided workflow in .github/workflows/deploy-gallery-pages.yml.
Open: https://emilymoonstone.github.io/material_3_expressive/
To run locally:
cd apps/gallery
flutter run -d chrome
Last updated: 2025-10-25