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,
));
}
+99 -28
View File
@@ -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;
+35 -71
View File
@@ -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);