From 0b80a9b86b42e5bd5975ab0c16e540e963e496fd Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62367544+tilucasoli@users.noreply.github.com> Date: Mon, 8 Jul 2024 20:37:32 -0300 Subject: [PATCH 1/5] add attribute to fontVariantion --- .../attributes/text_style/text_style_dto.dart | 6 +++ .../text_style/text_style_dto.g.dart | 4 ++ .../text_style/text_style_util.dart | 8 ++++ packages/mix/lib/src/core/helpers.dart | 11 ++++- packages/mix/test/helpers/testing_utils.dart | 4 +- .../text_style/text_style_dto_test.dart | 26 ++++++++--- .../text_style/text_style_util_test.dart | 19 ++++++-- .../theme/tokens/text_style_token_test.dart | 45 +++++++++++++++++-- 8 files changed, 107 insertions(+), 16 deletions(-) diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart index 138f83bac..31033a64e 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart @@ -21,6 +21,7 @@ final class TextStyleDataRef extends TextStyleData { @override TextStyle resolve(MixData mix) => mix.tokens.textStyleRef(ref); + @override get props => [ref]; } @@ -38,6 +39,7 @@ base class TextStyleData extends Dto with _$TextStyleData { final ColorDto? backgroundColor; final List? shadows; final List? fontFeatures; + final List? fontVariations; final TextDecoration? decoration; final ColorDto? decorationColor; final TextDecorationStyle? decorationStyle; @@ -60,6 +62,7 @@ base class TextStyleData extends Dto with _$TextStyleData { this.decorationThickness, this.fontFamily, this.fontFamilyFallback, + this.fontVariations, this.fontFeatures, this.fontSize, this.fontStyle, @@ -101,6 +104,7 @@ final class TextStyleDto extends Dto with _$TextStyleDto { TextDecoration? decoration, ColorDto? decorationColor, TextDecorationStyle? decorationStyle, + List? fontVariations, Locale? locale, double? height, Paint? foreground, @@ -121,6 +125,7 @@ final class TextStyleDto extends Dto with _$TextStyleDto { decorationThickness: decorationThickness, fontFamily: fontFamily, fontFamilyFallback: fontFamilyFallback, + fontVariations: fontVariations, fontFeatures: fontFeatures, fontSize: fontSize, fontStyle: fontStyle, @@ -176,6 +181,7 @@ extension TextStyleExt on TextStyle { decorationThickness: decorationThickness, fontFamily: fontFamily, fontFamilyFallback: fontFamilyFallback, + fontVariations: fontVariations, fontFeatures: fontFeatures, fontSize: fontSize, fontStyle: fontStyle, diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.g.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.g.dart index 7fe57bf0d..c58404501 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.g.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.g.dart @@ -32,6 +32,7 @@ base mixin _$TextStyleData on Dto { fontFamily: _$this.fontFamily ?? defaultValue.fontFamily, fontFamilyFallback: _$this.fontFamilyFallback ?? defaultValue.fontFamilyFallback, + fontVariations: _$this.fontVariations ?? defaultValue.fontVariations, fontFeatures: _$this.fontFeatures ?? defaultValue.fontFeatures, fontSize: _$this.fontSize ?? defaultValue.fontSize, fontStyle: _$this.fontStyle ?? defaultValue.fontStyle, @@ -74,6 +75,8 @@ base mixin _$TextStyleData on Dto { fontFamily: other.fontFamily ?? _$this.fontFamily, fontFamilyFallback: MixHelpers.mergeList( _$this.fontFamilyFallback, other.fontFamilyFallback), + fontVariations: + MixHelpers.mergeList(_$this.fontVariations, other.fontVariations), fontFeatures: MixHelpers.mergeList(_$this.fontFeatures, other.fontFeatures), fontSize: other.fontSize ?? _$this.fontSize, @@ -105,6 +108,7 @@ base mixin _$TextStyleData on Dto { _$this.decorationThickness, _$this.fontFamily, _$this.fontFamilyFallback, + _$this.fontVariations, _$this.fontFeatures, _$this.fontSize, _$this.fontStyle, diff --git a/packages/mix/lib/src/attributes/text_style/text_style_util.dart b/packages/mix/lib/src/attributes/text_style/text_style_util.dart index fb96d5283..da0f5dc76 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_util.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_util.dart @@ -44,6 +44,10 @@ final class TextStyleUtility T letterSpacing(double v) => only(letterSpacing: v); + T fontVariations(List v) => only(fontVariations: v); + + T fontVariation(FontVariation v) => only(fontVariations: [v]); + T shadows(List v) => only(shadows: v.map((e) => e.toDto()).toList()); T italic() => fontStyle.italic(); @@ -77,6 +81,7 @@ final class TextStyleUtility List? shadows, Color? color, Color? backgroundColor, + List? fontVariations, List? fontFeatures, TextDecoration? decoration, TextDecorationStyle? decorationStyle, @@ -101,6 +106,7 @@ final class TextStyleUtility decorationColor: decorationColor?.toDto(), decorationStyle: decorationStyle, textBaseline: textBaseline, + fontVariations: fontVariations, shadows: shadows?.map((e) => e.toDto()).toList(), fontFeatures: fontFeatures, foreground: foreground, @@ -127,6 +133,7 @@ final class TextStyleUtility ColorDto? decorationColor, TextDecorationStyle? decorationStyle, TextBaseline? textBaseline, + List? fontVariations, List? shadows, List? fontFeatures, Paint? foreground, @@ -153,6 +160,7 @@ final class TextStyleUtility decoration: decoration, decorationColor: decorationColor, decorationStyle: decorationStyle, + fontVariations: fontVariations, locale: locale, height: height, foreground: foreground, diff --git a/packages/mix/lib/src/core/helpers.dart b/packages/mix/lib/src/core/helpers.dart index e9cf51a41..99d80f3c1 100644 --- a/packages/mix/lib/src/core/helpers.dart +++ b/packages/mix/lib/src/core/helpers.dart @@ -1,6 +1,7 @@ import 'dart:math' as math; import 'dart:ui' as ui; +import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart' as r; import 'package:flutter/widgets.dart' as w; @@ -26,8 +27,14 @@ class MixHelpers { } w.TextStyle? _lerpTextStyle(w.TextStyle? a, w.TextStyle? b, double t) { - return w.TextStyle.lerp(a, b, t) - ?.copyWith(shadows: w.Shadow.lerpList(a?.shadows, b?.shadows, t)); + return w.TextStyle.lerp(a, b, t)?.copyWith( + shadows: w.Shadow.lerpList(a?.shadows, b?.shadows, t), + fontVariations: lerpFontVariations( + a?.fontVariations, + b?.fontVariations, + t, + ), + ); } List? _mergeDtoList(List? a, List? b) { diff --git a/packages/mix/test/helpers/testing_utils.dart b/packages/mix/test/helpers/testing_utils.dart index 9da6794b5..68d646161 100644 --- a/packages/mix/test/helpers/testing_utils.dart +++ b/packages/mix/test/helpers/testing_utils.dart @@ -84,14 +84,14 @@ Widget createDirectionality(TextDirection direction) { ); } -Widget createWithMixTheme(MixThemeData theme) { +Widget createWithMixTheme(MixThemeData theme, {Widget? child}) { return MixTheme( data: theme, child: MaterialApp( home: Scaffold( body: Builder( builder: (BuildContext context) { - return Container(); + return child ?? Container(); }, ), ), diff --git a/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart b/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart index 9bf80579e..cc07c83ea 100644 --- a/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart +++ b/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart @@ -7,7 +7,8 @@ import '../../../helpers/testing_utils.dart'; void main() { group('TextStyleDto', () { test('from constructor sets all values correctly', () { - final attr = TextStyleDto(color: Colors.red.toDto()); + final attr = + TextStyleDto(color: Colors.red.toDto(), fontVariations: const []); final result = attr.resolve(EmptyMixData); expect(result.color, Colors.red); }); @@ -19,6 +20,9 @@ void main() { fontStyle: FontStyle.italic, letterSpacing: 1.0, wordSpacing: 2.0, + fontVariations: const [ + FontVariation('wght', 900), + ], textBaseline: TextBaseline.ideographic, decoration: TextDecoration.underline, decorationColor: Colors.blue.toDto(), @@ -34,6 +38,9 @@ void main() { fontStyle: FontStyle.normal, letterSpacing: 2.0, wordSpacing: 3.0, + fontVariations: const [ + FontVariation('wght', 400), + ], textBaseline: TextBaseline.alphabetic, decoration: TextDecoration.lineThrough, decorationColor: Colors.red.toDto(), @@ -51,6 +58,7 @@ void main() { expect(merged.decorationStyle, TextDecorationStyle.dotted); expect(merged.fontWeight, FontWeight.w100); expect(merged.fontStyle, FontStyle.normal); + expect(merged.fontVariations, [const FontVariation('wght', 400)]); expect(merged.letterSpacing, 2.0); expect(merged.wordSpacing, 3.0); expect(merged.height, 3.0); @@ -65,6 +73,9 @@ void main() { fontStyle: FontStyle.italic, letterSpacing: 1.0, wordSpacing: 2.0, + fontVariations: const [ + FontVariation('wght', 900), + ], textBaseline: TextBaseline.ideographic, decoration: TextDecoration.underline, decorationColor: Colors.blue.toDto(), @@ -80,6 +91,7 @@ void main() { expect(textStyle.decorationStyle, TextDecorationStyle.dashed); expect(textStyle.fontWeight, FontWeight.bold); expect(textStyle.fontStyle, FontStyle.italic); + expect(textStyle.fontVariations, [const FontVariation('wght', 900)]); expect(textStyle.letterSpacing, 1.0); expect(textStyle.wordSpacing, 2.0); expect(textStyle.height, 2.0); @@ -89,13 +101,17 @@ void main() { return const Placeholder(); }); test('Equality holds when all attributes are the same', () { - final attr1 = TextStyleDto(color: Colors.red.toDto()); - final attr2 = TextStyleDto(color: Colors.red.toDto()); + final attr1 = + TextStyleDto(color: Colors.red.toDto(), fontVariations: const []); + final attr2 = + TextStyleDto(color: Colors.red.toDto(), fontVariations: const []); expect(attr1, attr2); }); test('Equality fails when attributes are different', () { - final attr1 = TextStyleDto(color: Colors.red.toDto()); - final attr2 = TextStyleDto(color: Colors.blue.toDto()); + final attr1 = + TextStyleDto(color: Colors.red.toDto(), fontVariations: const []); + final attr2 = + TextStyleDto(color: Colors.blue.toDto(), fontVariations: const []); expect(attr1, isNot(attr2)); }); }); diff --git a/packages/mix/test/src/attributes/text_style/text_style_util_test.dart b/packages/mix/test/src/attributes/text_style/text_style_util_test.dart index 37a46646f..89fa81208 100644 --- a/packages/mix/test/src/attributes/text_style/text_style_util_test.dart +++ b/packages/mix/test/src/attributes/text_style/text_style_util_test.dart @@ -1,6 +1,3 @@ -// Import necessary packages - - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; @@ -37,6 +34,9 @@ void main() { ], textBaseline: TextBaseline.ideographic, wordSpacing: 2.0, + fontVariations: const [ + FontVariation('wght', 900), + ], ); final attrWithPaint = textStyle( @@ -67,6 +67,7 @@ void main() { expect(resolvedValue.decoration, TextDecoration.underline); expect(resolvedValue.decorationColor, Colors.green); expect(resolvedValue.decorationStyle, TextDecorationStyle.dashed); + expect(resolvedValue.fontVariations, [const FontVariation('wght', 900)]); expect(resolvedValue.debugLabel, 'debugLabel'); expect(resolvedValue.locale, const Locale('en', 'US')); @@ -213,5 +214,17 @@ void main() { expect(resolvedValue.background, purplePaint); }); + + test('fontVariations() creates TextStyleDto correctly', () { + final attribute = textStyle( + fontVariations: const [ + FontVariation('wght', 900), + ], + ); + + final resolvedValue = attribute.value.resolve(EmptyMixData); + + expect(resolvedValue.fontVariations, [const FontVariation('wght', 900)]); + }); }); } diff --git a/packages/mix/test/src/theme/tokens/text_style_token_test.dart b/packages/mix/test/src/theme/tokens/text_style_token_test.dart index 36e83dbb4..ff1d3556f 100644 --- a/packages/mix/test/src/theme/tokens/text_style_token_test.dart +++ b/packages/mix/test/src/theme/tokens/text_style_token_test.dart @@ -74,10 +74,14 @@ void main() { $token.space.medium: 50, }, textStyles: { - $material.textTheme.bodyText1: - const TextStyle(color: Colors.red, fontSize: 10), - $material.textTheme.bodyText2: - const TextStyle(color: Colors.blue, fontSize: 20), + $material.textTheme.bodyText1: const TextStyle( + color: Colors.red, + fontSize: 10, + fontVariations: [FontVariation('wght', 400)]), + $material.textTheme.bodyText2: const TextStyle( + color: Colors.blue, + fontSize: 20, + fontVariations: [FontVariation('wght', 700)]), }, radii: { $token.radius.medium: const Radius.elliptical(10, 50), @@ -123,6 +127,11 @@ void main() { themeData.textStyles[$material.textTheme.bodyText2]!.fontSize, ); + expect( + textWidget.style!.fontVariations, + themeData.textStyles[$material.textTheme.bodyText2]!.fontVariations, + ); + expect( (containerWidget.decoration as BoxDecoration).color, themeData.colors[$material.colorScheme.error], @@ -355,4 +364,32 @@ void main() { ); }); }); + + testWidgets('Test fontVariations are applied', (tester) async { + const test = TextStyleToken('test'); + final theme = MixThemeData( + textStyles: { + test: const TextStyle( + color: Colors.red, + fontVariations: [FontVariation('wght', 900)], + ), + }, + ); + + await tester.pumpWidget(createWithMixTheme( + theme, + child: StyledText( + 'test', + style: Style($text.style.ref(test)), + ), + )); + + final widget = tester.widget(find.byType(Text)); + + expect(widget.style?.color, Colors.red); + expect( + widget.style?.fontVariations, + const [FontVariation('wght', 900)], + ); + }); } From d58be9507cbd68c83bea2ddcf65b83ceb349be9f Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62367544+tilucasoli@users.noreply.github.com> Date: Mon, 8 Jul 2024 20:46:29 -0300 Subject: [PATCH 2/5] add import dart:ui --- .../mix/test/src/attributes/text_style/text_style_dto_test.dart | 2 ++ packages/mix/test/src/theme/tokens/text_style_token_test.dart | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart b/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart index cc07c83ea..e7fa9786f 100644 --- a/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart +++ b/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; diff --git a/packages/mix/test/src/theme/tokens/text_style_token_test.dart b/packages/mix/test/src/theme/tokens/text_style_token_test.dart index ff1d3556f..091061fac 100644 --- a/packages/mix/test/src/theme/tokens/text_style_token_test.dart +++ b/packages/mix/test/src/theme/tokens/text_style_token_test.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; From caa3c6883f3118d97f4a70ce7f5871d5b49aebf5 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62367544+tilucasoli@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:31:50 -0300 Subject: [PATCH 3/5] Removing unnecessary imports --- packages/mix/lib/src/attributes/text_style/text_style_dto.dart | 1 - packages/mix/lib/src/attributes/text_style/text_style_util.dart | 1 - packages/mix/lib/src/theme/tokens/text_style_token.dart | 1 - .../mix/test/src/attributes/text_style/text_style_dto_test.dart | 2 -- 4 files changed, 5 deletions(-) diff --git a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart index 31033a64e..f2d83d8e9 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_dto.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_dto.dart @@ -1,6 +1,5 @@ // ignore_for_file: prefer_relative_imports,avoid-importing-entrypoint-exports - import 'package:flutter/widgets.dart'; import 'package:mix/mix.dart'; import 'package:mix_annotations/mix_annotations.dart'; diff --git a/packages/mix/lib/src/attributes/text_style/text_style_util.dart b/packages/mix/lib/src/attributes/text_style/text_style_util.dart index da0f5dc76..f642f80f3 100644 --- a/packages/mix/lib/src/attributes/text_style/text_style_util.dart +++ b/packages/mix/lib/src/attributes/text_style/text_style_util.dart @@ -1,4 +1,3 @@ - import 'package:flutter/widgets.dart'; import '../../core/attribute.dart'; diff --git a/packages/mix/lib/src/theme/tokens/text_style_token.dart b/packages/mix/lib/src/theme/tokens/text_style_token.dart index 4e5b247da..a22ee0dd3 100644 --- a/packages/mix/lib/src/theme/tokens/text_style_token.dart +++ b/packages/mix/lib/src/theme/tokens/text_style_token.dart @@ -1,4 +1,3 @@ - import 'package:flutter/widgets.dart'; import '../mix/mix_theme.dart'; diff --git a/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart b/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart index e7fa9786f..cc07c83ea 100644 --- a/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart +++ b/packages/mix/test/src/attributes/text_style/text_style_dto_test.dart @@ -1,5 +1,3 @@ -import 'dart:ui'; - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mix/mix.dart'; From 9e7bdb1ab25acee0fa4af1f3e0b3c97ae27085bb Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62367544+tilucasoli@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:39:39 -0300 Subject: [PATCH 4/5] Update add_label.yml --- .github/workflows/add_label.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/add_label.yml b/.github/workflows/add_label.yml index 9f54f0045..a1918f634 100644 --- a/.github/workflows/add_label.yml +++ b/.github/workflows/add_label.yml @@ -27,30 +27,44 @@ jobs: const rawFiles = execSync(`git diff --name-only HEAD HEAD~${commits}`).toString() const files = rawFiles.split('\n').filter(Boolean) + console.log('##### Modified Files #####') + console.log(files) + console.log('##########################') + // verify packages const packagesFiles = files.filter(file => file.startsWith('packages/') && !file.includes('mix_lint_test')) const packages = packagesFiles.map(file => file.split('/')[1]) const labels = Array.from(new Set(packages)) + console.log('##### PackagesLabels #####') + console.log(labels) + console.log('##########################') + // verify documentation const wasDocModified = files.filter(file => file.startsWith('website/')).length > 0 if (wasDocModified) { labels.push('documentation') + + console.log('documentation label was added') } // verify examples const wasExampleModified = files.filter(file => file.startsWith('examples/')).length > 0 if (wasExampleModified) { labels.push('examples') + console.log('examples label was added') } // verify repo const wasRepoModified = files.filter(file => !file.startsWith('website/') && !file.startsWith('packages/') && !file.startsWith('examples/')).length > 0 if (wasRepoModified) { labels.push('repo') + console.log('rep label was added') } + console.log('##### Added Labels #####') console.log(labels) + console.log('##########################') github.rest.issues.addLabels({ issue_number: context.issue.number, From d9e5d391bd18b108898a7fabf20ec74a96e479bc Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62367544+tilucasoli@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:46:32 -0300 Subject: [PATCH 5/5] Update text_spec.dart --- packages/mix/lib/src/specs/text/text_spec.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/mix/lib/src/specs/text/text_spec.dart b/packages/mix/lib/src/specs/text/text_spec.dart index e409d6387..d23695621 100644 --- a/packages/mix/lib/src/specs/text/text_spec.dart +++ b/packages/mix/lib/src/specs/text/text_spec.dart @@ -54,10 +54,7 @@ final class TextSpec extends Spec with _$TextSpec { this.softWrap, this.directive, super.animated, - }) : assert( - textScaler == null || textScaleFactor == null, - 'textScaleFactor is deprecated and cannot be specified when textScaler is specified.', - ); + }); Widget call(String text, {String? semanticLabel, Locale? locale}) { return isAnimated