123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import 'package:appflowy/plugins/document/presentation/editor_plugins/inline_page/inline_page_reference.dart';
- import 'package:appflowy/plugins/document/presentation/editor_plugins/mention/mention_block.dart';
- import 'package:appflowy/plugins/document/presentation/more/cubit/document_appearance_cubit.dart';
- import 'package:appflowy_editor/appflowy_editor.dart' hide FlowySvg, Log;
- import 'package:collection/collection.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_bloc/flutter_bloc.dart';
- import 'package:google_fonts/google_fonts.dart';
- class EditorStyleCustomizer {
- EditorStyleCustomizer({
- required this.context,
- required this.padding,
- });
- final BuildContext context;
- final EdgeInsets padding;
- EditorStyle style() {
- if (PlatformExtension.isDesktopOrWeb) {
- return desktop();
- } else if (PlatformExtension.isMobile) {
- return mobile();
- }
- throw UnimplementedError();
- }
- EditorStyle desktop() {
- final theme = Theme.of(context);
- final fontSize = context.read<DocumentAppearanceCubit>().state.fontSize;
- return EditorStyle.desktop(
- padding: padding,
- backgroundColor: theme.colorScheme.surface,
- cursorColor: theme.colorScheme.primary,
- textStyleConfiguration: TextStyleConfiguration(
- text: TextStyle(
- fontFamily: 'Poppins',
- fontSize: fontSize,
- color: theme.colorScheme.onBackground,
- height: 1.5,
- ),
- bold: const TextStyle(
- fontFamily: 'Poppins-Bold',
- fontWeight: FontWeight.w600,
- ),
- italic: const TextStyle(fontStyle: FontStyle.italic),
- underline: const TextStyle(decoration: TextDecoration.underline),
- strikethrough: const TextStyle(decoration: TextDecoration.lineThrough),
- href: TextStyle(
- color: theme.colorScheme.primary,
- decoration: TextDecoration.underline,
- ),
- code: GoogleFonts.robotoMono(
- textStyle: TextStyle(
- fontSize: fontSize,
- fontWeight: FontWeight.normal,
- color: Colors.red,
- backgroundColor: theme.colorScheme.inverseSurface,
- ),
- ),
- ),
- textSpanDecorator: customizeAttributeDecorator,
- );
- }
- EditorStyle mobile() {
- final theme = Theme.of(context);
- final fontSize = context.read<DocumentAppearanceCubit>().state.fontSize;
- return EditorStyle.desktop(
- padding: padding,
- backgroundColor: theme.colorScheme.surface,
- cursorColor: theme.colorScheme.primary,
- textStyleConfiguration: TextStyleConfiguration(
- text: TextStyle(
- fontFamily: 'poppins',
- fontSize: fontSize,
- color: theme.colorScheme.onBackground,
- height: 1.5,
- ),
- bold: const TextStyle(
- fontFamily: 'poppins-Bold',
- fontWeight: FontWeight.w600,
- ),
- italic: const TextStyle(fontStyle: FontStyle.italic),
- underline: const TextStyle(decoration: TextDecoration.underline),
- strikethrough: const TextStyle(decoration: TextDecoration.lineThrough),
- href: TextStyle(
- color: theme.colorScheme.primary,
- decoration: TextDecoration.underline,
- ),
- code: GoogleFonts.robotoMono(
- textStyle: TextStyle(
- fontSize: fontSize,
- fontWeight: FontWeight.normal,
- color: Colors.red,
- backgroundColor: theme.colorScheme.inverseSurface,
- ),
- ),
- ),
- );
- }
- TextStyle headingStyleBuilder(int level) {
- final fontSize = context.read<DocumentAppearanceCubit>().state.fontSize;
- final fontSizes = [
- fontSize + 16,
- fontSize + 12,
- fontSize + 8,
- fontSize + 4,
- fontSize + 2,
- fontSize
- ];
- return TextStyle(
- fontSize: fontSizes.elementAtOrNull(level - 1) ?? fontSize,
- fontWeight: FontWeight.bold,
- );
- }
- TextStyle codeBlockStyleBuilder() {
- final theme = Theme.of(context);
- final fontSize = context.read<DocumentAppearanceCubit>().state.fontSize;
- return TextStyle(
- fontFamily: 'poppins',
- fontSize: fontSize,
- height: 1.5,
- color: theme.colorScheme.onBackground,
- );
- }
- SelectionMenuStyle selectionMenuStyleBuilder() {
- final theme = Theme.of(context);
- return SelectionMenuStyle(
- selectionMenuBackgroundColor: theme.cardColor,
- selectionMenuItemTextColor: theme.colorScheme.onBackground,
- selectionMenuItemIconColor: theme.colorScheme.onBackground,
- selectionMenuItemSelectedIconColor: theme.colorScheme.onSurface,
- selectionMenuItemSelectedTextColor: theme.colorScheme.onSurface,
- selectionMenuItemSelectedColor: theme.hoverColor,
- );
- }
- FloatingToolbarStyle floatingToolbarStyleBuilder() {
- final theme = Theme.of(context);
- return FloatingToolbarStyle(
- backgroundColor: theme.colorScheme.onTertiary,
- );
- }
- InlineSpan customizeAttributeDecorator(
- TextInsert textInsert,
- TextSpan textSpan,
- ) {
- final attributes = textInsert.attributes;
- if (attributes == null) {
- return textSpan;
- }
- final mention = attributes[MentionBlockKeys.mention] as Map?;
- if (mention != null) {
- final type = mention[MentionBlockKeys.type];
- if (type == MentionType.page.name) {
- return WidgetSpan(
- alignment: PlaceholderAlignment.middle,
- child: MentionBlock(
- key: ValueKey(mention[MentionBlockKeys.pageId]),
- mention: mention,
- ),
- );
- }
- }
- return textSpan;
- }
- }
|