TF-3933 Avoid load font from google
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class HtmlTemplate {
|
||||
static const String fontLink = '<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">';
|
||||
static const String nameClassToolTip = 'tmail-tooltip';
|
||||
static const String tooltipLinkCss = '''
|
||||
.$nameClassToolTip .tooltiptext {
|
||||
@@ -66,10 +67,54 @@ class HtmlTemplate {
|
||||
</style>
|
||||
''';
|
||||
|
||||
static const String fontFaceStyle = '''
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
src: url("/assets/fonts/Inter/Inter-Regular.ttf") format("truetype");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
src: url("/assets/fonts/Inter/Inter-Medium.ttf") format("truetype");
|
||||
font-weight: 500;
|
||||
font-style: medium;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
src: url("/assets/fonts/Inter/Inter-SemiBold.ttf") format("truetype");
|
||||
font-weight: 600;
|
||||
font-style: semi-bold;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
src: url("/assets/fonts/Inter/Inter-Bold.ttf") format("truetype");
|
||||
font-weight: 700;
|
||||
font-style: bold;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
''';
|
||||
|
||||
static const String defaultFontStyle = '''
|
||||
body {
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
letter-spacing: -0.01em; /* -1% */
|
||||
}
|
||||
''';
|
||||
|
||||
static const String previewEMLFileCssStyle = '''
|
||||
<style>
|
||||
$fontFaceStyle
|
||||
|
||||
body {
|
||||
font-family: Arial, 'Inter', sans-serif;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
@@ -219,38 +264,64 @@ class HtmlTemplate {
|
||||
|
||||
static const String markDownAndASCIIArtStyleCSS = 'display: block; font-family: monospace; white-space: pre; margin: 1em 0px;';
|
||||
|
||||
static const String customInternalStyleCSS = '''
|
||||
static String webCustomInternalStyleCSS({
|
||||
bool useDefaultFontStyle = false,
|
||||
bool customScrollbar = false,
|
||||
}) => '''
|
||||
<style>
|
||||
html, .note-editable, .note-codable {
|
||||
overflow: auto;
|
||||
}
|
||||
${HtmlTemplate.fontFaceStyle}
|
||||
|
||||
html::-webkit-scrollbar, .note-editable::-webkit-scrollbar, .note-codable::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
html::-webkit-scrollbar-thumb, .note-editable::-webkit-scrollbar-thumb, .note-codable::-webkit-scrollbar-thumb {
|
||||
background-color: #c1c1c1;
|
||||
border-radius: 10px;
|
||||
min-height: 70px;
|
||||
}
|
||||
${useDefaultFontStyle ? HtmlTemplate.defaultFontStyle : ''}
|
||||
|
||||
html::-webkit-scrollbar-track, .note-editable::-webkit-scrollbar-track, .note-codable::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
/* Browsers without `::-webkit-scrollbar-*` support */
|
||||
@supports not selector(::-webkit-scrollbar) {
|
||||
html, .note-editable, .note-codable {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #c1c1c1 transparent;
|
||||
}
|
||||
}
|
||||
${customScrollbar ? '''
|
||||
html, .note-editable, .note-codable {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
html::-webkit-scrollbar, .note-editable::-webkit-scrollbar, .note-codable::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
html::-webkit-scrollbar-thumb, .note-editable::-webkit-scrollbar-thumb, .note-codable::-webkit-scrollbar-thumb {
|
||||
background-color: #c1c1c1;
|
||||
border-radius: 10px;
|
||||
min-height: 70px;
|
||||
}
|
||||
|
||||
html::-webkit-scrollbar-track, .note-editable::-webkit-scrollbar-track, .note-codable::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
/* Browsers without `::-webkit-scrollbar-*` support */
|
||||
@supports not selector(::-webkit-scrollbar) {
|
||||
html, .note-editable, .note-codable {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #c1c1c1 transparent;
|
||||
}
|
||||
}
|
||||
''' : ''}
|
||||
</style>
|
||||
''';
|
||||
|
||||
static String mobileCustomInternalStyleCSS({
|
||||
bool useDefaultFontStyle = false,
|
||||
TextDirection direction = TextDirection.ltr,
|
||||
}) => '''
|
||||
${HtmlTemplate.fontFaceStyle}
|
||||
|
||||
${useDefaultFontStyle ? HtmlTemplate.defaultFontStyle : ''}
|
||||
|
||||
#editor {
|
||||
direction: ${direction.name};
|
||||
}
|
||||
|
||||
#editor .tmail-signature {
|
||||
text-align: ${direction == TextDirection.rtl ? 'right' : 'left'};
|
||||
}
|
||||
''';
|
||||
|
||||
static const String disableScrollingStyleCSS = '''
|
||||
html, body {
|
||||
overflow: hidden;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:core/utils/html/html_template.dart';
|
||||
import 'package:html_unescape/html_unescape.dart';
|
||||
|
||||
import 'js_interop_stub.dart' if (dart.library.html) 'dart:js_interop';
|
||||
@@ -9,7 +10,6 @@ import 'dart:typed_data';
|
||||
import 'package:core/data/constants/constant.dart';
|
||||
import 'package:core/presentation/extensions/html_extension.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:core/utils/platform_info.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
@@ -41,72 +41,43 @@ class HtmlUtils {
|
||||
editor.parentNode.replaceChild(newEditor, editor);''',
|
||||
name: 'unregisterDropListener');
|
||||
|
||||
static String customCssStyleHtmlEditor({
|
||||
static String customInlineBodyCssStyleHtmlEditor({
|
||||
TextDirection direction = TextDirection.ltr,
|
||||
bool useDefaultFont = false,
|
||||
double? horizontalPadding,
|
||||
}) {
|
||||
if (PlatformInfo.isWeb) {
|
||||
return '''
|
||||
<style>
|
||||
${useDefaultFont ? '''
|
||||
body {
|
||||
font-family: Arial, 'Inter', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
}
|
||||
''' : ''}
|
||||
return '''
|
||||
<style>
|
||||
.note-frame, .note-tooltip-content, .note-popover {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
|
||||
.note-editable {
|
||||
direction: ${direction.name};
|
||||
}
|
||||
|
||||
.note-editable .tmail-signature {
|
||||
text-align: ${direction == TextDirection.rtl ? 'right' : 'left'};
|
||||
}
|
||||
|
||||
${horizontalPadding != null
|
||||
? '''
|
||||
.note-codable {
|
||||
padding: 10px ${horizontalPadding}px 0px ${horizontalPadding > 3 ? horizontalPadding - 3 : horizontalPadding}px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
.note-editable {
|
||||
padding: 10px ${horizontalPadding}px 0px ${horizontalPadding > 3 ? horizontalPadding - 3 : horizontalPadding}px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
'''
|
||||
: '''
|
||||
.note-editable {
|
||||
direction: ${direction.name};
|
||||
}
|
||||
|
||||
.note-editable .tmail-signature {
|
||||
text-align: ${direction == TextDirection.rtl ? 'right' : 'left'};
|
||||
}
|
||||
|
||||
${horizontalPadding != null
|
||||
? '''
|
||||
.note-codable {
|
||||
padding: 10px ${horizontalPadding}px 0px ${horizontalPadding > 3 ? horizontalPadding - 3 : horizontalPadding}px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
.note-editable {
|
||||
padding: 10px ${horizontalPadding}px 0px ${horizontalPadding > 3 ? horizontalPadding - 3 : horizontalPadding}px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
'''
|
||||
: '''
|
||||
.note-editable {
|
||||
padding: 10px 10px 0px 10px;
|
||||
}
|
||||
'''}
|
||||
</style>
|
||||
''';
|
||||
} else if (PlatformInfo.isMobile) {
|
||||
return '''
|
||||
${useDefaultFont ? '''
|
||||
body {
|
||||
font-family: Arial, 'Inter', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
}
|
||||
''' : ''}
|
||||
|
||||
#editor {
|
||||
direction: ${direction.name};
|
||||
}
|
||||
|
||||
#editor .tmail-signature {
|
||||
text-align: ${direction == TextDirection.rtl ? 'right' : 'left'};
|
||||
}
|
||||
''';
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
</style>
|
||||
''';
|
||||
}
|
||||
|
||||
static String validateHtmlImageResourceMimeType(String mimeType) {
|
||||
@@ -134,7 +105,7 @@ class HtmlUtils {
|
||||
String? styleCSS,
|
||||
String? javaScripts,
|
||||
bool hideScrollBar = true,
|
||||
bool useDefaultFont = false,
|
||||
bool useDefaultFontStyle = false,
|
||||
TextDirection? direction,
|
||||
double? contentPadding,
|
||||
}) {
|
||||
@@ -144,18 +115,11 @@ class HtmlUtils {
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
${useDefaultFont && PlatformInfo.isMobile
|
||||
? '<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">'
|
||||
: ''}
|
||||
<style>
|
||||
${useDefaultFont ? '''
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
}
|
||||
''' : ''}
|
||||
${HtmlTemplate.fontFaceStyle}
|
||||
|
||||
${useDefaultFontStyle ? HtmlTemplate.defaultFontStyle : ''}
|
||||
|
||||
.tmail-content {
|
||||
min-height: ${minHeight ?? 0}px;
|
||||
min-width: ${minWidth ?? 0}px;
|
||||
|
||||
@@ -177,9 +177,6 @@ class PreviewEmlFileUtils {
|
||||
listAttachment: listAttachment,
|
||||
);
|
||||
|
||||
Element linkFontElement = Element.html(HtmlTemplate.fontLink);
|
||||
document.head?.append(linkFontElement);
|
||||
|
||||
Element styleElement = Element.html(HtmlTemplate.previewEMLFileCssStyle);
|
||||
document.head?.append(styleElement);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user