TF-3933 Avoid load font from google

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-08-01 18:10:56 +07:00
committed by Dat H. Pham
parent 1c04825367
commit 801b08bc90
31 changed files with 352 additions and 277 deletions
@@ -1,5 +1,27 @@
import 'package:core/utils/platform_info.dart';
class ConstantsUI {
static const String fontApp = 'Inter';
static final List<String>? fontFamilyFallback = PlatformInfo.isMobile
? null
: webFontFamilyFallback;
static const List<String> webFontFamilyFallback = [
'Roboto', // Default Flutter font Latin, Cyrillic, Diacritics
'NotoSans', // Latin, Cyrillic supports European languages
'NotoSansArabic', // Arabic script
'NotoSansTamil', // Tamil script
'NotoSansThai', // Thai script
'NotoSansKR', // Korean
'NotoSansSC', // Simplified Chinese (zh_Hans)
'NotoSansMath', // Math symbols (∑, ∫, √, etc.)
'NotoSansEgyptianHieroglyphs', // Egyptian Hieroglyphs (𓀀)
'NotoEmoji', // Monochrome emoji
'NotoSansSymbols', // Miscellaneous symbols and arrows
'NotoSansSymbols2', // Extended symbol support
'sans-serif', // Generic fallback for any platform
];
static const double htmlContentMaxHeight = 22000.0;
static const double composerHtmlContentMaxHeight = 20000.0;
static const double htmlContentMinWidth = 300;
+108 -148
View File
@@ -10,6 +10,7 @@ class ThemeUtils {
return ThemeData(
scaffoldBackgroundColor: Colors.white,
fontFamily: ConstantsUI.fontApp,
fontFamilyFallback: ConstantsUI.fontFamilyFallback,
appBarTheme: _appBarTheme,
textTheme: _textTheme,
hoverColor: Theme.of(context).colorScheme.outline.withValues(alpha: 0.08),
@@ -23,97 +24,80 @@ class ThemeUtils {
);
}
static TextTheme get _textTheme {
return const TextTheme(
bodyLarge: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w500,
letterSpacing: -0.15,
fontSize: 17,
height: 24 / 17,
),
bodyMedium: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w500,
letterSpacing: 0.25,
),
bodySmall: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w400,
letterSpacing: 0.0,
fontSize: 13,
height: 16 / 13
),
labelLarge: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w500,
letterSpacing: 0.1,
),
labelSmall: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w500,
letterSpacing: 0.5,
),
displayLarge: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w700,
),
displayMedium: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w600,
letterSpacing: 0.4,
),
displaySmall: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w600,
letterSpacing: 0.4,
),
headlineMedium: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w600,
),
headlineSmall: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w600,
fontSize: 24,
height: 32 / 24,
letterSpacing: 0.0,
),
headlineLarge: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w600,
fontSize: 32,
),
titleLarge: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w600,
letterSpacing: 0.0,
fontSize: 22,
height: 28 / 22,
),
titleMedium: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w500,
letterSpacing: 0.15,
fontSize: 16,
height: 24 / 16,
),
titleSmall: TextStyle(
fontFamily: ConstantsUI.fontApp,
fontWeight: FontWeight.w500,
letterSpacing: 0.1,
fontSize: 14,
height: 20 / 14,
),
);
}
static const TextTheme _textTheme = TextTheme(
bodyLarge: TextStyle(
fontWeight: FontWeight.w500,
letterSpacing: -0.15,
fontSize: 17,
height: 24 / 17,
),
bodyMedium: TextStyle(
fontWeight: FontWeight.w500,
letterSpacing: 0.25,
),
bodySmall: TextStyle(
fontWeight: FontWeight.w400,
letterSpacing: 0.0,
fontSize: 13,
height: 16 / 13
),
labelLarge: TextStyle(
fontWeight: FontWeight.w500,
letterSpacing: 0.1,
),
labelSmall: TextStyle(
fontWeight: FontWeight.w500,
letterSpacing: 0.5,
),
displayLarge: TextStyle(
fontWeight: FontWeight.w700,
),
displayMedium: TextStyle(
fontWeight: FontWeight.w600,
letterSpacing: 0.4,
),
displaySmall: TextStyle(
fontWeight: FontWeight.w600,
letterSpacing: 0.4,
),
headlineMedium: TextStyle(
fontWeight: FontWeight.w600,
),
headlineSmall: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 24,
height: 32 / 24,
letterSpacing: 0.0,
),
headlineLarge: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 32,
),
titleLarge: TextStyle(
fontWeight: FontWeight.w600,
letterSpacing: 0.0,
fontSize: 22,
height: 28 / 22,
),
titleMedium: TextStyle(
fontWeight: FontWeight.w500,
letterSpacing: 0.15,
fontSize: 16,
height: 24 / 16,
),
titleSmall: TextStyle(
fontWeight: FontWeight.w500,
letterSpacing: 0.1,
fontSize: 14,
height: 20 / 14,
),
);
static TextStyle textStyleBodyBody1({
Color? color,
FontWeight? fontWeight,
double? fontSize,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w500,
letterSpacing: 0.0,
fontSize: fontSize ?? 16,
@@ -125,8 +109,7 @@ class ThemeUtils {
Color? color,
Color? backgroundColor,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w400,
letterSpacing: 0.0,
fontSize: 15,
@@ -138,8 +121,7 @@ class ThemeUtils {
static TextStyle textStyleBodyBody3({
Color? color,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w400,
letterSpacing: 0.0,
fontSize: 14,
@@ -151,8 +133,7 @@ class ThemeUtils {
Color? color,
Color? backgroundColor,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w600,
letterSpacing: 0.0,
fontSize: 15,
@@ -164,8 +145,7 @@ class ThemeUtils {
static TextStyle textStyleHeadingH6({
Color? color,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w700,
letterSpacing: 0.0,
fontSize: 20,
@@ -176,8 +156,7 @@ class ThemeUtils {
static TextStyle textStyleHeadingH5({
Color? color,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w500,
letterSpacing: 0.0,
fontSize: 24,
@@ -188,8 +167,7 @@ class ThemeUtils {
static TextStyle textStyleHeadingH4({
Color? color,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w500,
letterSpacing: 0.0,
fontSize: 32,
@@ -200,8 +178,7 @@ class ThemeUtils {
static TextStyle textStyleHeadingHeadingSmall({
Color? color,
FontWeight? fontWeight,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: fontWeight ?? FontWeight.w500,
letterSpacing: 0.0,
fontSize: 17,
@@ -209,8 +186,7 @@ class ThemeUtils {
color: color,
);
static const textStyleM3HeadlineSmall = TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleM3HeadlineSmall = defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w600,
letterSpacing: 0.0,
fontSize: 24,
@@ -221,8 +197,7 @@ class ThemeUtils {
static TextStyle textStyleInter700({
Color? color,
double? fontSize,
}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
}) => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w700,
letterSpacing: 0.0,
fontSize: fontSize ?? 15,
@@ -230,8 +205,7 @@ class ThemeUtils {
color: color ?? Colors.black,
);
static TextStyle textStyleInter500() => const TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleInter500() => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w500,
letterSpacing: 0.0,
fontSize: 14,
@@ -239,8 +213,7 @@ class ThemeUtils {
color: Colors.black,
);
static const TextStyle textStyleInter400 = TextStyle(
fontFamily: ConstantsUI.fontApp,
static final TextStyle textStyleInter400 = defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.normal,
letterSpacing: -0.13,
fontSize: 13,
@@ -248,8 +221,7 @@ class ThemeUtils {
color: Colors.black,
);
static TextStyle textStyleM3LabelLarge({Color? color}) => TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleM3LabelLarge({Color? color}) => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w500,
letterSpacing: 0.1,
fontSize: 14,
@@ -257,8 +229,7 @@ class ThemeUtils {
color: color ?? AppColor.primaryMain,
);
static TextStyle get textStyleM3LabelSmall => const TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle get textStyleM3LabelSmall => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w500,
letterSpacing: 0.5,
fontSize: 11,
@@ -266,8 +237,7 @@ class ThemeUtils {
color: AppColor.m3Tertiary,
);
static TextStyle get textStyleM3TitleSmall => const TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle get textStyleM3TitleSmall => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w500,
letterSpacing: 0.1,
fontSize: 14,
@@ -275,8 +245,7 @@ class ThemeUtils {
color: AppColor.m3Tertiary20,
);
static const TextStyle textStyleM3BodyMedium1 = TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleM3BodyMedium1 = defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w400,
letterSpacing: -0.15,
fontSize: 16,
@@ -284,8 +253,7 @@ class ThemeUtils {
color: AppColor.textPrimary,
);
static const TextStyle textStyleM3BodyMedium3 = TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleM3BodyMedium3 = defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w400,
letterSpacing: 0.25,
fontSize: 14,
@@ -293,8 +261,7 @@ class ThemeUtils {
color: AppColor.m3SurfaceBackground,
);
static final TextStyle textStyleM3BodyMedium = TextStyle(
fontFamily: ConstantsUI.fontApp,
static final TextStyle textStyleM3BodyMedium = defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w500,
letterSpacing: 0.25,
fontSize: 14,
@@ -302,8 +269,7 @@ class ThemeUtils {
color: AppColor.textSecondary.withValues(alpha: 0.48),
);
static const TextStyle textStyleM3BodyLarge = TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleM3BodyLarge = defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w500,
letterSpacing: -0.15,
fontSize: 17,
@@ -311,8 +277,7 @@ class ThemeUtils {
color: AppColor.m3SurfaceBackground,
);
static TextStyle textStyleAppShortcut() => const TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleAppShortcut() => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.normal,
letterSpacing: 0.0,
fontSize: 12,
@@ -320,8 +285,7 @@ class ThemeUtils {
color: AppColor.textPrimary,
);
static TextStyle textStyleContentCaption() => const TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleContentCaption() => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.normal,
letterSpacing: 0,
fontSize: 11,
@@ -329,8 +293,7 @@ class ThemeUtils {
color: AppColor.steelGray400,
);
static TextStyle textStyleInter600() => TextStyle(
fontFamily: ConstantsUI.fontApp,
static TextStyle textStyleInter600() => defaultTextStyleInterFont.copyWith(
fontWeight: FontWeight.w600,
letterSpacing: 0.0,
fontSize: 24,
@@ -338,8 +301,9 @@ class ThemeUtils {
color: AppColor.gray424244.withValues(alpha: 0.9),
);
static const TextStyle defaultTextStyleInterFont = TextStyle(
static TextStyle defaultTextStyleInterFont = TextStyle(
fontFamily: ConstantsUI.fontApp,
fontFamilyFallback: ConstantsUI.fontFamilyFallback,
);
static TextSelectionThemeData get _textSelectionTheme {
@@ -350,26 +314,22 @@ class ThemeUtils {
);
}
static AppBarTheme get _appBarTheme {
return AppBarTheme(
color: Colors.white,
elevation: 0,
systemOverlayStyle: SystemUiOverlayStyle.light,
iconTheme: const IconThemeData(color: Colors.black),
titleTextStyle: defaultTextStyleInterFont.copyWith(
color: const Color(0XFF8B8B8B),
fontSize: 18,
),
toolbarTextStyle: defaultTextStyleInterFont,
);
}
static final AppBarTheme _appBarTheme = AppBarTheme(
color: Colors.white,
elevation: 0,
systemOverlayStyle: SystemUiOverlayStyle.light,
iconTheme: const IconThemeData(color: Colors.black),
titleTextStyle: defaultTextStyleInterFont.copyWith(
color: const Color(0XFF8B8B8B),
fontSize: 18,
),
toolbarTextStyle: defaultTextStyleInterFont,
);
static DividerThemeData get _dividerTheme {
return const DividerThemeData(
color: AppColor.colorDivider,
space: 0
);
}
static const DividerThemeData _dividerTheme = DividerThemeData(
color: AppColor.colorDivider,
space: 0
);
static void setSystemLightUIStyle() {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
@@ -22,7 +22,7 @@ class HtmlContentViewerOnWeb extends StatefulWidget {
final double heightContent;
final TextDirection? direction;
final double? contentPadding;
final bool useDefaultFont;
final bool useDefaultFontStyle;
/// Handler for mailto: links
final OnMailtoClicked? mailtoDelegate;
@@ -49,7 +49,7 @@ class HtmlContentViewerOnWeb extends StatefulWidget {
required this.widthContent,
this.heightContent = 200,
this.allowResizeToDocumentSize = true,
this.useDefaultFont = false,
this.useDefaultFontStyle = false,
this.mailtoDelegate,
this.direction,
this.onClickHyperLinkAction,
@@ -360,7 +360,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
javaScripts: combinedScripts,
direction: widget.direction,
contentPadding: widget.contentPadding,
useDefaultFont: widget.useDefaultFont,
useDefaultFontStyle: widget.useDefaultFontStyle,
);
return htmlTemplate;
@@ -29,7 +29,7 @@ class HtmlContentViewer extends StatefulWidget {
final TextDirection? direction;
final bool keepWidthWhileLoading;
final double? contentPadding;
final bool useDefaultFont;
final bool useDefaultFontStyle;
final double? maxHtmlContentHeight;
final double htmlContentMinHeight;
final double offsetHtmlContentHeight;
@@ -56,7 +56,7 @@ class HtmlContentViewer extends StatefulWidget {
this.enableQuoteToggle = false,
this.keepWidthWhileLoading = false,
this.contentPadding,
this.useDefaultFont = false,
this.useDefaultFontStyle = false,
this.disableScrolling = false,
this.maxViewHeight,
this.maxHtmlContentHeight,
@@ -150,7 +150,7 @@ class HtmlContentViewState extends State<HtmlContentViewer> with AutomaticKeepAl
javaScripts: combinedScripts,
styleCSS: combinedCss,
contentPadding: widget.contentPadding,
useDefaultFont: widget.useDefaultFont,
useDefaultFontStyle: widget.useDefaultFontStyle,
);
}
@@ -15,7 +15,7 @@ class IosHtmlContentViewerWidget extends StatefulWidget {
final String contentHtml;
final TextDirection? direction;
final bool useDefaultFont;
final bool useDefaultFontStyle;
final OnMailtoDelegateAction? onMailtoDelegateAction;
final OnPreviewEMLDelegateAction? onPreviewEMLDelegateAction;
final OnDownloadAttachmentDelegateAction? onDownloadAttachmentDelegateAction;
@@ -24,7 +24,7 @@ class IosHtmlContentViewerWidget extends StatefulWidget {
Key? key,
required this.contentHtml,
this.direction,
this.useDefaultFont = false,
this.useDefaultFontStyle = true,
this.onMailtoDelegateAction,
this.onPreviewEMLDelegateAction,
this.onDownloadAttachmentDelegateAction,
@@ -53,7 +53,7 @@ class _IosHtmlContentViewerWidgetState extends State<IosHtmlContentViewerWidget>
content: widget.contentHtml,
direction: widget.direction,
javaScripts: HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage,
useDefaultFont: widget.useDefaultFont,
useDefaultFontStyle: widget.useDefaultFontStyle,
));
}