// 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. // @dart = 2.8 import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart' show Brightness; import 'package:flutter/widgets.dart'; import 'colors.dart'; // Please update _TextThemeDefaultsBuilder accordingly after changing the default // color here, as their implementation depends on the default value of the color // field. // // Values derived from https://developer.apple.com/design/resources/. const TextStyle _kDefaultTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Text', fontSize: 17.0, letterSpacing: -0.41, color: CupertinoColors.label, decoration: TextDecoration.none, ); // Please update _TextThemeDefaultsBuilder accordingly after changing the default // color here, as their implementation depends on the default value of the color // field. // // Values derived from https://developer.apple.com/design/resources/. const TextStyle _kDefaultActionTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Text', fontSize: 17.0, letterSpacing: -0.41, color: CupertinoColors.activeBlue, decoration: TextDecoration.none, ); // Please update _TextThemeDefaultsBuilder accordingly after changing the default // color here, as their implementation depends on the default value of the color // field. // // Values derived from https://developer.apple.com/design/resources/. const TextStyle _kDefaultTabLabelTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Text', fontSize: 10.0, letterSpacing: -0.24, color: CupertinoColors.inactiveGray, ); const TextStyle _kDefaultMiddleTitleTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Text', fontSize: 17.0, fontWeight: FontWeight.w600, letterSpacing: -0.41, color: CupertinoColors.label, ); const TextStyle _kDefaultLargeTitleTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Display', fontSize: 34.0, fontWeight: FontWeight.w700, letterSpacing: 0.41, color: CupertinoColors.label, ); // Please update _TextThemeDefaultsBuilder accordingly after changing the default // color here, as their implementation depends on the default value of the color // field. // // Inspected on iOS 13 simulator with "Debug View Hierarchy". // Value extracted from off-center labels. Centered labels have a font size of 25pt. const TextStyle _kDefaultPickerTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Display', fontSize: 21.0, fontWeight: FontWeight.w400, letterSpacing: -0.41, color: CupertinoColors.label, ); // Please update _TextThemeDefaultsBuilder accordingly after changing the default // color here, as their implementation depends on the default value of the color // field. // // Inspected on iOS 13 simulator with "Debug View Hierarchy". // Value extracted from off-center labels. Centered labels have a font size of 25pt. const TextStyle _kDefaultDateTimePickerTextStyle = TextStyle( inherit: false, fontFamily: '.SF Pro Display', fontSize: 21, fontWeight: FontWeight.normal, color: CupertinoColors.label, ); TextStyle _resolveTextStyle(TextStyle style, BuildContext context, bool nullOk) { // This does not resolve the shadow color, foreground, background, etc. return style?.copyWith( color: CupertinoDynamicColor.resolve(style?.color, context, nullOk: nullOk), backgroundColor: CupertinoDynamicColor.resolve(style?.backgroundColor, context, nullOk: nullOk), decorationColor: CupertinoDynamicColor.resolve(style?.decorationColor, context, nullOk: nullOk), ); } /// Cupertino typography theme in a [CupertinoThemeData]. @immutable class CupertinoTextThemeData with Diagnosticable { /// Create a [CupertinoTextThemeData]. /// /// The [primaryColor] is used to derive TextStyle defaults of other attributes /// such as [navActionTextStyle] and [actionTextStyle], it must not be null when /// either [navActionTextStyle] or [actionTextStyle] is null. Defaults to /// [CupertinoColors.systemBlue]. /// /// Other [TextStyle] parameters default to default iOS text styles when /// unspecified. const CupertinoTextThemeData({ Color primaryColor = CupertinoColors.systemBlue, // ignore: avoid_unused_constructor_parameters, the parameter is deprecated. @Deprecated( 'This argument no longer does anything. You can remove it. ' 'This feature was deprecated after v1.10.14.' ) Brightness brightness, TextStyle textStyle, TextStyle actionTextStyle, TextStyle tabLabelTextStyle, TextStyle navTitleTextStyle, TextStyle navLargeTitleTextStyle, TextStyle navActionTextStyle, TextStyle pickerTextStyle, TextStyle dateTimePickerTextStyle, }) : this._raw( const _TextThemeDefaultsBuilder(CupertinoColors.label, CupertinoColors.inactiveGray), primaryColor, textStyle, actionTextStyle, tabLabelTextStyle, navTitleTextStyle, navLargeTitleTextStyle, navActionTextStyle, pickerTextStyle, dateTimePickerTextStyle, ); const CupertinoTextThemeData._raw( this._defaults, this._primaryColor, this._textStyle, this._actionTextStyle, this._tabLabelTextStyle, this._navTitleTextStyle, this._navLargeTitleTextStyle, this._navActionTextStyle, this._pickerTextStyle, this._dateTimePickerTextStyle, ) : assert((_navActionTextStyle != null && _actionTextStyle != null) || _primaryColor != null); final _TextThemeDefaultsBuilder _defaults; final Color _primaryColor; final TextStyle _textStyle; /// The [TextStyle] of general text content for Cupertino widgets. TextStyle get textStyle => _textStyle ?? _defaults.textStyle; final TextStyle _actionTextStyle; /// The [TextStyle] of interactive text content such as text in a button without background. TextStyle get actionTextStyle { return _actionTextStyle ?? _defaults.actionTextStyle(primaryColor: _primaryColor); } final TextStyle _tabLabelTextStyle; /// The [TextStyle] of unselected tabs. TextStyle get tabLabelTextStyle => _tabLabelTextStyle ?? _defaults.tabLabelTextStyle; final TextStyle _navTitleTextStyle; /// The [TextStyle] of titles in standard navigation bars. TextStyle get navTitleTextStyle => _navTitleTextStyle ?? _defaults.navTitleTextStyle; final TextStyle _navLargeTitleTextStyle; /// The [TextStyle] of large titles in sliver navigation bars. TextStyle get navLargeTitleTextStyle => _navLargeTitleTextStyle ?? _defaults.navLargeTitleTextStyle; final TextStyle _navActionTextStyle; /// The [TextStyle] of interactive text content in navigation bars. TextStyle get navActionTextStyle { return _navActionTextStyle ?? _defaults.navActionTextStyle(primaryColor: _primaryColor); } final TextStyle _pickerTextStyle; /// The [TextStyle] of pickers. TextStyle get pickerTextStyle => _pickerTextStyle ?? _defaults.pickerTextStyle; final TextStyle _dateTimePickerTextStyle; /// The [TextStyle] of date time pickers. TextStyle get dateTimePickerTextStyle => _dateTimePickerTextStyle ?? _defaults.dateTimePickerTextStyle; /// Returns a copy of the current [CupertinoTextThemeData] with all the colors /// resolved against the given [BuildContext]. /// /// Throws an exception if any of the [InheritedWidget]s required to resolve /// this [CupertinoTextThemeData] is not found in [context], unless [nullOk] is /// set to true, in which case [CupertinoDynamicColor]s that fail to resolve will /// be used as-is. CupertinoTextThemeData resolveFrom(BuildContext context, { bool nullOk = false }) { return CupertinoTextThemeData._raw( _defaults?.resolveFrom(context, nullOk), CupertinoDynamicColor.resolve(_primaryColor, context, nullOk: nullOk), _resolveTextStyle(_textStyle, context, nullOk), _resolveTextStyle(_actionTextStyle, context, nullOk), _resolveTextStyle(_tabLabelTextStyle, context, nullOk), _resolveTextStyle(_navTitleTextStyle, context, nullOk), _resolveTextStyle(_navLargeTitleTextStyle, context, nullOk), _resolveTextStyle(_navActionTextStyle, context, nullOk), _resolveTextStyle(_pickerTextStyle, context, nullOk), _resolveTextStyle(_dateTimePickerTextStyle, context, nullOk), ); } /// Returns a copy of the current [CupertinoTextThemeData] instance with /// specified overrides. CupertinoTextThemeData copyWith({ Color primaryColor, @Deprecated( 'This argument no longer does anything. You can remove it. ' 'This feature was deprecated after v1.10.14.' ) Brightness brightness, TextStyle textStyle, TextStyle actionTextStyle, TextStyle tabLabelTextStyle, TextStyle navTitleTextStyle, TextStyle navLargeTitleTextStyle, TextStyle navActionTextStyle, TextStyle pickerTextStyle, TextStyle dateTimePickerTextStyle, }) { return CupertinoTextThemeData._raw( _defaults, primaryColor ?? _primaryColor, textStyle ?? _textStyle, actionTextStyle ?? _actionTextStyle, tabLabelTextStyle ?? _tabLabelTextStyle, navTitleTextStyle ?? _navTitleTextStyle, navLargeTitleTextStyle ?? _navLargeTitleTextStyle, navActionTextStyle ?? _navActionTextStyle, pickerTextStyle ?? _pickerTextStyle, dateTimePickerTextStyle ?? _dateTimePickerTextStyle, ); } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); const CupertinoTextThemeData defaultData = CupertinoTextThemeData(); properties.add(DiagnosticsProperty<TextStyle>('textStyle', textStyle, defaultValue: defaultData.textStyle)); properties.add(DiagnosticsProperty<TextStyle>('actionTextStyle', actionTextStyle, defaultValue: defaultData.actionTextStyle)); properties.add(DiagnosticsProperty<TextStyle>('tabLabelTextStyle', tabLabelTextStyle, defaultValue: defaultData.tabLabelTextStyle)); properties.add(DiagnosticsProperty<TextStyle>('navTitleTextStyle', navTitleTextStyle, defaultValue: defaultData.navTitleTextStyle)); properties.add(DiagnosticsProperty<TextStyle>('navLargeTitleTextStyle', navLargeTitleTextStyle, defaultValue: defaultData.navLargeTitleTextStyle)); properties.add(DiagnosticsProperty<TextStyle>('navActionTextStyle', navActionTextStyle, defaultValue: defaultData.navActionTextStyle)); properties.add(DiagnosticsProperty<TextStyle>('pickerTextStyle', pickerTextStyle, defaultValue: defaultData.pickerTextStyle)); properties.add(DiagnosticsProperty<TextStyle>('dateTimePickerTextStyle', dateTimePickerTextStyle, defaultValue: defaultData.dateTimePickerTextStyle)); } } @immutable class _TextThemeDefaultsBuilder { const _TextThemeDefaultsBuilder( this.labelColor, this.inactiveGrayColor, ) : assert(labelColor != null), assert(inactiveGrayColor != null); final Color labelColor; final Color inactiveGrayColor; static TextStyle _applyLabelColor(TextStyle original, Color color) { return original?.color == color ? original : original?.copyWith(color: color); } TextStyle get textStyle => _applyLabelColor(_kDefaultTextStyle, labelColor); TextStyle get tabLabelTextStyle => _applyLabelColor(_kDefaultTabLabelTextStyle, inactiveGrayColor); TextStyle get navTitleTextStyle => _applyLabelColor(_kDefaultMiddleTitleTextStyle, labelColor); TextStyle get navLargeTitleTextStyle => _applyLabelColor(_kDefaultLargeTitleTextStyle, labelColor); TextStyle get pickerTextStyle => _applyLabelColor(_kDefaultPickerTextStyle, labelColor); TextStyle get dateTimePickerTextStyle => _applyLabelColor(_kDefaultDateTimePickerTextStyle, labelColor); TextStyle actionTextStyle({ Color primaryColor }) => _kDefaultActionTextStyle.copyWith(color: primaryColor); TextStyle navActionTextStyle({ Color primaryColor }) => actionTextStyle(primaryColor: primaryColor); _TextThemeDefaultsBuilder resolveFrom(BuildContext context, bool nullOk) { final Color resolvedLabelColor = CupertinoDynamicColor.resolve(labelColor, context, nullOk: nullOk); final Color resolvedInactiveGray = CupertinoDynamicColor.resolve(inactiveGrayColor, context, nullOk: nullOk); return resolvedLabelColor == labelColor && resolvedInactiveGray == CupertinoColors.inactiveGray ? this : _TextThemeDefaultsBuilder(resolvedLabelColor, resolvedInactiveGray); } }