forked from flutter/flutter
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for M3 motion (flutter#129942)
## Description This adds support for M3 easing and duration tokens. This PR includes these changes: * Generation of duration and easing constants, in `Durations` and `Easing`, respectively (`Curves` is already taken in the `animation` library) * Add 3 Dart fixes Once this is merged, I'll migrate packages/plugins/customers and then uncomment the deprecation notices for the 3 M2 curves, all of which have 1:1 replacements. ## Related Issues - Fixes flutter#116525 ## Tests - Added Dart fix tests ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview [Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene [test-exempt]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests [Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo [Features we expect every widget to implement]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/wiki/Chat
- Loading branch information
Showing
10 changed files
with
407 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
// Copyright 2014 The Flutter Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
import 'template.dart'; | ||
import 'token_logger.dart'; | ||
|
||
class MotionTemplate extends TokenTemplate { | ||
/// Since we generate the tokens dynamically, we need to store them and log | ||
/// them manually, instead of using [getToken]. | ||
MotionTemplate(String blockName, String fileName, this.tokens, this.tokensLogger) : super(blockName, fileName, tokens); | ||
Map<String, dynamic> tokens; | ||
TokenLogger tokensLogger; | ||
|
||
// List of duration tokens. | ||
late List<MapEntry<String, dynamic>> durationTokens = tokens.entries.where( | ||
(MapEntry<String, dynamic> entry) => entry.key.contains('.duration.') | ||
).toList() | ||
..sort( | ||
(MapEntry<String, dynamic> a, MapEntry<String, dynamic> b) => (a.value as double).compareTo(b.value as double) | ||
); | ||
|
||
// List of easing curve tokens. | ||
late List<MapEntry<String, dynamic>> easingCurveTokens = tokens.entries.where( | ||
(MapEntry<String, dynamic> entry) => entry.key.contains('.easing.') | ||
).toList() | ||
..sort( | ||
// Sort the legacy curves at the end of the list. | ||
(MapEntry<String, dynamic> a, MapEntry<String, dynamic> b) => a.key.contains('legacy') ? 1 : a.key.compareTo(b.key) | ||
); | ||
|
||
String durationTokenString(String token, dynamic tokenValue) { | ||
tokensLogger.log(token); | ||
final String tokenName = token.split('.').last.replaceAll('-', '').replaceFirst('Ms', ''); | ||
final int milliseconds = (tokenValue as double).toInt(); | ||
return | ||
''' | ||
/// The $tokenName duration (${milliseconds}ms) in the Material specification. | ||
/// | ||
/// See also: | ||
/// | ||
/// * [M3 guidelines: Duration tokens](https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#c009dec6-f29b-4503-b9f0-482af14a8bbd) | ||
/// * [M3 guidelines: Applying easing and duration](https://m3.material.io/styles/motion/easing-and-duration/applying-easing-and-duration) | ||
static const Duration $tokenName = Duration(milliseconds: $milliseconds); | ||
'''; | ||
} | ||
|
||
String easingCurveTokenString(String token, dynamic tokenValue) { | ||
tokensLogger.log(token); | ||
final String tokenName = token | ||
.replaceFirst('md.sys.motion.easing.', '') | ||
.replaceAllMapped(RegExp(r'[-\.](\w)'), (Match match) { | ||
return match.group(1)!.toUpperCase(); | ||
}); | ||
return ''' | ||
/// The $tokenName easing curve in the Material specification. | ||
/// | ||
/// See also: | ||
/// | ||
/// * [M3 guidelines: Easing tokens](https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#433b1153-2ea3-4fe2-9748-803a47bc97ee) | ||
/// * [M3 guidelines: Applying easing and duration](https://m3.material.io/styles/motion/easing-and-duration/applying-easing-and-duration) | ||
static const Curve $tokenName = $tokenValue; | ||
'''; | ||
} | ||
|
||
@override | ||
String generate() => ''' | ||
/// The set of durations in the Material specification. | ||
/// | ||
/// See also: | ||
/// | ||
/// * [M3 guidelines: Duration tokens](https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#c009dec6-f29b-4503-b9f0-482af14a8bbd) | ||
/// * [M3 guidelines: Applying easing and duration](https://m3.material.io/styles/motion/easing-and-duration/applying-easing-and-duration) | ||
abstract final class Durations { | ||
${durationTokens.map((MapEntry<String, dynamic> entry) => durationTokenString(entry.key, entry.value)).join('\n')}} | ||
// TODO(guidezpl): Improve with description and assets, b/289870605 | ||
/// The set of easing curves in the Material specification. | ||
/// | ||
/// See also: | ||
/// | ||
/// * [M3 guidelines: Easing tokens](https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#433b1153-2ea3-4fe2-9748-803a47bc97ee) | ||
/// * [M3 guidelines: Applying easing and duration](https://m3.material.io/styles/motion/easing-and-duration/applying-easing-and-duration) | ||
/// * [Curves], for a collection of non-Material animation easing curves. | ||
abstract final class Easing { | ||
${easingCurveTokens.map((MapEntry<String, dynamic> entry) => easingCurveTokenString(entry.key, entry.value)).join('\n')}} | ||
'''; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.