Skip to content

Instantly share code, notes, and snippets.

@fredgrott
Last active January 23, 2026 16:48
Show Gist options
  • Select an option

  • Save fredgrott/6eaddfab306af547d69272d89be9befe to your computer and use it in GitHub Desktop.

Select an option

Save fredgrott/6eaddfab306af547d69272d89be9befe to your computer and use it in GitHub Desktop.
M3ECustomExpressive
/// Expressive emphasis tweaks layered on top of baseline M3 type.
/// Keep line-height the same; only tune weight/letter-spacing for emphasis.
/// For most purposes, the M3ECustomEmphasized() construct is used.
@immutable
class M3ECustomEmphasized {
final TextStyle expressiveDisplayLarge;
final TextStyle expressiveDisplayMedium;
final TextStyle expressiveDisplaySmall;
final TextStyle expressiveHeadlineLarge;
final TextStyle expressiveHeadlineMedium;
final TextStyle expressiveHeadlineSmall;
final TextStyle expressiveTitleLarge;
final TextStyle expressiveTitleMedium;
final TextStyle expressiveTitleSmall;
final TextStyle expressiveBodyLarge;
final TextStyle expressiveBodyMedium;
final TextStyle expressiveBodySmall;
final TextStyle expressiveLabelLarge;
final TextStyle expressiveLabelMedium;
final TextStyle expressiveLabelSmall;
const M3ECustomEmphasized({
required this.expressiveDisplayLarge,
required this.expressiveDisplayMedium,
required this.expressiveDisplaySmall,
required this.expressiveHeadlineLarge,
required this.expressiveHeadlineMedium,
required this.expressiveHeadlineSmall,
required this.expressiveTitleLarge,
required this.expressiveTitleMedium,
required this.expressiveTitleSmall,
required this.expressiveBodyLarge,
required this.expressiveBodyMedium,
required this.expressiveBodySmall,
required this.expressiveLabelLarge,
required this.expressiveLabelMedium,
required this.expressiveLabelSmall,
});
/// M3E guidance: slightly heavier weights and tighter tracking for large roles.
/// Since I use varaible fonts it has to have those parameters.
M3ECustomEmphasized forBrightness(Brightness b) {
// You could vary by brightness if desired; values below are neutral.
return M3ECustomEmphasized(
expressiveDisplayLarge: TextStyle(
fontWeight: kFontWeights().expressiveDisplayLarge,
letterSpacing: kFontTracking().expressiveDisplayLarge, // subtle tightening on big sizes
),
expressiveDisplayMedium: TextStyle(
fontWeight: kFontWeights().expressiveDisplayMedium,
letterSpacing: kFontTracking().expressiveDisplayMedium, // subtle tightening on big sizes
),
expressiveDisplaySmall: TextStyle(
fontWeight: kFontWeights().expressiveDisplaySmall,
letterSpacing: kFontTracking().expressiveDisplaySmall, // subtle tightening on big sizes
),
expressiveHeadlineLarge: TextStyle(fontWeight: kFontWeights().expressiveHeadlineLarge, letterSpacing: kFontTracking().expressiveHeadlineLarge),
expressiveHeadlineMedium: TextStyle(fontWeight: kFontWeights().expressiveHeadlineMedium, letterSpacing: kFontTracking().expressiveHeadlineMedium),
expressiveHeadlineSmall: TextStyle(fontWeight: kFontWeights().expressiveHeadlineSmall, letterSpacing: kFontTracking().expressiveHeadlineSmall),
expressiveTitleLarge: TextStyle(fontWeight: kFontWeights().expressiveTitleLarge, letterSpacing: kFontTracking().expressiveTitleLarge),
expressiveTitleMedium: TextStyle(fontWeight: kFontWeights().expressiveTitleMedium, letterSpacing: kFontTracking().expressiveTitleMedium),
expressiveTitleSmall: TextStyle(fontWeight: kFontWeights().expressiveTitleSmall, letterSpacing: kFontTracking().expressiveTitleSmall),
expressiveBodyLarge: TextStyle(fontWeight: kFontWeights().expressiveBodyLarge, letterSpacing: kFontTracking().expressiveBodyLarge),
expressiveBodyMedium: TextStyle(fontWeight: kFontWeights().expressiveBodyMedium, letterSpacing: kFontTracking().expressiveBodyMedium),
expressiveBodySmall: TextStyle(fontWeight: kFontWeights().expressiveBodySmall, letterSpacing: kFontTracking().expressiveBodySmall),
expressiveLabelLarge: TextStyle(fontWeight: kFontWeights().expressiveLabelLarge, letterSpacing: kFontTracking().expressiveLabelLarge),
expressiveLabelMedium: TextStyle(fontWeight: kFontWeights().expressiveLabelMedium, letterSpacing: kFontTracking().expressiveLabelMedium),
expressiveLabelSmall: TextStyle(fontWeight: kFontWeights().expressiveLabelSmall, letterSpacing: kFontTracking().expressiveLabelSmall),
);
}
static M3ECustomEmphasized lerp(M3ECustomEmphasized a, M3ECustomEmphasized b, double t) => M3ECustomEmphasized(
expressiveDisplayLarge: TextStyle.lerp(a.expressiveDisplayLarge, b.expressiveDisplayLarge, t)!,
expressiveDisplayMedium: TextStyle.lerp(a.expressiveDisplayMedium, b.expressiveDisplayMedium, t)!,
expressiveDisplaySmall: TextStyle.lerp(a.expressiveDisplaySmall, b.expressiveDisplaySmall, t)!,
expressiveHeadlineLarge: TextStyle.lerp(a.expressiveHeadlineLarge, b.expressiveHeadlineLarge, t)!,
expressiveHeadlineMedium: TextStyle.lerp(a.expressiveHeadlineMedium, b.expressiveHeadlineMedium, t)!,
expressiveHeadlineSmall: TextStyle.lerp(a.expressiveHeadlineSmall, b.expressiveHeadlineSmall, t)!,
expressiveTitleLarge: TextStyle.lerp(a.expressiveTitleLarge, b.expressiveTitleLarge, t)!,
expressiveTitleMedium: TextStyle.lerp(a.expressiveTitleMedium, b.expressiveTitleMedium, t)!,
expressiveTitleSmall: TextStyle.lerp(a.expressiveTitleSmall, b.expressiveTitleSmall, t)!,
expressiveBodyLarge: TextStyle.lerp(a.expressiveBodyLarge, b.expressiveBodyLarge, t)!,
expressiveBodyMedium: TextStyle.lerp(a.expressiveBodyMedium, b.expressiveBodyMedium, t)!,
expressiveBodySmall: TextStyle.lerp(a.expressiveBodySmall, b.expressiveBodySmall, t)!,
expressiveLabelLarge: TextStyle.lerp(a.expressiveLabelLarge, b.expressiveLabelLarge, t)!,
expressiveLabelMedium: TextStyle.lerp(a.expressiveLabelMedium, b.expressiveLabelMedium, t)!,
expressiveLabelSmall: TextStyle.lerp(a.expressiveLabelSmall, b.expressiveLabelSmall, t)!,
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment