-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
- .
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/README.md b/frontend/appflowy_flutter/packages/appflowy_editor/README.md
deleted file mode 100644
index 65144cda59..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/README.md
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-AppFlowy Editor
-
-A highly customizable rich-text editor for Flutter
-
-
- Discord •
- Twitter
-
-
-
-
-
-
-
-
-
-
-
-
-## Key Features
-
-* Build rich, intuitive editors
-* Design and modify an ever expanding list of customizable features including
- * components (such as form input controls, numbered lists, and rich text widgets)
- * shortcut events
- * themes
- * menu options (**coming soon!**)
-* [Test-coverage](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/documentation/testing.md) and ongoing maintenance by AppFlowy's core team and community of more than 1,000 builders
-
-## Getting Started
-
-Add the AppFlowy editor [Flutter package](https://docs.flutter.dev/development/packages-and-plugins/using-packages) to your environment.
-
-```shell
-flutter pub add appflowy_editor
-flutter pub get
-```
-
-## Creating Your First Editor
-
-Start by creating a new empty AppFlowyEditor object.
-
-```dart
-final editorState = EditorState.empty(); // an empty state
-final editor = AppFlowyEditor(
- editorState: editorState,
-);
-```
-
-You can also create an editor from a JSON object in order to configure your initial state. Or you can [create an editor from Markdown or Quill Delta](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/documentation/importing.md).
-
-```dart
-final json = ...;
-final editorState = EditorState(Document.fromJson(data));
-final editor = AppFlowyEditor(
- editorState: editorState,
-);
-```
-
-> Note: The parameters `localizationsDelegates` need to be assigned in MaterialApp widget
-```dart
-MaterialApp(
- localizationsDelegates: const [
- AppFlowyEditorLocalizations.delegate,
- ],
-);
-```
-
-To get a sense of how the AppFlowy Editor works, run our example:
-
-```shell
-git clone https://github.com/AppFlowy-IO/AppFlowy.git
-cd frontend/appflowy_flutter/packages/appflowy_editor/example
-flutter run
-```
-
-## Customizing Your Editor
-
-### Customizing Components
-
-Please refer to our documentation on customizing AppFlowy for a detailed discussion about [customizing components](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/documentation/customizing.md#customize-a-component).
-
-Below are some examples of component customizations:
-
- * [Checkbox Text](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/render/rich_text/checkbox_text.dart) demonstrates how to extend new styles based on existing rich text components
- * [Image](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/network_image_node_widget.dart) demonstrates how to extend a new node and render it
- * See further examples of [rich-text plugins](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/render/rich_text)
-
-### Customizing Shortcut Events
-
-Please refer to our documentation on customizing AppFlowy for a detailed discussion about [customizing shortcut events](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/documentation/customizing.md#customize-a-shortcut-event).
-
-Below are some examples of shortcut event customizations:
-
- * [BIUS](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/format_style_handler.dart) demonstrates how to make text bold/italic/underline/strikethrough through shortcut keys
- * [Paste HTML](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/copy_paste_handler.dart) gives you an idea on how to handle pasted styles through shortcut keys
- * Need more examples? Check out [Internal key event handlers](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/service/internal_key_event_handlers)
-
-## Glossary
-Please refer to the API documentation.
-
-## Contributing
-Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
-
-Please look at [CONTRIBUTING.md](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/contributing-to-appflowy) for details.
-
-## License
-Distributed under the AGPLv3 License. See [LICENSE](https://github.com/AppFlowy-IO/AppFlowy-Docs/blob/main/LICENSE) for more information.
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/analysis_options.yaml b/frontend/appflowy_flutter/packages/appflowy_editor/analysis_options.yaml
deleted file mode 100644
index a5744c1cfb..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/analysis_options.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-include: package:flutter_lints/flutter.yaml
-
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/check.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/check.svg
deleted file mode 100644
index 8446cced9f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/check.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/checkmark.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/checkmark.svg
deleted file mode 100644
index f9c848f713..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/checkmark.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/clear.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/clear.svg
deleted file mode 100644
index 7f303d737f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/clear.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/copy.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/copy.svg
deleted file mode 100644
index 101cf34205..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/copy.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/delete.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/delete.svg
deleted file mode 100644
index b7f242542d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/delete.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_center.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_center.svg
deleted file mode 100644
index ae9c2cfd44..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_center.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_left.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_left.svg
deleted file mode 100644
index b4f2d0101e..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_left.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_right.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_right.svg
deleted file mode 100644
index 86a1facaac..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/align_right.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/copy.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/copy.svg
deleted file mode 100644
index 101cf34205..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/copy.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/delete.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/delete.svg
deleted file mode 100644
index 5a3d972872..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/delete.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/divider.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/divider.svg
deleted file mode 100644
index 3e57a6b000..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/divider.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/share.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/share.svg
deleted file mode 100644
index 279e7ac471..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/image_toolbar/share.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/link.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/link.svg
deleted file mode 100644
index 5fbcc8d787..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/link.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/point.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/point.svg
deleted file mode 100644
index be88518d0d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/point.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/quote.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/quote.svg
deleted file mode 100644
index 1393e71556..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/quote.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/bulleted_list.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/bulleted_list.svg
deleted file mode 100644
index 97a2e9c434..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/bulleted_list.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/checkbox.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/checkbox.svg
deleted file mode 100644
index 37f52c47ed..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/checkbox.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h1.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h1.svg
deleted file mode 100644
index 6e97796956..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h1.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h2.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h2.svg
deleted file mode 100644
index 2c1d1d9d1c..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h2.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h3.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h3.svg
deleted file mode 100644
index 8c6276263d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/h3.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/image.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/image.svg
deleted file mode 100644
index 0e2aafe0ec..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/image.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/number.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/number.svg
deleted file mode 100644
index 9d8b98d10d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/number.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/quote.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/quote.svg
deleted file mode 100644
index 5c1cbb4a50..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/quote.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/text.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/text.svg
deleted file mode 100644
index 7befa5080f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/selection_menu/text.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/bold.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/bold.svg
deleted file mode 100644
index 85640695af..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/bold.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/bulleted_list.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/bulleted_list.svg
deleted file mode 100644
index c2c962fa0b..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/bulleted_list.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/center.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/center.svg
deleted file mode 100644
index ea834a35bd..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/center.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/code.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/code.svg
deleted file mode 100644
index 9b96b3c2dc..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/code.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/divider.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/divider.svg
deleted file mode 100644
index 3e57a6b000..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/divider.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h1.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h1.svg
deleted file mode 100644
index 8a87ece4f0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h1.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h2.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h2.svg
deleted file mode 100644
index 9ce394b0b1..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h2.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h3.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h3.svg
deleted file mode 100644
index 43af128937..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/h3.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/highlight.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/highlight.svg
deleted file mode 100644
index 697603a054..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/highlight.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/italic.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/italic.svg
deleted file mode 100644
index 6b739a761f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/italic.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/left.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/left.svg
deleted file mode 100644
index b4f2d0101e..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/left.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/link.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/link.svg
deleted file mode 100644
index 279e7ac471..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/link.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/number_list.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/number_list.svg
deleted file mode 100644
index 2db0ab3b64..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/number_list.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/quote.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/quote.svg
deleted file mode 100644
index 8e55d9e2e3..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/quote.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/right.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/right.svg
deleted file mode 100644
index 86a1facaac..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/right.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/strikethrough.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/strikethrough.svg
deleted file mode 100644
index b37bb9acc0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/strikethrough.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/underline.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/underline.svg
deleted file mode 100644
index 933471e6a7..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/toolbar/underline.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/uncheck.svg b/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/uncheck.svg
deleted file mode 100644
index 6c487795c6..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/assets/images/uncheck.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/customizing.md b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/customizing.md
deleted file mode 100644
index 89a6eecf9c..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/customizing.md
+++ /dev/null
@@ -1,393 +0,0 @@
-# Customizing Editor Features
-
-## Customizing a Shortcut Event
-
-We will use a simple example to illustrate how to quickly add a shortcut event.
-
-In this example, text that starts and ends with an underscore ( \_ ) character will be rendered in italics for emphasis. So typing `_xxx_` will automatically be converted into _xxx_.
-
-Let's start with a blank document:
-
-```dart
-@override
-Widget build(BuildContext context) {
- return Scaffold(
- body: Container(
- alignment: Alignment.topCenter,
- child: AppFlowyEditor(
- editorState: EditorState.empty(),
- shortcutEvents: const [],
- customBuilders: const {},
- ),
- ),
- );
-}
-```
-
-At this point, nothing magic will happen after typing `_xxx_`.
-
-
-
-To implement our shortcut event we will create a `ShortcutEvent` instance to handle an underscore input.
-
-We need to define `key` and `command` in a ShortCutEvent object to customize hotkeys. We recommend using the description of your event as a key. For example, if the underscore `_` is defined to make text italic, the key can be 'Underscore to italic'.
-
-> The command, made up of a single keyword such as `underscore` or a combination of keywords using the `+` sign in between to concatenate, is a condition that triggers a user-defined function. To see which keywords are available to define a command, please refer to [key_mapping.dart](../lib/src/service/shortcut_event/key_mapping.dart).
-> If more than one commands trigger the same handler, then we use ',' to split them. For example, using CTRL and A or CMD and A to 'select all', we describe it as `cmd+a,ctrl+a`(case-insensitive).
-
-```dart
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:flutter/material.dart';
-
-ShortcutEvent underscoreToItalicEvent = ShortcutEvent(
- key: 'Underscore to italic',
- command: 'shift+underscore',
- handler: _underscoreToItalicHandler,
-);
-
-ShortcutEventHandler _underscoreToItalicHandler = (editorState, event) {
-
-};
-```
-
-Then, we need to determine if the currently selected node is a `TextNode` and if the selection is collapsed.
-
-If so, we will continue.
-
-```dart
-// ...
-ShortcutEventHandler _underscoreToItalicHandler = (editorState, event) {
- // Obtain the selection and selected nodes of the current document through the 'selectionService'
- // to determine whether the selection is collapsed and whether the selected node is a text node.
- final selectionService = editorState.service.selectionService;
- final selection = selectionService.currentSelection.value;
- final textNodes = selectionService.currentSelectedNodes.whereType();
- if (selection == null || !selection.isSingle || textNodes.length != 1) {
- return KeyEventResult.ignored;
- }
-```
-
-Now, we deal with handling the underscore.
-
-Look for the position of the previous underscore and
-1. if one is _not_ found, return without doing anything.
-2. if one is found, the text enclosed within the two underscores will be formatted to display in italics.
-
-```dart
-// ...
-ShortcutEventHandler _underscoreToItalicHandler = (editorState, event) {
- // ...
-
- final textNode = textNodes.first;
- final text = textNode.toRawString();
- // Determine if an 'underscore' already exists in the text node and only once.
- final firstUnderscore = text.indexOf('_');
- final lastUnderscore = text.lastIndexOf('_');
- if (firstUnderscore == -1 ||
- firstUnderscore != lastUnderscore ||
- firstUnderscore == selection.start.offset - 1) {
- return KeyEventResult.ignored;
- }
-
- // Delete the previous 'underscore',
- // update the style of the text surrounded by the two underscores to 'italic',
- // and update the cursor position.
- final transaction = editorState.transaction
- ..deleteText(textNode, firstUnderscore, 1)
- ..formatText(
- textNode,
- firstUnderscore,
- selection.end.offset - firstUnderscore - 1,
- {
- BuiltInAttributeKey.italic: true,
- },
- )
- ..afterSelection = Selection.collapsed(
- Position(
- path: textNode.path,
- offset: selection.end.offset - 1,
- ),
- );
- editorState.apply(transaction);
-
- return KeyEventResult.handled;
-};
-```
-
-Now our 'underscore handler' function is done and the only task left is to inject it into the AppFlowyEditor.
-
-```dart
-@override
-Widget build(BuildContext context) {
- return Scaffold(
- body: Container(
- alignment: Alignment.topCenter,
- child: AppFlowyEditor(
- editorState: EditorState.empty(),
- customBuilders: const {},
- shortcutEvents: [
- underscoreToItalic,
- ],
- ),
- ),
- );
-}
-```
-
-
-
-Check out the [complete code](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/service/internal_key_event_handlers/markdown_syntax_to_styled_text.dart) file of this example.
-
-
-## Customizing a Component
-We will use a simple example to show how to quickly add a custom component.
-
-In this example we will render an image from the network.
-
-Let's start with a blank document:
-
-```dart
-@override
-Widget build(BuildContext context) {
- return Scaffold(
- body: Container(
- alignment: Alignment.topCenter,
- child: AppFlowyEditor(
- editorState: EditorState.empty(),
- shortcutEvents: const [],
- customBuilders: const {},
- ),
- ),
- );
-}
-```
-
-Next, we will choose a unique string for your custom node's type.
-
-We'll use `network_image` in this case. And we add `network_image_src` to the `attributes` to describe the link of the image.
-
-```JSON
-{
- "type": "network_image",
- "attributes": {
- "network_image_src": "https://docs.flutter.dev/assets/images/dash/dash-fainting.gif"
- }
-}
-```
-
-Then, we create a class that inherits [NodeWidgetBuilder](../lib/src/service/render_plugin_service.dart). As shown in the autoprompt, we need to implement two functions:
-1. one returns a widget
-2. the other verifies the correctness of the [Node](../lib/src/core/document/node.dart).
-
-
-```dart
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:flutter/material.dart';
-
-class NetworkImageNodeWidgetBuilder extends NodeWidgetBuilder {
- @override
- Widget build(NodeWidgetContext context) {
- throw UnimplementedError();
- }
-
- @override
- NodeValidator get nodeValidator => throw UnimplementedError();
-}
-```
-
-Now, let's implement a simple image widget based on `Image`.
-
-Note that the `State` object that is returned by the `Widget` must implement [Selectable](../lib/src/render/selection/selectable.dart) using the `with` keyword.
-
-```dart
-class _NetworkImageNodeWidget extends StatefulWidget {
- const _NetworkImageNodeWidget({
- Key? key,
- required this.node,
- }) : super(key: key);
-
- final Node node;
-
- @override
- State<_NetworkImageNodeWidget> createState() =>
- __NetworkImageNodeWidgetState();
-}
-
-class __NetworkImageNodeWidgetState extends State<_NetworkImageNodeWidget>
- with Selectable {
- RenderBox get _renderBox => context.findRenderObject() as RenderBox;
-
- @override
- Widget build(BuildContext context) {
- return Image.network(
- widget.node.attributes['network_image_src'],
- height: 200,
- loadingBuilder: (context, child, loadingProgress) =>
- loadingProgress == null ? child : const CircularProgressIndicator(),
- );
- }
-
- @override
- Position start() => Position(path: widget.node.path, offset: 0);
-
- @override
- Position end() => Position(path: widget.node.path, offset: 1);
-
- @override
- Position getPositionInOffset(Offset start) => end();
-
- @override
- List getRectsInSelection(Selection selection) =>
- [Offset.zero & _renderBox.size];
-
- @override
- Selection getSelectionInRange(Offset start, Offset end) => Selection.single(
- path: widget.node.path,
- startOffset: 0,
- endOffset: 1,
- );
-
- @override
- Offset localToGlobal(Offset offset) => _renderBox.localToGlobal(offset);
-}
-```
-
-Finally, we return `_NetworkImageNodeWidget` in the `build` function of `NetworkImageNodeWidgetBuilder`...
-
-```dart
-class NetworkImageNodeWidgetBuilder extends NodeWidgetBuilder {
- @override
- Widget build(NodeWidgetContext context) {
- return _NetworkImageNodeWidget(
- key: context.node.key,
- node: context.node,
- );
- }
-
- @override
- NodeValidator get nodeValidator => (node) {
- return node.type == 'network_image' &&
- node.attributes['network_image_src'] is String;
- };
-}
-```
-
-... and register `NetworkImageNodeWidgetBuilder` in the `AppFlowyEditor`.
-
-```dart
-final editorState = EditorState(
- document: StateTree.empty()
- ..insert(
- [0],
- [
- TextNode.empty(),
- Node.fromJson({
- 'type': 'network_image',
- 'attributes': {
- 'network_image_src':
- 'https://docs.flutter.dev/assets/images/dash/dash-fainting.gif'
- }
- })
- ],
- ),
-);
-return AppFlowyEditor(
- editorState: editorState,
- shortcutEvents: const [],
- customBuilders: {
- 'network_image': NetworkImageNodeWidgetBuilder(),
- },
-);
-```
-
-
-
-Check out the [complete code](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/network_image_node_widget.dart) file of this example.
-
-## Customizing a Theme (New Feature in 0.0.7)
-
-We will use a simple example to illustrate how to quickly customize a theme.
-
-Let's start with a blank document:
-
-```dart
-@override
-Widget build(BuildContext context) {
- return Scaffold(
- body: Container(
- alignment: Alignment.topCenter,
- child: AppFlowyEditor(
- editorState: EditorState.empty(),
- shortcutEvents: const [],
- customBuilders: const {},
- ),
- ),
- );
-}
-```
-
-At this point, the editor looks like ...
-
-
-
-Next, we will customize the `EditorStyle`.
-
-```dart
-ThemeData customizeEditorTheme(BuildContext context) {
- final dark = EditorStyle.dark;
- final editorStyle = dark.copyWith(
- padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 150),
- cursorColor: Colors.red.shade600,
- selectionColor: Colors.yellow.shade600.withOpacity(0.5),
- textStyle: GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.white,
- ),
- placeholderTextStyle: GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.grey.shade400,
- ),
- code: dark.code?.copyWith(
- backgroundColor: Colors.lightBlue.shade200,
- fontStyle: FontStyle.italic,
- ),
- highlightColorHex: '0x60FF0000', // red
- );
-
- final quote = QuotedTextPluginStyle.dark.copyWith(
- textStyle: (_, __) => GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.blue.shade400,
- fontStyle: FontStyle.italic,
- fontWeight: FontWeight.w700,
- ),
- );
-
- return Theme.of(context).copyWith(extensions: [
- editorStyle,
- ...darkPluginStyleExtension,
- quote,
- ]);
-}
-```
-
-Now our 'customize style' function is done and the only task left is to inject it into the AppFlowyEditor.
-
-```dart
-@override
-Widget build(BuildContext context) {
- return Scaffold(
- body: Container(
- alignment: Alignment.topCenter,
- child: AppFlowyEditor(
- editorState: EditorState.empty(),
- themeData: customizeEditorTheme(context),
- shortcutEvents: const [],
- customBuilders: const {},
- ),
- ),
- );
-}
-```
-
-
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/appflowy_editor_example.mp4 b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/appflowy_editor_example.mp4
deleted file mode 100644
index 3b1b97f847..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/appflowy_editor_example.mp4 and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_component.gif b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_component.gif
deleted file mode 100644
index e78f0b2f04..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_component.gif and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_shortcut_event_after.gif b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_shortcut_event_after.gif
deleted file mode 100644
index e93035c705..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_shortcut_event_after.gif and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_shortcut_event_before.gif b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_shortcut_event_before.gif
deleted file mode 100644
index 89d31b8d13..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customize_a_shortcut_event_before.gif and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customizing_a_theme_after.png b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customizing_a_theme_after.png
deleted file mode 100644
index 3890829222..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customizing_a_theme_after.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customizing_a_theme_before.png b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customizing_a_theme_before.png
deleted file mode 100644
index 8eaac244a5..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/customizing_a_theme_before.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/example.png b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/example.png
deleted file mode 100644
index 9bd16610dc..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/example.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/reporting_bugs.png b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/reporting_bugs.png
deleted file mode 100644
index 5d4d7f6150..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/images/reporting_bugs.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/importing.md b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/importing.md
deleted file mode 100644
index 393f4dc62e..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/importing.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Importing data
-
-For now, we have supported three ways to import data to initialize AppFlowy Editor.
-
-1. From AppFlowy Document JSON
-
-```dart
-const document = r'''{"document":{"type":"editor","children":[{"type":"text","attributes":{"subtype":"heading","heading":"h1"},"delta":[{"insert":"Hello AppFlowy!"}]}]}}''';
-final json = jsonDecode(document);
-final editorState = EditorState(
- document: Document.fromJson(
- Map.from(json),
- ),
-);
-```
-
-2. From Markdown
-
-```dart
-const markdown = r'''# Hello AppFlowy!''';
-final editorState = EditorState(
- document: markdownToDocument(markdown),
-);
-```
-
-3. From Quill Delta
-
-```dart
-const delta = r'''[{"insert":"Hello AppFlowy!"},{"attributes":{"header":1},"insert":"\n"}]''';
-final json = jsonDecode(delta);
-final editorState = EditorState(
- document: DeltaDocumentConvert().convertFromJSON(json),
-);
-```
-
-For more details, please refer to the function `_importFile` through this [link](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/home_page.dart).
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/testing.md b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/testing.md
deleted file mode 100644
index b388edddad..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/testing.md
+++ /dev/null
@@ -1,145 +0,0 @@
-# Testing
-
-The directory structure of test files mirrors that of the code files, making it easy for us to map a file with the corresponding test and check if the test is updated.
-
-For an overview of testing best practices in Flutter applications, please refer to Flutter's [introduction to widget testing](https://docs.flutter.dev/cookbook/testing/widget/introduction) as well as their [introduction to unit testing](https://docs.flutter.dev/cookbook/testing/unit/introduction).
-There you will learn how to do such things as such as simulate a click as well as leverage the `test` and `expect` functions.
-
-## Testing Basic Editor Functions
-
-The example code below shows how to construct a document that will be used in our testing.
-
-```dart
-const text = 'Welcome to Appflowy 😁';
-// Get the instance of the editor.
-final editor = tester.editor;
-
-// Insert an empty text node.
-editor.insertEmptyTextNode();
-
-// Insert a text node with the text string we defined earlier.
-editor.insertTextNode(text);
-
-// Insert the same text, but with the heading style.
-editor.insertTextNode(text, attributes: {
- BuiltInAttributeKey.subtype: BuiltInAttributeKey.heading,
- BuiltInAttributeKey.heading: BuiltInAttributeKey.h1,
-});
-
-// Insert our text with the bulleted list style and the bold style.
-// If you want to modify the style of the inserted text, you need to use the Delta parameter.
-editor.insertTextNode(
- '',
- attributes: {
- BuiltInAttributeKey.subtype: BuiltInAttributeKey.bulletedList,
- },
- delta: Delta([
- TextInsert(text, {BuiltInAttributeKey.bold: true}),
- ]),
-);
-```
-
-The `startTesting` function of the editor must be called before you begin your test.
-
-```dart
-await editor.startTesting();
-```
-
-Get the number of nodes in the document.
-
-```dart
-final length = editor.documentLength;
-print(length);
-```
-
-Get the node of a defined path. In this case we are getting the first node of the document which is the text "Welcome to Appflowy 😁".
-
-```dart
-final firstTextNode = editor.nodeAtPath([0]) as TextNode;
-```
-
-Update the [Selection](https://github.com/AppFlowy-IO/AppFlowy/blob/main/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/document/selection.dart) so that our text "Welcome to Appflowy 😁" is selected. We will start our selection from the beginning of the string.
-
-```dart
-await editor.updateSelection(
- Selection.single(path: firstTextNode.path, startOffset: 0),
-);
-```
-
-Get the current selection.
-
-```dart
-final selection = editor.documentSelection;
-print(selection);
-```
-
-Next we will simulate the input of a shortcut key being pressed that will select all the text.
-
-```dart
-// Meta + A.
-await editor.pressLogicKey(key: LogicalKeyboardKey.keyA, isMetaPressed: true);
-// Meta + shift + S.
-await editor.pressLogicKey
- key: LogicalKeyboardKey.keyS,
- isMetaPressed: true,
- isShiftPressed: true,
-);
-```
-
-We will then simulate text input.
-
-```dart
-// Insert 'Hello World' at the beginning of the first node.
-editor.insertText(firstTextNode, 'Hello World', 0);
-```
-
-Once the text has been added, we can get information about the text node.
-
-```dart
-// Get the text of the first text node as plain text
-final textAfterInserted = firstTextNode.toRawString();
-print(textAfterInserted);
-// Get the attributes of the text node
-final attributes = firstTextNode.attributes;
-print(attributes);
-```
-
-## A Complete Code Example
-
-In the example code below we are going to test `select_all_handler.dart` by inserting 100 lines of text that read "Welcome to Appflowy 😁" and then simulating the "selectAll" shortcut key being pressed.
-
-Afterwards, we will `expect` that the current selection of the editor is equal to the selection of all the lines that were generated.
-
-```dart
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter_test/flutter_test.dart';
-import '../../infra/test_editor.dart';
-
-void main() async {
- setUpAll(() {
- TestWidgetsFlutterBinding.ensureInitialized();
- });
-
- group('select_all_handler_test.dart', () {
- testWidgets('Presses Command + A in the document', (tester) async {
- const lines = 100;
- const text = 'Welcome to Appflowy 😁';
- final editor = tester.editor;
- for (var i = 0; i < lines; i++) {
- editor.insertTextNode(text);
- }
- await editor.startTesting();
- await editor.pressLogicKey(key: LogicalKeyboardKey.keyA, isMetaPressed: true);
-
- expect(
- editor.documentSelection,
- Selection(
- start: Position(path: [0], offset: 0),
- end: Position(path: [lines - 1], offset: text.length),
- ),
- );
- });
- });
-}
-```
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/translation.md b/frontend/appflowy_flutter/packages/appflowy_editor/documentation/translation.md
deleted file mode 100644
index 8fc26d8012..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/documentation/translation.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Translate AppFlowy Editor
-
-You can help Appflowy Editor in supporting various languages by contributing. Follow the steps below sequentially to contribute translations.
-
-## Steps to modify an existing translation
-Translation files are located in: `frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/`
-1. Install the Visual Studio Code plugin: [Flutter intl](https://marketplace.visualstudio.com/items?itemName=localizely.flutter-intl)
-2. Modify the specific translation file.
-3. Save the file and the translation will be generated automatically.
-
-## Steps to add new language
-Translation files are located in: `frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/`
-1. Install the Visual Studio Code plugin: [Flutter intl](https://marketplace.visualstudio.com/items?itemName=localizely.flutter-intl)
-2. Copy the `intl_en.arb` as a base translation and rename the new file to `intl_.arb`
-3. Modify the new translation file.
-4. Save the file and the translation will be generated automatically.
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/.firebaserc b/frontend/appflowy_flutter/packages/appflowy_editor/example/.firebaserc
deleted file mode 100644
index 06fcc074c4..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/.firebaserc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "projects": {
- "default": "appflowy-editor"
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/.gitignore b/frontend/appflowy_flutter/packages/appflowy_editor/example/.gitignore
deleted file mode 100644
index a8e938c083..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/.gitignore
+++ /dev/null
@@ -1,47 +0,0 @@
-# Miscellaneous
-*.class
-*.log
-*.pyc
-*.swp
-.DS_Store
-.atom/
-.buildlog/
-.history
-.svn/
-migrate_working_dir/
-
-# IntelliJ related
-*.iml
-*.ipr
-*.iws
-.idea/
-
-# The .vscode folder contains launch configuration and tasks you configure in
-# VS Code which you may wish to be included in version control, so this line
-# is commented out by default.
-#.vscode/
-
-# Flutter/Dart/Pub related
-**/doc/api/
-**/ios/Flutter/.last_build_id
-.dart_tool/
-.flutter-plugins
-.flutter-plugins-dependencies
-.packages
-.pub-cache/
-.pub/
-/build/
-
-# Web related
-lib/generated_plugin_registrant.dart
-
-# Symbolication related
-app.*.symbols
-
-# Obfuscation related
-app.*.map.json
-
-# Android Studio will place build artifacts here
-/android/app/debug
-/android/app/profile
-/android/app/release
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/.metadata b/frontend/appflowy_flutter/packages/appflowy_editor/example/.metadata
deleted file mode 100644
index ed0b5185fb..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/.metadata
+++ /dev/null
@@ -1,45 +0,0 @@
-# This file tracks properties of this Flutter project.
-# Used by Flutter tool to assess capabilities and perform upgrades etc.
-#
-# This file should be version controlled.
-
-version:
- revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- channel: stable
-
-project_type: app
-
-# Tracks metadata for the flutter migrate command
-migration:
- platforms:
- - platform: root
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- - platform: android
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- - platform: ios
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- - platform: linux
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- - platform: macos
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- - platform: web
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- - platform: windows
- create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
- base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
-
- # User provided section
-
- # List of Local paths (relative to this file) that should be
- # ignored by the migrate tool.
- #
- # Files that are not part of the templates will be ignored by default.
- unmanaged_files:
- - 'lib/main.dart'
- - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/README.md b/frontend/appflowy_flutter/packages/appflowy_editor/example/README.md
deleted file mode 100644
index 2b3fce4c86..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# example
-
-A new Flutter project.
-
-## Getting Started
-
-This project is a starting point for a Flutter application.
-
-A few resources to get you started if this is your first Flutter project:
-
-- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
-- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
-
-For help getting started with Flutter development, view the
-[online documentation](https://docs.flutter.dev/), which offers tutorials,
-samples, guidance on mobile development, and a full API reference.
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/analysis_options.yaml b/frontend/appflowy_flutter/packages/appflowy_editor/example/analysis_options.yaml
deleted file mode 100644
index 61b6c4de17..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/analysis_options.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-# This file configures the analyzer, which statically analyzes Dart code to
-# check for errors, warnings, and lints.
-#
-# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
-# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
-# invoked from the command line by running `flutter analyze`.
-
-# The following line activates a set of recommended lints for Flutter apps,
-# packages, and plugins designed to encourage good coding practices.
-include: package:flutter_lints/flutter.yaml
-
-linter:
- # The lint rules applied to this project can be customized in the
- # section below to disable rules from the `package:flutter_lints/flutter.yaml`
- # included above or to enable additional rules. A list of all available lints
- # and their documentation is published at
- # https://dart-lang.github.io/linter/lints/index.html.
- #
- # Instead of disabling a lint rule for the entire project in the
- # section below, it can also be suppressed for a single line of code
- # or a specific dart file by using the `// ignore: name_of_lint` and
- # `// ignore_for_file: name_of_lint` syntax on the line or in the file
- # producing the lint.
- rules:
- # avoid_print: false # Uncomment to disable the `avoid_print` rule
- # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
-
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/.gitignore b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/.gitignore
deleted file mode 100644
index 6f568019d3..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-gradle-wrapper.jar
-/.gradle
-/captures/
-/gradlew
-/gradlew.bat
-/local.properties
-GeneratedPluginRegistrant.java
-
-# Remember to never publicly share your keystore.
-# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
-key.properties
-**/*.keystore
-**/*.jks
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/build.gradle b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/build.gradle
deleted file mode 100644
index 0833ecfca8..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/build.gradle
+++ /dev/null
@@ -1,71 +0,0 @@
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
-android {
- compileSdkVersion flutter.compileSdkVersion
- ndkVersion flutter.ndkVersion
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- kotlinOptions {
- jvmTarget = '1.8'
- }
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.example.example"
- // You can update the following values to match your application needs.
- // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
- minSdkVersion flutter.minSdkVersion
- targetSdkVersion flutter.targetSdkVersion
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- }
-
- buildTypes {
- release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
- }
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/debug/AndroidManifest.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/debug/AndroidManifest.xml
deleted file mode 100644
index 45d523a2a2..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/debug/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/AndroidManifest.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 3f41384dbc..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
deleted file mode 100644
index e793a000d6..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.example.example
-
-import io.flutter.embedding.android.FlutterActivity
-
-class MainActivity: FlutterActivity() {
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/drawable-v21/launch_background.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/drawable-v21/launch_background.xml
deleted file mode 100644
index f74085f3f6..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/drawable-v21/launch_background.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/drawable/launch_background.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/drawable/launch_background.xml
deleted file mode 100644
index 304732f884..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/drawable/launch_background.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index db77bb4b7b..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 17987b79bb..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 09d4391482..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index d5f1c8d34e..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4d6372eebd..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/values-night/styles.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/values-night/styles.xml
deleted file mode 100644
index 06952be745..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/values-night/styles.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/values/styles.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/values/styles.xml
deleted file mode 100644
index cb1ef88056..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/profile/AndroidManifest.xml b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/profile/AndroidManifest.xml
deleted file mode 100644
index 45d523a2a2..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/app/src/profile/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/build.gradle b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/build.gradle
deleted file mode 100644
index 83ae220041..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-buildscript {
- ext.kotlin_version = '1.6.10'
- repositories {
- google()
- mavenCentral()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:7.1.2'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
-allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/gradle.properties b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/gradle.properties
deleted file mode 100644
index 94adc3a3f9..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-org.gradle.jvmargs=-Xmx1536M
-android.useAndroidX=true
-android.enableJetifier=true
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/gradle/wrapper/gradle-wrapper.properties b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index cc5527d781..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jun 23 08:50:38 CEST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/settings.gradle b/frontend/appflowy_flutter/packages/appflowy_editor/example/android/settings.gradle
deleted file mode 100644
index 44e62bcf06..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/android/settings.gradle
+++ /dev/null
@@ -1,11 +0,0 @@
-include ':app'
-
-def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
-def properties = new Properties()
-
-assert localPropertiesFile.exists()
-localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
-
-def flutterSdkPath = properties.getProperty("flutter.sdk")
-assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
-apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/assets/example.json b/frontend/appflowy_flutter/packages/appflowy_editor/example/assets/example.json
deleted file mode 100644
index 74c82e3227..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/assets/example.json
+++ /dev/null
@@ -1,101 +0,0 @@
-{
- "document": {
- "type": "editor",
- "children": [
- {
- "type": "text",
- "attributes": {
- "subtype": "heading",
- "heading": "h2"
- },
- "delta": [
- { "insert": "👋 " },
- { "insert": "Welcome to", "attributes": { "bold": true } },
- { "insert": " " },
- {
- "insert": "AppFlowy Editor",
- "attributes": {
- "href": "appflowy.io",
- "italic": true,
- "bold": true
- }
- }
- ]
- },
- { "type": "text", "delta": [] },
- {
- "type": "text",
- "delta": [
- { "insert": "AppFlowy Editor is a" },
- { "insert": " " },
- { "insert": "highly customizable", "attributes": { "bold": true } },
- { "insert": " " },
- { "insert": "rich-text editor", "attributes": { "italic": true } },
- { "insert": " for " },
- { "insert": "Flutter", "attributes": { "underline": true } }
- ]
- },
- {
- "type": "text",
- "attributes": { "checkbox": true, "subtype": "checkbox" },
- "delta": [{ "insert": "Customizable" }]
- },
- {
- "type": "text",
- "attributes": { "checkbox": true, "subtype": "checkbox" },
- "delta": [{ "insert": "Test-covered" }]
- },
- {
- "type": "text",
- "attributes": { "checkbox": false, "subtype": "checkbox" },
- "delta": [{ "insert": "more to come!" }]
- },
- { "type": "text", "delta": [] },
- {
- "type": "text",
- "attributes": { "subtype": "quote" },
- "delta": [{ "insert": "Here is an example you can give a try" }]
- },
- { "type": "text", "delta": [] },
- {
- "type": "text",
- "delta": [
- { "insert": "You can also use " },
- {
- "insert": "AppFlowy Editor",
- "attributes": {
- "italic": true,
- "bold": true,
- "backgroundColor": "0x6000BCF0"
- }
- },
- { "insert": " as a component to build your own app." }
- ]
- },
- { "type": "text", "delta": [] },
- {
- "type": "text",
- "attributes": { "subtype": "bulleted-list" },
- "delta": [{ "insert": "Use / to insert blocks" }]
- },
- {
- "type": "text",
- "attributes": { "subtype": "bulleted-list" },
- "delta": [
- {
- "insert": "Select text to trigger to the toolbar to format your notes."
- }
- ]
- },
- { "type": "text", "delta": [] },
- {
- "type": "text",
- "delta": [
- {
- "insert": "If you have questions or feedback, please submit an issue on Github or join the community along with 1000+ builders!"
- }
- ]
- }
- ]
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/assets/images/icon.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/assets/images/icon.png
deleted file mode 100644
index 95e504908b..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/assets/images/icon.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/firebase.json b/frontend/appflowy_flutter/packages/appflowy_editor/example/firebase.json
deleted file mode 100644
index bba899ee87..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/firebase.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "hosting": {
- "public": "build/web",
- "ignore": [
- "firebase.json",
- "**/.*",
- "**/node_modules/**"
- ],
- "rewrites": [
- {
- "source": "**",
- "destination": "/index.html"
- }
- ],
- "headers": [ {
- "source": "**/*.@(png|jpg|jpeg|gif)",
- "headers": [ {
- "key": "Access-Control-Allow-Origin",
- "value": "*"
- } ]
- } ]
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/.gitignore b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/.gitignore
deleted file mode 100644
index 7a7f9873ad..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/.gitignore
+++ /dev/null
@@ -1,34 +0,0 @@
-**/dgph
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/ephemeral/
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/AppFrameworkInfo.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/AppFrameworkInfo.plist
deleted file mode 100644
index 8d4492f977..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/AppFrameworkInfo.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- App
- CFBundleIdentifier
- io.flutter.flutter.app
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- App
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleSignature
- ????
- CFBundleVersion
- 1.0
- MinimumOSVersion
- 9.0
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/Debug.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/Debug.xcconfig
deleted file mode 100644
index ec97fc6f30..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/Debug.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "Generated.xcconfig"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/Release.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/Release.xcconfig
deleted file mode 100644
index c4855bfe20..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Flutter/Release.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "Generated.xcconfig"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Podfile b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Podfile
deleted file mode 100644
index 1e8c3c90a5..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Podfile
+++ /dev/null
@@ -1,41 +0,0 @@
-# Uncomment this line to define a global platform for your project
-# platform :ios, '9.0'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def flutter_root
- generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
- unless File.exist?(generated_xcode_build_settings_path)
- raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
- end
-
- File.foreach(generated_xcode_build_settings_path) do |line|
- matches = line.match(/FLUTTER_ROOT\=(.*)/)
- return matches[1].strip if matches
- end
- raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
-end
-
-require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
-
-flutter_ios_podfile_setup
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
-end
-
-post_install do |installer|
- installer.pods_project.targets.each do |target|
- flutter_additional_ios_build_settings(target)
- end
-end
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.pbxproj b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.pbxproj
deleted file mode 100644
index 813642b9a4..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,484 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 50;
- objects = {
-
-/* Begin PBXBuildFile section */
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
- 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
- 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
- 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
- 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
- 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 97C146EB1CF9000F007C117D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 9740EEB11CF90186004384FC /* Flutter */ = {
- isa = PBXGroup;
- children = (
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
- 9740EEB21CF90195004384FC /* Debug.xcconfig */,
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
- 9740EEB31CF90195004384FC /* Generated.xcconfig */,
- );
- name = Flutter;
- sourceTree = "";
- };
- 97C146E51CF9000F007C117D = {
- isa = PBXGroup;
- children = (
- 9740EEB11CF90186004384FC /* Flutter */,
- 97C146F01CF9000F007C117D /* Runner */,
- 97C146EF1CF9000F007C117D /* Products */,
- );
- sourceTree = "";
- };
- 97C146EF1CF9000F007C117D /* Products */ = {
- isa = PBXGroup;
- children = (
- 97C146EE1CF9000F007C117D /* Runner.app */,
- );
- name = Products;
- sourceTree = "";
- };
- 97C146F01CF9000F007C117D /* Runner */ = {
- isa = PBXGroup;
- children = (
- 97C146FA1CF9000F007C117D /* Main.storyboard */,
- 97C146FD1CF9000F007C117D /* Assets.xcassets */,
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
- 97C147021CF9000F007C117D /* Info.plist */,
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
- );
- path = Runner;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 97C146ED1CF9000F007C117D /* Runner */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
- buildPhases = (
- 9740EEB61CF901F6004384FC /* Run Script */,
- 97C146EA1CF9000F007C117D /* Sources */,
- 97C146EB1CF9000F007C117D /* Frameworks */,
- 97C146EC1CF9000F007C117D /* Resources */,
- 9705A1C41CF9048500538489 /* Embed Frameworks */,
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = Runner;
- productName = Runner;
- productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 97C146E61CF9000F007C117D /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 1300;
- ORGANIZATIONNAME = "";
- TargetAttributes = {
- 97C146ED1CF9000F007C117D = {
- CreatedOnToolsVersion = 7.3.1;
- LastSwiftMigration = 1100;
- };
- };
- };
- buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
- compatibilityVersion = "Xcode 9.3";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 97C146E51CF9000F007C117D;
- productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 97C146ED1CF9000F007C117D /* Runner */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 97C146EC1CF9000F007C117D /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Thin Binary";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
- };
- 9740EEB61CF901F6004384FC /* Run Script */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Run Script";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 97C146EA1CF9000F007C117D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
- 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C146FB1CF9000F007C117D /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "";
- };
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C147001CF9000F007C117D /* Base */,
- );
- name = LaunchScreen.storyboard;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 249021D3217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Profile;
- };
- 249021D4217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = 446D3AAR7E;
- ENABLE_BITCODE = NO;
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Profile;
- };
- 97C147031CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 97C147041CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 97C147061CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = 446D3AAR7E;
- ENABLE_BITCODE = NO;
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Debug;
- };
- 97C147071CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = 446D3AAR7E;
- ENABLE_BITCODE = NO;
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147031CF9000F007C117D /* Debug */,
- 97C147041CF9000F007C117D /* Release */,
- 249021D3217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147061CF9000F007C117D /* Debug */,
- 97C147071CF9000F007C117D /* Release */,
- 249021D4217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 97C146E61CF9000F007C117D /* Project object */;
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a625..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index f9b0d7c5ea..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- PreviewsEnabled
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
deleted file mode 100644
index c87d15a335..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 1d526a16ed..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index f9b0d7c5ea..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- PreviewsEnabled
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/AppDelegate.swift b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/AppDelegate.swift
deleted file mode 100644
index 70693e4a8c..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/AppDelegate.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import UIKit
-import Flutter
-
-@UIApplicationMain
-@objc class AppDelegate: FlutterAppDelegate {
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index d36b1fab2d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "83.5x83.5",
- "idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
deleted file mode 100644
index dc9ada4725..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 28c6bf0301..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index 2ccbfd967d..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index f091b6b0bc..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index 4cde12118d..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index d0ef06e7ed..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index dcdc2306c2..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index 2ccbfd967d..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index c8f9ed8f5c..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index a6d6b8609d..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index a6d6b8609d..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index 75b2d164a5..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index c4df70d39d..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 6a84f41e14..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index d0e1f58536..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
deleted file mode 100644
index 0bedcf2fd4..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "LaunchImage.png",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@2x.png",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@3x.png",
- "scale" : "3x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
deleted file mode 100644
index 9da19eacad..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
deleted file mode 100644
index 9da19eacad..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
deleted file mode 100644
index 9da19eacad..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
deleted file mode 100644
index 89c2725b70..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
-You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index f2e259c7c9..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Base.lproj/Main.storyboard b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Base.lproj/Main.storyboard
deleted file mode 100644
index f3c28516fb..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Info.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Info.plist
deleted file mode 100644
index 907f329fe0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Info.plist
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Example
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- example
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSRequiresIPhoneOS
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIViewControllerBasedStatusBarAppearance
-
- CADisableMinimumFrameDurationOnPhone
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Runner-Bridging-Header.h b/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Runner-Bridging-Header.h
deleted file mode 100644
index 308a2a560b..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/ios/Runner/Runner-Bridging-Header.h
+++ /dev/null
@@ -1 +0,0 @@
-#import "GeneratedPluginRegistrant.h"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/expandable_floating_action_button.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/expandable_floating_action_button.dart
deleted file mode 100644
index 01da3ab593..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/expandable_floating_action_button.dart
+++ /dev/null
@@ -1,234 +0,0 @@
-import 'dart:math' as math;
-
-import 'package:flutter/material.dart';
-
-// copy from https://docs.flutter.dev/cookbook/effects/expandable-fab
-@immutable
-class ExpandableFab extends StatefulWidget {
- const ExpandableFab({
- super.key,
- this.initialOpen,
- required this.distance,
- required this.children,
- });
-
- final bool? initialOpen;
- final double distance;
- final List children;
-
- @override
- State createState() => _ExpandableFabState();
-}
-
-class _ExpandableFabState extends State
- with SingleTickerProviderStateMixin {
- late final AnimationController _controller;
- late final Animation _expandAnimation;
- bool _open = false;
-
- @override
- void initState() {
- super.initState();
- _open = widget.initialOpen ?? false;
- _controller = AnimationController(
- value: _open ? 1.0 : 0.0,
- duration: const Duration(milliseconds: 250),
- vsync: this,
- );
- _expandAnimation = CurvedAnimation(
- curve: Curves.fastOutSlowIn,
- reverseCurve: Curves.easeOutQuad,
- parent: _controller,
- );
- }
-
- @override
- void dispose() {
- _controller.dispose();
- super.dispose();
- }
-
- void _toggle() {
- setState(() {
- _open = !_open;
- if (_open) {
- _controller.forward();
- } else {
- _controller.reverse();
- }
- });
- }
-
- @override
- Widget build(BuildContext context) {
- return SizedBox.expand(
- child: Stack(
- alignment: Alignment.bottomRight,
- clipBehavior: Clip.none,
- children: [
- _buildTapToCloseFab(),
- ..._buildExpandingActionButtons(),
- _buildTapToOpenFab(),
- ],
- ),
- );
- }
-
- Widget _buildTapToCloseFab() {
- return SizedBox(
- width: 56.0,
- height: 56.0,
- child: Center(
- child: Material(
- shape: const CircleBorder(),
- clipBehavior: Clip.antiAlias,
- elevation: 4.0,
- child: InkWell(
- onTap: _toggle,
- child: Padding(
- padding: const EdgeInsets.all(8.0),
- child: Icon(
- Icons.close,
- color: Theme.of(context).primaryColor,
- ),
- ),
- ),
- ),
- ),
- );
- }
-
- List _buildExpandingActionButtons() {
- final children = [];
- final count = widget.children.length;
- final step = 90.0 / (count - 1);
- for (var i = 0, angleInDegrees = 0.0;
- i < count;
- i++, angleInDegrees += step) {
- children.add(
- _ExpandingActionButton(
- directionInDegrees: angleInDegrees,
- maxDistance: widget.distance,
- progress: _expandAnimation,
- child: widget.children[i],
- ),
- );
- }
- return children;
- }
-
- Widget _buildTapToOpenFab() {
- return IgnorePointer(
- ignoring: _open,
- child: AnimatedContainer(
- transformAlignment: Alignment.center,
- transform: Matrix4.diagonal3Values(
- _open ? 0.7 : 1.0,
- _open ? 0.7 : 1.0,
- 1.0,
- ),
- duration: const Duration(milliseconds: 250),
- curve: const Interval(0.0, 0.5, curve: Curves.easeOut),
- child: AnimatedOpacity(
- opacity: _open ? 0.0 : 1.0,
- curve: const Interval(0.25, 1.0, curve: Curves.easeInOut),
- duration: const Duration(milliseconds: 250),
- child: FloatingActionButton(
- onPressed: _toggle,
- child: const Icon(Icons.create),
- ),
- ),
- ),
- );
- }
-}
-
-@immutable
-class _ExpandingActionButton extends StatelessWidget {
- const _ExpandingActionButton({
- required this.directionInDegrees,
- required this.maxDistance,
- required this.progress,
- required this.child,
- });
-
- final double directionInDegrees;
- final double maxDistance;
- final Animation progress;
- final Widget child;
-
- @override
- Widget build(BuildContext context) {
- return AnimatedBuilder(
- animation: progress,
- builder: (context, child) {
- final offset = Offset.fromDirection(
- directionInDegrees * (math.pi / 180.0),
- progress.value * maxDistance,
- );
- return Positioned(
- right: 4.0 + offset.dx,
- bottom: 4.0 + offset.dy,
- child: Transform.rotate(
- angle: (1.0 - progress.value) * math.pi / 2,
- child: child!,
- ),
- );
- },
- child: FadeTransition(
- opacity: progress,
- child: child,
- ),
- );
- }
-}
-
-@immutable
-class ActionButton extends StatelessWidget {
- const ActionButton({
- super.key,
- this.onPressed,
- required this.icon,
- });
-
- final VoidCallback? onPressed;
- final Widget icon;
-
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
- return Material(
- shape: const CircleBorder(),
- clipBehavior: Clip.antiAlias,
- color: theme.colorScheme.secondary,
- elevation: 4.0,
- child: IconButton(
- onPressed: onPressed,
- icon: icon,
- color: theme.colorScheme.onSecondary,
- ),
- );
- }
-}
-
-@immutable
-class FakeItem extends StatelessWidget {
- const FakeItem({
- super.key,
- required this.isBig,
- });
-
- final bool isBig;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- margin: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 24.0),
- height: isBig ? 128.0 : 36.0,
- decoration: BoxDecoration(
- borderRadius: const BorderRadius.all(Radius.circular(8.0)),
- color: Colors.grey.shade300,
- ),
- );
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/home_page.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/home_page.dart
deleted file mode 100644
index 293d7a6445..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/home_page.dart
+++ /dev/null
@@ -1,379 +0,0 @@
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:example/pages/simple_editor.dart';
-import 'package:example/plugin/AI/text_robot.dart';
-import 'package:file_picker/file_picker.dart';
-import 'package:flutter/foundation.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:google_fonts/google_fonts.dart';
-import 'package:universal_html/html.dart' as html;
-
-enum ExportFileType {
- json,
- markdown,
- html,
- delta,
-}
-
-extension on ExportFileType {
- String get extension {
- switch (this) {
- case ExportFileType.json:
- case ExportFileType.delta:
- return 'json';
- case ExportFileType.markdown:
- return 'md';
- case ExportFileType.html:
- return 'html';
- }
- }
-}
-
-class HomePage extends StatefulWidget {
- const HomePage({Key? key}) : super(key: key);
-
- @override
- State createState() => _HomePageState();
-}
-
-class _HomePageState extends State {
- final _scaffoldKey = GlobalKey();
- late WidgetBuilder _widgetBuilder;
- late EditorState _editorState;
- late Future _jsonString;
- ThemeData _themeData = ThemeData.light().copyWith(
- extensions: [
- ...lightEditorStyleExtension,
- ...lightPluginStyleExtension,
- ],
- );
-
- @override
- void initState() {
- super.initState();
-
- _jsonString = rootBundle.loadString('assets/example.json');
- _widgetBuilder = (context) => SimpleEditor(
- jsonString: _jsonString,
- themeData: _themeData,
- onEditorStateChange: (editorState) {
- _editorState = editorState;
- },
- );
- }
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- key: _scaffoldKey,
- extendBodyBehindAppBar: true,
- drawer: _buildDrawer(context),
- body: _buildBody(context),
- floatingActionButton: _buildFloatingActionButton(context),
- );
- }
-
- Widget _buildDrawer(BuildContext context) {
- return Drawer(
- child: ListView(
- padding: EdgeInsets.zero,
- children: [
- DrawerHeader(
- padding: EdgeInsets.zero,
- margin: EdgeInsets.zero,
- child: Image.asset(
- 'assets/images/icon.png',
- fit: BoxFit.fill,
- ),
- ),
-
- // AppFlowy Editor Demo
- _buildSeparator(context, 'AppFlowy Editor Demo'),
- _buildListTile(context, 'With Example.json', () {
- final jsonString = rootBundle.loadString('assets/example.json');
- _loadEditor(context, jsonString);
- }),
- _buildListTile(context, 'With Empty Document', () {
- final jsonString = Future.value(
- jsonEncode(EditorState.empty().document.toJson()).toString(),
- );
- _loadEditor(context, jsonString);
- }),
-
- // Text Robot
- _buildSeparator(context, 'Text Robot'),
- _buildListTile(context, 'Type Text Automatically', () async {
- final jsonString = Future.value(
- jsonEncode(EditorState.empty().document.toJson()).toString(),
- );
- await _loadEditor(context, jsonString);
-
- Future.delayed(const Duration(seconds: 2), () {
- final textRobot = TextRobot(
- editorState: _editorState,
- );
- textRobot.insertText(
- r'''
-Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC
-"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"
-
-1914 translation by H. Rackham
-"But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?"
-''',
- );
- });
- }),
-
- // Encoder Demo
- _buildSeparator(context, 'Encoder Demo'),
- _buildListTile(context, 'Export To JSON', () {
- _exportFile(_editorState, ExportFileType.json);
- }),
- _buildListTile(context, 'Export to Markdown', () {
- _exportFile(_editorState, ExportFileType.markdown);
- }),
-
- // Decoder Demo
- _buildSeparator(context, 'Decoder Demo'),
- _buildListTile(context, 'Import From JSON', () {
- _importFile(ExportFileType.json);
- }),
- _buildListTile(context, 'Import From Markdown', () {
- _importFile(ExportFileType.markdown);
- }),
- _buildListTile(context, 'Import From Quill Delta', () {
- _importFile(ExportFileType.delta);
- }),
-
- // Theme Demo
- _buildSeparator(context, 'Theme Demo'),
- _buildListTile(context, 'Built In Dark Mode', () {
- _jsonString = Future.value(
- jsonEncode(_editorState.document.toJson()).toString(),
- );
- setState(() {
- _themeData = ThemeData.dark().copyWith(
- extensions: [
- ...darkEditorStyleExtension,
- ...darkPluginStyleExtension,
- ],
- );
- });
- }),
- _buildListTile(context, 'Custom Theme', () {
- _jsonString = Future.value(
- jsonEncode(_editorState.document.toJson()).toString(),
- );
- setState(() {
- _themeData = _customizeEditorTheme(context);
- });
- }),
- ],
- ),
- );
- }
-
- Widget _buildBody(BuildContext context) {
- return _widgetBuilder(context);
- }
-
- Widget _buildListTile(
- BuildContext context,
- String text,
- VoidCallback? onTap,
- ) {
- return ListTile(
- dense: true,
- contentPadding: const EdgeInsets.only(left: 16),
- title: Text(
- text,
- style: const TextStyle(
- color: Colors.blue,
- fontSize: 14,
- ),
- ),
- onTap: () {
- Navigator.pop(context);
- onTap?.call();
- },
- );
- }
-
- Widget _buildSeparator(BuildContext context, String text) {
- return Padding(
- padding: const EdgeInsets.only(left: 16, top: 16, bottom: 4),
- child: Text(
- text,
- style: const TextStyle(
- color: Colors.grey,
- fontSize: 12,
- fontWeight: FontWeight.bold,
- ),
- ),
- );
- }
-
- Widget _buildFloatingActionButton(BuildContext context) {
- return FloatingActionButton(
- onPressed: () {
- _scaffoldKey.currentState?.openDrawer();
- },
- child: const Icon(Icons.menu),
- );
- }
-
- Future _loadEditor(
- BuildContext context,
- Future jsonString,
- ) async {
- final completer = Completer();
- _jsonString = jsonString;
- setState(
- () {
- _widgetBuilder = (context) => SimpleEditor(
- jsonString: _jsonString,
- themeData: _themeData,
- onEditorStateChange: (editorState) {
- _editorState = editorState;
- },
- );
- },
- );
- WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
- completer.complete();
- });
- return completer.future;
- }
-
- void _exportFile(
- EditorState editorState,
- ExportFileType fileType,
- ) async {
- var result = '';
-
- switch (fileType) {
- case ExportFileType.json:
- result = jsonEncode(editorState.document.toJson());
- break;
- case ExportFileType.markdown:
- result = documentToMarkdown(editorState.document);
- break;
- case ExportFileType.html:
- case ExportFileType.delta:
- throw UnimplementedError();
- }
-
- if (!kIsWeb) {
- final path = await FilePicker.platform.saveFile(
- fileName: 'document.${fileType.extension}',
- );
- if (path != null) {
- await File(path).writeAsString(result);
- if (mounted) {
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- content: Text('This document is saved to the $path'),
- ),
- );
- }
- }
- } else {
- final blob = html.Blob([result], 'text/plain', 'native');
- html.AnchorElement(
- href: html.Url.createObjectUrlFromBlob(blob).toString(),
- )
- ..setAttribute('download', 'document.${fileType.extension}')
- ..click();
- }
- }
-
- void _importFile(ExportFileType fileType) async {
- final result = await FilePicker.platform.pickFiles(
- allowMultiple: false,
- allowedExtensions: [fileType.extension],
- type: FileType.custom,
- );
- var plainText = '';
- if (!kIsWeb) {
- final path = result?.files.single.path;
- if (path == null) {
- return;
- }
- plainText = await File(path).readAsString();
- } else {
- final bytes = result?.files.first.bytes;
- if (bytes == null) {
- return;
- }
- plainText = const Utf8Decoder().convert(bytes);
- }
-
- var jsonString = '';
- switch (fileType) {
- case ExportFileType.json:
- jsonString = plainText;
- break;
- case ExportFileType.markdown:
- jsonString = jsonEncode(markdownToDocument(plainText).toJson());
- break;
- case ExportFileType.delta:
- jsonString = jsonEncode(
- DeltaDocumentConvert()
- .convertFromJSON(
- jsonDecode(
- plainText.replaceAll('\\\\\n', '\\n'),
- ),
- )
- .toJson(),
- );
- break;
- case ExportFileType.html:
- throw UnimplementedError();
- }
-
- if (mounted) {
- _loadEditor(context, Future.value(jsonString));
- }
- }
-
- ThemeData _customizeEditorTheme(BuildContext context) {
- final dark = EditorStyle.dark;
- final editorStyle = dark.copyWith(
- padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 150),
- cursorColor: Colors.blue.shade600,
- selectionColor: Colors.yellow.shade600.withOpacity(0.5),
- textStyle: GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.grey,
- ),
- placeholderTextStyle: GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.grey.shade500,
- ),
- code: dark.code?.copyWith(
- backgroundColor: Colors.lightBlue.shade200,
- fontStyle: FontStyle.italic,
- ),
- highlightColorHex: '0x60FF0000', // red
- );
-
- final quote = QuotedTextPluginStyle.dark.copyWith(
- textStyle: (_, __) => GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.blue.shade400,
- fontStyle: FontStyle.italic,
- fontWeight: FontWeight.w700,
- ),
- );
-
- return Theme.of(context).copyWith(extensions: [
- editorStyle,
- ...darkPluginStyleExtension,
- quote,
- ]);
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/main.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/main.dart
deleted file mode 100644
index b98cec364a..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/main.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-import 'package:example/home_page.dart';
-import 'package:flutter/material.dart';
-
-import 'package:flutter_localizations/flutter_localizations.dart';
-
-import 'package:appflowy_editor/appflowy_editor.dart';
-
-void main() {
- runApp(const MyApp());
-}
-
-class MyApp extends StatelessWidget {
- const MyApp({Key? key}) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- return const MaterialApp(
- localizationsDelegates: [
- GlobalMaterialLocalizations.delegate,
- GlobalCupertinoLocalizations.delegate,
- GlobalWidgetsLocalizations.delegate,
- AppFlowyEditorLocalizations.delegate,
- ],
- supportedLocales: [Locale('en', 'US')],
- debugShowCheckedModeBanner: false,
- home: MyHomePage(title: 'AppFlowyEditor Example'),
- );
- }
-}
-
-class MyHomePage extends StatefulWidget {
- const MyHomePage({Key? key, required this.title}) : super(key: key);
- final String title;
-
- @override
- State createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State {
- @override
- Widget build(BuildContext context) {
- return const HomePage();
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/pages/simple_editor.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/pages/simple_editor.dart
deleted file mode 100644
index 9d7aebf7ff..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/pages/simple_editor.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-import 'dart:convert';
-
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:appflowy_editor_plugins/appflowy_editor_plugins.dart';
-import 'package:example/plugin/AI/continue_to_write.dart';
-import 'package:example/plugin/AI/auto_completion.dart';
-import 'package:example/plugin/AI/gpt3.dart';
-import 'package:example/plugin/AI/smart_edit.dart';
-import 'package:flutter/material.dart';
-
-class SimpleEditor extends StatelessWidget {
- const SimpleEditor({
- super.key,
- required this.jsonString,
- required this.themeData,
- required this.onEditorStateChange,
- });
-
- final Future jsonString;
- final ThemeData themeData;
- final void Function(EditorState editorState) onEditorStateChange;
-
- @override
- Widget build(BuildContext context) {
- return FutureBuilder(
- future: jsonString,
- builder: (context, snapshot) {
- if (snapshot.hasData &&
- snapshot.connectionState == ConnectionState.done) {
- final editorState = EditorState(
- document: Document.fromJson(
- Map.from(
- json.decode(snapshot.data!),
- ),
- ),
- );
- editorState.logConfiguration
- ..handler = debugPrint
- ..level = LogLevel.all;
- onEditorStateChange(editorState);
-
- return AppFlowyEditor(
- editorState: editorState,
- themeData: themeData,
- autoFocus: editorState.document.isEmpty,
- customBuilders: {
- // Divider
- kDividerType: DividerWidgetBuilder(),
- // Math Equation
- kMathEquationType: MathEquationNodeWidgetBuidler(),
- // Code Block
- kCodeBlockType: CodeBlockNodeWidgetBuilder(),
- },
- shortcutEvents: [
- // Divider
- insertDividerEvent,
- // Code Block
- enterInCodeBlock,
- ignoreKeysInCodeBlock,
- pasteInCodeBlock,
- ],
- selectionMenuItems: [
- // Divider
- dividerMenuItem,
- // Math Equation
- mathEquationMenuItem,
- // Code Block
- codeBlockMenuItem,
- // Emoji
- emojiMenuItem,
- // Open AI
- if (apiKey.isNotEmpty) ...[
- autoCompletionMenuItem,
- continueToWriteMenuItem,
- ]
- ],
- toolbarItems: [
- smartEditItem,
- ],
- );
- } else {
- return const Center(
- child: CircularProgressIndicator(),
- );
- }
- },
- );
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/auto_completion.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/auto_completion.dart
deleted file mode 100644
index e90f8bd3d2..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/auto_completion.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:example/plugin/AI/gpt3.dart';
-import 'package:example/plugin/AI/text_robot.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-
-SelectionMenuItem autoCompletionMenuItem = SelectionMenuItem(
- name: 'Auto generate content',
- icon: (editorState, onSelected) => Icon(
- Icons.rocket,
- size: 18.0,
- color: onSelected
- ? editorState.editorStyle.selectionMenuItemSelectedIconColor
- : editorState.editorStyle.selectionMenuItemIconColor,
- ),
- keywords: ['auto generate content', 'open ai', 'gpt3', 'ai'],
- handler: ((editorState, menuService, context) async {
- showDialog(
- context: context,
- builder: (context) {
- final controller = TextEditingController(text: '');
- return AlertDialog(
- content: RawKeyboardListener(
- focusNode: FocusNode(),
- child: TextField(
- autofocus: true,
- controller: controller,
- maxLines: null,
- decoration: const InputDecoration(
- border: OutlineInputBorder(),
- hintText: 'Please input something...',
- ),
- ),
- onKey: (key) {
- if (key is! RawKeyDownEvent) return;
- if (key.logicalKey == LogicalKeyboardKey.enter) {
- Navigator.of(context).pop();
- // fetch the result and insert it
- final textRobot = TextRobot(editorState: editorState);
- const gpt3 = GPT3APIClient(apiKey: apiKey);
- gpt3.getGPT3Completion(
- controller.text,
- '',
- onResult: (result) async {
- await textRobot.insertText(
- result,
- inputType: TextRobotInputType.character,
- );
- },
- onError: () async {},
- );
- } else if (key.logicalKey == LogicalKeyboardKey.escape) {
- Navigator.of(context).pop();
- }
- },
- ),
- );
- },
- );
- }),
-);
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/continue_to_write.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/continue_to_write.dart
deleted file mode 100644
index 4e0b2ec100..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/continue_to_write.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:example/plugin/AI/gpt3.dart';
-import 'package:example/plugin/AI/text_robot.dart';
-import 'package:flutter/material.dart';
-
-SelectionMenuItem continueToWriteMenuItem = SelectionMenuItem(
- name: 'Continue To Write',
- icon: (editorState, onSelected) => Icon(
- Icons.print,
- size: 18.0,
- color: onSelected
- ? editorState.editorStyle.selectionMenuItemSelectedIconColor
- : editorState.editorStyle.selectionMenuItemIconColor,
- ),
- keywords: ['continue to write'],
- handler: ((editorState, menuService, context) async {
- // Two cases
- // 1. if there is content in the text node where the cursor is located,
- // then we use the current text content as data.
- // 2. if there is no content in the text node where the cursor is located,
- // then we use the previous / next text node's content as data.
-
- final selection =
- editorState.service.selectionService.currentSelection.value;
- if (selection == null || !selection.isCollapsed) {
- return;
- }
-
- final textNodes = editorState.service.selectionService.currentSelectedNodes
- .whereType();
- if (textNodes.isEmpty) {
- return;
- }
-
- final textRobot = TextRobot(editorState: editorState);
- const gpt3 = GPT3APIClient(apiKey: apiKey);
- final textNode = textNodes.first;
-
- var prompt = '';
- var suffix = '';
-
- void continueToWriteInSingleLine() {
- prompt = textNode.delta.slice(0, selection.startIndex).toPlainText();
- suffix = textNode.delta
- .slice(
- selection.endIndex,
- textNode.toPlainText().length,
- )
- .toPlainText();
- }
-
- void continueToWriteInMulitLines() {
- final parent = textNode.parent;
- if (parent != null) {
- for (final node in parent.children) {
- if (node is! TextNode || node.toPlainText().isEmpty) continue;
- if (node.path < textNode.path) {
- prompt += '${node.toPlainText()}\n';
- } else if (node.path > textNode.path) {
- suffix += '${node.toPlainText()}\n';
- }
- }
- }
- }
-
- if (textNodes.first.toPlainText().isNotEmpty) {
- continueToWriteInSingleLine();
- } else {
- continueToWriteInMulitLines();
- }
-
- if (prompt.isEmpty && suffix.isEmpty) {
- return;
- }
-
- late final BuildContext diglogContext;
-
- showDialog(
- context: context,
- builder: (context) {
- diglogContext = context;
- return AlertDialog(
- content: Column(
- mainAxisSize: MainAxisSize.min,
- children: const [
- CircularProgressIndicator(),
- SizedBox(height: 10),
- Text('Loading'),
- ],
- ),
- );
- },
- );
-
- gpt3.getGPT3Completion(
- prompt,
- suffix,
- onResult: (result) async {
- Navigator.of(diglogContext).pop(true);
- await textRobot.insertText(
- result,
- inputType: TextRobotInputType.word,
- );
- },
- onError: () async {
- Navigator.of(diglogContext).pop(true);
- },
- );
- }),
-);
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/gpt3.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/gpt3.dart
deleted file mode 100644
index a63f47ba3d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/gpt3.dart
+++ /dev/null
@@ -1,119 +0,0 @@
-import 'package:http/http.dart' as http;
-import 'dart:async';
-import 'dart:convert';
-
-// Please fill in your own API key
-const apiKey = '';
-
-enum GPT3API {
- completion,
- edit,
-}
-
-extension on GPT3API {
- Uri get uri {
- switch (this) {
- case GPT3API.completion:
- return Uri.parse('https://api.openai.com/v1/completions');
- case GPT3API.edit:
- return Uri.parse('https://api.openai.com/v1/edits');
- }
- }
-}
-
-class GPT3APIClient {
- const GPT3APIClient({
- required this.apiKey,
- });
-
- final String apiKey;
-
- /// Get completions from GPT-3
- ///
- /// [prompt] is the prompt text
- /// [suffix] is the suffix text
- /// [onResult] is the callback function to handle the result
- /// [maxTokens] is the maximum number of tokens to generate
- /// [temperature] is the temperature of the model
- ///
- /// See https://beta.openai.com/docs/api-reference/completions/create
- Future getGPT3Completion(
- String prompt,
- String suffix, {
- required Future Function(String result) onResult,
- required Future Function() onError,
- int maxTokens = 200,
- double temperature = .3,
- }) async {
- final data = {
- 'model': 'text-davinci-003',
- 'prompt': prompt,
- 'suffix': suffix,
- 'max_tokens': maxTokens,
- 'temperature': temperature,
- 'stream': false,
- };
-
- final headers = {
- 'Authorization': apiKey,
- 'Content-Type': 'application/json',
- };
-
- final response = await http.post(
- GPT3API.completion.uri,
- headers: headers,
- body: json.encode(data),
- );
-
- if (response.statusCode == 200) {
- final result = json.decode(response.body);
- final choices = result['choices'];
- if (choices != null && choices is List) {
- for (final choice in choices) {
- final text = choice['text'];
- await onResult(text);
- }
- }
- } else {
- await onError();
- }
- }
-
- Future getGPT3Edit(
- String apiKey,
- String input,
- String instruction, {
- required Future Function(List result) onResult,
- required Future Function() onError,
- int n = 1,
- double temperature = .3,
- }) async {
- final data = {
- 'model': 'text-davinci-edit-001',
- 'input': input,
- 'instruction': instruction,
- 'temperature': temperature,
- 'n': n,
- };
-
- final headers = {
- 'Authorization': apiKey,
- 'Content-Type': 'application/json',
- };
-
- final response = await http.post(
- Uri.parse('https://api.openai.com/v1/edits'),
- headers: headers,
- body: json.encode(data),
- );
- if (response.statusCode == 200) {
- final result = json.decode(response.body);
- final choices = result['choices'];
- if (choices != null && choices is List) {
- await onResult(choices.map((e) => e['text'] as String).toList());
- }
- } else {
- await onError();
- }
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/smart_edit.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/smart_edit.dart
deleted file mode 100644
index 49084cdd9d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/smart_edit.dart
+++ /dev/null
@@ -1,200 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:example/plugin/AI/gpt3.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-
-ToolbarItem smartEditItem = ToolbarItem(
- id: 'appflowy.toolbar.smart_edit',
- type: 5,
- iconBuilder: (isHighlight) {
- return Icon(
- Icons.edit,
- color: isHighlight ? Colors.lightBlue : Colors.white,
- size: 14,
- );
- },
- validator: (editorState) {
- final nodes = editorState.service.selectionService.currentSelectedNodes;
- return nodes.whereType().length == nodes.length &&
- 1 == nodes.length;
- },
- highlightCallback: (_) => false,
- tooltipsMessage: 'Smart Edit',
- handler: (editorState, context) {
- showDialog(
- context: context,
- builder: (context) {
- return AlertDialog(
- content: SmartEditWidget(
- editorState: editorState,
- ),
- );
- },
- );
- },
-);
-
-class SmartEditWidget extends StatefulWidget {
- const SmartEditWidget({
- super.key,
- required this.editorState,
- });
-
- final EditorState editorState;
-
- @override
- State createState() => _SmartEditWidgetState();
-}
-
-class _SmartEditWidgetState extends State {
- final inputEventController = TextEditingController(text: '');
- final resultController = TextEditingController(text: '');
-
- var result = '';
-
- final gpt3 = const GPT3APIClient(apiKey: apiKey);
-
- Iterable get currentSelectedTextNodes =>
- widget.editorState.service.selectionService.currentSelectedNodes
- .whereType();
- Selection? get currentSelection =>
- widget.editorState.service.selectionService.currentSelection.value;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- constraints: const BoxConstraints(maxWidth: 400),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisSize: MainAxisSize.min,
- children: [
- RawKeyboardListener(
- focusNode: FocusNode(),
- child: TextField(
- autofocus: true,
- controller: inputEventController,
- maxLines: null,
- decoration: const InputDecoration(
- border: OutlineInputBorder(),
- hintText: 'Describe how you\'d like AppFlowy to edit this text',
- ),
- ),
- onKey: (key) {
- if (key is! RawKeyDownEvent) return;
- if (key.logicalKey == LogicalKeyboardKey.enter) {
- _requestGPT3EditResult();
- } else if (key.logicalKey == LogicalKeyboardKey.escape) {
- Navigator.of(context).pop();
- }
- },
- ),
- if (result.isNotEmpty) ...[
- const SizedBox(height: 20),
- const Text(
- 'Result: ',
- style: TextStyle(color: Colors.grey),
- ),
- const SizedBox(height: 10),
- SizedBox(
- height: 300,
- child: TextField(
- controller: resultController..text = result,
- maxLines: null,
- decoration: const InputDecoration(
- border: OutlineInputBorder(),
- hintText:
- 'Describe how you\'d like AppFlowy to edit this text',
- ),
- ),
- ),
- const SizedBox(height: 10),
- Row(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- TextButton(
- onPressed: () {
- Navigator.of(context).pop();
- },
- child: const Text('Cancel'),
- ),
- TextButton(
- onPressed: () {
- Navigator.of(context).pop();
-
- // replace the text
- final selection = currentSelection;
- if (selection != null) {
- assert(selection.isSingle);
- final transaction = widget.editorState.transaction;
- transaction.replaceText(
- currentSelectedTextNodes.first,
- selection.startIndex,
- selection.length,
- resultController.text,
- );
- widget.editorState.apply(transaction);
- }
- },
- child: const Text('Replace'),
- ),
- ],
- ),
- ]
- ],
- ),
- );
- }
-
- void _requestGPT3EditResult() {
- final selection =
- widget.editorState.service.selectionService.currentSelection.value;
- if (selection == null || !selection.isSingle) {
- return;
- }
- final text =
- widget.editorState.service.selectionService.currentSelectedNodes
- .whereType()
- .first
- .delta
- .slice(
- selection.startIndex,
- selection.endIndex,
- )
- .toPlainText();
- if (text.isEmpty) {
- Navigator.of(context).pop();
- return;
- }
-
- showDialog(
- context: context,
- builder: (context) {
- return AlertDialog(
- content: Column(
- mainAxisSize: MainAxisSize.min,
- children: const [
- CircularProgressIndicator(),
- SizedBox(height: 10),
- Text('Loading'),
- ],
- ),
- );
- },
- );
-
- gpt3.getGPT3Edit(
- apiKey,
- text,
- inputEventController.text,
- onResult: (result) async {
- Navigator.of(context).pop(true);
- setState(() {
- this.result = result.join('\n').trim();
- });
- },
- onError: () async {
- Navigator.of(context).pop(true);
- },
- );
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/text_robot.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/text_robot.dart
deleted file mode 100644
index a3ac4adb58..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/AI/text_robot.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-
-enum TextRobotInputType {
- character,
- word,
-}
-
-class TextRobot {
- const TextRobot({
- required this.editorState,
- this.delay = const Duration(milliseconds: 30),
- });
-
- final EditorState editorState;
- final Duration delay;
-
- Future insertText(
- String text, {
- TextRobotInputType inputType = TextRobotInputType.character,
- }) async {
- final lines = text.split('\n');
- for (final line in lines) {
- if (line.isEmpty) continue;
- switch (inputType) {
- case TextRobotInputType.character:
- final iterator = line.runes.iterator;
- while (iterator.moveNext()) {
- await editorState.insertTextAtCurrentSelection(
- iterator.currentAsString,
- );
- await Future.delayed(delay, () {});
- }
- break;
- case TextRobotInputType.word:
- final words = line.split(' ').map((e) => '$e ');
- for (final word in words) {
- await editorState.insertTextAtCurrentSelection(
- word,
- );
- await Future.delayed(delay, () {});
- }
- break;
- }
-
- // insert new line
- if (lines.length > 1) {
- await editorState.insertNewLineAtCurrentSelection();
- }
- }
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/editor_theme.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/editor_theme.dart
deleted file mode 100644
index be84ae38f9..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/editor_theme.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:flutter/material.dart';
-import 'package:google_fonts/google_fonts.dart';
-
-ThemeData customizeEditorTheme(BuildContext context) {
- final dark = EditorStyle.dark;
- final editorStyle = dark.copyWith(
- padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 150),
- cursorColor: Colors.red.shade600,
- selectionColor: Colors.yellow.shade600.withOpacity(0.5),
- textStyle: GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.white,
- ),
- placeholderTextStyle: GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.grey.shade400,
- ),
- code: dark.code?.copyWith(
- backgroundColor: Colors.lightBlue.shade200,
- fontStyle: FontStyle.italic,
- ),
- highlightColorHex: '0x60FF0000', // red
- );
-
- final quote = QuotedTextPluginStyle.dark.copyWith(
- textStyle: (_, __) => GoogleFonts.poppins().copyWith(
- fontSize: 14,
- color: Colors.blue.shade400,
- fontStyle: FontStyle.italic,
- fontWeight: FontWeight.w700,
- ),
- );
-
- return Theme.of(context).copyWith(extensions: [
- editorStyle,
- ...darkPluginStyleExtension,
- quote,
- ]);
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/network_image_node_widget.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/network_image_node_widget.dart
deleted file mode 100644
index 395fc175f4..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/lib/plugin/network_image_node_widget.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-import 'package:flutter/material.dart';
-
-class NetworkImageNodeWidgetBuilder extends NodeWidgetBuilder {
- @override
- Widget build(NodeWidgetContext context) {
- return _NetworkImageNodeWidget(
- key: context.node.key,
- node: context.node,
- );
- }
-
- @override
- NodeValidator get nodeValidator => (node) {
- return node.type == 'network_image' &&
- node.attributes['network_image_src'] is String;
- };
-}
-
-class _NetworkImageNodeWidget extends StatefulWidget {
- const _NetworkImageNodeWidget({
- Key? key,
- required this.node,
- }) : super(key: key);
-
- final Node node;
-
- @override
- State<_NetworkImageNodeWidget> createState() =>
- __NetworkImageNodeWidgetState();
-}
-
-class __NetworkImageNodeWidgetState extends State<_NetworkImageNodeWidget>
- with SelectableMixin {
- RenderBox get _renderBox => context.findRenderObject() as RenderBox;
-
- @override
- Widget build(BuildContext context) {
- return Image.network(
- widget.node.attributes['network_image_src'],
- height: 200,
- loadingBuilder: (context, child, loadingProgress) =>
- loadingProgress == null ? child : const CircularProgressIndicator(),
- );
- }
-
- @override
- Position start() => Position(path: widget.node.path, offset: 0);
-
- @override
- Position end() => Position(path: widget.node.path, offset: 1);
-
- @override
- Position getPositionInOffset(Offset start) => end();
-
- @override
- List getRectsInSelection(Selection selection) =>
- [Offset.zero & _renderBox.size];
-
- @override
- Selection getSelectionInRange(Offset start, Offset end) => Selection.single(
- path: widget.node.path,
- startOffset: 0,
- endOffset: 1,
- );
-
- @override
- Offset localToGlobal(Offset offset) => _renderBox.localToGlobal(offset);
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/.gitignore b/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/.gitignore
deleted file mode 100644
index d3896c9844..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-flutter/ephemeral
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/CMakeLists.txt b/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/CMakeLists.txt
deleted file mode 100644
index 74c66dd446..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/CMakeLists.txt
+++ /dev/null
@@ -1,138 +0,0 @@
-# Project-level configuration.
-cmake_minimum_required(VERSION 3.10)
-project(runner LANGUAGES CXX)
-
-# The name of the executable created for the application. Change this to change
-# the on-disk name of your application.
-set(BINARY_NAME "example")
-# The unique GTK application identifier for this application. See:
-# https://wiki.gnome.org/HowDoI/ChooseApplicationID
-set(APPLICATION_ID "com.example.example")
-
-# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
-# versions of CMake.
-cmake_policy(SET CMP0063 NEW)
-
-# Load bundled libraries from the lib/ directory relative to the binary.
-set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
-
-# Root filesystem for cross-building.
-if(FLUTTER_TARGET_PLATFORM_SYSROOT)
- set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
- set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
- set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
- set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
- set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
- set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
-endif()
-
-# Define build configuration options.
-if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
- set(CMAKE_BUILD_TYPE "Debug" CACHE
- STRING "Flutter build mode" FORCE)
- set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
- "Debug" "Profile" "Release")
-endif()
-
-# Compilation settings that should be applied to most targets.
-#
-# Be cautious about adding new options here, as plugins use this function by
-# default. In most cases, you should add new options to specific targets instead
-# of modifying this function.
-function(APPLY_STANDARD_SETTINGS TARGET)
- target_compile_features(${TARGET} PUBLIC cxx_std_14)
- target_compile_options(${TARGET} PRIVATE -Wall -Werror)
- target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
- target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
-endfunction()
-
-# Flutter library and tool build rules.
-set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
-add_subdirectory(${FLUTTER_MANAGED_DIR})
-
-# System-level dependencies.
-find_package(PkgConfig REQUIRED)
-pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
-
-add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
-
-# Define the application target. To change its name, change BINARY_NAME above,
-# not the value here, or `flutter run` will no longer work.
-#
-# Any new source files that you add to the application should be added here.
-add_executable(${BINARY_NAME}
- "main.cc"
- "my_application.cc"
- "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
-)
-
-# Apply the standard set of build settings. This can be removed for applications
-# that need different build settings.
-apply_standard_settings(${BINARY_NAME})
-
-# Add dependency libraries. Add any application-specific dependencies here.
-target_link_libraries(${BINARY_NAME} PRIVATE flutter)
-target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
-
-# Run the Flutter tool portions of the build. This must not be removed.
-add_dependencies(${BINARY_NAME} flutter_assemble)
-
-# Only the install-generated bundle's copy of the executable will launch
-# correctly, since the resources must in the right relative locations. To avoid
-# people trying to run the unbundled copy, put it in a subdirectory instead of
-# the default top-level location.
-set_target_properties(${BINARY_NAME}
- PROPERTIES
- RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
-)
-
-# Generated plugin build rules, which manage building the plugins and adding
-# them to the application.
-include(flutter/generated_plugins.cmake)
-
-
-# === Installation ===
-# By default, "installing" just makes a relocatable bundle in the build
-# directory.
-set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
-if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
- set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
-endif()
-
-# Start with a clean build bundle directory every time.
-install(CODE "
- file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
- " COMPONENT Runtime)
-
-set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
-set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
-
-install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
- COMPONENT Runtime)
-
-install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
- COMPONENT Runtime)
-
-install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
- COMPONENT Runtime)
-
-foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
- install(FILES "${bundled_library}"
- DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
- COMPONENT Runtime)
-endforeach(bundled_library)
-
-# Fully re-copy the assets directory on each build to avoid having stale files
-# from a previous install.
-set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
-install(CODE "
- file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
- " COMPONENT Runtime)
-install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
- DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
-
-# Install the AOT library on non-Debug builds only.
-if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
- install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
- COMPONENT Runtime)
-endif()
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/flutter/CMakeLists.txt b/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/flutter/CMakeLists.txt
deleted file mode 100644
index d5bd01648a..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/flutter/CMakeLists.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-# This file controls Flutter-level build steps. It should not be edited.
-cmake_minimum_required(VERSION 3.10)
-
-set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
-
-# Configuration provided via flutter tool.
-include(${EPHEMERAL_DIR}/generated_config.cmake)
-
-# TODO: Move the rest of this into files in ephemeral. See
-# https://github.com/flutter/flutter/issues/57146.
-
-# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
-# which isn't available in 3.10.
-function(list_prepend LIST_NAME PREFIX)
- set(NEW_LIST "")
- foreach(element ${${LIST_NAME}})
- list(APPEND NEW_LIST "${PREFIX}${element}")
- endforeach(element)
- set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
-endfunction()
-
-# === Flutter Library ===
-# System-level dependencies.
-find_package(PkgConfig REQUIRED)
-pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
-pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
-pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
-
-set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
-
-# Published to parent scope for install step.
-set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
-set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
-set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
-set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
-
-list(APPEND FLUTTER_LIBRARY_HEADERS
- "fl_basic_message_channel.h"
- "fl_binary_codec.h"
- "fl_binary_messenger.h"
- "fl_dart_project.h"
- "fl_engine.h"
- "fl_json_message_codec.h"
- "fl_json_method_codec.h"
- "fl_message_codec.h"
- "fl_method_call.h"
- "fl_method_channel.h"
- "fl_method_codec.h"
- "fl_method_response.h"
- "fl_plugin_registrar.h"
- "fl_plugin_registry.h"
- "fl_standard_message_codec.h"
- "fl_standard_method_codec.h"
- "fl_string_codec.h"
- "fl_value.h"
- "fl_view.h"
- "flutter_linux.h"
-)
-list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
-add_library(flutter INTERFACE)
-target_include_directories(flutter INTERFACE
- "${EPHEMERAL_DIR}"
-)
-target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
-target_link_libraries(flutter INTERFACE
- PkgConfig::GTK
- PkgConfig::GLIB
- PkgConfig::GIO
-)
-add_dependencies(flutter flutter_assemble)
-
-# === Flutter tool backend ===
-# _phony_ is a non-existent file to force this command to run every time,
-# since currently there's no way to get a full input/output list from the
-# flutter tool.
-add_custom_command(
- OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
- ${CMAKE_CURRENT_BINARY_DIR}/_phony_
- COMMAND ${CMAKE_COMMAND} -E env
- ${FLUTTER_TOOL_ENVIRONMENT}
- "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
- ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
- VERBATIM
-)
-add_custom_target(flutter_assemble DEPENDS
- "${FLUTTER_LIBRARY}"
- ${FLUTTER_LIBRARY_HEADERS}
-)
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/main.cc b/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/main.cc
deleted file mode 100644
index e7c5c54370..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/main.cc
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "my_application.h"
-
-int main(int argc, char** argv) {
- g_autoptr(MyApplication) app = my_application_new();
- return g_application_run(G_APPLICATION(app), argc, argv);
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/my_application.cc b/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/my_application.cc
deleted file mode 100644
index 0ba8f43096..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/my_application.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-#include "my_application.h"
-
-#include
-#ifdef GDK_WINDOWING_X11
-#include
-#endif
-
-#include "flutter/generated_plugin_registrant.h"
-
-struct _MyApplication {
- GtkApplication parent_instance;
- char** dart_entrypoint_arguments;
-};
-
-G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
-
-// Implements GApplication::activate.
-static void my_application_activate(GApplication* application) {
- MyApplication* self = MY_APPLICATION(application);
- GtkWindow* window =
- GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
-
- // Use a header bar when running in GNOME as this is the common style used
- // by applications and is the setup most users will be using (e.g. Ubuntu
- // desktop).
- // If running on X and not using GNOME then just use a traditional title bar
- // in case the window manager does more exotic layout, e.g. tiling.
- // If running on Wayland assume the header bar will work (may need changing
- // if future cases occur).
- gboolean use_header_bar = TRUE;
-#ifdef GDK_WINDOWING_X11
- GdkScreen* screen = gtk_window_get_screen(window);
- if (GDK_IS_X11_SCREEN(screen)) {
- const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
- if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
- use_header_bar = FALSE;
- }
- }
-#endif
- if (use_header_bar) {
- GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
- gtk_widget_show(GTK_WIDGET(header_bar));
- gtk_header_bar_set_title(header_bar, "example");
- gtk_header_bar_set_show_close_button(header_bar, TRUE);
- gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
- } else {
- gtk_window_set_title(window, "example");
- }
-
- gtk_window_set_default_size(window, 1280, 720);
- gtk_widget_show(GTK_WIDGET(window));
-
- g_autoptr(FlDartProject) project = fl_dart_project_new();
- fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
-
- FlView* view = fl_view_new(project);
- gtk_widget_show(GTK_WIDGET(view));
- gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
-
- fl_register_plugins(FL_PLUGIN_REGISTRY(view));
-
- gtk_widget_grab_focus(GTK_WIDGET(view));
-}
-
-// Implements GApplication::local_command_line.
-static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
- MyApplication* self = MY_APPLICATION(application);
- // Strip out the first argument as it is the binary name.
- self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
-
- g_autoptr(GError) error = nullptr;
- if (!g_application_register(application, nullptr, &error)) {
- g_warning("Failed to register: %s", error->message);
- *exit_status = 1;
- return TRUE;
- }
-
- g_application_activate(application);
- *exit_status = 0;
-
- return TRUE;
-}
-
-// Implements GObject::dispose.
-static void my_application_dispose(GObject* object) {
- MyApplication* self = MY_APPLICATION(object);
- g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
- G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
-}
-
-static void my_application_class_init(MyApplicationClass* klass) {
- G_APPLICATION_CLASS(klass)->activate = my_application_activate;
- G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
- G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
-}
-
-static void my_application_init(MyApplication* self) {}
-
-MyApplication* my_application_new() {
- return MY_APPLICATION(g_object_new(my_application_get_type(),
- "application-id", APPLICATION_ID,
- "flags", G_APPLICATION_NON_UNIQUE,
- nullptr));
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/my_application.h b/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/my_application.h
deleted file mode 100644
index 72271d5e41..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/linux/my_application.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef FLUTTER_MY_APPLICATION_H_
-#define FLUTTER_MY_APPLICATION_H_
-
-#include
-
-G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
- GtkApplication)
-
-/**
- * my_application_new:
- *
- * Creates a new Flutter-based application.
- *
- * Returns: a new #MyApplication.
- */
-MyApplication* my_application_new();
-
-#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/.gitignore b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/.gitignore
deleted file mode 100644
index 746adbb6b9..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-# Flutter-related
-**/Flutter/ephemeral/
-**/Pods/
-
-# Xcode-related
-**/dgph
-**/xcuserdata/
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Flutter/Flutter-Debug.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Flutter/Flutter-Debug.xcconfig
deleted file mode 100644
index 4b81f9b2d2..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Flutter/Flutter-Debug.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Flutter/Flutter-Release.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Flutter/Flutter-Release.xcconfig
deleted file mode 100644
index 5caa9d1579..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Flutter/Flutter-Release.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Podfile b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Podfile
deleted file mode 100644
index dade8dfad0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Podfile
+++ /dev/null
@@ -1,40 +0,0 @@
-platform :osx, '10.11'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def flutter_root
- generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
- unless File.exist?(generated_xcode_build_settings_path)
- raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
- end
-
- File.foreach(generated_xcode_build_settings_path) do |line|
- matches = line.match(/FLUTTER_ROOT\=(.*)/)
- return matches[1].strip if matches
- end
- raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
-end
-
-require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
-
-flutter_macos_podfile_setup
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
-end
-
-post_install do |installer|
- installer.pods_project.targets.each do |target|
- flutter_additional_macos_build_settings(target)
- end
-end
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Podfile.lock b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Podfile.lock
deleted file mode 100644
index cacc879cd6..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Podfile.lock
+++ /dev/null
@@ -1,48 +0,0 @@
-PODS:
- - flowy_infra_ui (0.0.1):
- - FlutterMacOS
- - FlutterMacOS (1.0.0)
- - path_provider_foundation (0.0.1):
- - Flutter
- - FlutterMacOS
- - rich_clipboard_macos (0.0.1):
- - FlutterMacOS
- - shared_preferences_foundation (0.0.1):
- - Flutter
- - FlutterMacOS
- - url_launcher_macos (0.0.1):
- - FlutterMacOS
-
-DEPENDENCIES:
- - flowy_infra_ui (from `Flutter/ephemeral/.symlinks/plugins/flowy_infra_ui/macos`)
- - FlutterMacOS (from `Flutter/ephemeral`)
- - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos`)
- - rich_clipboard_macos (from `Flutter/ephemeral/.symlinks/plugins/rich_clipboard_macos/macos`)
- - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos`)
- - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
-
-EXTERNAL SOURCES:
- flowy_infra_ui:
- :path: Flutter/ephemeral/.symlinks/plugins/flowy_infra_ui/macos
- FlutterMacOS:
- :path: Flutter/ephemeral
- path_provider_foundation:
- :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/macos
- rich_clipboard_macos:
- :path: Flutter/ephemeral/.symlinks/plugins/rich_clipboard_macos/macos
- shared_preferences_foundation:
- :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/macos
- url_launcher_macos:
- :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
-
-SPEC CHECKSUMS:
- flowy_infra_ui: c34d49d615ed9fe552cd47f90d7850815a74e9e9
- FlutterMacOS: ae6af50a8ea7d6103d888583d46bd8328a7e9811
- path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
- rich_clipboard_macos: 43364b66b9dc69d203eb8dd6d758e2d12e02723c
- shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
- url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451
-
-PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
-
-COCOAPODS: 1.11.3
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/project.pbxproj b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/project.pbxproj
deleted file mode 100644
index 057a1a8224..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,632 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 51;
- objects = {
-
-/* Begin PBXAggregateTarget section */
- 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
- isa = PBXAggregateTarget;
- buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
- buildPhases = (
- 33CC111E2044C6BF0003C045 /* ShellScript */,
- );
- dependencies = (
- );
- name = "Flutter Assemble";
- productName = FLX;
- };
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
- 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
- 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
- 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
- 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
- 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
- 8FD791997F0D60CE136153FB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F21284F13DB2F7E10C6EB1F7 /* Pods_Runner.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 33CC111A2044C6BA0003C045;
- remoteInfo = FLX;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 33CC110E2044A8840003C045 /* Bundle Framework */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- );
- name = "Bundle Framework";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
- 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
- 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
- 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
- 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
- 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
- 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
- 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
- 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
- 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
- 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
- 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
- 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
- 4C1351C0AA74138239028404 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
- 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
- BBAF6135AB8D71FE6D8B315C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
- BE3A038D8FDF07F3AD1C02FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- F21284F13DB2F7E10C6EB1F7 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 33CC10EA2044A3C60003C045 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8FD791997F0D60CE136153FB /* Pods_Runner.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 33BA886A226E78AF003329D5 /* Configs */ = {
- isa = PBXGroup;
- children = (
- 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
- 9740EEB21CF90195004384FC /* Debug.xcconfig */,
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
- 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
- );
- path = Configs;
- sourceTree = "";
- };
- 33CC10E42044A3C60003C045 = {
- isa = PBXGroup;
- children = (
- 33FAB671232836740065AC1E /* Runner */,
- 33CEB47122A05771004F2AC0 /* Flutter */,
- 33CC10EE2044A3C60003C045 /* Products */,
- D73912EC22F37F3D000D13A0 /* Frameworks */,
- 7B5E3B15415D0C17244EF9E7 /* Pods */,
- );
- sourceTree = "";
- };
- 33CC10EE2044A3C60003C045 /* Products */ = {
- isa = PBXGroup;
- children = (
- 33CC10ED2044A3C60003C045 /* example.app */,
- );
- name = Products;
- sourceTree = "";
- };
- 33CC11242044D66E0003C045 /* Resources */ = {
- isa = PBXGroup;
- children = (
- 33CC10F22044A3C60003C045 /* Assets.xcassets */,
- 33CC10F42044A3C60003C045 /* MainMenu.xib */,
- 33CC10F72044A3C60003C045 /* Info.plist */,
- );
- name = Resources;
- path = ..;
- sourceTree = "";
- };
- 33CEB47122A05771004F2AC0 /* Flutter */ = {
- isa = PBXGroup;
- children = (
- 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
- 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
- 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
- 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
- );
- path = Flutter;
- sourceTree = "";
- };
- 33FAB671232836740065AC1E /* Runner */ = {
- isa = PBXGroup;
- children = (
- 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
- 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
- 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
- 33E51914231749380026EE4D /* Release.entitlements */,
- 33CC11242044D66E0003C045 /* Resources */,
- 33BA886A226E78AF003329D5 /* Configs */,
- );
- path = Runner;
- sourceTree = "";
- };
- 7B5E3B15415D0C17244EF9E7 /* Pods */ = {
- isa = PBXGroup;
- children = (
- BBAF6135AB8D71FE6D8B315C /* Pods-Runner.debug.xcconfig */,
- 4C1351C0AA74138239028404 /* Pods-Runner.release.xcconfig */,
- BE3A038D8FDF07F3AD1C02FB /* Pods-Runner.profile.xcconfig */,
- );
- name = Pods;
- path = Pods;
- sourceTree = "";
- };
- D73912EC22F37F3D000D13A0 /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- F21284F13DB2F7E10C6EB1F7 /* Pods_Runner.framework */,
- );
- name = Frameworks;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 33CC10EC2044A3C60003C045 /* Runner */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
- buildPhases = (
- 87BB3D0057F20B3618A17B82 /* [CP] Check Pods Manifest.lock */,
- 33CC10E92044A3C60003C045 /* Sources */,
- 33CC10EA2044A3C60003C045 /* Frameworks */,
- 33CC10EB2044A3C60003C045 /* Resources */,
- 33CC110E2044A8840003C045 /* Bundle Framework */,
- 3399D490228B24CF009A79C7 /* ShellScript */,
- 09CDF3F9864A27F94DEE8EC6 /* [CP] Embed Pods Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- 33CC11202044C79F0003C045 /* PBXTargetDependency */,
- );
- name = Runner;
- productName = Runner;
- productReference = 33CC10ED2044A3C60003C045 /* example.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 33CC10E52044A3C60003C045 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastSwiftUpdateCheck = 0920;
- LastUpgradeCheck = 1300;
- ORGANIZATIONNAME = "";
- TargetAttributes = {
- 33CC10EC2044A3C60003C045 = {
- CreatedOnToolsVersion = 9.2;
- LastSwiftMigration = 1100;
- ProvisioningStyle = Automatic;
- SystemCapabilities = {
- com.apple.Sandbox = {
- enabled = 1;
- };
- };
- };
- 33CC111A2044C6BA0003C045 = {
- CreatedOnToolsVersion = 9.2;
- ProvisioningStyle = Manual;
- };
- };
- };
- buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
- compatibilityVersion = "Xcode 9.3";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 33CC10E42044A3C60003C045;
- productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 33CC10EC2044A3C60003C045 /* Runner */,
- 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 33CC10EB2044A3C60003C045 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
- 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- 09CDF3F9864A27F94DEE8EC6 /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
- );
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
- };
- 3399D490228B24CF009A79C7 /* ShellScript */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- );
- outputFileListPaths = (
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
- };
- 33CC111E2044C6BF0003C045 /* ShellScript */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- Flutter/ephemeral/FlutterInputs.xcfilelist,
- );
- inputPaths = (
- Flutter/ephemeral/tripwire,
- );
- outputFileListPaths = (
- Flutter/ephemeral/FlutterOutputs.xcfilelist,
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
- };
- 87BB3D0057F20B3618A17B82 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 33CC10E92044A3C60003C045 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
- 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
- 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
- targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
- 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
- isa = PBXVariantGroup;
- children = (
- 33CC10F52044A3C60003C045 /* Base */,
- );
- name = MainMenu.xib;
- path = Runner;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 338D0CE9231458BD00FA5F75 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CODE_SIGN_IDENTITY = "-";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.11;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = macosx;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- };
- name = Profile;
- };
- 338D0CEA231458BD00FA5F75 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
- CODE_SIGN_STYLE = Automatic;
- COMBINE_HIDPI_IMAGES = YES;
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/../Frameworks",
- );
- PROVISIONING_PROFILE_SPECIFIER = "";
- SWIFT_VERSION = 5.0;
- };
- name = Profile;
- };
- 338D0CEB231458BD00FA5F75 /* Profile */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Manual;
- PRODUCT_NAME = "$(TARGET_NAME)";
- };
- name = Profile;
- };
- 33CC10F92044A3C60003C045 /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CODE_SIGN_IDENTITY = "-";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.11;
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = macosx;
- SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- };
- name = Debug;
- };
- 33CC10FA2044A3C60003C045 /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CODE_SIGN_IDENTITY = "-";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.11;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = macosx;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- };
- name = Release;
- };
- 33CC10FC2044A3C60003C045 /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
- CODE_SIGN_STYLE = Automatic;
- COMBINE_HIDPI_IMAGES = YES;
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/../Frameworks",
- );
- PROVISIONING_PROFILE_SPECIFIER = "";
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- };
- name = Debug;
- };
- 33CC10FD2044A3C60003C045 /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
- CODE_SIGN_STYLE = Automatic;
- COMBINE_HIDPI_IMAGES = YES;
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/../Frameworks",
- );
- PROVISIONING_PROFILE_SPECIFIER = "";
- SWIFT_VERSION = 5.0;
- };
- name = Release;
- };
- 33CC111C2044C6BA0003C045 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Manual;
- PRODUCT_NAME = "$(TARGET_NAME)";
- };
- name = Debug;
- };
- 33CC111D2044C6BA0003C045 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- PRODUCT_NAME = "$(TARGET_NAME)";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 33CC10F92044A3C60003C045 /* Debug */,
- 33CC10FA2044A3C60003C045 /* Release */,
- 338D0CE9231458BD00FA5F75 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 33CC10FC2044A3C60003C045 /* Debug */,
- 33CC10FD2044A3C60003C045 /* Release */,
- 338D0CEA231458BD00FA5F75 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 33CC111C2044C6BA0003C045 /* Debug */,
- 33CC111D2044C6BA0003C045 /* Release */,
- 338D0CEB231458BD00FA5F75 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 33CC10E52044A3C60003C045 /* Project object */;
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
deleted file mode 100644
index fb7259e177..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 21a3cc14c7..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/AppDelegate.swift b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/AppDelegate.swift
deleted file mode 100644
index d53ef64377..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/AppDelegate.swift
+++ /dev/null
@@ -1,9 +0,0 @@
-import Cocoa
-import FlutterMacOS
-
-@NSApplicationMain
-class AppDelegate: FlutterAppDelegate {
- override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
- return true
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index a2ec33f19f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "images" : [
- {
- "size" : "16x16",
- "idiom" : "mac",
- "filename" : "app_icon_16.png",
- "scale" : "1x"
- },
- {
- "size" : "16x16",
- "idiom" : "mac",
- "filename" : "app_icon_32.png",
- "scale" : "2x"
- },
- {
- "size" : "32x32",
- "idiom" : "mac",
- "filename" : "app_icon_32.png",
- "scale" : "1x"
- },
- {
- "size" : "32x32",
- "idiom" : "mac",
- "filename" : "app_icon_64.png",
- "scale" : "2x"
- },
- {
- "size" : "128x128",
- "idiom" : "mac",
- "filename" : "app_icon_128.png",
- "scale" : "1x"
- },
- {
- "size" : "128x128",
- "idiom" : "mac",
- "filename" : "app_icon_256.png",
- "scale" : "2x"
- },
- {
- "size" : "256x256",
- "idiom" : "mac",
- "filename" : "app_icon_256.png",
- "scale" : "1x"
- },
- {
- "size" : "256x256",
- "idiom" : "mac",
- "filename" : "app_icon_512.png",
- "scale" : "2x"
- },
- {
- "size" : "512x512",
- "idiom" : "mac",
- "filename" : "app_icon_512.png",
- "scale" : "1x"
- },
- {
- "size" : "512x512",
- "idiom" : "mac",
- "filename" : "app_icon_1024.png",
- "scale" : "2x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
deleted file mode 100644
index 3c4935a7ca..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
deleted file mode 100644
index ed4cc16421..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
deleted file mode 100644
index 483be61389..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
deleted file mode 100644
index bcbf36df2f..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
deleted file mode 100644
index 9c0a652864..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
deleted file mode 100644
index e71a726136..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
deleted file mode 100644
index 8a31fe2dd3..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Base.lproj/MainMenu.xib b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Base.lproj/MainMenu.xib
deleted file mode 100644
index a6d4312ff0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Base.lproj/MainMenu.xib
+++ /dev/null
@@ -1,344 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/AppInfo.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/AppInfo.xcconfig
deleted file mode 100644
index 8b42559e87..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/AppInfo.xcconfig
+++ /dev/null
@@ -1,14 +0,0 @@
-// Application-level settings for the Runner target.
-//
-// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
-// future. If not, the values below would default to using the project name when this becomes a
-// 'flutter create' template.
-
-// The application's name. By default this is also the title of the Flutter window.
-PRODUCT_NAME = example
-
-// The application's bundle identifier
-PRODUCT_BUNDLE_IDENTIFIER = com.example.example
-
-// The copyright displayed in application information
-PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved.
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Debug.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Debug.xcconfig
deleted file mode 100644
index 36b0fd9464..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Debug.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "../../Flutter/Flutter-Debug.xcconfig"
-#include "Warnings.xcconfig"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Release.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Release.xcconfig
deleted file mode 100644
index dff4f49561..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Release.xcconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "../../Flutter/Flutter-Release.xcconfig"
-#include "Warnings.xcconfig"
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Warnings.xcconfig b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Warnings.xcconfig
deleted file mode 100644
index 42bcbf4780..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Configs/Warnings.xcconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
-GCC_WARN_UNDECLARED_SELECTOR = YES
-CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
-CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
-CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
-CLANG_WARN_PRAGMA_PACK = YES
-CLANG_WARN_STRICT_PROTOTYPES = YES
-CLANG_WARN_COMMA = YES
-GCC_WARN_STRICT_SELECTOR_MATCH = YES
-CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
-CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
-GCC_WARN_SHADOW = YES
-CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/DebugProfile.entitlements b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/DebugProfile.entitlements
deleted file mode 100644
index c946719a1a..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/DebugProfile.entitlements
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
- com.apple.security.cs.allow-jit
-
- com.apple.security.network.server
-
- com.apple.security.network.client
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Info.plist b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Info.plist
deleted file mode 100644
index 4789daa6a4..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Info.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIconFile
-
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSMinimumSystemVersion
- $(MACOSX_DEPLOYMENT_TARGET)
- NSHumanReadableCopyright
- $(PRODUCT_COPYRIGHT)
- NSMainNibFile
- MainMenu
- NSPrincipalClass
- NSApplication
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/MainFlutterWindow.swift b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/MainFlutterWindow.swift
deleted file mode 100644
index 2722837ec9..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/MainFlutterWindow.swift
+++ /dev/null
@@ -1,15 +0,0 @@
-import Cocoa
-import FlutterMacOS
-
-class MainFlutterWindow: NSWindow {
- override func awakeFromNib() {
- let flutterViewController = FlutterViewController.init()
- let windowFrame = self.frame
- self.contentViewController = flutterViewController
- self.setFrame(windowFrame, display: true)
-
- RegisterGeneratedPlugins(registry: flutterViewController)
-
- super.awakeFromNib()
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Release.entitlements b/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Release.entitlements
deleted file mode 100644
index 48271acc95..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/macos/Runner/Release.entitlements
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
- com.apple.security.network.client
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/pubspec.yaml b/frontend/appflowy_flutter/packages/appflowy_editor/example/pubspec.yaml
deleted file mode 100644
index ab0eb3aa7b..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/pubspec.yaml
+++ /dev/null
@@ -1,102 +0,0 @@
-name: example
-description: A new Flutter project.
-
-# The following line prevents the package from being accidentally published to
-# pub.dev using `flutter pub publish`. This is preferred for private packages.
-publish_to: "none" # Remove this line if you wish to publish to pub.dev
-
-# The following defines the version and build number for your application.
-# A version number is three numbers separated by dots, like 1.2.43
-# followed by an optional build number separated by a +.
-# Both the version and the builder number may be overridden in flutter
-# build by specifying --build-name and --build-number, respectively.
-# In Android, build-name is used as versionName while build-number used as versionCode.
-# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
-# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
-# Read more about iOS versioning at
-# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 1.0.0+1
-
-environment:
- sdk: ">=2.17.0 <3.0.0"
-
-# Dependencies specify other packages that your package needs in order to work.
-# To automatically upgrade your package dependencies to the latest versions
-# consider running `flutter pub upgrade --major-versions`. Alternatively,
-# dependencies can be manually updated by changing the version numbers below to
-# the latest version available on pub.dev. To see which dependencies have newer
-# versions available, run `flutter pub outdated`.
-dependencies:
- flutter:
- sdk: flutter
-
- # The following adds the Cupertino Icons font to your application.
- # Use with the CupertinoIcons class for iOS style icons.
- cupertino_icons: ^1.0.2
- appflowy_editor:
- path: ../
- provider: ^6.0.3
- url_launcher: ^6.1.5
- path_provider: ^2.0.11
- google_fonts: ^3.0.1
- flutter_localizations:
- sdk: flutter
- file_picker: ^5.0.1
- universal_html: ^2.0.8
- highlight: ^0.7.0
- flutter_math_fork: ^0.6.3+1
- appflowy_editor_plugins:
- path: ../../../packages/appflowy_editor_plugins
- http: ^0.13.5
-
-dev_dependencies:
- flutter_test:
- sdk: flutter
-
- # The "flutter_lints" package below contains a set of recommended lints to
- # encourage good coding practices. The lint set provided by the package is
- # activated in the `analysis_options.yaml` file located at the root of your
- # package. See that file for information about deactivating specific lint
- # rules and activating additional ones.
- flutter_lints: ^2.0.1
-
-# For information on the generic Dart part of this file, see the
-# following page: https://dart.dev/tools/pub/pubspec
-
-# The following section is specific to Flutter packages.
-flutter:
- # The following line ensures that the Material Icons font is
- # included with your application, so that you can use the icons in
- # the material Icons class.
- uses-material-design: true
-
- # To add assets to your application, add an assets section, like this:
- assets:
- - example.json
- - assets/images/icon.png
-
- # An image asset can refer to one or more resolution-specific "variants", see
- # https://flutter.dev/assets-and-images/#resolution-aware
-
- # For details regarding adding assets from package dependencies, see
- # https://flutter.dev/assets-and-images/#from-packages
-
- # To add custom fonts to your application, add a fonts section here,
- # in this "flutter" section. Each entry in this list should have a
- # "family" key with the font family name, and a "fonts" key with a
- # list giving the asset and other descriptors for the font. For
- # example:
- # fonts:
- # - family: Schyler
- # fonts:
- # - asset: fonts/Schyler-Regular.ttf
- # - asset: fonts/Schyler-Italic.ttf
- # style: italic
- # - family: Trajan Pro
- # fonts:
- # - asset: fonts/TrajanPro.ttf
- # - asset: fonts/TrajanPro_Bold.ttf
- # weight: 700
- #
- # For details regarding fonts from package dependencies,
- # see https://flutter.dev/custom-fonts/#from-packages
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/test/widget_test.dart b/frontend/appflowy_flutter/packages/appflowy_editor/example/test/widget_test.dart
deleted file mode 100644
index 2a2b819285..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/test/widget_test.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-// This is a basic Flutter widget test.
-//
-// To perform an interaction with a widget in your test, use the WidgetTester
-// utility in the flutter_test package. For example, you can send tap and scroll
-// gestures. You can also use WidgetTester to find child widgets in the widget
-// tree, read text, and verify that the values of widget properties are correct.
-
-void main() {}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/favicon.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/favicon.png
deleted file mode 100644
index 8aaa46ac1a..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/favicon.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-192.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-192.png
deleted file mode 100644
index b749bfef07..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-192.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-512.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-512.png
deleted file mode 100644
index 88cfd48dff..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-512.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-maskable-192.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-maskable-192.png
deleted file mode 100644
index eb9b4d76e5..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-maskable-192.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-maskable-512.png b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-maskable-512.png
deleted file mode 100644
index d69c56691f..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/icons/Icon-maskable-512.png and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/index.html b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/index.html
deleted file mode 100644
index 41b3bc336f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/index.html
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- example
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/manifest.json b/frontend/appflowy_flutter/packages/appflowy_editor/example/web/manifest.json
deleted file mode 100644
index 096edf8fe4..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/web/manifest.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "example",
- "short_name": "example",
- "start_url": ".",
- "display": "standalone",
- "background_color": "#0175C2",
- "theme_color": "#0175C2",
- "description": "A new Flutter project.",
- "orientation": "portrait-primary",
- "prefer_related_applications": false,
- "icons": [
- {
- "src": "icons/Icon-192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "icons/Icon-512.png",
- "sizes": "512x512",
- "type": "image/png"
- },
- {
- "src": "icons/Icon-maskable-192.png",
- "sizes": "192x192",
- "type": "image/png",
- "purpose": "maskable"
- },
- {
- "src": "icons/Icon-maskable-512.png",
- "sizes": "512x512",
- "type": "image/png",
- "purpose": "maskable"
- }
- ]
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/.gitignore b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/.gitignore
deleted file mode 100644
index d492d0d98c..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-flutter/ephemeral/
-
-# Visual Studio user-specific files.
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# Visual Studio build-related files.
-x64/
-x86/
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!*.[Cc]ache/
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/CMakeLists.txt b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/CMakeLists.txt
deleted file mode 100644
index c0270746b1..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/CMakeLists.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-# Project-level configuration.
-cmake_minimum_required(VERSION 3.14)
-project(example LANGUAGES CXX)
-
-# The name of the executable created for the application. Change this to change
-# the on-disk name of your application.
-set(BINARY_NAME "example")
-
-# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
-# versions of CMake.
-cmake_policy(SET CMP0063 NEW)
-
-# Define build configuration option.
-get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
-if(IS_MULTICONFIG)
- set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
- CACHE STRING "" FORCE)
-else()
- if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
- set(CMAKE_BUILD_TYPE "Debug" CACHE
- STRING "Flutter build mode" FORCE)
- set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
- "Debug" "Profile" "Release")
- endif()
-endif()
-# Define settings for the Profile build mode.
-set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
-set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
-set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
-set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
-
-# Use Unicode for all projects.
-add_definitions(-DUNICODE -D_UNICODE)
-
-# Compilation settings that should be applied to most targets.
-#
-# Be cautious about adding new options here, as plugins use this function by
-# default. In most cases, you should add new options to specific targets instead
-# of modifying this function.
-function(APPLY_STANDARD_SETTINGS TARGET)
- target_compile_features(${TARGET} PUBLIC cxx_std_17)
- target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
- target_compile_options(${TARGET} PRIVATE /EHsc)
- target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
- target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>")
-endfunction()
-
-# Flutter library and tool build rules.
-set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
-add_subdirectory(${FLUTTER_MANAGED_DIR})
-
-# Application build; see runner/CMakeLists.txt.
-add_subdirectory("runner")
-
-# Generated plugin build rules, which manage building the plugins and adding
-# them to the application.
-include(flutter/generated_plugins.cmake)
-
-
-# === Installation ===
-# Support files are copied into place next to the executable, so that it can
-# run in place. This is done instead of making a separate bundle (as on Linux)
-# so that building and running from within Visual Studio will work.
-set(BUILD_BUNDLE_DIR "$")
-# Make the "install" step default, as it's required to run.
-set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
-if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
- set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
-endif()
-
-set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
-set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
-
-install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
- COMPONENT Runtime)
-
-install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
- COMPONENT Runtime)
-
-install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
- COMPONENT Runtime)
-
-if(PLUGIN_BUNDLED_LIBRARIES)
- install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
- DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
- COMPONENT Runtime)
-endif()
-
-# Fully re-copy the assets directory on each build to avoid having stale files
-# from a previous install.
-set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
-install(CODE "
- file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
- " COMPONENT Runtime)
-install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
- DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
-
-# Install the AOT library on non-Debug builds only.
-install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
- CONFIGURATIONS Profile;Release
- COMPONENT Runtime)
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/flutter/CMakeLists.txt b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/flutter/CMakeLists.txt
deleted file mode 100644
index 930d2071a3..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/flutter/CMakeLists.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-# This file controls Flutter-level build steps. It should not be edited.
-cmake_minimum_required(VERSION 3.14)
-
-set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
-
-# Configuration provided via flutter tool.
-include(${EPHEMERAL_DIR}/generated_config.cmake)
-
-# TODO: Move the rest of this into files in ephemeral. See
-# https://github.com/flutter/flutter/issues/57146.
-set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
-
-# === Flutter Library ===
-set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
-
-# Published to parent scope for install step.
-set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
-set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
-set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
-set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
-
-list(APPEND FLUTTER_LIBRARY_HEADERS
- "flutter_export.h"
- "flutter_windows.h"
- "flutter_messenger.h"
- "flutter_plugin_registrar.h"
- "flutter_texture_registrar.h"
-)
-list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
-add_library(flutter INTERFACE)
-target_include_directories(flutter INTERFACE
- "${EPHEMERAL_DIR}"
-)
-target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
-add_dependencies(flutter flutter_assemble)
-
-# === Wrapper ===
-list(APPEND CPP_WRAPPER_SOURCES_CORE
- "core_implementations.cc"
- "standard_codec.cc"
-)
-list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
-list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
- "plugin_registrar.cc"
-)
-list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
-list(APPEND CPP_WRAPPER_SOURCES_APP
- "flutter_engine.cc"
- "flutter_view_controller.cc"
-)
-list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
-
-# Wrapper sources needed for a plugin.
-add_library(flutter_wrapper_plugin STATIC
- ${CPP_WRAPPER_SOURCES_CORE}
- ${CPP_WRAPPER_SOURCES_PLUGIN}
-)
-apply_standard_settings(flutter_wrapper_plugin)
-set_target_properties(flutter_wrapper_plugin PROPERTIES
- POSITION_INDEPENDENT_CODE ON)
-set_target_properties(flutter_wrapper_plugin PROPERTIES
- CXX_VISIBILITY_PRESET hidden)
-target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
-target_include_directories(flutter_wrapper_plugin PUBLIC
- "${WRAPPER_ROOT}/include"
-)
-add_dependencies(flutter_wrapper_plugin flutter_assemble)
-
-# Wrapper sources needed for the runner.
-add_library(flutter_wrapper_app STATIC
- ${CPP_WRAPPER_SOURCES_CORE}
- ${CPP_WRAPPER_SOURCES_APP}
-)
-apply_standard_settings(flutter_wrapper_app)
-target_link_libraries(flutter_wrapper_app PUBLIC flutter)
-target_include_directories(flutter_wrapper_app PUBLIC
- "${WRAPPER_ROOT}/include"
-)
-add_dependencies(flutter_wrapper_app flutter_assemble)
-
-# === Flutter tool backend ===
-# _phony_ is a non-existent file to force this command to run every time,
-# since currently there's no way to get a full input/output list from the
-# flutter tool.
-set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
-set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
-add_custom_command(
- OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
- ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
- ${CPP_WRAPPER_SOURCES_APP}
- ${PHONY_OUTPUT}
- COMMAND ${CMAKE_COMMAND} -E env
- ${FLUTTER_TOOL_ENVIRONMENT}
- "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
- windows-x64 $
- VERBATIM
-)
-add_custom_target(flutter_assemble DEPENDS
- "${FLUTTER_LIBRARY}"
- ${FLUTTER_LIBRARY_HEADERS}
- ${CPP_WRAPPER_SOURCES_CORE}
- ${CPP_WRAPPER_SOURCES_PLUGIN}
- ${CPP_WRAPPER_SOURCES_APP}
-)
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/CMakeLists.txt b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/CMakeLists.txt
deleted file mode 100644
index b9e550fba8..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/CMakeLists.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-cmake_minimum_required(VERSION 3.14)
-project(runner LANGUAGES CXX)
-
-# Define the application target. To change its name, change BINARY_NAME in the
-# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
-# work.
-#
-# Any new source files that you add to the application should be added here.
-add_executable(${BINARY_NAME} WIN32
- "flutter_window.cpp"
- "main.cpp"
- "utils.cpp"
- "win32_window.cpp"
- "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
- "Runner.rc"
- "runner.exe.manifest"
-)
-
-# Apply the standard set of build settings. This can be removed for applications
-# that need different build settings.
-apply_standard_settings(${BINARY_NAME})
-
-# Disable Windows macros that collide with C++ standard library functions.
-target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
-
-# Add dependency libraries and include directories. Add any application-specific
-# dependencies here.
-target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
-target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
-
-# Run the Flutter tool portions of the build. This must not be removed.
-add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/Runner.rc b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/Runner.rc
deleted file mode 100644
index 5fdea291cf..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/Runner.rc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#pragma code_page(65001)
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "winres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (United States) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""winres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_APP_ICON ICON "resources\\app_icon.ico"
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-#ifdef FLUTTER_BUILD_NUMBER
-#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER
-#else
-#define VERSION_AS_NUMBER 1,0,0
-#endif
-
-#ifdef FLUTTER_BUILD_NAME
-#define VERSION_AS_STRING #FLUTTER_BUILD_NAME
-#else
-#define VERSION_AS_STRING "1.0.0"
-#endif
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION VERSION_AS_NUMBER
- PRODUCTVERSION VERSION_AS_NUMBER
- FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
-#ifdef _DEBUG
- FILEFLAGS VS_FF_DEBUG
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS VOS__WINDOWS32
- FILETYPE VFT_APP
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904e4"
- BEGIN
- VALUE "CompanyName", "com.example" "\0"
- VALUE "FileDescription", "example" "\0"
- VALUE "FileVersion", VERSION_AS_STRING "\0"
- VALUE "InternalName", "example" "\0"
- VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0"
- VALUE "OriginalFilename", "example.exe" "\0"
- VALUE "ProductName", "example" "\0"
- VALUE "ProductVersion", VERSION_AS_STRING "\0"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1252
- END
-END
-
-#endif // English (United States) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/flutter_window.cpp b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/flutter_window.cpp
deleted file mode 100644
index b43b9095ea..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/flutter_window.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "flutter_window.h"
-
-#include
-
-#include "flutter/generated_plugin_registrant.h"
-
-FlutterWindow::FlutterWindow(const flutter::DartProject& project)
- : project_(project) {}
-
-FlutterWindow::~FlutterWindow() {}
-
-bool FlutterWindow::OnCreate() {
- if (!Win32Window::OnCreate()) {
- return false;
- }
-
- RECT frame = GetClientArea();
-
- // The size here must match the window dimensions to avoid unnecessary surface
- // creation / destruction in the startup path.
- flutter_controller_ = std::make_unique(
- frame.right - frame.left, frame.bottom - frame.top, project_);
- // Ensure that basic setup of the controller was successful.
- if (!flutter_controller_->engine() || !flutter_controller_->view()) {
- return false;
- }
- RegisterPlugins(flutter_controller_->engine());
- SetChildContent(flutter_controller_->view()->GetNativeWindow());
- return true;
-}
-
-void FlutterWindow::OnDestroy() {
- if (flutter_controller_) {
- flutter_controller_ = nullptr;
- }
-
- Win32Window::OnDestroy();
-}
-
-LRESULT
-FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
- WPARAM const wparam,
- LPARAM const lparam) noexcept {
- // Give Flutter, including plugins, an opportunity to handle window messages.
- if (flutter_controller_) {
- std::optional result =
- flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
- lparam);
- if (result) {
- return *result;
- }
- }
-
- switch (message) {
- case WM_FONTCHANGE:
- flutter_controller_->engine()->ReloadSystemFonts();
- break;
- }
-
- return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/flutter_window.h b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/flutter_window.h
deleted file mode 100644
index 6da0652f05..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/flutter_window.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef RUNNER_FLUTTER_WINDOW_H_
-#define RUNNER_FLUTTER_WINDOW_H_
-
-#include
-#include
-
-#include
-
-#include "win32_window.h"
-
-// A window that does nothing but host a Flutter view.
-class FlutterWindow : public Win32Window {
- public:
- // Creates a new FlutterWindow hosting a Flutter view running |project|.
- explicit FlutterWindow(const flutter::DartProject& project);
- virtual ~FlutterWindow();
-
- protected:
- // Win32Window:
- bool OnCreate() override;
- void OnDestroy() override;
- LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
- LPARAM const lparam) noexcept override;
-
- private:
- // The project to run.
- flutter::DartProject project_;
-
- // The Flutter instance hosted by this window.
- std::unique_ptr flutter_controller_;
-};
-
-#endif // RUNNER_FLUTTER_WINDOW_H_
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/main.cpp b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/main.cpp
deleted file mode 100644
index bcb57b0e2a..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/main.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#include
-#include
-#include
-
-#include "flutter_window.h"
-#include "utils.h"
-
-int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
- _In_ wchar_t *command_line, _In_ int show_command) {
- // Attach to console when present (e.g., 'flutter run') or create a
- // new console when running with a debugger.
- if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
- CreateAndAttachConsole();
- }
-
- // Initialize COM, so that it is available for use in the library and/or
- // plugins.
- ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
-
- flutter::DartProject project(L"data");
-
- std::vector command_line_arguments =
- GetCommandLineArguments();
-
- project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
-
- FlutterWindow window(project);
- Win32Window::Point origin(10, 10);
- Win32Window::Size size(1280, 720);
- if (!window.CreateAndShow(L"example", origin, size)) {
- return EXIT_FAILURE;
- }
- window.SetQuitOnClose(true);
-
- ::MSG msg;
- while (::GetMessage(&msg, nullptr, 0, 0)) {
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- }
-
- ::CoUninitialize();
- return EXIT_SUCCESS;
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/resource.h b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/resource.h
deleted file mode 100644
index 66a65d1e4a..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/resource.h
+++ /dev/null
@@ -1,16 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by Runner.rc
-//
-#define IDI_APP_ICON 101
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 102
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1001
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/resources/app_icon.ico b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/resources/app_icon.ico
deleted file mode 100644
index c04e20caf6..0000000000
Binary files a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/resources/app_icon.ico and /dev/null differ
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/runner.exe.manifest b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/runner.exe.manifest
deleted file mode 100644
index c977c4a425..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/runner.exe.manifest
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
- PerMonitorV2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/utils.cpp b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/utils.cpp
deleted file mode 100644
index f5bf9fa0f5..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/utils.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#include "utils.h"
-
-#include
-#include
-#include
-#include
-
-#include
-
-void CreateAndAttachConsole() {
- if (::AllocConsole()) {
- FILE *unused;
- if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
- _dup2(_fileno(stdout), 1);
- }
- if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
- _dup2(_fileno(stdout), 2);
- }
- std::ios::sync_with_stdio();
- FlutterDesktopResyncOutputStreams();
- }
-}
-
-std::vector GetCommandLineArguments() {
- // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
- int argc;
- wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
- if (argv == nullptr) {
- return std::vector();
- }
-
- std::vector command_line_arguments;
-
- // Skip the first argument as it's the binary name.
- for (int i = 1; i < argc; i++) {
- command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
- }
-
- ::LocalFree(argv);
-
- return command_line_arguments;
-}
-
-std::string Utf8FromUtf16(const wchar_t* utf16_string) {
- if (utf16_string == nullptr) {
- return std::string();
- }
- int target_length = ::WideCharToMultiByte(
- CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
- -1, nullptr, 0, nullptr, nullptr);
- std::string utf8_string;
- if (target_length == 0 || target_length > utf8_string.max_size()) {
- return utf8_string;
- }
- utf8_string.resize(target_length);
- int converted_length = ::WideCharToMultiByte(
- CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
- -1, utf8_string.data(),
- target_length, nullptr, nullptr);
- if (converted_length == 0) {
- return std::string();
- }
- return utf8_string;
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/utils.h b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/utils.h
deleted file mode 100644
index 3879d54755..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/utils.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef RUNNER_UTILS_H_
-#define RUNNER_UTILS_H_
-
-#include
-#include
-
-// Creates a console for the process, and redirects stdout and stderr to
-// it for both the runner and the Flutter library.
-void CreateAndAttachConsole();
-
-// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
-// encoded in UTF-8. Returns an empty std::string on failure.
-std::string Utf8FromUtf16(const wchar_t* utf16_string);
-
-// Gets the command line arguments passed in as a std::vector,
-// encoded in UTF-8. Returns an empty std::vector on failure.
-std::vector GetCommandLineArguments();
-
-#endif // RUNNER_UTILS_H_
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/win32_window.cpp b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/win32_window.cpp
deleted file mode 100644
index c10f08dc7d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/win32_window.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-#include "win32_window.h"
-
-#include
-
-#include "resource.h"
-
-namespace {
-
-constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
-
-// The number of Win32Window objects that currently exist.
-static int g_active_window_count = 0;
-
-using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
-
-// Scale helper to convert logical scaler values to physical using passed in
-// scale factor
-int Scale(int source, double scale_factor) {
- return static_cast(source * scale_factor);
-}
-
-// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
-// This API is only needed for PerMonitor V1 awareness mode.
-void EnableFullDpiSupportIfAvailable(HWND hwnd) {
- HMODULE user32_module = LoadLibraryA("User32.dll");
- if (!user32_module) {
- return;
- }
- auto enable_non_client_dpi_scaling =
- reinterpret_cast(
- GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
- if (enable_non_client_dpi_scaling != nullptr) {
- enable_non_client_dpi_scaling(hwnd);
- FreeLibrary(user32_module);
- }
-}
-
-} // namespace
-
-// Manages the Win32Window's window class registration.
-class WindowClassRegistrar {
- public:
- ~WindowClassRegistrar() = default;
-
- // Returns the singleton registar instance.
- static WindowClassRegistrar* GetInstance() {
- if (!instance_) {
- instance_ = new WindowClassRegistrar();
- }
- return instance_;
- }
-
- // Returns the name of the window class, registering the class if it hasn't
- // previously been registered.
- const wchar_t* GetWindowClass();
-
- // Unregisters the window class. Should only be called if there are no
- // instances of the window.
- void UnregisterWindowClass();
-
- private:
- WindowClassRegistrar() = default;
-
- static WindowClassRegistrar* instance_;
-
- bool class_registered_ = false;
-};
-
-WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
-
-const wchar_t* WindowClassRegistrar::GetWindowClass() {
- if (!class_registered_) {
- WNDCLASS window_class{};
- window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
- window_class.lpszClassName = kWindowClassName;
- window_class.style = CS_HREDRAW | CS_VREDRAW;
- window_class.cbClsExtra = 0;
- window_class.cbWndExtra = 0;
- window_class.hInstance = GetModuleHandle(nullptr);
- window_class.hIcon =
- LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
- window_class.hbrBackground = 0;
- window_class.lpszMenuName = nullptr;
- window_class.lpfnWndProc = Win32Window::WndProc;
- RegisterClass(&window_class);
- class_registered_ = true;
- }
- return kWindowClassName;
-}
-
-void WindowClassRegistrar::UnregisterWindowClass() {
- UnregisterClass(kWindowClassName, nullptr);
- class_registered_ = false;
-}
-
-Win32Window::Win32Window() {
- ++g_active_window_count;
-}
-
-Win32Window::~Win32Window() {
- --g_active_window_count;
- Destroy();
-}
-
-bool Win32Window::CreateAndShow(const std::wstring& title,
- const Point& origin,
- const Size& size) {
- Destroy();
-
- const wchar_t* window_class =
- WindowClassRegistrar::GetInstance()->GetWindowClass();
-
- const POINT target_point = {static_cast(origin.x),
- static_cast(origin.y)};
- HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
- UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
- double scale_factor = dpi / 96.0;
-
- HWND window = CreateWindow(
- window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
- Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
- Scale(size.width, scale_factor), Scale(size.height, scale_factor),
- nullptr, nullptr, GetModuleHandle(nullptr), this);
-
- if (!window) {
- return false;
- }
-
- return OnCreate();
-}
-
-// static
-LRESULT CALLBACK Win32Window::WndProc(HWND const window,
- UINT const message,
- WPARAM const wparam,
- LPARAM const lparam) noexcept {
- if (message == WM_NCCREATE) {
- auto window_struct = reinterpret_cast(lparam);
- SetWindowLongPtr(window, GWLP_USERDATA,
- reinterpret_cast(window_struct->lpCreateParams));
-
- auto that = static_cast(window_struct->lpCreateParams);
- EnableFullDpiSupportIfAvailable(window);
- that->window_handle_ = window;
- } else if (Win32Window* that = GetThisFromHandle(window)) {
- return that->MessageHandler(window, message, wparam, lparam);
- }
-
- return DefWindowProc(window, message, wparam, lparam);
-}
-
-LRESULT
-Win32Window::MessageHandler(HWND hwnd,
- UINT const message,
- WPARAM const wparam,
- LPARAM const lparam) noexcept {
- switch (message) {
- case WM_DESTROY:
- window_handle_ = nullptr;
- Destroy();
- if (quit_on_close_) {
- PostQuitMessage(0);
- }
- return 0;
-
- case WM_DPICHANGED: {
- auto newRectSize = reinterpret_cast(lparam);
- LONG newWidth = newRectSize->right - newRectSize->left;
- LONG newHeight = newRectSize->bottom - newRectSize->top;
-
- SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
- newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
-
- return 0;
- }
- case WM_SIZE: {
- RECT rect = GetClientArea();
- if (child_content_ != nullptr) {
- // Size and position the child window.
- MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
- rect.bottom - rect.top, TRUE);
- }
- return 0;
- }
-
- case WM_ACTIVATE:
- if (child_content_ != nullptr) {
- SetFocus(child_content_);
- }
- return 0;
- }
-
- return DefWindowProc(window_handle_, message, wparam, lparam);
-}
-
-void Win32Window::Destroy() {
- OnDestroy();
-
- if (window_handle_) {
- DestroyWindow(window_handle_);
- window_handle_ = nullptr;
- }
- if (g_active_window_count == 0) {
- WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
- }
-}
-
-Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
- return reinterpret_cast(
- GetWindowLongPtr(window, GWLP_USERDATA));
-}
-
-void Win32Window::SetChildContent(HWND content) {
- child_content_ = content;
- SetParent(content, window_handle_);
- RECT frame = GetClientArea();
-
- MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
- frame.bottom - frame.top, true);
-
- SetFocus(child_content_);
-}
-
-RECT Win32Window::GetClientArea() {
- RECT frame;
- GetClientRect(window_handle_, &frame);
- return frame;
-}
-
-HWND Win32Window::GetHandle() {
- return window_handle_;
-}
-
-void Win32Window::SetQuitOnClose(bool quit_on_close) {
- quit_on_close_ = quit_on_close;
-}
-
-bool Win32Window::OnCreate() {
- // No-op; provided for subclasses.
- return true;
-}
-
-void Win32Window::OnDestroy() {
- // No-op; provided for subclasses.
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/win32_window.h b/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/win32_window.h
deleted file mode 100644
index 17ba431125..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/example/windows/runner/win32_window.h
+++ /dev/null
@@ -1,98 +0,0 @@
-#ifndef RUNNER_WIN32_WINDOW_H_
-#define RUNNER_WIN32_WINDOW_H_
-
-#include
-
-#include
-#include
-#include
-
-// A class abstraction for a high DPI-aware Win32 Window. Intended to be
-// inherited from by classes that wish to specialize with custom
-// rendering and input handling
-class Win32Window {
- public:
- struct Point {
- unsigned int x;
- unsigned int y;
- Point(unsigned int x, unsigned int y) : x(x), y(y) {}
- };
-
- struct Size {
- unsigned int width;
- unsigned int height;
- Size(unsigned int width, unsigned int height)
- : width(width), height(height) {}
- };
-
- Win32Window();
- virtual ~Win32Window();
-
- // Creates and shows a win32 window with |title| and position and size using
- // |origin| and |size|. New windows are created on the default monitor. Window
- // sizes are specified to the OS in physical pixels, hence to ensure a
- // consistent size to will treat the width height passed in to this function
- // as logical pixels and scale to appropriate for the default monitor. Returns
- // true if the window was created successfully.
- bool CreateAndShow(const std::wstring& title,
- const Point& origin,
- const Size& size);
-
- // Release OS resources associated with window.
- void Destroy();
-
- // Inserts |content| into the window tree.
- void SetChildContent(HWND content);
-
- // Returns the backing Window handle to enable clients to set icon and other
- // window properties. Returns nullptr if the window has been destroyed.
- HWND GetHandle();
-
- // If true, closing this window will quit the application.
- void SetQuitOnClose(bool quit_on_close);
-
- // Return a RECT representing the bounds of the current client area.
- RECT GetClientArea();
-
- protected:
- // Processes and route salient window messages for mouse handling,
- // size change and DPI. Delegates handling of these to member overloads that
- // inheriting classes can handle.
- virtual LRESULT MessageHandler(HWND window,
- UINT const message,
- WPARAM const wparam,
- LPARAM const lparam) noexcept;
-
- // Called when CreateAndShow is called, allowing subclass window-related
- // setup. Subclasses should return false if setup fails.
- virtual bool OnCreate();
-
- // Called when Destroy is called.
- virtual void OnDestroy();
-
- private:
- friend class WindowClassRegistrar;
-
- // OS callback called by message pump. Handles the WM_NCCREATE message which
- // is passed when the non-client area is being created and enables automatic
- // non-client DPI scaling so that the non-client area automatically
- // responsponds to changes in DPI. All other messages are handled by
- // MessageHandler.
- static LRESULT CALLBACK WndProc(HWND const window,
- UINT const message,
- WPARAM const wparam,
- LPARAM const lparam) noexcept;
-
- // Retrieves a class instance pointer for |window|
- static Win32Window* GetThisFromHandle(HWND const window) noexcept;
-
- bool quit_on_close_ = false;
-
- // window handle for top level window.
- HWND window_handle_ = nullptr;
-
- // window handle for hosted content.
- HWND child_content_ = nullptr;
-};
-
-#endif // RUNNER_WIN32_WINDOW_H_
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/appflowy_editor.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/appflowy_editor.dart
deleted file mode 100644
index 39eca0b904..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/appflowy_editor.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-/// AppFlowyEditor library
-library appflowy_editor;
-
-export 'src/infra/log.dart';
-export 'src/render/style/editor_style.dart';
-export 'src/core/document/node.dart';
-export 'src/core/document/path.dart';
-export 'src/core/location/position.dart';
-export 'src/core/location/selection.dart';
-export 'src/core/document/document.dart';
-export 'src/core/document/text_delta.dart';
-export 'src/core/document/attributes.dart';
-export 'src/core/legacy/built_in_attribute_keys.dart';
-export 'src/editor_state.dart';
-export 'src/core/transform/operation.dart';
-export 'src/core/transform/transaction.dart';
-export 'src/render/selection/selectable.dart';
-export 'src/render/selection_menu/selection_menu_service.dart';
-export 'src/service/editor_service.dart';
-export 'src/service/render_plugin_service.dart';
-export 'src/service/service.dart';
-export 'src/service/selection_service.dart';
-export 'src/service/scroll_service.dart';
-export 'src/service/toolbar_service.dart';
-export 'src/service/keyboard_service.dart';
-export 'src/service/input_service.dart';
-export 'src/service/shortcut_event/keybinding.dart';
-export 'src/service/shortcut_event/shortcut_event.dart';
-export 'src/service/shortcut_event/shortcut_event_handler.dart';
-export 'src/extensions/attributes_extension.dart';
-export 'src/render/rich_text/default_selectable.dart';
-export 'src/render/rich_text/flowy_rich_text.dart';
-export 'src/render/selection_menu/selection_menu_widget.dart';
-export 'src/render/selection_menu/selection_menu_item_widget.dart';
-export 'src/l10n/l10n.dart';
-export 'src/render/style/plugin_styles.dart';
-export 'src/plugins/markdown/encoder/delta_markdown_encoder.dart';
-export 'src/plugins/markdown/encoder/document_markdown_encoder.dart';
-export 'src/plugins/markdown/encoder/parser/node_parser.dart';
-export 'src/plugins/markdown/encoder/parser/text_node_parser.dart';
-export 'src/plugins/markdown/encoder/parser/image_node_parser.dart';
-export 'src/plugins/markdown/decoder/delta_markdown_decoder.dart';
-export 'src/plugins/markdown/document_markdown.dart';
-export 'src/plugins/quill_delta/delta_document_encoder.dart';
-export 'src/commands/text/text_commands.dart';
-export 'src/commands/command_extension.dart';
-export 'src/render/toolbar/toolbar_item.dart';
-export 'src/extensions/node_extensions.dart';
-export 'src/render/action_menu/action_menu.dart';
-export 'src/render/action_menu/action_menu_item.dart';
-export 'src/core/document/node_iterator.dart';
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_bn_BN.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_bn_BN.arb
deleted file mode 100644
index fa58561498..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_bn_BN.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "bn_BN",
- "bold": "বল্ড ফন্ট",
- "@bold": {},
- "bulletedList": "বুলেট তালিকা",
- "@bulletedList": {},
- "checkbox": "চেকবক্স",
- "@checkbox": {},
- "embedCode": "এম্বেড কোড",
- "@embedCode": {},
- "heading1": "শিরোনাম 1",
- "@heading1": {},
- "heading2": "শিরোনাম 2",
- "@heading2": {},
- "heading3": "শিরোনাম 3",
- "@heading3": {},
- "highlight": "হাইলাইট",
- "@highlight": {},
- "image": "ইমেজ",
- "@image": {},
- "italic": "ইটালিক ফন্ট",
- "@italic": {},
- "link": "লিঙ্ক",
- "@link": {},
- "numberedList": "সংখ্যাযুক্ত তালিকা",
- "@numberedList": {},
- "quote": "উদ্ধৃতি",
- "@quote": {},
- "strikethrough": "স্ট্রাইকথ্রু",
- "@strikethrough": {},
- "text": "পাঠ্য",
- "@text": {},
- "underline": "আন্ডারলাইন",
- "@underline": {}
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ca.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ca.arb
deleted file mode 100644
index 45190fb106..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ca.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "ca",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_cs_CZ.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_cs_CZ.arb
deleted file mode 100644
index 2b1ea7b0bf..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_cs_CZ.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "cs-CZ",
- "bold": "Tučně",
- "@bold": {},
- "bulletedList": "Odrážkový seznam",
- "@bulletedList": {},
- "checkbox": "Zaškrtávací políčko",
- "@checkbox": {},
- "embedCode": "Vložit kód",
- "@embedCode": {},
- "heading1": "Nadpis 1",
- "@heading1": {},
- "heading2": "Nadpis 2",
- "@heading2": {},
- "heading3": "Nadpis 3",
- "@heading3": {},
- "highlight": "Zvýraznění",
- "@highlight": {},
- "image": "Obrázek",
- "@image": {},
- "italic": "Kurzíva",
- "@italic": {},
- "link": "Odkaz",
- "@link": {},
- "numberedList": "Číslovaný seznam",
- "@numberedList": {},
- "quote": "Citace",
- "@quote": {},
- "strikethrough": "Přeškrtnutí",
- "@strikethrough": {},
- "text": "Text",
- "@text": {},
- "underline": "Podtržení",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_de_DE.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_de_DE.arb
deleted file mode 100644
index bd39879f0d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_de_DE.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "de-DE",
- "bold": "Fett gedruckt",
- "@bold": {},
- "bulletedList": "Aufzählungsliste",
- "@bulletedList": {},
- "checkbox": "Kontrollkästchen",
- "@checkbox": {},
- "embedCode": "Code einbetten",
- "@embedCode": {},
- "heading1": "Überschrift 1",
- "@heading1": {},
- "heading2": "Überschrift 2",
- "@heading2": {},
- "heading3": "Überschrift 3",
- "@heading3": {},
- "highlight": "Markieren",
- "@highlight": {},
- "image": "Bild",
- "@image": {},
- "italic": "kursiv",
- "@italic": {},
- "link": "Verknüpfung",
- "@link": {},
- "numberedList": "NummerierteListe",
- "@numberedList": {},
- "quote": "zitieren",
- "@quote": {},
- "strikethrough": "durchgestrichen",
- "@strikethrough": {},
- "text": "Text",
- "@text": {},
- "underline": "unterstreichen",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_en.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_en.arb
deleted file mode 100644
index 6e8575552f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_en.arb
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "@@locale": "en",
- "bold": "Bold",
- "@bold": {},
- "bulletedList": "Bulleted List",
- "@bulletedList": {},
- "checkbox": "Checkbox",
- "@checkbox": {},
- "embedCode": "Embed Code",
- "@embedCode": {},
- "heading1": "H1",
- "@heading1": {},
- "heading2": "H2",
- "@heading2": {},
- "heading3": "H3",
- "@heading3": {},
- "highlight": "Highlight",
- "@highlight": {},
- "color": "Color",
- "@color": {},
- "image": "Image",
- "@image": {},
- "italic": "Italic",
- "@italic": {},
- "link": "Link",
- "@link": {},
- "numberedList": "Numbered List",
- "@numberedList": {},
- "quote": "Quote",
- "@quote": {},
- "strikethrough": "Strikethrough",
- "@strikethrough": {},
- "text": "Text",
- "@text": {},
- "underline": "Underline",
- "@underline": {},
- "fontColorDefault": "Default",
- "@fontColorDefault": {},
- "fontColorGray": "Gray",
- "@fontColorGray": {},
- "fontColorBrown": "Brown",
- "@fontColorBrown": {},
- "fontColorOrange": "Orange",
- "@fontColorOrange": {},
- "fontColorYellow": "Yellow",
- "@fontColorYellow": {},
- "fontColorGreen": "Green",
- "@fontColorGreen": {},
- "fontColorBlue": "Blue",
- "@fontColorBlue": {},
- "fontColorPurple": "Purple",
- "@fontColorPurple": {},
- "fontColorPink": "Pink",
- "@fontColorPink": {},
- "fontColorRed": "Red",
- "@fontColorRed": {},
- "backgroundColorDefault": "Default background",
- "@backgroundColorDefault": {},
- "backgroundColorGray": "Gray background",
- "@backgroundColorGray": {},
- "backgroundColorBrown": "Brown background",
- "@backgroundColorBrown": {},
- "backgroundColorOrange": "Orange background",
- "@backgroundColorOrange": {},
- "backgroundColorYellow": "Yellow background",
- "@backgroundColorYellow": {},
- "backgroundColorGreen": "Green background",
- "@backgroundColorGreen": {},
- "backgroundColorBlue": "Blue background",
- "@backgroundColorBlue": {},
- "backgroundColorPurple": "Purple background",
- "@backgroundColorPurple": {},
- "backgroundColorPink": "Pink background",
- "@backgroundColorPink": {},
- "backgroundColorRed": "Red background",
- "@backgroundColorRed": {},
- "tint1": "Tint 1",
- "tint2": "Tint 2",
- "tint3": "Tint 3",
- "tint4": "Tint 4",
- "tint5": "Tint 5",
- "tint6": "Tint 6",
- "tint7": "Tint 7",
- "tint8": "Tint 8",
- "tint9": "Tint 9",
- "lightLightTint1": "Purple",
- "lightLightTint2": "Pink",
- "lightLightTint3": "Light Pink",
- "lightLightTint4": "Orange",
- "lightLightTint5": "Yellow",
- "lightLightTint6": "Lime",
- "lightLightTint7": "Green",
- "lightLightTint8": "Aqua",
- "lightLightTint9": "Blue"
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_es_VE.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_es_VE.arb
deleted file mode 100644
index bace9331ae..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_es_VE.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "es-VE",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_fr_CA.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_fr_CA.arb
deleted file mode 100644
index 1ff4ab2f75..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_fr_CA.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "fr-CA",
- "bold": "gras",
- "@bold": {},
- "bulletedList": "liste à puces",
- "@bulletedList": {},
- "checkbox": "case à cocher",
- "@checkbox": {},
- "embedCode": "incorporer Code",
- "@embedCode": {},
- "heading1": "en-tête1",
- "@heading1": {},
- "heading2": "en-tête2",
- "@heading2": {},
- "heading3": "en-tête3",
- "@heading3": {},
- "highlight": "mettre en évidence",
- "@highlight": {},
- "image": "l’image",
- "@image": {},
- "italic": "italique",
- "@italic": {},
- "link": "lien",
- "@link": {},
- "numberedList": "liste numérotée",
- "@numberedList": {},
- "quote": "citation",
- "@quote": {},
- "strikethrough": "barré",
- "@strikethrough": {},
- "text": "texte",
- "@text": {},
- "underline": "souligner",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_fr_FR.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_fr_FR.arb
deleted file mode 100644
index 0e63189506..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_fr_FR.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "fr-FR",
- "bold": "Gras",
- "@bold": {},
- "bulletedList": "List à puces",
- "@bulletedList": {},
- "checkbox": "Case à cocher",
- "@checkbox": {},
- "embedCode": "Incorporer code",
- "@embedCode": {},
- "heading1": "Titre 1",
- "@heading1": {},
- "heading2": "Titre 2",
- "@heading2": {},
- "heading3": "Titre 3",
- "@heading3": {},
- "highlight": "Surligné",
- "@highlight": {},
- "image": "Image",
- "@image": {},
- "italic": "Italique",
- "@italic": {},
- "link": "Lien",
- "@link": {},
- "numberedList": "Liste numérotée",
- "@numberedList": {},
- "quote": "Citation",
- "@quote": {},
- "strikethrough": "Barré",
- "@strikethrough": {},
- "text": "Texte",
- "@text": {},
- "underline": "Souligné",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_hi_IN.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_hi_IN.arb
deleted file mode 100644
index 96102143c1..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_hi_IN.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "hi-IN",
- "bold": "बोल्ड",
- "@bold": {},
- "bulletedList": "बुलेटेड सूची",
- "@bulletedList": {},
- "checkbox": "चेक बॉक्स",
- "@checkbox": {},
- "embedCode": "लागु किया गया संहिता",
- "@embedCode": {},
- "heading1": "शीर्षक 1",
- "@heading1": {},
- "heading2": "शीर्षक 2",
- "@heading2": {},
- "heading3": "शीर्षक 3",
- "@heading3": {},
- "highlight": "प्रमुखता से दिखाना",
- "@highlight": {},
- "image": "छवि",
- "@image": {},
- "italic": "तिरछा",
- "@italic": {},
- "link": "संपर्क",
- "@link": {},
- "numberedList": "क्रमांकित सूची",
- "@numberedList": {},
- "quote": "उद्धरण",
- "@quote": {},
- "strikethrough": "स्ट्राइकथ्रू",
- "@strikethrough": {},
- "text": "मूलपाठ",
- "@text": {},
- "underline": "रेखांकन",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_hu_HU.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_hu_HU.arb
deleted file mode 100644
index f96b3b0ec3..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_hu_HU.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "hu-HU",
- "bold": "bátor",
- "@bold": {},
- "bulletedList": "pontozott lista",
- "@bulletedList": {},
- "checkbox": "jelölőnégyzetet",
- "@checkbox": {},
- "embedCode": "Beágyazás",
- "@embedCode": {},
- "heading1": "címsor1",
- "@heading1": {},
- "heading2": "címsor2",
- "@heading2": {},
- "heading3": "címsor3",
- "@heading3": {},
- "highlight": "Kiemel",
- "@highlight": {},
- "image": "kép",
- "@image": {},
- "italic": "dőlt",
- "@italic": {},
- "link": "link",
- "@link": {},
- "numberedList": "számozottLista",
- "@numberedList": {},
- "quote": "idézet",
- "@quote": {},
- "strikethrough": "áthúzott",
- "@strikethrough": {},
- "text": "szöveg",
- "@text": {},
- "underline": "aláhúzás",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_id_ID.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_id_ID.arb
deleted file mode 100644
index 6b3f6a0a6d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_id_ID.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "id-ID",
- "bold": "berani",
- "@bold": {},
- "bulletedList": "daftar berpoin",
- "@bulletedList": {},
- "checkbox": "kotak centang",
- "@checkbox": {},
- "embedCode": "menyematkan Kode",
- "@embedCode": {},
- "heading1": "pos1",
- "@heading1": {},
- "heading2": "pos2",
- "@heading2": {},
- "heading3": "pos3",
- "@heading3": {},
- "highlight": "menyorot",
- "@highlight": {},
- "image": "gambar",
- "@image": {},
- "italic": "miring",
- "@italic": {},
- "link": "tautan",
- "@link": {},
- "numberedList": "daftar bernomor",
- "@numberedList": {},
- "quote": "mengutip",
- "@quote": {},
- "strikethrough": "coret",
- "@strikethrough": {},
- "text": "teks",
- "@text": {},
- "underline": "menggarisbawahi",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_it_IT.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_it_IT.arb
deleted file mode 100644
index e645959f7b..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_it_IT.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "it-IT",
- "bold": "Grassetto",
- "@bold": {},
- "bulletedList": "Elenco puntato",
- "@bulletedList": {},
- "checkbox": "Casella di spunta",
- "@checkbox": {},
- "embedCode": "Incorpora codice",
- "@embedCode": {},
- "heading1": "H1",
- "@heading1": {},
- "heading2": "H2",
- "@heading2": {},
- "heading3": "H3",
- "@heading3": {},
- "highlight": "Evidenzia",
- "@highlight": {},
- "image": "Immagine",
- "@image": {},
- "italic": "Corsivo",
- "@italic": {},
- "link": "Collegamento",
- "@link": {},
- "numberedList": "Elenco numerato",
- "@numberedList": {},
- "quote": "Cita",
- "@quote": {},
- "strikethrough": "Barrato",
- "@strikethrough": {},
- "text": "Testo",
- "@text": {},
- "underline": "Sottolineato",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ja_JP.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ja_JP.arb
deleted file mode 100644
index 5d49578cc3..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ja_JP.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "ja-JP",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ml_IN.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ml_IN.arb
deleted file mode 100644
index d48179e149..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ml_IN.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "ml_IN",
- "bold": "ബോൾഡ്",
- "@bold": {},
- "bulletedList": "ബുള്ളറ്റഡ് പട്ടിക",
- "@bulletedList": {},
- "checkbox": "ചെക്ക്ബോക്സ്",
- "@checkbox": {},
- "embedCode": "എംബെഡഡ് കോഡ്",
- "@embedCode": {},
- "heading1": "തലക്കെട്ട് 1",
- "@heading1": {},
- "heading2": "തലക്കെട്ട് 2",
- "@heading2": {},
- "heading3": "തലക്കെട്ട് 3",
- "@heading3": {},
- "highlight": "പ്രമുഖമാക്കിക്കാട്ടുക",
- "@highlight": {},
- "image": "ചിത്രം",
- "@image": {},
- "italic": "ഇറ്റാലിക്",
- "@italic": {},
- "link": "ലിങ്ക്",
- "@link": {},
- "numberedList": "അക്കമിട്ട പട്ടിക",
- "@numberedList": {},
- "quote": "ഉദ്ധരണി",
- "@quote": {},
- "strikethrough": "സ്ട്രൈക്ക്ത്രൂ",
- "@strikethrough": {},
- "text": "വചനം",
- "@text": {},
- "underline": "അടിവരയിടുക",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_nl_NL.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_nl_NL.arb
deleted file mode 100644
index 814e22655d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_nl_NL.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "nl-NL",
- "bold": "Vet",
- "@bold": {},
- "bulletedList": "Opsommingstekens",
- "@bulletedList": {},
- "checkbox": "Selectievakje",
- "@checkbox": {},
- "embedCode": "Invoegcode",
- "@embedCode": {},
- "heading1": "H1",
- "@heading1": {},
- "heading2": "H2",
- "@heading2": {},
- "heading3": "H3",
- "@heading3": {},
- "highlight": "Highlight",
- "@highlight": {},
- "image": "Afbeelding",
- "@image": {},
- "italic": "Cursief",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "Nummering",
- "@numberedList": {},
- "quote": "Quote",
- "@quote": {},
- "strikethrough": "Doorhalen",
- "@strikethrough": {},
- "text": "Tekst",
- "@text": {},
- "underline": "Onderstrepen",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pl_PL.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pl_PL.arb
deleted file mode 100644
index ba97af8f26..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pl_PL.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "pl-PL",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pt_BR.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pt_BR.arb
deleted file mode 100644
index 8f9186b7d8..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pt_BR.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "pt-BR",
- "bold": "Negrito",
- "@bold": {},
- "bulletedList": "Lista de marcadores",
- "@bulletedList": {},
- "checkbox": "Caixa de seleção",
- "@checkbox": {},
- "embedCode": "Código incorporado",
- "@embedCode": {},
- "heading1": "H1",
- "@heading1": {},
- "heading2": "H2",
- "@heading2": {},
- "heading3": "H3",
- "@heading3": {},
- "highlight": "Destacar",
- "@highlight": {},
- "image": "Imagem",
- "@image": {},
- "italic": "Itálico",
- "@italic": {},
- "link": "Link",
- "@link": {},
- "numberedList": "Lista numerada",
- "@numberedList": {},
- "quote": "Citar",
- "@quote": {},
- "strikethrough": "Rasurar",
- "@strikethrough": {},
- "text": "Texto",
- "@text": {},
- "underline": "Sublinhar",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pt_PT.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pt_PT.arb
deleted file mode 100644
index 9b7386fd46..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_pt_PT.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "pt-PT",
- "bold": "negrito",
- "@bold": {},
- "bulletedList": "lista com marcadores",
- "@bulletedList": {},
- "checkbox": "caixa de seleção",
- "@checkbox": {},
- "embedCode": "Código embutido",
- "@embedCode": {},
- "heading1": "Cabeçallho 1",
- "@heading1": {},
- "heading2": "Cabeçallho 2",
- "@heading2": {},
- "heading3": "Cabeçallho 3",
- "@heading3": {},
- "highlight": "realçar",
- "@highlight": {},
- "image": "imagem",
- "@image": {},
- "italic": "itálico",
- "@italic": {},
- "link": "link",
- "@link": {},
- "numberedList": "lista numerada",
- "@numberedList": {},
- "quote": "citar",
- "@quote": {},
- "strikethrough": "tachado",
- "@strikethrough": {},
- "text": "texto",
- "@text": {},
- "underline": "sublinhado",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ru_RU.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ru_RU.arb
deleted file mode 100644
index 33408dcaa0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_ru_RU.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "ru-RU",
- "bold": "смелый",
- "@bold": {},
- "bulletedList": "маркированный список",
- "@bulletedList": {},
- "checkbox": "флажок",
- "@checkbox": {},
- "embedCode": "код для вставки",
- "@embedCode": {},
- "heading1": "заголовок1",
- "@heading1": {},
- "heading2": "заголовок2",
- "@heading2": {},
- "heading3": "заголовок3",
- "@heading3": {},
- "highlight": "выделять",
- "@highlight": {},
- "image": "изображение",
- "@image": {},
- "italic": "курсив",
- "@italic": {},
- "link": "ссылка на сайт",
- "@link": {},
- "numberedList": "нумерованный список",
- "@numberedList": {},
- "quote": "цитировать",
- "@quote": {},
- "strikethrough": "зачеркнутый",
- "@strikethrough": {},
- "text": "текст",
- "@text": {},
- "underline": "подчеркнуть",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_tr_TR.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_tr_TR.arb
deleted file mode 100644
index 16887cd1cf..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_tr_TR.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "tr-TR",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_zh_CN.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_zh_CN.arb
deleted file mode 100644
index cc2c79985c..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_zh_CN.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "zh-CN",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_zh_TW.arb b/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_zh_TW.arb
deleted file mode 100644
index 4d2778a608..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/l10n/intl_zh_TW.arb
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "@@locale": "zh-TW",
- "bold": "",
- "@bold": {},
- "bulletedList": "",
- "@bulletedList": {},
- "checkbox": "",
- "@checkbox": {},
- "embedCode": "",
- "@embedCode": {},
- "heading1": "",
- "@heading1": {},
- "heading2": "",
- "@heading2": {},
- "heading3": "",
- "@heading3": {},
- "highlight": "",
- "@highlight": {},
- "image": "",
- "@image": {},
- "italic": "",
- "@italic": {},
- "link": "",
- "@link": {},
- "numberedList": "",
- "@numberedList": {},
- "quote": "",
- "@quote": {},
- "strikethrough": "",
- "@strikethrough": {},
- "text": "",
- "@text": {},
- "underline": "",
- "@underline": {}
-}
\ No newline at end of file
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/attributes_commands.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/attributes_commands.dart
deleted file mode 100644
index b506bd100c..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/attributes_commands.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-import 'package:appflowy_editor/src/commands/command_extension.dart';
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/editor_state.dart';
-
-extension TextCommands on EditorState {
- Future updateNodeAttributes(
- Attributes attributes, {
- Path? path,
- Node? node,
- }) {
- return futureCommand(() {
- final n = getNode(path: path, node: node);
- apply(
- transaction..updateNode(n, attributes),
- );
- });
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/command_extension.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/command_extension.dart
deleted file mode 100644
index 71c3ef4a9d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/command_extension.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-import 'dart:async';
-
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/location/selection.dart';
-import 'package:appflowy_editor/src/editor_state.dart';
-import 'package:flutter/widgets.dart';
-
-extension CommandExtension on EditorState {
- Future futureCommand(void Function() fn) async {
- final completer = Completer();
- fn();
- WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
- completer.complete();
- });
- return completer.future;
- }
-
- Node getNode({
- Path? path,
- Node? node,
- }) {
- if (node != null) {
- return node;
- } else if (path != null) {
- return document.nodeAtPath(path)!;
- }
- throw Exception('path and node cannot be null at the same time');
- }
-
- TextNode getTextNode({
- Path? path,
- TextNode? textNode,
- }) {
- if (textNode != null) {
- return textNode;
- } else if (path != null) {
- return document.nodeAtPath(path)! as TextNode;
- }
- throw Exception('path and node cannot be null at the same time');
- }
-
- Selection getSelection(
- Selection? selection,
- ) {
- final currentSelection = service.selectionService.currentSelection.value;
- if (selection != null) {
- return selection;
- } else if (currentSelection != null) {
- return currentSelection;
- }
- throw Exception('path and textNode cannot be null at the same time');
- }
-
- List getTextInSelection(
- List textNodes,
- Selection selection,
- ) {
- List res = [];
- if (selection.isSingle) {
- final plainText = textNodes.first.toPlainText();
- res.add(plainText.substring(selection.startIndex, selection.endIndex));
- } else if (!selection.isCollapsed) {
- for (var i = 0; i < textNodes.length; i++) {
- final plainText = textNodes[i].toPlainText();
- if (i == 0) {
- res.add(
- plainText.substring(
- selection.startIndex,
- plainText.length,
- ),
- );
- } else if (i == textNodes.length - 1) {
- res.add(plainText.substring(0, selection.endIndex));
- } else {
- res.add(plainText);
- }
- }
- }
- return res;
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/text/text_commands.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/text/text_commands.dart
deleted file mode 100644
index 3a6c62aa62..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/commands/text/text_commands.dart
+++ /dev/null
@@ -1,127 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-
-extension TextCommands on EditorState {
- /// Insert text at the given index of the given [TextNode] or the [Path].
- ///
- /// [Path] and [TextNode] are mutually exclusive.
- /// One of these two parameters must have a value.
- Future insertText(
- int index,
- String text, {
- Path? path,
- TextNode? textNode,
- }) async {
- final n = getTextNode(path: path, textNode: textNode);
- return apply(
- transaction..insertText(n, index, text),
- );
- }
-
- Future insertTextAtCurrentSelection(String text) async {
- final selection = getSelection(null);
- assert(selection.isCollapsed);
- final textNode = getTextNode(path: selection.start.path);
- return insertText(
- selection.startIndex,
- text,
- textNode: textNode,
- );
- }
-
- Future formatText(
- EditorState editorState,
- Selection? selection,
- Attributes attributes, {
- Path? path,
- TextNode? textNode,
- }) async {
- final n = getTextNode(path: path, textNode: textNode);
- final s = getSelection(selection);
- return apply(
- transaction..formatText(n, s.startIndex, s.length, attributes),
- );
- }
-
- Future formatTextWithBuiltInAttribute(
- EditorState editorState,
- String key,
- Attributes attributes, {
- Selection? selection,
- Path? path,
- TextNode? textNode,
- }) async {
- final n = getTextNode(path: path, textNode: textNode);
- if (BuiltInAttributeKey.globalStyleKeys.contains(key)) {
- final attr = n.attributes
- ..removeWhere(
- (key, _) => BuiltInAttributeKey.globalStyleKeys.contains(key))
- ..addAll(attributes)
- ..addAll({
- BuiltInAttributeKey.subtype: key,
- });
- return apply(
- transaction..updateNode(n, attr),
- );
- } else if (BuiltInAttributeKey.partialStyleKeys.contains(key)) {
- final s = getSelection(selection);
- return apply(
- transaction..formatText(n, s.startIndex, s.length, attributes),
- );
- }
- }
-
- Future formatTextToCheckbox(
- EditorState editorState,
- bool check, {
- Path? path,
- TextNode? textNode,
- }) async {
- return formatTextWithBuiltInAttribute(
- editorState,
- BuiltInAttributeKey.checkbox,
- {BuiltInAttributeKey.checkbox: check},
- path: path,
- textNode: textNode,
- );
- }
-
- Future formatLinkInText(
- EditorState editorState,
- String? link, {
- Path? path,
- TextNode? textNode,
- }) async {
- return formatTextWithBuiltInAttribute(
- editorState,
- BuiltInAttributeKey.href,
- {BuiltInAttributeKey.href: link},
- path: path,
- textNode: textNode,
- );
- }
-
- Future insertNewLine({
- Path? path,
- }) async {
- final p = path ?? getSelection(null).start.path.next;
- final transaction = this.transaction;
- transaction.insertNode(p, TextNode.empty());
- transaction.afterSelection = Selection.single(
- path: p,
- startOffset: 0,
- );
- return apply(transaction);
- }
-
- Future insertNewLineAtCurrentSelection() async {
- final selection = getSelection(null);
- assert(selection.isCollapsed);
- final textNode = getTextNode(path: selection.start.path);
- final transaction = this.transaction;
- transaction.splitText(
- textNode,
- selection.startIndex,
- );
- return apply(transaction);
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/attributes.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/attributes.dart
deleted file mode 100644
index 163e8e9ab6..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/attributes.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-/// Attributes is used to describe the Node's information.
-///
-/// Please note: The keywords in [BuiltInAttributeKey] are reserved.
-typedef Attributes = Map;
-
-Attributes? composeAttributes(
- Attributes? base,
- Attributes? other, {
- keepNull = false,
-}) {
- base ??= {};
- other ??= {};
- Attributes attributes = {
- ...base,
- ...other,
- };
-
- if (!keepNull) {
- attributes = Attributes.from(attributes)
- ..removeWhere((_, value) => value == null);
- }
-
- return attributes.isNotEmpty ? attributes : null;
-}
-
-Attributes invertAttributes(Attributes? from, Attributes? to) {
- from ??= {};
- to ??= {};
- final attributes = Attributes.from({});
-
- // key in from but not in to, or value is different
- for (final entry in from.entries) {
- if ((!to.containsKey(entry.key) && entry.value != null) ||
- to[entry.key] != entry.value) {
- attributes[entry.key] = entry.value;
- }
- }
-
- // key in to but not in from, or value is different
- for (final entry in to.entries) {
- if (!from.containsKey(entry.key) && entry.value != null) {
- attributes[entry.key] = null;
- }
- }
-
- return attributes;
-}
-
-int hashAttributes(Attributes base) => Object.hashAllUnordered(
- base.entries.map((e) => Object.hash(e.key, e.value)),
- );
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/document.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/document.dart
deleted file mode 100644
index 2994896b58..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/document.dart
+++ /dev/null
@@ -1,136 +0,0 @@
-import 'dart:collection';
-
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/document/text_delta.dart';
-
-/// [Document] reprensents a AppFlowy Editor document structure.
-///
-/// It stores the root of the document.
-///
-/// DO NOT directly mutate the properties of a [Document] object.
-class Document {
- Document({
- required this.root,
- });
-
- factory Document.fromJson(Map json) {
- assert(json['document'] is Map);
-
- final document = Map.from(json['document'] as Map);
- final root = Node.fromJson(document);
- return Document(root: root);
- }
-
- /// Creates a empty document with a single text node.
- factory Document.empty() {
- final root = Node(
- type: 'editor',
- children: LinkedList()..add(TextNode.empty()),
- );
- return Document(
- root: root,
- );
- }
-
- final Node root;
-
- /// Returns the node at the given [path].
- Node? nodeAtPath(Path path) {
- return root.childAtPath(path);
- }
-
- /// Inserts a [Node]s at the given [Path].
- bool insert(Path path, Iterable nodes) {
- if (path.isEmpty || nodes.isEmpty) {
- return false;
- }
-
- final target = nodeAtPath(path);
- if (target != null) {
- for (final node in nodes) {
- target.insertBefore(node);
- }
- return true;
- }
-
- final parent = nodeAtPath(path.parent);
- if (parent != null) {
- for (var i = 0; i < nodes.length; i++) {
- parent.insert(nodes.elementAt(i), index: path.last + i);
- }
- return true;
- }
-
- return false;
- }
-
- /// Deletes the [Node]s at the given [Path].
- bool delete(Path path, [int length = 1]) {
- if (path.isEmpty || length <= 0) {
- return false;
- }
- var target = nodeAtPath(path);
- if (target == null) {
- return false;
- }
- while (target != null && length > 0) {
- final next = target.next;
- target.unlink();
- target = next;
- length--;
- }
- return true;
- }
-
- /// Updates the [Node] at the given [Path]
- bool update(Path path, Attributes attributes) {
- if (path.isEmpty) {
- return false;
- }
- final target = nodeAtPath(path);
- if (target == null) {
- return false;
- }
- target.updateAttributes(attributes);
- return true;
- }
-
- /// Updates the [TextNode] at the given [Path]
- bool updateText(Path path, Delta delta) {
- if (path.isEmpty) {
- return false;
- }
- final target = nodeAtPath(path);
- if (target == null || target is! TextNode) {
- return false;
- }
- target.delta = target.delta.compose(delta);
- return true;
- }
-
- bool get isEmpty {
- if (root.children.isEmpty) {
- return true;
- }
-
- if (root.children.length > 1) {
- return false;
- }
-
- final node = root.children.first;
- if (node is TextNode &&
- (node.delta.isEmpty || node.delta.toPlainText().isEmpty)) {
- return true;
- }
-
- return false;
- }
-
- Map toJson() {
- return {
- 'document': root.toJson(),
- };
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/node.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/node.dart
deleted file mode 100644
index 1bb26da7fb..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/node.dart
+++ /dev/null
@@ -1,301 +0,0 @@
-import 'dart:collection';
-
-import 'package:flutter/material.dart';
-
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/document/text_delta.dart';
-import 'package:appflowy_editor/src/core/legacy/built_in_attribute_keys.dart';
-
-class Node extends ChangeNotifier with LinkedListEntry {
- Node({
- required this.type,
- Attributes? attributes,
- this.parent,
- LinkedList? children,
- }) : children = children ?? LinkedList(),
- _attributes = attributes ?? {} {
- for (final child in this.children) {
- child.parent = this;
- }
- }
-
- factory Node.fromJson(Map json) {
- assert(json['type'] is String);
-
- final jType = json['type'] as String;
- final jChildren = json['children'] as List?;
- final jAttributes = json['attributes'] != null
- ? Attributes.from(json['attributes'] as Map)
- : Attributes.from({});
-
- final children = LinkedList();
- if (jChildren != null) {
- children.addAll(
- jChildren.map(
- (jChild) => Node.fromJson(
- Map.from(jChild),
- ),
- ),
- );
- }
-
- Node node;
-
- if (jType == 'text') {
- final jDelta = json['delta'] as List?;
- final delta = jDelta == null ? Delta() : Delta.fromJson(jDelta);
- node = TextNode(
- children: children,
- attributes: jAttributes,
- delta: delta,
- );
- } else {
- node = Node(
- type: jType,
- children: children,
- attributes: jAttributes,
- );
- }
-
- for (final child in children) {
- child.parent = node;
- }
-
- return node;
- }
-
- final String type;
- final LinkedList children;
- Node? parent;
- Attributes _attributes;
-
- // Renderable
- final key = GlobalKey();
- final layerLink = LayerLink();
-
- Attributes get attributes => {..._attributes};
-
- String get id {
- if (subtype != null) {
- return '$type/$subtype';
- }
- return type;
- }
-
- String? get subtype {
- if (attributes[BuiltInAttributeKey.subtype] is String) {
- return attributes[BuiltInAttributeKey.subtype] as String;
- }
- return null;
- }
-
- Path get path => _computePath();
-
- void updateAttributes(Attributes attributes) {
- final oldAttributes = this.attributes;
-
- _attributes = composeAttributes(this.attributes, attributes) ?? {};
-
- // Notifies the new attributes
- // if attributes contains 'subtype', should notify parent to rebuild node
- // else, just notify current node.
- bool shouldNotifyParent =
- this.attributes['subtype'] != oldAttributes['subtype'];
- shouldNotifyParent ? parent?.notifyListeners() : notifyListeners();
- }
-
- Node? childAtIndex(int index) {
- if (children.length <= index || index < 0) {
- return null;
- }
-
- return children.elementAt(index);
- }
-
- Node? childAtPath(Path path) {
- if (path.isEmpty) {
- return this;
- }
-
- return childAtIndex(path.first)?.childAtPath(path.sublist(1));
- }
-
- void insert(Node entry, {int? index}) {
- final length = children.length;
- index ??= length;
-
- if (children.isEmpty) {
- entry.parent = this;
- children.add(entry);
- notifyListeners();
- return;
- }
-
- // If index is out of range, insert at the end.
- // If index is negative, insert at the beginning.
- // If index is positive, insert at the index.
- if (index >= length) {
- children.last.insertAfter(entry);
- } else if (index <= 0) {
- children.first.insertBefore(entry);
- } else {
- childAtIndex(index)?.insertBefore(entry);
- }
- }
-
- @override
- void insertAfter(Node entry) {
- entry.parent = parent;
- super.insertAfter(entry);
-
- // Notifies the new node.
- parent?.notifyListeners();
- }
-
- @override
- void insertBefore(Node entry) {
- entry.parent = parent;
- super.insertBefore(entry);
-
- // Notifies the new node.
- parent?.notifyListeners();
- }
-
- @override
- void unlink() {
- super.unlink();
-
- parent?.notifyListeners();
- parent = null;
- }
-
- Map toJson() {
- var map = {
- 'type': type,
- };
- if (children.isNotEmpty) {
- map['children'] =
- children.map((node) => node.toJson()).toList(growable: false);
- }
- if (attributes.isNotEmpty) {
- map['attributes'] = attributes;
- }
- return map;
- }
-
- Node copyWith({
- String? type,
- LinkedList? children,
- Attributes? attributes,
- }) {
- final node = Node(
- type: type ?? this.type,
- attributes: attributes ?? {...this.attributes},
- children: children,
- );
- if (children == null && this.children.isNotEmpty) {
- for (final child in this.children) {
- node.children.add(
- child.copyWith()..parent = node,
- );
- }
- }
- return node;
- }
-
- Path _computePath([Path previous = const []]) {
- if (parent == null) {
- return previous;
- }
- var index = 0;
- for (final child in parent!.children) {
- if (child == this) {
- break;
- }
- index += 1;
- }
- return parent!._computePath([index, ...previous]);
- }
-}
-
-class TextNode extends Node {
- TextNode({
- required Delta delta,
- LinkedList? children,
- Attributes? attributes,
- }) : _delta = delta,
- super(
- type: 'text',
- children: children,
- attributes: attributes ?? {},
- );
-
- TextNode.empty({Attributes? attributes})
- : _delta = Delta(operations: [TextInsert('')]),
- super(
- type: 'text',
- attributes: attributes ?? {},
- );
-
- Delta _delta;
- Delta get delta => _delta;
- set delta(Delta v) {
- _delta = v;
- notifyListeners();
- }
-
- @override
- Map toJson() {
- final map = super.toJson();
- map['delta'] = delta.toJson();
- return map;
- }
-
- @override
- TextNode copyWith({
- String? type = 'text',
- LinkedList? children,
- Attributes? attributes,
- Delta? delta,
- }) {
- final textNode = TextNode(
- children: children,
- attributes: attributes ?? this.attributes,
- delta: delta ?? this.delta,
- );
- if (children == null && this.children.isNotEmpty) {
- for (final child in this.children) {
- textNode.children.add(
- child.copyWith()..parent = textNode,
- );
- }
- }
- return textNode;
- }
-
- String toPlainText() => _delta.toPlainText();
-}
-
-extension NodeEquality on Iterable {
- bool equals(Iterable other) {
- if (length != other.length) {
- return false;
- }
- for (var i = 0; i < length; i++) {
- if (!_nodeEquals(elementAt(i), other.elementAt(i))) {
- return false;
- }
- }
- return true;
- }
-
- bool _nodeEquals(T base, U other) {
- if (identical(this, other)) return true;
-
- return base is Node &&
- other is Node &&
- other.type == base.type &&
- other.children.equals(base.children);
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/node_iterator.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/node_iterator.dart
deleted file mode 100644
index ef086af8cb..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/node_iterator.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/document.dart';
-
-/// [NodeIterator] is used to traverse the nodes in visual order.
-class NodeIterator implements Iterator {
- NodeIterator({
- required this.document,
- required this.startNode,
- this.endNode,
- });
-
- final Document document;
- final Node startNode;
- final Node? endNode;
-
- Node? _currentNode;
- bool _began = false;
-
- @override
- Node get current => _currentNode!;
-
- @override
- bool moveNext() {
- if (!_began) {
- _currentNode = startNode;
- _began = true;
- return true;
- }
-
- if (_currentNode == null) {
- return false;
- }
- Node node = _currentNode!;
-
- if (endNode != null && endNode == node) {
- _currentNode = null;
- return false;
- }
-
- if (node.children.isNotEmpty) {
- _currentNode = node.children.first;
- } else if (node.next != null) {
- _currentNode = node.next!;
- } else {
- while (node.parent != null) {
- node = node.parent!;
- final nextOfParent = node.next;
- if (nextOfParent == null) {
- _currentNode = null;
- } else {
- _currentNode = nextOfParent;
- break;
- }
- }
- }
-
- return _currentNode != null;
- }
-
- List toList() {
- final result = [];
- while (moveNext()) {
- result.add(current);
- }
- return result;
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/path.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/path.dart
deleted file mode 100644
index 5e411407d5..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/path.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-import 'dart:math';
-
-import 'package:flutter/foundation.dart';
-
-typedef Path = List;
-
-extension PathExtensions on Path {
- bool equals(Path other) {
- return listEquals(this, other);
- }
-
- bool operator >=(Path other) {
- if (equals(other)) {
- return true;
- }
- return this > other;
- }
-
- bool operator >(Path other) {
- if (equals(other)) {
- return false;
- }
- final length = min(this.length, other.length);
- for (var i = 0; i < length; i++) {
- if (this[i] < other[i]) {
- return false;
- } else if (this[i] > other[i]) {
- return true;
- }
- }
- if (this.length < other.length) {
- return false;
- }
- return true;
- }
-
- bool operator <=(Path other) {
- if (equals(other)) {
- return true;
- }
- return this < other;
- }
-
- bool operator <(Path other) {
- if (equals(other)) {
- return false;
- }
- final length = min(this.length, other.length);
- for (var i = 0; i < length; i++) {
- if (this[i] > other[i]) {
- return false;
- } else if (this[i] < other[i]) {
- return true;
- }
- }
- if (this.length > other.length) {
- return false;
- }
- return true;
- }
-
- Path get next {
- Path nextPath = Path.from(this, growable: true);
- if (isEmpty) {
- return nextPath;
- }
- final last = nextPath.last;
- return nextPath
- ..removeLast()
- ..add(last + 1);
- }
-
- Path get previous {
- Path previousPath = Path.from(this, growable: true);
- if (isEmpty) {
- return previousPath;
- }
- final last = previousPath.last;
- return previousPath
- ..removeLast()
- ..add(max(0, last - 1));
- }
-
- Path get parent {
- if (isEmpty) {
- return this;
- }
- return Path.from(this, growable: true)..removeLast();
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/text_delta.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/text_delta.dart
deleted file mode 100644
index 9aa66d962a..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/document/text_delta.dart
+++ /dev/null
@@ -1,548 +0,0 @@
-import 'dart:collection';
-import 'dart:math';
-
-import 'package:flutter/foundation.dart';
-
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-
-// constant number: 2^53 - 1
-const int _maxInt = 9007199254740991;
-
-List stringIndexes(String text) {
- final indexes = List.filled(text.length, 0);
- final iterator = text.runes.iterator;
-
- while (iterator.moveNext()) {
- for (var i = 0; i < iterator.currentSize; i++) {
- indexes[iterator.rawIndex + i] = iterator.rawIndex;
- }
- }
-
- return indexes;
-}
-
-abstract class TextOperation {
- Attributes? get attributes;
- int get length;
-
- bool get isEmpty => length == 0;
-
- Map toJson();
-}
-
-class TextInsert extends TextOperation {
- TextInsert(
- this.text, {
- Attributes? attributes,
- }) : _attributes = attributes;
-
- String text;
- final Attributes? _attributes;
-
- @override
- int get length => text.length;
-
- @override
- Attributes? get attributes => _attributes != null ? {..._attributes!} : null;
-
- @override
- Map toJson() {
- final result = {
- 'insert': text,
- };
- if (_attributes != null && _attributes!.isNotEmpty) {
- result['attributes'] = attributes;
- }
- return result;
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is TextInsert &&
- other.text == text &&
- _mapEquals(_attributes, other._attributes);
- }
-
- @override
- int get hashCode => text.hashCode ^ _attributes.hashCode;
-}
-
-class TextRetain extends TextOperation {
- TextRetain(
- this.length, {
- Attributes? attributes,
- }) : _attributes = attributes;
-
- @override
- int length;
- final Attributes? _attributes;
-
- @override
- Attributes? get attributes => _attributes != null ? {..._attributes!} : null;
-
- @override
- Map toJson() {
- final result = {
- 'retain': length,
- };
- if (_attributes != null && _attributes!.isNotEmpty) {
- result['attributes'] = attributes;
- }
- return result;
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is TextRetain &&
- other.length == length &&
- _mapEquals(_attributes, other._attributes);
- }
-
- @override
- int get hashCode => length.hashCode ^ _attributes.hashCode;
-}
-
-class TextDelete extends TextOperation {
- TextDelete({
- required this.length,
- });
-
- @override
- int length;
-
- @override
- Attributes? get attributes => null;
-
- @override
- Map toJson() {
- return {
- 'delete': length,
- };
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is TextDelete && other.length == length;
- }
-
- @override
- int get hashCode => length.hashCode;
-}
-
-/// Deltas are a simple, yet expressive format that can be used to describe contents and changes.
-/// The format is JSON based, and is human readable, yet easily parsible by machines.
-/// Deltas can describe any rich text document, includes all text and formatting information, without the ambiguity and complexity of HTML.
-///
-
-/// Basically borrowed from: https://github.com/quilljs/delta
-class Delta extends Iterable {
- Delta({
- List? operations,
- }) : _operations = operations ?? [];
-
- factory Delta.fromJson(List list) {
- final operations = [];
-
- for (final value in list) {
- if (value is Map) {
- final op = _textOperationFromJson(value);
- if (op != null) {
- operations.add(op);
- }
- }
- }
-
- return Delta(operations: operations);
- }
-
- final List _operations;
- String? _plainText;
- List? _runeIndexes;
-
- void addAll(Iterable textOperations) {
- textOperations.forEach(add);
- }
-
- void add(TextOperation textOperation) {
- if (textOperation.isEmpty) {
- return;
- }
- _plainText = null;
-
- if (_operations.isNotEmpty) {
- final lastOp = _operations.last;
- if (lastOp is TextDelete && textOperation is TextDelete) {
- lastOp.length += textOperation.length;
- return;
- }
- if (_mapEquals(lastOp.attributes, textOperation.attributes)) {
- if (lastOp is TextInsert && textOperation is TextInsert) {
- lastOp.text += textOperation.text;
- return;
- }
- // if there is an delete before the insert
- // swap the order
- if (lastOp is TextDelete && textOperation is TextInsert) {
- _operations.removeLast();
- _operations.add(textOperation);
- _operations.add(lastOp);
- return;
- }
- if (lastOp is TextRetain && textOperation is TextRetain) {
- lastOp.length += textOperation.length;
- return;
- }
- }
- }
-
- _operations.add(textOperation);
- }
-
- /// The slice() method does not change the original string.
- /// The start and end parameters specifies the part of the string to extract.
- /// The end position is optional.
- Delta slice(int start, [int? end]) {
- final result = Delta();
- final iterator = _OpIterator(_operations);
- int index = 0;
-
- while ((end == null || index < end) && iterator.hasNext) {
- TextOperation? nextOp;
- if (index < start) {
- nextOp = iterator._next(start - index);
- } else {
- nextOp = iterator._next(end == null ? null : end - index);
- result.add(nextOp);
- }
-
- index += nextOp.length;
- }
-
- return result;
- }
-
- /// Insert operations have an `insert` key defined.
- /// A String value represents inserting text.
- void insert(String text, {Attributes? attributes}) =>
- add(TextInsert(text, attributes: attributes));
-
- /// Retain operations have a Number `retain` key defined representing the number of characters to keep (other libraries might use the name keep or skip).
- /// An optional `attributes` key can be defined with an Object to describe formatting changes to the character range.
- /// A value of `null` in the `attributes` Object represents removal of that key.
- ///
- /// *Note: It is not necessary to retain the last characters of a document as this is implied.*
- void retain(int length, {Attributes? attributes}) =>
- add(TextRetain(length, attributes: attributes));
-
- /// Delete operations have a Number `delete` key defined representing the number of characters to delete.
- void delete(int length) => add(TextDelete(length: length));
-
- /// The length of the string fo the [Delta].
- @override
- int get length {
- return _operations.fold(
- 0, (previousValue, element) => previousValue + element.length);
- }
-
- /// Returns a Delta that is equivalent to applying the operations of own Delta, followed by another Delta.
- Delta compose(Delta other) {
- final thisIter = _OpIterator(_operations);
- final otherIter = _OpIterator(other._operations);
- final operations = [];
-
- final firstOther = otherIter.peek();
- if (firstOther != null &&
- firstOther is TextRetain &&
- firstOther.attributes == null) {
- int firstLeft = firstOther.length;
- while (
- thisIter.peek() is TextInsert && thisIter.peekLength() <= firstLeft) {
- firstLeft -= thisIter.peekLength();
- final next = thisIter._next();
- operations.add(next);
- }
- if (firstOther.length - firstLeft > 0) {
- otherIter._next(firstOther.length - firstLeft);
- }
- }
-
- final delta = Delta(operations: operations);
- while (thisIter.hasNext || otherIter.hasNext) {
- if (otherIter.peek() is TextInsert) {
- final next = otherIter._next();
- delta.add(next);
- } else if (thisIter.peek() is TextDelete) {
- final next = thisIter._next();
- delta.add(next);
- } else {
- // otherIs
- final length = min(thisIter.peekLength(), otherIter.peekLength());
- final thisOp = thisIter._next(length);
- final otherOp = otherIter._next(length);
- final attributes = composeAttributes(
- thisOp.attributes,
- otherOp.attributes,
- keepNull: thisOp is TextRetain,
- );
-
- if (otherOp is TextRetain && otherOp.length > 0) {
- TextOperation? newOp;
- if (thisOp is TextRetain) {
- newOp = TextRetain(length, attributes: attributes);
- } else if (thisOp is TextInsert) {
- newOp = TextInsert(thisOp.text, attributes: attributes);
- }
-
- if (newOp != null) {
- delta.add(newOp);
- }
-
- // Optimization if rest of other is just retain
- if (!otherIter.hasNext &&
- delta._operations.isNotEmpty &&
- delta._operations.last == newOp) {
- final rest = Delta(operations: thisIter.rest());
- return (delta + rest)..chop();
- }
- } else if (otherOp is TextDelete && (thisOp is TextRetain)) {
- delta.add(otherOp);
- }
- }
- }
-
- return delta..chop();
- }
-
- /// This method joins two Delta together.
- Delta operator +(Delta other) {
- var operations = [..._operations];
- if (other._operations.isNotEmpty) {
- operations.add(other._operations[0]);
- operations.addAll(other._operations.sublist(1));
- }
- return Delta(operations: operations);
- }
-
- void chop() {
- if (_operations.isEmpty) {
- return;
- }
- _plainText = null;
- final lastOp = _operations.last;
- if (lastOp is TextRetain && (lastOp.attributes?.length ?? 0) == 0) {
- _operations.removeLast();
- }
- }
-
- @override
- bool operator ==(Object other) {
- if (other is! Delta) {
- return false;
- }
- return listEquals(_operations, other._operations);
- }
-
- @override
- int get hashCode {
- return Object.hashAll(_operations);
- }
-
- /// Returned an inverted delta that has the opposite effect of against a base document delta.
- Delta invert(Delta base) {
- final inverted = Delta();
- _operations.fold(0, (int previousValue, op) {
- if (op is TextInsert) {
- inverted.delete(op.length);
- } else if (op is TextRetain && op.attributes == null) {
- inverted.retain(op.length);
- return previousValue + op.length;
- } else if (op is TextDelete || op is TextRetain) {
- final length = op.length;
- final slice = base.slice(previousValue, previousValue + length);
- for (final baseOp in slice._operations) {
- if (op is TextDelete) {
- inverted.add(baseOp);
- } else if (op is TextRetain && op.attributes != null) {
- inverted.retain(
- baseOp.length,
- attributes: invertAttributes(baseOp.attributes, op.attributes),
- );
- }
- }
- return previousValue + length;
- }
- return previousValue;
- });
- return inverted..chop();
- }
-
- List toJson() {
- return _operations.map((e) => e.toJson()).toList();
- }
-
- /// This method will return the position of the previous rune.
- ///
- /// Since the encoding of the [String] in Dart is UTF-16.
- /// If you want to find the previous character of a position,
- /// you can' just use the `position - 1` simply.
- ///
- /// This method can help you to compute the position of the previous character.
- int prevRunePosition(int pos) {
- if (pos == 0) {
- return pos - 1;
- }
- _plainText ??=
- _operations.whereType().map((op) => op.text).join();
- _runeIndexes ??= stringIndexes(_plainText!);
- return _runeIndexes![pos - 1];
- }
-
- /// This method will return the position of the next rune.
- ///
- /// Since the encoding of the [String] in Dart is UTF-16.
- /// If you want to find the previous character of a position,
- /// you can' just use the `position + 1` simply.
- ///
- /// This method can help you to compute the position of the next character.
- int nextRunePosition(int pos) {
- final stringContent = toPlainText();
- if (pos >= stringContent.length - 1) {
- return stringContent.length;
- }
- _runeIndexes ??= stringIndexes(_plainText!);
-
- for (var i = pos + 1; i < _runeIndexes!.length; i++) {
- if (_runeIndexes![i] != pos) {
- return _runeIndexes![i];
- }
- }
-
- return stringContent.length;
- }
-
- String toPlainText() {
- _plainText ??=
- _operations.whereType().map((op) => op.text).join();
- return _plainText!;
- }
-
- @override
- Iterator get iterator => _operations.iterator;
-
- static TextOperation? _textOperationFromJson(Map json) {
- TextOperation? operation;
-
- if (json['insert'] is String) {
- final attributes = json['attributes'] as Map?;
- operation = TextInsert(
- json['insert'] as String,
- attributes: attributes != null ? {...attributes} : null,
- );
- } else if (json['retain'] is int) {
- final attrs = json['attributes'] as Map?;
- operation = TextRetain(
- json['retain'] as int,
- attributes: attrs != null ? {...attrs} : null,
- );
- } else if (json['delete'] is int) {
- operation = TextDelete(length: json['delete'] as int);
- }
-
- return operation;
- }
-}
-
-class _OpIterator {
- _OpIterator(
- Iterable operations,
- ) : _operations = UnmodifiableListView(operations);
-
- final UnmodifiableListView _operations;
- int _index = 0;
- int _offset = 0;
-
- bool get hasNext {
- return peekLength() < _maxInt;
- }
-
- TextOperation? peek() {
- if (_index >= _operations.length) {
- return null;
- }
-
- return _operations[_index];
- }
-
- int peekLength() {
- if (_index < _operations.length) {
- final op = _operations[_index];
- return op.length - _offset;
- }
- return _maxInt;
- }
-
- TextOperation _next([int? length]) {
- length ??= _maxInt;
-
- if (_index >= _operations.length) {
- return TextRetain(_maxInt);
- }
-
- final nextOp = _operations[_index];
-
- final offset = _offset;
- final opLength = nextOp.length;
- if (length >= opLength - offset) {
- length = opLength - offset;
- _index += 1;
- _offset = 0;
- } else {
- _offset += length;
- }
- if (nextOp is TextDelete) {
- return TextDelete(length: length);
- }
-
- if (nextOp is TextRetain) {
- return TextRetain(length, attributes: nextOp.attributes);
- }
-
- if (nextOp is TextInsert) {
- return TextInsert(
- nextOp.text.substring(offset, offset + length),
- attributes: nextOp.attributes,
- );
- }
-
- return TextRetain(_maxInt);
- }
-
- List rest() {
- if (!hasNext) {
- return [];
- } else if (_offset == 0) {
- return _operations.sublist(_index);
- } else {
- final offset = _offset;
- final index = _index;
- final next = _next();
- final rest = _operations.sublist(_index);
- _offset = offset;
- _index = index;
- return [next] + rest;
- }
- }
-}
-
-bool _mapEquals(Map? a, Map? b) {
- if ((a == null || a.isEmpty) && (b == null || b.isEmpty)) {
- return true;
- }
- return mapEquals(a, b);
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/legacy/built_in_attribute_keys.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/legacy/built_in_attribute_keys.dart
deleted file mode 100644
index 6421e7efd0..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/legacy/built_in_attribute_keys.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-///
-/// Supported partial rendering types:
-/// bold, italic,
-/// underline, strikethrough,
-/// color, font,
-/// href
-///
-/// Supported global rendering types:
-/// heading: h1, h2, h3, h4, h5, h6, ...
-/// block quote,
-/// list: ordered list, bulleted list,
-/// code block
-///
-class BuiltInAttributeKey {
- static String bold = 'bold';
- static String italic = 'italic';
- static String underline = 'underline';
- static String strikethrough = 'strikethrough';
- static String color = 'color';
- static String backgroundColor = 'backgroundColor';
- static String font = 'font';
- static String href = 'href';
-
- static String subtype = 'subtype';
- static String heading = 'heading';
- static String h1 = 'h1';
- static String h2 = 'h2';
- static String h3 = 'h3';
- static String h4 = 'h4';
- static String h5 = 'h5';
- static String h6 = 'h6';
-
- static String bulletedList = 'bulleted-list';
- static String numberList = 'number-list';
-
- static String quote = 'quote';
- static String checkbox = 'checkbox';
- static String code = 'code';
- static String number = 'number';
-
- static List partialStyleKeys = [
- BuiltInAttributeKey.bold,
- BuiltInAttributeKey.italic,
- BuiltInAttributeKey.underline,
- BuiltInAttributeKey.strikethrough,
- BuiltInAttributeKey.backgroundColor,
- BuiltInAttributeKey.color,
- BuiltInAttributeKey.href,
- BuiltInAttributeKey.code,
- ];
-
- static List globalStyleKeys = [
- BuiltInAttributeKey.subtype,
- BuiltInAttributeKey.heading,
- BuiltInAttributeKey.checkbox,
- BuiltInAttributeKey.bulletedList,
- BuiltInAttributeKey.numberList,
- BuiltInAttributeKey.quote,
- ];
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/location/position.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/location/position.dart
deleted file mode 100644
index 4f3d104d2d..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/location/position.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-import 'package:appflowy_editor/src/core/document/path.dart';
-
-class Position {
- final Path path;
- final int offset;
-
- Position({
- required this.path,
- this.offset = 0,
- });
-
- factory Position.fromJson(Map json) {
- final path = Path.from(json['path'] as List);
- final offset = json['offset'];
- return Position(
- path: path,
- offset: offset ?? 0,
- );
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is Position &&
- other.path.equals(path) &&
- other.offset == offset;
- }
-
- @override
- int get hashCode => Object.hash(offset, Object.hashAll(path));
-
- @override
- String toString() => 'path = $path, offset = $offset';
-
- Position copyWith({Path? path, int? offset}) {
- return Position(
- path: path ?? this.path,
- offset: offset ?? this.offset,
- );
- }
-
- Map toJson() {
- return {
- 'path': path,
- 'offset': offset,
- };
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/location/selection.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/location/selection.dart
deleted file mode 100644
index 39410897eb..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/location/selection.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/location/position.dart';
-
-/// Selection represents the selected area or the cursor area in the editor.
-///
-/// [Selection] is directional.
-///
-/// 1. forward,the end position is before the start position.
-/// 2. backward, the end position is after the start position.
-/// 3. collapsed, the end position is equal to the start position.
-class Selection {
- /// Create a selection with [start], [end].
- Selection({
- required this.start,
- required this.end,
- });
-
- factory Selection.fromJson(Map json) {
- return Selection(
- start: Position.fromJson(json['start']),
- end: Position.fromJson(json['end']),
- );
- }
-
- /// Create a selection with [Path], [startOffset] and [endOffset].
- ///
- /// The [endOffset] is optional.
- ///
- /// This constructor will return a collapsed [Selection] if [endOffset] is null.
- ///
- Selection.single({
- required Path path,
- required int startOffset,
- int? endOffset,
- }) : start = Position(path: path, offset: startOffset),
- end = Position(path: path, offset: endOffset ?? startOffset);
-
- /// Create a collapsed selection with [position].
- Selection.collapsed(Position position)
- : start = position,
- end = position;
-
- final Position start;
- final Position end;
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is Selection && other.start == start && other.end == end;
- }
-
- @override
- int get hashCode => start.hashCode ^ end.hashCode;
-
- @override
- String toString() => 'start = $start, end = $end';
-
- /// Returns a Boolean indicating whether the selection's start and end points
- /// are at the same position.
- bool get isCollapsed => start == end;
-
- /// Returns a Boolean indicating whether the selection's start and end points
- /// are at the same path.
- bool get isSingle => start.path.equals(end.path);
-
- /// Returns a Boolean indicating whether the selection is forward.
- bool get isForward =>
- (start.path > end.path) || (isSingle && start.offset > end.offset);
-
- /// Returns a Boolean indicating whether the selection is backward.
- bool get isBackward =>
- (start.path < end.path) || (isSingle && start.offset < end.offset);
-
- /// Returns a normalized selection that direction is forward.
- Selection get normalized => isBackward ? copyWith() : reversed.copyWith();
-
- /// Returns a reversed selection.
- Selection get reversed => copyWith(start: end, end: start);
-
- /// Returns the offset in the starting position under the normalized selection.
- int get startIndex => normalized.start.offset;
-
- /// Returns the offset in the ending position under the normalized selection.
- int get endIndex => normalized.end.offset;
-
- int get length => endIndex - startIndex;
-
- /// Collapses the current selection to a single point.
- ///
- /// If [atStart] is true, the selection will be collapsed to the start point.
- /// If [atStart] is false, the selection will be collapsed to the end point.
- Selection collapse({bool atStart = false}) {
- if (atStart) {
- return copyWith(end: start);
- } else {
- return copyWith(start: end);
- }
- }
-
- Selection copyWith({Position? start, Position? end}) {
- return Selection(
- start: start ?? this.start,
- end: end ?? this.end,
- );
- }
-
- Map toJson() {
- return {
- 'start': start.toJson(),
- 'end': end.toJson(),
- };
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/operation.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/operation.dart
deleted file mode 100644
index 31662a61ca..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/operation.dart
+++ /dev/null
@@ -1,273 +0,0 @@
-import 'package:flutter/foundation.dart';
-
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/document/text_delta.dart';
-
-/// [Operation] represents a change to a [Document].
-abstract class Operation {
- Operation(
- this.path,
- );
-
- factory Operation.fromJson() => throw UnimplementedError();
-
- final Path path;
-
- /// Inverts the operation.
- ///
- /// Returns the inverted operation.
- Operation invert();
-
- /// Returns the JSON representation of the operation.
- Map toJson();
-
- Operation copyWith({Path? path});
-}
-
-/// [InsertOperation] represents an insert operation.
-class InsertOperation extends Operation {
- InsertOperation(
- super.path,
- this.nodes,
- );
-
- factory InsertOperation.fromJson(Map json) {
- final path = json['path'] as Path;
- final nodes = (json['nodes'] as List)
- .map((n) => Node.fromJson(n))
- .toList(growable: false);
- return InsertOperation(path, nodes);
- }
-
- final Iterable nodes;
-
- @override
- Operation invert() => DeleteOperation(path, nodes);
-
- @override
- Map toJson() {
- return {
- 'op': 'insert',
- 'path': path,
- 'nodes': nodes.map((n) => n.toJson()).toList(growable: false),
- };
- }
-
- @override
- Operation copyWith({Path? path}) {
- return InsertOperation(path ?? this.path, nodes);
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is InsertOperation &&
- other.path.equals(path) &&
- other.nodes.equals(nodes);
- }
-
- @override
- int get hashCode => path.hashCode ^ Object.hashAll(nodes);
-}
-
-/// [DeleteOperation] represents a delete operation.
-class DeleteOperation extends Operation {
- DeleteOperation(
- super.path,
- this.nodes,
- );
-
- factory DeleteOperation.fromJson(Map json) {
- final path = json['path'] as Path;
- final nodes = (json['nodes'] as List)
- .map((n) => Node.fromJson(n))
- .toList(growable: false);
- return DeleteOperation(path, nodes);
- }
-
- final Iterable nodes;
-
- @override
- Operation invert() => InsertOperation(path, nodes);
-
- @override
- Map toJson() {
- return {
- 'op': 'delete',
- 'path': path,
- 'nodes': nodes.map((n) => n.toJson()).toList(growable: false),
- };
- }
-
- @override
- Operation copyWith({Path? path}) {
- return DeleteOperation(path ?? this.path, nodes);
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is DeleteOperation &&
- other.path.equals(path) &&
- other.nodes.equals(nodes);
- }
-
- @override
- int get hashCode => path.hashCode ^ Object.hashAll(nodes);
-}
-
-/// [UpdateOperation] represents an attributes update operation.
-class UpdateOperation extends Operation {
- UpdateOperation(
- super.path,
- this.attributes,
- this.oldAttributes,
- );
-
- factory UpdateOperation.fromJson(Map json) {
- final path = json['path'] as Path;
- final oldAttributes = json['oldAttributes'] as Attributes;
- final attributes = json['attributes'] as Attributes;
- return UpdateOperation(
- path,
- attributes,
- oldAttributes,
- );
- }
-
- final Attributes attributes;
- final Attributes oldAttributes;
-
- @override
- Operation invert() => UpdateOperation(
- path,
- oldAttributes,
- attributes,
- );
-
- @override
- Map toJson() {
- return {
- 'op': 'update',
- 'path': path,
- 'attributes': {...attributes},
- 'oldAttributes': {...oldAttributes},
- };
- }
-
- @override
- Operation copyWith({Path? path}) {
- return UpdateOperation(
- path ?? this.path,
- {...attributes},
- {...oldAttributes},
- );
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is UpdateOperation &&
- other.path.equals(path) &&
- mapEquals(other.attributes, attributes) &&
- mapEquals(other.oldAttributes, oldAttributes);
- }
-
- @override
- int get hashCode =>
- path.hashCode ^ attributes.hashCode ^ oldAttributes.hashCode;
-}
-
-/// [UpdateTextOperation] represents a text update operation.
-class UpdateTextOperation extends Operation {
- UpdateTextOperation(
- super.path,
- this.delta,
- this.inverted,
- );
-
- factory UpdateTextOperation.fromJson(Map json) {
- final path = json['path'] as Path;
- final delta = Delta.fromJson(json['delta']);
- final inverted = Delta.fromJson(json['inverted']);
- return UpdateTextOperation(path, delta, inverted);
- }
-
- final Delta delta;
- final Delta inverted;
-
- @override
- Operation invert() => UpdateTextOperation(path, inverted, delta);
-
- @override
- Map toJson() {
- return {
- 'op': 'update_text',
- 'path': path,
- 'delta': delta.toJson(),
- 'inverted': inverted.toJson(),
- };
- }
-
- @override
- Operation copyWith({Path? path}) {
- return UpdateTextOperation(path ?? this.path, delta, inverted);
- }
-
- @override
- bool operator ==(Object other) {
- if (identical(this, other)) return true;
-
- return other is UpdateTextOperation &&
- other.path.equals(path) &&
- other.delta == delta &&
- other.inverted == inverted;
- }
-
- @override
- int get hashCode => delta.hashCode ^ inverted.hashCode;
-}
-
-// TODO(Lucas.Xu): refactor this part
-Path transformPath(Path preInsertPath, Path b, [int delta = 1]) {
- if (preInsertPath.length > b.length) {
- return b;
- }
- if (preInsertPath.isEmpty || b.isEmpty) {
- return b;
- }
- // check the prefix
- for (var i = 0; i < preInsertPath.length - 1; i++) {
- if (preInsertPath[i] != b[i]) {
- return b;
- }
- }
- final prefix = preInsertPath.sublist(0, preInsertPath.length - 1);
- final suffix = b.sublist(preInsertPath.length);
- final preInsertLast = preInsertPath.last;
- final bAtIndex = b[preInsertPath.length - 1];
- if (preInsertLast <= bAtIndex) {
- prefix.add(bAtIndex + delta);
- } else {
- prefix.add(bAtIndex);
- }
- prefix.addAll(suffix);
- return prefix;
-}
-
-Operation transformOperation(Operation a, Operation b) {
- if (a is InsertOperation) {
- final newPath = transformPath(a.path, b.path, a.nodes.length);
- return b.copyWith(path: newPath);
- } else if (a is DeleteOperation) {
- final newPath = transformPath(a.path, b.path, -1 * a.nodes.length);
- return b.copyWith(path: newPath);
- }
- // TODO: transform update and textedit
- return b;
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/transaction.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/transaction.dart
deleted file mode 100644
index 6c369f566e..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/transaction.dart
+++ /dev/null
@@ -1,444 +0,0 @@
-import 'dart:math';
-
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-import 'package:appflowy_editor/src/core/document/document.dart';
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/document/text_delta.dart';
-import 'package:appflowy_editor/src/core/location/position.dart';
-import 'package:appflowy_editor/src/core/location/selection.dart';
-import 'package:appflowy_editor/src/core/transform/operation.dart';
-
-/// A [Transaction] has a list of [Operation] objects that will be applied
-/// to the editor.
-///
-/// There will be several ways to consume the transaction:
-/// 1. Apply to the state to update the UI.
-/// 2. Send to the backend to store and do operation transforming.
-class Transaction {
- Transaction({
- required this.document,
- });
-
- final Document document;
-
- /// The operations to be applied.
- final List operations = [];
-
- /// The selection to be applied.
- Selection? afterSelection;
-
- /// The before selection is to be recovered if needed.
- Selection? beforeSelection;
-
- /// Inserts the [Node] at the given [Path].
- void insertNode(
- Path path,
- Node node, {
- bool deepCopy = true,
- }) {
- insertNodes(path, [node], deepCopy: deepCopy);
- }
-
- /// Inserts a sequence of [Node]s at the given [Path].
- void insertNodes(
- Path path,
- Iterable nodes, {
- bool deepCopy = true,
- }) {
- if (deepCopy) {
- add(InsertOperation(path, nodes.map((e) => e.copyWith())));
- } else {
- add(InsertOperation(path, nodes));
- }
- }
-
- /// Updates the attributes of the [Node].
- ///
- /// The [attributes] will be merged into the existing attributes.
- void updateNode(Node node, Attributes attributes) {
- final inverted = invertAttributes(node.attributes, attributes);
- add(UpdateOperation(
- node.path,
- {...attributes},
- inverted,
- ));
- }
-
- /// Deletes the [Node] in the document.
- void deleteNode(Node node) {
- deleteNodesAtPath(node.path);
- }
-
- /// Deletes the [Node]s in the document.
- void deleteNodes(Iterable nodes) {
- nodes.forEach(deleteNode);
- }
-
- /// Deletes the [Node]s at the given [Path].
- ///
- /// The [length] indicates the number of consecutive deletions,
- /// including the node of the current path.
- void deleteNodesAtPath(Path path, [int length = 1]) {
- if (path.isEmpty) return;
- final nodes = [];
- final parent = path.parent;
- for (var i = 0; i < length; i++) {
- final node = document.nodeAtPath(parent + [path.last + i]);
- if (node == null) {
- break;
- }
- nodes.add(node);
- }
- add(DeleteOperation(path, nodes));
- }
-
- /// Update the [TextNode]s with the given [Delta].
- void updateText(TextNode textNode, Delta delta) {
- final inverted = delta.invert(textNode.delta);
- add(UpdateTextOperation(textNode.path, delta, inverted));
- }
-
- /// Returns the JSON representation of the transaction.
- Map toJson() {
- final json = {};
- if (operations.isNotEmpty) {
- json['operations'] = operations.map((o) => o.toJson()).toList();
- }
- if (afterSelection != null) {
- json['after_selection'] = afterSelection!.toJson();
- }
- if (beforeSelection != null) {
- json['before_selection'] = beforeSelection!.toJson();
- }
- return json;
- }
-
- /// Adds an operation to the transaction.
- /// This method will merge operations if they are both TextEdits.
- ///
- /// Also, this method will transform the path of the operations
- /// to avoid conflicts.
- void add(Operation op, {bool transform = true}) {
- final Operation? last = operations.isEmpty ? null : operations.last;
- if (last != null) {
- if (op is UpdateTextOperation &&
- last is UpdateTextOperation &&
- op.path.equals(last.path)) {
- final newOp = UpdateTextOperation(
- op.path,
- last.delta.compose(op.delta),
- op.inverted.compose(last.inverted),
- );
- operations[operations.length - 1] = newOp;
- return;
- }
- }
- if (transform) {
- for (var i = 0; i < operations.length; i++) {
- op = transformOperation(operations[i], op);
- }
- }
- if (op is UpdateTextOperation && op.delta.isEmpty) {
- return;
- }
- operations.add(op);
- }
-}
-
-extension TextTransaction on Transaction {
- void mergeText(
- TextNode first,
- TextNode second, {
- int? firstOffset,
- int secondOffset = 0,
- }) {
- final firstLength = first.delta.length;
- final secondLength = second.delta.length;
- firstOffset ??= firstLength;
- updateText(
- first,
- Delta()
- ..retain(firstOffset)
- ..delete(firstLength - firstOffset)
- ..addAll(second.delta.slice(secondOffset, secondLength)),
- );
- afterSelection = Selection.collapsed(Position(
- path: first.path,
- offset: firstOffset,
- ));
- }
-
- void splitText(TextNode textNode, int offset) {
- final delta = textNode.delta;
- final second = delta.slice(offset, delta.length);
- final path = textNode.path.next;
- deleteText(textNode, offset, delta.length);
- insertNode(
- path,
- TextNode(
- attributes: textNode.attributes,
- delta: second,
- ),
- );
- afterSelection = Selection.collapsed(Position(
- path: path,
- offset: 0,
- ));
- }
-
- /// Inserts the text content at a specified index.
- ///
- /// Optionally, you may specify formatting attributes that are applied to the inserted string.
- /// By default, the formatting attributes before the insert position will be reused.
- void insertText(
- TextNode textNode,
- int index,
- String text, {
- Attributes? attributes,
- }) {
- var newAttributes = attributes;
- if (index != 0 && attributes == null) {
- newAttributes =
- textNode.delta.slice(max(index - 1, 0), index).first.attributes;
- if (newAttributes != null) {
- newAttributes = {...newAttributes}; // make a copy
- }
- }
- updateText(
- textNode,
- Delta()
- ..retain(index)
- ..insert(text, attributes: newAttributes),
- );
- afterSelection = Selection.collapsed(
- Position(path: textNode.path, offset: index + text.length),
- );
- }
-
- /// Assigns a formatting attributes to a range of text.
- void formatText(
- TextNode textNode,
- int index,
- int length,
- Attributes attributes,
- ) {
- afterSelection = beforeSelection;
- updateText(
- textNode,
- Delta()
- ..retain(index)
- ..retain(length, attributes: attributes),
- );
- }
-
- /// Deletes the text of specified length starting at index.
- void deleteText(
- TextNode textNode,
- int index,
- int length,
- ) {
- updateText(
- textNode,
- Delta()
- ..retain(index)
- ..delete(length),
- );
- afterSelection = Selection.collapsed(
- Position(path: textNode.path, offset: index),
- );
- }
-
- /// Replaces the text of specified length starting at index.
- ///
- /// Optionally, you may specify formatting attributes that are applied to the inserted string.
- /// By default, the formatting attributes before the insert position will be reused.
- void replaceText(
- TextNode textNode,
- int index,
- int length,
- String text, {
- Attributes? attributes,
- }) {
- var newAttributes = attributes;
- if (index != 0 && attributes == null) {
- newAttributes =
- textNode.delta.slice(max(index - 1, 0), index).first.attributes;
- if (newAttributes == null) {
- final slicedDelta = textNode.delta.slice(index, index + length);
- if (slicedDelta.isNotEmpty) {
- newAttributes = slicedDelta.first.attributes;
- }
- }
- }
- updateText(
- textNode,
- Delta()
- ..retain(index)
- ..delete(length)
- ..insert(text, attributes: {...newAttributes ?? {}}),
- );
- afterSelection = Selection.collapsed(
- Position(
- path: textNode.path,
- offset: index + text.length,
- ),
- );
- }
-
- void replaceTexts(
- List textNodes,
- Selection selection,
- List texts,
- ) {
- if (textNodes.isEmpty || texts.isEmpty) {
- return;
- }
-
- if (textNodes.length == texts.length) {
- final length = textNodes.length;
-
- if (length == 1) {
- replaceText(
- textNodes.first,
- selection.startIndex,
- selection.endIndex - selection.startIndex,
- texts.first,
- );
- return;
- }
-
- for (var i = 0; i < textNodes.length; i++) {
- final textNode = textNodes[i];
- if (i == 0) {
- replaceText(
- textNode,
- selection.startIndex,
- textNode.toPlainText().length,
- texts.first,
- );
- } else if (i == length - 1) {
- replaceText(
- textNode,
- 0,
- selection.endIndex,
- texts.last,
- );
- } else {
- replaceText(
- textNode,
- 0,
- textNode.toPlainText().length,
- texts[i],
- );
- }
- }
- return;
- }
-
- if (textNodes.length > texts.length) {
- final length = textNodes.length;
- for (var i = 0; i < textNodes.length; i++) {
- final textNode = textNodes[i];
- if (i == 0) {
- replaceText(
- textNode,
- selection.startIndex,
- textNode.toPlainText().length,
- texts.first,
- );
- } else if (i == length - 1 && texts.length >= 2) {
- replaceText(
- textNode,
- 0,
- selection.endIndex,
- texts.last,
- );
- } else if (i < texts.length - 1) {
- replaceText(
- textNode,
- 0,
- textNode.toPlainText().length,
- texts[i],
- );
- } else {
- deleteNode(textNode);
- if (i == textNodes.length - 1) {
- final delta = Delta()
- ..insert(texts[0])
- ..addAll(
- textNodes.last.delta.slice(selection.end.offset),
- );
- replaceText(
- textNode,
- selection.start.offset,
- texts[0].length,
- delta.toPlainText(),
- );
- }
- }
- }
- afterSelection = null;
- return;
- }
-
- if (textNodes.length < texts.length) {
- final length = texts.length;
- var path = textNodes.first.path;
-
- for (var i = 0; i < texts.length; i++) {
- final text = texts[i];
- if (i == 0) {
- replaceText(
- textNodes.first,
- selection.startIndex,
- textNodes.first.toPlainText().length,
- text,
- );
- path = path.next;
- } else if (i == length - 1 && textNodes.length >= 2) {
- replaceText(
- textNodes.last,
- 0,
- selection.endIndex,
- text,
- );
- path = path.next;
- } else {
- if (i < textNodes.length - 1) {
- replaceText(
- textNodes[i],
- 0,
- textNodes[i].toPlainText().length,
- text,
- );
- path = path.next;
- } else {
- if (i == texts.length - 1) {
- final delta = Delta()
- ..insert(text)
- ..addAll(
- textNodes.last.delta.slice(selection.end.offset),
- );
- insertNode(
- path,
- TextNode(
- delta: delta,
- ),
- );
- } else {
- insertNode(
- path,
- TextNode(
- delta: Delta()..insert(text),
- ),
- );
- }
- }
- }
- }
- afterSelection = null;
- return;
- }
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/editor_state.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/editor_state.dart
deleted file mode 100644
index 4b214adad6..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/editor_state.dart
+++ /dev/null
@@ -1,232 +0,0 @@
-import 'dart:async';
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/infra/log.dart';
-import 'package:appflowy_editor/src/render/selection_menu/selection_menu_widget.dart';
-import 'package:appflowy_editor/src/render/style/editor_style.dart';
-import 'package:appflowy_editor/src/render/toolbar/toolbar_item.dart';
-import 'package:appflowy_editor/src/service/service.dart';
-import 'package:flutter/material.dart';
-
-import 'package:appflowy_editor/src/core/location/selection.dart';
-import 'package:appflowy_editor/src/core/document/document.dart';
-import 'package:appflowy_editor/src/core/transform/operation.dart';
-import 'package:appflowy_editor/src/core/transform/transaction.dart';
-import 'package:appflowy_editor/src/history/undo_manager.dart';
-
-class ApplyOptions {
- /// This flag indicates that
- /// whether the transaction should be recorded into
- /// the undo stack
- final bool recordUndo;
- final bool recordRedo;
- const ApplyOptions({
- this.recordUndo = true,
- this.recordRedo = false,
- });
-}
-
-enum CursorUpdateReason {
- uiEvent,
- others,
-}
-
-/// The state of the editor.
-///
-/// The state includes:
-/// - The document to render
-/// - The state of the selection
-///
-/// [EditorState] also includes the services of the editor:
-/// - Selection service
-/// - Scroll service
-/// - Keyboard service
-/// - Input service
-/// - Toolbar service
-///
-/// In consideration of collaborative editing,
-/// all the mutations should be applied through [Transaction].
-///
-/// Mutating the document with document's API is not recommended.
-class EditorState {
- final Document document;
-
- // Service reference.
- final service = FlowyService();
-
- /// Configures log output parameters,
- /// such as log level and log output callbacks,
- /// with this variable.
- LogConfiguration get logConfiguration => LogConfiguration();
-
- /// Stores the selection menu items.
- List selectionMenuItems = [];
-
- /// Stores the toolbar items.
- List toolbarItems = [];
-
- /// Operation stream.
- Stream get transactionStream => _observer.stream;
- final StreamController _observer = StreamController.broadcast();
-
- late ThemeData themeData;
- EditorStyle get editorStyle =>
- themeData.extension() ?? EditorStyle.light;
-
- final UndoManager undoManager = UndoManager();
- Selection? _cursorSelection;
-
- // TODO: only for testing.
- bool disableSealTimer = false;
- bool disableRules = false;
-
- bool editable = true;
-
- Transaction get transaction {
- final transaction = Transaction(document: document);
- transaction.beforeSelection = _cursorSelection;
- return transaction;
- }
-
- Selection? get cursorSelection {
- return _cursorSelection;
- }
-
- RenderBox? get renderBox {
- final renderObject =
- service.scrollServiceKey.currentContext?.findRenderObject();
- if (renderObject != null && renderObject is RenderBox) {
- return renderObject;
- }
- return null;
- }
-
- Future updateCursorSelection(
- Selection? cursorSelection, [
- CursorUpdateReason reason = CursorUpdateReason.others,
- ]) {
- final completer = Completer();
-
- // broadcast to other users here
- if (reason != CursorUpdateReason.uiEvent) {
- service.selectionService.updateSelection(cursorSelection);
- }
- _cursorSelection = cursorSelection;
- WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
- completer.complete();
- });
- return completer.future;
- }
-
- Timer? _debouncedSealHistoryItemTimer;
-
- EditorState({
- required this.document,
- }) {
- undoManager.state = this;
- }
-
- factory EditorState.empty() {
- return EditorState(document: Document.empty());
- }
-
- /// Apply the transaction to the state.
- ///
- /// The options can be used to determine whether the editor
- /// should record the transaction in undo/redo stack.
- Future apply(
- Transaction transaction, {
- ApplyOptions options = const ApplyOptions(recordUndo: true),
- ruleCount = 0,
- withUpdateCursor = true,
- }) async {
- final completer = Completer();
-
- if (!editable) {
- completer.complete();
- return completer.future;
- }
- // TODO: validate the transaction.
- for (final op in transaction.operations) {
- _applyOperation(op);
- }
-
- _observer.add(transaction);
-
- WidgetsBinding.instance.addPostFrameCallback((_) async {
- _applyRules(ruleCount);
- if (withUpdateCursor) {
- await updateCursorSelection(transaction.afterSelection);
- }
- completer.complete();
- });
-
- if (options.recordUndo) {
- final undoItem = undoManager.getUndoHistoryItem();
- undoItem.addAll(transaction.operations);
- if (undoItem.beforeSelection == null &&
- transaction.beforeSelection != null) {
- undoItem.beforeSelection = transaction.beforeSelection;
- }
- undoItem.afterSelection = transaction.afterSelection;
- _debouncedSealHistoryItem();
- } else if (options.recordRedo) {
- final redoItem = HistoryItem();
- redoItem.addAll(transaction.operations);
- redoItem.beforeSelection = transaction.beforeSelection;
- redoItem.afterSelection = transaction.afterSelection;
- undoManager.redoStack.push(redoItem);
- }
-
- return completer.future;
- }
-
- void _debouncedSealHistoryItem() {
- if (disableSealTimer) {
- return;
- }
- _debouncedSealHistoryItemTimer?.cancel();
- _debouncedSealHistoryItemTimer =
- Timer(const Duration(milliseconds: 1000), () {
- if (undoManager.undoStack.isNonEmpty) {
- Log.editor.debug('Seal history item');
- final last = undoManager.undoStack.last;
- last.seal();
- }
- });
- }
-
- void _applyOperation(Operation op) {
- if (op is InsertOperation) {
- document.insert(op.path, op.nodes);
- } else if (op is UpdateOperation) {
- document.update(op.path, op.attributes);
- } else if (op is DeleteOperation) {
- document.delete(op.path, op.nodes.length);
- } else if (op is UpdateTextOperation) {
- document.updateText(op.path, op.delta);
- }
- }
-
- void _applyRules(int ruleCount) {
- // Set a maximum count to prevent a dead loop.
- if (ruleCount >= 5 || disableRules) {
- return;
- }
-
- final tr = transaction;
-
- // Rules
- _insureLastNodeEditable(tr);
-
- if (tr.operations.isNotEmpty) {
- apply(tr, ruleCount: ruleCount + 1, withUpdateCursor: false);
- }
- }
-
- void _insureLastNodeEditable(Transaction tr) {
- if (document.root.children.isEmpty ||
- document.root.children.last.id != 'text') {
- tr.insertNode([document.root.children.length], TextNode.empty());
- }
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/attributes_extension.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/attributes_extension.dart
deleted file mode 100644
index 816747fdad..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/attributes_extension.dart
+++ /dev/null
@@ -1,95 +0,0 @@
-import 'package:appflowy_editor/src/core/document/attributes.dart';
-import 'package:appflowy_editor/src/core/legacy/built_in_attribute_keys.dart';
-import 'package:flutter/material.dart';
-
-extension NodeAttributesExtensions on Attributes {
- String? get heading {
- if (containsKey(BuiltInAttributeKey.subtype) &&
- containsKey(BuiltInAttributeKey.heading) &&
- this[BuiltInAttributeKey.subtype] == BuiltInAttributeKey.heading &&
- this[BuiltInAttributeKey.heading] is String) {
- return this[BuiltInAttributeKey.heading];
- }
- return null;
- }
-
- bool get quote {
- return containsKey(BuiltInAttributeKey.quote);
- }
-
- num? get number {
- if (containsKey(BuiltInAttributeKey.number) &&
- this[BuiltInAttributeKey.number] is num) {
- return this[BuiltInAttributeKey.number];
- }
- return null;
- }
-
- bool get code {
- if (containsKey(BuiltInAttributeKey.code) &&
- this[BuiltInAttributeKey.code] is bool) {
- return this[BuiltInAttributeKey.code];
- }
- return false;
- }
-
- bool get check {
- if (containsKey(BuiltInAttributeKey.checkbox) &&
- this[BuiltInAttributeKey.checkbox] is bool) {
- return this[BuiltInAttributeKey.checkbox];
- }
- return false;
- }
-}
-
-extension DeltaAttributesExtensions on Attributes {
- bool get bold {
- return (containsKey(BuiltInAttributeKey.bold) &&
- this[BuiltInAttributeKey.bold] == true);
- }
-
- bool get italic {
- return (containsKey(BuiltInAttributeKey.italic) &&
- this[BuiltInAttributeKey.italic] == true);
- }
-
- bool get underline {
- return (containsKey(BuiltInAttributeKey.underline) &&
- this[BuiltInAttributeKey.underline] == true);
- }
-
- bool get strikethrough {
- return (containsKey(BuiltInAttributeKey.strikethrough) &&
- this[BuiltInAttributeKey.strikethrough] == true);
- }
-
- static const whiteInt = 0XFFFFFFFF;
-
- Color? get color {
- if (containsKey(BuiltInAttributeKey.color) &&
- this[BuiltInAttributeKey.color] is String) {
- return Color(
- // If the parse fails returns white by default
- int.tryParse(this[BuiltInAttributeKey.color]) ?? whiteInt,
- );
- }
- return null;
- }
-
- Color? get backgroundColor {
- if (containsKey(BuiltInAttributeKey.backgroundColor) &&
- this[BuiltInAttributeKey.backgroundColor] is String) {
- return Color(
- int.tryParse(this[BuiltInAttributeKey.backgroundColor]) ?? whiteInt);
- }
- return null;
- }
-
- String? get href {
- if (containsKey(BuiltInAttributeKey.href) &&
- this[BuiltInAttributeKey.href] is String) {
- return this[BuiltInAttributeKey.href];
- }
- return null;
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/color_extension.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/color_extension.dart
deleted file mode 100644
index 7228127104..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/color_extension.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-import 'package:flutter/painting.dart';
-
-extension ColorExtension on Color {
- /// Try to parse the `rgba(red, greed, blue, alpha)`
- /// from the string.
- static Color? tryFromRgbaString(String colorString) {
- final reg = RegExp(r'rgba\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)');
- final match = reg.firstMatch(colorString);
- if (match == null) {
- return null;
- }
-
- if (match.groupCount < 4) {
- return null;
- }
- final redStr = match.group(1);
- final greenStr = match.group(2);
- final blueStr = match.group(3);
- final alphaStr = match.group(4);
-
- final red = redStr != null ? int.tryParse(redStr) : null;
- final green = greenStr != null ? int.tryParse(greenStr) : null;
- final blue = blueStr != null ? int.tryParse(blueStr) : null;
- final alpha = alphaStr != null ? int.tryParse(alphaStr) : null;
-
- if (red == null || green == null || blue == null || alpha == null) {
- return null;
- }
-
- return Color.fromARGB(alpha, red, green, blue);
- }
-
- String toRgbaString() {
- return 'rgba($red, $green, $blue, $alpha)';
- }
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/editor_state_extensions.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/editor_state_extensions.dart
deleted file mode 100644
index 56b0c7726f..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/editor_state_extensions.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-import 'package:appflowy_editor/appflowy_editor.dart';
-
-extension EditorStateExtensions on EditorState {
- List get selectedTextNodes =>
- service.selectionService.currentSelectedNodes
- .whereType()
- .toList(growable: false);
-}
diff --git a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/node_extensions.dart b/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/node_extensions.dart
deleted file mode 100644
index 0a89ecc4ef..0000000000
--- a/frontend/appflowy_flutter/packages/appflowy_editor/lib/src/extensions/node_extensions.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-import 'package:appflowy_editor/src/core/document/node.dart';
-import 'package:appflowy_editor/src/core/document/path.dart';
-import 'package:appflowy_editor/src/core/location/selection.dart';
-import 'package:appflowy_editor/src/editor_state.dart';
-import 'package:appflowy_editor/src/extensions/object_extensions.dart';
-import 'package:appflowy_editor/src/render/selection/selectable.dart';
-import 'package:flutter/material.dart';
-
-extension NodeExtensions on Node {
- RenderBox? get renderBox =>
- key.currentContext?.findRenderObject()?.unwrapOrNull();
-
- BuildContext? get context => key.currentContext;
- SelectableMixin? get selectable =>
- key.currentState?.unwrapOrNull();
-
- bool inSelection(Selection selection) {
- if (selection.start.path <= selection.end.path) {
- return selection.start.path <= path && path <= selection.end.path;
- } else {
- return selection.end.path <= path && path <= selection.start.path;
- }
- }
-
- Rect get rect {
- if (renderBox != null) {
- final boxOffset = renderBox!.localToGlobal(Offset.zero);
- return boxOffset & renderBox!.size;
- }
- return Rect.zero;
- }
-
- bool isSelected(EditorState editorState) {
- final currentSelectedNodes =
- editorState.service.selectionService.currentSelectedNodes;
- return currentSelectedNodes.length == 1 &&
- currentSelectedNodes.first == this;
- }
-}
-
-extension NodesExtensions