Copy disabled (too large)
Download .txt
Showing preview only (16,646K chars total). Download the full file to get everything.
Repository: AppFlowy-IO/AppFlowy
Branch: main
Commit: bbe886fcdd52
Files: 3555
Total size: 18.0 MB
Directory structure:
gitextract_qoew7893/
├── .dockerignore
├── .githooks/
│ ├── commit-msg
│ ├── pre-commit
│ └── pre-push
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yaml
│ │ └── feature_request.yaml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── actions/
│ │ ├── flutter_build/
│ │ │ └── action.yml
│ │ └── flutter_integration_test/
│ │ └── action.yml
│ └── workflows/
│ ├── android_ci.yaml.bak
│ ├── build_command.yml
│ ├── commit_lint.yml
│ ├── docker_ci.yml
│ ├── flutter_ci.yaml
│ ├── ios_ci.yaml
│ ├── mobile_ci.yml
│ ├── ninja_i18n.yml
│ ├── release.yml
│ ├── rust_ci.yaml
│ ├── rust_coverage.yml
│ └── translation_notify.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── ROADMAP.md
├── codemagic.yaml
├── commitlint.config.js
├── doc/
│ ├── CONTRIBUTING.md
│ └── roadmap.md
├── frontend/
│ ├── .vscode/
│ │ ├── launch.json
│ │ └── tasks.json
│ ├── Makefile.toml
│ ├── appflowy_flutter/
│ │ ├── .gitignore
│ │ ├── .metadata
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── analysis_options.yaml
│ │ ├── android/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── app/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ ├── debug/
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── main/
│ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── Classes/
│ │ │ │ │ │ └── binding.h
│ │ │ │ │ ├── kotlin/
│ │ │ │ │ │ └── com/
│ │ │ │ │ │ └── example/
│ │ │ │ │ │ └── app_flowy/
│ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ └── res/
│ │ │ │ │ ├── drawable/
│ │ │ │ │ │ ├── launcher_background.xml
│ │ │ │ │ │ └── launcher_foreground.xml
│ │ │ │ │ ├── drawable-v21/
│ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ │ ├── values/
│ │ │ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ │ │ └── styles.xml
│ │ │ │ │ └── values-night/
│ │ │ │ │ └── styles.xml
│ │ │ │ └── profile/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ └── settings.gradle
│ │ ├── assets/
│ │ │ ├── built_in_prompts.json
│ │ │ ├── fonts/
│ │ │ │ └── .gitkeep
│ │ │ ├── google_fonts/
│ │ │ │ ├── Poppins/
│ │ │ │ │ └── OFL.txt
│ │ │ │ └── Roboto_Mono/
│ │ │ │ └── LICENSE.txt
│ │ │ ├── icons/
│ │ │ │ └── icons.json
│ │ │ ├── template/
│ │ │ │ ├── readme.afdoc
│ │ │ │ └── readme.json
│ │ │ ├── test/
│ │ │ │ └── workspaces/
│ │ │ │ ├── database/
│ │ │ │ │ ├── v020.afdb
│ │ │ │ │ └── v069.afdb
│ │ │ │ └── markdowns/
│ │ │ │ ├── markdown_with_table.md
│ │ │ │ ├── test1.md
│ │ │ │ └── test2.md
│ │ │ └── translations/
│ │ │ └── mr-IN.json
│ │ ├── build.yaml
│ │ ├── cargokit_options.yaml
│ │ ├── dart_dependency_validator.yaml
│ │ ├── dev.env
│ │ ├── devtools_options.yaml
│ │ ├── distribute_options.yaml
│ │ ├── dsa_pub.pem
│ │ ├── integration_test/
│ │ │ ├── desktop/
│ │ │ │ ├── board/
│ │ │ │ │ ├── board_add_row_test.dart
│ │ │ │ │ ├── board_field_test.dart
│ │ │ │ │ ├── board_group_test.dart
│ │ │ │ │ ├── board_hide_groups_test.dart
│ │ │ │ │ ├── board_row_test.dart
│ │ │ │ │ └── board_test_runner.dart
│ │ │ │ ├── chat/
│ │ │ │ │ └── chat_page_test.dart
│ │ │ │ ├── cloud/
│ │ │ │ │ ├── cloud_runner.dart
│ │ │ │ │ ├── data_migration/
│ │ │ │ │ │ ├── anon_user_data_migration_test.dart
│ │ │ │ │ │ └── data_migration_test_runner.dart
│ │ │ │ │ ├── database/
│ │ │ │ │ │ ├── database_image_test.dart
│ │ │ │ │ │ └── database_test_runner.dart
│ │ │ │ │ ├── document/
│ │ │ │ │ │ ├── document_ai_writer_test.dart
│ │ │ │ │ │ ├── document_copy_link_to_block_test.dart
│ │ │ │ │ │ ├── document_option_actions_test.dart
│ │ │ │ │ │ ├── document_publish_test.dart
│ │ │ │ │ │ └── document_test_runner.dart
│ │ │ │ │ ├── set_env.dart
│ │ │ │ │ ├── sidebar/
│ │ │ │ │ │ ├── sidebar_icon_test.dart
│ │ │ │ │ │ ├── sidebar_move_page_test.dart
│ │ │ │ │ │ ├── sidebar_rename_untitled_test.dart
│ │ │ │ │ │ └── sidebar_search_test.dart
│ │ │ │ │ ├── uncategorized/
│ │ │ │ │ │ ├── appflowy_cloud_auth_test.dart
│ │ │ │ │ │ ├── document_sync_test.dart
│ │ │ │ │ │ ├── uncategorized_test_runner.dart
│ │ │ │ │ │ └── user_setting_sync_test.dart
│ │ │ │ │ └── workspace/
│ │ │ │ │ ├── change_name_and_icon_test.dart
│ │ │ │ │ ├── collaborative_workspace_test.dart
│ │ │ │ │ ├── share_menu_test.dart
│ │ │ │ │ ├── tabs_test.dart
│ │ │ │ │ ├── workspace_icon_test.dart
│ │ │ │ │ ├── workspace_settings_test.dart
│ │ │ │ │ └── workspace_test_runner.dart
│ │ │ │ ├── command_palette/
│ │ │ │ │ ├── command_palette_test.dart
│ │ │ │ │ ├── command_palette_test_runner.dart
│ │ │ │ │ ├── folder_search_test.dart
│ │ │ │ │ └── recent_history_test.dart
│ │ │ │ ├── database/
│ │ │ │ │ ├── database_calendar_test.dart
│ │ │ │ │ ├── database_cell_test.dart
│ │ │ │ │ ├── database_field_settings_test.dart
│ │ │ │ │ ├── database_field_test.dart
│ │ │ │ │ ├── database_filter_test.dart
│ │ │ │ │ ├── database_icon_test.dart
│ │ │ │ │ ├── database_media_test.dart
│ │ │ │ │ ├── database_reminder_test.dart
│ │ │ │ │ ├── database_row_cover_test.dart
│ │ │ │ │ ├── database_row_page_test.dart
│ │ │ │ │ ├── database_setting_test.dart
│ │ │ │ │ ├── database_share_test.dart
│ │ │ │ │ ├── database_sort_test.dart
│ │ │ │ │ ├── database_test_runner_1.dart
│ │ │ │ │ ├── database_test_runner_2.dart
│ │ │ │ │ └── database_view_test.dart
│ │ │ │ ├── document/
│ │ │ │ │ ├── document_alignment_test.dart
│ │ │ │ │ ├── document_app_lifecycle_test.dart
│ │ │ │ │ ├── document_block_option_test.dart
│ │ │ │ │ ├── document_callout_test.dart
│ │ │ │ │ ├── document_codeblock_paste_test.dart
│ │ │ │ │ ├── document_copy_and_paste_test.dart
│ │ │ │ │ ├── document_create_and_delete_test.dart
│ │ │ │ │ ├── document_customer_test.dart
│ │ │ │ │ ├── document_deletion_test.dart
│ │ │ │ │ ├── document_find_menu_test.dart
│ │ │ │ │ ├── document_inline_page_reference_test.dart
│ │ │ │ │ ├── document_inline_sub_page_test.dart
│ │ │ │ │ ├── document_link_preview_test.dart
│ │ │ │ │ ├── document_more_actions_test.dart
│ │ │ │ │ ├── document_option_action_test.dart
│ │ │ │ │ ├── document_selection_test.dart
│ │ │ │ │ ├── document_shortcuts_test.dart
│ │ │ │ │ ├── document_sub_page_test.dart
│ │ │ │ │ ├── document_test_runner_1.dart
│ │ │ │ │ ├── document_test_runner_2.dart
│ │ │ │ │ ├── document_test_runner_3.dart
│ │ │ │ │ ├── document_test_runner_4.dart
│ │ │ │ │ ├── document_text_direction_test.dart
│ │ │ │ │ ├── document_title_test.dart
│ │ │ │ │ ├── document_toolbar_test.dart
│ │ │ │ │ ├── document_with_cover_image_test.dart
│ │ │ │ │ ├── document_with_database_test.dart
│ │ │ │ │ ├── document_with_date_reminder_test.dart
│ │ │ │ │ ├── document_with_file_test.dart
│ │ │ │ │ ├── document_with_image_block_test.dart
│ │ │ │ │ ├── document_with_inline_math_equation_test.dart
│ │ │ │ │ ├── document_with_inline_page_test.dart
│ │ │ │ │ ├── document_with_link_test.dart
│ │ │ │ │ ├── document_with_multi_image_block_test.dart
│ │ │ │ │ ├── document_with_outline_block_test.dart
│ │ │ │ │ ├── document_with_simple_table_test.dart
│ │ │ │ │ ├── document_with_toggle_heading_block_test.dart
│ │ │ │ │ ├── document_with_toggle_list_test.dart
│ │ │ │ │ └── edit_document_test.dart
│ │ │ │ ├── first_test/
│ │ │ │ │ └── first_test.dart
│ │ │ │ ├── grid/
│ │ │ │ │ ├── grid_calculations_test.dart
│ │ │ │ │ ├── grid_edit_row_test.dart
│ │ │ │ │ ├── grid_filter_and_sort_test.dart
│ │ │ │ │ ├── grid_reopen_test.dart
│ │ │ │ │ ├── grid_reorder_row_test.dart
│ │ │ │ │ ├── grid_row_test.dart
│ │ │ │ │ ├── grid_test_extensions.dart
│ │ │ │ │ └── grid_test_runner_1.dart
│ │ │ │ ├── reminder/
│ │ │ │ │ └── document_reminder_test.dart
│ │ │ │ ├── settings/
│ │ │ │ │ ├── notifications_settings_test.dart
│ │ │ │ │ ├── settings_billing_test.dart
│ │ │ │ │ ├── settings_runner.dart
│ │ │ │ │ ├── shortcuts_settings_test.dart
│ │ │ │ │ └── sign_in_page_settings_test.dart
│ │ │ │ ├── sidebar/
│ │ │ │ │ ├── rename_current_item_test.dart
│ │ │ │ │ ├── sidebar_expand_test.dart
│ │ │ │ │ ├── sidebar_favorites_test.dart
│ │ │ │ │ ├── sidebar_icon_test.dart
│ │ │ │ │ ├── sidebar_recent_icon_test.dart
│ │ │ │ │ ├── sidebar_test.dart
│ │ │ │ │ ├── sidebar_test_runner.dart
│ │ │ │ │ └── sidebar_view_item_test.dart
│ │ │ │ └── uncategorized/
│ │ │ │ ├── board_test.dart
│ │ │ │ ├── code_block_language_selector_test.dart
│ │ │ │ ├── emoji_shortcut_test.dart
│ │ │ │ ├── empty_document_test.dart
│ │ │ │ ├── hotkeys_test.dart
│ │ │ │ ├── import_files_test.dart
│ │ │ │ ├── language_test.dart
│ │ │ │ ├── share_markdown_test.dart
│ │ │ │ ├── switch_folder_test.dart
│ │ │ │ ├── tabs_test.dart
│ │ │ │ ├── uncategorized_test_runner_1.dart
│ │ │ │ └── zoom_in_out_test.dart
│ │ │ ├── desktop_runner_1.dart
│ │ │ ├── desktop_runner_2.dart
│ │ │ ├── desktop_runner_3.dart
│ │ │ ├── desktop_runner_4.dart
│ │ │ ├── desktop_runner_5.dart
│ │ │ ├── desktop_runner_6.dart
│ │ │ ├── desktop_runner_7.dart
│ │ │ ├── desktop_runner_8.dart
│ │ │ ├── desktop_runner_9.dart
│ │ │ ├── mobile/
│ │ │ │ ├── cloud/
│ │ │ │ │ ├── cloud_runner.dart
│ │ │ │ │ ├── document/
│ │ │ │ │ │ ├── publish_test.dart
│ │ │ │ │ │ └── share_link_test.dart
│ │ │ │ │ ├── space/
│ │ │ │ │ │ └── space_test.dart
│ │ │ │ │ └── workspace/
│ │ │ │ │ └── workspace_operations_test.dart
│ │ │ │ ├── document/
│ │ │ │ │ ├── at_menu_test.dart
│ │ │ │ │ ├── document_test_runner.dart
│ │ │ │ │ ├── icon_test.dart
│ │ │ │ │ ├── page_style_test.dart
│ │ │ │ │ ├── plus_menu_test.dart
│ │ │ │ │ ├── simple_table_test.dart
│ │ │ │ │ ├── slash_menu_test.dart
│ │ │ │ │ ├── title_test.dart
│ │ │ │ │ └── toolbar_test.dart
│ │ │ │ ├── home_page/
│ │ │ │ │ └── create_new_page_test.dart
│ │ │ │ ├── search/
│ │ │ │ │ └── search_test.dart
│ │ │ │ ├── settings/
│ │ │ │ │ ├── default_text_direction_test.dart
│ │ │ │ │ └── scale_factor_test.dart
│ │ │ │ └── sign_in/
│ │ │ │ └── anonymous_sign_in_test.dart
│ │ │ ├── mobile_runner_1.dart
│ │ │ ├── runner.dart
│ │ │ └── shared/
│ │ │ ├── ai_test_op.dart
│ │ │ ├── auth_operation.dart
│ │ │ ├── base.dart
│ │ │ ├── common_operations.dart
│ │ │ ├── constants.dart
│ │ │ ├── data.dart
│ │ │ ├── database_test_op.dart
│ │ │ ├── dir.dart
│ │ │ ├── document_test_operations.dart
│ │ │ ├── emoji.dart
│ │ │ ├── expectation.dart
│ │ │ ├── ime.dart
│ │ │ ├── keyboard.dart
│ │ │ ├── mock/
│ │ │ │ ├── mock_ai.dart
│ │ │ │ ├── mock_file_picker.dart
│ │ │ │ └── mock_url_launcher.dart
│ │ │ ├── settings.dart
│ │ │ ├── util.dart
│ │ │ └── workspace.dart
│ │ ├── ios/
│ │ │ ├── .gitignore
│ │ │ ├── Flutter/
│ │ │ │ ├── AppFrameworkInfo.plist
│ │ │ │ ├── Debug.xcconfig
│ │ │ │ └── Release.xcconfig
│ │ │ ├── Podfile
│ │ │ ├── Runner/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── LaunchImage.imageset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── README.md
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Runner-Bridging-Header.h
│ │ │ │ └── Runner.entitlements
│ │ │ ├── Runner.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── Runner.xcscheme
│ │ │ └── Runner.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ ├── lib/
│ │ │ ├── ai/
│ │ │ │ ├── ai.dart
│ │ │ │ ├── service/
│ │ │ │ │ ├── ai_entities.dart
│ │ │ │ │ ├── ai_model_state_notifier.dart
│ │ │ │ │ ├── ai_prompt_database_selector_cubit.dart
│ │ │ │ │ ├── ai_prompt_input_bloc.dart
│ │ │ │ │ ├── ai_prompt_selector_cubit.dart
│ │ │ │ │ ├── appflowy_ai_service.dart
│ │ │ │ │ ├── error.dart
│ │ │ │ │ ├── select_model_bloc.dart
│ │ │ │ │ └── view_selector_cubit.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── ai_prompt_modal/
│ │ │ │ │ ├── ai_prompt_category_list.dart
│ │ │ │ │ ├── ai_prompt_database_modal.dart
│ │ │ │ │ ├── ai_prompt_modal.dart
│ │ │ │ │ ├── ai_prompt_onboarding.dart
│ │ │ │ │ ├── ai_prompt_preview.dart
│ │ │ │ │ └── ai_prompt_visible_list.dart
│ │ │ │ ├── loading_indicator.dart
│ │ │ │ ├── prompt_input/
│ │ │ │ │ ├── action_buttons.dart
│ │ │ │ │ ├── browse_prompts_button.dart
│ │ │ │ │ ├── desktop_prompt_input.dart
│ │ │ │ │ ├── file_attachment_list.dart
│ │ │ │ │ ├── layout_define.dart
│ │ │ │ │ ├── mention_page_bottom_sheet.dart
│ │ │ │ │ ├── mention_page_menu.dart
│ │ │ │ │ ├── mentioned_page_text_span.dart
│ │ │ │ │ ├── predefined_format_buttons.dart
│ │ │ │ │ ├── prompt_input_text_controller.dart
│ │ │ │ │ ├── select_model_menu.dart
│ │ │ │ │ ├── select_sources_bottom_sheet.dart
│ │ │ │ │ ├── select_sources_menu.dart
│ │ │ │ │ └── send_button.dart
│ │ │ │ └── view_selector.dart
│ │ │ ├── core/
│ │ │ │ ├── config/
│ │ │ │ │ ├── kv.dart
│ │ │ │ │ └── kv_keys.dart
│ │ │ │ ├── frameless_window.dart
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── helpers.dart
│ │ │ │ │ ├── target_platform.dart
│ │ │ │ │ └── url_launcher.dart
│ │ │ │ ├── network_monitor.dart
│ │ │ │ └── notification/
│ │ │ │ ├── document_notification.dart
│ │ │ │ ├── folder_notification.dart
│ │ │ │ ├── grid_notification.dart
│ │ │ │ ├── notification_helper.dart
│ │ │ │ ├── search_notification.dart
│ │ │ │ └── user_notification.dart
│ │ │ ├── date/
│ │ │ │ └── date_service.dart
│ │ │ ├── env/
│ │ │ │ ├── backend_env.dart
│ │ │ │ ├── cloud_env.dart
│ │ │ │ ├── cloud_env_test.dart
│ │ │ │ └── env.dart
│ │ │ ├── features/
│ │ │ │ ├── page_access_level/
│ │ │ │ │ ├── data/
│ │ │ │ │ │ └── repositories/
│ │ │ │ │ │ ├── page_access_level_repository.dart
│ │ │ │ │ │ └── rust_page_access_level_repository_impl.dart
│ │ │ │ │ └── logic/
│ │ │ │ │ ├── page_access_level_bloc.dart
│ │ │ │ │ ├── page_access_level_event.dart
│ │ │ │ │ └── page_access_level_state.dart
│ │ │ │ ├── settings/
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── models/
│ │ │ │ │ │ │ └── user_data_location.dart
│ │ │ │ │ │ └── repositories/
│ │ │ │ │ │ ├── rust_settings_repository_impl.dart
│ │ │ │ │ │ └── settings_repository.dart
│ │ │ │ │ ├── logic/
│ │ │ │ │ │ ├── data_location_bloc.dart
│ │ │ │ │ │ ├── data_location_event.dart
│ │ │ │ │ │ └── data_location_state.dart
│ │ │ │ │ └── settings.dart
│ │ │ │ ├── share_tab/
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── models/
│ │ │ │ │ │ │ ├── models.dart
│ │ │ │ │ │ │ ├── share_access_level.dart
│ │ │ │ │ │ │ ├── share_popover_group_id.dart
│ │ │ │ │ │ │ ├── share_role.dart
│ │ │ │ │ │ │ ├── share_section_type.dart
│ │ │ │ │ │ │ ├── shared_group.dart
│ │ │ │ │ │ │ └── shared_user.dart
│ │ │ │ │ │ └── repositories/
│ │ │ │ │ │ ├── local_share_with_user_repository_impl.dart
│ │ │ │ │ │ ├── rust_share_with_user_repository_impl.dart
│ │ │ │ │ │ └── share_with_user_repository.dart
│ │ │ │ │ ├── logic/
│ │ │ │ │ │ ├── share_tab_bloc.dart
│ │ │ │ │ │ ├── share_tab_event.dart
│ │ │ │ │ │ └── share_tab_state.dart
│ │ │ │ │ └── presentation/
│ │ │ │ │ ├── share_tab.dart
│ │ │ │ │ └── widgets/
│ │ │ │ │ ├── access_level_list_widget.dart
│ │ │ │ │ ├── copy_link_widget.dart
│ │ │ │ │ ├── edit_access_level_widget.dart
│ │ │ │ │ ├── general_access_section.dart
│ │ │ │ │ ├── guest_tag.dart
│ │ │ │ │ ├── people_with_access_section.dart
│ │ │ │ │ ├── share_with_user_widget.dart
│ │ │ │ │ ├── shared_group_widget.dart
│ │ │ │ │ ├── shared_user_widget.dart
│ │ │ │ │ ├── turn_into_member_widget.dart
│ │ │ │ │ └── upgrade_to_pro_widget.dart
│ │ │ │ ├── shared_section/
│ │ │ │ │ ├── data/
│ │ │ │ │ │ └── repositories/
│ │ │ │ │ │ ├── local_shared_pages_repository_impl.dart
│ │ │ │ │ │ ├── rust_shared_pages_repository_impl.dart
│ │ │ │ │ │ └── shared_pages_repository.dart
│ │ │ │ │ ├── logic/
│ │ │ │ │ │ ├── shared_section_bloc.dart
│ │ │ │ │ │ ├── shared_section_event.dart
│ │ │ │ │ │ └── shared_section_state.dart
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── shared_page.dart
│ │ │ │ │ └── presentation/
│ │ │ │ │ ├── m_shared_section.dart
│ │ │ │ │ ├── shared_section.dart
│ │ │ │ │ └── widgets/
│ │ │ │ │ ├── m_shared_page_list.dart
│ │ │ │ │ ├── m_shared_section_header.dart
│ │ │ │ │ ├── refresh_button.dart
│ │ │ │ │ ├── shared_page_actions_button.dart
│ │ │ │ │ ├── shared_page_list.dart
│ │ │ │ │ ├── shared_section_empty.dart
│ │ │ │ │ ├── shared_section_error.dart
│ │ │ │ │ ├── shared_section_header.dart
│ │ │ │ │ └── shared_section_loading.dart
│ │ │ │ ├── util/
│ │ │ │ │ └── extensions.dart
│ │ │ │ ├── view_management/
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── logic/
│ │ │ │ │ ├── view_event.dart
│ │ │ │ │ ├── view_management_bloc.dart
│ │ │ │ │ └── view_state.dart
│ │ │ │ └── workspace/
│ │ │ │ ├── data/
│ │ │ │ │ └── repositories/
│ │ │ │ │ ├── rust_workspace_repository_impl.dart
│ │ │ │ │ └── workspace_repository.dart
│ │ │ │ └── logic/
│ │ │ │ ├── workspace_bloc.dart
│ │ │ │ ├── workspace_event.dart
│ │ │ │ └── workspace_state.dart
│ │ │ ├── flutter/
│ │ │ │ └── af_dropdown_menu.dart
│ │ │ ├── main.dart
│ │ │ ├── mobile/
│ │ │ │ ├── application/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ └── mobile_view_page_bloc.dart
│ │ │ │ │ ├── mobile_router.dart
│ │ │ │ │ ├── notification/
│ │ │ │ │ │ └── notification_reminder_bloc.dart
│ │ │ │ │ ├── page_style/
│ │ │ │ │ │ └── document_page_style_bloc.dart
│ │ │ │ │ ├── recent/
│ │ │ │ │ │ └── recent_view_bloc.dart
│ │ │ │ │ └── user_profile/
│ │ │ │ │ └── user_profile_bloc.dart
│ │ │ │ └── presentation/
│ │ │ │ ├── base/
│ │ │ │ │ ├── animated_gesture.dart
│ │ │ │ │ ├── app_bar/
│ │ │ │ │ │ ├── app_bar.dart
│ │ │ │ │ │ └── app_bar_actions.dart
│ │ │ │ │ ├── flowy_search_text_field.dart
│ │ │ │ │ ├── mobile_view_page.dart
│ │ │ │ │ ├── option_color_list.dart
│ │ │ │ │ ├── type_option_menu_item.dart
│ │ │ │ │ └── view_page/
│ │ │ │ │ ├── app_bar_buttons.dart
│ │ │ │ │ └── more_bottom_sheet.dart
│ │ │ │ ├── bottom_sheet/
│ │ │ │ │ ├── bottom_sheet.dart
│ │ │ │ │ ├── bottom_sheet_action_widget.dart
│ │ │ │ │ ├── bottom_sheet_add_new_page.dart
│ │ │ │ │ ├── bottom_sheet_block_action_widget.dart
│ │ │ │ │ ├── bottom_sheet_buttons.dart
│ │ │ │ │ ├── bottom_sheet_drag_handler.dart
│ │ │ │ │ ├── bottom_sheet_edit_link_widget.dart
│ │ │ │ │ ├── bottom_sheet_header.dart
│ │ │ │ │ ├── bottom_sheet_media_upload.dart
│ │ │ │ │ ├── bottom_sheet_rename_widget.dart
│ │ │ │ │ ├── bottom_sheet_view_item.dart
│ │ │ │ │ ├── bottom_sheet_view_item_body.dart
│ │ │ │ │ ├── bottom_sheet_view_page.dart
│ │ │ │ │ ├── default_mobile_action_pane.dart
│ │ │ │ │ ├── show_mobile_bottom_sheet.dart
│ │ │ │ │ └── show_transition_bottom_sheet.dart
│ │ │ │ ├── chat/
│ │ │ │ │ └── mobile_chat_screen.dart
│ │ │ │ ├── database/
│ │ │ │ │ ├── board/
│ │ │ │ │ │ ├── board.dart
│ │ │ │ │ │ ├── mobile_board_page.dart
│ │ │ │ │ │ ├── mobile_board_screen.dart
│ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ ├── group_card_header.dart
│ │ │ │ │ │ ├── mobile_board_trailing.dart
│ │ │ │ │ │ ├── mobile_hidden_groups_column.dart
│ │ │ │ │ │ └── widgets.dart
│ │ │ │ │ ├── card/
│ │ │ │ │ │ ├── card.dart
│ │ │ │ │ │ ├── card_detail/
│ │ │ │ │ │ │ ├── mobile_card_detail_screen.dart
│ │ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ │ ├── mobile_create_field_button.dart
│ │ │ │ │ │ │ ├── mobile_row_property_list.dart
│ │ │ │ │ │ │ ├── option_text_field.dart
│ │ │ │ │ │ │ ├── row_page_button.dart
│ │ │ │ │ │ │ └── widgets.dart
│ │ │ │ │ │ └── mobile_card_content.dart
│ │ │ │ │ ├── date_picker/
│ │ │ │ │ │ └── mobile_date_picker_screen.dart
│ │ │ │ │ ├── field/
│ │ │ │ │ │ ├── mobile_create_field_screen.dart
│ │ │ │ │ │ ├── mobile_edit_field_screen.dart
│ │ │ │ │ │ ├── mobile_field_bottom_sheets.dart
│ │ │ │ │ │ ├── mobile_field_picker_list.dart
│ │ │ │ │ │ ├── mobile_full_field_editor.dart
│ │ │ │ │ │ └── mobile_quick_field_editor.dart
│ │ │ │ │ ├── mobile_calendar_events_empty.dart
│ │ │ │ │ ├── mobile_calendar_events_screen.dart
│ │ │ │ │ ├── mobile_calendar_screen.dart
│ │ │ │ │ ├── mobile_grid_screen.dart
│ │ │ │ │ └── view/
│ │ │ │ │ ├── database_field_list.dart
│ │ │ │ │ ├── database_filter_bottom_sheet.dart
│ │ │ │ │ ├── database_filter_bottom_sheet_cubit.dart
│ │ │ │ │ ├── database_filter_condition_list.dart
│ │ │ │ │ ├── database_sort_bottom_sheet.dart
│ │ │ │ │ ├── database_sort_bottom_sheet_cubit.dart
│ │ │ │ │ ├── database_view_layout.dart
│ │ │ │ │ ├── database_view_list.dart
│ │ │ │ │ ├── database_view_quick_actions.dart
│ │ │ │ │ └── edit_database_view_screen.dart
│ │ │ │ ├── editor/
│ │ │ │ │ └── mobile_editor_screen.dart
│ │ │ │ ├── favorite/
│ │ │ │ │ ├── mobile_favorite_folder.dart
│ │ │ │ │ └── mobile_favorite_page.dart
│ │ │ │ ├── home/
│ │ │ │ │ ├── favorite_folder/
│ │ │ │ │ │ ├── favorite_space.dart
│ │ │ │ │ │ ├── mobile_home_favorite_folder.dart
│ │ │ │ │ │ └── mobile_home_favorite_folder_header.dart
│ │ │ │ │ ├── home.dart
│ │ │ │ │ ├── home_space/
│ │ │ │ │ │ └── home_space.dart
│ │ │ │ │ ├── mobile_folders.dart
│ │ │ │ │ ├── mobile_home_page.dart
│ │ │ │ │ ├── mobile_home_page_header.dart
│ │ │ │ │ ├── mobile_home_setting_page.dart
│ │ │ │ │ ├── mobile_home_trash_page.dart
│ │ │ │ │ ├── recent_folder/
│ │ │ │ │ │ ├── mobile_home_recent_views.dart
│ │ │ │ │ │ ├── mobile_recent_view.dart
│ │ │ │ │ │ └── recent_space.dart
│ │ │ │ │ ├── section_folder/
│ │ │ │ │ │ ├── mobile_home_section_folder.dart
│ │ │ │ │ │ └── mobile_home_section_folder_header.dart
│ │ │ │ │ ├── setting/
│ │ │ │ │ │ └── settings_popup_menu.dart
│ │ │ │ │ ├── shared/
│ │ │ │ │ │ ├── empty_placeholder.dart
│ │ │ │ │ │ └── mobile_page_card.dart
│ │ │ │ │ ├── space/
│ │ │ │ │ │ ├── constants.dart
│ │ │ │ │ │ ├── manage_space_widget.dart
│ │ │ │ │ │ ├── mobile_space.dart
│ │ │ │ │ │ ├── mobile_space_header.dart
│ │ │ │ │ │ ├── mobile_space_menu.dart
│ │ │ │ │ │ ├── space_menu_bottom_sheet.dart
│ │ │ │ │ │ ├── space_permission_bottom_sheet.dart
│ │ │ │ │ │ └── widgets.dart
│ │ │ │ │ ├── tab/
│ │ │ │ │ │ ├── _round_underline_tab_indicator.dart
│ │ │ │ │ │ ├── _tab_bar.dart
│ │ │ │ │ │ ├── ai_bubble_button.dart
│ │ │ │ │ │ ├── mobile_space_tab.dart
│ │ │ │ │ │ └── space_order_bloc.dart
│ │ │ │ │ └── workspaces/
│ │ │ │ │ ├── create_workspace_menu.dart
│ │ │ │ │ ├── workspace_menu_bottom_sheet.dart
│ │ │ │ │ └── workspace_more_options.dart
│ │ │ │ ├── inline_actions/
│ │ │ │ │ ├── mobile_inline_actions_handler.dart
│ │ │ │ │ ├── mobile_inline_actions_menu.dart
│ │ │ │ │ └── mobile_inline_actions_menu_group.dart
│ │ │ │ ├── mobile_bottom_navigation_bar.dart
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── mobile_notifications_multiple_select_page.dart
│ │ │ │ │ ├── mobile_notifications_page.dart
│ │ │ │ │ ├── mobile_notifications_screen.dart
│ │ │ │ │ └── widgets/
│ │ │ │ │ ├── color.dart
│ │ │ │ │ ├── empty.dart
│ │ │ │ │ ├── header.dart
│ │ │ │ │ ├── mobile_notification_tab_bar.dart
│ │ │ │ │ ├── multi_select_notification_item.dart
│ │ │ │ │ ├── notification_item.dart
│ │ │ │ │ ├── settings_popup_menu.dart
│ │ │ │ │ ├── shared.dart
│ │ │ │ │ ├── slide_actions.dart
│ │ │ │ │ ├── tab.dart
│ │ │ │ │ ├── tab_bar.dart
│ │ │ │ │ └── widgets.dart
│ │ │ │ ├── page_item/
│ │ │ │ │ ├── mobile_slide_action_button.dart
│ │ │ │ │ ├── mobile_view_item.dart
│ │ │ │ │ └── mobile_view_item_add_button.dart
│ │ │ │ ├── presentation.dart
│ │ │ │ ├── root_placeholder_page.dart
│ │ │ │ ├── search/
│ │ │ │ │ ├── mobile_search_ask_ai_entrance.dart
│ │ │ │ │ ├── mobile_search_cell.dart
│ │ │ │ │ ├── mobile_search_icon.dart
│ │ │ │ │ ├── mobile_search_page.dart
│ │ │ │ │ ├── mobile_search_reference_bottom_sheet.dart
│ │ │ │ │ ├── mobile_search_result.dart
│ │ │ │ │ ├── mobile_search_summary_cell.dart
│ │ │ │ │ ├── mobile_search_textfield.dart
│ │ │ │ │ ├── mobile_view_ancestors.dart
│ │ │ │ │ └── view_ancestor_cache.dart
│ │ │ │ ├── selection_menu/
│ │ │ │ │ ├── mobile_selection_menu.dart
│ │ │ │ │ ├── mobile_selection_menu_item.dart
│ │ │ │ │ ├── mobile_selection_menu_item_widget.dart
│ │ │ │ │ ├── mobile_selection_menu_widget.dart
│ │ │ │ │ └── slash_keyboard_service_interceptor.dart
│ │ │ │ ├── setting/
│ │ │ │ │ ├── about/
│ │ │ │ │ │ ├── about.dart
│ │ │ │ │ │ └── about_setting_group.dart
│ │ │ │ │ ├── ai/
│ │ │ │ │ │ └── ai_settings_group.dart
│ │ │ │ │ ├── appearance/
│ │ │ │ │ │ ├── appearance_setting_group.dart
│ │ │ │ │ │ ├── rtl_setting.dart
│ │ │ │ │ │ ├── text_scale_setting.dart
│ │ │ │ │ │ └── theme_setting.dart
│ │ │ │ │ ├── cloud/
│ │ │ │ │ │ ├── appflowy_cloud_page.dart
│ │ │ │ │ │ └── cloud_setting_group.dart
│ │ │ │ │ ├── font/
│ │ │ │ │ │ ├── font_picker_screen.dart
│ │ │ │ │ │ └── font_setting.dart
│ │ │ │ │ ├── language/
│ │ │ │ │ │ └── language_picker_screen.dart
│ │ │ │ │ ├── language_setting_group.dart
│ │ │ │ │ ├── launch_settings_page.dart
│ │ │ │ │ ├── notifications_setting_group.dart
│ │ │ │ │ ├── personal_info/
│ │ │ │ │ │ ├── edit_username_bottom_sheet.dart
│ │ │ │ │ │ ├── personal_info.dart
│ │ │ │ │ │ └── personal_info_setting_group.dart
│ │ │ │ │ ├── self_host/
│ │ │ │ │ │ └── self_host_bottom_sheet.dart
│ │ │ │ │ ├── self_host_setting_group.dart
│ │ │ │ │ ├── setting.dart
│ │ │ │ │ ├── support_setting_group.dart
│ │ │ │ │ ├── user_session_setting_group.dart
│ │ │ │ │ ├── widgets/
│ │ │ │ │ │ ├── mobile_setting_group_widget.dart
│ │ │ │ │ │ ├── mobile_setting_item_widget.dart
│ │ │ │ │ │ ├── mobile_setting_trailing.dart
│ │ │ │ │ │ └── widgets.dart
│ │ │ │ │ └── workspace/
│ │ │ │ │ ├── add_members_screen.dart
│ │ │ │ │ ├── invite_member_by_link.dart
│ │ │ │ │ ├── invite_members_screen.dart
│ │ │ │ │ ├── member_list.dart
│ │ │ │ │ └── workspace_setting_group.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── flowy_mobile_option_decorate_box.dart
│ │ │ │ ├── flowy_mobile_quick_action_button.dart
│ │ │ │ ├── flowy_mobile_search_text_field.dart
│ │ │ │ ├── flowy_mobile_state_container.dart
│ │ │ │ ├── flowy_option_tile.dart
│ │ │ │ ├── navigation_bar_button.dart
│ │ │ │ ├── show_flowy_mobile_confirm_dialog.dart
│ │ │ │ └── widgets.dart
│ │ │ ├── plugins/
│ │ │ │ ├── ai_chat/
│ │ │ │ │ ├── application/
│ │ │ │ │ │ ├── ai_chat_prelude.dart
│ │ │ │ │ │ ├── ai_model_switch_listener.dart
│ │ │ │ │ │ ├── chat_ai_message_bloc.dart
│ │ │ │ │ │ ├── chat_bloc.dart
│ │ │ │ │ │ ├── chat_edit_document_service.dart
│ │ │ │ │ │ ├── chat_entity.dart
│ │ │ │ │ │ ├── chat_input_control_cubit.dart
│ │ │ │ │ │ ├── chat_input_file_bloc.dart
│ │ │ │ │ │ ├── chat_member_bloc.dart
│ │ │ │ │ │ ├── chat_message_handler.dart
│ │ │ │ │ │ ├── chat_message_height_manager.dart
│ │ │ │ │ │ ├── chat_message_listener.dart
│ │ │ │ │ │ ├── chat_message_service.dart
│ │ │ │ │ │ ├── chat_message_stream.dart
│ │ │ │ │ │ ├── chat_notification.dart
│ │ │ │ │ │ ├── chat_select_message_bloc.dart
│ │ │ │ │ │ ├── chat_settings_manager.dart
│ │ │ │ │ │ ├── chat_stream_manager.dart
│ │ │ │ │ │ ├── chat_user_cubit.dart
│ │ │ │ │ │ └── chat_user_message_bloc.dart
│ │ │ │ │ ├── chat.dart
│ │ │ │ │ ├── chat_page.dart
│ │ │ │ │ └── presentation/
│ │ │ │ │ ├── animated_chat_list.dart
│ │ │ │ │ ├── animated_chat_list_reversed.dart
│ │ │ │ │ ├── chat_avatar.dart
│ │ │ │ │ ├── chat_editor_style.dart
│ │ │ │ │ ├── chat_input/
│ │ │ │ │ │ └── mobile_chat_input.dart
│ │ │ │ │ ├── chat_message_selector_banner.dart
│ │ │ │ │ ├── chat_page/
│ │ │ │ │ │ ├── chat_animation_list_widget.dart
│ │ │ │ │ │ ├── chat_content_page.dart
│ │ │ │ │ │ ├── chat_footer.dart
│ │ │ │ │ │ ├── chat_message_widget.dart
│ │ │ │ │ │ ├── load_chat_message_status_ready.dart
│ │ │ │ │ │ └── text_message_widget.dart
│ │ │ │ │ ├── chat_related_question.dart
│ │ │ │ │ ├── chat_welcome_page.dart
│ │ │ │ │ ├── layout_define.dart
│ │ │ │ │ ├── message/
│ │ │ │ │ │ ├── ai_change_format_bottom_sheet.dart
│ │ │ │ │ │ ├── ai_change_model_bottom_sheet.dart
│ │ │ │ │ │ ├── ai_markdown_text.dart
│ │ │ │ │ │ ├── ai_message_action_bar.dart
│ │ │ │ │ │ ├── ai_message_bubble.dart
│ │ │ │ │ │ ├── ai_metadata.dart
│ │ │ │ │ │ ├── ai_text_message.dart
│ │ │ │ │ │ ├── error_text_message.dart
│ │ │ │ │ │ ├── message_util.dart
│ │ │ │ │ │ ├── user_message_bubble.dart
│ │ │ │ │ │ └── user_text_message.dart
│ │ │ │ │ ├── scroll_to_bottom.dart
│ │ │ │ │ └── widgets/
│ │ │ │ │ └── message_height_calculator.dart
│ │ │ │ ├── base/
│ │ │ │ │ ├── color/
│ │ │ │ │ │ ├── color_picker.dart
│ │ │ │ │ │ └── color_picker_screen.dart
│ │ │ │ │ ├── drag_handler.dart
│ │ │ │ │ ├── emoji/
│ │ │ │ │ │ ├── emoji_picker.dart
│ │ │ │ │ │ ├── emoji_picker_header.dart
│ │ │ │ │ │ ├── emoji_picker_screen.dart
│ │ │ │ │ │ └── emoji_text.dart
│ │ │ │ │ └── icon/
│ │ │ │ │ └── icon_widget.dart
│ │ │ │ ├── blank/
│ │ │ │ │ └── blank.dart
│ │ │ │ ├── database/
│ │ │ │ │ ├── application/
│ │ │ │ │ │ ├── calculations/
│ │ │ │ │ │ │ ├── calculation_type_ext.dart
│ │ │ │ │ │ │ ├── calculations_listener.dart
│ │ │ │ │ │ │ └── calculations_service.dart
│ │ │ │ │ │ ├── cell/
│ │ │ │ │ │ │ ├── bloc/
│ │ │ │ │ │ │ │ ├── checkbox_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── checklist_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── date_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── date_cell_editor_bloc.dart
│ │ │ │ │ │ │ │ ├── media_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── number_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── relation_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── relation_row_search_bloc.dart
│ │ │ │ │ │ │ │ ├── select_option_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── select_option_cell_editor_bloc.dart
│ │ │ │ │ │ │ │ ├── summary_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── summary_row_bloc.dart
│ │ │ │ │ │ │ │ ├── text_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── time_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── timestamp_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── translate_cell_bloc.dart
│ │ │ │ │ │ │ │ ├── translate_row_bloc.dart
│ │ │ │ │ │ │ │ └── url_cell_bloc.dart
│ │ │ │ │ │ │ ├── cell_cache.dart
│ │ │ │ │ │ │ ├── cell_controller.dart
│ │ │ │ │ │ │ ├── cell_controller_builder.dart
│ │ │ │ │ │ │ ├── cell_data_loader.dart
│ │ │ │ │ │ │ └── cell_data_persistence.dart
│ │ │ │ │ │ ├── database_controller.dart
│ │ │ │ │ │ ├── defines.dart
│ │ │ │ │ │ ├── field/
│ │ │ │ │ │ │ ├── field_cell_bloc.dart
│ │ │ │ │ │ │ ├── field_controller.dart
│ │ │ │ │ │ │ ├── field_editor_bloc.dart
│ │ │ │ │ │ │ ├── field_info.dart
│ │ │ │ │ │ │ ├── filter_entities.dart
│ │ │ │ │ │ │ ├── sort_entities.dart
│ │ │ │ │ │ │ └── type_option/
│ │ │ │ │ │ │ ├── edit_select_option_bloc.dart
│ │ │ │ │ │ │ ├── number_format_bloc.dart
│ │ │ │ │ │ │ ├── relation_type_option_cubit.dart
│ │ │ │ │ │ │ ├── select_option_type_option_bloc.dart
│ │ │ │ │ │ │ ├── select_type_option_actions.dart
│ │ │ │ │ │ │ ├── translate_type_option_bloc.dart
│ │ │ │ │ │ │ └── type_option_data_parser.dart
│ │ │ │ │ │ ├── layout/
│ │ │ │ │ │ │ └── layout_bloc.dart
│ │ │ │ │ │ ├── row/
│ │ │ │ │ │ │ ├── related_row_detail_bloc.dart
│ │ │ │ │ │ │ ├── row_banner_bloc.dart
│ │ │ │ │ │ │ ├── row_cache.dart
│ │ │ │ │ │ │ ├── row_controller.dart
│ │ │ │ │ │ │ ├── row_list.dart
│ │ │ │ │ │ │ └── row_service.dart
│ │ │ │ │ │ ├── setting/
│ │ │ │ │ │ │ ├── group_bloc.dart
│ │ │ │ │ │ │ ├── property_bloc.dart
│ │ │ │ │ │ │ ├── setting_listener.dart
│ │ │ │ │ │ │ └── setting_service.dart
│ │ │ │ │ │ ├── share_bloc.dart
│ │ │ │ │ │ ├── sync/
│ │ │ │ │ │ │ ├── database_sync_bloc.dart
│ │ │ │ │ │ │ └── database_sync_state_listener.dart
│ │ │ │ │ │ ├── tab_bar_bloc.dart
│ │ │ │ │ │ └── view/
│ │ │ │ │ │ ├── view_cache.dart
│ │ │ │ │ │ └── view_listener.dart
│ │ │ │ │ ├── board/
│ │ │ │ │ │ ├── application/
│ │ │ │ │ │ │ ├── board_actions_bloc.dart
│ │ │ │ │ │ │ ├── board_bloc.dart
│ │ │ │ │ │ │ └── group_controller.dart
│ │ │ │ │ │ ├── board.dart
│ │ │ │ │ │ ├── group_ext.dart
│ │ │ │ │ │ ├── presentation/
│ │ │ │ │ │ │ ├── board_page.dart
│ │ │ │ │ │ │ ├── toolbar/
│ │ │ │ │ │ │ │ └── board_setting_bar.dart
│ │ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ │ ├── board_checkbox_column_header.dart
│ │ │ │ │ │ │ ├── board_column_header.dart
│ │ │ │ │ │ │ ├── board_editable_column_header.dart
│ │ │ │ │ │ │ ├── board_focus_scope.dart
│ │ │ │ │ │ │ ├── board_hidden_groups.dart
│ │ │ │ │ │ │ └── board_shortcut_container.dart
│ │ │ │ │ │ └── tests/
│ │ │ │ │ │ └── integrate_test/
│ │ │ │ │ │ └── card_test.dart
│ │ │ │ │ ├── calendar/
│ │ │ │ │ │ ├── application/
│ │ │ │ │ │ │ ├── calendar_bloc.dart
│ │ │ │ │ │ │ ├── calendar_event_editor_bloc.dart
│ │ │ │ │ │ │ ├── calendar_setting_bloc.dart
│ │ │ │ │ │ │ └── unschedule_event_bloc.dart
│ │ │ │ │ │ ├── calendar.dart
│ │ │ │ │ │ └── presentation/
│ │ │ │ │ │ ├── calendar_day.dart
│ │ │ │ │ │ ├── calendar_event_card.dart
│ │ │ │ │ │ ├── calendar_event_editor.dart
│ │ │ │ │ │ ├── calendar_page.dart
│ │ │ │ │ │ ├── layout/
│ │ │ │ │ │ │ └── sizes.dart
│ │ │ │ │ │ └── toolbar/
│ │ │ │ │ │ ├── calendar_layout_setting.dart
│ │ │ │ │ │ └── calendar_setting_bar.dart
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── cell_listener.dart
│ │ │ │ │ │ ├── cell_service.dart
│ │ │ │ │ │ ├── checklist_cell_service.dart
│ │ │ │ │ │ ├── database_view_service.dart
│ │ │ │ │ │ ├── date_cell_service.dart
│ │ │ │ │ │ ├── field_backend_service.dart
│ │ │ │ │ │ ├── field_listener.dart
│ │ │ │ │ │ ├── field_service.dart
│ │ │ │ │ │ ├── field_settings_listener.dart
│ │ │ │ │ │ ├── field_settings_service.dart
│ │ │ │ │ │ ├── filter_listener.dart
│ │ │ │ │ │ ├── filter_service.dart
│ │ │ │ │ │ ├── group_listener.dart
│ │ │ │ │ │ ├── group_service.dart
│ │ │ │ │ │ ├── layout_service.dart
│ │ │ │ │ │ ├── layout_setting_listener.dart
│ │ │ │ │ │ ├── row_listener.dart
│ │ │ │ │ │ ├── row_meta_listener.dart
│ │ │ │ │ │ ├── select_option_cell_service.dart
│ │ │ │ │ │ ├── sort_listener.dart
│ │ │ │ │ │ ├── sort_service.dart
│ │ │ │ │ │ └── type_option_service.dart
│ │ │ │ │ ├── grid/
│ │ │ │ │ │ ├── application/
│ │ │ │ │ │ │ ├── calculations/
│ │ │ │ │ │ │ │ ├── calculations_bloc.dart
│ │ │ │ │ │ │ │ └── field_type_calc_ext.dart
│ │ │ │ │ │ │ ├── filter/
│ │ │ │ │ │ │ │ ├── filter_editor_bloc.dart
│ │ │ │ │ │ │ │ └── select_option_loader.dart
│ │ │ │ │ │ │ ├── grid_accessory_bloc.dart
│ │ │ │ │ │ │ ├── grid_bloc.dart
│ │ │ │ │ │ │ ├── grid_header_bloc.dart
│ │ │ │ │ │ │ ├── row/
│ │ │ │ │ │ │ │ ├── mobile_row_detail_bloc.dart
│ │ │ │ │ │ │ │ ├── row_bloc.dart
│ │ │ │ │ │ │ │ ├── row_detail_bloc.dart
│ │ │ │ │ │ │ │ └── row_document_bloc.dart
│ │ │ │ │ │ │ ├── simple_text_filter_bloc.dart
│ │ │ │ │ │ │ └── sort/
│ │ │ │ │ │ │ └── sort_editor_bloc.dart
│ │ │ │ │ │ ├── grid.dart
│ │ │ │ │ │ └── presentation/
│ │ │ │ │ │ ├── grid_page.dart
│ │ │ │ │ │ ├── grid_scroll.dart
│ │ │ │ │ │ ├── layout/
│ │ │ │ │ │ │ ├── layout.dart
│ │ │ │ │ │ │ └── sizes.dart
│ │ │ │ │ │ ├── mobile_grid_page.dart
│ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ ├── calculations/
│ │ │ │ │ │ │ ├── calculate_cell.dart
│ │ │ │ │ │ │ ├── calculation_selector.dart
│ │ │ │ │ │ │ ├── calculation_type_item.dart
│ │ │ │ │ │ │ ├── calculations_row.dart
│ │ │ │ │ │ │ └── remove_calculation_button.dart
│ │ │ │ │ │ ├── common/
│ │ │ │ │ │ │ └── type_option_separator.dart
│ │ │ │ │ │ ├── filter/
│ │ │ │ │ │ │ ├── choicechip/
│ │ │ │ │ │ │ │ ├── checkbox.dart
│ │ │ │ │ │ │ │ ├── checklist.dart
│ │ │ │ │ │ │ │ ├── choicechip.dart
│ │ │ │ │ │ │ │ ├── date.dart
│ │ │ │ │ │ │ │ ├── number.dart
│ │ │ │ │ │ │ │ ├── select_option/
│ │ │ │ │ │ │ │ │ ├── condition_list.dart
│ │ │ │ │ │ │ │ │ ├── option_list.dart
│ │ │ │ │ │ │ │ │ └── select_option.dart
│ │ │ │ │ │ │ │ ├── text.dart
│ │ │ │ │ │ │ │ ├── time.dart
│ │ │ │ │ │ │ │ └── url.dart
│ │ │ │ │ │ │ ├── condition_button.dart
│ │ │ │ │ │ │ ├── create_filter_list.dart
│ │ │ │ │ │ │ ├── disclosure_button.dart
│ │ │ │ │ │ │ ├── filter_menu.dart
│ │ │ │ │ │ │ └── filter_menu_item.dart
│ │ │ │ │ │ ├── footer/
│ │ │ │ │ │ │ └── grid_footer.dart
│ │ │ │ │ │ ├── header/
│ │ │ │ │ │ │ ├── desktop_field_cell.dart
│ │ │ │ │ │ │ ├── field_type_extension.dart
│ │ │ │ │ │ │ ├── grid_header.dart
│ │ │ │ │ │ │ ├── mobile_field_button.dart
│ │ │ │ │ │ │ └── mobile_grid_header.dart
│ │ │ │ │ │ ├── mobile_fab.dart
│ │ │ │ │ │ ├── row/
│ │ │ │ │ │ │ ├── action.dart
│ │ │ │ │ │ │ ├── mobile_row.dart
│ │ │ │ │ │ │ └── row.dart
│ │ │ │ │ │ ├── shortcuts.dart
│ │ │ │ │ │ ├── sort/
│ │ │ │ │ │ │ ├── create_sort_list.dart
│ │ │ │ │ │ │ ├── order_panel.dart
│ │ │ │ │ │ │ ├── sort_choice_button.dart
│ │ │ │ │ │ │ ├── sort_editor.dart
│ │ │ │ │ │ │ └── sort_menu.dart
│ │ │ │ │ │ └── toolbar/
│ │ │ │ │ │ ├── filter_button.dart
│ │ │ │ │ │ ├── grid_setting_bar.dart
│ │ │ │ │ │ ├── sort_button.dart
│ │ │ │ │ │ └── view_database_button.dart
│ │ │ │ │ ├── tab_bar/
│ │ │ │ │ │ ├── desktop/
│ │ │ │ │ │ │ ├── setting_menu.dart
│ │ │ │ │ │ │ ├── tab_bar_add_button.dart
│ │ │ │ │ │ │ └── tab_bar_header.dart
│ │ │ │ │ │ ├── mobile/
│ │ │ │ │ │ │ └── mobile_tab_bar_header.dart
│ │ │ │ │ │ └── tab_bar_view.dart
│ │ │ │ │ └── widgets/
│ │ │ │ │ ├── card/
│ │ │ │ │ │ ├── card.dart
│ │ │ │ │ │ ├── card_bloc.dart
│ │ │ │ │ │ └── container/
│ │ │ │ │ │ ├── accessory.dart
│ │ │ │ │ │ └── card_container.dart
│ │ │ │ │ ├── cell/
│ │ │ │ │ │ ├── card_cell_builder.dart
│ │ │ │ │ │ ├── card_cell_skeleton/
│ │ │ │ │ │ │ ├── card_cell.dart
│ │ │ │ │ │ │ ├── checkbox_card_cell.dart
│ │ │ │ │ │ │ ├── checklist_card_cell.dart
│ │ │ │ │ │ │ ├── date_card_cell.dart
│ │ │ │ │ │ │ ├── media_card_cell.dart
│ │ │ │ │ │ │ ├── number_card_cell.dart
│ │ │ │ │ │ │ ├── relation_card_cell.dart
│ │ │ │ │ │ │ ├── select_option_card_cell.dart
│ │ │ │ │ │ │ ├── summary_card_cell.dart
│ │ │ │ │ │ │ ├── text_card_cell.dart
│ │ │ │ │ │ │ ├── time_card_cell.dart
│ │ │ │ │ │ │ ├── timestamp_card_cell.dart
│ │ │ │ │ │ │ ├── translate_card_cell.dart
│ │ │ │ │ │ │ └── url_card_cell.dart
│ │ │ │ │ │ ├── card_cell_style_maps/
│ │ │ │ │ │ │ ├── calendar_card_cell_style.dart
│ │ │ │ │ │ │ ├── desktop_board_card_cell_style.dart
│ │ │ │ │ │ │ └── mobile_board_card_cell_style.dart
│ │ │ │ │ │ ├── desktop_grid/
│ │ │ │ │ │ │ ├── desktop_grid_checkbox_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_checklist_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_date_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_media_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_number_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_relation_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_select_option_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_summary_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_text_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_time_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_timestamp_cell.dart
│ │ │ │ │ │ │ ├── desktop_grid_translate_cell.dart
│ │ │ │ │ │ │ └── desktop_grid_url_cell.dart
│ │ │ │ │ │ ├── desktop_row_detail/
│ │ │ │ │ │ │ ├── desktop_row_detail_checkbox_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_checklist_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_date_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_media_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_number_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_relation_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_select_option_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_summary_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_text_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_time_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_timestamp_cell.dart
│ │ │ │ │ │ │ ├── desktop_row_detail_url_cell.dart
│ │ │ │ │ │ │ └── destop_row_detail_translate_cell.dart
│ │ │ │ │ │ ├── editable_cell_builder.dart
│ │ │ │ │ │ ├── editable_cell_skeleton/
│ │ │ │ │ │ │ ├── checkbox.dart
│ │ │ │ │ │ │ ├── checklist.dart
│ │ │ │ │ │ │ ├── date.dart
│ │ │ │ │ │ │ ├── media.dart
│ │ │ │ │ │ │ ├── number.dart
│ │ │ │ │ │ │ ├── relation.dart
│ │ │ │ │ │ │ ├── select_option.dart
│ │ │ │ │ │ │ ├── summary.dart
│ │ │ │ │ │ │ ├── text.dart
│ │ │ │ │ │ │ ├── time.dart
│ │ │ │ │ │ │ ├── timestamp.dart
│ │ │ │ │ │ │ ├── translate.dart
│ │ │ │ │ │ │ └── url.dart
│ │ │ │ │ │ ├── mobile_grid/
│ │ │ │ │ │ │ ├── mobile_grid_checkbox_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_checklist_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_date_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_number_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_relation_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_select_option_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_summary_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_text_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_time_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_timestamp_cell.dart
│ │ │ │ │ │ │ ├── mobile_grid_translate_cell.dart
│ │ │ │ │ │ │ └── mobile_grid_url_cell.dart
│ │ │ │ │ │ └── mobile_row_detail/
│ │ │ │ │ │ ├── mobile_row_detail_checkbox_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_checklist_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_date_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_number_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_relation_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_select_cell_option.dart
│ │ │ │ │ │ ├── mobile_row_detail_summary_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_text_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_time_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_timestamp_cell.dart
│ │ │ │ │ │ ├── mobile_row_detail_translate_cell.dart
│ │ │ │ │ │ └── mobile_row_detail_url_cell.dart
│ │ │ │ │ ├── cell_editor/
│ │ │ │ │ │ ├── checklist_cell_editor.dart
│ │ │ │ │ │ ├── checklist_cell_textfield.dart
│ │ │ │ │ │ ├── checklist_progress_bar.dart
│ │ │ │ │ │ ├── date_cell_editor.dart
│ │ │ │ │ │ ├── extension.dart
│ │ │ │ │ │ ├── media_cell_editor.dart
│ │ │ │ │ │ ├── mobile_checklist_cell_editor.dart
│ │ │ │ │ │ ├── mobile_media_cell_editor.dart
│ │ │ │ │ │ ├── mobile_select_option_editor.dart
│ │ │ │ │ │ ├── relation_cell_editor.dart
│ │ │ │ │ │ ├── select_option_cell_editor.dart
│ │ │ │ │ │ └── select_option_text_field.dart
│ │ │ │ │ ├── database_layout_ext.dart
│ │ │ │ │ ├── database_view_widget.dart
│ │ │ │ │ ├── field/
│ │ │ │ │ │ ├── field_editor.dart
│ │ │ │ │ │ ├── field_type_list.dart
│ │ │ │ │ │ └── type_option_editor/
│ │ │ │ │ │ ├── builder.dart
│ │ │ │ │ │ ├── checkbox.dart
│ │ │ │ │ │ ├── checklist.dart
│ │ │ │ │ │ ├── date/
│ │ │ │ │ │ │ └── date_time_format.dart
│ │ │ │ │ │ ├── date.dart
│ │ │ │ │ │ ├── media.dart
│ │ │ │ │ │ ├── multi_select.dart
│ │ │ │ │ │ ├── number.dart
│ │ │ │ │ │ ├── relation.dart
│ │ │ │ │ │ ├── rich_text.dart
│ │ │ │ │ │ ├── select/
│ │ │ │ │ │ │ ├── select_option.dart
│ │ │ │ │ │ │ └── select_option_editor.dart
│ │ │ │ │ │ ├── single_select.dart
│ │ │ │ │ │ ├── summary.dart
│ │ │ │ │ │ ├── time.dart
│ │ │ │ │ │ ├── timestamp.dart
│ │ │ │ │ │ ├── translate.dart
│ │ │ │ │ │ └── url.dart
│ │ │ │ │ ├── group/
│ │ │ │ │ │ └── database_group.dart
│ │ │ │ │ ├── media_file_type_ext.dart
│ │ │ │ │ ├── row/
│ │ │ │ │ │ ├── accessory/
│ │ │ │ │ │ │ ├── cell_accessory.dart
│ │ │ │ │ │ │ └── cell_shortcuts.dart
│ │ │ │ │ │ ├── cells/
│ │ │ │ │ │ │ ├── cell_container.dart
│ │ │ │ │ │ │ └── mobile_cell_container.dart
│ │ │ │ │ │ ├── relation_row_detail.dart
│ │ │ │ │ │ ├── row_action.dart
│ │ │ │ │ │ ├── row_banner.dart
│ │ │ │ │ │ ├── row_detail.dart
│ │ │ │ │ │ ├── row_document.dart
│ │ │ │ │ │ └── row_property.dart
│ │ │ │ │ ├── setting/
│ │ │ │ │ │ ├── database_layout_selector.dart
│ │ │ │ │ │ ├── database_setting_action.dart
│ │ │ │ │ │ ├── database_settings_list.dart
│ │ │ │ │ │ ├── field_visibility_extension.dart
│ │ │ │ │ │ ├── mobile_database_controls.dart
│ │ │ │ │ │ ├── setting_button.dart
│ │ │ │ │ │ └── setting_property_list.dart
│ │ │ │ │ └── share_button.dart
│ │ │ │ ├── database_document/
│ │ │ │ │ ├── database_document_page.dart
│ │ │ │ │ ├── database_document_plugin.dart
│ │ │ │ │ └── presentation/
│ │ │ │ │ ├── database_document_title.dart
│ │ │ │ │ └── database_document_title_bloc.dart
│ │ │ │ ├── document/
│ │ │ │ │ ├── application/
│ │ │ │ │ │ ├── doc_sync_state_listener.dart
│ │ │ │ │ │ ├── document_appearance_cubit.dart
│ │ │ │ │ │ ├── document_awareness_metadata.dart
│ │ │ │ │ │ ├── document_bloc.dart
│ │ │ │ │ │ ├── document_collab_adapter.dart
│ │ │ │ │ │ ├── document_collaborators_bloc.dart
│ │ │ │ │ │ ├── document_data_pb_extension.dart
│ │ │ │ │ │ ├── document_diff.dart
│ │ │ │ │ │ ├── document_listener.dart
│ │ │ │ │ │ ├── document_rules.dart
│ │ │ │ │ │ ├── document_service.dart
│ │ │ │ │ │ ├── document_sync_bloc.dart
│ │ │ │ │ │ ├── document_validator.dart
│ │ │ │ │ │ ├── editor_transaction_adapter.dart
│ │ │ │ │ │ └── prelude.dart
│ │ │ │ │ ├── document.dart
│ │ │ │ │ ├── document_page.dart
│ │ │ │ │ └── presentation/
│ │ │ │ │ ├── banner.dart
│ │ │ │ │ ├── collaborator_avatar_stack.dart
│ │ │ │ │ ├── compact_mode_event.dart
│ │ │ │ │ ├── document_collaborators.dart
│ │ │ │ │ ├── editor_configuration.dart
│ │ │ │ │ ├── editor_drop_handler.dart
│ │ │ │ │ ├── editor_drop_manager.dart
│ │ │ │ │ ├── editor_notification.dart
│ │ │ │ │ ├── editor_page.dart
│ │ │ │ │ ├── editor_plugins/
│ │ │ │ │ │ ├── actions/
│ │ │ │ │ │ │ ├── block_action_add_button.dart
│ │ │ │ │ │ │ ├── block_action_button.dart
│ │ │ │ │ │ │ ├── block_action_list.dart
│ │ │ │ │ │ │ ├── block_action_option_button.dart
│ │ │ │ │ │ │ ├── block_action_option_cubit.dart
│ │ │ │ │ │ │ ├── drag_to_reorder/
│ │ │ │ │ │ │ │ ├── draggable_option_button.dart
│ │ │ │ │ │ │ │ ├── draggable_option_button_feedback.dart
│ │ │ │ │ │ │ │ ├── option_button.dart
│ │ │ │ │ │ │ │ ├── util.dart
│ │ │ │ │ │ │ │ └── visual_drag_area.dart
│ │ │ │ │ │ │ ├── mobile_block_action_buttons.dart
│ │ │ │ │ │ │ └── option/
│ │ │ │ │ │ │ ├── align_option_action.dart
│ │ │ │ │ │ │ ├── color_option_action.dart
│ │ │ │ │ │ │ ├── depth_option_action.dart
│ │ │ │ │ │ │ ├── divider_option_action.dart
│ │ │ │ │ │ │ ├── option_actions.dart
│ │ │ │ │ │ │ └── turn_into_option_action.dart
│ │ │ │ │ │ ├── ai/
│ │ │ │ │ │ │ ├── ai_writer_block_component.dart
│ │ │ │ │ │ │ ├── ai_writer_toolbar_item.dart
│ │ │ │ │ │ │ ├── operations/
│ │ │ │ │ │ │ │ ├── ai_writer_block_operations.dart
│ │ │ │ │ │ │ │ ├── ai_writer_cubit.dart
│ │ │ │ │ │ │ │ ├── ai_writer_entities.dart
│ │ │ │ │ │ │ │ └── ai_writer_node_extension.dart
│ │ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ │ ├── ai_writer_gesture_detector.dart
│ │ │ │ │ │ │ ├── ai_writer_prompt_input_more_button.dart
│ │ │ │ │ │ │ ├── ai_writer_scroll_wrapper.dart
│ │ │ │ │ │ │ └── ai_writer_suggestion_actions.dart
│ │ │ │ │ │ ├── align_toolbar_item/
│ │ │ │ │ │ │ ├── align_toolbar_item.dart
│ │ │ │ │ │ │ └── custom_text_align_command.dart
│ │ │ │ │ │ ├── background_color/
│ │ │ │ │ │ │ └── theme_background_color.dart
│ │ │ │ │ │ ├── base/
│ │ │ │ │ │ │ ├── backtick_character_command.dart
│ │ │ │ │ │ │ ├── build_context_extension.dart
│ │ │ │ │ │ │ ├── built_in_page_widget.dart
│ │ │ │ │ │ │ ├── cover_title_command.dart
│ │ │ │ │ │ │ ├── emoji_picker_button.dart
│ │ │ │ │ │ │ ├── font_colors.dart
│ │ │ │ │ │ │ ├── format_arrow_character.dart
│ │ │ │ │ │ │ ├── insert_page_command.dart
│ │ │ │ │ │ │ ├── link_to_page_widget.dart
│ │ │ │ │ │ │ ├── markdown_text_robot.dart
│ │ │ │ │ │ │ ├── page_reference_commands.dart
│ │ │ │ │ │ │ ├── selectable_item_list_menu.dart
│ │ │ │ │ │ │ ├── selectable_svg_widget.dart
│ │ │ │ │ │ │ ├── string_extension.dart
│ │ │ │ │ │ │ ├── text_robot.dart
│ │ │ │ │ │ │ └── toolbar_extension.dart
│ │ │ │ │ │ ├── block_menu/
│ │ │ │ │ │ │ └── block_menu_button.dart
│ │ │ │ │ │ ├── block_transaction_handler/
│ │ │ │ │ │ │ └── block_transaction_handler.dart
│ │ │ │ │ │ ├── bulleted_list/
│ │ │ │ │ │ │ └── bulleted_list_icon.dart
│ │ │ │ │ │ ├── callout/
│ │ │ │ │ │ │ ├── callout_block_component.dart
│ │ │ │ │ │ │ └── callout_block_shortcuts.dart
│ │ │ │ │ │ ├── code_block/
│ │ │ │ │ │ │ ├── code_block_copy_button.dart
│ │ │ │ │ │ │ ├── code_block_language_selector.dart
│ │ │ │ │ │ │ ├── code_block_menu_item.dart
│ │ │ │ │ │ │ └── code_language_screen.dart
│ │ │ │ │ │ ├── columns/
│ │ │ │ │ │ │ ├── simple_column_block_component.dart
│ │ │ │ │ │ │ ├── simple_column_block_width_resizer.dart
│ │ │ │ │ │ │ ├── simple_column_node_extension.dart
│ │ │ │ │ │ │ ├── simple_columns_block_component.dart
│ │ │ │ │ │ │ └── simple_columns_block_constant.dart
│ │ │ │ │ │ ├── context_menu/
│ │ │ │ │ │ │ └── custom_context_menu.dart
│ │ │ │ │ │ ├── copy_and_paste/
│ │ │ │ │ │ │ ├── clipboard_service.dart
│ │ │ │ │ │ │ ├── custom_copy_command.dart
│ │ │ │ │ │ │ ├── custom_cut_command.dart
│ │ │ │ │ │ │ ├── custom_paste_command.dart
│ │ │ │ │ │ │ ├── paste_from_block_link.dart
│ │ │ │ │ │ │ ├── paste_from_file.dart
│ │ │ │ │ │ │ ├── paste_from_html.dart
│ │ │ │ │ │ │ ├── paste_from_image.dart
│ │ │ │ │ │ │ ├── paste_from_in_app_json.dart
│ │ │ │ │ │ │ └── paste_from_plain_text.dart
│ │ │ │ │ │ ├── cover/
│ │ │ │ │ │ │ ├── document_immersive_cover.dart
│ │ │ │ │ │ │ └── document_immersive_cover_bloc.dart
│ │ │ │ │ │ ├── database/
│ │ │ │ │ │ │ ├── database_view_block_component.dart
│ │ │ │ │ │ │ ├── inline_database_menu_item.dart
│ │ │ │ │ │ │ └── referenced_database_menu_item.dart
│ │ │ │ │ │ ├── delta/
│ │ │ │ │ │ │ └── text_delta_extension.dart
│ │ │ │ │ │ ├── desktop_toolbar/
│ │ │ │ │ │ │ ├── color_picker.dart
│ │ │ │ │ │ │ ├── desktop_floating_toolbar.dart
│ │ │ │ │ │ │ ├── link/
│ │ │ │ │ │ │ │ ├── link_create_menu.dart
│ │ │ │ │ │ │ │ ├── link_edit_menu.dart
│ │ │ │ │ │ │ │ ├── link_extension.dart
│ │ │ │ │ │ │ │ ├── link_hover_menu.dart
│ │ │ │ │ │ │ │ ├── link_replace_menu.dart
│ │ │ │ │ │ │ │ ├── link_search_text_field.dart
│ │ │ │ │ │ │ │ └── link_styles.dart
│ │ │ │ │ │ │ └── toolbar_animation.dart
│ │ │ │ │ │ ├── error/
│ │ │ │ │ │ │ └── error_block_component_builder.dart
│ │ │ │ │ │ ├── extensions/
│ │ │ │ │ │ │ └── flowy_tint_extension.dart
│ │ │ │ │ │ ├── file/
│ │ │ │ │ │ │ ├── file_block.dart
│ │ │ │ │ │ │ ├── file_block_component.dart
│ │ │ │ │ │ │ ├── file_block_menu.dart
│ │ │ │ │ │ │ ├── file_selection_menu.dart
│ │ │ │ │ │ │ ├── file_upload_menu.dart
│ │ │ │ │ │ │ ├── file_util.dart
│ │ │ │ │ │ │ └── mobile_file_upload_menu.dart
│ │ │ │ │ │ ├── find_and_replace/
│ │ │ │ │ │ │ └── find_and_replace_menu.dart
│ │ │ │ │ │ ├── font/
│ │ │ │ │ │ │ └── customize_font_toolbar_item.dart
│ │ │ │ │ │ ├── header/
│ │ │ │ │ │ │ ├── cover_editor.dart
│ │ │ │ │ │ │ ├── cover_editor_bloc.dart
│ │ │ │ │ │ │ ├── cover_title.dart
│ │ │ │ │ │ │ ├── custom_cover_picker.dart
│ │ │ │ │ │ │ ├── custom_cover_picker_bloc.dart
│ │ │ │ │ │ │ ├── desktop_cover.dart
│ │ │ │ │ │ │ ├── document_cover_widget.dart
│ │ │ │ │ │ │ └── emoji_icon_widget.dart
│ │ │ │ │ │ ├── heading/
│ │ │ │ │ │ │ └── heading_toolbar_item.dart
│ │ │ │ │ │ ├── i18n/
│ │ │ │ │ │ │ └── editor_i18n.dart
│ │ │ │ │ │ ├── image/
│ │ │ │ │ │ │ ├── common.dart
│ │ │ │ │ │ │ ├── custom_image_block_component/
│ │ │ │ │ │ │ │ ├── custom_image_block_component.dart
│ │ │ │ │ │ │ │ ├── image_menu.dart
│ │ │ │ │ │ │ │ └── unsupport_image_widget.dart
│ │ │ │ │ │ │ ├── image_picker_screen.dart
│ │ │ │ │ │ │ ├── image_placeholder.dart
│ │ │ │ │ │ │ ├── image_selection_menu.dart
│ │ │ │ │ │ │ ├── image_util.dart
│ │ │ │ │ │ │ ├── mobile_image_toolbar_item.dart
│ │ │ │ │ │ │ ├── multi_image_block_component/
│ │ │ │ │ │ │ │ ├── image_render.dart
│ │ │ │ │ │ │ │ ├── layouts/
│ │ │ │ │ │ │ │ │ ├── image_browser_layout.dart
│ │ │ │ │ │ │ │ │ ├── image_grid_layout.dart
│ │ │ │ │ │ │ │ │ └── multi_image_layouts.dart
│ │ │ │ │ │ │ │ ├── multi_image_block_component.dart
│ │ │ │ │ │ │ │ ├── multi_image_menu.dart
│ │ │ │ │ │ │ │ └── multi_image_placeholder.dart
│ │ │ │ │ │ │ ├── resizeable_image.dart
│ │ │ │ │ │ │ ├── unsplash_image_widget.dart
│ │ │ │ │ │ │ └── upload_image_menu/
│ │ │ │ │ │ │ ├── upload_image_menu.dart
│ │ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ │ ├── embed_image_url_widget.dart
│ │ │ │ │ │ │ └── upload_image_file_widget.dart
│ │ │ │ │ │ ├── inline_math_equation/
│ │ │ │ │ │ │ ├── inline_math_equation.dart
│ │ │ │ │ │ │ └── inline_math_equation_toolbar_item.dart
│ │ │ │ │ │ ├── keyboard_interceptor/
│ │ │ │ │ │ │ └── keyboard_interceptor.dart
│ │ │ │ │ │ ├── link_embed/
│ │ │ │ │ │ │ ├── link_embed_block_component.dart
│ │ │ │ │ │ │ └── link_embed_menu.dart
│ │ │ │ │ │ ├── link_preview/
│ │ │ │ │ │ │ ├── custom_link_parser.dart
│ │ │ │ │ │ │ ├── custom_link_preview.dart
│ │ │ │ │ │ │ ├── custom_link_preview_block_component.dart
│ │ │ │ │ │ │ ├── default_selectable_mixin.dart
│ │ │ │ │ │ │ ├── link_parsers/
│ │ │ │ │ │ │ │ ├── default_parser.dart
│ │ │ │ │ │ │ │ └── youtube_parser.dart
│ │ │ │ │ │ │ ├── link_preview_menu.dart
│ │ │ │ │ │ │ ├── paste_as/
│ │ │ │ │ │ │ │ └── paste_as_menu.dart
│ │ │ │ │ │ │ └── shared.dart
│ │ │ │ │ │ ├── math_equation/
│ │ │ │ │ │ │ ├── math_equation_block_component.dart
│ │ │ │ │ │ │ ├── math_equation_shortcut.dart
│ │ │ │ │ │ │ └── mobile_math_equation_toolbar_item.dart
│ │ │ │ │ │ ├── mention/
│ │ │ │ │ │ │ ├── child_page_transaction_handler.dart
│ │ │ │ │ │ │ ├── date_transaction_handler.dart
│ │ │ │ │ │ │ ├── mention_block.dart
│ │ │ │ │ │ │ ├── mention_date_block.dart
│ │ │ │ │ │ │ ├── mention_link_block.dart
│ │ │ │ │ │ │ ├── mention_link_error_preview.dart
│ │ │ │ │ │ │ ├── mention_link_preview.dart
│ │ │ │ │ │ │ ├── mention_page_bloc.dart
│ │ │ │ │ │ │ ├── mention_page_block.dart
│ │ │ │ │ │ │ └── mobile_page_selector_sheet.dart
│ │ │ │ │ │ ├── menu/
│ │ │ │ │ │ │ └── menu_extension.dart
│ │ │ │ │ │ ├── migration/
│ │ │ │ │ │ │ └── editor_migration.dart
│ │ │ │ │ │ ├── mobile_floating_toolbar/
│ │ │ │ │ │ │ └── custom_mobile_floating_toolbar.dart
│ │ │ │ │ │ ├── mobile_toolbar_item/
│ │ │ │ │ │ │ ├── mobile_add_block_toolbar_item.dart
│ │ │ │ │ │ │ └── mobile_block_settings_screen.dart
│ │ │ │ │ │ ├── mobile_toolbar_v3/
│ │ │ │ │ │ │ ├── _get_selection_color.dart
│ │ │ │ │ │ │ ├── aa_menu/
│ │ │ │ │ │ │ │ ├── _align_items.dart
│ │ │ │ │ │ │ │ ├── _bius_items.dart
│ │ │ │ │ │ │ │ ├── _block_items.dart
│ │ │ │ │ │ │ │ ├── _close_keyboard_or_menu_button.dart
│ │ │ │ │ │ │ │ ├── _color_item.dart
│ │ │ │ │ │ │ │ ├── _color_list.dart
│ │ │ │ │ │ │ │ ├── _font_item.dart
│ │ │ │ │ │ │ │ ├── _heading_and_text_items.dart
│ │ │ │ │ │ │ │ ├── _indent_items.dart
│ │ │ │ │ │ │ │ ├── _menu_item.dart
│ │ │ │ │ │ │ │ ├── _popup_menu.dart
│ │ │ │ │ │ │ │ └── _toolbar_theme.dart
│ │ │ │ │ │ │ ├── aa_toolbar_item.dart
│ │ │ │ │ │ │ ├── add_attachment_item.dart
│ │ │ │ │ │ │ ├── add_block_menu_item_builder.dart
│ │ │ │ │ │ │ ├── add_block_toolbar_item.dart
│ │ │ │ │ │ │ ├── appflowy_mobile_toolbar.dart
│ │ │ │ │ │ │ ├── appflowy_mobile_toolbar_item.dart
│ │ │ │ │ │ │ ├── basic_toolbar_item.dart
│ │ │ │ │ │ │ ├── indent_outdent_toolbar_item.dart
│ │ │ │ │ │ │ ├── keyboard_height_observer.dart
│ │ │ │ │ │ │ ├── link_toolbar_item.dart
│ │ │ │ │ │ │ ├── list_toolbar_item.dart
│ │ │ │ │ │ │ ├── more_toolbar_item.dart
│ │ │ │ │ │ │ ├── toolbar_item_builder.dart
│ │ │ │ │ │ │ ├── undo_redo_toolbar_item.dart
│ │ │ │ │ │ │ └── util.dart
│ │ │ │ │ │ ├── numbered_list/
│ │ │ │ │ │ │ └── numbered_list_icon.dart
│ │ │ │ │ │ ├── outline/
│ │ │ │ │ │ │ └── outline_block_component.dart
│ │ │ │ │ │ ├── page_block/
│ │ │ │ │ │ │ └── custom_page_block_component.dart
│ │ │ │ │ │ ├── page_style/
│ │ │ │ │ │ │ ├── _page_cover_bottom_sheet.dart
│ │ │ │ │ │ │ ├── _page_style_cover_image.dart
│ │ │ │ │ │ │ ├── _page_style_icon.dart
│ │ │ │ │ │ │ ├── _page_style_icon_bloc.dart
│ │ │ │ │ │ │ ├── _page_style_layout.dart
│ │ │ │ │ │ │ ├── _page_style_util.dart
│ │ │ │ │ │ │ └── page_style_bottom_sheet.dart
│ │ │ │ │ │ ├── parsers/
│ │ │ │ │ │ │ ├── callout_node_parser.dart
│ │ │ │ │ │ │ ├── custom_image_node_parser.dart
│ │ │ │ │ │ │ ├── custom_paragraph_node_parser.dart
│ │ │ │ │ │ │ ├── database_node_parser.dart
│ │ │ │ │ │ │ ├── document_markdown_parsers.dart
│ │ │ │ │ │ │ ├── file_block_node_parser.dart
│ │ │ │ │ │ │ ├── link_preview_node_parser.dart
│ │ │ │ │ │ │ ├── markdown_code_parser.dart
│ │ │ │ │ │ │ ├── markdown_parsers.dart
│ │ │ │ │ │ │ ├── markdown_simple_table_parser.dart
│ │ │ │ │ │ │ ├── math_equation_node_parser.dart
│ │ │ │ │ │ │ ├── simple_table_node_parser.dart
│ │ │ │ │ │ │ ├── sub_page_node_parser.dart
│ │ │ │ │ │ │ └── toggle_list_node_parser.dart
│ │ │ │ │ │ ├── plugins.dart
│ │ │ │ │ │ ├── quote/
│ │ │ │ │ │ │ ├── quote_block_component.dart
│ │ │ │ │ │ │ └── quote_block_shortcuts.dart
│ │ │ │ │ │ ├── shared_context/
│ │ │ │ │ │ │ └── shared_context.dart
│ │ │ │ │ │ ├── shortcuts/
│ │ │ │ │ │ │ ├── character_shortcuts.dart
│ │ │ │ │ │ │ ├── command_shortcuts.dart
│ │ │ │ │ │ │ ├── custom_delete_command.dart
│ │ │ │ │ │ │ ├── exit_edit_mode_command.dart
│ │ │ │ │ │ │ ├── heading_block_shortcuts.dart
│ │ │ │ │ │ │ └── numbered_list_block_shortcuts.dart
│ │ │ │ │ │ ├── simple_table/
│ │ │ │ │ │ │ ├── simple_table.dart
│ │ │ │ │ │ │ ├── simple_table_block_component.dart
│ │ │ │ │ │ │ ├── simple_table_cell_block_component.dart
│ │ │ │ │ │ │ ├── simple_table_constants.dart
│ │ │ │ │ │ │ ├── simple_table_more_action.dart
│ │ │ │ │ │ │ ├── simple_table_operations/
│ │ │ │ │ │ │ │ ├── simple_table_content_operation.dart
│ │ │ │ │ │ │ │ ├── simple_table_delete_operation.dart
│ │ │ │ │ │ │ │ ├── simple_table_duplicate_operation.dart
│ │ │ │ │ │ │ │ ├── simple_table_header_operation.dart
│ │ │ │ │ │ │ │ ├── simple_table_insert_operation.dart
│ │ │ │ │ │ │ │ ├── simple_table_map_operation.dart
│ │ │ │ │ │ │ │ ├── simple_table_node_extension.dart
│ │ │ │ │ │ │ │ ├── simple_table_operations.dart
│ │ │ │ │ │ │ │ ├── simple_table_reorder_operation.dart
│ │ │ │ │ │ │ │ └── simple_table_style_operation.dart
│ │ │ │ │ │ │ ├── simple_table_row_block_component.dart
│ │ │ │ │ │ │ ├── simple_table_shortcuts/
│ │ │ │ │ │ │ │ ├── simple_table_arrow_down_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_arrow_left_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_arrow_right_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_arrow_up_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_backspace_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_command_extension.dart
│ │ │ │ │ │ │ │ ├── simple_table_commands.dart
│ │ │ │ │ │ │ │ ├── simple_table_enter_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_navigation_command.dart
│ │ │ │ │ │ │ │ ├── simple_table_select_all_command.dart
│ │ │ │ │ │ │ │ └── simple_table_tab_command.dart
│ │ │ │ │ │ │ └── simple_table_widgets/
│ │ │ │ │ │ │ ├── _desktop_simple_table_widget.dart
│ │ │ │ │ │ │ ├── _mobile_simple_table_widget.dart
│ │ │ │ │ │ │ ├── _simple_table_bottom_sheet_actions.dart
│ │ │ │ │ │ │ ├── simple_table_action_sheet.dart
│ │ │ │ │ │ │ ├── simple_table_add_column_and_row_button.dart
│ │ │ │ │ │ │ ├── simple_table_add_column_button.dart
│ │ │ │ │ │ │ ├── simple_table_add_row_button.dart
│ │ │ │ │ │ │ ├── simple_table_align_button.dart
│ │ │ │ │ │ │ ├── simple_table_background_menu.dart
│ │ │ │ │ │ │ ├── simple_table_basic_button.dart
│ │ │ │ │ │ │ ├── simple_table_border_builder.dart
│ │ │ │ │ │ │ ├── simple_table_bottom_sheet.dart
│ │ │ │ │ │ │ ├── simple_table_column_resize_handle.dart
│ │ │ │ │ │ │ ├── simple_table_divider.dart
│ │ │ │ │ │ │ ├── simple_table_feedback.dart
│ │ │ │ │ │ │ ├── simple_table_more_action_popup.dart
│ │ │ │ │ │ │ ├── simple_table_reorder_button.dart
│ │ │ │ │ │ │ ├── simple_table_widget.dart
│ │ │ │ │ │ │ └── widgets.dart
│ │ │ │ │ │ ├── slash_menu/
│ │ │ │ │ │ │ ├── slash_command.dart
│ │ │ │ │ │ │ ├── slash_menu_items/
│ │ │ │ │ │ │ │ ├── ai_writer_item.dart
│ │ │ │ │ │ │ │ ├── bulleted_list_item.dart
│ │ │ │ │ │ │ │ ├── callout_item.dart
│ │ │ │ │ │ │ │ ├── code_block_item.dart
│ │ │ │ │ │ │ │ ├── database_items.dart
│ │ │ │ │ │ │ │ ├── date_item.dart
│ │ │ │ │ │ │ │ ├── divider_item.dart
│ │ │ │ │ │ │ │ ├── emoji_item.dart
│ │ │ │ │ │ │ │ ├── file_item.dart
│ │ │ │ │ │ │ │ ├── heading_items.dart
│ │ │ │ │ │ │ │ ├── image_item.dart
│ │ │ │ │ │ │ │ ├── math_equation_item.dart
│ │ │ │ │ │ │ │ ├── mobile_items.dart
│ │ │ │ │ │ │ │ ├── numbered_list_item.dart
│ │ │ │ │ │ │ │ ├── outline_item.dart
│ │ │ │ │ │ │ │ ├── paragraph_item.dart
│ │ │ │ │ │ │ │ ├── photo_gallery_item.dart
│ │ │ │ │ │ │ │ ├── quote_item.dart
│ │ │ │ │ │ │ │ ├── simple_columns_item.dart
│ │ │ │ │ │ │ │ ├── simple_table_item.dart
│ │ │ │ │ │ │ │ ├── slash_menu_item_builder.dart
│ │ │ │ │ │ │ │ ├── slash_menu_items.dart
│ │ │ │ │ │ │ │ ├── sub_page_item.dart
│ │ │ │ │ │ │ │ ├── todo_list_item.dart
│ │ │ │ │ │ │ │ └── toggle_list_item.dart
│ │ │ │ │ │ │ └── slash_menu_items_builder.dart
│ │ │ │ │ │ ├── sub_page/
│ │ │ │ │ │ │ ├── block_transaction_handler.dart
│ │ │ │ │ │ │ ├── sub_page_block_component.dart
│ │ │ │ │ │ │ └── sub_page_transaction_handler.dart
│ │ │ │ │ │ ├── table/
│ │ │ │ │ │ │ ├── table_menu.dart
│ │ │ │ │ │ │ └── table_option_action.dart
│ │ │ │ │ │ ├── todo_list/
│ │ │ │ │ │ │ └── todo_list_icon.dart
│ │ │ │ │ │ ├── toggle/
│ │ │ │ │ │ │ ├── toggle_block_component.dart
│ │ │ │ │ │ │ └── toggle_block_shortcuts.dart
│ │ │ │ │ │ ├── toolbar_item/
│ │ │ │ │ │ │ ├── custom_format_toolbar_items.dart
│ │ │ │ │ │ │ ├── custom_hightlight_color_toolbar_item.dart
│ │ │ │ │ │ │ ├── custom_link_toolbar_item.dart
│ │ │ │ │ │ │ ├── custom_placeholder_toolbar_item.dart
│ │ │ │ │ │ │ ├── custom_text_align_toolbar_item.dart
│ │ │ │ │ │ │ ├── custom_text_color_toolbar_item.dart
│ │ │ │ │ │ │ ├── more_option_toolbar_item.dart
│ │ │ │ │ │ │ ├── text_heading_toolbar_item.dart
│ │ │ │ │ │ │ ├── text_suggestions_toolbar_item.dart
│ │ │ │ │ │ │ └── toolbar_id_enum.dart
│ │ │ │ │ │ ├── transaction_handler/
│ │ │ │ │ │ │ ├── block_transaction_handler.dart
│ │ │ │ │ │ │ ├── editor_transaction_handler.dart
│ │ │ │ │ │ │ ├── editor_transaction_service.dart
│ │ │ │ │ │ │ └── mention_transaction_handler.dart
│ │ │ │ │ │ ├── undo_redo/
│ │ │ │ │ │ │ └── custom_undo_redo_commands.dart
│ │ │ │ │ │ └── video/
│ │ │ │ │ │ └── video_block_component.dart
│ │ │ │ │ └── editor_style.dart
│ │ │ │ ├── emoji/
│ │ │ │ │ ├── emoji_actions_command.dart
│ │ │ │ │ ├── emoji_handler.dart
│ │ │ │ │ └── emoji_menu.dart
│ │ │ │ ├── inline_actions/
│ │ │ │ │ ├── handlers/
│ │ │ │ │ │ ├── child_page.dart
│ │ │ │ │ │ ├── date_reference.dart
│ │ │ │ │ │ ├── inline_page_reference.dart
│ │ │ │ │ │ └── reminder_reference.dart
│ │ │ │ │ ├── inline_actions_command.dart
│ │ │ │ │ ├── inline_actions_menu.dart
│ │ │ │ │ ├── inline_actions_result.dart
│ │ │ │ │ ├── inline_actions_service.dart
│ │ │ │ │ ├── service_handler.dart
│ │ │ │ │ └── widgets/
│ │ │ │ │ ├── inline_actions_handler.dart
│ │ │ │ │ └── inline_actions_menu_group.dart
│ │ │ │ ├── shared/
│ │ │ │ │ ├── callback_shortcuts.dart
│ │ │ │ │ ├── cover_type_ext.dart
│ │ │ │ │ ├── share/
│ │ │ │ │ │ ├── _shared.dart
│ │ │ │ │ │ ├── constants.dart
│ │ │ │ │ │ ├── export_tab.dart
│ │ │ │ │ │ ├── publish_color_extension.dart
│ │ │ │ │ │ ├── publish_name_generator.dart
│ │ │ │ │ │ ├── publish_tab.dart
│ │ │ │ │ │ ├── share_bloc.dart
│ │ │ │ │ │ ├── share_button.dart
│ │ │ │ │ │ ├── share_menu.dart
│ │ │ │ │ │ └── share_tab.dart
│ │ │ │ │ └── sync_indicator.dart
│ │ │ │ ├── trash/
│ │ │ │ │ ├── application/
│ │ │ │ │ │ ├── prelude.dart
│ │ │ │ │ │ ├── trash_bloc.dart
│ │ │ │ │ │ ├── trash_listener.dart
│ │ │ │ │ │ └── trash_service.dart
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── sizes.dart
│ │ │ │ │ │ ├── trash_cell.dart
│ │ │ │ │ │ └── trash_header.dart
│ │ │ │ │ ├── trash.dart
│ │ │ │ │ └── trash_page.dart
│ │ │ │ └── util.dart
│ │ │ ├── shared/
│ │ │ │ ├── af_image.dart
│ │ │ │ ├── af_role_pb_extension.dart
│ │ │ │ ├── af_user_profile_extension.dart
│ │ │ │ ├── appflowy_cache_manager.dart
│ │ │ │ ├── appflowy_network_image.dart
│ │ │ │ ├── appflowy_network_svg.dart
│ │ │ │ ├── clipboard_state.dart
│ │ │ │ ├── colors.dart
│ │ │ │ ├── conditional_listenable_builder.dart
│ │ │ │ ├── custom_image_cache_manager.dart
│ │ │ │ ├── easy_localiation_service.dart
│ │ │ │ ├── error_code/
│ │ │ │ │ └── error_code_map.dart
│ │ │ │ ├── error_page/
│ │ │ │ │ └── error_page.dart
│ │ │ │ ├── feature_flags.dart
│ │ │ │ ├── feedback_gesture_detector.dart
│ │ │ │ ├── flowy_error_page.dart
│ │ │ │ ├── flowy_gradient_colors.dart
│ │ │ │ ├── google_fonts_extension.dart
│ │ │ │ ├── icon_emoji_picker/
│ │ │ │ │ ├── colors.dart
│ │ │ │ │ ├── emoji_search_bar.dart
│ │ │ │ │ ├── emoji_skin_tone.dart
│ │ │ │ │ ├── flowy_icon_emoji_picker.dart
│ │ │ │ │ ├── icon.dart
│ │ │ │ │ ├── icon_color_picker.dart
│ │ │ │ │ ├── icon_picker.dart
│ │ │ │ │ ├── icon_search_bar.dart
│ │ │ │ │ ├── icon_uploader.dart
│ │ │ │ │ ├── recent_icons.dart
│ │ │ │ │ └── tab.dart
│ │ │ │ ├── list_extension.dart
│ │ │ │ ├── loading.dart
│ │ │ │ ├── markdown_to_document.dart
│ │ │ │ ├── patterns/
│ │ │ │ │ ├── common_patterns.dart
│ │ │ │ │ ├── date_time_patterns.dart
│ │ │ │ │ └── file_type_patterns.dart
│ │ │ │ ├── permission/
│ │ │ │ │ └── permission_checker.dart
│ │ │ │ ├── popup_menu/
│ │ │ │ │ └── appflowy_popup_menu.dart
│ │ │ │ ├── settings/
│ │ │ │ │ └── show_settings.dart
│ │ │ │ ├── text_field/
│ │ │ │ │ └── text_filed_with_metric_lines.dart
│ │ │ │ ├── time_format.dart
│ │ │ │ ├── version_checker/
│ │ │ │ │ └── version_checker.dart
│ │ │ │ └── window_title_bar.dart
│ │ │ ├── startup/
│ │ │ │ ├── deps_resolver.dart
│ │ │ │ ├── entry_point.dart
│ │ │ │ ├── launch_configuration.dart
│ │ │ │ ├── plugin/
│ │ │ │ │ ├── plugin.dart
│ │ │ │ │ └── src/
│ │ │ │ │ ├── runner.dart
│ │ │ │ │ └── sandbox.dart
│ │ │ │ ├── startup.dart
│ │ │ │ └── tasks/
│ │ │ │ ├── af_navigator_observer.dart
│ │ │ │ ├── app_widget.dart
│ │ │ │ ├── app_window_size_manager.dart
│ │ │ │ ├── appflowy_cloud_task.dart
│ │ │ │ ├── auto_update_task.dart
│ │ │ │ ├── debug_task.dart
│ │ │ │ ├── deeplink/
│ │ │ │ │ ├── deeplink_handler.dart
│ │ │ │ │ ├── expire_login_deeplink_handler.dart
│ │ │ │ │ ├── invitation_deeplink_handler.dart
│ │ │ │ │ ├── login_deeplink_handler.dart
│ │ │ │ │ ├── open_app_deeplink_handler.dart
│ │ │ │ │ └── payment_deeplink_handler.dart
│ │ │ │ ├── device_info_task.dart
│ │ │ │ ├── feature_flag_task.dart
│ │ │ │ ├── file_storage_task.dart
│ │ │ │ ├── generate_router.dart
│ │ │ │ ├── hot_key.dart
│ │ │ │ ├── load_plugin.dart
│ │ │ │ ├── localization.dart
│ │ │ │ ├── memory_leak_detector.dart
│ │ │ │ ├── platform_error_catcher.dart
│ │ │ │ ├── platform_service.dart
│ │ │ │ ├── prelude.dart
│ │ │ │ ├── recent_service_task.dart
│ │ │ │ ├── rust_sdk.dart
│ │ │ │ └── windows.dart
│ │ │ ├── user/
│ │ │ │ ├── application/
│ │ │ │ │ ├── anon_user_bloc.dart
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ ├── af_cloud_auth_service.dart
│ │ │ │ │ │ ├── af_cloud_mock_auth_service.dart
│ │ │ │ │ │ ├── auth_error.dart
│ │ │ │ │ │ ├── auth_service.dart
│ │ │ │ │ │ ├── backend_auth_service.dart
│ │ │ │ │ │ └── device_id.dart
│ │ │ │ │ ├── notification_filter/
│ │ │ │ │ │ └── notification_filter_bloc.dart
│ │ │ │ │ ├── password/
│ │ │ │ │ │ ├── password_bloc.dart
│ │ │ │ │ │ └── password_http_service.dart
│ │ │ │ │ ├── prelude.dart
│ │ │ │ │ ├── reminder/
│ │ │ │ │ │ ├── reminder_bloc.dart
│ │ │ │ │ │ ├── reminder_extension.dart
│ │ │ │ │ │ ├── reminder_listener.dart
│ │ │ │ │ │ └── reminder_service.dart
│ │ │ │ │ ├── sign_in_bloc.dart
│ │ │ │ │ ├── sign_up_bloc.dart
│ │ │ │ │ ├── splash_bloc.dart
│ │ │ │ │ ├── user_auth_listener.dart
│ │ │ │ │ ├── user_listener.dart
│ │ │ │ │ ├── user_service.dart
│ │ │ │ │ ├── user_settings_service.dart
│ │ │ │ │ └── workspace_error_bloc.dart
│ │ │ │ ├── domain/
│ │ │ │ │ └── auth_state.dart
│ │ │ │ └── presentation/
│ │ │ │ ├── anon_user.dart
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── handle_open_workspace_error.dart
│ │ │ │ │ └── helpers.dart
│ │ │ │ ├── presentation.dart
│ │ │ │ ├── router.dart
│ │ │ │ ├── screens/
│ │ │ │ │ ├── screens.dart
│ │ │ │ │ ├── sign_in_screen/
│ │ │ │ │ │ ├── desktop_sign_in_screen.dart
│ │ │ │ │ │ ├── mobile_loading_screen.dart
│ │ │ │ │ │ ├── mobile_sign_in_screen.dart
│ │ │ │ │ │ ├── sign_in_screen.dart
│ │ │ │ │ │ └── widgets/
│ │ │ │ │ │ ├── anonymous_sign_in_button/
│ │ │ │ │ │ │ └── anonymous_sign_in_button.dart
│ │ │ │ │ │ ├── anonymous_sign_in_button.dart
│ │ │ │ │ │ ├── continue_with/
│ │ │ │ │ │ │ ├── back_to_login_in_button.dart
│ │ │ │ │ │ │ ├── continue_with_button.dart
│ │ │ │ │ │ │ ├── continue_with_email.dart
│ │ │ │ │ │ │ ├── continue_with_email_and_password.dart
│ │ │ │ │ │ │ ├── continue_with_magic_link_or_passcode_page.dart
│ │ │ │ │ │ │ ├── continue_with_password.dart
│ │ │ │ │ │ │ ├── continue_with_password_page.dart
│ │ │ │ │ │ │ ├── forgot_password_page.dart
│ │ │ │ │ │ │ ├── reset_password.dart
│ │ │ │ │ │ │ ├── reset_password_page.dart
│ │ │ │ │ │ │ ├── set_new_password.dart
│ │ │ │ │ │ │ ├── title_logo.dart
│ │ │ │ │ │ │ └── verifying_button.dart
│ │ │ │ │ │ ├── logo/
│ │ │ │ │ │ │ └── logo.dart
│ │ │ │ │ │ ├── magic_link_sign_in_buttons.dart
│ │ │ │ │ │ ├── sign_in_agreement.dart
│ │ │ │ │ │ ├── sign_in_anonymous_button.dart
│ │ │ │ │ │ ├── sign_in_or_logout_button.dart
│ │ │ │ │ │ ├── switch_sign_in_sign_up_button.dart
│ │ │ │ │ │ ├── third_party_sign_in_button/
│ │ │ │ │ │ │ ├── third_party_sign_in_button.dart
│ │ │ │ │ │ │ └── third_party_sign_in_buttons.dart
│ │ │ │ │ │ └── widgets.dart
│ │ │ │ │ ├── skip_log_in_screen.dart
│ │ │ │ │ ├── splash_screen.dart
│ │ │ │ │ ├── workspace_error_screen.dart
│ │ │ │ │ └── workspace_start_screen/
│ │ │ │ │ ├── desktop_workspace_start_screen.dart
│ │ │ │ │ ├── mobile_workspace_start_screen.dart
│ │ │ │ │ └── workspace_start_screen.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── auth_form_container.dart
│ │ │ │ ├── flowy_logo_title.dart
│ │ │ │ ├── folder_widget.dart
│ │ │ │ └── widgets.dart
│ │ │ ├── util/
│ │ │ │ ├── built_in_svgs.dart
│ │ │ │ ├── color_generator/
│ │ │ │ │ └── color_generator.dart
│ │ │ │ ├── color_to_hex_string.dart
│ │ │ │ ├── debounce.dart
│ │ │ │ ├── default_extensions.dart
│ │ │ │ ├── expand_views.dart
│ │ │ │ ├── field_type_extension.dart
│ │ │ │ ├── file_extension.dart
│ │ │ │ ├── font_family_extension.dart
│ │ │ │ ├── int64_extension.dart
│ │ │ │ ├── json_print.dart
│ │ │ │ ├── levenshtein.dart
│ │ │ │ ├── navigator_context_extension.dart
│ │ │ │ ├── share_log_files.dart
│ │ │ │ ├── string_extension.dart
│ │ │ │ ├── theme_extension.dart
│ │ │ │ ├── theme_mode_extension.dart
│ │ │ │ ├── throttle.dart
│ │ │ │ ├── time.dart
│ │ │ │ └── xfile_ext.dart
│ │ │ └── workspace/
│ │ │ ├── application/
│ │ │ │ ├── action_navigation/
│ │ │ │ │ ├── action_navigation_bloc.dart
│ │ │ │ │ └── navigation_action.dart
│ │ │ │ ├── appearance_defaults.dart
│ │ │ │ ├── command_palette/
│ │ │ │ │ ├── command_palette_bloc.dart
│ │ │ │ │ ├── search_result_ext.dart
│ │ │ │ │ ├── search_result_list_bloc.dart
│ │ │ │ │ └── search_service.dart
│ │ │ │ ├── edit_panel/
│ │ │ │ │ ├── edit_context.dart
│ │ │ │ │ └── edit_panel_bloc.dart
│ │ │ │ ├── export/
│ │ │ │ │ └── document_exporter.dart
│ │ │ │ ├── favorite/
│ │ │ │ │ ├── favorite_bloc.dart
│ │ │ │ │ ├── favorite_listener.dart
│ │ │ │ │ ├── favorite_service.dart
│ │ │ │ │ └── prelude.dart
│ │ │ │ ├── home/
│ │ │ │ │ ├── home_bloc.dart
│ │ │ │ │ ├── home_setting_bloc.dart
│ │ │ │ │ └── prelude.dart
│ │ │ │ ├── menu/
│ │ │ │ │ ├── menu_user_bloc.dart
│ │ │ │ │ ├── prelude.dart
│ │ │ │ │ └── sidebar_sections_bloc.dart
│ │ │ │ ├── notification/
│ │ │ │ │ └── notification_service.dart
│ │ │ │ ├── recent/
│ │ │ │ │ ├── cached_recent_service.dart
│ │ │ │ │ ├── prelude.dart
│ │ │ │ │ ├── recent_listener.dart
│ │ │ │ │ └── recent_views_bloc.dart
│ │ │ │ ├── settings/
│ │ │ │ │ ├── ai/
│ │ │ │ │ │ ├── local_ai_bloc.dart
│ │ │ │ │ │ ├── local_ai_on_boarding_bloc.dart
│ │ │ │ │ │ ├── local_llm_listener.dart
│ │ │ │ │ │ ├── ollama_setting_bloc.dart
│ │ │ │ │ │ └── settings_ai_bloc.dart
│ │ │ │ │ ├── appearance/
│ │ │ │ │ │ ├── appearance_cubit.dart
│ │ │ │ │ │ ├── base_appearance.dart
│ │ │ │ │ │ ├── desktop_appearance.dart
│ │ │ │ │ │ └── mobile_appearance.dart
│ │ │ │ │ ├── appflowy_cloud_setting_bloc.dart
│ │ │ │ │ ├── appflowy_cloud_urls_bloc.dart
│ │ │ │ │ ├── application_data_storage.dart
│ │ │ │ │ ├── billing/
│ │ │ │ │ │ └── settings_billing_bloc.dart
│ │ │ │ │ ├── cloud_setting_bloc.dart
│ │ │ │ │ ├── cloud_setting_listener.dart
│ │ │ │ │ ├── create_file_settings_cubit.dart
│ │ │ │ │ ├── date_time/
│ │ │ │ │ │ ├── date_format_ext.dart
│ │ │ │ │ │ └── time_format_ext.dart
│ │ │ │ │ ├── file_storage/
│ │ │ │ │ │ └── file_storage_listener.dart
│ │ │ │ │ ├── notifications/
│ │ │ │ │ │ └── notification_settings_cubit.dart
│ │ │ │ │ ├── plan/
│ │ │ │ │ │ ├── settings_plan_bloc.dart
│ │ │ │ │ │ ├── workspace_subscription_ext.dart
│ │ │ │ │ │ └── workspace_usage_ext.dart
│ │ │ │ │ ├── prelude.dart
│ │ │ │ │ ├── setting_file_importer_bloc.dart
│ │ │ │ │ ├── settings_dialog_bloc.dart
│ │ │ │ │ ├── settings_file_exporter_cubit.dart
│ │ │ │ │ ├── share/
│ │ │ │ │ │ ├── export_service.dart
│ │ │ │ │ │ └── import_service.dart
│ │ │ │ │ ├── shortcuts/
│ │ │ │ │ │ ├── settings_shortcuts_cubit.dart
│ │ │ │ │ │ ├── settings_shortcuts_service.dart
│ │ │ │ │ │ └── shortcuts_model.dart
│ │ │ │ │ └── workspace/
│ │ │ │ │ └── workspace_settings_bloc.dart
│ │ │ │ ├── sidebar/
│ │ │ │ │ ├── billing/
│ │ │ │ │ │ └── sidebar_plan_bloc.dart
│ │ │ │ │ ├── folder/
│ │ │ │ │ │ └── folder_bloc.dart
│ │ │ │ │ ├── rename_view/
│ │ │ │ │ │ └── rename_view_bloc.dart
│ │ │ │ │ └── space/
│ │ │ │ │ ├── space_bloc.dart
│ │ │ │ │ └── space_search_bloc.dart
│ │ │ │ ├── subscription_success_listenable/
│ │ │ │ │ └── subscription_success_listenable.dart
│ │ │ │ ├── tabs/
│ │ │ │ │ └── tabs_bloc.dart
│ │ │ │ ├── user/
│ │ │ │ │ ├── prelude.dart
│ │ │ │ │ ├── settings_user_bloc.dart
│ │ │ │ │ └── user_workspace_bloc.dart
│ │ │ │ ├── view/
│ │ │ │ │ ├── prelude.dart
│ │ │ │ │ ├── view_bloc.dart
│ │ │ │ │ ├── view_ext.dart
│ │ │ │ │ ├── view_listener.dart
│ │ │ │ │ └── view_service.dart
│ │ │ │ ├── view_info/
│ │ │ │ │ └── view_info_bloc.dart
│ │ │ │ ├── view_title/
│ │ │ │ │ ├── view_title_bar_bloc.dart
│ │ │ │ │ └── view_title_bloc.dart
│ │ │ │ └── workspace/
│ │ │ │ ├── prelude.dart
│ │ │ │ ├── workspace_bloc.dart
│ │ │ │ ├── workspace_listener.dart
│ │ │ │ ├── workspace_sections_listener.dart
│ │ │ │ └── workspace_service.dart
│ │ │ └── presentation/
│ │ │ ├── command_palette/
│ │ │ │ ├── command_palette.dart
│ │ │ │ ├── navigation_bloc_extension.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── page_preview.dart
│ │ │ │ ├── recent_views_list.dart
│ │ │ │ ├── search_ask_ai_entrance.dart
│ │ │ │ ├── search_field.dart
│ │ │ │ ├── search_icon.dart
│ │ │ │ ├── search_recent_view_cell.dart
│ │ │ │ ├── search_result_cell.dart
│ │ │ │ ├── search_results_list.dart
│ │ │ │ └── search_summary_cell.dart
│ │ │ ├── home/
│ │ │ │ ├── af_focus_manager.dart
│ │ │ │ ├── desktop_home_screen.dart
│ │ │ │ ├── errors/
│ │ │ │ │ └── workspace_failed_screen.dart
│ │ │ │ ├── home_layout.dart
│ │ │ │ ├── home_sizes.dart
│ │ │ │ ├── home_stack.dart
│ │ │ │ ├── hotkeys.dart
│ │ │ │ ├── menu/
│ │ │ │ │ ├── menu_shared_state.dart
│ │ │ │ │ ├── sidebar/
│ │ │ │ │ │ ├── favorites/
│ │ │ │ │ │ │ ├── favorite_folder.dart
│ │ │ │ │ │ │ ├── favorite_menu.dart
│ │ │ │ │ │ │ ├── favorite_menu_bloc.dart
│ │ │ │ │ │ │ ├── favorite_more_actions.dart
│ │ │ │ │ │ │ ├── favorite_pin_action.dart
│ │ │ │ │ │ │ └── favorite_pin_bloc.dart
│ │ │ │ │ │ ├── folder/
│ │ │ │ │ │ │ ├── _folder_header.dart
│ │ │ │ │ │ │ └── _section_folder.dart
│ │ │ │ │ │ ├── footer/
│ │ │ │ │ │ │ ├── sidebar_footer.dart
│ │ │ │ │ │ │ ├── sidebar_footer_button.dart
│ │ │ │ │ │ │ ├── sidebar_toast.dart
│ │ │ │ │ │ │ └── sidebar_upgrade_application_button.dart
│ │ │ │ │ │ ├── header/
│ │ │ │ │ │ │ ├── sidebar_top_menu.dart
│ │ │ │ │ │ │ └── sidebar_user.dart
│ │ │ │ │ │ ├── import/
│ │ │ │ │ │ │ ├── import_panel.dart
│ │ │ │ │ │ │ └── import_type.dart
│ │ │ │ │ │ ├── move_to/
│ │ │ │ │ │ │ └── move_page_menu.dart
│ │ │ │ │ │ ├── shared/
│ │ │ │ │ │ │ ├── sidebar_folder.dart
│ │ │ │ │ │ │ ├── sidebar_new_page_button.dart
│ │ │ │ │ │ │ └── sidebar_setting.dart
│ │ │ │ │ │ ├── sidebar.dart
│ │ │ │ │ │ ├── slider_menu_hover_trigger.dart
│ │ │ │ │ │ ├── space/
│ │ │ │ │ │ │ ├── _extension.dart
│ │ │ │ │ │ │ ├── create_space_popup.dart
│ │ │ │ │ │ │ ├── manage_space_popup.dart
│ │ │ │ │ │ │ ├── shared_widget.dart
│ │ │ │ │ │ │ ├── sidebar_space.dart
│ │ │ │ │ │ │ ├── sidebar_space_header.dart
│ │ │ │ │ │ │ ├── sidebar_space_menu.dart
│ │ │ │ │ │ │ ├── space_action_type.dart
│ │ │ │ │ │ │ ├── space_icon.dart
│ │ │ │ │ │ │ ├── space_icon_popup.dart
│ │ │ │ │ │ │ ├── space_migration.dart
│ │ │ │ │ │ │ └── space_more_popup.dart
│ │ │ │ │ │ └── workspace/
│ │ │ │ │ │ ├── _sidebar_import_notion.dart
│ │ │ │ │ │ ├── _sidebar_workspace_actions.dart
│ │ │ │ │ │ ├── _sidebar_workspace_icon.dart
│ │ │ │ │ │ ├── _sidebar_workspace_menu.dart
│ │ │ │ │ │ ├── sidebar_workspace.dart
│ │ │ │ │ │ └── workspace_notifier.dart
│ │ │ │ │ └── view/
│ │ │ │ │ ├── draggable_view_item.dart
│ │ │ │ │ ├── view_action_type.dart
│ │ │ │ │ ├── view_add_button.dart
│ │ │ │ │ ├── view_item.dart
│ │ │ │ │ └── view_more_action_button.dart
│ │ │ │ ├── navigation.dart
│ │ │ │ ├── tabs/
│ │ │ │ │ ├── flowy_tab.dart
│ │ │ │ │ └── tabs_manager.dart
│ │ │ │ └── toast.dart
│ │ │ ├── notifications/
│ │ │ │ ├── notification_panel.dart
│ │ │ │ ├── number_red_dot.dart
│ │ │ │ ├── reminder_extension.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── flowy_tab.dart
│ │ │ │ ├── inbox_action_bar.dart
│ │ │ │ ├── notification_button.dart
│ │ │ │ ├── notification_content_v2.dart
│ │ │ │ ├── notification_hub_title.dart
│ │ │ │ ├── notification_item.dart
│ │ │ │ ├── notification_item_v2.dart
│ │ │ │ ├── notification_tab.dart
│ │ │ │ ├── notification_tab_bar.dart
│ │ │ │ ├── notification_view.dart
│ │ │ │ └── notifications_hub_empty.dart
│ │ │ ├── settings/
│ │ │ │ ├── pages/
│ │ │ │ │ ├── about/
│ │ │ │ │ │ └── app_version.dart
│ │ │ │ │ ├── account/
│ │ │ │ │ │ ├── account.dart
│ │ │ │ │ │ ├── account_deletion.dart
│ │ │ │ │ │ ├── account_sign_in_out.dart
│ │ │ │ │ │ ├── account_user_profile.dart
│ │ │ │ │ │ ├── email/
│ │ │ │ │ │ │ └── email_section.dart
│ │ │ │ │ │ └── password/
│ │ │ │ │ │ ├── change_password.dart
│ │ │ │ │ │ ├── error_extensions.dart
│ │ │ │ │ │ ├── password_suffix_icon.dart
│ │ │ │ │ │ └── setup_password.dart
│ │ │ │ │ ├── fix_data_widget.dart
│ │ │ │ │ ├── setting_ai_view/
│ │ │ │ │ │ ├── local_ai_setting.dart
│ │ │ │ │ │ ├── local_settings_ai_view.dart
│ │ │ │ │ │ ├── model_selection.dart
│ │ │ │ │ │ ├── ollama_setting.dart
│ │ │ │ │ │ ├── plugin_status_indicator.dart
│ │ │ │ │ │ └── settings_ai_view.dart
│ │ │ │ │ ├── settings_account_view.dart
│ │ │ │ │ ├── settings_billing_view.dart
│ │ │ │ │ ├── settings_manage_data_view.dart
│ │ │ │ │ ├── settings_plan_comparison_dialog.dart
│ │ │ │ │ ├── settings_plan_view.dart
│ │ │ │ │ ├── settings_shortcuts_view.dart
│ │ │ │ │ ├── settings_workspace_view.dart
│ │ │ │ │ └── sites/
│ │ │ │ │ ├── constants.dart
│ │ │ │ │ ├── domain/
│ │ │ │ │ │ ├── domain_header.dart
│ │ │ │ │ │ ├── domain_item.dart
│ │ │ │ │ │ ├── domain_more_action.dart
│ │ │ │ │ │ ├── domain_settings_dialog.dart
│ │ │ │ │ │ └── home_page_menu.dart
│ │ │ │ │ ├── publish_info_view_item.dart
│ │ │ │ │ ├── published_page/
│ │ │ │ │ │ ├── published_view_item.dart
│ │ │ │ │ │ ├── published_view_item_header.dart
│ │ │ │ │ │ ├── published_view_more_action.dart
│ │ │ │ │ │ └── published_view_settings_dialog.dart
│ │ │ │ │ ├── settings_sites_bloc.dart
│ │ │ │ │ └── settings_sites_view.dart
│ │ │ │ ├── settings_dialog.dart
│ │ │ │ ├── shared/
│ │ │ │ │ ├── af_dropdown_menu_entry.dart
│ │ │ │ │ ├── document_color_setting_button.dart
│ │ │ │ │ ├── flowy_gradient_button.dart
│ │ │ │ │ ├── setting_action.dart
│ │ │ │ │ ├── setting_list_tile.dart
│ │ │ │ │ ├── setting_value_dropdown.dart
│ │ │ │ │ ├── settings_actionable_input.dart
│ │ │ │ │ ├── settings_alert_dialog.dart
│ │ │ │ │ ├── settings_body.dart
│ │ │ │ │ ├── settings_category.dart
│ │ │ │ │ ├── settings_category_spacer.dart
│ │ │ │ │ ├── settings_dashed_divider.dart
│ │ │ │ │ ├── settings_dropdown.dart
│ │ │ │ │ ├── settings_header.dart
│ │ │ │ │ ├── settings_input_field.dart
│ │ │ │ │ ├── settings_radio_select.dart
│ │ │ │ │ ├── settings_subcategory.dart
│ │ │ │ │ └── single_setting_action.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── _restart_app_button.dart
│ │ │ │ ├── cancel_plan_survey_dialog.dart
│ │ │ │ ├── emoji_picker/
│ │ │ │ │ ├── emoji_picker.dart
│ │ │ │ │ ├── emoji_shortcut_event.dart
│ │ │ │ │ └── src/
│ │ │ │ │ ├── default_emoji_picker_view.dart
│ │ │ │ │ ├── emji_picker_config.dart
│ │ │ │ │ ├── emoji_lists.dart
│ │ │ │ │ ├── emoji_picker.dart
│ │ │ │ │ ├── emoji_picker_builder.dart
│ │ │ │ │ ├── emoji_view_state.dart
│ │ │ │ │ ├── flowy_emoji_picker_config.dart
│ │ │ │ │ └── models/
│ │ │ │ │ ├── emoji_category_models.dart
│ │ │ │ │ ├── emoji_model.dart
│ │ │ │ │ └── recent_emoji_model.dart
│ │ │ │ ├── feature_flags/
│ │ │ │ │ ├── feature_flag_page.dart
│ │ │ │ │ └── mobile_feature_flag_screen.dart
│ │ │ │ ├── files/
│ │ │ │ │ ├── settings_export_file_widget.dart
│ │ │ │ │ └── settings_file_exporter_widget.dart
│ │ │ │ ├── members/
│ │ │ │ │ ├── invitation/
│ │ │ │ │ │ ├── invite_member_by_email.dart
│ │ │ │ │ │ ├── invite_member_by_link.dart
│ │ │ │ │ │ ├── m_invite_member_by_email.dart
│ │ │ │ │ │ ├── m_invite_member_by_link.dart
│ │ │ │ │ │ └── member_http_service.dart
│ │ │ │ │ ├── workspace_member_bloc.dart
│ │ │ │ │ └── workspace_member_page.dart
│ │ │ │ ├── setting_appflowy_cloud.dart
│ │ │ │ ├── setting_cloud.dart
│ │ │ │ ├── setting_local_cloud.dart
│ │ │ │ ├── setting_third_party_login.dart
│ │ │ │ ├── settings_menu.dart
│ │ │ │ ├── settings_menu_element.dart
│ │ │ │ ├── settings_notifications_view.dart
│ │ │ │ ├── theme_upload/
│ │ │ │ │ ├── theme_confirm_delete_dialog.dart
│ │ │ │ │ ├── theme_upload.dart
│ │ │ │ │ ├── theme_upload_button.dart
│ │ │ │ │ ├── theme_upload_decoration.dart
│ │ │ │ │ ├── theme_upload_failure_widget.dart
│ │ │ │ │ ├── theme_upload_learn_more_button.dart
│ │ │ │ │ ├── theme_upload_loading_widget.dart
│ │ │ │ │ ├── theme_upload_view.dart
│ │ │ │ │ └── upload_new_theme_widget.dart
│ │ │ │ ├── utils/
│ │ │ │ │ ├── form_factor.dart
│ │ │ │ │ └── hex_opacity_string_extension.dart
│ │ │ │ └── web_url_hint_widget.dart
│ │ │ └── widgets/
│ │ │ ├── date_picker/
│ │ │ │ ├── appflowy_date_picker_base.dart
│ │ │ │ ├── desktop_date_picker.dart
│ │ │ │ ├── mobile_date_picker.dart
│ │ │ │ ├── utils/
│ │ │ │ │ ├── date_time_format_ext.dart
│ │ │ │ │ ├── layout.dart
│ │ │ │ │ └── user_time_format_ext.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── clear_date_button.dart
│ │ │ │ ├── date_picker.dart
│ │ │ │ ├── date_picker_dialog.dart
│ │ │ │ ├── date_time_settings.dart
│ │ │ │ ├── date_time_text_field.dart
│ │ │ │ ├── date_type_option_button.dart
│ │ │ │ ├── end_time_button.dart
│ │ │ │ ├── mobile_date_editor.dart
│ │ │ │ ├── mobile_date_header.dart
│ │ │ │ └── reminder_selector.dart
│ │ │ ├── dialog_v2.dart
│ │ │ ├── dialogs.dart
│ │ │ ├── draggable_item/
│ │ │ │ └── draggable_item.dart
│ │ │ ├── edit_panel/
│ │ │ │ ├── edit_panel.dart
│ │ │ │ └── panel_animation.dart
│ │ │ ├── favorite_button.dart
│ │ │ ├── float_bubble/
│ │ │ │ ├── question_bubble.dart
│ │ │ │ ├── social_media_section.dart
│ │ │ │ └── version_section.dart
│ │ │ ├── image_viewer/
│ │ │ │ ├── image_provider.dart
│ │ │ │ ├── interactive_image_toolbar.dart
│ │ │ │ └── interactive_image_viewer.dart
│ │ │ ├── more_view_actions/
│ │ │ │ ├── more_view_actions.dart
│ │ │ │ └── widgets/
│ │ │ │ ├── common_view_action.dart
│ │ │ │ ├── font_size_action.dart
│ │ │ │ ├── font_size_stepper.dart
│ │ │ │ ├── lock_page_action.dart
│ │ │ │ └── view_meta_info.dart
│ │ │ ├── pop_up_action.dart
│ │ │ ├── rename_view_popover.dart
│ │ │ ├── sidebar_resizer.dart
│ │ │ ├── tab_bar_item.dart
│ │ │ ├── toggle/
│ │ │ │ └── toggle.dart
│ │ │ ├── user_avatar.dart
│ │ │ └── view_title_bar.dart
│ │ ├── linux/
│ │ │ ├── .gitignore
│ │ │ ├── CMakeLists.txt
│ │ │ ├── flutter/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ └── dart_ffi/
│ │ │ │ └── binding.h
│ │ │ ├── main.cc
│ │ │ ├── my_application.cc
│ │ │ ├── my_application.h
│ │ │ └── packaging/
│ │ │ ├── deb/
│ │ │ │ └── make_config.yaml
│ │ │ └── rpm/
│ │ │ └── make_config.yaml
│ │ ├── macos/
│ │ │ ├── .gitignore
│ │ │ ├── Flutter/
│ │ │ │ ├── Flutter-Debug.xcconfig
│ │ │ │ └── Flutter-Release.xcconfig
│ │ │ ├── Podfile
│ │ │ ├── Runner/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── Configs/
│ │ │ │ │ ├── AppInfo.xcconfig
│ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ ├── Release.xcconfig
│ │ │ │ │ └── Warnings.xcconfig
│ │ │ │ ├── DebugProfile.entitlements
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MainFlutterWindow.swift
│ │ │ │ └── Release.entitlements
│ │ │ ├── Runner.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── Runner.xcscheme
│ │ │ ├── Runner.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── build/
│ │ │ └── ios/
│ │ │ └── XCBuildData/
│ │ │ └── PIFCache/
│ │ │ ├── project/
│ │ │ │ └── PROJECT@v11_mod=a7fbf46937053896f73cc7c7ec6baefb_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json
│ │ │ └── workspace/
│ │ │ └── WORKSPACE@v11_hash=(null)_subobjects=9b6915bad2214bcc5eb58b855fe7b55a-json
│ │ ├── packages/
│ │ │ ├── appflowy_backend/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .metadata
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── analysis_options.yaml
│ │ │ │ ├── android/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── build.gradle
│ │ │ │ │ ├── gradle/
│ │ │ │ │ │ └── wrapper/
│ │ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ │ ├── gradle.properties
│ │ │ │ │ ├── settings.gradle
│ │ │ │ │ └── src/
│ │ │ │ │ └── main/
│ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ └── kotlin/
│ │ │ │ │ └── com/
│ │ │ │ │ └── plugin/
│ │ │ │ │ └── appflowy_backend/
│ │ │ │ │ └── AppFlowyBackendPlugin.kt
│ │ │ │ ├── example/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .metadata
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── analysis_options.yaml
│ │ │ │ │ ├── android/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── app/
│ │ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ ├── debug/
│ │ │ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ │ │ │ ├── kotlin/
│ │ │ │ │ │ │ │ │ └── com/
│ │ │ │ │ │ │ │ │ └── plugin/
│ │ │ │ │ │ │ │ │ └── flowy_sdk_example/
│ │ │ │ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ │ │ │ └── res/
│ │ │ │ │ │ │ │ ├── drawable/
│ │ │ │ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ │ │ │ ├── drawable-v21/
│ │ │ │ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ │ │ │ ├── values/
│ │ │ │ │ │ │ │ │ └── styles.xml
│ │ │ │ │ │ │ │ └── values-night/
│ │ │ │ │ │ │ │ └── styles.xml
│ │ │ │ │ │ │ └── profile/
│ │ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ ├── gradle/
│ │ │ │ │ │ │ └── wrapper/
│ │ │ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ │ │ ├── gradle.properties
│ │ │ │ │ │ └── settings.gradle
│ │ │ │ │ ├── integration_test/
│ │ │ │ │ │ ├── app_test.dart
│ │ │ │ │ │ └── driver.dart
│ │ │ │ │ ├── ios/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── AppFrameworkInfo.plist
│ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ └── Release.xcconfig
│ │ │ │ │ │ ├── Podfile
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ └── LaunchImage.imageset/
│ │ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ │ └── README.md
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ └── Runner-Bridging-Header.h
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ └── Runner.xcworkspace/
│ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ └── main.dart
│ │ │ │ │ ├── macos/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig
│ │ │ │ │ │ │ └── Flutter-Release.xcconfig
│ │ │ │ │ │ ├── Podfile
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ │ │ ├── Configs/
│ │ │ │ │ │ │ │ ├── AppInfo.xcconfig
│ │ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ │ ├── Release.xcconfig
│ │ │ │ │ │ │ │ └── Warnings.xcconfig
│ │ │ │ │ │ │ ├── DebugProfile.entitlements
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ ├── MainFlutterWindow.swift
│ │ │ │ │ │ │ └── Release.entitlements
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ └── Runner.xcworkspace/
│ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ ├── test/
│ │ │ │ │ │ └── widget_test.dart
│ │ │ │ │ └── windows/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── flutter/
│ │ │ │ │ │ └── CMakeLists.txt
│ │ │ │ │ └── runner/
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── Runner.rc
│ │ │ │ │ ├── flutter_window.cpp
│ │ │ │ │ ├── flutter_window.h
│ │ │ │ │ ├── main.cpp
│ │ │ │ │ ├── resource.h
│ │ │ │ │ ├── runner.exe.manifest
│ │ │ │ │ ├── utils.cpp
│ │ │ │ │ ├── utils.h
│ │ │ │ │ ├── win32_window.cpp
│ │ │ │ │ └── win32_window.h
│ │ │ │ ├── ios/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Assets/
│ │ │ │ │ │ └── .gitkeep
│ │ │ │ │ ├── Classes/
│ │ │ │ │ │ ├── AppFlowyBackendPlugin.h
│ │ │ │ │ │ ├── AppFlowyBackendPlugin.m
│ │ │ │ │ │ ├── AppFlowyBackendPlugin.swift
│ │ │ │ │ │ └── binding.h
│ │ │ │ │ └── appflowy_backend.podspec
│ │ │ │ ├── lib/
│ │ │ │ │ ├── appflowy_backend.dart
│ │ │ │ │ ├── appflowy_backend_method_channel.dart
│ │ │ │ │ ├── appflowy_backend_platform_interface.dart
│ │ │ │ │ ├── dispatch/
│ │ │ │ │ │ ├── dispatch.dart
│ │ │ │ │ │ └── error.dart
│ │ │ │ │ ├── ffi.dart
│ │ │ │ │ ├── log.dart
│ │ │ │ │ └── rust_stream.dart
│ │ │ │ ├── linux/
│ │ │ │ │ └── Classes/
│ │ │ │ │ └── binding.h
│ │ │ │ ├── macos/
│ │ │ │ │ ├── Classes/
│ │ │ │ │ │ ├── AppFlowyBackendPlugin.swift
│ │ │ │ │ │ └── binding.h
│ │ │ │ │ └── appflowy_backend.podspec
│ │ │ │ ├── pubspec.yaml
│ │ │ │ ├── test/
│ │ │ │ │ ├── appflowy_backend_method_channel_test.dart
│ │ │ │ │ └── appflowy_backend_test.dart
│ │ │ │ └── windows/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── app_flowy_backend_plugin.h
│ │ │ │ ├── appflowy_backend_plugin.cpp
│ │ │ │ ├── appflowy_backend_plugin_c_api.cpp
│ │ │ │ └── include/
│ │ │ │ └── appflowy_backend/
│ │ │ │ ├── app_flowy_backend_plugin.h
│ │ │ │ └── appflowy_backend_plugin_c_api.h
│ │ │ ├── appflowy_popover/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .metadata
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── analysis_options.yaml
│ │ │ │ ├── example/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .metadata
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── analysis_options.yaml
│ │ │ │ │ ├── android/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── app/
│ │ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ ├── debug/
│ │ │ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ │ │ │ ├── kotlin/
│ │ │ │ │ │ │ │ │ └── com/
│ │ │ │ │ │ │ │ │ └── example/
│ │ │ │ │ │ │ │ │ └── example/
│ │ │ │ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ │ │ │ └── res/
│ │ │ │ │ │ │ │ ├── drawable/
│ │ │ │ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ │ │ │ ├── drawable-v21/
│ │ │ │ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ │ │ │ ├── values/
│ │ │ │ │ │ │ │ │ └── styles.xml
│ │ │ │ │ │ │ │ └── values-night/
│ │ │ │ │ │ │ │ └── styles.xml
│ │ │ │ │ │ │ └── profile/
│ │ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ ├── gradle/
│ │ │ │ │ │ │ └── wrapper/
│ │ │ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ │ │ ├── gradle.properties
│ │ │ │ │ │ └── settings.gradle
│ │ │ │ │ ├── ios/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── AppFrameworkInfo.plist
│ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ └── Release.xcconfig
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ └── LaunchImage.imageset/
│ │ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ │ └── README.md
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ └── Runner-Bridging-Header.h
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ └── Runner.xcworkspace/
│ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ ├── example_button.dart
│ │ │ │ │ │ └── main.dart
│ │ │ │ │ ├── linux/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ │ ├── flutter/
│ │ │ │ │ │ │ └── CMakeLists.txt
│ │ │ │ │ │ ├── main.cc
│ │ │ │ │ │ ├── my_application.cc
│ │ │ │ │ │ └── my_application.h
│ │ │ │ │ ├── macos/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig
│ │ │ │ │ │ │ └── Flutter-Release.xcconfig
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ │ │ ├── Configs/
│ │ │ │ │ │ │ │ ├── AppInfo.xcconfig
│ │ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ │ ├── Release.xcconfig
│ │ │ │ │ │ │ │ └── Warnings.xcconfig
│ │ │ │ │ │ │ ├── DebugProfile.entitlements
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ ├── MainFlutterWindow.swift
│ │ │ │ │ │ │ └── Release.entitlements
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ └── Runner.xcworkspace/
│ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ ├── web/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── manifest.json
│ │ │ │ │ └── windows/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── flutter/
│ │ │ │ │ │ └── CMakeLists.txt
│ │ │ │ │ └── runner/
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── Runner.rc
│ │ │ │ │ ├── flutter_window.cpp
│ │ │ │ │ ├── flutter_window.h
│ │ │ │ │ ├── main.cpp
│ │ │ │ │ ├── resource.h
│ │ │ │ │ ├── runner.exe.manifest
│ │ │ │ │ ├── utils.cpp
│ │ │ │ │ ├── utils.h
│ │ │ │ │ ├── win32_window.cpp
│ │ │ │ │ └── win32_window.h
│ │ │ │ ├── lib/
│ │ │ │ │ ├── appflowy_popover.dart
│ │ │ │ │ └── src/
│ │ │ │ │ ├── follower.dart
│ │ │ │ │ ├── layout.dart
│ │ │ │ │ ├── mask.dart
│ │ │ │ │ ├── mutex.dart
│ │ │ │ │ └── popover.dart
│ │ │ │ ├── pubspec.yaml
│ │ │ │ └── test/
│ │ │ │ └── popover_test.dart
│ │ │ ├── appflowy_result/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .metadata
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── analysis_options.yaml
│ │ │ │ ├── lib/
│ │ │ │ │ ├── appflowy_result.dart
│ │ │ │ │ └── src/
│ │ │ │ │ ├── async_result.dart
│ │ │ │ │ └── result.dart
│ │ │ │ └── pubspec.yaml
│ │ │ ├── appflowy_ui/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .metadata
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── analysis_options.yaml
│ │ │ │ ├── example/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .metadata
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── analysis_options.yaml
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ ├── main.dart
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── avatar/
│ │ │ │ │ │ │ └── avatar_page.dart
│ │ │ │ │ │ ├── buttons/
│ │ │ │ │ │ │ └── buttons_page.dart
│ │ │ │ │ │ ├── dropdown_menu/
│ │ │ │ │ │ │ └── dropdown_menu_page.dart
│ │ │ │ │ │ ├── menu/
│ │ │ │ │ │ │ └── menu_page.dart
│ │ │ │ │ │ ├── modal/
│ │ │ │ │ │ │ └── modal_page.dart
│ │ │ │ │ │ └── textfield/
│ │ │ │ │ │ └── textfield_page.dart
│ │ │ │ │ ├── macos/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig
│ │ │ │ │ │ │ └── Flutter-Release.xcconfig
│ │ │ │ │ │ ├── Podfile
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ │ │ ├── Configs/
│ │ │ │ │ │ │ │ ├── AppInfo.xcconfig
│ │ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ │ ├── Release.xcconfig
│ │ │ │ │ │ │ │ └── Warnings.xcconfig
│ │ │ │ │ │ │ ├── DebugProfile.entitlements
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ ├── MainFlutterWindow.swift
│ │ │ │ │ │ │ └── Release.entitlements
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ ├── Runner.xcworkspace/
│ │ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ │ └── RunnerTests/
│ │ │ │ │ │ └── RunnerTests.swift
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ └── test/
│ │ │ │ │ └── widget_test.dart
│ │ │ │ ├── lib/
│ │ │ │ │ ├── appflowy_ui.dart
│ │ │ │ │ └── src/
│ │ │ │ │ ├── component/
│ │ │ │ │ │ ├── avatar/
│ │ │ │ │ │ │ └── avatar.dart
│ │ │ │ │ │ ├── button/
│ │ │ │ │ │ │ ├── base_button/
│ │ │ │ │ │ │ │ ├── base.dart
│ │ │ │ │ │ │ │ ├── base_button.dart
│ │ │ │ │ │ │ │ └── base_text_button.dart
│ │ │ │ │ │ │ ├── button.dart
│ │ │ │ │ │ │ ├── filled_button/
│ │ │ │ │ │ │ │ ├── filled_button.dart
│ │ │ │ │ │ │ │ ├── filled_icon_text_button.dart
│ │ │ │ │ │ │ │ └── filled_text_button.dart
│ │ │ │ │ │ │ ├── ghost_button/
│ │ │ │ │ │ │ │ ├── ghost_button.dart
│ │ │ │ │ │ │ │ ├── ghost_icon_text_button.dart
│ │ │ │ │ │ │ │ └── ghost_text_button.dart
│ │ │ │ │ │ │ └── outlined_button/
│ │ │ │ │ │ │ ├── outlined_button.dart
│ │ │ │ │ │ │ ├── outlined_icon_text_button.dart
│ │ │ │ │ │ │ └── outlined_text_button.dart
│ │ │ │ │ │ ├── component.dart
│ │ │ │ │ │ ├── dropdown_menu/
│ │ │ │ │ │ │ └── dropdown_menu.dart
│ │ │ │ │ │ ├── menu/
│ │ │ │ │ │ │ ├── menu.dart
│ │ │ │ │ │ │ ├── menu_item.dart
│ │ │ │ │ │ │ ├── section.dart
│ │ │ │ │ │ │ └── text_menu_item.dart
│ │ │ │ │ │ ├── modal/
│ │ │ │ │ │ │ ├── dimension.dart
│ │ │ │ │ │ │ └── modal.dart
│ │ │ │ │ │ ├── popover/
│ │ │ │ │ │ │ ├── anchor.dart
│ │ │ │ │ │ │ ├── popover.dart
│ │ │ │ │ │ │ └── shadcn/
│ │ │ │ │ │ │ ├── _mouse_area.dart
│ │ │ │ │ │ │ └── _portal.dart
│ │ │ │ │ │ ├── separator/
│ │ │ │ │ │ │ └── divider.dart
│ │ │ │ │ │ └── textfield/
│ │ │ │ │ │ └── textfield.dart
│ │ │ │ │ └── theme/
│ │ │ │ │ ├── appflowy_theme.dart
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── appflowy_default/
│ │ │ │ │ │ │ ├── primitive.dart
│ │ │ │ │ │ │ └── semantic.dart
│ │ │ │ │ │ ├── built_in_themes.dart
│ │ │ │ │ │ ├── custom/
│ │ │ │ │ │ │ └── custom_theme.dart
│ │ │ │ │ │ └── shared.dart
│ │ │ │ │ ├── definition/
│ │ │ │ │ │ ├── border_radius/
│ │ │ │ │ │ │ └── border_radius.dart
│ │ │ │ │ │ ├── color_scheme/
│ │ │ │ │ │ │ ├── background_color_scheme.dart
│ │ │ │ │ │ │ ├── badge_color_scheme.dart
│ │ │ │ │ │ │ ├── border_color_scheme.dart
│ │ │ │ │ │ │ ├── brand_color_scheme.dart
│ │ │ │ │ │ │ ├── color_scheme.dart
│ │ │ │ │ │ │ ├── fill_color_scheme.dart
│ │ │ │ │ │ │ ├── icon_color_scheme.dart
│ │ │ │ │ │ │ ├── other_color_scheme.dart
│ │ │ │ │ │ │ ├── surface_color_scheme.dart
│ │ │ │ │ │ │ ├── surface_container_color_scheme.dart
│ │ │ │ │ │ │ └── text_color_scheme.dart
│ │ │ │ │ │ ├── shadow/
│ │ │ │ │ │ │ └── shadow.dart
│ │ │ │ │ │ ├── spacing/
│ │ │ │ │ │ │ └── spacing.dart
│ │ │ │ │ │ ├── text_style/
│ │ │ │ │ │ │ ├── base/
│ │ │ │ │ │ │ │ └── default_text_style.dart
│ │ │ │ │ │ │ └── text_style.dart
│ │ │ │ │ │ └── theme_data.dart
│ │ │ │ │ └── theme.dart
│ │ │ │ ├── pubspec.yaml
│ │ │ │ └── script/
│ │ │ │ ├── Primitive.Mode 1.tokens.json
│ │ │ │ ├── Semantic.Dark Mode.tokens.json
│ │ │ │ ├── Semantic.Light Mode.tokens.json
│ │ │ │ └── generate_theme.dart
│ │ │ ├── flowy_infra/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .metadata
│ │ │ │ ├── LICENSE
│ │ │ │ ├── analysis_options.yaml
│ │ │ │ ├── lib/
│ │ │ │ │ ├── colorscheme/
│ │ │ │ │ │ ├── colorscheme.dart
│ │ │ │ │ │ ├── dandelion.dart
│ │ │ │ │ │ ├── default_colorscheme.dart
│ │ │ │ │ │ ├── lavender.dart
│ │ │ │ │ │ └── lemonade.dart
│ │ │ │ │ ├── file_picker/
│ │ │ │ │ │ ├── file_picker_impl.dart
│ │ │ │ │ │ └── file_picker_service.dart
│ │ │ │ │ ├── icon_data.dart
│ │ │ │ │ ├── language.dart
│ │ │ │ │ ├── notifier.dart
│ │ │ │ │ ├── platform_extension.dart
│ │ │ │ │ ├── plugins/
│ │ │ │ │ │ ├── bloc/
│ │ │ │ │ │ │ ├── dynamic_plugin_bloc.dart
│ │ │ │ │ │ │ ├── dynamic_plugin_event.dart
│ │ │ │ │ │ │ └── dynamic_plugin_state.dart
│ │ │ │ │ │ └── service/
│ │ │ │ │ │ ├── location_service.dart
│ │ │ │ │ │ ├── models/
│ │ │ │ │ │ │ ├── exceptions.dart
│ │ │ │ │ │ │ ├── flowy_dynamic_plugin.dart
│ │ │ │ │ │ │ └── plugin_type.dart
│ │ │ │ │ │ └── plugin_service.dart
│ │ │ │ │ ├── size.dart
│ │ │ │ │ ├── theme.dart
│ │ │ │ │ ├── theme_extension.dart
│ │ │ │ │ ├── time/
│ │ │ │ │ │ ├── duration.dart
│ │ │ │ │ │ └── prelude.dart
│ │ │ │ │ ├── utils/
│ │ │ │ │ │ └── color_converter.dart
│ │ │ │ │ └── uuid.dart
│ │ │ │ └── pubspec.yaml
│ │ │ ├── flowy_infra_ui/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .metadata
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── analysis_options.yaml
│ │ │ │ ├── android/
│ │ │ │ │ ├── .classpath
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .project
│ │ │ │ │ ├── .settings/
│ │ │ │ │ │ └── org.eclipse.buildship.core.prefs
│ │ │ │ │ ├── build.gradle
│ │ │ │ │ ├── gradle/
│ │ │ │ │ │ └── wrapper/
│ │ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ │ ├── gradle.properties
│ │ │ │ │ ├── settings.gradle
│ │ │ │ │ └── src/
│ │ │ │ │ └── main/
│ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── com/
│ │ │ │ │ │ └── example/
│ │ │ │ │ │ └── flowy_infra_ui/
│ │ │ │ │ │ ├── FlowyInfraUIPlugin.java
│ │ │ │ │ │ └── event/
│ │ │ │ │ │ └── KeyboardEventHandler.java
│ │ │ │ │ └── kotlin/
│ │ │ │ │ └── com/
│ │ │ │ │ └── example/
│ │ │ │ │ └── flowy_infra_ui/
│ │ │ │ │ └── FlowyInfraUiPlugin.kt
│ │ │ │ ├── example/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .metadata
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── analysis_options.yaml
│ │ │ │ │ ├── android/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── .project
│ │ │ │ │ │ ├── .settings/
│ │ │ │ │ │ │ └── org.eclipse.buildship.core.prefs
│ │ │ │ │ │ ├── app/
│ │ │ │ │ │ │ ├── .classpath
│ │ │ │ │ │ │ ├── .project
│ │ │ │ │ │ │ ├── .settings/
│ │ │ │ │ │ │ │ └── org.eclipse.buildship.core.prefs
│ │ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ ├── debug/
│ │ │ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ │ │ │ ├── kotlin/
│ │ │ │ │ │ │ │ │ └── com/
│ │ │ │ │ │ │ │ │ └── example/
│ │ │ │ │ │ │ │ │ ├── example/
│ │ │ │ │ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ │ │ │ │ └── flowy_infra_ui_example/
│ │ │ │ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ │ │ │ └── res/
│ │ │ │ │ │ │ │ ├── drawable/
│ │ │ │ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ │ │ │ ├── drawable-v21/
│ │ │ │ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ │ │ │ ├── values/
│ │ │ │ │ │ │ │ │ └── styles.xml
│ │ │ │ │ │ │ │ └── values-night/
│ │ │ │ │ │ │ │ └── styles.xml
│ │ │ │ │ │ │ └── profile/
│ │ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ ├── gradle/
│ │ │ │ │ │ │ └── wrapper/
│ │ │ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ │ │ ├── gradle.properties
│ │ │ │ │ │ └── settings.gradle
│ │ │ │ │ ├── example/
│ │ │ │ │ │ └── android/
│ │ │ │ │ │ └── app/
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ └── main/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── com/
│ │ │ │ │ │ └── example/
│ │ │ │ │ │ └── flowy_infra_ui_example/
│ │ │ │ │ │ └── FlutterActivity.java
│ │ │ │ │ ├── ios/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── AppFrameworkInfo.plist
│ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ └── Release.xcconfig
│ │ │ │ │ │ ├── Podfile
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ └── LaunchImage.imageset/
│ │ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ │ └── README.md
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ └── Runner-Bridging-Header.h
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ └── Runner.xcworkspace/
│ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ ├── home/
│ │ │ │ │ │ │ ├── demo_item.dart
│ │ │ │ │ │ │ └── home_screen.dart
│ │ │ │ │ │ ├── keyboard/
│ │ │ │ │ │ │ └── keyboard_screen.dart
│ │ │ │ │ │ ├── main.dart
│ │ │ │ │ │ └── overlay/
│ │ │ │ │ │ └── overlay_screen.dart
│ │ │ │ │ ├── linux/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ │ ├── flutter/
│ │ │ │ │ │ │ └── CMakeLists.txt
│ │ │ │ │ │ ├── main.cc
│ │ │ │ │ │ ├── my_application.cc
│ │ │ │ │ │ └── my_application.h
│ │ │ │ │ ├── macos/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Flutter/
│ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig
│ │ │ │ │ │ │ └── Flutter-Release.xcconfig
│ │ │ │ │ │ ├── Podfile
│ │ │ │ │ │ ├── Runner/
│ │ │ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ ├── Base.lproj/
│ │ │ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ │ │ ├── Configs/
│ │ │ │ │ │ │ │ ├── AppInfo.xcconfig
│ │ │ │ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ │ │ │ ├── Release.xcconfig
│ │ │ │ │ │ │ │ └── Warnings.xcconfig
│ │ │ │ │ │ │ ├── DebugProfile.entitlements
│ │ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ │ ├── MainFlutterWindow.swift
│ │ │ │ │ │ │ └── Release.entitlements
│ │ │ │ │ │ ├── Runner.xcodeproj/
│ │ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ │ └── Runner.xcscheme
│ │ │ │ │ │ └── Runner.xcworkspace/
│ │ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ ├── test/
│ │ │ │ │ │ └── widget_test.dart
│ │ │ │ │ ├── web/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── manifest.json
│ │ │ │ │ └── windows/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── flutter/
│ │ │ │ │ │ └── CMakeLists.txt
│ │ │ │ │ └── runner/
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── Runner.rc
│ │ │ │ │ ├── flutter_window.cpp
│ │ │ │ │ ├── flutter_window.h
│ │ │ │ │ ├── main.cpp
│ │ │ │ │ ├── resource.h
│ │ │ │ │ ├── runner.exe.manifest
│ │ │ │ │ ├── utils.cpp
│ │ │ │ │ ├── utils.h
│ │ │ │ │ ├── win32_window.cpp
│ │ │ │ │ └── win32_window.h
│ │ │ │ ├── flowy_infra_ui_platform_interface/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .metadata
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── analysis_options.yaml
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ ├── flowy_infra_ui_platform_interface.dart
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ └── method_channel_flowy_infra_ui.dart
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ └── test/
│ │ │ │ │ └── flowy_infra_ui_platform_interface_test.dart
│ │ │ │ ├── flowy_infra_ui_web/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .metadata
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── analysis_options.yaml
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ └── flowy_infra_ui_web.dart
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ └── test/
│ │ │ │ │ └── flowy_infra_ui_web_test.dart
│ │ │ │ ├── ios/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Assets/
│ │ │ │ │ │ └── .gitkeep
│ │ │ │ │ ├── Classes/
│ │ │ │ │ │ ├── Event/
│ │ │ │ │ │ │ └── KeyboardEventHandler.swift
│ │ │ │ │ │ ├── FlowyInfraUIPlugin.h
│ │ │ │ │ │ ├── FlowyInfraUIPlugin.m
│ │ │ │ │ │ └── SwiftFlowyInfraUIPlugin.swift
│ │ │ │ │ └── flowy_infra_ui.podspec
│ │ │ │ ├── lib/
│ │ │ │ │ ├── basis.dart
│ │ │ │ │ ├── flowy_infra_ui.dart
│ │ │ │ │ ├── flowy_infra_ui_web.dart
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── flowy_overlay/
│ │ │ │ │ │ │ ├── appflowy_popover.dart
│ │ │ │ │ │ │ ├── flowy_dialog.dart
│ │ │ │ │ │ │ ├── flowy_overlay.dart
│ │ │ │ │ │ │ ├── flowy_popover_layout.dart
│ │ │ │ │ │ │ ├── layout.dart
│ │ │ │ │ │ │ ├── list_overlay.dart
│ │ │ │ │ │ │ └── option_overlay.dart
│ │ │ │ │ │ ├── focus/
│ │ │ │ │ │ │ └── auto_unfocus_overlay.dart
│ │ │ │ │ │ └── keyboard/
│ │ │ │ │ │ └── keyboard_visibility_detector.dart
│ │ │ │ │ ├── style_widget/
│ │ │ │ │ │ ├── bar_title.dart
│ │ │ │ │ │ ├── button.dart
│ │ │ │ │ │ ├── close_button.dart
│ │ │ │ │ │ ├── color_picker.dart
│ │ │ │ │ │ ├── container.dart
│ │ │ │ │ │ ├── decoration.dart
│ │ │ │ │ │ ├── divider.dart
│ │ │ │ │ │ ├── extension.dart
│ │ │ │ │ │ ├── hover.dart
│ │ │ │ │ │ ├── icon_button.dart
│ │ │ │ │ │ ├── image_icon.dart
│ │ │ │ │ │ ├── primary_rounded_button.dart
│ │ │ │ │ │ ├── progress_indicator.dart
│ │ │ │ │ │ ├── scrollbar.dart
│ │ │ │ │ │ ├── scrolling/
│ │ │ │ │ │ │ ├── styled_list.dart
│ │ │ │ │ │ │ ├── styled_scroll_bar.dart
│ │ │ │ │ │ │ └── styled_scrollview.dart
│ │ │ │ │ │ ├── snap_bar.dart
│ │ │ │ │ │ ├── text.dart
│ │ │ │ │ │ ├── text_field.dart
│ │ │ │ │ │ ├── text_input.dart
│ │ │ │ │ │ └── toolbar_button.dart
│ │ │ │ │ └── widget/
│ │ │ │ │ ├── buttons/
│ │ │ │ │ │ ├── base_styled_button.dart
│ │ │ │ │ │ ├── primary_button.dart
│ │ │ │ │ │ └── secondary_button.dart
│ │ │ │ │ ├── constraint_flex_view.dart
│ │ │ │ │ ├── dialog/
│ │ │ │ │ │ ├── dialog_size.dart
│ │ │ │ │ │ └── styled_dialogs.dart
│ │ │ │ │ ├── flowy_tooltip.dart
│ │ │ │ │ ├── ignore_parent_gesture.dart
│ │ │ │ │ ├── mouse_hover_builder.dart
│ │ │ │ │ ├── rounded_button.dart
│ │ │ │ │ ├── rounded_input_field.dart
│ │ │ │ │ ├── route/
│ │ │ │ │ │ └── animation.dart
│ │ │ │ │ ├── separated_flex.dart
│ │ │ │ │ └── spacing.dart
│ │ │ │ ├── linux/
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── flowy_infra_u_i_plugin.cc
│ │ │ │ │ ├── flowy_infra_ui_plugin.cc
│ │ │ │ │ └── include/
│ │ │ │ │ └── flowy_infra_ui/
│ │ │ │ │ ├── flowy_infra_u_i_plugin.h
│ │ │ │ │ └── flowy_infra_ui_plugin.h
│ │ │ │ ├── macos/
│ │ │ │ │ ├── Classes/
│ │ │ │ │ │ └── FlowyInfraUiPlugin.swift
│ │ │ │ │ └── flowy_infra_ui.podspec
│ │ │ │ ├── pubspec.yaml
│ │ │ │ ├── test/
│ │ │ │ │ └── flowy_infra_ui_test.dart
│ │ │ │ └── windows/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── flowy_infra_ui_plugin.cpp
│ │ │ │ └── include/
│ │ │ │ └── flowy_infra_ui/
│ │ │ │ ├── flowy_infra_u_i_plugin.h
│ │ │ │ └── flowy_infra_ui_plugin.h
│ │ │ └── flowy_svg/
│ │ │ ├── .github/
│ │ │ │ ├── ISSUE_TEMPLATE/
│ │ │ │ │ ├── bug_report.md
│ │ │ │ │ ├── build.md
│ │ │ │ │ ├── chore.md
│ │ │ │ │ ├── ci.md
│ │ │ │ │ ├── config.yml
│ │ │ │ │ ├── documentation.md
│ │ │ │ │ ├── feature_request.md
│ │ │ │ │ ├── performance.md
│ │ │ │ │ ├── refactor.md
│ │ │ │ │ ├── revert.md
│ │ │ │ │ ├── style.md
│ │ │ │ │ └── test.md
│ │ │ │ ├── PULL_REQUEST_TEMPLATE.md
│ │ │ │ ├── cspell.json
│ │ │ │ ├── dependabot.yaml
│ │ │ │ └── workflows/
│ │ │ │ └── main.yaml
│ │ │ ├── .gitignore
│ │ │ ├── analysis_options.yaml
│ │ │ ├── bin/
│ │ │ │ ├── flowy_svg.dart
│ │ │ │ └── options.dart
│ │ │ ├── lib/
│ │ │ │ ├── flowy_svg.dart
│ │ │ │ └── src/
│ │ │ │ └── flowy_svg.dart
│ │ │ └── pubspec.yaml
│ │ ├── pubspec.lock
│ │ ├── pubspec.yaml
│ │ ├── test/
│ │ │ ├── bloc_test/
│ │ │ │ ├── ai_writer_test/
│ │ │ │ │ └── ai_writer_bloc_test.dart
│ │ │ │ ├── app_setting_test/
│ │ │ │ │ ├── appearance_test.dart
│ │ │ │ │ └── document_appearance_test.dart
│ │ │ │ ├── board_test/
│ │ │ │ │ ├── create_card_test.dart
│ │ │ │ │ ├── create_or_edit_field_test.dart
│ │ │ │ │ ├── group_by_checkbox_field_test.dart
│ │ │ │ │ ├── group_by_date_test.dart
│ │ │ │ │ ├── group_by_multi_select_field_test.dart
│ │ │ │ │ ├── group_by_unsupport_field_test.dart
│ │ │ │ │ └── util.dart
│ │ │ │ ├── chat_test/
│ │ │ │ │ ├── chat_load_message_test.dart
│ │ │ │ │ └── util.dart
│ │ │ │ ├── grid_test/
│ │ │ │ │ ├── cell/
│ │ │ │ │ │ ├── checklist_cell_bloc_test.dart
│ │ │ │ │ │ ├── date_cell_bloc_test.dart
│ │ │ │ │ │ ├── select_option_cell_test.dart
│ │ │ │ │ │ └── text_cell_bloc_test.dart
│ │ │ │ │ ├── field/
│ │ │ │ │ │ ├── field_cell_bloc_test.dart
│ │ │ │ │ │ └── field_editor_bloc_test.dart
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── filter_editor_bloc_test.dart
│ │ │ │ │ │ └── filter_entities_test.dart
│ │ │ │ │ ├── grid_bloc_test.dart
│ │ │ │ │ ├── sort/
│ │ │ │ │ │ └── sort_editor_bloc_test.dart
│ │ │ │ │ └── util.dart
│ │ │ │ ├── home_test/
│ │ │ │ │ ├── home_bloc_test.dart
│ │ │ │ │ ├── sidebar_section_bloc_test.dart
│ │ │ │ │ ├── trash_bloc_test.dart
│ │ │ │ │ └── view_bloc_test.dart
│ │ │ │ ├── lib/
│ │ │ │ │ └── features/
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ └── data_location_bloc_test.dart
│ │ │ │ │ ├── share_section/
│ │ │ │ │ │ └── shared_section_bloc_test.dart
│ │ │ │ │ └── share_tab/
│ │ │ │ │ └── share_tab_bloc_test.dart
│ │ │ │ ├── shortcuts_test/
│ │ │ │ │ └── shortcuts_cubit_test.dart
│ │ │ │ ├── view_selector_test.dart
│ │ │ │ └── workspace_test/
│ │ │ │ └── workspace_bloc_test.dart
│ │ │ ├── unit_test/
│ │ │ │ ├── algorithm/
│ │ │ │ │ └── levenshtein_test.dart
│ │ │ │ ├── deeplink/
│ │ │ │ │ └── deeplink_test.dart
│ │ │ │ ├── document/
│ │ │ │ │ ├── document_diff/
│ │ │ │ │ │ └── document_diff_test.dart
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── _html_samples.dart
│ │ │ │ │ │ └── paste_from_html_test.dart
│ │ │ │ │ ├── option_menu/
│ │ │ │ │ │ └── block_action_option_cubit_test.dart
│ │ │ │ │ ├── shortcuts/
│ │ │ │ │ │ ├── format_shortcut_test.dart
│ │ │ │ │ │ └── toggle_list_shortcut_test.dart
│ │ │ │ │ ├── text_robot/
│ │ │ │ │ │ ├── markdown_text_robot_test.dart
│ │ │ │ │ │ └── text_robot_test.dart
│ │ │ │ │ └── turn_into/
│ │ │ │ │ └── turn_into_test.dart
│ │ │ │ ├── editor/
│ │ │ │ │ ├── editor_drop_test.dart
│ │ │ │ │ ├── editor_migration_test.dart
│ │ │ │ │ ├── editor_style_test.dart
│ │ │ │ │ ├── file_block_test.dart
│ │ │ │ │ ├── share_markdown_test.dart
│ │ │ │ │ └── transaction_adapter_test.dart
│ │ │ │ ├── image/
│ │ │ │ │ └── appflowy_network_image_test.dart
│ │ │ │ ├── link_preview/
│ │ │ │ │ └── link_preview_test.dart
│ │ │ │ ├── markdown/
│ │ │ │ │ └── markdown_parser_test.dart
│ │ │ │ ├── search/
│ │ │ │ │ └── split_search_test.dart
│ │ │ │ ├── select_option_split_text_input.dart
│ │ │ │ ├── settings/
│ │ │ │ │ ├── shortcuts/
│ │ │ │ │ │ └── settings_shortcut_service_test.dart
│ │ │ │ │ └── theme_missing_keys_test.dart
│ │ │ │ ├── simple_table/
│ │ │ │ │ ├── simple_table_contente_operation_test.dart
│ │ │ │ │ ├── simple_table_delete_operation_test.dart
│ │ │ │ │ ├── simple_table_duplicate_operation_test.dart
│ │ │ │ │ ├── simple_table_header_operation_test.dart
│ │ │ │ │ ├── simple_table_insert_operation_test.dart
│ │ │ │ │ ├── simple_table_markdown_test.dart
│ │ │ │ │ ├── simple_table_reorder_operation_test.dart
│ │ │ │ │ ├── simple_table_style_operation_test.dart
│ │ │ │ │ └── simple_table_test_helper.dart
│ │ │ │ ├── theme/
│ │ │ │ │ └── theme_test.dart
│ │ │ │ ├── url_launcher/
│ │ │ │ │ └── url_launcher_test.dart
│ │ │ │ └── util/
│ │ │ │ ├── recent_icons_test.dart
│ │ │ │ └── time.dart
│ │ │ ├── util.dart
│ │ │ └── widget_test/
│ │ │ ├── confirm_dialog_test.dart
│ │ │ ├── date_picker_test.dart
│ │ │ ├── direction_setting_test.dart
│ │ │ ├── lib/
│ │ │ │ └── features/
│ │ │ │ ├── share_section/
│ │ │ │ │ ├── refresh_button_test.dart
│ │ │ │ │ ├── shared_page_actions_button_test.dart
│ │ │ │ │ ├── shared_pages_list_test.dart
│ │ │ │ │ ├── shared_section_error_test.dart
│ │ │ │ │ ├── shared_section_header_test.dart
│ │ │ │ │ └── shared_section_loading_test.dart
│ │ │ │ └── share_tab/
│ │ │ │ ├── access_level_list_widget_test.dart
│ │ │ │ ├── copy_link_widget_test.dart
│ │ │ │ ├── edit_access_level_widget_test.dart
│ │ │ │ ├── general_access_section_test.dart
│ │ │ │ ├── people_with_access_section_test.dart
│ │ │ │ ├── share_with_user_widget_test.dart
│ │ │ │ ├── shared_group_widget_test.dart
│ │ │ │ └── shared_user_widget_test.dart
│ │ │ ├── select_option_text_field_test.dart
│ │ │ ├── spae_cion_test.dart
│ │ │ ├── test_asset_bundle.dart
│ │ │ ├── test_material_app.dart
│ │ │ ├── theme_font_family_setting_test.dart
│ │ │ └── widget_test_wrapper.dart
│ │ ├── web/
│ │ │ ├── index.html
│ │ │ └── manifest.json
│ │ └── windows/
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── flutter/
│ │ │ └── CMakeLists.txt
│ │ └── runner/
│ │ ├── CMakeLists.txt
│ │ ├── Runner.rc
│ │ ├── flutter_window.cpp
│ │ ├── flutter_window.h
│ │ ├── main.cpp
│ │ ├── resource.h
│ │ ├── runner.exe.manifest
│ │ ├── utils.cpp
│ │ ├── utils.h
│ │ ├── win32_window.cpp
│ │ └── win32_window.h
│ ├── resources/
│ │ └── translations/
│ │ ├── am-ET.json
│ │ ├── ar-SA.json
│ │ ├── ca-ES.json
│ │ ├── ckb-KU.json
│ │ ├── cs-CZ.json
│ │ ├── de-DE.json
│ │ ├── el-GR.json
│ │ ├── en-GB.json
│ │ ├── en-US.json
│ │ ├── es-VE.json
│ │ ├── eu-ES.json
│ │ ├── fa.json
│ │ ├── fr-CA.json
│ │ ├── fr-FR.json
│ │ ├── ga-IE.json
│ │ ├── he.json
│ │ ├── hin.json
│ │ ├── hu-HU.json
│ │ ├── id-ID.json
│ │ ├── it-IT.json
│ │ ├── ja-JP.json
│ │ ├── ko-KR.json
│ │ ├── mr-IN.json
│ │ ├── pl-PL.json
│ │ ├── pt-BR.json
│ │ ├── pt-PT.json
│ │ ├── ru-RU.json
│ │ ├── sv-SE.json
│ │ ├── th-TH.json
│ │ ├── tr-TR.json
│ │ ├── uk-UA.json
│ │ ├── ur.json
│ │ ├── vi-VN.json
│ │ ├── vi.json
│ │ ├── zh-CN.json
│ │ └── zh-TW.json
│ ├── rust-lib/
│ │ ├── .gitignore
│ │ ├── .vscode/
│ │ │ └── launch.json
│ │ ├── Cargo.toml
│ │ ├── build-tool/
│ │ │ ├── flowy-ast/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── ctxt.rs
│ │ │ │ ├── event_attrs.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── node_attrs.rs
│ │ │ │ ├── pb_attrs.rs
│ │ │ │ ├── symbol.rs
│ │ │ │ └── ty_ext.rs
│ │ │ ├── flowy-codegen/
│ │ │ │ ├── Cargo.toml
│ │ │ │ └── src/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── dart_event/
│ │ │ │ │ ├── dart_event.rs
│ │ │ │ │ ├── event_template.rs
│ │ │ │ │ ├── event_template.tera
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── flowy_toml.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── protobuf_file/
│ │ │ │ │ ├── ast.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── proto_gen.rs
│ │ │ │ │ ├── proto_info.rs
│ │ │ │ │ └── template/
│ │ │ │ │ ├── derive_meta/
│ │ │ │ │ │ ├── derive_meta.rs
│ │ │ │ │ │ ├── derive_meta.tera
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── proto_file/
│ │ │ │ │ ├── enum.tera
│ │ │ │ │ ├── enum_template.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── struct.tera
│ │ │ │ │ └── struct_template.rs
│ │ │ │ ├── ts_event/
│ │ │ │ │ ├── event_template.rs
│ │ │ │ │ ├── event_template.tera
│ │ │ │ │ └── mod.rs
│ │ │ │ └── util.rs
│ │ │ └── flowy-derive/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── dart_event/
│ │ │ │ └── mod.rs
│ │ │ ├── lib.rs
│ │ │ ├── node/
│ │ │ │ └── mod.rs
│ │ │ └── proto_buf/
│ │ │ ├── deserialize.rs
│ │ │ ├── enum_serde.rs
│ │ │ ├── mod.rs
│ │ │ ├── serialize.rs
│ │ │ └── util.rs
│ │ ├── collab-integrate/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── collab_builder.rs
│ │ │ ├── config.rs
│ │ │ ├── instant_indexed_data_provider.rs
│ │ │ ├── lib.rs
│ │ │ └── plugin_provider.rs
│ │ ├── covtest.rs
│ │ ├── dart-ffi/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── binding.h
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ ├── appflowy_yaml.rs
│ │ │ ├── c.rs
│ │ │ ├── env_serde.rs
│ │ │ ├── lib.rs
│ │ │ ├── model/
│ │ │ │ ├── ffi_request.rs
│ │ │ │ ├── ffi_response.rs
│ │ │ │ └── mod.rs
│ │ │ └── notification/
│ │ │ ├── mod.rs
│ │ │ └── sender.rs
│ │ ├── event-integration-test/
│ │ │ ├── Cargo.toml
│ │ │ ├── src/
│ │ │ │ ├── chat_event.rs
│ │ │ │ ├── database_event.rs
│ │ │ │ ├── document/
│ │ │ │ │ ├── document_event.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── document_event.rs
│ │ │ │ ├── event_builder.rs
│ │ │ │ ├── folder_event.rs
│ │ │ │ ├── lib.rs
│ │ │ │ └── user_event.rs
│ │ │ └── tests/
│ │ │ ├── asset/
│ │ │ │ ├── database_template_1.afdb
│ │ │ │ ├── japan_trip.md
│ │ │ │ └── project.csv
│ │ │ ├── chat/
│ │ │ │ ├── chat_message_test.rs
│ │ │ │ ├── local_chat_test.rs
│ │ │ │ └── mod.rs
│ │ │ ├── database/
│ │ │ │ ├── af_cloud/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── summarize_row_test.rs
│ │ │ │ │ ├── translate_row_test.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── local_test/
│ │ │ │ │ ├── calculate_test.rs
│ │ │ │ │ ├── event_test.rs
│ │ │ │ │ ├── group_test.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── mod.rs
│ │ │ ├── document/
│ │ │ │ ├── af_cloud_test/
│ │ │ │ │ ├── edit_test.rs
│ │ │ │ │ ├── file_upload_test.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── local_test/
│ │ │ │ │ ├── edit_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── snapshot_test.rs
│ │ │ │ └── mod.rs
│ │ │ ├── folder/
│ │ │ │ ├── local_test/
│ │ │ │ │ ├── folder_test.rs
│ │ │ │ │ ├── import_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── publish_database_test.rs
│ │ │ │ │ ├── publish_document_test.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ ├── subscription_test.rs
│ │ │ │ │ └── test.rs
│ │ │ │ └── mod.rs
│ │ │ ├── main.rs
│ │ │ ├── search/
│ │ │ │ ├── document_title_content_search.rs
│ │ │ │ └── mod.rs
│ │ │ ├── sql_test/
│ │ │ │ ├── chat_message_ordering_test.rs
│ │ │ │ ├── chat_message_test.rs
│ │ │ │ └── mod.rs
│ │ │ ├── user/
│ │ │ │ ├── af_cloud_test/
│ │ │ │ │ ├── auth_test.rs
│ │ │ │ │ ├── import_af_data_folder_test.rs
│ │ │ │ │ ├── member_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── util.rs
│ │ │ │ │ └── workspace_test.rs
│ │ │ │ ├── local_test/
│ │ │ │ │ ├── auth_test.rs
│ │ │ │ │ ├── helper.rs
│ │ │ │ │ ├── import_af_data_local_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── user_awareness_test.rs
│ │ │ │ │ └── user_profile_test.rs
│ │ │ │ ├── migration_test/
│ │ │ │ │ ├── document_test.rs
│ │ │ │ │ ├── history_user_db/
│ │ │ │ │ │ └── README.md
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── version_test.rs
│ │ │ │ └── mod.rs
│ │ │ └── util.rs
│ │ ├── flowy-ai/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ ├── dev.env
│ │ │ ├── src/
│ │ │ │ ├── ai_manager.rs
│ │ │ │ ├── ai_tool/
│ │ │ │ │ ├── markdown.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── pdf.rs
│ │ │ │ ├── chat.rs
│ │ │ │ ├── completion.rs
│ │ │ │ ├── embeddings/
│ │ │ │ │ ├── context.rs
│ │ │ │ │ ├── document_indexer.rs
│ │ │ │ │ ├── embedder.rs
│ │ │ │ │ ├── indexer.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── scheduler.rs
│ │ │ │ │ └── store.rs
│ │ │ │ ├── entities.rs
│ │ │ │ ├── event_handler.rs
│ │ │ │ ├── event_map.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── local_ai/
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── chains/
│ │ │ │ │ │ │ ├── context_question_chain.rs
│ │ │ │ │ │ │ ├── conversation_chain.rs
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ └── related_question_chain.rs
│ │ │ │ │ │ ├── format_prompt.rs
│ │ │ │ │ │ ├── llm.rs
│ │ │ │ │ │ ├── llm_chat.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── retriever/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── multi_source_retriever.rs
│ │ │ │ │ │ │ └── sqlite_retriever.rs
│ │ │ │ │ │ └── summary_memory.rs
│ │ │ │ │ ├── completion/
│ │ │ │ │ │ ├── chain.rs
│ │ │ │ │ │ ├── impls.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── stream_interpreter.rs
│ │ │ │ │ │ └── writer.rs
│ │ │ │ │ ├── controller.rs
│ │ │ │ │ ├── database/
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── summary.rs
│ │ │ │ │ │ └── translate.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── prompt/
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── request.rs
│ │ │ │ │ ├── resource.rs
│ │ │ │ │ └── stream_util.rs
│ │ │ │ ├── mcp/
│ │ │ │ │ ├── manager.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── middleware/
│ │ │ │ │ ├── chat_service_mw.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── model_select.rs
│ │ │ │ ├── model_select_test.rs
│ │ │ │ ├── notification.rs
│ │ │ │ ├── offline/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── offline_message_sync.rs
│ │ │ │ ├── search/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── summary.rs
│ │ │ │ └── stream_message.rs
│ │ │ └── tests/
│ │ │ ├── asset/
│ │ │ │ └── japan_trip.md
│ │ │ ├── chat_test/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── qa_test.rs
│ │ │ │ └── related_question_test.rs
│ │ │ ├── complete_test/
│ │ │ │ └── mod.rs
│ │ │ ├── main.rs
│ │ │ ├── summary_test/
│ │ │ │ └── mod.rs
│ │ │ └── translate_test/
│ │ │ └── mod.rs
│ │ ├── flowy-ai-pub/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── cloud.rs
│ │ │ ├── entities.rs
│ │ │ ├── lib.rs
│ │ │ ├── persistence/
│ │ │ │ ├── chat_message_sql.rs
│ │ │ │ ├── chat_sql.rs
│ │ │ │ ├── collab_metadata_sql.rs
│ │ │ │ ├── collab_sql.rs
│ │ │ │ ├── local_model_sql.rs
│ │ │ │ └── mod.rs
│ │ │ └── user_service.rs
│ │ ├── flowy-core/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── assets/
│ │ │ │ └── read_me.json
│ │ │ └── src/
│ │ │ ├── app_life_cycle.rs
│ │ │ ├── config.rs
│ │ │ ├── deps_resolve/
│ │ │ │ ├── chat_deps.rs
│ │ │ │ ├── cloud_service_impl.rs
│ │ │ │ ├── collab_deps.rs
│ │ │ │ ├── database_deps.rs
│ │ │ │ ├── document_deps.rs
│ │ │ │ ├── file_storage_deps.rs
│ │ │ │ ├── folder_deps/
│ │ │ │ │ ├── folder_deps_chat_impl.rs
│ │ │ │ │ ├── folder_deps_database_impl.rs
│ │ │ │ │ ├── folder_deps_doc_impl.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── reminder_deps.rs
│ │ │ │ ├── search_deps.rs
│ │ │ │ └── user_deps.rs
│ │ │ ├── folder_view_observer.rs
│ │ │ ├── full_indexed_data_provider.rs
│ │ │ ├── indexed_data_consumer.rs
│ │ │ ├── indexing_data_runner.rs
│ │ │ ├── lib.rs
│ │ │ ├── log_filter.rs
│ │ │ ├── module.rs
│ │ │ └── server_layer.rs
│ │ ├── flowy-database-pub/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── cloud.rs
│ │ │ └── lib.rs
│ │ ├── flowy-database2/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── entities/
│ │ │ │ │ ├── board_entities.rs
│ │ │ │ │ ├── calculation/
│ │ │ │ │ │ ├── calculation_changeset.rs
│ │ │ │ │ │ ├── calculation_entities.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── calendar_entities.rs
│ │ │ │ │ ├── cell_entities.rs
│ │ │ │ │ ├── database_entities.rs
│ │ │ │ │ ├── field_entities.rs
│ │ │ │ │ ├── field_settings_entities.rs
│ │ │ │ │ ├── file_entities.rs
│ │ │ │ │ ├── filter_entities/
│ │ │ │ │ │ ├── checkbox_filter.rs
│ │ │ │ │ │ ├── checklist_filter.rs
│ │ │ │ │ │ ├── date_filter.rs
│ │ │ │ │ │ ├── filter_changeset.rs
│ │ │ │ │ │ ├── media_filter.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── number_filter.rs
│ │ │ │ │ │ ├── relation_filter.rs
│ │ │ │ │ │ ├── select_option_filter.rs
│ │ │ │ │ │ ├── text_filter.rs
│ │ │ │ │ │ ├── time_filter.rs
│ │ │ │ │ │ └── util.rs
│ │ │ │ │ ├── group_entities/
│ │ │ │ │ │ ├── configuration.rs
│ │ │ │ │ │ ├── group.rs
│ │ │ │ │ │ ├── group_changeset.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── macros.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── parser.rs
│ │ │ │ │ ├── position_entities.rs
│ │ │ │ │ ├── row_entities.rs
│ │ │ │ │ ├── setting_entities.rs
│ │ │ │ │ ├── share_entities.rs
│ │ │ │ │ ├── sort_entities.rs
│ │ │ │ │ ├── type_option_entities/
│ │ │ │ │ │ ├── checkbox_entities.rs
│ │ │ │ │ │ ├── checklist_entities.rs
│ │ │ │ │ │ ├── date_entities.rs
│ │ │ │ │ │ ├── media_entities.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── number_entities.rs
│ │ │ │ │ │ ├── relation_entities.rs
│ │ │ │ │ │ ├── select_option_entities.rs
│ │ │ │ │ │ ├── summary_entities.rs
│ │ │ │ │ │ ├── text_entities.rs
│ │ │ │ │ │ ├── time_entities.rs
│ │ │ │ │ │ ├── timestamp_entities.rs
│ │ │ │ │ │ ├── translate_entities.rs
│ │ │ │ │ │ └── url_entities.rs
│ │ │ │ │ └── view_entities.rs
│ │ │ │ ├── event_handler.rs
│ │ │ │ ├── event_map.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── manager.rs
│ │ │ │ ├── notification.rs
│ │ │ │ ├── services/
│ │ │ │ │ ├── calculations/
│ │ │ │ │ │ ├── cache.rs
│ │ │ │ │ │ ├── controller.rs
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── service.rs
│ │ │ │ │ │ └── task.rs
│ │ │ │ │ ├── cell/
│ │ │ │ │ │ ├── cell_data_cache.rs
│ │ │ │ │ │ ├── cell_operation.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ └── type_cell_data.rs
│ │ │ │ │ ├── database/
│ │ │ │ │ │ ├── database_editor.rs
│ │ │ │ │ │ ├── database_observe.rs
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ └── util.rs
│ │ │ │ │ ├── database_view/
│ │ │ │ │ │ ├── layout_deps.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── notifier.rs
│ │ │ │ │ │ ├── view_calculations.rs
│ │ │ │ │ │ ├── view_editor.rs
│ │ │ │ │ │ ├── view_filter.rs
│ │ │ │ │ │ ├── view_group.rs
│ │ │ │ │ │ ├── view_operation.rs
│ │ │ │ │ │ ├── view_sort.rs
│ │ │ │ │ │ └── views.rs
│ │ │ │ │ ├── field/
│ │ │ │ │ │ ├── field_builder.rs
│ │ │ │ │ │ ├── field_operation.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── type_option_transform.rs
│ │ │ │ │ │ └── type_options/
│ │ │ │ │ │ ├── checkbox_type_option/
│ │ │ │ │ │ │ ├── checkbox_filter.rs
│ │ │ │ │ │ │ ├── checkbox_tests.rs
│ │ │ │ │ │ │ ├── checkbox_type_option.rs
│ │ │ │ │ │ │ ├── checkbox_type_option_entities.rs
│ │ │ │ │ │ │ └── mod.rs
│ │ │ │ │ │ ├── checklist_type_option/
│ │ │ │ │ │ │ ├── checklist_filter.rs
│ │ │ │ │ │ │ ├── checklist_type_option.rs
│ │ │ │ │ │ │ └── mod.rs
│ │ │ │ │ │ ├── date_type_option/
│ │ │ │ │ │ │ ├── date_filter.rs
│ │ │ │ │ │ │ ├── date_tests.rs
│ │ │ │ │ │ │ ├── date_type_option.rs
│ │ │ │ │ │ │ └── mod.rs
│ │ │ │ │ │ ├── media_type_option/
│ │ │ │ │ │ │ ├── media_file.rs
│ │ │ │ │ │ │ ├── media_filter.rs
│ │ │ │ │ │ │ ├── media_type_option.rs
│ │ │ │ │ │ │ └── mod.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── number_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── number_filter.rs
│ │ │ │ │ │ │ ├── number_type_option.rs
│ │ │ │ │ │ │ └── number_type_option_entities.rs
│ │ │ │ │ │ ├── relation_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── relation.rs
│ │ │ │ │ │ │ └── relation_entities.rs
│ │ │ │ │ │ ├── selection_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── multi_select_type_option.rs
│ │ │ │ │ │ │ ├── select_filter.rs
│ │ │ │ │ │ │ ├── select_option_tests.rs
│ │ │ │ │ │ │ ├── select_type_option.rs
│ │ │ │ │ │ │ ├── single_select_type_option.rs
│ │ │ │ │ │ │ └── type_option_transform.rs
│ │ │ │ │ │ ├── summary_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ └── summary.rs
│ │ │ │ │ │ ├── text_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── text_filter.rs
│ │ │ │ │ │ │ ├── text_tests.rs
│ │ │ │ │ │ │ └── text_type_option.rs
│ │ │ │ │ │ ├── time_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── time.rs
│ │ │ │ │ │ │ └── time_filter.rs
│ │ │ │ │ │ ├── timestamp_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ └── timestamp_type_option.rs
│ │ │ │ │ │ ├── translate_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ └── translate.rs
│ │ │ │ │ │ ├── type_option.rs
│ │ │ │ │ │ ├── type_option_cell.rs
│ │ │ │ │ │ ├── url_type_option/
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── url_tests.rs
│ │ │ │ │ │ │ ├── url_type_option.rs
│ │ │ │ │ │ │ └── url_type_option_entities.rs
│ │ │ │ │ │ └── util.rs
│ │ │ │ │ ├── field_settings/
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ ├── field_settings_builder.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── filter/
│ │ │ │ │ │ ├── controller.rs
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ └── task.rs
│ │ │ │ │ ├── group/
│ │ │ │ │ │ ├── action.rs
│ │ │ │ │ │ ├── configuration.rs
│ │ │ │ │ │ ├── controller.rs
│ │ │ │ │ │ ├── controller_impls/
│ │ │ │ │ │ │ ├── checkbox_controller.rs
│ │ │ │ │ │ │ ├── date_controller.rs
│ │ │ │ │ │ │ ├── default_controller.rs
│ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ ├── select_option_controller/
│ │ │ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ │ │ ├── multi_select_controller.rs
│ │ │ │ │ │ │ │ ├── single_select_controller.rs
│ │ │ │ │ │ │ │ └── util.rs
│ │ │ │ │ │ │ └── url_controller.rs
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ ├── group_builder.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── setting/
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── share/
│ │ │ │ │ │ ├── csv/
│ │ │ │ │ │ │ ├── export.rs
│ │ │ │ │ │ │ ├── import.rs
│ │ │ │ │ │ │ └── mod.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ ├── snapshot/
│ │ │ │ │ │ ├── entities.rs
│ │ │ │ │ │ └── mod.rs
│ │ │ │ │ └── sort/
│ │ │ │ │ ├── controller.rs
│ │ │ │ │ ├── entities.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── task.rs
│ │ │ │ ├── template.rs
│ │ │ │ └── utils/
│ │ │ │ ├── cache.rs
│ │ │ │ └── mod.rs
│ │ │ └── tests/
│ │ │ ├── database/
│ │ │ │ ├── block_test/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── row_test.rs
│ │ │ │ │ └── script.rs
│ │ │ │ ├── calculations_test/
│ │ │ │ │ ├── calculation_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── script.rs
│ │ │ │ ├── cell_test/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ └── test.rs
│ │ │ │ ├── database_editor.rs
│ │ │ │ ├── field_settings_test/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ └── test.rs
│ │ │ │ ├── field_test/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ ├── test.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── filter_test/
│ │ │ │ │ ├── advanced_filter_test.rs
│ │ │ │ │ ├── checkbox_filter_test.rs
│ │ │ │ │ ├── checklist_filter_test.rs
│ │ │ │ │ ├── date_filter_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── number_filter_test.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ ├── select_option_filter_test.rs
│ │ │ │ │ ├── text_filter_test.rs
│ │ │ │ │ └── time_filter_test.rs
│ │ │ │ ├── group_test/
│ │ │ │ │ ├── date_group_test.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ ├── test.rs
│ │ │ │ │ └── url_group_test.rs
│ │ │ │ ├── layout_test/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── script.rs
│ │ │ │ │ └── test.rs
│ │ │ │ ├── mock_data/
│ │ │ │ │ ├── board_mock_data.rs
│ │ │ │ │ ├── calendar_mock_data.rs
│ │ │ │ │ ├── grid_mock_data.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── pre_fill_cell_test/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── pre_fill_row_according_to_filter_test.rs
│ │ │ │ │ ├── pre_fill_row_with_payload_test.rs
│ │ │ │ │ └── script.rs
│ │ │ │ ├── share_test/
│ │ │ │ │ ├── export_test.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ └── sort_test/
│ │ │ │ ├── mod.rs
│ │ │ │ ├── multi_sort_test.rs
│ │ │ │ ├── script.rs
│ │ │ │ └── single_sort_test.rs
│ │ │ └── main.rs
│ │ ├── flowy-date/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ ├── entities.rs
│ │ │ ├── event_handler.rs
│ │ │ ├── event_map.rs
│ │ │ └── lib.rs
│ │ ├── flowy-document/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── deps.rs
│ │ │ │ ├── document.rs
│ │ │ │ ├── document_data.rs
│ │ │ │ ├── entities.rs
│ │ │ │ ├── event_handler.rs
│ │ │ │ ├── event_map.rs
│ │ │ │ ├── lib.rs
│ │ │ │ ├── manager.rs
│ │ │ │ ├── notification.rs
│ │ │ │ ├── parse.rs
│ │ │ │ ├── parser/
│ │ │ │ │ ├── constant.rs
│ │ │ │ │ ├── document_data_parser.rs
│ │ │ │ │ ├── external/
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── parser.rs
│ │ │ │ │ │ └── utils.rs
│ │ │ │ │ ├── json/
│ │ │ │ │ │ ├── block.rs
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ └── parser.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── parser_entities.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ └── reminder.rs
│ │ │ └── tests/
│ │ │ ├── assets/
│ │ │ │ ├── html/
│ │ │ │ │ ├── bulleted_list.html
│ │ │ │ │ ├── callout.html
│ │ │ │ │ ├── code.html
│ │ │ │ │ ├── divider.html
│ │ │ │ │ ├── google_docs.html
│ │ │ │ │ ├── heading.html
│ │ │ │ │ ├── image.html
│ │ │ │ │ ├── math_equation.html
│ │ │ │ │ ├── notion.html
│ │ │ │ │ ├── numbered_list.html
│ │ │ │ │ ├── paragraph.html
│ │ │ │ │ ├── quote.html
│ │ │ │ │ ├── simple.html
│ │ │ │ │ ├── todo_list.html
│ │ │ │ │ └── toggle_list.html
│ │ │ │ ├── json/
│ │ │ │ │ ├── bulleted_list.json
│ │ │ │ │ ├── callout.json
│ │ │ │ │ ├── code.json
│ │ │ │ │ ├── divider.json
│ │ │ │ │ ├── google_docs.json
│ │ │ │ │ ├── heading.json
│ │ │ │ │ ├── image.json
│ │ │ │ │ ├── initial_document.json
│ │ │ │ │ ├── math_equation.json
│ │ │ │ │ ├── notion.json
│ │ │ │ │ ├── numbered_list.json
│ │ │ │ │ ├── paragraph.json
│ │ │ │ │ ├── plain_text.json
│ │ │ │ │ ├── quote.json
│ │ │ │ │ ├── range_1.json
│ │ │ │ │ ├── range_2.json
│ │ │ │ │ ├── simple.json
│ │ │ │ │ ├── todo_list.json
│ │ │ │ │ └── toggle_list.json
│ │ │ │ └── text/
│ │ │ │ ├── bulleted_list.txt
│ │ │ │ ├── callout.txt
│ │ │ │ ├── code.txt
│ │ │ │ ├── divider.txt
│ │ │ │ ├── heading.txt
│ │ │ │ ├── image.txt
│ │ │ │ ├── math_equation.txt
│ │ │ │ ├── numbered_list.txt
│ │ │ │ ├── paragraph.txt
│ │ │ │ ├── plain_text.txt
│ │ │ │ ├── quote.txt
│ │ │ │ ├── todo_list.txt
│ │ │ │ └── toggle_list.txt
│ │ │ ├── document/
│ │ │ │ ├── document_insert_test.rs
│ │ │ │ ├── document_redo_undo_test.rs
│ │ │ │ ├── document_test.rs
│ │ │ │ ├── event_handler_test.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── util.rs
│ │ │ ├── file_storage.rs
│ │ │ ├── main.rs
│ │ │ └── parser/
│ │ │ ├── document_data_parser_test.rs
│ │ │ ├── html/
│ │ │ │ ├── mod.rs
│ │ │ │ └── parser_test.rs
│ │ │ ├── json/
│ │ │ │ ├── block_test.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── parser_test.rs
│ │ │ ├── mod.rs
│ │ │ └── parse_to_html_text/
│ │ │ ├── mod.rs
│ │ │ ├── test.rs
│ │ │ └── utils.rs
│ │ ├── flowy-document-pub/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── cloud.rs
│ │ │ └── lib.rs
│ │ ├── flowy-error/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ ├── code.rs
│ │ │ ├── errors.rs
│ │ │ ├── impl_from/
│ │ │ │ ├── cloud.rs
│ │ │ │ ├── collab.rs
│ │ │ │ ├── collab_persistence.rs
│ │ │ │ ├── database.rs
│ │ │ │ ├── dispatch.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── reqwest.rs
│ │ │ │ ├── serde.rs
│ │ │ │ ├── tantivy.rs
│ │ │ │ └── url.rs
│ │ │ └── lib.rs
│ │ ├── flowy-folder/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ ├── entities/
│ │ │ │ ├── icon.rs
│ │ │ │ ├── import.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── parser/
│ │ │ │ │ ├── empty_str.rs
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── trash/
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ └── trash_id.rs
│ │ │ │ │ ├── view/
│ │ │ │ │ │ ├── mod.rs
│ │ │ │ │ │ ├── view_id.rs
│ │ │ │ │ │ ├── view_name.rs
│ │ │ │ │ │ └── view_thumbnail.rs
│ │ │ │ │ └── workspace/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── workspace_desc.rs
│ │ │ │ │ ├── workspace_id.rs
│ │ │ │ │ └── workspace_name.rs
│ │ │ │ ├── publish.rs
│ │ │ │ ├── trash.rs
│ │ │ │ ├── view.rs
│ │ │ │ └── workspace.rs
│ │ │ ├── event_handler.rs
│ │ │ ├── event_map.rs
│ │ │ ├── lib.rs
│ │ │ ├── manager.rs
│ │ │ ├── manager_init.rs
│ │ │ ├── manager_observer.rs
│ │ │ ├── notification.rs
│ │ │ ├── publish_util.rs
│ │ │ ├── share/
│ │ │ │ ├── import.rs
│ │ │ │ └── mod.rs
│ │ │ ├── user_default.rs
│ │ │ ├── util.rs
│ │ │ └── view_operation.rs
│ │ ├── flowy-folder-pub/
│ │ │ ├── Cargo.toml
│ │ │ └── src/
│ │ │ ├── cloud.rs
│ │ │ ├── entities.rs
│ │ │ ├── lib.rs
│ │ │ ├── query.rs
│ │ │ └── sql/
│ │ │ ├── mod.rs
│ │ │ ├── workspace_shared_user_sql.rs
│ │ │ └── workspace_shared_view_sql.rs
│ │ ├── flowy-notification/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ └── src/
│ │ │ ├── builder.rs
│ │ │ ├── debounce.rs
│ │ │ ├── entities/
│ │ │ │ ├── mod.rs
│ │ │ │ └── subject.rs
│ │ │ └── lib.rs
│ │ ├── flowy-search/
│ │ │ ├── Cargo.toml
│ │ │ ├── Flowy.toml
│ │ │ ├── build.rs
│ │ │ ├── src/
│ │ │ │ ├── document/
│ │ │ │ │ ├── cloud_search_handler.rs
│ │ │ │ │ ├── local_search_handler.rs
│ │ │ │ │ └── mod.rs
│ │ │ │ ├── entities/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ ├── notification.rs
│ │ │ │ │ ├── query.rs
│ │ │ │ │ ├── result.rs
│ │ │ │ │ └── search_filter.rs
│ │ │ │ ├── event_handler.rs
│ │ │ │ ├── event_map.rs
│ │ │ │ ├── lib.rs
│ │ │ │ └── services/
│ │ │ │ ├── manager.rs
│ │ │ │ └── mod.rs
│ │ │ └── tests/
│ │ │ ├── main.rs
│ │ │ └── tantivy_test.rs
│
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
.git
================================================
FILE: .githooks/commit-msg
================================================
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message. The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit. The hook is allowed to edit the commit message file.
YELLOW="\e[93m"
GREEN="\e[32m"
RED="\e[31m"
ENDCOLOR="\e[0m"
printMessage() {
printf "${YELLOW}AppFlowy : $1${ENDCOLOR}\n"
}
printSuccess() {
printf "${GREEN}AppFlowy : $1${ENDCOLOR}\n"
}
printError() {
printf "${RED}AppFlowy : $1${ENDCOLOR}\n"
}
printMessage "Running the AppFlowy commit-msg hook."
# This example catches duplicate Signed-off-by lines.
test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
echo >&2 Duplicate Signed-off-by lines.
exit 1
}
.githooks/gitlint \
--msg-file=$1 \
--subject-regex="^(build|chore|ci|docs|feat|feature|fix|perf|refactor|revert|style|test)(.*)?:\s?.*" \
--subject-maxlen=150 \
--subject-minlen=10 \
--body-regex=".*" \
--max-parents=1
if [ $? -ne 0 ]
then
printError "Please fix your commit message to match AppFlowy coding standards"
printError "https://docs.appflowy.io/docs/documentation/software-contributions/conventions/git-conventions"
exit 1
fi
================================================
FILE: .githooks/pre-commit
================================================
#!/usr/bin/env bash
YELLOW="\e[93m"
GREEN="\e[32m"
RED="\e[31m"
ENDCOLOR="\e[0m"
printMessage() {
printf "${YELLOW}AppFlowy : $1${ENDCOLOR}\n"
}
printSuccess() {
printf "${GREEN}AppFlowy : $1${ENDCOLOR}\n"
}
printError() {
printf "${RED}AppFlowy : $1${ENDCOLOR}\n"
}
printMessage "Running local AppFlowy pre-commit hook."
#flutter format .
##https://gist.github.com/benmccallum/28e4f216d9d72f5965133e6c43aaff6e
limit=$(( 1 * 2**20 )) # 1MB
function file_too_large(){
filename=$0
filesize=$(( $1 / 2**20 ))
cat <<HEREDOC
File $filename is $filesize MB, which is larger than github's maximum
file size (1 MB). We will not be able to push this file to GitHub.
Commit aborted
HEREDOC
}
empty_tree=$( git hash-object -t tree /dev/null )
if git rev-parse --verify HEAD > /dev/null 2>&1
then
against=HEAD
else
against=empty_tree
fi
for file in $( git diff-index --cached --name-only $against ); do
file_size=$( ls -la $file | awk '{ print $5 }')
if [ "$file_size" -gt "$limit" ]; then
file_too_large $filename $file_size
exit 1;
fi
done
================================================
FILE: .githooks/pre-push
================================================
#!/usr/bin/env bash
YELLOW="\e[93m"
GREEN="\e[32m"
RED="\e[31m"
ENDCOLOR="\e[0m"
printMessage() {
printf "${YELLOW}AppFlowy : $1${ENDCOLOR}\n"
}
printSuccess() {
printf "${GREEN}AppFlowy : $1${ENDCOLOR}\n"
}
printError() {
printf "${RED}AppFlowy : $1${ENDCOLOR}\n"
}
printMessage "Running local AppFlowy pre-push hook."
if [[ `git status --porcelain` ]]; then
printError "This script needs to run against committed code only. Please commit or stash you changes."
exit 1
fi
#
#printMessage "Running the Flutter analyzer"
#flutter analyze
#
#if [ $? -ne 0 ]; then
# printError "Flutter analyzer error"
# exit 1
#fi
#
#printMessage "Finished running the Flutter analyzer"
================================================
FILE: .github/FUNDING.yml
================================================
ko_fi: appflowy
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: Bug Report
description: Create a bug report to help us improve
title: "[Bug] "
body:
- type: textarea
id: desc
attributes:
label: Bug Description
description: A clear and concise description of what the bug is
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: How to Reproduce
description: What steps can we take to reproduce this behavior?
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen
validations:
required: true
- type: input
id: os
attributes:
label: Operating System
description: What OS are you seeing this bug on?
validations:
required: true
- type: input
id: version
attributes:
label: AppFlowy Version(s)
description: What version(s) of AppFlowy do you see this bug on?
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, please add screenshots to help explain your problem
- type: textarea
id: context
attributes:
label: Additional Context
description: Add any additonal context about the problem here
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
name: Feature Request
description: Suggest an idea for AppFlowy
title: "[FR] "
body:
- type: textarea
id: desc
attributes:
label: Description
description: Describe your suggested feature and the main use cases
validations:
required: true
- type: textarea
id: users
attributes:
label: Impact
description: What types of users can benefit from using the suggested feature?
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional Context
description: Add any additonal context about the feature here
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!---
Thank you for submitting a pull request to AppFlowy. The team will dedicate their best efforts to reviewing and approving your pull request. If you have any questions about the project or feedback for us, please join our [Discord](https://discord.gg/wdjWUXXhtw).
-->
<!---
If your pull request adds a new feature, please drag and drop a video into this section to showcase what you've done! If not, you may delete this section.
-->
### Feature Preview
<!---
List at least one issue here that this PR addresses. If it fixes the issue, please use the [fixes](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests) keyword to close the issue. For example:
fixes https://github.com/AppFlowy-IO/AppFlowy/pull/2106
-->
---
<!---
Before you mark this PR ready for review, run through this checklist!
-->
#### PR Checklist
- [ ] My code adheres to [AppFlowy's Conventions](https://docs.appflowy.io/docs/documentation/software-contributions/conventions)
- [ ] I've listed at least one issue that this PR fixes in the description above.
- [ ] I've added a test(s) to validate changes in this PR, or this PR only contains semantic changes.
- [ ] All existing tests are passing.
================================================
FILE: .github/actions/flutter_build/action.yml
================================================
name: Flutter Integration Test
description: Run integration tests for AppFlowy
inputs:
os:
description: "The operating system to run the tests on"
required: true
flutter_version:
description: "The version of Flutter to use"
required: true
rust_toolchain:
description: "The version of Rust to use"
required: true
cargo_make_version:
description: "The version of cargo-make to use"
required: true
rust_target:
description: "The target to build for"
required: true
flutter_profile:
description: "The profile to build with"
required: true
runs:
using: "composite"
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install Rust toolchain
id: rust_toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ inputs.rust_toolchain }}
target: ${{ inputs.rust_target }}
override: true
profile: minimal
- name: Install flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ inputs.flutter_version }}
cache: true
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ inputs.os }}
workspaces: |
frontend/rust-lib
cache-all-crates: true
- uses: taiki-e/install-action@v2
with:
tool: cargo-make@${{ inputs.cargo_make_version }}, duckscript_cli
- name: Install prerequisites
working-directory: frontend
shell: bash
run: |
case $RUNNER_OS in
Linux)
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
sudo apt-get update
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev libcurl4-openssl-dev
;;
Windows)
vcpkg integrate install
vcpkg update
;;
macOS)
# No additional prerequisites needed for macOS
;;
esac
cargo make appflowy-flutter-deps-tools
- name: Build AppFlowy
working-directory: frontend
run: cargo make --profile ${{ inputs.flutter_profile }} appflowy-core-dev
shell: bash
- name: Run code generation
working-directory: frontend
run: cargo make code_generation
shell: bash
- name: Flutter Analyzer
working-directory: frontend/appflowy_flutter
run: flutter analyze .
shell: bash
- name: Compress appflowy_flutter
run: tar -czf appflowy_flutter.tar.gz frontend/appflowy_flutter
shell: bash
- uses: actions/upload-artifact@v4
with:
name: ${{ github.run_id }}-${{ matrix.os }}
path: appflowy_flutter.tar.gz
================================================
FILE: .github/actions/flutter_integration_test/action.yml
================================================
name: Flutter Integration Test
description: Run integration tests for AppFlowy
inputs:
test_path:
description: "The path to the integration test file"
required: true
flutter_version:
description: "The version of Flutter to use"
required: true
rust_toolchain:
description: "The version of Rust to use"
required: true
cargo_make_version:
description: "The version of cargo-make to use"
required: true
rust_target:
description: "The target to build for"
required: true
runs:
using: "composite"
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install Rust toolchain
id: rust_toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ inputs.RUST_TOOLCHAIN }}
target: ${{ inputs.rust_target }}
override: true
profile: minimal
- name: Install flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ inputs.flutter_version }}
cache: true
- uses: taiki-e/install-action@v2
with:
tool: cargo-make@${{ inputs.cargo_make_version }}
- name: Install prerequisites
working-directory: frontend
run: |
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
sudo apt-get update
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev network-manager libcurl4-openssl-dev
shell: bash
- name: Enable Flutter Desktop
run: |
flutter config --enable-linux-desktop
shell: bash
- uses: actions/download-artifact@v4
with:
name: ${{ github.run_id }}-ubuntu-latest
- name: Uncompressed appflowy_flutter
run: tar -xf appflowy_flutter.tar.gz
shell: bash
- name: Run Flutter integration tests
working-directory: frontend/appflowy_flutter
run: |
export DISPLAY=:99
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
sudo apt-get install network-manager
flutter test ${{ inputs.test_path }} -d Linux --coverage
shell: bash
================================================
FILE: .github/workflows/android_ci.yaml.bak
================================================
name: Android CI
on:
push:
branches:
- "main"
paths:
- ".github/workflows/mobile_ci.yaml"
- "frontend/**"
pull_request:
branches:
- "main"
paths:
- ".github/workflows/mobile_ci.yaml"
- "frontend/**"
- "!frontend/appflowy_tauri/**"
env:
CARGO_TERM_COLOR: always
FLUTTER_VERSION: "3.27.4"
RUST_TOOLCHAIN: "1.85.0"
CARGO_MAKE_VERSION: "0.37.18"
CLOUD_VERSION: 0.6.54-amd64
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
if: github.event.pull_request.draft != true
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Check storage space
run:
df -h
# the following step is required to avoid running out of space
- name: Maximize build space
if: matrix.os == 'ubuntu-latest'
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
sudo docker image prune --all --force
sudo rm -rf /opt/hostedtoolcache/codeQL
sudo rm -rf ${GITHUB_WORKSPACE}/.git
- name: Check storage space
run: df -h
- name: Checkout appflowy cloud code
uses: actions/checkout@v4
with:
repository: AppFlowy-IO/AppFlowy-Cloud
path: AppFlowy-Cloud
- name: Prepare appflowy cloud env
working-directory: AppFlowy-Cloud
run: |
# log level
cp deploy.env .env
sed -i 's|RUST_LOG=.*|RUST_LOG=trace|' .env
sed -i 's/GOTRUE_EXTERNAL_GOOGLE_ENABLED=.*/GOTRUE_EXTERNAL_GOOGLE_ENABLED=true/' .env
sed -i 's|GOTRUE_MAILER_AUTOCONFIRM=.*|GOTRUE_MAILER_AUTOCONFIRM=true|' .env
sed -i 's|API_EXTERNAL_URL=.*|API_EXTERNAL_URL=http://localhost|' .env
- name: Run Docker-Compose
working-directory: AppFlowy-Cloud
env:
APPFLOWY_CLOUD_VERSION: ${{ env.CLOUD_VERSION }}
APPFLOWY_HISTORY_VERSION: ${{ env.CLOUD_VERSION }}
APPFLOWY_WORKER_VERSION: ${{ env.CLOUD_VERSION }}
run: |
container_id=$(docker ps --filter name=appflowy-cloud-appflowy_cloud-1 -q)
if [ -z "$container_id" ]; then
echo "AppFlowy-Cloud container is not running. Pulling and starting the container..."
docker compose pull
docker compose up -d
echo "Waiting for the container to be ready..."
sleep 10
else
running_image=$(docker inspect --format='{{index .Config.Image}}' "$container_id")
if [ "$running_image" != "appflowy-cloud:$APPFLOWY_CLOUD_VERSION" ]; then
echo "AppFlowy-Cloud is running with an incorrect version. Restarting with the correct version..."
# Remove all containers if any exist
if [ "$(docker ps -aq)" ]; then
docker rm -f $(docker ps -aq)
else
echo "No containers to remove."
fi
# Remove all volumes if any exist
if [ "$(docker volume ls -q)" ]; then
docker volume rm $(docker volume ls -q)
else
echo "No volumes to remove."
fi
docker compose pull
docker compose up -d
echo "Waiting for the container to be ready..."
sleep 10
docker ps -a
docker compose logs
else
echo "AppFlowy-Cloud is running with the correct version."
fi
fi
- name: Checkout source code
uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 11
- name: Install Rust toolchain
id: rust_toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
override: true
profile: minimal
- name: Install flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- uses: gradle/gradle-build-action@v3
with:
gradle-version: 8.10
- uses: davidB/rust-cargo-make@v1
with:
version: ${{ env.CARGO_MAKE_VERSION }}
- name: Install prerequisites
working-directory: frontend
run: |
rustup target install aarch64-linux-android
rustup target install x86_64-linux-android
rustup target add armv7-linux-androideabi
cargo install --force --locked duckscript_cli
cargo install cargo-ndk
if [ "$RUNNER_OS" == "Linux" ]; then
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
sudo apt-get update
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev
sudo apt-get install keybinder-3.0 libnotify-dev
sudo apt-get install gcc-multilib
elif [ "$RUNNER_OS" == "Windows" ]; then
vcpkg integrate install
elif [ "$RUNNER_OS" == "macOS" ]; then
echo 'do nothing'
fi
cargo make appflowy-flutter-deps-tools
shell: bash
- name: Build AppFlowy
working-directory: frontend
run: |
cargo make --profile development-android appflowy-core-dev-android
cargo make --profile development-android code_generation
cd rust-lib
cargo clean
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run integration tests
# https://github.com/ReactiveCircus/android-emulator-runner
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 33
arch: x86_64
disk-size: 2048M
working-directory: frontend/appflowy_flutter
disable-animations: true
force-avd-creation: false
target: google_apis
script: flutter test integration_test/mobile/cloud/cloud_runner.dart
================================================
FILE: .github/workflows/build_command.yml
================================================
name: build
on:
repository_dispatch:
types: [build-command]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: notify appflowy_builder
run: |
platform=${{ github.event.client_payload.slash_command.args.unnamed.arg1 }}
build_name=${{ github.event.client_payload.slash_command.args.named.build_name }}
branch=${{ github.event.client_payload.slash_command.args.named.ref }}
build_type=""
arch=""
if [ "$platform" = "android" ]; then
build_type="apk"
elif [ "$platform" = "macos" ]; then
arch="universal"
fi
params=$(jq -n \
--arg ref "main" \
--arg repo "LucasXu0/AppFlowy" \
--arg branch "$branch" \
--arg build_name "$build_name" \
--arg build_type "$build_type" \
--arg arch "$arch" \
'{ref: $ref, inputs: {repo: $repo, branch: $branch, build_name: $build_name, build_type: $build_type, arch: $arch}} | del(.inputs | .. | select(. == ""))')
echo "params: $params"
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/AppFlowy-IO/AppFlowy-Builder/actions/workflows/$platform.yaml/dispatches \
-d "$params"
================================================
FILE: .github/workflows/commit_lint.yml
================================================
name: Commit messages lint
on: [pull_request, push]
jobs:
commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: wagoid/commitlint-github-action@v4
================================================
FILE: .github/workflows/docker_ci.yml
================================================
name: Docker-CI
on:
push:
branches: [ "main", "release/*" ]
pull_request:
branches: [ "main", "release/*" ]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build-app:
if: github.event.pull_request.draft != true
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# cache the docker layers
# don't cache anything temporarly, because it always triggers "no space left on device" error
# - name: Cache Docker layers
# uses: actions/cache@v3
# with:
# path: /tmp/.buildx-cache
# key: ${{ runner.os }}-buildx-${{ github.sha }}
# restore-keys: |
# ${{ runner.os }}-buildx-
- name: Build the app
uses: docker/build-push-action@v5
with:
context: .
file: ./frontend/scripts/docker-buildfiles/Dockerfile
push: false
# cache-from: type=local,src=/tmp/.buildx-cache
# cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
# - name: Move cache
# run: |
# rm -rf /tmp/.buildx-cache
# mv /tmp/.buildx-cache-new /tmp/.buildx-cache
================================================
FILE: .github/workflows/flutter_ci.yaml
================================================
name: Flutter-CI
on:
push:
branches:
- "main"
- "release/*"
paths:
- ".github/workflows/flutter_ci.yaml"
- ".github/actions/flutter_build/**"
- "frontend/rust-lib/**"
- "frontend/appflowy_flutter/**"
- "frontend/resources/**"
pull_request:
branches:
- "main"
- "release/*"
paths:
- ".github/workflows/flutter_ci.yaml"
- ".github/actions/flutter_build/**"
- "frontend/rust-lib/**"
- "frontend/appflowy_flutter/**"
- "frontend/resources/**"
env:
CARGO_TERM_COLOR: always
FLUTTER_VERSION: "3.27.4"
RUST_TOOLCHAIN: "1.85.0"
CARGO_MAKE_VERSION: "0.37.18"
CLOUD_VERSION: 0.9.49-amd64
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
prepare-linux:
if: github.event.pull_request.draft != true
strategy:
fail-fast: true
matrix:
os: [ ubuntu-latest ]
include:
- os: ubuntu-latest
flutter_profile: development-linux-x86_64
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.os }}
steps:
# the following step is required to avoid running out of space
- name: Maximize build space
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- name: Checkout source code
uses: actions/checkout@v4
- name: Flutter build
uses: ./.github/actions/flutter_build
with:
os: ${{ matrix.os }}
flutter_version: ${{ env.FLUTTER_VERSION }}
rust_toolchain: ${{ env.RUST_TOOLCHAIN }}
cargo_make_version: ${{ env.CARGO_MAKE_VERSION }}
rust_target: ${{ matrix.target }}
flutter_profile: ${{ matrix.flutter_profile }}
prepare-windows:
if: github.event.pull_request.draft != true
strategy:
fail-fast: true
matrix:
os: [ windows-latest ]
include:
- os: windows-latest
flutter_profile: development-windows-x86
target: x86_64-pc-windows-msvc
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Flutter build
uses: ./.github/actions/flutter_build
with:
os: ${{ matrix.os }}
flutter_version: ${{ env.FLUTTER_VERSION }}
DISABLE_CI_TEST_LOG: "true"
rust_toolchain: ${{ env.RUST_TOOLCHAIN }}
cargo_make_version: ${{ env.CARGO_MAKE_VERSION }}
rust_target: ${{ matrix.target }}
flutter_profile: ${{ matrix.flutter_profile }}
prepare-macos:
if: github.event.pull_request.draft != true
strategy:
fail-fast: true
matrix:
os: [ macos-latest ]
include:
- os: macos-latest
flutter_profile: development-mac-x86_64
target: x86_64-apple-darwin
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Flutter build
uses: ./.github/actions/flutter_build
with:
os: ${{ matrix.os }}
flutter_version: ${{ env.FLUTTER_VERSION }}
rust_toolchain: ${{ env.RUST_TOOLCHAIN }}
cargo_make_version: ${{ env.CARGO_MAKE_VERSION }}
rust_target: ${{ matrix.target }}
flutter_profile: ${{ matrix.flutter_profile }}
unit_test:
needs: [ prepare-linux ]
if: github.event.pull_request.draft != true
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
include:
- os: ubuntu-latest
flutter_profile: development-linux-x86_64
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install Rust toolchain
id: rust_toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
target: ${{ matrix.target }}
override: true
profile: minimal
- name: Install flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ matrix.os }}
workspaces: |
frontend/rust-lib
cache-all-crates: true
- uses: taiki-e/install-action@v2
with:
tool: cargo-make@${{ env.CARGO_MAKE_VERSION }}, duckscript_cli
- name: Install prerequisites
working-directory: frontend
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
sudo apt-get update
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev libcurl4-openssl-dev
fi
shell: bash
- name: Enable Flutter Desktop
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
flutter config --enable-linux-desktop
elif [ "$RUNNER_OS" == "macOS" ]; then
flutter config --enable-macos-desktop
elif [ "$RUNNER_OS" == "Windows" ]; then
git config --system core.longpaths true
flutter config --enable-windows-desktop
fi
shell: bash
- uses: actions/download-artifact@v4
with:
name: ${{ github.run_id }}-${{ matrix.os }}
- name: Uncompress appflowy_flutter
run: tar -xf appflowy_flutter.tar.gz
- name: Run flutter pub get
working-directory: frontend
run: cargo make pub_get
- name: Run Flutter unit tests
env:
DISABLE_EVENT_LOG: true
DISABLE_CI_TEST_LOG: "true"
working-directory: frontend
run: |
if [ "$RUNNER_OS" == "macOS" ]; then
cargo make dart_unit_test
elif [ "$RUNNER_OS" == "Linux" ]; then
cargo make dart_unit_test_no_build
elif [ "$RUNNER_OS" == "Windows" ]; then
cargo make dart_unit_test_no_build
fi
shell: bash
cloud_integration_test:
needs: [ prepare-linux ]
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
include:
- os: ubuntu-latest
flutter_profile: development-linux-x86_64
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.os }}
steps:
- name: Checkout appflowy cloud code
uses: actions/checkout@v4
with:
repository: AppFlowy-IO/AppFlowy-Cloud
path: AppFlowy-Cloud
- name: Prepare appflowy cloud env
working-directory: AppFlowy-Cloud
run: |
# log level
cp deploy.env .env
sed -i 's|RUST_LOG=.*|RUST_LOG=trace|' .env
sed -i 's/GOTRUE_EXTERNAL_GOOGLE_ENABLED=.*/GOTRUE_EXTERNAL_GOOGLE_ENABLED=true/' .env
sed -i 's|GOTRUE_MAILER_AUTOCONFIRM=.*|GOTRUE_MAILER_AUTOCONFIRM=true|' .env
sed -i 's|API_EXTERNAL_URL=.*|API_EXTERNAL_URL=http://localhost|' .env
- name: Run Docker-Compose
working-directory: AppFlowy-Cloud
env:
APPFLOWY_CLOUD_VERSION: ${{ env.CLOUD_VERSION }}
APPFLOWY_HISTORY_VERSION: ${{ env.CLOUD_VERSION }}
APPFLOWY_WORKER_VERSION: ${{ env.CLOUD_VERSION }}
run: |
container_id=$(docker ps --filter name=appflowy-cloud-appflowy_cloud-1 -q)
if [ -z "$container_id" ]; then
echo "AppFlowy-Cloud container is not running. Pulling and starting the container..."
docker compose pull
docker compose up -d
echo "Waiting for the container to be ready..."
sleep 10
else
running_image=$(docker inspect --format='{{index .Config.Image}}' "$container_id")
if [ "$running_image" != "appflowy-cloud:$APPFLOWY_CLOUD_VERSION" ]; then
echo "AppFlowy-Cloud is running with an incorrect version. Restarting with the correct version..."
# Remove all containers if any exist
if [ "$(docker ps -aq)" ]; then
docker rm -f $(docker ps -aq)
else
echo "No containers to remove."
fi
# Remove all volumes if any exist
if [ "$(docker volume ls -q)" ]; then
docker volume rm $(docker volume ls -q)
else
echo "No volumes to remove."
fi
docker compose pull
docker compose up -d
echo "Waiting for the container to be ready..."
sleep 10
docker ps -a
docker compose logs
else
echo "AppFlowy-Cloud is running with the correct version."
fi
fi
- name: Checkout source code
uses: actions/checkout@v4
- name: Install flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- uses: taiki-e/install-action@v2
with:
tool: cargo-make@${{ env.CARGO_MAKE_VERSION }}
- name: Install prerequisites
working-directory: frontend
run: |
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
sudo apt-get update
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev libcurl4-openssl-dev
shell: bash
- name: Enable Flutter Desktop
run: |
flutter config --enable-linux-desktop
shell: bash
- uses: actions/download-artifact@v4
with:
name: ${{ github.run_id }}-${{ matrix.os }}
- name: Uncompressed appflowy_flutter
run: |
tar -xf appflowy_flutter.tar.gz
ls -al
- name: Run flutter pub get
working-directory: frontend
run: cargo make pub_get
- name: Run Flutter integration tests
working-directory: frontend/appflowy_flutter
run: |
export DISPLAY=:99
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
sudo apt-get install network-manager
docker ps -a
flutter test integration_test/desktop/cloud/cloud_runner.dart -d Linux --coverage
shell: bash
integration_test:
needs: [ prepare-linux ]
if: github.event.pull_request.draft != true
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
test_number: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
include:
- os: ubuntu-latest
target: "x86_64-unknown-linux-gnu"
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Flutter Integration Test ${{ matrix.test_number }}
uses: ./.github/actions/flutter_integration_test
with:
test_path: integration_test/desktop_runner_${{ matrix.test_number }}.dart
flutter_version: ${{ env.FLUTTER_VERSION }}
rust_toolchain: ${{ env.RUST_TOOLCHAIN }}
cargo_make_version: ${{ env.CARGO_MAKE_VERSION }}
rust_target: ${{ matrix.target }}
================================================
FILE: .github/workflows/ios_ci.yaml
================================================
name: iOS CI
on:
push:
branches:
- "main"
paths:
- ".github/workflows/mobile_ci.yaml"
- "frontend/**"
- "!frontend/appflowy_web_app/**"
pull_request:
branches:
- "main"
paths:
- ".github/workflows/mobile_ci.yaml"
- "frontend/**"
- "!frontend/appflowy_web_app/**"
env:
FLUTTER_VERSION: "3.27.4"
RUST_TOOLCHAIN: "1.85.0"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
integration-tests:
runs-on: macos-latest
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
target: aarch64-apple-ios-sim
override: true
profile: minimal
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- uses: Swatinem/rust-cache@v2
with:
prefix-key: macos-latest
workspaces: |
frontend/rust-lib
- uses: davidB/rust-cargo-make@v1
with:
version: "0.37.15"
- name: Install prerequisites
working-directory: frontend
run: |
rustup target install aarch64-apple-ios-sim
cargo install --force --locked duckscript_cli
cargo install cargo-lipo
cargo make appflowy-flutter-deps-tools
shell: bash
- name: Build AppFlowy
working-directory: frontend
run: |
cargo make --profile development-ios-arm64-sim appflowy-core-dev-ios
cargo make --profile development-ios-arm64-sim code_generation
# - uses: futureware-tech/simulator-action@v3
# id: simulator-action
# with:
# model: "iPhone 15"
# shutdown_after_job: false
# - name: Run AppFlowy on simulator
# working-directory: frontend/appflowy_flutter
# run: |
# flutter run -d ${{ steps.simulator-action.outputs.udid }} &
# pid=$!
# sleep 500
# kill $pid
# continue-on-error: true
# # Integration tests
# - name: Run integration tests
# working-directory: frontend/appflowy_flutter
# # The integration tests are flaky and sometimes fail with "Connection timed out":
# # Don't block the CI. If the tests fail, the CI will still pass.
# # Instead, we're using Code Magic to re-run the tests to check if they pass.
# continue-on-error: true
# run: flutter test integration_test/runner.dart -d ${{ steps.simulator-action.outputs.udid }}
================================================
FILE: .github/workflows/mobile_ci.yml
================================================
name: Mobile-CI
on:
workflow_dispatch:
inputs:
branch:
description: "Branch to build"
required: true
default: "main"
workflow_id:
description: "Codemagic workflow ID"
required: true
default: "ios-workflow"
type: choice
options:
- ios-workflow
- android-workflow
env:
CODEMAGIC_API_TOKEN: ${{ secrets.CODEMAGIC_API_TOKEN }}
APP_ID: "6731d2f427e7c816080c3674"
jobs:
trigger-mobile-build:
runs-on: ubuntu-latest
steps:
- name: Trigger Codemagic Build
id: trigger_build
run: |
RESPONSE=$(curl -X POST \
--header "Content-Type: application/json" \
--header "x-auth-token: $CODEMAGIC_API_TOKEN" \
--data '{
"appId": "${{ env.APP_ID }}",
"workflowId": "${{ github.event.inputs.workflow_id }}",
"branch": "${{ github.event.inputs.branch }}"
}' \
https://api.codemagic.io/builds)
BUILD_ID=$(echo $RESPONSE | jq -r '.buildId')
echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT
echo "build_id=$BUILD_ID"
- name: Wait for build and check status
id: check_status
run: |
while true; do
curl -X GET \
--header "Content-Type: application/json" \
--header "x-auth-token: $CODEMAGIC_API_TOKEN" \
https://api.codemagic.io/builds/${{ steps.trigger_build.outputs.build_id }} > /tmp/response.json
RESPONSE_WITHOUT_COMMAND=$(cat /tmp/response.json | jq 'walk(if type == "object" and has("subactions") then .subactions |= map(del(.command)) else . end)')
STATUS=$(echo $RESPONSE_WITHOUT_COMMAND | jq -r '.build.status')
if [ "$STATUS" = "finished" ]; then
SUCCESS=$(echo $RESPONSE_WITHOUT_COMMAND | jq -r '.success')
BUILD_URL=$(echo $RESPONSE_WITHOUT_COMMAND | jq -r '.buildUrl')
echo "status=$STATUS" >> $GITHUB_OUTPUT
echo "success=$SUCCESS" >> $GITHUB_OUTPUT
echo "build_url=$BUILD_URL" >> $GITHUB_OUTPUT
break
elif [ "$STATUS" = "failed" ]; then
echo "status=failed" >> $GITHUB_OUTPUT
break
fi
sleep 60
done
- name: Slack Notification
uses: 8398a7/action-slack@v3
if: always()
with:
status: ${{ steps.check_status.outputs.success == 'true' && 'success' || 'failure' }}
fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
text: |
Mobile CI Build Result
Branch: ${{ github.event.inputs.branch }}
Workflow: ${{ github.event.inputs.workflow_id }}
Build URL: ${{ steps.check_status.outputs.build_url }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.RELEASE_SLACK_WEBHOOK }}
================================================
FILE: .github/workflows/ninja_i18n.yml
================================================
name: Ninja i18n action
on:
pull_request_target:
# explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings
permissions:
pull-requests: write
jobs:
ninja-i18n:
name: Ninja i18n - GitHub Lint Action
runs-on: ubuntu-latest
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v4
- name: Run Ninja i18n
id: ninja-i18n
uses: opral/ninja-i18n-action@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/release.yml
================================================
name: release
on:
push:
tags:
- "*"
env:
FLUTTER_VERSION: "3.27.4"
RUST_TOOLCHAIN: "1.85.0"
jobs:
create-release:
runs-on: ubuntu-latest
env:
RELEASE_NOTES_PATH: /tmp/release_notes
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build release notes
run: |
touch ${{ env.RELEASE_NOTES_PATH }}
cat CHANGELOG.md | sed -e '/./{H;$!d;}' -e "x;/##\ Version\ ${{ github.ref_name }}/"'!d;' >> ${{ env.RELEASE_NOTES_PATH }}
- name: Create release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: v${{ github.ref }}
body_path: ${{ env.RELEASE_NOTES_PATH }}
# the package name should be with the format: AppFlowy-<version>-<os>-<arch>
build-for-windows:
name: ${{ matrix.job.target }} (${{ matrix.job.os }})
needs: create-release
env:
WINDOWS_APP_RELEASE_PATH: frontend\appflowy_flutter\product\${{ github.ref_name }}\windows
WINDOWS_ZIP_NAME: AppFlowy-${{ github.ref_name }}-windows-x86_64.zip
WINDOWS_INSTALLER_NAME: AppFlowy-${{ github.ref_name }}-windows-x86_64
runs-on: ${{ matrix.job.os }}
strategy:
fail-fast: false
matrix:
job:
- { target: x86_64-pc-windows-msvc, os: windows-2019 }
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
target: ${{ matrix.job.target }}
override: true
components: rustfmt
profile: minimal
- name: Install prerequisites
working-directory: frontend
run: |
vcpkg integrate install
cargo install --force --locked cargo-make
cargo install --force --locked duckscript_cli
- name: Build Windows app
working-directory: frontend
# the cargo make script has to be run separately because of file locking issues
run: |
flutter config --enable-windows-desktop
dart ./scripts/flutter_release_build/build_flowy.dart exclude-directives . ${{ github.ref_name }}
cargo make --env APP_VERSION=${{ github.ref_name }} --profile production-windows-x86 appflowy
dart ./scripts/flutter_release_build/build_flowy.dart include-directives . ${{ github.ref_name }}
- name: Archive Asset
uses: vimtor/action-zip@v1
with:
files: ${{ env.WINDOWS_APP_RELEASE_PATH }}\
dest: ${{ env.WINDOWS_APP_RELEASE_PATH }}\${{ env.WINDOWS_ZIP_NAME }}
- name: Copy installer config & icon file
working-directory: frontend
run: |
cp scripts/windows_installer/* ../${{ env.WINDOWS_APP_RELEASE_PATH }}
- name: Build installer executable
working-directory: ${{ env.WINDOWS_APP_RELEASE_PATH }}
run: |
iscc /F${{ env.WINDOWS_INSTALLER_NAME }} inno_setup_config.iss /DAppVersion=${{ github.ref_name }}
- name: Upload Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.WINDOWS_APP_RELEASE_PATH }}\${{ env.WINDOWS_ZIP_NAME }}
asset_name: ${{ env.WINDOWS_ZIP_NAME }}
asset_content_type: application/octet-stream
- name: Upload Installer Asset
id: upload-installer-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.WINDOWS_APP_RELEASE_PATH }}\Output\${{ env.WINDOWS_INSTALLER_NAME }}.exe
asset_name: ${{ env.WINDOWS_INSTALLER_NAME }}.exe
asset_content_type: application/octet-stream
build-for-macOS-x86_64:
name: ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}]
runs-on: ${{ matrix.job.os }}
needs: create-release
env:
MACOS_APP_RELEASE_PATH: frontend/appflowy_flutter/product/${{ github.ref_name }}/macos/Release
MACOS_X86_ZIP_NAME: AppFlowy-${{ github.ref_name }}-macos-x86_64.zip
MACOS_DMG_NAME: AppFlowy-${{ github.ref_name }}-macos-x86_64
strategy:
fail-fast: false
matrix:
job:
- { target: x86_64-apple-darwin, os: macos-13, extra-build-args: "" }
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
target: ${{ matrix.job.target }}
override: true
components: rustfmt
profile: minimal
- name: Install prerequisites
working-directory: frontend
run: |
cargo install --force --locked cargo-make
cargo install --force --locked duckscript_cli
- name: Build AppFlowy
working-directory: frontend
run: |
flutter config --enable-macos-desktop
dart ./scripts/flutter_release_build/build_flowy.dart run . ${{ github.ref_name }}
- name: Codesign AppFlowy
run: |
echo ${{ secrets.MACOS_CERTIFICATE }} | base64 --decode > certificate.p12
security create-keychain -p action build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p action build.keychain
security import certificate.p12 -k build.keychain -P ${{ secrets.MACOS_CERTIFICATE_PWD }} -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k action build.keychain
/usr/bin/codesign --force --options runtime --deep --sign "${{ secrets.MACOS_CODESIGN_ID }}" "${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" -v
- name: Create macOS dmg
run: |
brew install create-dmg
i=0
until [[ -e "${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg" ]]; do
create-dmg \
--volname ${{ env.MACOS_DMG_NAME }} \
--hide-extension "AppFlowy.app" \
--background frontend/scripts/dmg_assets/AppFlowyInstallerBackground.jpg \
--window-size 600 450 \
--icon-size 94 \
--icon "AppFlowy.app" 141 249 \
--app-drop-link 458 249 \
"${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg" \
"${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" || true
if [[ $i -eq 10 ]]; then
echo 'Error: create-dmg did not succeed even after 10 tries.'
exit 1
fi
i=$((i+1))
done
- name: Notarize AppFlowy
run: |
xcrun notarytool submit ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg --apple-id ${{ secrets.MACOS_NOTARY_USER }} --team-id ${{ secrets.MACOS_TEAM_ID }} --password ${{ secrets.MACOS_NOTARY_PWD }} -v -f "json" --wait
- name: Archive Asset
working-directory: ${{ env.MACOS_APP_RELEASE_PATH }}
run: zip --symlinks -qr ${{ env.MACOS_X86_ZIP_NAME }} AppFlowy.app
- name: Upload Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_X86_ZIP_NAME }}
asset_name: ${{ env.MACOS_X86_ZIP_NAME }}
asset_content_type: application/octet-stream
- name: Upload DMG Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg
asset_name: ${{ env.MACOS_DMG_NAME }}.dmg
asset_content_type: application/octet-stream
build-for-macOS-universal:
name: ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}]
runs-on: ${{ matrix.job.os }}
needs: create-release
env:
MACOS_APP_RELEASE_PATH: frontend/appflowy_flutter/product/${{ github.ref_name }}/macos/Release
MACOS_AARCH64_ZIP_NAME: AppFlowy-${{ github.ref_name }}-macos-universal.zip
MACOS_DMG_NAME: AppFlowy-${{ github.ref_name }}-macos-universal
strategy:
fail-fast: false
matrix:
job:
- {
targets: "aarch64-apple-darwin,x86_64-apple-darwin",
os: macos-14,
extra-build-args: "",
}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
targets: ${{ matrix.job.targets }}
components: rustfmt
- name: Install prerequisites
working-directory: frontend
run: |
cargo install --force --locked cargo-make
cargo install --force --locked duckscript_cli
- name: Build AppFlowy
working-directory: frontend
run: |
flutter config --enable-macos-desktop
sh scripts/flutter_release_build/build_universal_package_for_macos.sh ${{ github.ref_name }}
- name: Codesign AppFlowy
run: |
echo ${{ secrets.MACOS_CERTIFICATE }} | base64 --decode > certificate.p12
security create-keychain -p action build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p action build.keychain
security import certificate.p12 -k build.keychain -P ${{ secrets.MACOS_CERTIFICATE_PWD }} -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k action build.keychain
/usr/bin/codesign --force --options runtime --deep --sign "${{ secrets.MACOS_CODESIGN_ID }}" "${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" -v
- name: Create macOS dmg
run: |
brew install create-dmg
create-dmg \
--volname ${{ env.MACOS_DMG_NAME }} \
--hide-extension "AppFlowy.app" \
--background frontend/scripts/dmg_assets/AppFlowyInstallerBackground.jpg \
--window-size 600 450 \
--icon-size 94 \
--icon "AppFlowy.app" 141 249 \
--app-drop-link 458 249 \
"${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg" \
"${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app"
- name: Notarize AppFlowy
run: |
xcrun notarytool submit ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg --apple-id ${{ secrets.MACOS_NOTARY_USER }} --team-id ${{ secrets.MACOS_TEAM_ID }} --password ${{ secrets.MACOS_NOTARY_PWD }} -v -f "json" --wait
- name: Archive Asset
working-directory: ${{ env.MACOS_APP_RELEASE_PATH }}
run: zip --symlinks -qr ${{ env.MACOS_AARCH64_ZIP_NAME }} AppFlowy.app
- name: Upload Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_AARCH64_ZIP_NAME }}
asset_name: ${{ env.MACOS_AARCH64_ZIP_NAME }}
asset_content_type: application/octet-stream
- name: Upload DMG Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg
asset_name: ${{ env.MACOS_DMG_NAME }}.dmg
asset_content_type: application/octet-stream
build-for-linux:
name: ${{ matrix.job.target }} (${{ matrix.job.os }}) [${{ matrix.job.extra-build-args }}]
runs-on: ${{ matrix.job.os }}
needs: create-release
env:
LINUX_APP_RELEASE_PATH: frontend/appflowy_flutter/product/${{ github.ref_name }}/linux/Release
LINUX_ZIP_NAME: AppFlowy-${{ matrix.job.target }}-x86_64.tar.gz
LINUX_PACKAGE_DEB_NAME: AppFlowy-${{ github.ref_name }}-linux-x86_64.deb
LINUX_PACKAGE_RPM_NAME: AppFlowy-${{ github.ref_name }}-linux-x86_64.rpm
LINUX_PACKAGE_TMP_RPM_NAME: AppFlowy-${{ github.ref_name }}-2.x86_64.rpm
LINUX_PACKAGE_TMP_APPIMAGE_NAME: AppFlowy-${{ github.ref_name }}-x86_64.AppImage
LINUX_PACKAGE_APPIMAGE_NAME: AppFlowy-${{ github.ref_name }}-linux-x86_64.AppImage
LINUX_PACKAGE_ZIP_NAME: AppFlowy-${{ github.ref_name }}-linux-x86_64.tar.gz
strategy:
fail-fast: false
matrix:
job:
- {
arch: x86_64,
target: x86_64-unknown-linux-gnu,
os: ubuntu-22.04,
extra-build-args: "",
flutter_profile: production-linux-x86_64,
}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
target: ${{ matrix.job.target }}
override: true
components: rustfmt
profile: minimal
- name: Install prerequisites
working-directory: frontend
run: |
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo apt-get update
sudo apt-get install -y build-essential libsqlite3-dev libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev libcurl4-openssl-dev
sudo apt-get install keybinder-3.0
sudo apt-get install -y alien libnotify-dev
sudo apt install libfuse2
source $HOME/.cargo/env
cargo install --force --locked cargo-make
cargo install --force --locked duckscript_cli
rustup target add ${{ matrix.job.target }}
- name: Install gcc-aarch64-linux-gnu
if: ${{ matrix.job.target == 'aarch64-unknown-linux-gnu' }}
working-directory: frontend
run: |
sudo apt-get install -qy binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libgtk-3-0
- name: Build AppFlowy
working-directory: frontend
run: |
flutter config --enable-linux-desktop
dart ./scripts/flutter_release_build/build_flowy.dart run . ${{ github.ref_name }}
- name: Archive Asset
working-directory: ${{ env.LINUX_APP_RELEASE_PATH }}
run: tar -czf ${{ env.LINUX_ZIP_NAME }} *
- name: Build Linux package (.deb)
working-directory: frontend
run: |
sh scripts/linux_distribution/deb/build_deb.sh appflowy_flutter/product/${{ github.ref_name }}/linux/Release ${{ github.ref_name }} ${{ env.LINUX_PACKAGE_DEB_NAME }}
- name: Build Linux package (.rpm)
working-directory: ${{ env.LINUX_APP_RELEASE_PATH }}
run: |
sudo alien -r ${{ env.LINUX_PACKAGE_DEB_NAME }}
cp -r ${{ env.LINUX_PACKAGE_TMP_RPM_NAME }} ${{ env.LINUX_PACKAGE_RPM_NAME }}
- name: Build Linux package (.AppImage)
working-directory: frontend
continue-on-error: true
run: |
sh scripts/linux_distribution/appimage/build_appimage.sh ${{ github.ref_name }}
cd ..
cp -r frontend/${{ env.LINUX_PACKAGE_TMP_APPIMAGE_NAME }} ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_PACKAGE_APPIMAGE_NAME }}
- name: Upload Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_ZIP_NAME }}
asset_name: ${{ env.LINUX_PACKAGE_ZIP_NAME }}
asset_content_type: application/octet-stream
- name: Upload Debian package
id: upload-release-asset-install-package-deb
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_PACKAGE_DEB_NAME }}
asset_name: ${{ env.LINUX_PACKAGE_DEB_NAME }}
asset_content_type: application/octet-stream
- name: Upload RPM package
id: upload-release-asset-install-package-rpm
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_PACKAGE_RPM_NAME }}
asset_name: ${{ env.LINUX_PACKAGE_RPM_NAME }}
asset_content_type: application/octet-stream
- name: Upload AppImage package
id: upload-release-asset-install-package-appimage
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LINUX_APP_RELEASE_PATH }}/${{ env.LINUX_PACKAGE_APPIMAGE_NAME }}
asset_name: ${{ env.LINUX_PACKAGE_APPIMAGE_NAME }}
asset_content_type: application/octet-stream
build-for-docker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./frontend/scripts/docker-buildfiles/Dockerfile
builder: ${{ steps.buildx.outputs.name }}
push: true
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/appflowy_client:${{ github.ref_name }}
cache-from: type=registry,ref=${{ secrets.DOCKER_HUB_USERNAME }}/af_build_cache:buildcache
cache-to: type=registry,ref=${{ secrets.DOCKER_HUB_USERNAME }}/af_build_cache:buildcache,mode=max
notify-failure:
runs-on: ubuntu-latest
needs:
- build-for-macOS-x86_64
- build-for-windows
- build-for-linux
if: failure()
steps:
- uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: |
🔴🔴🔴Workflow ${{ github.workflow }} in repository ${{ github.repository }} was failed 🔴🔴🔴.
fields: repo,message,author,eventName,ref,workflow
env:
SLACK_WEBHOOK_URL: ${{ secrets.RELEASE_SLACK_WEBHOOK }}
if: always()
notify-discord:
runs-on: ubuntu-latest
needs:
[
build-for-linux,
build-for-windows,
build-for-macOS-x86_64,
build-for-macOS-universal,
]
steps:
- name: Notify Discord
run: |
curl -H "Content-Type: application/json" -d '{"username": "release@appflowy", "content": "🎉 AppFlowy ${{ github.ref_name }} is available. https://github.com/AppFlowy-IO/AppFlowy/releases/tag/'${{ github.ref_name }}'"}' "https://discord.com/api/webhooks/${{ secrets.DISCORD }}"
shell: bash
================================================
FILE: .github/workflows/rust_ci.yaml
================================================
name: Rust-CI
on:
push:
branches:
- "main"
- "develop"
- "release/*"
paths:
- "frontend/rust-lib/**"
- ".github/workflows/rust_ci.yaml"
pull_request:
branches:
- "main"
- "develop"
- "release/*"
env:
CARGO_TERM_COLOR: always
CLOUD_VERSION: 0.9.49-amd64
RUST_TOOLCHAIN: "1.85.0"
jobs:
ubuntu-job:
runs-on: ubuntu-latest
steps:
- name: Set timezone for action
uses: szenius/set-timezone@v2.0
with:
timezoneLinux: "US/Pacific"
- name: Maximize build space
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
sudo docker image prune --all --force
- name: Checkout source code
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
override: true
components: rustfmt, clippy
profile: minimal
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ runner.os }}
cache-on-failure: true
workspaces: |
frontend/rust-lib
- name: Checkout appflowy cloud code
uses: actions/checkout@v4
with:
repository: AppFlowy-IO/AppFlowy-Cloud
path: AppFlowy-Cloud
- name: Prepare appflowy cloud env
working-directory: AppFlowy-Cloud
run: |
cp deploy.env .env
sed -i 's|RUST_LOG=.*|RUST_LOG=trace|' .env
sed -i 's|GOTRUE_MAILER_AUTOCONFIRM=.*|GOTRUE_MAILER_AUTOCONFIRM=true|' .env
sed -i 's|API_EXTERNAL_URL=.*|API_EXTERNAL_URL=http://localhost|' .env
- name: Ensure AppFlowy-Cloud is Running with Correct Version
working-directory: AppFlowy-Cloud
env:
APPFLOWY_CLOUD_VERSION: ${{ env.CLOUD_VERSION }}
APPFLOWY_HISTORY_VERSION: ${{ env.CLOUD_VERSION }}
APPFLOWY_WORKER_VERSION: ${{ env.CLOUD_VERSION }}
run: |
# Remove all containers if any exist
if [ "$(docker ps -aq)" ]; then
docker rm -f $(docker ps -aq)
else
echo "No containers to remove."
fi
# Remove all volumes if any exist
if [ "$(docker volume ls -q)" ]; then
docker volume rm $(docker volume ls -q)
else
echo "No volumes to remove."
fi
docker compose pull
docker compose up -d
echo "Waiting for the container to be ready..."
sleep 10
docker ps -a
docker compose logs
- name: Run rust-lib tests
working-directory: frontend/rust-lib
env:
RUST_LOG: info
RUST_BACKTRACE: 1
af_cloud_test_base_url: http://localhost
af_cloud_test_ws_url: ws://localhost/ws/v1
af_cloud_test_gotrue_url: http://localhost/gotrue
run: |
DISABLE_CI_TEST_LOG="true" cargo test --no-default-features --features="dart" -- --skip local_ollama_test
- name: rustfmt rust-lib
run: cargo fmt --all -- --check
working-directory: frontend/rust-lib/
- name: clippy rust-lib
run: cargo clippy --all-targets -- -D warnings
working-directory: frontend/rust-lib
- name: "Debug: show Appflowy-Cloud container logs"
if: failure()
working-directory: AppFlowy-Cloud
run: |
docker compose logs appflowy_cloud
- name: Clean up Docker images
run: |
docker image prune -af
docker volume prune -f
================================================
FILE: .github/workflows/rust_coverage.yml
================================================
name: Rust code coverage
on:
push:
branches:
- "main"
- "release/*"
paths:
- "frontend/rust-lib/**"
env:
CARGO_TERM_COLOR: always
FLUTTER_VERSION: "3.27.4"
RUST_TOOLCHAIN: "1.85.0"
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Install Rust toolchain
id: rust_toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
target: ${{ matrix.job.target }}
override: true
profile: minimal
- name: Install flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- name: Install prerequisites
working-directory: frontend
run: |
cargo install --force --locked cargo-make
cargo install --force --locked duckscript_cli
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ${{ matrix.job.os }}
- name: Install code-coverage tools
working-directory: frontend
run: |
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
sudo apt-get update
sudo apt-get install keybinder-3.0
cargo install grcov
rustup component add llvm-tools-preview
- name: Run tests
working-directory: frontend
run: cargo make rust_unit_test_with_coverage
================================================
FILE: .github/workflows/translation_notify.yml
================================================
name: Translation Notify
on:
push:
branches: [ main ]
paths:
- "frontend/appflowy_flutter/assets/translations/en.json"
jobs:
Discord-Notify:
runs-on: ubuntu-latest
steps:
- uses: Ilshidur/action-discord@master
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
with:
args: |
@appflowytranslators English UI strings has been updated.
Link to changes: ${{github.event.compare}}
================================================
FILE: .gitignore
================================================
# Generated by Cargo
# will have compiled files and executables
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
# backend
/target/
# These are backup files generated by rustfmt
**/*.rs.bk
**/target/
**/*.db
.idea/
**/temp/**
.ruby-version
package-lock.json
yarn.lock
node_modules
**/.proto_cache
**/.cache
**/.DS_Store
**/resources/proto
# ignore settings.json
frontend/.vscode/settings.json
# Commit the highest level pubspec.lock, but ignore the others
pubspec.lock
!frontend/appflowy_flutter/pubspec.lock
# ignore tool used for commit linting
.githooks/gitlint
.githooks/gitlint.exe
.fvm/
**/AppFlowy-Collab/
# ignore generated assets
frontend/package
frontend/*.deb
**/Cargo.toml.bak
**/.cargo/**
================================================
FILE: CHANGELOG.md
================================================
# Release Notes
## Version 0.9.9 – 11/09/2025
### Desktop
#### New Features
- Workspace user profile: customize your avatar, about me, and profile card banner
### Mobile
#### New Features
- Workspace user profile: customize your avatar, about me, and profile card banner
- Two new Android widgets: Recent Pages and Favorites
- A new iOS widget: Quick Page Access
- iOS Share to AppFlowy: quickly save browser page links with optional notes to a target AppFlowy page
## Version 0.9.8 – 28/08/2025
### Desktop
#### New Features
- Bulk add collaborators with Can view / Can edit permissions via the Share menu
- Enable setting the start of the week to Monday to control default calendar layouts in the calendar view and date picker
- Sync date and time formats, language, and week start day across devices under the same user account
- Offer 10 premium Select-option colors to Pro Plan users
- Support managing pending members via Settings → Members
### Mobile
#### New Features
- Support iOS widgets for quick access to recent and favorite pages
- Offer 10 premium Select option colors to Pro Plan users
- Support managing pending members via Settings → Members
## Version 0.9.7 – 13/08/2025
### Desktop
#### New Features
- Mention or assign persons in documents via '@' or '/'
- Mentioned persons get notified about the mention via email
- More colors are available for database Select options and page covers
- Back up your AppFlowy workspace: Export your workspace as a ZIP file and import it back at any time
- GPT-5 is now available in AppFlowy
### Mobile
#### New Features
- Mention or assign persons in documents via '@' or '/'
- Mentioned persons get notified about the mention via email
- More colors are available for database Select options and page cover
#### Bug Fixes
- Fixed login page UI overflow issues on small screen devices
## Version 0.9.6 – 05/08/2025
### Bug Fixes
- Fixed some syncing issues
- Improved the Share menu
- Fixed some UI issues related to database filters and sorts
## Version 0.9.5 – 17/07/2025
### Desktop
#### New Features
- Vault Workspace: A new workspace type, private and offline. AI runs locally with no data transfer. Supports switching embedding models, chatting with files (PDF, Markdown, TXT). Includes RAG search with AI-generated overviews.
- Revamped color pickers in documents: Expanded palette with support for custom colors
### Mobile
#### New Features
- iOS In‑App Sign‑In: Sign in directly within the iOS app
- New colors: Improved text and background color options
Bug Fixes
- Add a network connection indicator
- Fix sync bugs and issues with WebSocket connections.
## Version 0.9.4 – 02/07/2025
### Desktop
#### New Features
- Private page sharing: Add members to private pages with Can View or Can Edit permissions
- Guest editor collaboration: Invite non-members (guest editors) to collaborate in real-time on your pages
- Shared with me: Browse all pages shared with you under the new Shared with me section
- New syncing protocol: Optimized for faster, more reliable multi-user and multi-device data sync
### Mobile
#### New Features
- Shared page collaboration: View and edit pages that have been shared with you on iOS and Android
- New syncing protocol: Optimized for faster, more reliable multi-user and multi-device data sync
## Version 0.9.3 - 28/05/2025
### Desktop
#### New Features
- Meet AppFlowy Workspace AI Search: Quickly find pages by searching titles, keywords, or asking natural-language questions
- AI Overviews: Ask natural questions and receive instant AI-generated summaries with source links, inspired by Google's AI Overviews
- Revamped Search Panel: A cleaner, smarter interface to help you search faster and more effectively
- Custom Prompts: Load a database page as the source for your own custom AI prompts
#### Bug Fixes
- Fixed misalignment in database view after setting maxDocumentWidth
- Centered embedded link when the site name is empty
- Fixed issue where row observer was not clearing as expected
- Fixed issue where workspace name reverted after being updated
- Aligned checkbox icon with the first line of text
### Mobile
#### New Features
- Meet AppFlowy Workspace AI Search: Quickly find pages by searching titles, keywords, or asking natural-language questions
- AI Overviews: Ask natural questions and receive instant AI-generated summaries with source links, inspired by Google's AI Overviews
- Revamped Search Tab: A redesigned interface that helps you find what you need more efficiently
#### Bug Fixes
- Fixed issue where font size reset after restarting the app
## Version 0.9.2 - 14/05/2025
### Desktop
#### New Features
- Supported AI Overview in Search to answer user queries based on their entire workspace
- Revamped the Search panel in the desktop app
- Enabled loading custom prompts from an AppFlowy database page
#### Bug Fixes
- Improved inserting emojis using the colon (:)
- Supported automatically filling the link name with the URL if the name is left empty
### Mobile
#### Bug Fixes
- Supported automatically filling the link name with the URL if the name is left empty
## Version 0.9.1 - 01/05/2025
### Desktop
#### New Features
- Added AppFlowy Prompt Library to AI Chat and Document's Ask AI
- Revamped the desktop in-app notification center
- Supported login with password, as well as forgot and change password options
- Supported copying link to invite members
- Improved the Settings' Members tab with new metadata: member avatar and joined time
#### Bug Fixes
- Fixed data loss when using anonymous local
- Fixed crash when trying to delete an emoji
- Fixed Windows scaling issue
- Correctly displayed mention text by decoding web content
### Mobile
#### New Features
- Supported workspace search
- Improved UX for links in documents
- Supported changing password in Mobile Settings
- Added support for inviting members via links
#### Bug Fixes
- Correctly displayed mention text by decoding web content
## Version 0.9.0 - 30/04/2025
### Desktop
#### New Features
- Added AppFlowy Prompt Library to AI Chat and Document's Ask AI
- Revamped the desktop in-app notification center
- Supported login with password, as well as forgot and change password options
- Supported copying link to invite members
- Improved the Settings' Members tab with new metadata: member avatar and joined time
#### Bug Fixes
- Fixed crash when trying to delete an emoji
- Fixed Windows scaling issue
- Correctly displayed mention text by decoding web content
### Mobile
#### New Features
- Supported workspace search
- Improved UX for links in documents
- Supported changing password in Mobile Settings
- Added support for inviting members via links
#### Bug Fixes
- Correctly displayed mention text by decoding web content
## Version 0.8.9 - 16/04/2025
### Desktop
#### New Features
- Supported pasting a link as a mention, providing a more condensed visualization of linked content
- Supported converting between link formats (e.g. transforming a mention into a bookmark)
- Improved the link editing experience with enhanced UX
- Added OTP (One-Time Password) support for sign-in authentication
- Added latest AI models: GPT-4.1, GPT-4.1-mini, and Claude 3.7 Sonnet
#### Bug Fixes
- Fixed an issue where properties were not displaying in the row detail page
- Fixed a bug where Undo didn't work in the row detail page
- Fixed an issue where blocks didn't grow when the grid got bigger
- Fixed several bugs related to AI writers
### Mobile
#### New Features
- Added sign-in with OTP (One-Time Password)
#### Bug Fixes
- Fixed an issue where the slash menu sometimes failed to display
- Updated the mention page block to handle page selection with more context.
## Version 0.8.8 - 01/04/2025
### New Features
- Added support for selecting AI models in AI writer
- Revamped link menu in toolbar
- Added support for using ":" to add emojis in documents
- Passed the history of past AI prompts and responses to AI writer
### Bug Fixes
- Improved AI writer scrolling user experience
- Fixed issue where checklist items would disappear during reordering
- Fixed numbered lists generated by AI to maintain the same index as the input
## Version 0.8.7 - 18/03/2025
### New Features
- Made local AI free and integrated with Ollama
- Supported nested lists within callout and quote blocks
- Revamped the document's floating toolbar and added Turn Into
- Enabled custom icons in callout blocks
### Bug Fixes
- Fixed occasional incorrect positioning of the slash menu
- Improved AI Chat and AI Writers with various bug fixes
- Adjusted the columns block to match the width of the editor
- Fixed a potential segfault caused by infinite recursion in the trash view
- Resolved an issue where the first added cover might be invisible
- Fixed adding cover images via Unsplash
## Version 0.8.6 - 06/03/2025
### Bug Fixes
- Fix the incorrect title positioning when adjusting the document width setting
- Enhance the user experience of the icon color picker for smoother interactions
- Add missing icons to the database to ensure completeness and consistency
- Resolve the issue with links not functioning correctly on Linux systems
- Improve the outline feature to work seamlessly within columns
- Center the bulleted list icon within columns for better visual alignment
- Enable dragging blocks under tables in the second column to enhance flexibility
- Disable the AI writer feature within tables to prevent conflicts and improve usability
- Automatically enable the header row when converting content from Markdown to ensure proper formatting
- Use the "Undo" function to revert the auto-formatting
## Version 0.8.5 - 04/03/2025
### New Features
- Columns in Documents: Arrange content side by side using drag-and-drop or the slash menu
- AI Writers: New AI assistants in documents with response formatting options (list, table, text with images, image-only), follow-up questions, contextual memory, and more
- Compact Mode for Databases: Enable compact mode for grid and kanban views (full-page and inline) to increase information density, displaying more data per screen
### Bug Fixes
- Fixed an issue where callout blocks couldn’t be deleted when appearing as the first line in a document
- Fixed a bug preventing the relation field in databases from opening
- Fixed an issue where links in documents were unclickable on Linux
## Version 0.8.4 - 18/02/2025
### New Features
- Switch AI mode on mobile
- Support locking page
- Support uploading svg file as icon
- Support the slash, at, and plus menus on mobile
### Bug Fixes
- Gallery not rendering in row page
- Save image should not copy the image (mobile)
- Support exporting more content to markdown
## Version 0.8.2 - 23/01/2025
### New Features
- Customized database view icons
- Support for uploading images as custom icons
- Enabled selecting multiple AI messages to save into a document
- Added the ability to scale the app's display size on mobile
- Support for pasting image links without file extensions
### Bug Fixes
- Fixed an issue where pasting tables from other apps wasn't working
- Fixed homepage URL issues in Settings
- Fixed an issue where the 'Cancel' button was not visible on the Shortcuts page
## Version 0.8.1 - 14/01/2025
### New Features
- AI Chat Layout Options: Customize how AI responses appear with new layouts—List, Table, Image with Text, and Media Only
- DALL-E Integration: Generate stunning AI images from text prompts, now available in AI Chat
- Improved Desktop Search: Find what you need faster using keywords or by asking questions in natural language
- Self-Hosting: Configure web server URLs directly in Settings to enable features like Publish, Copy Link to Share, Custom URLs, and more
- Sidebar Enhancement: Drag to reorder your favorited pages in the Sidebar
- Mobile Table Resizing: Adjust column widths in Simple Tables by long pressing the column borders on mobile
### Bug Fixes
- Resolved an icon rendering issue in callout blocks, tab bars, and search results
- Enhanced image reliability: Retry functionality ensures images load successfully if the first attempt fails
## Version 0.8.0 - 06/01/2025
### Bug Fixes
- Fixed error displaying in the page style menu
- Fixed filter logic in the icon picker
- Fixed error displaying in the Favorite/Recent page
- Fixed the color picker displaying when tapping down
- Fixed icons not being supported in subpage blocks
- Fixed recent icon functionality in the space icon menu
- Fixed "Insert Below" not auto-scrolling the table
- Fixed a to-do item with an emoji automatically creating a soft break
- Fixed header row/column tap areas being too small
- Fixed simple table alignment not working for items that wrap
- Fixed web content reverting after removing the inline code format on desktop
- Fixed inability to make changes to a row or column in the table when opening a new tab
- Fixed changing the language to CKB-KU causing a gray screen on mobile
## Version 0.7.9 - 30/12/2024
### New Features
- Meet AppFlowy Web (Lite): Use AppFlowy directly in your browser.
- Create beautiful documents with 22 content types and markdown support
- Use Quick Note to save anything you want to remember—like meeting notes, a grocery list, or to-dos
- Invite members to your workspace for seamless collaboration
- Create multiple public/private spaces to better organize your content
- Simple Table is now available on Mobile, designed specifically for mobile devices.
- Create and manage Simple Table blocks on Mobile with easy-to-use action menus.
- Use the '+' button in the fixed toolbar to easily add a content block into a table cell on Mobile
- Use '/' to insert a content block into a table cell on Desktop
- Add pages as AI sources in AI chat, enabling you to ask questions about the selected sources
- Add messages to an editable document while chatting with AI side by side
- The new Emoji menu now includes Icons with a Recent section for quickly reusing emojis/icons
- Drag a page from the sidebar into a document to easily mention the page without typing its title
- Paste as plain text, a new option in the right-click paste menu
### Bug Fixes
- Fixed misalignment in numbered lists
- Resolved several bugs in the emoji menu
- Fixed a bug with checklist items
## Version 0.7.8 - 18/12/2024
### New Features
<img width="1068" alt="image" src="https://github.com/user-attachments/assets/cf8bd287-f370-4291-8638-76e2bbf4aaac" />
- Meet Simple Table 2.0:
- Insert a list into a table cell
- Insert images, quotes, callouts, and code blocks into a table cell
- Drag to move rows or columns
- Toggle header rows or columns on/off
- Distribute columns evenly
- Adjust to page width
- Enjoy a new UI/UX for a seamless experience
- Revamped mention page interactions in AI Chat
- Improved AppFlowy AI service
### Bug Fixes
- Fixed an error when opening files in the database in local mode
- Fixed arrow up/down navigation not working for selecting a language in Code Block
- Fixed an issue where deleting multiple blocks using the drag button on the document page didn’t work
## Version 0.7.7 - 09/12/2024
### Bug Fixes
- Fixed sidebar menu resize regression
- Fixed AI chat loading issues
- Fixed inability to open local files in database
- Fixed mentions remaining in notifications after removal from document
- Fixed event card closing when clicking on empty space
- Fixed keyboard shortcut issues
## Version 0.7.6 - 03/12/2024
### New Features
- Revamped the simple table UI
- Added support for capturing images from camera on mobile
### Bug Fixes
- Improved markdown rendering capabilities in AI writer
- Fixed an issue where pressing Enter on a collapsed toggle list would add an unnecessary new line
- Fixed an issue where creating a document from slash menu could insert content at incorrect position
## Version 0.7.5 - 25/11/2024
### Bug Fixes
- Improved chat response parsing
- Fixed toggle list icon direction for RTL mode
- Fixed cross blocks formatting not reflecting in float toolbar
- Fixed unable to click inside the toggle list to create a new paragraph
- Fixed open file error 50 on macOS
- Fixed upload file exceed limit error
## Version 0.7.4 - 19/11/2024
### New Features
- Support uploading WebP and BMP images
- Support managing workspaces on mobile
- Support adding toggle headings on mobile
- Improve the AI chat page UI
### Bug Fixes
- Optimized the workspace menu loading performance
- Optimized tab switching performance
- Fixed searching issues in Document page
## Version 0.7.3 - 07/11/2024
### New Features
- Enable custom URLs for published pages
- Support toggling headings
- Create a subpage by typing in the document
- Turn selected blocks into a subpage
- Add a manual date picker for the Date property
### Bug Fixes
- Fixed an issue where the workspace owner was unable to delete spaces created by others
- Fixed cursor height inconsistencies with text height
- Fixed editing issues in Kanban cards
- Fixed an issue preventing images or files from being dropped into empty paragraphs
## Version 0.7.2 - 22/10/2024
### New Features
- Copy link to block
- Support turn into in document
- Enable sharing links and publishing pages on mobile
- Enable drag and drop in row documents
- Right-click on page in sidebar to open more actions
- Create new subpage in document using `+` character
- Allow reordering checklist item
### Bug Fixes
- Fixed issue with inability to cancel inline code format in French IME
- Fixed delete with Shift or Ctrl shortcuts not working in documents
- Fixed the issues with incorrect time zone being used in filters.
## Version 0.7.1 - 07/10/2024
### New Features
- Copy link to share and open it in a browser
- Enable the ability to edit the page title within the body of the document
- Filter by last modified, created at, or a date range
- Allow customization of database property icons
- Support CTRL/CMD+X to delete the current line when the selection is collapsed in the document
- Support window tiling on macOS
- Add filters to grid views on mobile
- Create and manage workspaces on mobile
- Automatically convert property types for imported CSV files
### Bug Fixes
- Fixed calculations with filters applied
- Fixed issues with importing data folders into a cloud account
- Fixed French IME backtick issues
- Fixed selection gesture bugs on mobile
## Version 0.7.0 - 19/09/2024
### New Features
- Support reordering blocks in document with drag and drop
- Support for adding a cover to a row/card in databases
- Added support for accessing settings on the sign-in page
- Added "Move to" option to the document menu in top right corner
- Support for adjusting the document width from settings
- Show full name of a group on hover
- Colored group names in kanban boards
- Support "Ask AI" on multiple lines of text
- Support for keyboard gestures to move cursor on Mobile
- Added markdown support for quickly inserting a code block using three backticks
### Bug Fixes
- Fixed a critical bug where the backtick character would crash the application
- Fixed an issue with signing-in from the settings dialog where the dialog would persist
- Fixed a visual bug with icon alignment in primary cell of database rows
- Fixed a bug with filters applied where new rows were inserted in wrong position
- Fixed a bug where "Untitled" would override the name of the row
- Fixed page title not updating after renaming from "More"-menu
- Fixed File block breaking row detail document
- Fixed issues with reordering rows with sorting rules applied
- Improvements to the File & Media type in Database
- Performance improvement in Grid view
- Fixed filters sometimes not applying properly in databases
## Version 0.6.9 - 09/09/2024
### New Features
- Added a new property type, 'Files & media'
- Supported Apple Sign-in
- Displayed the page icon next to the row name when the row page contains nested notes
- Enabled Delete Account in Settings
- Included a collapsible navigation menu in your published site
### Bug Fixes
- Fixed the space name color issue in the community themes
- Fixed database filters and sorting issues
- Fixed the issue of not being able to fully display the title on Kanban cards
- Fixed the inability to see the entire text of a checklist item when it's more than one line long
- Fixed hide/unhide buttons in the No Status group
- Fixed the inability to edit group names on Kanban boards
- Made error codes more user-friendly
- Added leading zeros to day and month in date format
## Version 0.6.8 - 22/08/2024
### New Features
- Enabled viewing data inside a database record on mobile.
- Added the ability to invite members to a workspace on mobile.
- Introduced Ask AI in the Home tab on mobile.
- Import CSV files with up to 1,000 rows.
- Convert properties from one type to another while preserving the data.
- Optimized the speed of opening documents and databases.
- Improved syncing performance across devices.
- Added support for a monochrome app icon on Android.
### Bug Fixes
- Removed the Wayland header from the AppImage build.
- Fixed the issue where pasting a web image on mobile failed.
- Corrected the Local AI state when switching between different workspaces.
- Fixed high CPU usage when opening large databases.
## Version 0.6.7 - 13/08/2024
### New Features
- Redesigned the icon picker design on Desktop.
- Redesigned the notification page on Mobile.
### Bug Fixes
- Enhance the toolbar tooltip functionality on Desktop.
- Enhance the slash menu user experience on Desktop.
- Fixed the issue where list style overrides occurred during text pasting.
- Fixed the issue where linking multiple databases in the same document could cause random loss of focus.
## Version 0.6.6 - 30/07/2024
### New Features
- Upgrade your workspace to a premium plan to unlock more features and storage.
- Image galleries and drag-and-drop image support in documents.
### Bug Fixes
- Fix minor UI issues on Desktop and Mobile.
## Version 0.6.5 - 24/07/2024
### New Features
- Publish a Database to the Web
## Version 0.6.4 - 16/07/2024
### New Features
- Enhanced the message style on the AI chat page.
- Added the ability to choose cursor color and selection color from a palette in settings page.
### Bug Fixes
- Optimized the performance for loading recent pages.
- Fixed an issue where the cursor would jump randomly when typing in the document title on mobile.
## Version 0.6.3 - 08/07/2024
### New Features
- Publish a Document to the Web
## Version 0.6.2 - 01/07/2024
### New Features
- Added support for duplicating spaces.
- Added support for moving pages across spaces.
- Undo markdown formatting with `Ctrl + Z` or `Cmd + Z`.
- Improved shortcuts settings UI.
### Bug Fixes
- Fixed unable to zoom in with `Ctrl` and `+` or `Cmd` and `+` on some keyboards.
- Fixed unable to paste nested lists in existing lists.
## Version 0.6.1 - 22/06/2024
### New Features
- Introduced the "Space" feature to help you organize your pages more efficiently.
### Bug Fixes
- Resolved shortcut conflicts on the board page.
- Resolved an issue where underscores could cause the editor to freeze.
## Version 0.6.0 - 19/06/2024
### New Features
- Introduced the "Space" feature to help you organize your pages more efficiently.
### Bug Fixes
- Resolved shortcut conflicts on the board page.
- Resolved an issue where underscores could cause the editor to freeze.
## Version 0.5.9 - 06/06/2024
### New Features
- Revamped the sidebar for both Desktop and Mobile.
- Added support for embedding videos in documents.
- Introduced a hotkey (Cmd/Ctrl + 0) to reset the app scale.
- Supported searching the workspace by page title.
### Bug Fixes
- Fixed the issue preventing the use of Backspace to delete words in Kanban boards.
## Version 0.5.8 - 05/20/2024
### New Features
- Improvement to the Callout block to insert new lines
- New settings page "Manage data" replaced the "Files" page
- New settings page "Workspace" replaced the "Appearance" and "Language" pages
- A custom implementation of a title bar for Windows users
- Added support for selecting Cards in kanban and performing grouped keyboard shortcuts
- Added support for default system font family
- Support for scaling the application up/down using a keyboard shortcut (CMD/CTRL + PLUS/MINUS)
### Bug Fixes
- Resolved and refined the UI on Mobile
- Resolved issue with text editing in database
- Improved appearance of empty text cells in kanban/calendar
- Resolved an issue where a page's more actions (delete, duplicate) did not work properly
- Resolved and inconsistency in padding on get started screen on Desktop
## Version 0.5.7 - 05/10/2024
### Bug Fixes
- Resolved page opening issue on Android.
- Fixed text input inconsistency on Kanban board cards.
## Version 0.5.6 - 05/07/2024
### New Features
- Team collaboration is live! Add members to your workspace to edit and collaborate on pages together.
- Collaborate in real time on the same page with other members. Edits made by others will appear instantly.
- Create multiple workspaces for different kinds of content.
- Customize your entire page on mobile through the Page Style menu with options for layout, font, font size, emoji, and cover image.
- Open a row record as a full page.
### Bug Fixes
- Resolved issue with setting background color for the Simple Table block.
- Adjusted toolbar for various screen sizes.
- Added a request for photo permission before uploading images on mobile.
- Exported creation and last modification timestamps to CSV.
## Version 0.5.5 - 04/24/2024
### New Features
- Improved the display of code blocks with line numbers
- Added support for signing in using Magic Link
### Bug Fixes
- Fixed the database synchronization indicator issue
- Resolved the issue with opening the mentioned page on mobile
- Cleared the collaboration status when the user exits AppFlowy
## Version 0.5.4 - 04/08/2024
### New Features
- Introduced support for displaying a synchronization indicator within documents and databases to enhance user awareness of data sync status
- Revamped the select option cell editor in database
- Improved translations for Spanish, German, Kurdish, and Vietnamese
- Supported Android 6 and newer versions
### Bug Fixes
- Resolved an issue where twelve-hour time formats were not being parsed correctly in databases
- Fixed a bug affecting the user interface of the single select option filter
- Fixed various minor UI issues
## Version 0.5.3 - 03/21/2024
### New Features
- Added build support for 32-bit Android devices
- Introduced filters for KanBan boards for enhanced organization
- Introduced the new "Relations" column type in Grids
- Expanded language support with the addition of Greek
- Enhanced toolbar design for Mobile devices
- Introduced a command palette feature with initial support for page search
### Bug Fixes
- Rectified the issue of incomplete row data in Grids when adding new rows with active filters
- Enhanced the logic governing the filtering of number and select/multi-select fields for improved accuracy
- Implemented UI refinements on both Desktop and Mobile platforms, enriching the overall user experience of AppFlowy
## Version 0.5.2 - 03/13/2024
### Bug Fixes
- Import csv file.
## Version 0.5.1 - 03/11/2024
### New Features
- Introduced support for performing generic calculations on databases.
- Implemented functionality for easily duplicating calendar events.
- Added the ability to duplicate fields with cell data, facilitating smoother data management.
- Now supports customizing font styles and colors prior to typing.
- Enhanced the checklist user experience with the integration of keyboard shortcuts.
- Improved the dark mode experience on mobile devices.
### Bug Fixes
- Fixed an issue with some pages failing to sync properly.
- Fixed an issue where links without the http(s) scheme could not be opened, ensuring consistent link functionality.
- Fixed an issue that prevented numbers from being inserted before heading blocks.
- Fixed the inline page reference update mechanism to accurately reflect workspace changes.
- Fixed an issue that made it difficult to resize images in certain cases.
- Enhanced image loading reliability by clearing the image cache when images fail to load.
- Resolved a problem preventing the launching of URLs on some Linux distributions.
## Version 0.5.0 - 02/26/2024
### New Features
- Added support for scaling text on mobile platforms for better readability.
- Introduced a toggle for favorites directly from the documents' top bar.
- Optimized the image upload process and added error messaging for failed uploads.
- Implemented depth control for outline block components.
- New checklist task creation is now more intuitive, with prompts appearing on hover over list items in the row detail page.
- Enhanced sorting capabilities, allowing reordering and addition of multiple sorts.
- Expanded sorting and filtering options to include more field types like checklist, creation time, and modification time.
- Added support for field calculations within databases.
### Bug Fixes
- Fixed an issue where inserting an image from Unsplash in local mode was not possible.
- Fixed undo/redo functionality in lists.
- Fixed data loss issues when converting between block types.
- Fixed a bug where newly created rows were not being automatically sorted.
- Fixed issues related to deleting a sorting field or sort not removing existing sorts properly.
### Notes
- Windows 7, Windows 8, and iOS 11 are not yet supported due to the upgrade to Flutter 3.22.0.
## Version 0.4.9 - 02/17/2024
### Bug Fixes
- Resolved the issue that caused users to be redirected to the Sign In page
## Version 0.4.8 - 02/13/2024
### Bug Fixes
- Fixed a possible error when loading workspaces
## Version 0.4.6 - 02/03/2024
### Bug Fixes
- Fixed refresh token bug
## Version 0.4.5 - 02/01/2024
### Bug Fixes
- Fixed WebSocket connection issue
## Version 0.4.4 - 01/31/2024
### New Features
- Added functionality for uploading images to cloud storage.
- Enabled anonymous sign-in option for mobile platform users.
- Introduced the ability to customize cloud settings directly from the startup page.
- Added support for inserting reminders on the mobile platform.
- Overhauled the user interface on mobile devices, including improvements to the action bottom sheet, editor toolbar, database details page, and app bar.
- Implemented a shortcut (F2 key) to rename the current view.
### Bug Fixes
- Fixed an issue where the font family was not displaying correctly on the mobile platform.
- Resolved a problem with the mobile row detail title not updating correctly.
- Fixed issues related to deleting images and refactored the image actions menu for better usability.
- Fixed other known issues.
# Release Notes
## Version 0.4.3 - 01/16/2024
### Bug Fixes
- Fixed file name too long issue
## Version 0.4.2 - 01/15/2024
AppFlowy for Android is available to download on GitHub.
If you’ve been using our desktop app, it’s important to read [this guide](https://docs.appflowy.io/docs/guides/sync-desktop-and-mobile) before logging into the mobile app.
### New Features
- Enhanced RTL (Right-to-Left) support for mobile platforms.
- Optimized selection gesture system on mobile.
- Optimized the mobile toolbar menu.
- Improved reference menu (‘@’ menu).
- Updated privacy policy.
- Improved the data import process for AppFlowy by implementing a progress indicator and compressing the data to enhance efficiency.
- Enhanced the utilization of local disk space to optimize storage consumption.
### Bug Fixes
- Fixed sign-in cancellation issue on mobile.
- Resolved keyboard close bug on Android.
## Version 0.4.1 - 01/03/2024
### Bug fixes
- Fix import AppFlowy data folder
## Version 0.4.0 - 12/30/2023
1. Added capability to import data from an AppFlowy data folder. For detailed information, please see [AppFlowy Data Storage Documentation](https://docs.appflowy.io/docs/appflowy/product/data-storage).
2. Enhanced user interface and fixed various bugs.
3. Improved the efficiency of data synchronization in AppFlowy Cloud
## Version 0.3.9.1 - 12/07/2023
### Bug fixes
- Fix potential blank pages that may occur in an empty document
## Version 0.3.9 - 12/07/2023
### New Features
- Support inserting a new field to the left or right of an existing one
### Bug fixes
- Fix some emojis are shown in black/white
- Fix unable to rename a subpage of subpage
## Version 0.3.8 - 11/13/2023
### New Features
- Support hiding any stack in a board
- Support customizing page icons in menu
- Display visual hint when card contains notes
- Quick action for adding new stack to a board
- Support more ways of inserting page references in documents
- Shift + click on a checkbox to power toggle its children
### Bug fixes
- Improved color of the "Share"-button text
- Text overflow issue in Calendar properties
- Default font (Roboto) added to application
- Placeholder added for the editor inside a Card
- Toggle notifications in settings have been fixed
- Dialog for linking board/grid/calendar opens in correct position
- Quick add Card in Board at top, correctly adds a new Card at the top
## Version 0.3.7 - 10/30/2023
### New Features
- Support showing checklist items inline in row page.
- Support inserting date from slash menu.
- Support renaming a stack directly by clicking on the stack name.
- Show the detailed reminder content in the notification center.
- Save card order in Board view.
- Allow to hide the ungrouped stack.
- Segmented the checklist progress bar.
### Bug fixes
- Optimize side panel animation.
- Fix calendar with hidden date or title doesn't show options correctly.
- Fix the horizontal scroll bar disappears in Grid view.
- Improve setting tab UI in Grid view.
- Improve theme of the code block.
- Fix some UI issues.
## Version 0.3.6 - 10/16/2023
### New Features
- Support setting Markdown styles through keyboard shortcuts.
- Added Ukrainian language.
- Support auto-hiding sidebar feature, ensuring a streamlined view even when resizing to a smaller window.
- Support toggling the notifitcation on/off.
- Added Lemonade theme.
### Bug fixes
- Improve Vietnamese translations.
- Improve reminder feature.
- Fix some UI issues.
## Version 0.3.5 - 10/09/2023
### New Features
- Added support for browsing and inserting images from Unsplash.
- Revamp and unify the emoji picker throughout AppFlowy.
### Bug fixes
- Improve layout of the settings page.
- Improve design of the restore page banner.
- Improve UX of the reminders.
- Other UI fixes.
## Version 0.3.4 - 10/02/2023
### New Features
- Added support for creating a reminder.
- Added support for finding and replacing in the document page.
- Added support for showing the hidden fields in row detail page.
- Adjust the toolbar style in RTL mode.
### Bug fixes
- Improve snackbar UI design.
- Improve dandelion theme.
- Improve id-ID and pl-PL language translations.
## Version 0.3.3 - 09/24/2023
### New Features
- Added an end date field to the time cell in the database.
- Added Support for customizing the font family from GoogleFonts in the editor.
- Set the uploaded image to cover by default.
- Added Support for resetting the user icon on settings page
- Add Urdu language translations.
### Bug fixes
- Default colors for the blocks except for the callout were not transparent.
- Option/Alt + click to add a block above didn't work on the first line.
- Unable to paste HTML content containing `<mark>` tag.
- Unable to select the text from anywhere in the line.
- The selection in the editor didn't clear when editing the inline database.
- Added a bottom border to new property column in the database.
- Set minimum width of 50px for grid fields.
## Version 0.3.2 - 09/18/2023
### New Features
- Improve the performance of the editor, now it is much faster when editing a large document.
- Support for reordering the rows of the database on Windows.
- Revamp the row detail page of the database.
- Revamp the checklist cell editor of the database.
### Bug fixes
- Some UI issues
## Version 0.3.1 - 09/04/2023
### New Features
- Improve CJK (Chinese, Japanese, Korean) input method support.
- Share a database in CSV format.
- Support for aligning the block component with the toolbar.
- Support for editing name when creating a new page.
- Support for inserting a table in the document page.
- Database views allow for independent field visibility toggling.
### Bug fixes
- Paste multiple lines in code block.
- Some UI issues
## Version 0.3.0 - 08/22/2023
### New Features
- Improve paste features:
- Paste HTML content from website.
- Paste image from clipboard.
- Support Group by Date in Kanban Board.
- Notarize the macOS package, which is now verified by Apple.
- Add Persian language translations.
### Bug fixes
- Some UI issues
## Version 0.2.9 - 08/08/2023
### New Features
- Improve tab and shortcut, click with alt/option to open a page in new tab.
- Improve database tab bar UI.
### Bug fixes
- Add button and more action button of the favorite section doesn't work.
- Fix euro currency number format.
- Some UI issues
## Version 0.2.8 - 08/03/2023
### New Features
- Nestable personal folder that supports drag and drop
- Support for favorite folders.
- Support for sorting by date in Grid view.
- Add a duplicate button in the Board context menu.
### Bug fixes
- Improve readability in Callout
- Some UI issues
## Version 0.2.7 - 07/18/2023
### New Features
<img width="1147" src="https://github.com/AppFlowy-IO/AppFlowy/assets/11863087/ac464740-c685-4a85-ae99-1074c1c607e5">
- Open page in new tab
- Create toggle lists to keep things tidy in your pages
- Alt/Option + click to add a text block above
### Bug fixes
- Pasting into a Grid property crashed on Windows
- Double-click a link to open
## Version 0.2.6 - 07/11/2023
### New Features
- Dynamic load themes
- Inline math equation
## Version 0.2.5 - 07/02/2023
### New Features
- Insert local images
- Mention a page
- Outlines (Table of contents)
- Added support for aligning the image by image menu
### Bug fixes
- Some UI issues
## Version 0.2.4 - 06/23/2023
### Bug fixes:
- Unable to copy and paste a word
- Some UI issues
## Version 0.2.3 - 06/21/2023
### New Features
- Added support for creating multiple database views for existing database
## Version 0.2.2 - 06/15/2023
### New Features
- Added support for embedding a document in the database's row detail page
- Added support for inserting an emoji in the database's row detail page
### Other Updates
- Added language selector on the welcome page
- Added support for importing multiple markdown files all at once
## Version 0.2.1 - 06/11/2023
### New Features
- Added support for creating or referencing a calendar in the document
- Added `+` icon in grid's add field
### Other Updates
- Added vertical padding for progress bar
- Hide url cell accessory when the content is empty
### Bug fixes:
- Fixed unable to export markdown
- Fixed adding vertical padding for progress bar
- Fixed database view didn't update after the database layout changed.
## Version 0.2.0 - 06/08/2023
### New Features
- Improved checklists to support each cell having its own list
- Drag and drop calendar events
- Switch layouts (calendar, grid, kanban) of a database
- New database properties: 'Updated At' and 'Created At'
- Enabled hiding properties on the row detail page
- Added support for reordering and saving row order in different database views.
- Enabled each database view to have its own settings, including filter and sort options
- Added support to convert `“` (double quote) into a block quote
- Added support to convert `***` (three stars) into a divider
- Added support for an 'Add' button to insert a paragraph in a document and display the slash menu
- Added support for an 'Option' button to delete, duplicate, and customize block actions
### Other Updates
- Added support for importing v0.1.x documents and databases
- Added support for database import and export to CSV
- Optimized scroll behavior in documents.
- Redesigned the launch page
### Bug fixes
- Fixed bugs related to numbers
- Fixed issues with referenced databases in documents
- Fixed menu overflow issues in documents
### Data migration
The data format of this version is not compatible with previous versions. Therefore, to migrate your data to the new version, you need to use the export and import functions. Please follow the guide to learn how to export and import your data.
#### Export files in v0.1.6
https://github.com/AppFlowy-IO/AppFlowy/assets/11863087/0c89bf2b-cd97-4a7b-b627-59df8d2967d9
#### Import files in v0.2.0
https://github.com/AppFlowy-IO/AppFlowy/assets/11863087/7b392f35-4972-497a-8a7f-f38efced32e2
## Version 0.1.5 - 11/05/2023
### Bug Fixes
- Fix: calendar dates don't match with weekdays.
- Fix: sort numbers in Grid.
## Version 0.1.4 - 04/05/2023
### New features
- Use AppFlowy’s calendar views to plan and manage tasks and deadlines.
- Writing can be improved with the help of OpenAI.
## Version 0.1.3 - 24/04/2023
### New features
- Launch the official Dark Mode.
- Customize the font color and highlight color by setting a hex color value and an opacity level.
### Bug Fixes
- Fix: the slash menu can be triggered by all other keyboards than English.
- Fix: convert the single asterisk to italic text and the double asterisks to bold text.
## Version 0.1.2 - 03/28/2023
### Bug Fixes
- Fix: update calendar selected range.
- Fix: duplicate view.
## Version 0.1.1 - 03/21/2023
### New features
- AppFlowy brings the power of OpenAI into your AppFlowy pages. Ask AI to write anything for you in AppFlowy.
- Support adding a cover image to your page, making your pages beautiful.
- More shortcuts become available. Click on '?' at the bottom right to access our shortcut guide.
### Bug Fixes
- Fix some bugs
## Version 0.1.0 - 02/09/2023
### New features
- Support linking a Board or Grid into the Document page
- Integrate a callout plugin implemented by community members
- Optimize user interface
### Bug Fixes
- Fix some bugs
## Version 0.0.9.1 - 01/03/2023
### New features
- New theme
- Support changing text color of editor
- Optimize user interface
### Bug Fixes
- Fix some grid bugs
## Version 0.0.9 - 12/21/2022
### New features
- Enable the user to define where to store their data
- Support inserting Emojis through the slash command
### Bug Fixes
- Fix some bugs
## Version 0.0.8.1 - 12/09/2022
### New features
- Support following your default system theme
- Improve the filter in Grid
### Bug Fixes
- Copy/Paste
## Version 0.0.8 - 11/30/2022
### New features
- Table-view database
- support column type: Checklist
- Board-view database
- support column type: Checklist
- Customize font size: small, medium, large
## Version 0.0.7.1 - 11/30/2022
### Bug Fixes
- Fix some bugs
## Version 0.0.7 - 11/27/2022
### New features
- Support adding filters by the text/checkbox/single-select property in Grid
## Version 0.0.6.2 - 10/30/2022
- Fix some bugs
## Version 0.0.6.1 - 10/26/2022
### New features
- Optimize appflowy_editor dark mode style
### Bug Fixes
- Unable to copy the text with checkbox or link style
## Version 0.0.6 - 10/23/2022
### New features
- Integrate **appflowy_editor**
## Version 0.0.5.3 - 09/26/2022
### New features
- Open the next page automatically after deleting the current page
- Refresh the Kanban board after altering a property type
### Bug Fixes
- Fix switch board bug
- Fix delete the Kanban board's row error
- Remove duplicate time format
- Fix can't delete field in property edit panel
- Adjust some display UI issues
## Version 0.0.5.2 - 09/16/2022
### New features
- Enable adding a new card to the "No Status" group
- Fix some bugs
### Bug Fixes
- Fix cannot open AppFlowy error
- Fix delete the Kanban board's row error
## Version 0.0.5.1 - 09/14/2022
### New features
- Enable deleting a field in board
- Fix some bugs
## Version 0.0.5 - 09/08/2022
### New features - Kanban Board like Notion and Trello beta
Boards are the best way to manage projects & tasks. Use them to group your databases by select, multiselect, and checkbox.
<p align="left"><img src="https://user-images.githubusercontent.com/12026239/190055984-6efa2d7a-ee38-4551-859e-ee56388e1859.gif" width="1000px" /></p>
- Set up columns that represent a specific phase of the project cycle and use cards to represent each project/task
- Drag and drop a card from one phase/column to another phase/column
- Update database properties in the Board view by clicking on a property and making edits on the card
### Other Features & Improvements
- Settings allow users to change avatars
- Click and drag the right edge to resize your sidebar
- And many user interface improvements (link)
## Version 0.0.5 - beta.2 - beta.1 - 09/01/2022
### New features
- Board-view database
- Support start editing after creating a new card
- Support editing the card directly by clicking the edit button
- Add the `No Status` column to display the cards while their status is empty
### Bug Fixes
- Optimize insert card animation
- Fix some UI bugs
## Version 0.0.5 - beta.1 - 08/25/2022
### New features
- Board-view database
- Group by single select
- drag and drop cards
- insert / delete cards

## Version 0.0.4 - 06/06/2022
- Drag to adjust the width of a column
- Upgrade to Flutter 3.0
- Native support for M1 chip
- Date supports time formats
- New property: URL
- Keyboard shortcuts support for Grid: press Enter to leave the edit mode; control c/v to copy-paste cell values
### Bug Fixes
- Fixed some bugs
## Version 0.0.4 - beta.3 - 05/02/2022
- Drag to reorder app/ view/ field
- Row record opens as a page
- Auto resize the height of the row in the grid
- Support more number formats
- Search column options, supporting Single-select, Multi-select, and number format

### Bug Fixes & Improvements
- Improved row/cell data cache
- Fixed some bugs
## Version 0.0.4 - beta.2 - 04/11/2022
- Support properties: Text, Number, Date, Checkbox, Select, Multi-select
- Insert / delete rows
- Add / delete / hide columns
- Edit property

## Version 0.0.4 - beta.1 - 04/08/2022
v0.0.4 - beta.1 is pre-release
### New features
- Table-view database
- support column types: Text, Checkbox, Single-select, Multi-select, Numbers
- hide / delete columns
- insert rows
## Version 0.0.3 - 02/23/2022
v0.0.3 is production ready, available on Linux, macOS, and Windows
### New features
- Dark Mode
- Support new languages: French, Italian, Russian, Simplified Chinese, Spanish
- Add Settings: Toggle on Dark Mode; Select a language
- Show device info
- Add tooltip on the toolbar icons
Bug fixes and improvements
- Increased height of action
- CPU performance issue
- Fix potential data parser error
- More foundation work for online collaboration
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at annie@appflowy.io. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 <https://www.gnu.org/licenses/>.
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
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
<h1 align="center" style="border-bottom: none">
<b>
<a href="https://www.appflowy.com">AppFlowy</a><br>
</b>
⭐️ The Open Source Alternative To Notion ⭐️ <br>
</h1>
<p align="center">
AppFlowy is the AI workspace where you achieve more without losing control of your data
</p>
<p align="center">
<a href="https://discord.gg/9Q2xaN37tV"><img src="https://img.shields.io/badge/AppFlowy.IO-discord-orange"></a>
<a href="https://github.com/AppFlowy-IO/appflowy"><img src="https://img.shields.io/github/stars/AppFlowy-IO/appflowy.svg?style=flat&logo=github&colorB=deeppink&label=stars"></a>
<a href="https://github.com/AppFlowy-IO/appflowy"><img src="https://img.shields.io/github/forks/AppFlowy-IO/appflowy.svg"></a>
<a href="https://opensource.org/licenses/AGPL-3.0"><img src="https://img.shields.io/badge/license-AGPL-purple.svg" alt="License: AGPL"></a>
</p>
<p align="center">
<a href="https://www.appflowy.com"><b>Website</b></a> •
<a href="https://forum.appflowy.io/"><b>Forum</b></a> •
<a href="https://discord.gg/9Q2xaN37tV"><b>Discord</b></a> •
<a href="https://www.reddit.com/r/AppFlowy"><b>Reddit</b></a> •
<a href="https://twitter.com/appflowy"><b>Twitter</b></a>
</p>
<p align="center"><img src="https://appflowy.com/_next/static/media/tasks.796c753e.png" alt="AppFlowy Kanban Board for To-dos" /></p>
<p align="center"><img src="https://appflowy.com/_next/static/media/Grid.9e30484b.png" alt="AppFlowy Databases for Tasks and Projects" /></p>
<p align="center"><img src="https://appflowy.com/_next/static/media/sites.a8d5b2b9.png" alt="AppFlowy Sites for Beautiful documentation" /></p>
<p align="center"><img src="https://appflowy.com/_next/static/media/ai.e1460982.png" alt="AppFlowy AI" /></p>
<p align="center"><img src="https://appflowy.com/_next/static/media/template.9ea13c3b.png" alt="AppFlowy Templates" /></p>
<br></br>
<p align="center" >
<img src="https://github.com/user-attachments/assets/5841c491-b564-4a26-b9b6-191def430911" alt="Work across devices" width="1040px" /></p>
<p align="center" >
<img src="https://github.com/user-attachments/assets/c2ba6bb8-746c-4743-9393-d008a669be95" alt="Work across devices" width="1040px" /></p>
<p align="center" >
<img src="https://github.com/user-attachments/assets/e83dd1a3-4975-4d0e-91a1-9eb6e0d248cd" alt="Work across devices" width="1040px" /></p>
## User Installation
- [Download AppFlowy Desktop (macOS, Windows, and Linux)](https://github.com/AppFlowy-IO/AppFlowy/releases)
- Other
channels: [FlatHub](https://flathub.org/apps/io.appflowy.AppFlowy), [Snapcraft](https://snapcraft.io/appflowy), [Sourceforge](https://sourceforge.net/projects/appflowy/)
- Available on
- [App Store](https://apps.apple.com/app/appflowy/id6457261352): iPhone
- [Play Store](https://play.google.com/store/apps/details?id=io.appflowy.appflowy): Android 10 or above; ARMv7 is
not supported
- [Self-hosting AppFlowy](https://appflowy.com/docs/Step-by-step-Self-Hosting-Guide---From-Zero-to-Production)
- [Source](https://docs.appflowy.io/docs/documentation/appflowy/from-source)
## Built With
- [Flutter](https://flutter.dev/)
- [Rust](https://www.rust-lang.org/)
## Stay Up-to-Date
<p align="center"><img src="https://github.com/AppFlowy-IO/appflowy/blob/main/doc/imgs/howtostar.gif" alt="AppFlowy Github - how to star the repo" width="100%" /></p>
## Getting Started with development
Please view the [documentation](https://docs.appflowy.io/docs/documentation/appflowy/from-source) for OS specific
development instructions
## Roadmap
- [AppFlowy Roadmap ReadMe](https://docs.appflowy.io/docs/appflowy/roadmap)
- [AppFlowy Public Roadmap](https://github.com/orgs/AppFlowy-IO/projects/5/views/12)
If you'd like to propose a feature, submit a feature
request [here](https://github.com/AppFlowy-IO/AppFlowy/issues/new?assignees=&labels=&template=feature_request.yaml&title=%5BFR%5D+) <br/>
If you'd like to report a bug, submit a bug
report [here](https://github.com/AppFlowy-IO/AppFlowy/issues/new?assignees=&labels=&template=bug_report.yaml&title=%5BBug%5D+)
## **Releases**
Please see the [changelog](https://appflowy.com/what-is-new) for more details about a given release.
## Contributing
Contributions make the open-source community a fantastic place to learn, inspire, and create. Any contributions you make
are **greatly appreciated**. Please look
at [Contributing to AppFlowy](https://docs.appflowy.io/docs/documentation/software-contributions/contributing-to-appflowy)
for details.
If your Pull Request is accepted as it fixes a bug, adds functionality, or makes AppFlowy's codebase significantly
easier to use or understand, **Congratulations!** If your administrative and managerial work behind the scenes sustains
the community, **Congratulations!** You are now an official contributor to AppFlowy.
## Translations 🌎🗺
[](https://inlang.com/editor/github.com/AppFlowy-IO/AppFlowy?ref=badge)
To add translations, you can manually edit the JSON translation files in `/frontend/resources/translations`, use
the [inlang online editor](https://inlang.com/editor/github.com/AppFlowy-IO/AppFlowy), or
run `npx inlang machine translate` to add missing translations.
## Join the community to build AppFlowy together
<a href="https://github.com/AppFlowy-IO/AppFlowy/graphs/contributors">
<img src="https://contrib.rocks/image?repo=AppFlowy-IO/AppFlowy" />
</a>
## Why Are We Building This?
Notion has been our favourite project and knowledge management tool in recent years because of its aesthetic appeal and
functionality. Our team uses it daily, and we are on its paid plan. However, as we all know, Notion has its limitations.
These include weak data security and poor compatibility with mobile devices. Likewise, alternative collaborative
workplace management tools also have their constraints.
The limitations we encountered using these tools and our past work experience with collaborative productivity tools have
led to our firm belief that there is a glass ceiling on what's possible for these tools in the future. This emanates
from the fact that these tools will probably struggle to scale horizontally at some point and be forced to prioritize a
proportion of customers whose needs differ from the rest. While decision-makers want a workplace OS, it is impossible to
come up with a one-size fits all solution in such a fragmented market.
When a customer's evolving core needs are not satisfied, they either switch to another or build one from the ground up,
in-house. Consequently, they either go under another ceiling or buy an expensive ticket to learn a hard lesson. This is
a requirement for many resources and expertise, building a reliable and easy-to-use collaborative tool, not to mention
the speed and native experience. The same may apply to individual users as well.
All these restrictions necessitate our mission - to make it possible for anyone to create apps that suit their needs
well.
- To individuals, we would like to offer Notion's functionality, data security, and cross-platform native experience.
- To enterprises and hackers, AppFlowy is dedicated to offering building blocks and collaboration infra services to
enable you to make apps on your own. Moreover, you have 100% control of your data. You can design and modify AppFlowy
your way, with a single codebase written in Flutter and Rust supporting multiple platforms armed with long-term
maintainability.
We decided to achieve this mission by upholding the three most fundamental values:
- Data privacy first
- Reliable native experience
- Community-driven extensibility
We do not claim to outperform Notion in terms of functionality and design, at least for now. Besides, our priority
doesn't lie in more functionality at the moment. Instead, we would like to cultivate a community to democratize the
knowledge and wheels of making complex workplace management tools while enabling people and businesses to create
beautiful things on their own by equipping them with a versatile toolbox of building blocks.
## License
Distributed under the AGPLv3 License. See [`LICENSE.md`](https://github.com/AppFlowy-IO/AppFlowy/blob/main/LICENSE) for
more information.
## Acknowledgments
Special thanks to these amazing projects which help power AppFlowy:
- [cargo-make](https://github.com/sagiegurari/cargo-make)
- [contrib.rocks](https://contrib.rocks)
- [flutter_chat_ui](https://pub.dev/packages/flutter_chat_ui)
================================================
FILE: ROADMAP.md
================================================
## Our [roadmap](https://github.com/orgs/AppFlowy-IO/projects/5/views/12) is where you can learn about the features we’re working on, their status, when we expect to release them, and how you can help us.
## Find more information about how to use our official AppFlowy public roadmap on [Gitbook](https://appflowy.gitbook.io/docs/essential-documentation/roadmap).
================================================
FILE: codemagic.yaml
================================================
workflows:
ios-workflow:
name: iOS Workflow
instance_type: mac_mini_m2
max_build_duration: 30
environment:
flutter: 3.27.4
xcode: latest
cocoapods: default
scripts:
- name: Build Flutter
script: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
rustc --version
cargo --version
cd frontend
rustup target install aarch64-apple-ios-sim
cargo install --force cargo-make
cargo install --force --locked duckscript_cli
cargo install --force cargo-lipo
cargo make appflowy-flutter-deps-tools
cargo make --profile development-ios-arm64-sim appflowy-core-dev-ios
cargo make --profile development-ios-arm64-sim code_generation
- name: iOS integration tests
script: |
cd frontend/appflowy_flutter
flutter emulators --launch apple_ios_simulator
flutter -d iPhone test integration_test/runner.dart
artifacts:
- build/ios/ipa/*.ipa
- /tmp/xcodebuild_logs/*.log
- flutter_drive.log
publishing:
email:
recipients:
- lucas.xu@appflowy.io
notify:
success: true
failure: true
================================================
FILE: commitlint.config.js
================================================
// module.exports = {extends: ['@commitlint/config-conventional']}
module.exports = {
rules: {
'header-max-length': [2, 'always', 100],
'type-enum': [2, 'always', ['build', 'chore', 'ci', 'docs', 'feat', 'feature', 'fix', 'refactor', 'style', 'test']],
'type-empty': [2, 'never'],
'type-case': [2, 'always', 'lower-case'],
'subject-empty': [2, 'never'],
'subject-case': [
0,
'never',
['sentence-case', 'start-case', 'pascal-case', 'upper-case'],
],
'body-leading-blank': [2, 'always'],
'body-max-line-length': [2, 'always', 200],
'body-case': [0, 'never', []],
'footer-leading-blank': [1, 'always'],
'footer-max-line-length': [2, 'always', 100]
},
};
================================================
FILE: doc/CONTRIBUTING.md
================================================
<p align="center"><img src="imgs/appflowy_title_and_logo.png" alt="The Open Source Notion Alternative." width="500px" /></p>
# Contributing to AppFlowy
Hello, and welcome! Whether you are trying to report a bug, proposing a feature request, or want to work on the code you should go visit [Contributing to AppFlowy](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/contributing-to-appflowy)
We look forward to hearing from you!
================================================
FILE: doc/roadmap.md
================================================
[AppFlowy Roadmap ReadMe](https://appflowy.gitbook.io/docs/essential-documentation/roadmap)
[AppFlowy Public Roadmap](https://github.com/orgs/AppFlowy-IO/projects/5/views/12)
================================================
FILE: frontend/.vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
// This task only builds the Dart code of AppFlowy.
// It supports both the desktop and mobile version.
"name": "AF: Build Dart Only",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"env": {
"RUST_LOG": "debug",
},
// uncomment the following line to testing performance.
// "flutterMode": "profile",
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
// This task builds the Rust and Dart code of AppFlowy.
"name": "AF-desktop: Build All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Build Appflowy Core",
"env": {
"RUST_LOG": "trace",
"RUST_BACKTRACE": "1"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
// This task builds will:
// - call the clean task,
// - rebuild all the generated Files (including freeze and language files)
// - rebuild the the Rust and Dart code of AppFlowy.
"name": "AF-desktop: Clean + Rebuild All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Clean + Rebuild All",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-iOS: Build All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Build Appflowy Core For iOS",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-iOS: Clean + Rebuild All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Clean + Rebuild All (iOS)",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-iOS-Simulator: Build All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Build Appflowy Core For iOS Simulator",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-iOS-Simulator: Clean + Rebuild All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Clean + Rebuild All (iOS Simulator)",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-Android: Build All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Build Appflowy Core For Android",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-Android: Clean + Rebuild All",
"request": "launch",
"program": "./lib/main.dart",
"type": "dart",
"preLaunchTask": "AF: Clean + Rebuild All (Android)",
"env": {
"RUST_LOG": "trace"
},
"cwd": "${workspaceRoot}/appflowy_flutter"
},
{
"name": "AF-desktop: Debug Rust",
"type": "lldb",
"request": "attach",
"pid": "${command:pickMyProcess}"
// To launch the application directly, use the following configuration:
// "request": "launch",
// "program": "[YOUR_APPLICATION_PATH]",
},
]
}
================================================
FILE: frontend/.vscode/tasks.json
================================================
{
"version": "2.0.0",
// https://code.visualstudio.com/docs/editor/tasks
// https://gist.github.com/deadalusai/9e13e36d61ec7fb72148
// ${workspaceRoot}: the root folder of the team
// ${file}: the current opened file
// ${fileBasename}: the current opened file's basename
// ${fileDirname}: the current opened file's dirname
// ${fileExtname}: the current opened file's extension
// ${cwd}: the current working directory of the spawned process
"tasks": [
{
"label": "AF: Clean + Rebuild All",
"type": "shell",
"dependsOrder": "sequence",
"dependsOn": [
"AF: Dart Clean",
"AF: Flutter Clean",
"AF: Build Appflowy Core",
"AF: Flutter Pub Get",
"AF: Generate Language Files",
"AF: Generate Freezed Files",
"AF: Generate Svg Files"
],
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "AF: Clean + Rebuild All (iOS)",
"type": "shell",
"dependsOrder": "sequence",
"dependsOn": [
"AF: Dart Clean",
"AF: Flutter Clean",
"AF: Build Appflowy Core For iOS",
"AF: Flutter Pub Get",
"AF: Generate Language Files",
"AF: Generate Freezed Files",
"AF: Generate Svg Files"
],
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "AF: Clean + Rebuild All (iOS Simulator)",
"type": "shell",
"dependsOrder": "sequence",
"dependsOn": [
"AF: Dart Clean",
"AF: Flutter Clean",
"AF: Build Appflowy Core For iOS Simulator",
"AF: Flutter Pub Get",
"AF: Generate Language Files",
"AF: Generate Freezed Files",
"AF: Generate Svg Files"
],
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "AF: Clean + Rebuild All (Android)",
"type": "shell",
"dependsOrder": "sequence",
"dependsOn": [
"AF: Dart Clean",
"AF: Flutter Clean",
"AF: Build Appflowy Core For Android",
"AF: Flutter Pub Get",
"AF: Generate Language Files",
"AF: Generate Freezed Files",
"AF: Generate Svg Files"
],
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "AF: Build Appflowy Core",
"type": "shell",
"windows": {
"command": "cargo make --profile development-windows-x86 appflowy-core-dev"
},
"linux": {
"command": "cargo make --profile \"development-linux-$(uname -m)\" appflowy-core-dev"
},
"osx": {
"command": "cargo make --profile \"development-mac-$(uname -m)\" appflowy-core-dev"
},
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: Build Appflowy Core For iOS",
"type": "shell",
"command": "cargo make --profile development-ios-arm64 appflowy-core-dev-ios",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: Build Appflowy Core For iOS Simulator",
"type": "shell",
"command": "cargo make --profile development-ios-arm64-sim appflowy-core-dev-ios",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: Build Appflowy Core For Android",
"type": "shell",
"command": "cargo make --profile development-android appflowy-core-dev-android",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: Code Gen",
"type": "shell",
"dependsOrder": "sequence",
"dependsOn": [
"AF: Flutter Clean",
"AF: Flutter Pub Get",
"AF: Generate Language Files",
"AF: Generate Freezed Files",
"AF: Generate Svg Files"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "AF: Dart Clean",
"type": "shell",
"command": "cargo make flutter_clean",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: Flutter Clean",
"type": "shell",
"command": "flutter clean",
"options": {
"cwd": "${workspaceFolder}/appflowy_flutter"
}
},
{
"label": "AF: Flutter Pub Get",
"type": "shell",
"command": "flutter pub get",
"options": {
"cwd": "${workspaceFolder}/appflowy_flutter"
}
},
{
"label": "AF: Generate Freezed Files",
"type": "shell",
"command": "sh ./scripts/code_generation/freezed/generate_freezed.sh",
"options": {
"cwd": "${workspaceFolder}"
},
"group": "build",
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": [
"/d",
"/c",
".\\scripts\\code_generation\\freezed\\generate_freezed.cmd"
]
}
}
}
},
{
"label": "AF: Generate Language Files",
"type": "shell",
"command": "sh ./scripts/code_generation/language_files/generate_language_files.sh",
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": [
"/d",
"/c",
".\\scripts\\code_generation\\language_files\\generate_language_files.cmd"
]
}
}
},
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: Generate Svg Files",
"type": "shell",
"command": "sh ./scripts/code_generation/flowy_icons/generate_flowy_icons.sh",
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": [
"/d",
"/c",
".\\scripts\\code_generation\\flowy_icons\\generate_flowy_icons.cmd"
]
}
}
},
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
}
},
{
"label": "AF: flutter build aar",
"type": "flutter",
"command": "flutter",
"args": [
"build",
"aar"
],
"group": "build",
"problemMatcher": [],
"detail": "appflowy_flutter"
},
{
"label": "AF: Generate Env File",
"type": "shell",
"command": "dart run build_runner clean && dart run build_runner build --delete-conflicting-outputs",
"options": {
"cwd": "${workspaceFolder}/appflowy_flutter"
}
}
]
}
================================================
FILE: frontend/Makefile.toml
================================================
#https://github.com/sagiegurari/cargo-make
extend = [
{ path = "scripts/makefile/desktop.toml" },
{ path = "scripts/makefile/mobile.toml" },
{ path = "scripts/makefile/protobuf.toml" },
{ path = "scripts/makefile/tests.toml" },
{ path = "scripts/makefile/docker.toml" },
{ path = "scripts/makefile/env.toml" },
{ path = "scripts/makefile/flutter.toml" },
{ path = "scripts/makefile/tool.toml" },
{ path = "scripts/makefile/tauri.toml" },
{ path = "scripts/makefile/web.toml" },
]
[config]
on_error_task = "catch"
[tasks.catch]
run_task = { name = ["restore-crate-type"] }
[env]
RUST_LOG = "info"
CARGO_PROFILE = "dev"
CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = true
CARGO_MAKE_CRATE_FS_NAME = "dart_ffi"
CARGO_MAKE_CRATE_NAME = "dart-ffi"
LIB_NAME = "dart_ffi"
APPFLOWY_VERSION = "0.9.9"
FLUTTER_DESKTOP_FEATURES = "dart"
PRODUCT_NAME = "AppFlowy"
MACOSX_DEPLOYMENT_TARGET = "11.0"
# CRATE_TYPE: https://doc.rust-lang.org/reference/linkage.html
# If you update the macOS's CRATE_TYPE, don't forget to update the
# appflowy_backend.podspec
# for staticlib:
# s.static_framework = true
# s.vendored_libraries = "libdart_ffi.a"
# for cdylib:
# s.vendored_libraries = "libdart_ffi.dylib"
#
# Remember to update the ffi.dart:
# for staticlib:
# if (Platform.isMacOS) return DynamicLibrary.open('${prefix}/libdart_ffi.a');
# for cdylib:
# if (Platform.isMacOS) return DynamicLibrary.open('${prefix}/libdart_ffi.dylib');
CRATE_TYPE = "staticlib"
LIB_EXT = "a"
APP_ENVIRONMENT = "local"
FLUTTER_FLOWY_SDK_PATH = "appflowy_flutter/packages/appflowy_backend"
TAURI_BACKEND_SERVICE_PATH = "appflowy_tauri/src/services/backend"
WEB_BACKEND_SERVICE_PATH = "appflowy_web/src/services/backend"
TAURI_APP_BACKEND_SERVICE_PATH = "appflowy_web_app/src/application/services/tauri-services/backend"
# Test default config
TEST_CRATE_TYPE = "cdylib"
TEST_LIB_EXT = "dylib"
TEST_BUILD_FLAG = "debug"
TEST_COMPILE_TARGET = "x86_64-apple-darwin"
[env.development-mac-arm64]
RUST_LOG = "info"
TARGET_OS = "macos"
RUST_COMPILE_TARGET = "aarch64-apple-darwin"
BUILD_FLAG = "debug"
FLUTTER_OUTPUT_DIR = "Debug"
PRODUCT_EXT = "app"
BUILD_ARCHS = "arm64"
BUILD_ACTIVE_ARCHS_ONLY = true
CRATE_TYPE = "staticlib"
[env.development-mac-x86_64]
RUST_LOG = "info"
TARGET_OS = "macos"
RUST_COMPILE_TARGET = "x86_64-apple-darwin"
BUILD_FLAG = "debug"
FLUTTER_OUTPUT_DIR = "Debug"
PRODUCT_EXT = "app"
BUILD_ARCHS = "x86_64"
BUILD_ACTIVE_ARCHS_ONLY = true
CRATE_TYPE = "staticlib"
[env.production-mac-arm64]
CARGO_PROFILE = "release"
BUILD_FLAG = "release"
TARGET_OS = "macos"
RUST_COMPILE_TARGET = "aarch64-apple-darwin"
FLUTTER_OUTPUT_DIR = "Release"
PRODUCT_EXT = "app"
APP_ENVIRONMENT = "production"
BUILD_ARCHS = "arm64"
BUILD_ACTIVE_ARCHS_ONLY = false
CRATE_TYPE = "staticlib"
[env.production-mac-x86_64]
CARGO_PROFILE = "release"
BUILD_FLAG = "release"
TARGET_OS = "macos"
RUST_COMPILE_TARGET = "x86_64-apple-darwin"
FLUTTER_OUTPUT_DIR = "Release"
PRODUCT_EXT = "app"
APP_ENVIRONMENT = "production"
BUILD_ARCHS = "x86_64"
BUILD_ACTIVE_ARCHS_ONLY = false
CRATE_TYPE = "staticlib"
[env.production-mac-universal]
CARGO_PROFILE = "release"
BUILD_FLAG = "release"
TARGET_OS = "macos"
FLUTTER_OUTPUT_DIR = "Release"
PRODUCT_EXT = "app"
BUILD_ACTIVE_ARCHS_ONLY = false
APP_ENVIRONMENT = "production"
[env.development-windows-x86]
TARGET_OS = "windows"
RUST_COMPILE_TARGET = "x86_64-pc-windows-msvc"
BUILD_FLAG = "debug"
FLUTTER_OUTPUT_DIR = "Debug"
PRODUCT_EXT = "exe"
CRATE_TYPE = "cdylib"
LIB_EXT = "dll"
[env.production-windows-x86]
CARGO_PROFILE = "release"
BUILD_FLAG = "release"
TARGET_OS = "windows"
RUST_COMPILE_TARGET = "x86_64-pc-windows-msvc"
FLUTTER_OUTPUT_DIR = "Release"
PRODUCT_EXT = "exe"
CRATE_TYPE = "cdylib"
LIB_EXT = "dll"
BUILD_ARCHS = "x64"
APP_ENVIRONMENT = "production"
[env.development-linux-x86_64]
TARGET_OS = "linux"
RUST_COMPILE_TARGET = "x86_64-unknown-linux-gnu"
BUILD_FLAG = "debug"
CRATE_TYPE = "cdylib"
FLUTTER_OUTPUT_DIR = "Debug"
LIB_EXT = "so"
LINUX_ARCH = "x64"
[env.production-linux-x86_64]
CARGO_PROFILE = "release"
BUILD_FLAG = "release"
TARGET_OS = "linux"
RUST_COMPILE_TARGET = "x86_64-unknown-linux-gnu"
CRATE_TYPE = "cdylib"
FLUTTER_OUTPUT_DIR = "Release"
LIB_EXT = "so"
LINUX_ARCH = "x64"
APP_ENVIRONMENT = "production"
[env.development-linux-aarch64]
TARGET_OS = "linux"
RUST_COMPILE_TARGET = "aarch64-unknown-linux-gnu"
BUILD_FLAG = "debug"
CRATE_TYPE = "cdylib"
FLUTTER_OUTPUT_DIR = "Debug"
LIB_EXT = "so"
LINUX_ARCH = "arm64"
FLUTTER_DESKTOP_FEATURES = "dart,openssl_vendored"
[env.production-linux-aarch64]
CARGO_PROFILE = "release"
BUILD_FLAG = "release"
TARGET_OS = "linux"
RUST_COMPILE_TARGET = "aarch64-unknown-linux-gnu"
CRATE_TYPE = "cdylib"
FLUTTER_OUTPUT_DIR = "Release"
LIB_EXT = "so"
LINUX_ARCH = "arm64"
APP_ENVIRONMENT = "production"
FLUTTER_DESKTOP_FEATURES = "dart,openssl_vendored"
[env.development-ios-arm64-sim]
BUILD_FLAG = "debug"
TARGET_OS = "ios"
FLUTTER_OUTPUT_DIR = "Debug"
RUST_COMPILE_TARGET = "aarch64-apple-ios-sim"
BUILD_ARCHS = "arm64"
CRATE_TYPE = "staticlib"
[env.development-ios-arm64]
BUILD_FLAG = "debug"
TARGET_OS = "ios"
FLUTTER_OUTPUT_DIR = "Debug"
RUST_COMPILE_TARGET = "aarch64-apple-ios"
BUILD_ARCHS = "arm64"
CRATE_TYPE = "staticlib"
[env.production-ios-arm64]
BUILD_FLAG = "release"
TARGET_OS = "ios"
FLUTTER_OUTPUT_DIR = "Release"
RUST_COMPILE_TARGET = "aarch64-apple-ios"
BUILD_ARCHS = "arm64"
CRATE_TYPE = "staticlib"
[env.development-android]
BUILD_FLAG = "debug"
TARGET_OS = "android"
CRATE_TYPE = "cdylib"
FLUTTER_OUTPUT_DIR = "Debug"
LIB_EXT = "so"
PRODUCT_EXT = "apk"
FLUTTER_DESKTOP_FEATURES = "dart,openssl_vendored"
[env.production-android]
BUILD_FLAG = "release"
TARGET_OS = "android"
CRATE_TYPE = "cdylib"
FLUTTER_OUTPUT_DIR = "Release"
PRODUCT_EXT = "apk"
LIB_EXT = "so"
[tasks.echo_env]
script = ['''
echo "-------- Env Parameters --------"
echo CRATE_TYPE: ${CRATE_TYPE}
echo BUILD_FLAG: ${BUILD_FLAG}
echo TARGET_OS: ${TARGET_OS}
echo RUST_COMPILE_TARGET: ${RUST_COMPILE_TARGET}
echo FEATURES: ${FLUTTER_DESKTOP_FEATURES}
echo PRODUCT_EXT: ${PRODUCT_EXT}
echo APP_ENVIRONMENT: ${APP_ENVIRONMENT}
echo BUILD_ARCHS: ${BUILD_ARCHS}
echo BUILD_VERSION: ${BUILD_VERSION}
echo RUST_VERSION: "$(rustc --version)"
''']
script_runner = "@shell"
[tasks.setup-crate-type]
private = true
script = [
"""
toml = readfile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml
val = replace ${toml} "staticlib" ${CRATE_TYPE}
result = writefile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml ${val}
assert ${result}
""",
]
script_runner = "@duckscript"
[tasks.restore-crate-type]
private = true
script = [
"""
toml = readfile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml
val = replace ${toml} ${CRATE_TYPE} "staticlib"
result = writefile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml ${val}
assert ${result}
""",
]
script_runner = "@duckscript"
[env.test-macos-x86_64]
TEST_CRATE_TYPE = "cdylib"
TEST_LIB_EXT = "dylib"
# For the moment, the DynamicLibrary only supports open x86_64 architectures binary.
TEST_COMPILE_TARGET = "x86_64-apple-darwin"
[env.test-macos-arm64]
TEST_CRATE_TYPE = "cdylib"
TEST_LIB_EXT = "dylib"
TEST_COMPILE_TARGET = "aarch64-apple-darwin"
[env.test-linux]
TEST_CRATE_TYPE = "cdylib"
TEST_LIB_EXT = "so"
TEST_COMPILE_TARGET = "x86_64-unknown-linux-gnu"
[env.test-windows]
TEST_CRATE_TYPE = "cdylib"
TEST_LIB_EXT = "dll"
TEST_COMPILE_TARGET = "x86_64-pc-windows-msvc"
[tasks.setup-test-crate-type]
private = true
script = [
"""
toml = readfile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml
val = replace ${toml} "staticlib" ${TEST_CRATE_TYPE}
result = writefile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml ${val}
assert ${result}
""",
]
script_runner = "@duckscript"
[tasks.restore-test-crate-type]
private = true
script = [
"""
toml = readfile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml
val = replace ${toml} ${TEST_CRATE_TYPE} "staticlib"
result = writefile ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/${CARGO_MAKE_CRATE_NAME}/Cargo.toml ${val}
assert ${result}
""",
]
script_runner = "@duckscript"
[tasks.test-build]
condition = { env_set = ["FLUTTER_FLOWY_SDK_PATH"] }
script = ["""
cd ${CARGO_MAKE_WORKSPACE_WORKING_DIRECTORY}/rust-lib/flowy-net
cargo build -vv --features=dart
"""]
script_runner = "@shell"
================================================
FILE: frontend/appflowy_flutter/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# 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/
generated*
Generated*
# Web related
lib/generated_plugin_registrant.dart
# Language related generated files
lib/generated/
# Freezed generated files
*.g.dart
*.freezed.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
/packages/flowy_protobuf
/packages/flutter-quill
product/**
windows/flutter/dart_ffi/
**/**/*.dylib
**/**/*.a
**/**/*.lib
**/**/*.dll
**/**/*.so
**/**/Brewfile.lock.json
**/.sandbox
**/.vscode/
.env
.env.*
coverage/
**/failures/*.png
assets/translations/
assets/flowy_icons/*
================================================
FILE: frontend/appflowy_flutter/.metadata
================================================
# 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: 682aa387cfe4fbd71ccd5418b2c2a075729a1c66
channel: unknown
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 682aa387cfe4fbd71ccd5418b2c2a075729a1c66
base_revision: 682aa387cfe4fbd71ccd5418b2c2a075729a1c66
- platform: android
create_revision: 682aa387cfe4fbd71ccd5418b2c2a075729a1c66
base_revision: 682aa387cfe4fbd71ccd5418b2c2a075729a1c66
# 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'
================================================
FILE: frontend/appflowy_flutter/Makefile
================================================
.PHONY: freeze_build, free_watch
freeze_build:
dart run build_runner build -d
watch:
dart run build_runner watch
================================================
FILE: frontend/appflowy_flutter/README.md
================================================
<h1 align="center" style="margin:0"> AppFlowy_Flutter</h1>
<div align="center">
<img src="https://img.shields.io/badge/Flutter-v3.13.19-blue"/>
<img src="https://img.shields.io/badge/Rust-v1.70-orange"/>
</div>
> Documentation for Contributors
This Repository contains the codebase for the frontend of the application, currently we use Flutter as our frontend framework.
### Platforms Supported Using Flutter 💻
- Linux
- macOS
- Windows
> We are actively working on support for Android & iOS!
_Additionally, we are working on a Web version built with Tauri!_
### Am I Eligible to Contribute?
Yes! You are eligible to contribute, check out the ways in which you can [contribute to AppFlowy](https://docs.appflowy.io/docs/documentation/software-contributions/contributing-to-appflowy). Some of the ways in which you can contribute are:
- Non-Coding Contributions
- Documentation
- Feature Requests and Feedbacks
- Report Bugs
- Improve Translations
- Coding Contributions
To contribute to `AppFlowy_Flutter` codebase specifically (coding contribution) we suggest you to have basic knowledge of Flutter. In case you are new to Flutter, we suggest you learn the basics, and then contribute afterwards. To get started with Flutter read [here](https://flutter.dev/docs/get-started/codelab).
### What OS should I use for development?
We support all OS for Development i.e. Linux, MacOS and Windows. However, most of us promote macOS and Linux over Windows. We have detailed [docs](https://docs.appflowy.io/docs/documentation/appflowy/from-source/environment-setup) on how to setup `AppFlowy_Flutter` on your local system respectively per operating system.
### Getting Started ❇
We have detailed documentation on how to [get started](https://docs.appflowy.io/docs/documentation/software-contributions/contributing-to-appflowy) with the project, and make your first contribution. However, we do have some specific picks for you:
- [Code Architecture](https://appflowy.gitbook.io/docs/essential-documentation/contribute-to-appflowy/architecture/frontend/frontend/codemap)
- [Styleguide & Conventions](https://docs.appflowy.io/docs/documentation/software-contributions/conventions/naming-conventions)
- [Making Your First PR](https://docs.appflowy.io/docs/documentation/software-contributions/submitting-code/submitting-your-first-pull-request)
- [All AppFlowy Documentation](https://docs.appflowy.io/docs/documentation/appflowy) - Contribution guide, build and run, debugging, testing, localization, etc.
### Need Help?
- New to GitHub? Follow [these](https://docs.appflowy.io/docs/documentation/software-contributions/submitting-code/setting-up-your-repositories) steps to get started
- Stuck Somewhere? Join our [Discord](https://discord.gg/9Q2xaN37tV), we're there to help you!
- Find out more about the [community initiatives](https://docs.appflowy.io/docs/appflowy/community).
================================================
FILE: frontend/appflowy_flutter/analysis_options.yaml
================================================
include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- "**/*.g.dart"
- "**/*.freezed.dart"
- "packages/**/*.dart"
linter:
rules:
- require_trailing_commas
- prefer_collection_literals
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- sized_box_for_whitespace
- use_decorated_box
- unnecessary_parenthesis
- unnecessary_await_in_return
- unnecessary_raw_strings
- avoid_unnecessary_containers
- avoid_redundant_argument_values
- avoid_unused_constructor_parameters
- always_declare_return_types
- sort_constructors_first
- unawaited_futures
errors:
invalid_annotation_target: ignore
================================================
FILE: frontend/appflowy_flutter/android/.gitignore
================================================
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
.cxx
================================================
FILE: frontend/appflowy_flutter/android/README.md
================================================
# Description
This is a guide on how to build the rust SDK for AppFlowy on android.
Compiling the sdk is easy it just needs a few tweaks.
When compiling for android we need the following pre-requisites:
- Android NDK Tools. (v24 has been tested).
- Cargo NDK. (@latest version).
**Getting the tools**
- Install cargo-ndk ```bash cargo install cargo-ndk```.
- [Download](https://developer.android.com/ndk/downloads/) Android NDK version 24.
- When downloading Android NDK you can get the compressed version as a standalone from the site.
Or you can download it through [Android Studio](https://developer.android.com/studio).
- After downloading the two you need to set the environment variables. For Windows that's a separate process.
On macOS and Linux the process is similar.
- The variables needed are '$ANDROID_NDK_HOME', this will point to where the NDK is located.
---
**Cargo Config File**
This code needs to be written in ~/.cargo/config, this helps cargo know where to locate the android tools(linker and archiver).
**NB** Keep in mind just replace 'user' with your own user name. Or just point it to the location of where you put the NDK.
```toml
[target.aarch64-linux-android]
ar = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar"
linker = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang"
[target.armv7-linux-androideabi]
ar = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar"
linker = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi29-clang"
[target.i686-linux-android]
ar = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar"
linker = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android29-clang"
[target.x86_64-linux-android]
ar = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar"
linker = "/home/user/Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android29-clang"
```
**Clang Fix**
In order to get clang to work properly with version 24 you need to create this file.
libgcc.a, then add this one line.
```
INPUT(-lunwind)
```
**Folder path: 'Android/Sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/14.0.1/lib/linux'.**
After that you have to copy this file into three different folders namely aarch64, arm, i386 and x86_64.
We have to do this so we Android NDK can find clang on our system, if we used NDK 22 we wouldn't have to do this process.
Though using NDK v22 will not give us a lot of features to work with.
This GitHub [issue](https://github.com/fzyzcjy/flutter_rust_bridge/issues/419) explains the reason why we are doing this.
---
**Android NDK**
After installing the NDK tools for android you should export the PATH to your config file
(.vimrc, .zshrc, .profile, .bashrc file), That way it can be found.
```vim
export PATH=/home/sean/Android/Sdk/ndk/24.0.8215888
```
================================================
FILE: frontend/appflowy_flutter/android/app/build.gradle
================================================
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"
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
compileSdkVersion 35
ndkVersion "24.0.8215888"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompati
Showing preview only (215K chars total). Download the full file or copy to clipboard to get everything.
gitextract_qoew7893/ ├── .dockerignore ├── .githooks/ │ ├── commit-msg │ ├── pre-commit │ └── pre-push ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ └── feature_request.yaml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── actions/ │ │ ├── flutter_build/ │ │ │ └── action.yml │ │ └── flutter_integration_test/ │ │ └── action.yml │ └── workflows/ │ ├── android_ci.yaml.bak │ ├── build_command.yml │ ├── commit_lint.yml │ ├── docker_ci.yml │ ├── flutter_ci.yaml │ ├── ios_ci.yaml │ ├── mobile_ci.yml │ ├── ninja_i18n.yml │ ├── release.yml │ ├── rust_ci.yaml │ ├── rust_coverage.yml │ └── translation_notify.yml ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── ROADMAP.md ├── codemagic.yaml ├── commitlint.config.js ├── doc/ │ ├── CONTRIBUTING.md │ └── roadmap.md ├── frontend/ │ ├── .vscode/ │ │ ├── launch.json │ │ └── tasks.json │ ├── Makefile.toml │ ├── appflowy_flutter/ │ │ ├── .gitignore │ │ ├── .metadata │ │ ├── Makefile │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── android/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── app/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ ├── debug/ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ ├── main/ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── Classes/ │ │ │ │ │ │ └── binding.h │ │ │ │ │ ├── kotlin/ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ └── app_flowy/ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ └── res/ │ │ │ │ │ ├── drawable/ │ │ │ │ │ │ ├── launcher_background.xml │ │ │ │ │ │ └── launcher_foreground.xml │ │ │ │ │ ├── drawable-v21/ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ │ ├── values/ │ │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values-night/ │ │ │ │ │ └── styles.xml │ │ │ │ └── profile/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── build.gradle │ │ │ ├── gradle/ │ │ │ │ └── wrapper/ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradle.properties │ │ │ └── settings.gradle │ │ ├── assets/ │ │ │ ├── built_in_prompts.json │ │ │ ├── fonts/ │ │ │ │ └── .gitkeep │ │ │ ├── google_fonts/ │ │ │ │ ├── Poppins/ │ │ │ │ │ └── OFL.txt │ │ │ │ └── Roboto_Mono/ │ │ │ │ └── LICENSE.txt │ │ │ ├── icons/ │ │ │ │ └── icons.json │ │ │ ├── template/ │ │ │ │ ├── readme.afdoc │ │ │ │ └── readme.json │ │ │ ├── test/ │ │ │ │ └── workspaces/ │ │ │ │ ├── database/ │ │ │ │ │ ├── v020.afdb │ │ │ │ │ └── v069.afdb │ │ │ │ └── markdowns/ │ │ │ │ ├── markdown_with_table.md │ │ │ │ ├── test1.md │ │ │ │ └── test2.md │ │ │ └── translations/ │ │ │ └── mr-IN.json │ │ ├── build.yaml │ │ ├── cargokit_options.yaml │ │ ├── dart_dependency_validator.yaml │ │ ├── dev.env │ │ ├── devtools_options.yaml │ │ ├── distribute_options.yaml │ │ ├── dsa_pub.pem │ │ ├── integration_test/ │ │ │ ├── desktop/ │ │ │ │ ├── board/ │ │ │ │ │ ├── board_add_row_test.dart │ │ │ │ │ ├── board_field_test.dart │ │ │ │ │ ├── board_group_test.dart │ │ │ │ │ ├── board_hide_groups_test.dart │ │ │ │ │ ├── board_row_test.dart │ │ │ │ │ └── board_test_runner.dart │ │ │ │ ├── chat/ │ │ │ │ │ └── chat_page_test.dart │ │ │ │ ├── cloud/ │ │ │ │ │ ├── cloud_runner.dart │ │ │ │ │ ├── data_migration/ │ │ │ │ │ │ ├── anon_user_data_migration_test.dart │ │ │ │ │ │ └── data_migration_test_runner.dart │ │ │ │ │ ├── database/ │ │ │ │ │ │ ├── database_image_test.dart │ │ │ │ │ │ └── database_test_runner.dart │ │ │ │ │ ├── document/ │ │ │ │ │ │ ├── document_ai_writer_test.dart │ │ │ │ │ │ ├── document_copy_link_to_block_test.dart │ │ │ │ │ │ ├── document_option_actions_test.dart │ │ │ │ │ │ ├── document_publish_test.dart │ │ │ │ │ │ └── document_test_runner.dart │ │ │ │ │ ├── set_env.dart │ │ │ │ │ ├── sidebar/ │ │ │ │ │ │ ├── sidebar_icon_test.dart │ │ │ │ │ │ ├── sidebar_move_page_test.dart │ │ │ │ │ │ ├── sidebar_rename_untitled_test.dart │ │ │ │ │ │ └── sidebar_search_test.dart │ │ │ │ │ ├── uncategorized/ │ │ │ │ │ │ ├── appflowy_cloud_auth_test.dart │ │ │ │ │ │ ├── document_sync_test.dart │ │ │ │ │ │ ├── uncategorized_test_runner.dart │ │ │ │ │ │ └── user_setting_sync_test.dart │ │ │ │ │ └── workspace/ │ │ │ │ │ ├── change_name_and_icon_test.dart │ │ │ │ │ ├── collaborative_workspace_test.dart │ │ │ │ │ ├── share_menu_test.dart │ │ │ │ │ ├── tabs_test.dart │ │ │ │ │ ├── workspace_icon_test.dart │ │ │ │ │ ├── workspace_settings_test.dart │ │ │ │ │ └── workspace_test_runner.dart │ │ │ │ ├── command_palette/ │ │ │ │ │ ├── command_palette_test.dart │ │ │ │ │ ├── command_palette_test_runner.dart │ │ │ │ │ ├── folder_search_test.dart │ │ │ │ │ └── recent_history_test.dart │ │ │ │ ├── database/ │ │ │ │ │ ├── database_calendar_test.dart │ │ │ │ │ ├── database_cell_test.dart │ │ │ │ │ ├── database_field_settings_test.dart │ │ │ │ │ ├── database_field_test.dart │ │ │ │ │ ├── database_filter_test.dart │ │ │ │ │ ├── database_icon_test.dart │ │ │ │ │ ├── database_media_test.dart │ │ │ │ │ ├── database_reminder_test.dart │ │ │ │ │ ├── database_row_cover_test.dart │ │ │ │ │ ├── database_row_page_test.dart │ │ │ │ │ ├── database_setting_test.dart │ │ │ │ │ ├── database_share_test.dart │ │ │ │ │ ├── database_sort_test.dart │ │ │ │ │ ├── database_test_runner_1.dart │ │ │ │ │ ├── database_test_runner_2.dart │ │ │ │ │ └── database_view_test.dart │ │ │ │ ├── document/ │ │ │ │ │ ├── document_alignment_test.dart │ │ │ │ │ ├── document_app_lifecycle_test.dart │ │ │ │ │ ├── document_block_option_test.dart │ │ │ │ │ ├── document_callout_test.dart │ │ │ │ │ ├── document_codeblock_paste_test.dart │ │ │ │ │ ├── document_copy_and_paste_test.dart │ │ │ │ │ ├── document_create_and_delete_test.dart │ │ │ │ │ ├── document_customer_test.dart │ │ │ │ │ ├── document_deletion_test.dart │ │ │ │ │ ├── document_find_menu_test.dart │ │ │ │ │ ├── document_inline_page_reference_test.dart │ │ │ │ │ ├── document_inline_sub_page_test.dart │ │ │ │ │ ├── document_link_preview_test.dart │ │ │ │ │ ├── document_more_actions_test.dart │ │ │ │ │ ├── document_option_action_test.dart │ │ │ │ │ ├── document_selection_test.dart │ │ │ │ │ ├── document_shortcuts_test.dart │ │ │ │ │ ├── document_sub_page_test.dart │ │ │ │ │ ├── document_test_runner_1.dart │ │ │ │ │ ├── document_test_runner_2.dart │ │ │ │ │ ├── document_test_runner_3.dart │ │ │ │ │ ├── document_test_runner_4.dart │ │ │ │ │ ├── document_text_direction_test.dart │ │ │ │ │ ├── document_title_test.dart │ │ │ │ │ ├── document_toolbar_test.dart │ │ │ │ │ ├── document_with_cover_image_test.dart │ │ │ │ │ ├── document_with_database_test.dart │ │ │ │ │ ├── document_with_date_reminder_test.dart │ │ │ │ │ ├── document_with_file_test.dart │ │ │ │ │ ├── document_with_image_block_test.dart │ │ │ │ │ ├── document_with_inline_math_equation_test.dart │ │ │ │ │ ├── document_with_inline_page_test.dart │ │ │ │ │ ├── document_with_link_test.dart │ │ │ │ │ ├── document_with_multi_image_block_test.dart │ │ │ │ │ ├── document_with_outline_block_test.dart │ │ │ │ │ ├── document_with_simple_table_test.dart │ │ │ │ │ ├── document_with_toggle_heading_block_test.dart │ │ │ │ │ ├── document_with_toggle_list_test.dart │ │ │ │ │ └── edit_document_test.dart │ │ │ │ ├── first_test/ │ │ │ │ │ └── first_test.dart │ │ │ │ ├── grid/ │ │ │ │ │ ├── grid_calculations_test.dart │ │ │ │ │ ├── grid_edit_row_test.dart │ │ │ │ │ ├── grid_filter_and_sort_test.dart │ │ │ │ │ ├── grid_reopen_test.dart │ │ │ │ │ ├── grid_reorder_row_test.dart │ │ │ │ │ ├── grid_row_test.dart │ │ │ │ │ ├── grid_test_extensions.dart │ │ │ │ │ └── grid_test_runner_1.dart │ │ │ │ ├── reminder/ │ │ │ │ │ └── document_reminder_test.dart │ │ │ │ ├── settings/ │ │ │ │ │ ├── notifications_settings_test.dart │ │ │ │ │ ├── settings_billing_test.dart │ │ │ │ │ ├── settings_runner.dart │ │ │ │ │ ├── shortcuts_settings_test.dart │ │ │ │ │ └── sign_in_page_settings_test.dart │ │ │ │ ├── sidebar/ │ │ │ │ │ ├── rename_current_item_test.dart │ │ │ │ │ ├── sidebar_expand_test.dart │ │ │ │ │ ├── sidebar_favorites_test.dart │ │ │ │ │ ├── sidebar_icon_test.dart │ │ │ │ │ ├── sidebar_recent_icon_test.dart │ │ │ │ │ ├── sidebar_test.dart │ │ │ │ │ ├── sidebar_test_runner.dart │ │ │ │ │ └── sidebar_view_item_test.dart │ │ │ │ └── uncategorized/ │ │ │ │ ├── board_test.dart │ │ │ │ ├── code_block_language_selector_test.dart │ │ │ │ ├── emoji_shortcut_test.dart │ │ │ │ ├── empty_document_test.dart │ │ │ │ ├── hotkeys_test.dart │ │ │ │ ├── import_files_test.dart │ │ │ │ ├── language_test.dart │ │ │ │ ├── share_markdown_test.dart │ │ │ │ ├── switch_folder_test.dart │ │ │ │ ├── tabs_test.dart │ │ │ │ ├── uncategorized_test_runner_1.dart │ │ │ │ └── zoom_in_out_test.dart │ │ │ ├── desktop_runner_1.dart │ │ │ ├── desktop_runner_2.dart │ │ │ ├── desktop_runner_3.dart │ │ │ ├── desktop_runner_4.dart │ │ │ ├── desktop_runner_5.dart │ │ │ ├── desktop_runner_6.dart │ │ │ ├── desktop_runner_7.dart │ │ │ ├── desktop_runner_8.dart │ │ │ ├── desktop_runner_9.dart │ │ │ ├── mobile/ │ │ │ │ ├── cloud/ │ │ │ │ │ ├── cloud_runner.dart │ │ │ │ │ ├── document/ │ │ │ │ │ │ ├── publish_test.dart │ │ │ │ │ │ └── share_link_test.dart │ │ │ │ │ ├── space/ │ │ │ │ │ │ └── space_test.dart │ │ │ │ │ └── workspace/ │ │ │ │ │ └── workspace_operations_test.dart │ │ │ │ ├── document/ │ │ │ │ │ ├── at_menu_test.dart │ │ │ │ │ ├── document_test_runner.dart │ │ │ │ │ ├── icon_test.dart │ │ │ │ │ ├── page_style_test.dart │ │ │ │ │ ├── plus_menu_test.dart │ │ │ │ │ ├── simple_table_test.dart │ │ │ │ │ ├── slash_menu_test.dart │ │ │ │ │ ├── title_test.dart │ │ │ │ │ └── toolbar_test.dart │ │ │ │ ├── home_page/ │ │ │ │ │ └── create_new_page_test.dart │ │ │ │ ├── search/ │ │ │ │ │ └── search_test.dart │ │ │ │ ├── settings/ │ │ │ │ │ ├── default_text_direction_test.dart │ │ │ │ │ └── scale_factor_test.dart │ │ │ │ └── sign_in/ │ │ │ │ └── anonymous_sign_in_test.dart │ │ │ ├── mobile_runner_1.dart │ │ │ ├── runner.dart │ │ │ └── shared/ │ │ │ ├── ai_test_op.dart │ │ │ ├── auth_operation.dart │ │ │ ├── base.dart │ │ │ ├── common_operations.dart │ │ │ ├── constants.dart │ │ │ ├── data.dart │ │ │ ├── database_test_op.dart │ │ │ ├── dir.dart │ │ │ ├── document_test_operations.dart │ │ │ ├── emoji.dart │ │ │ ├── expectation.dart │ │ │ ├── ime.dart │ │ │ ├── keyboard.dart │ │ │ ├── mock/ │ │ │ │ ├── mock_ai.dart │ │ │ │ ├── mock_file_picker.dart │ │ │ │ └── mock_url_launcher.dart │ │ │ ├── settings.dart │ │ │ ├── util.dart │ │ │ └── workspace.dart │ │ ├── ios/ │ │ │ ├── .gitignore │ │ │ ├── Flutter/ │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ ├── Debug.xcconfig │ │ │ │ └── Release.xcconfig │ │ │ ├── Podfile │ │ │ ├── Runner/ │ │ │ │ ├── AppDelegate.swift │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── README.md │ │ │ │ ├── Base.lproj/ │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ └── Main.storyboard │ │ │ │ ├── Info.plist │ │ │ │ ├── Runner-Bridging-Header.h │ │ │ │ └── Runner.entitlements │ │ │ ├── Runner.xcodeproj/ │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ └── xcshareddata/ │ │ │ │ └── xcschemes/ │ │ │ │ └── Runner.xcscheme │ │ │ └── Runner.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ ├── lib/ │ │ │ ├── ai/ │ │ │ │ ├── ai.dart │ │ │ │ ├── service/ │ │ │ │ │ ├── ai_entities.dart │ │ │ │ │ ├── ai_model_state_notifier.dart │ │ │ │ │ ├── ai_prompt_database_selector_cubit.dart │ │ │ │ │ ├── ai_prompt_input_bloc.dart │ │ │ │ │ ├── ai_prompt_selector_cubit.dart │ │ │ │ │ ├── appflowy_ai_service.dart │ │ │ │ │ ├── error.dart │ │ │ │ │ ├── select_model_bloc.dart │ │ │ │ │ └── view_selector_cubit.dart │ │ │ │ └── widgets/ │ │ │ │ ├── ai_prompt_modal/ │ │ │ │ │ ├── ai_prompt_category_list.dart │ │ │ │ │ ├── ai_prompt_database_modal.dart │ │ │ │ │ ├── ai_prompt_modal.dart │ │ │ │ │ ├── ai_prompt_onboarding.dart │ │ │ │ │ ├── ai_prompt_preview.dart │ │ │ │ │ └── ai_prompt_visible_list.dart │ │ │ │ ├── loading_indicator.dart │ │ │ │ ├── prompt_input/ │ │ │ │ │ ├── action_buttons.dart │ │ │ │ │ ├── browse_prompts_button.dart │ │ │ │ │ ├── desktop_prompt_input.dart │ │ │ │ │ ├── file_attachment_list.dart │ │ │ │ │ ├── layout_define.dart │ │ │ │ │ ├── mention_page_bottom_sheet.dart │ │ │ │ │ ├── mention_page_menu.dart │ │ │ │ │ ├── mentioned_page_text_span.dart │ │ │ │ │ ├── predefined_format_buttons.dart │ │ │ │ │ ├── prompt_input_text_controller.dart │ │ │ │ │ ├── select_model_menu.dart │ │ │ │ │ ├── select_sources_bottom_sheet.dart │ │ │ │ │ ├── select_sources_menu.dart │ │ │ │ │ └── send_button.dart │ │ │ │ └── view_selector.dart │ │ │ ├── core/ │ │ │ │ ├── config/ │ │ │ │ │ ├── kv.dart │ │ │ │ │ └── kv_keys.dart │ │ │ │ ├── frameless_window.dart │ │ │ │ ├── helpers/ │ │ │ │ │ ├── helpers.dart │ │ │ │ │ ├── target_platform.dart │ │ │ │ │ └── url_launcher.dart │ │ │ │ ├── network_monitor.dart │ │ │ │ └── notification/ │ │ │ │ ├── document_notification.dart │ │ │ │ ├── folder_notification.dart │ │ │ │ ├── grid_notification.dart │ │ │ │ ├── notification_helper.dart │ │ │ │ ├── search_notification.dart │ │ │ │ └── user_notification.dart │ │ │ ├── date/ │ │ │ │ └── date_service.dart │ │ │ ├── env/ │ │ │ │ ├── backend_env.dart │ │ │ │ ├── cloud_env.dart │ │ │ │ ├── cloud_env_test.dart │ │ │ │ └── env.dart │ │ │ ├── features/ │ │ │ │ ├── page_access_level/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ └── repositories/ │ │ │ │ │ │ ├── page_access_level_repository.dart │ │ │ │ │ │ └── rust_page_access_level_repository_impl.dart │ │ │ │ │ └── logic/ │ │ │ │ │ ├── page_access_level_bloc.dart │ │ │ │ │ ├── page_access_level_event.dart │ │ │ │ │ └── page_access_level_state.dart │ │ │ │ ├── settings/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── models/ │ │ │ │ │ │ │ └── user_data_location.dart │ │ │ │ │ │ └── repositories/ │ │ │ │ │ │ ├── rust_settings_repository_impl.dart │ │ │ │ │ │ └── settings_repository.dart │ │ │ │ │ ├── logic/ │ │ │ │ │ │ ├── data_location_bloc.dart │ │ │ │ │ │ ├── data_location_event.dart │ │ │ │ │ │ └── data_location_state.dart │ │ │ │ │ └── settings.dart │ │ │ │ ├── share_tab/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── models/ │ │ │ │ │ │ │ ├── models.dart │ │ │ │ │ │ │ ├── share_access_level.dart │ │ │ │ │ │ │ ├── share_popover_group_id.dart │ │ │ │ │ │ │ ├── share_role.dart │ │ │ │ │ │ │ ├── share_section_type.dart │ │ │ │ │ │ │ ├── shared_group.dart │ │ │ │ │ │ │ └── shared_user.dart │ │ │ │ │ │ └── repositories/ │ │ │ │ │ │ ├── local_share_with_user_repository_impl.dart │ │ │ │ │ │ ├── rust_share_with_user_repository_impl.dart │ │ │ │ │ │ └── share_with_user_repository.dart │ │ │ │ │ ├── logic/ │ │ │ │ │ │ ├── share_tab_bloc.dart │ │ │ │ │ │ ├── share_tab_event.dart │ │ │ │ │ │ └── share_tab_state.dart │ │ │ │ │ └── presentation/ │ │ │ │ │ ├── share_tab.dart │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── access_level_list_widget.dart │ │ │ │ │ ├── copy_link_widget.dart │ │ │ │ │ ├── edit_access_level_widget.dart │ │ │ │ │ ├── general_access_section.dart │ │ │ │ │ ├── guest_tag.dart │ │ │ │ │ ├── people_with_access_section.dart │ │ │ │ │ ├── share_with_user_widget.dart │ │ │ │ │ ├── shared_group_widget.dart │ │ │ │ │ ├── shared_user_widget.dart │ │ │ │ │ ├── turn_into_member_widget.dart │ │ │ │ │ └── upgrade_to_pro_widget.dart │ │ │ │ ├── shared_section/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ └── repositories/ │ │ │ │ │ │ ├── local_shared_pages_repository_impl.dart │ │ │ │ │ │ ├── rust_shared_pages_repository_impl.dart │ │ │ │ │ │ └── shared_pages_repository.dart │ │ │ │ │ ├── logic/ │ │ │ │ │ │ ├── shared_section_bloc.dart │ │ │ │ │ │ ├── shared_section_event.dart │ │ │ │ │ │ └── shared_section_state.dart │ │ │ │ │ ├── models/ │ │ │ │ │ │ └── shared_page.dart │ │ │ │ │ └── presentation/ │ │ │ │ │ ├── m_shared_section.dart │ │ │ │ │ ├── shared_section.dart │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── m_shared_page_list.dart │ │ │ │ │ ├── m_shared_section_header.dart │ │ │ │ │ ├── refresh_button.dart │ │ │ │ │ ├── shared_page_actions_button.dart │ │ │ │ │ ├── shared_page_list.dart │ │ │ │ │ ├── shared_section_empty.dart │ │ │ │ │ ├── shared_section_error.dart │ │ │ │ │ ├── shared_section_header.dart │ │ │ │ │ └── shared_section_loading.dart │ │ │ │ ├── util/ │ │ │ │ │ └── extensions.dart │ │ │ │ ├── view_management/ │ │ │ │ │ ├── README.md │ │ │ │ │ └── logic/ │ │ │ │ │ ├── view_event.dart │ │ │ │ │ ├── view_management_bloc.dart │ │ │ │ │ └── view_state.dart │ │ │ │ └── workspace/ │ │ │ │ ├── data/ │ │ │ │ │ └── repositories/ │ │ │ │ │ ├── rust_workspace_repository_impl.dart │ │ │ │ │ └── workspace_repository.dart │ │ │ │ └── logic/ │ │ │ │ ├── workspace_bloc.dart │ │ │ │ ├── workspace_event.dart │ │ │ │ └── workspace_state.dart │ │ │ ├── flutter/ │ │ │ │ └── af_dropdown_menu.dart │ │ │ ├── main.dart │ │ │ ├── mobile/ │ │ │ │ ├── application/ │ │ │ │ │ ├── base/ │ │ │ │ │ │ └── mobile_view_page_bloc.dart │ │ │ │ │ ├── mobile_router.dart │ │ │ │ │ ├── notification/ │ │ │ │ │ │ └── notification_reminder_bloc.dart │ │ │ │ │ ├── page_style/ │ │ │ │ │ │ └── document_page_style_bloc.dart │ │ │ │ │ ├── recent/ │ │ │ │ │ │ └── recent_view_bloc.dart │ │ │ │ │ └── user_profile/ │ │ │ │ │ └── user_profile_bloc.dart │ │ │ │ └── presentation/ │ │ │ │ ├── base/ │ │ │ │ │ ├── animated_gesture.dart │ │ │ │ │ ├── app_bar/ │ │ │ │ │ │ ├── app_bar.dart │ │ │ │ │ │ └── app_bar_actions.dart │ │ │ │ │ ├── flowy_search_text_field.dart │ │ │ │ │ ├── mobile_view_page.dart │ │ │ │ │ ├── option_color_list.dart │ │ │ │ │ ├── type_option_menu_item.dart │ │ │ │ │ └── view_page/ │ │ │ │ │ ├── app_bar_buttons.dart │ │ │ │ │ └── more_bottom_sheet.dart │ │ │ │ ├── bottom_sheet/ │ │ │ │ │ ├── bottom_sheet.dart │ │ │ │ │ ├── bottom_sheet_action_widget.dart │ │ │ │ │ ├── bottom_sheet_add_new_page.dart │ │ │ │ │ ├── bottom_sheet_block_action_widget.dart │ │ │ │ │ ├── bottom_sheet_buttons.dart │ │ │ │ │ ├── bottom_sheet_drag_handler.dart │ │ │ │ │ ├── bottom_sheet_edit_link_widget.dart │ │ │ │ │ ├── bottom_sheet_header.dart │ │ │ │ │ ├── bottom_sheet_media_upload.dart │ │ │ │ │ ├── bottom_sheet_rename_widget.dart │ │ │ │ │ ├── bottom_sheet_view_item.dart │ │ │ │ │ ├── bottom_sheet_view_item_body.dart │ │ │ │ │ ├── bottom_sheet_view_page.dart │ │ │ │ │ ├── default_mobile_action_pane.dart │ │ │ │ │ ├── show_mobile_bottom_sheet.dart │ │ │ │ │ └── show_transition_bottom_sheet.dart │ │ │ │ ├── chat/ │ │ │ │ │ └── mobile_chat_screen.dart │ │ │ │ ├── database/ │ │ │ │ │ ├── board/ │ │ │ │ │ │ ├── board.dart │ │ │ │ │ │ ├── mobile_board_page.dart │ │ │ │ │ │ ├── mobile_board_screen.dart │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ ├── group_card_header.dart │ │ │ │ │ │ ├── mobile_board_trailing.dart │ │ │ │ │ │ ├── mobile_hidden_groups_column.dart │ │ │ │ │ │ └── widgets.dart │ │ │ │ │ ├── card/ │ │ │ │ │ │ ├── card.dart │ │ │ │ │ │ ├── card_detail/ │ │ │ │ │ │ │ ├── mobile_card_detail_screen.dart │ │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ │ ├── mobile_create_field_button.dart │ │ │ │ │ │ │ ├── mobile_row_property_list.dart │ │ │ │ │ │ │ ├── option_text_field.dart │ │ │ │ │ │ │ ├── row_page_button.dart │ │ │ │ │ │ │ └── widgets.dart │ │ │ │ │ │ └── mobile_card_content.dart │ │ │ │ │ ├── date_picker/ │ │ │ │ │ │ └── mobile_date_picker_screen.dart │ │ │ │ │ ├── field/ │ │ │ │ │ │ ├── mobile_create_field_screen.dart │ │ │ │ │ │ ├── mobile_edit_field_screen.dart │ │ │ │ │ │ ├── mobile_field_bottom_sheets.dart │ │ │ │ │ │ ├── mobile_field_picker_list.dart │ │ │ │ │ │ ├── mobile_full_field_editor.dart │ │ │ │ │ │ └── mobile_quick_field_editor.dart │ │ │ │ │ ├── mobile_calendar_events_empty.dart │ │ │ │ │ ├── mobile_calendar_events_screen.dart │ │ │ │ │ ├── mobile_calendar_screen.dart │ │ │ │ │ ├── mobile_grid_screen.dart │ │ │ │ │ └── view/ │ │ │ │ │ ├── database_field_list.dart │ │ │ │ │ ├── database_filter_bottom_sheet.dart │ │ │ │ │ ├── database_filter_bottom_sheet_cubit.dart │ │ │ │ │ ├── database_filter_condition_list.dart │ │ │ │ │ ├── database_sort_bottom_sheet.dart │ │ │ │ │ ├── database_sort_bottom_sheet_cubit.dart │ │ │ │ │ ├── database_view_layout.dart │ │ │ │ │ ├── database_view_list.dart │ │ │ │ │ ├── database_view_quick_actions.dart │ │ │ │ │ └── edit_database_view_screen.dart │ │ │ │ ├── editor/ │ │ │ │ │ └── mobile_editor_screen.dart │ │ │ │ ├── favorite/ │ │ │ │ │ ├── mobile_favorite_folder.dart │ │ │ │ │ └── mobile_favorite_page.dart │ │ │ │ ├── home/ │ │ │ │ │ ├── favorite_folder/ │ │ │ │ │ │ ├── favorite_space.dart │ │ │ │ │ │ ├── mobile_home_favorite_folder.dart │ │ │ │ │ │ └── mobile_home_favorite_folder_header.dart │ │ │ │ │ ├── home.dart │ │ │ │ │ ├── home_space/ │ │ │ │ │ │ └── home_space.dart │ │ │ │ │ ├── mobile_folders.dart │ │ │ │ │ ├── mobile_home_page.dart │ │ │ │ │ ├── mobile_home_page_header.dart │ │ │ │ │ ├── mobile_home_setting_page.dart │ │ │ │ │ ├── mobile_home_trash_page.dart │ │ │ │ │ ├── recent_folder/ │ │ │ │ │ │ ├── mobile_home_recent_views.dart │ │ │ │ │ │ ├── mobile_recent_view.dart │ │ │ │ │ │ └── recent_space.dart │ │ │ │ │ ├── section_folder/ │ │ │ │ │ │ ├── mobile_home_section_folder.dart │ │ │ │ │ │ └── mobile_home_section_folder_header.dart │ │ │ │ │ ├── setting/ │ │ │ │ │ │ └── settings_popup_menu.dart │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── empty_placeholder.dart │ │ │ │ │ │ └── mobile_page_card.dart │ │ │ │ │ ├── space/ │ │ │ │ │ │ ├── constants.dart │ │ │ │ │ │ ├── manage_space_widget.dart │ │ │ │ │ │ ├── mobile_space.dart │ │ │ │ │ │ ├── mobile_space_header.dart │ │ │ │ │ │ ├── mobile_space_menu.dart │ │ │ │ │ │ ├── space_menu_bottom_sheet.dart │ │ │ │ │ │ ├── space_permission_bottom_sheet.dart │ │ │ │ │ │ └── widgets.dart │ │ │ │ │ ├── tab/ │ │ │ │ │ │ ├── _round_underline_tab_indicator.dart │ │ │ │ │ │ ├── _tab_bar.dart │ │ │ │ │ │ ├── ai_bubble_button.dart │ │ │ │ │ │ ├── mobile_space_tab.dart │ │ │ │ │ │ └── space_order_bloc.dart │ │ │ │ │ └── workspaces/ │ │ │ │ │ ├── create_workspace_menu.dart │ │ │ │ │ ├── workspace_menu_bottom_sheet.dart │ │ │ │ │ └── workspace_more_options.dart │ │ │ │ ├── inline_actions/ │ │ │ │ │ ├── mobile_inline_actions_handler.dart │ │ │ │ │ ├── mobile_inline_actions_menu.dart │ │ │ │ │ └── mobile_inline_actions_menu_group.dart │ │ │ │ ├── mobile_bottom_navigation_bar.dart │ │ │ │ ├── notifications/ │ │ │ │ │ ├── mobile_notifications_multiple_select_page.dart │ │ │ │ │ ├── mobile_notifications_page.dart │ │ │ │ │ ├── mobile_notifications_screen.dart │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── color.dart │ │ │ │ │ ├── empty.dart │ │ │ │ │ ├── header.dart │ │ │ │ │ ├── mobile_notification_tab_bar.dart │ │ │ │ │ ├── multi_select_notification_item.dart │ │ │ │ │ ├── notification_item.dart │ │ │ │ │ ├── settings_popup_menu.dart │ │ │ │ │ ├── shared.dart │ │ │ │ │ ├── slide_actions.dart │ │ │ │ │ ├── tab.dart │ │ │ │ │ ├── tab_bar.dart │ │ │ │ │ └── widgets.dart │ │ │ │ ├── page_item/ │ │ │ │ │ ├── mobile_slide_action_button.dart │ │ │ │ │ ├── mobile_view_item.dart │ │ │ │ │ └── mobile_view_item_add_button.dart │ │ │ │ ├── presentation.dart │ │ │ │ ├── root_placeholder_page.dart │ │ │ │ ├── search/ │ │ │ │ │ ├── mobile_search_ask_ai_entrance.dart │ │ │ │ │ ├── mobile_search_cell.dart │ │ │ │ │ ├── mobile_search_icon.dart │ │ │ │ │ ├── mobile_search_page.dart │ │ │ │ │ ├── mobile_search_reference_bottom_sheet.dart │ │ │ │ │ ├── mobile_search_result.dart │ │ │ │ │ ├── mobile_search_summary_cell.dart │ │ │ │ │ ├── mobile_search_textfield.dart │ │ │ │ │ ├── mobile_view_ancestors.dart │ │ │ │ │ └── view_ancestor_cache.dart │ │ │ │ ├── selection_menu/ │ │ │ │ │ ├── mobile_selection_menu.dart │ │ │ │ │ ├── mobile_selection_menu_item.dart │ │ │ │ │ ├── mobile_selection_menu_item_widget.dart │ │ │ │ │ ├── mobile_selection_menu_widget.dart │ │ │ │ │ └── slash_keyboard_service_interceptor.dart │ │ │ │ ├── setting/ │ │ │ │ │ ├── about/ │ │ │ │ │ │ ├── about.dart │ │ │ │ │ │ └── about_setting_group.dart │ │ │ │ │ ├── ai/ │ │ │ │ │ │ └── ai_settings_group.dart │ │ │ │ │ ├── appearance/ │ │ │ │ │ │ ├── appearance_setting_group.dart │ │ │ │ │ │ ├── rtl_setting.dart │ │ │ │ │ │ ├── text_scale_setting.dart │ │ │ │ │ │ └── theme_setting.dart │ │ │ │ │ ├── cloud/ │ │ │ │ │ │ ├── appflowy_cloud_page.dart │ │ │ │ │ │ └── cloud_setting_group.dart │ │ │ │ │ ├── font/ │ │ │ │ │ │ ├── font_picker_screen.dart │ │ │ │ │ │ └── font_setting.dart │ │ │ │ │ ├── language/ │ │ │ │ │ │ └── language_picker_screen.dart │ │ │ │ │ ├── language_setting_group.dart │ │ │ │ │ ├── launch_settings_page.dart │ │ │ │ │ ├── notifications_setting_group.dart │ │ │ │ │ ├── personal_info/ │ │ │ │ │ │ ├── edit_username_bottom_sheet.dart │ │ │ │ │ │ ├── personal_info.dart │ │ │ │ │ │ └── personal_info_setting_group.dart │ │ │ │ │ ├── self_host/ │ │ │ │ │ │ └── self_host_bottom_sheet.dart │ │ │ │ │ ├── self_host_setting_group.dart │ │ │ │ │ ├── setting.dart │ │ │ │ │ ├── support_setting_group.dart │ │ │ │ │ ├── user_session_setting_group.dart │ │ │ │ │ ├── widgets/ │ │ │ │ │ │ ├── mobile_setting_group_widget.dart │ │ │ │ │ │ ├── mobile_setting_item_widget.dart │ │ │ │ │ │ ├── mobile_setting_trailing.dart │ │ │ │ │ │ └── widgets.dart │ │ │ │ │ └── workspace/ │ │ │ │ │ ├── add_members_screen.dart │ │ │ │ │ ├── invite_member_by_link.dart │ │ │ │ │ ├── invite_members_screen.dart │ │ │ │ │ ├── member_list.dart │ │ │ │ │ └── workspace_setting_group.dart │ │ │ │ └── widgets/ │ │ │ │ ├── flowy_mobile_option_decorate_box.dart │ │ │ │ ├── flowy_mobile_quick_action_button.dart │ │ │ │ ├── flowy_mobile_search_text_field.dart │ │ │ │ ├── flowy_mobile_state_container.dart │ │ │ │ ├── flowy_option_tile.dart │ │ │ │ ├── navigation_bar_button.dart │ │ │ │ ├── show_flowy_mobile_confirm_dialog.dart │ │ │ │ └── widgets.dart │ │ │ ├── plugins/ │ │ │ │ ├── ai_chat/ │ │ │ │ │ ├── application/ │ │ │ │ │ │ ├── ai_chat_prelude.dart │ │ │ │ │ │ ├── ai_model_switch_listener.dart │ │ │ │ │ │ ├── chat_ai_message_bloc.dart │ │ │ │ │ │ ├── chat_bloc.dart │ │ │ │ │ │ ├── chat_edit_document_service.dart │ │ │ │ │ │ ├── chat_entity.dart │ │ │ │ │ │ ├── chat_input_control_cubit.dart │ │ │ │ │ │ ├── chat_input_file_bloc.dart │ │ │ │ │ │ ├── chat_member_bloc.dart │ │ │ │ │ │ ├── chat_message_handler.dart │ │ │ │ │ │ ├── chat_message_height_manager.dart │ │ │ │ │ │ ├── chat_message_listener.dart │ │ │ │ │ │ ├── chat_message_service.dart │ │ │ │ │ │ ├── chat_message_stream.dart │ │ │ │ │ │ ├── chat_notification.dart │ │ │ │ │ │ ├── chat_select_message_bloc.dart │ │ │ │ │ │ ├── chat_settings_manager.dart │ │ │ │ │ │ ├── chat_stream_manager.dart │ │ │ │ │ │ ├── chat_user_cubit.dart │ │ │ │ │ │ └── chat_user_message_bloc.dart │ │ │ │ │ ├── chat.dart │ │ │ │ │ ├── chat_page.dart │ │ │ │ │ └── presentation/ │ │ │ │ │ ├── animated_chat_list.dart │ │ │ │ │ ├── animated_chat_list_reversed.dart │ │ │ │ │ ├── chat_avatar.dart │ │ │ │ │ ├── chat_editor_style.dart │ │ │ │ │ ├── chat_input/ │ │ │ │ │ │ └── mobile_chat_input.dart │ │ │ │ │ ├── chat_message_selector_banner.dart │ │ │ │ │ ├── chat_page/ │ │ │ │ │ │ ├── chat_animation_list_widget.dart │ │ │ │ │ │ ├── chat_content_page.dart │ │ │ │ │ │ ├── chat_footer.dart │ │ │ │ │ │ ├── chat_message_widget.dart │ │ │ │ │ │ ├── load_chat_message_status_ready.dart │ │ │ │ │ │ └── text_message_widget.dart │ │ │ │ │ ├── chat_related_question.dart │ │ │ │ │ ├── chat_welcome_page.dart │ │ │ │ │ ├── layout_define.dart │ │ │ │ │ ├── message/ │ │ │ │ │ │ ├── ai_change_format_bottom_sheet.dart │ │ │ │ │ │ ├── ai_change_model_bottom_sheet.dart │ │ │ │ │ │ ├── ai_markdown_text.dart │ │ │ │ │ │ ├── ai_message_action_bar.dart │ │ │ │ │ │ ├── ai_message_bubble.dart │ │ │ │ │ │ ├── ai_metadata.dart │ │ │ │ │ │ ├── ai_text_message.dart │ │ │ │ │ │ ├── error_text_message.dart │ │ │ │ │ │ ├── message_util.dart │ │ │ │ │ │ ├── user_message_bubble.dart │ │ │ │ │ │ └── user_text_message.dart │ │ │ │ │ ├── scroll_to_bottom.dart │ │ │ │ │ └── widgets/ │ │ │ │ │ └── message_height_calculator.dart │ │ │ │ ├── base/ │ │ │ │ │ ├── color/ │ │ │ │ │ │ ├── color_picker.dart │ │ │ │ │ │ └── color_picker_screen.dart │ │ │ │ │ ├── drag_handler.dart │ │ │ │ │ ├── emoji/ │ │ │ │ │ │ ├── emoji_picker.dart │ │ │ │ │ │ ├── emoji_picker_header.dart │ │ │ │ │ │ ├── emoji_picker_screen.dart │ │ │ │ │ │ └── emoji_text.dart │ │ │ │ │ └── icon/ │ │ │ │ │ └── icon_widget.dart │ │ │ │ ├── blank/ │ │ │ │ │ └── blank.dart │ │ │ │ ├── database/ │ │ │ │ │ ├── application/ │ │ │ │ │ │ ├── calculations/ │ │ │ │ │ │ │ ├── calculation_type_ext.dart │ │ │ │ │ │ │ ├── calculations_listener.dart │ │ │ │ │ │ │ └── calculations_service.dart │ │ │ │ │ │ ├── cell/ │ │ │ │ │ │ │ ├── bloc/ │ │ │ │ │ │ │ │ ├── checkbox_cell_bloc.dart │ │ │ │ │ │ │ │ ├── checklist_cell_bloc.dart │ │ │ │ │ │ │ │ ├── date_cell_bloc.dart │ │ │ │ │ │ │ │ ├── date_cell_editor_bloc.dart │ │ │ │ │ │ │ │ ├── media_cell_bloc.dart │ │ │ │ │ │ │ │ ├── number_cell_bloc.dart │ │ │ │ │ │ │ │ ├── relation_cell_bloc.dart │ │ │ │ │ │ │ │ ├── relation_row_search_bloc.dart │ │ │ │ │ │ │ │ ├── select_option_cell_bloc.dart │ │ │ │ │ │ │ │ ├── select_option_cell_editor_bloc.dart │ │ │ │ │ │ │ │ ├── summary_cell_bloc.dart │ │ │ │ │ │ │ │ ├── summary_row_bloc.dart │ │ │ │ │ │ │ │ ├── text_cell_bloc.dart │ │ │ │ │ │ │ │ ├── time_cell_bloc.dart │ │ │ │ │ │ │ │ ├── timestamp_cell_bloc.dart │ │ │ │ │ │ │ │ ├── translate_cell_bloc.dart │ │ │ │ │ │ │ │ ├── translate_row_bloc.dart │ │ │ │ │ │ │ │ └── url_cell_bloc.dart │ │ │ │ │ │ │ ├── cell_cache.dart │ │ │ │ │ │ │ ├── cell_controller.dart │ │ │ │ │ │ │ ├── cell_controller_builder.dart │ │ │ │ │ │ │ ├── cell_data_loader.dart │ │ │ │ │ │ │ └── cell_data_persistence.dart │ │ │ │ │ │ ├── database_controller.dart │ │ │ │ │ │ ├── defines.dart │ │ │ │ │ │ ├── field/ │ │ │ │ │ │ │ ├── field_cell_bloc.dart │ │ │ │ │ │ │ ├── field_controller.dart │ │ │ │ │ │ │ ├── field_editor_bloc.dart │ │ │ │ │ │ │ ├── field_info.dart │ │ │ │ │ │ │ ├── filter_entities.dart │ │ │ │ │ │ │ ├── sort_entities.dart │ │ │ │ │ │ │ └── type_option/ │ │ │ │ │ │ │ ├── edit_select_option_bloc.dart │ │ │ │ │ │ │ ├── number_format_bloc.dart │ │ │ │ │ │ │ ├── relation_type_option_cubit.dart │ │ │ │ │ │ │ ├── select_option_type_option_bloc.dart │ │ │ │ │ │ │ ├── select_type_option_actions.dart │ │ │ │ │ │ │ ├── translate_type_option_bloc.dart │ │ │ │ │ │ │ └── type_option_data_parser.dart │ │ │ │ │ │ ├── layout/ │ │ │ │ │ │ │ └── layout_bloc.dart │ │ │ │ │ │ ├── row/ │ │ │ │ │ │ │ ├── related_row_detail_bloc.dart │ │ │ │ │ │ │ ├── row_banner_bloc.dart │ │ │ │ │ │ │ ├── row_cache.dart │ │ │ │ │ │ │ ├── row_controller.dart │ │ │ │ │ │ │ ├── row_list.dart │ │ │ │ │ │ │ └── row_service.dart │ │ │ │ │ │ ├── setting/ │ │ │ │ │ │ │ ├── group_bloc.dart │ │ │ │ │ │ │ ├── property_bloc.dart │ │ │ │ │ │ │ ├── setting_listener.dart │ │ │ │ │ │ │ └── setting_service.dart │ │ │ │ │ │ ├── share_bloc.dart │ │ │ │ │ │ ├── sync/ │ │ │ │ │ │ │ ├── database_sync_bloc.dart │ │ │ │ │ │ │ └── database_sync_state_listener.dart │ │ │ │ │ │ ├── tab_bar_bloc.dart │ │ │ │ │ │ └── view/ │ │ │ │ │ │ ├── view_cache.dart │ │ │ │ │ │ └── view_listener.dart │ │ │ │ │ ├── board/ │ │ │ │ │ │ ├── application/ │ │ │ │ │ │ │ ├── board_actions_bloc.dart │ │ │ │ │ │ │ ├── board_bloc.dart │ │ │ │ │ │ │ └── group_controller.dart │ │ │ │ │ │ ├── board.dart │ │ │ │ │ │ ├── group_ext.dart │ │ │ │ │ │ ├── presentation/ │ │ │ │ │ │ │ ├── board_page.dart │ │ │ │ │ │ │ ├── toolbar/ │ │ │ │ │ │ │ │ └── board_setting_bar.dart │ │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ │ ├── board_checkbox_column_header.dart │ │ │ │ │ │ │ ├── board_column_header.dart │ │ │ │ │ │ │ ├── board_editable_column_header.dart │ │ │ │ │ │ │ ├── board_focus_scope.dart │ │ │ │ │ │ │ ├── board_hidden_groups.dart │ │ │ │ │ │ │ └── board_shortcut_container.dart │ │ │ │ │ │ └── tests/ │ │ │ │ │ │ └── integrate_test/ │ │ │ │ │ │ └── card_test.dart │ │ │ │ │ ├── calendar/ │ │ │ │ │ │ ├── application/ │ │ │ │ │ │ │ ├── calendar_bloc.dart │ │ │ │ │ │ │ ├── calendar_event_editor_bloc.dart │ │ │ │ │ │ │ ├── calendar_setting_bloc.dart │ │ │ │ │ │ │ └── unschedule_event_bloc.dart │ │ │ │ │ │ ├── calendar.dart │ │ │ │ │ │ └── presentation/ │ │ │ │ │ │ ├── calendar_day.dart │ │ │ │ │ │ ├── calendar_event_card.dart │ │ │ │ │ │ ├── calendar_event_editor.dart │ │ │ │ │ │ ├── calendar_page.dart │ │ │ │ │ │ ├── layout/ │ │ │ │ │ │ │ └── sizes.dart │ │ │ │ │ │ └── toolbar/ │ │ │ │ │ │ ├── calendar_layout_setting.dart │ │ │ │ │ │ └── calendar_setting_bar.dart │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── cell_listener.dart │ │ │ │ │ │ ├── cell_service.dart │ │ │ │ │ │ ├── checklist_cell_service.dart │ │ │ │ │ │ ├── database_view_service.dart │ │ │ │ │ │ ├── date_cell_service.dart │ │ │ │ │ │ ├── field_backend_service.dart │ │ │ │ │ │ ├── field_listener.dart │ │ │ │ │ │ ├── field_service.dart │ │ │ │ │ │ ├── field_settings_listener.dart │ │ │ │ │ │ ├── field_settings_service.dart │ │ │ │ │ │ ├── filter_listener.dart │ │ │ │ │ │ ├── filter_service.dart │ │ │ │ │ │ ├── group_listener.dart │ │ │ │ │ │ ├── group_service.dart │ │ │ │ │ │ ├── layout_service.dart │ │ │ │ │ │ ├── layout_setting_listener.dart │ │ │ │ │ │ ├── row_listener.dart │ │ │ │ │ │ ├── row_meta_listener.dart │ │ │ │ │ │ ├── select_option_cell_service.dart │ │ │ │ │ │ ├── sort_listener.dart │ │ │ │ │ │ ├── sort_service.dart │ │ │ │ │ │ └── type_option_service.dart │ │ │ │ │ ├── grid/ │ │ │ │ │ │ ├── application/ │ │ │ │ │ │ │ ├── calculations/ │ │ │ │ │ │ │ │ ├── calculations_bloc.dart │ │ │ │ │ │ │ │ └── field_type_calc_ext.dart │ │ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ │ │ ├── filter_editor_bloc.dart │ │ │ │ │ │ │ │ └── select_option_loader.dart │ │ │ │ │ │ │ ├── grid_accessory_bloc.dart │ │ │ │ │ │ │ ├── grid_bloc.dart │ │ │ │ │ │ │ ├── grid_header_bloc.dart │ │ │ │ │ │ │ ├── row/ │ │ │ │ │ │ │ │ ├── mobile_row_detail_bloc.dart │ │ │ │ │ │ │ │ ├── row_bloc.dart │ │ │ │ │ │ │ │ ├── row_detail_bloc.dart │ │ │ │ │ │ │ │ └── row_document_bloc.dart │ │ │ │ │ │ │ ├── simple_text_filter_bloc.dart │ │ │ │ │ │ │ └── sort/ │ │ │ │ │ │ │ └── sort_editor_bloc.dart │ │ │ │ │ │ ├── grid.dart │ │ │ │ │ │ └── presentation/ │ │ │ │ │ │ ├── grid_page.dart │ │ │ │ │ │ ├── grid_scroll.dart │ │ │ │ │ │ ├── layout/ │ │ │ │ │ │ │ ├── layout.dart │ │ │ │ │ │ │ └── sizes.dart │ │ │ │ │ │ ├── mobile_grid_page.dart │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ ├── calculations/ │ │ │ │ │ │ │ ├── calculate_cell.dart │ │ │ │ │ │ │ ├── calculation_selector.dart │ │ │ │ │ │ │ ├── calculation_type_item.dart │ │ │ │ │ │ │ ├── calculations_row.dart │ │ │ │ │ │ │ └── remove_calculation_button.dart │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ └── type_option_separator.dart │ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ │ ├── choicechip/ │ │ │ │ │ │ │ │ ├── checkbox.dart │ │ │ │ │ │ │ │ ├── checklist.dart │ │ │ │ │ │ │ │ ├── choicechip.dart │ │ │ │ │ │ │ │ ├── date.dart │ │ │ │ │ │ │ │ ├── number.dart │ │ │ │ │ │ │ │ ├── select_option/ │ │ │ │ │ │ │ │ │ ├── condition_list.dart │ │ │ │ │ │ │ │ │ ├── option_list.dart │ │ │ │ │ │ │ │ │ └── select_option.dart │ │ │ │ │ │ │ │ ├── text.dart │ │ │ │ │ │ │ │ ├── time.dart │ │ │ │ │ │ │ │ └── url.dart │ │ │ │ │ │ │ ├── condition_button.dart │ │ │ │ │ │ │ ├── create_filter_list.dart │ │ │ │ │ │ │ ├── disclosure_button.dart │ │ │ │ │ │ │ ├── filter_menu.dart │ │ │ │ │ │ │ └── filter_menu_item.dart │ │ │ │ │ │ ├── footer/ │ │ │ │ │ │ │ └── grid_footer.dart │ │ │ │ │ │ ├── header/ │ │ │ │ │ │ │ ├── desktop_field_cell.dart │ │ │ │ │ │ │ ├── field_type_extension.dart │ │ │ │ │ │ │ ├── grid_header.dart │ │ │ │ │ │ │ ├── mobile_field_button.dart │ │ │ │ │ │ │ └── mobile_grid_header.dart │ │ │ │ │ │ ├── mobile_fab.dart │ │ │ │ │ │ ├── row/ │ │ │ │ │ │ │ ├── action.dart │ │ │ │ │ │ │ ├── mobile_row.dart │ │ │ │ │ │ │ └── row.dart │ │ │ │ │ │ ├── shortcuts.dart │ │ │ │ │ │ ├── sort/ │ │ │ │ │ │ │ ├── create_sort_list.dart │ │ │ │ │ │ │ ├── order_panel.dart │ │ │ │ │ │ │ ├── sort_choice_button.dart │ │ │ │ │ │ │ ├── sort_editor.dart │ │ │ │ │ │ │ └── sort_menu.dart │ │ │ │ │ │ └── toolbar/ │ │ │ │ │ │ ├── filter_button.dart │ │ │ │ │ │ ├── grid_setting_bar.dart │ │ │ │ │ │ ├── sort_button.dart │ │ │ │ │ │ └── view_database_button.dart │ │ │ │ │ ├── tab_bar/ │ │ │ │ │ │ ├── desktop/ │ │ │ │ │ │ │ ├── setting_menu.dart │ │ │ │ │ │ │ ├── tab_bar_add_button.dart │ │ │ │ │ │ │ └── tab_bar_header.dart │ │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ │ └── mobile_tab_bar_header.dart │ │ │ │ │ │ └── tab_bar_view.dart │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── card/ │ │ │ │ │ │ ├── card.dart │ │ │ │ │ │ ├── card_bloc.dart │ │ │ │ │ │ └── container/ │ │ │ │ │ │ ├── accessory.dart │ │ │ │ │ │ └── card_container.dart │ │ │ │ │ ├── cell/ │ │ │ │ │ │ ├── card_cell_builder.dart │ │ │ │ │ │ ├── card_cell_skeleton/ │ │ │ │ │ │ │ ├── card_cell.dart │ │ │ │ │ │ │ ├── checkbox_card_cell.dart │ │ │ │ │ │ │ ├── checklist_card_cell.dart │ │ │ │ │ │ │ ├── date_card_cell.dart │ │ │ │ │ │ │ ├── media_card_cell.dart │ │ │ │ │ │ │ ├── number_card_cell.dart │ │ │ │ │ │ │ ├── relation_card_cell.dart │ │ │ │ │ │ │ ├── select_option_card_cell.dart │ │ │ │ │ │ │ ├── summary_card_cell.dart │ │ │ │ │ │ │ ├── text_card_cell.dart │ │ │ │ │ │ │ ├── time_card_cell.dart │ │ │ │ │ │ │ ├── timestamp_card_cell.dart │ │ │ │ │ │ │ ├── translate_card_cell.dart │ │ │ │ │ │ │ └── url_card_cell.dart │ │ │ │ │ │ ├── card_cell_style_maps/ │ │ │ │ │ │ │ ├── calendar_card_cell_style.dart │ │ │ │ │ │ │ ├── desktop_board_card_cell_style.dart │ │ │ │ │ │ │ └── mobile_board_card_cell_style.dart │ │ │ │ │ │ ├── desktop_grid/ │ │ │ │ │ │ │ ├── desktop_grid_checkbox_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_checklist_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_date_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_media_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_number_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_relation_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_select_option_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_summary_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_text_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_time_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_timestamp_cell.dart │ │ │ │ │ │ │ ├── desktop_grid_translate_cell.dart │ │ │ │ │ │ │ └── desktop_grid_url_cell.dart │ │ │ │ │ │ ├── desktop_row_detail/ │ │ │ │ │ │ │ ├── desktop_row_detail_checkbox_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_checklist_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_date_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_media_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_number_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_relation_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_select_option_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_summary_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_text_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_time_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_timestamp_cell.dart │ │ │ │ │ │ │ ├── desktop_row_detail_url_cell.dart │ │ │ │ │ │ │ └── destop_row_detail_translate_cell.dart │ │ │ │ │ │ ├── editable_cell_builder.dart │ │ │ │ │ │ ├── editable_cell_skeleton/ │ │ │ │ │ │ │ ├── checkbox.dart │ │ │ │ │ │ │ ├── checklist.dart │ │ │ │ │ │ │ ├── date.dart │ │ │ │ │ │ │ ├── media.dart │ │ │ │ │ │ │ ├── number.dart │ │ │ │ │ │ │ ├── relation.dart │ │ │ │ │ │ │ ├── select_option.dart │ │ │ │ │ │ │ ├── summary.dart │ │ │ │ │ │ │ ├── text.dart │ │ │ │ │ │ │ ├── time.dart │ │ │ │ │ │ │ ├── timestamp.dart │ │ │ │ │ │ │ ├── translate.dart │ │ │ │ │ │ │ └── url.dart │ │ │ │ │ │ ├── mobile_grid/ │ │ │ │ │ │ │ ├── mobile_grid_checkbox_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_checklist_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_date_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_number_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_relation_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_select_option_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_summary_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_text_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_time_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_timestamp_cell.dart │ │ │ │ │ │ │ ├── mobile_grid_translate_cell.dart │ │ │ │ │ │ │ └── mobile_grid_url_cell.dart │ │ │ │ │ │ └── mobile_row_detail/ │ │ │ │ │ │ ├── mobile_row_detail_checkbox_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_checklist_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_date_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_number_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_relation_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_select_cell_option.dart │ │ │ │ │ │ ├── mobile_row_detail_summary_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_text_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_time_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_timestamp_cell.dart │ │ │ │ │ │ ├── mobile_row_detail_translate_cell.dart │ │ │ │ │ │ └── mobile_row_detail_url_cell.dart │ │ │ │ │ ├── cell_editor/ │ │ │ │ │ │ ├── checklist_cell_editor.dart │ │ │ │ │ │ ├── checklist_cell_textfield.dart │ │ │ │ │ │ ├── checklist_progress_bar.dart │ │ │ │ │ │ ├── date_cell_editor.dart │ │ │ │ │ │ ├── extension.dart │ │ │ │ │ │ ├── media_cell_editor.dart │ │ │ │ │ │ ├── mobile_checklist_cell_editor.dart │ │ │ │ │ │ ├── mobile_media_cell_editor.dart │ │ │ │ │ │ ├── mobile_select_option_editor.dart │ │ │ │ │ │ ├── relation_cell_editor.dart │ │ │ │ │ │ ├── select_option_cell_editor.dart │ │ │ │ │ │ └── select_option_text_field.dart │ │ │ │ │ ├── database_layout_ext.dart │ │ │ │ │ ├── database_view_widget.dart │ │ │ │ │ ├── field/ │ │ │ │ │ │ ├── field_editor.dart │ │ │ │ │ │ ├── field_type_list.dart │ │ │ │ │ │ └── type_option_editor/ │ │ │ │ │ │ ├── builder.dart │ │ │ │ │ │ ├── checkbox.dart │ │ │ │ │ │ ├── checklist.dart │ │ │ │ │ │ ├── date/ │ │ │ │ │ │ │ └── date_time_format.dart │ │ │ │ │ │ ├── date.dart │ │ │ │ │ │ ├── media.dart │ │ │ │ │ │ ├── multi_select.dart │ │ │ │ │ │ ├── number.dart │ │ │ │ │ │ ├── relation.dart │ │ │ │ │ │ ├── rich_text.dart │ │ │ │ │ │ ├── select/ │ │ │ │ │ │ │ ├── select_option.dart │ │ │ │ │ │ │ └── select_option_editor.dart │ │ │ │ │ │ ├── single_select.dart │ │ │ │ │ │ ├── summary.dart │ │ │ │ │ │ ├── time.dart │ │ │ │ │ │ ├── timestamp.dart │ │ │ │ │ │ ├── translate.dart │ │ │ │ │ │ └── url.dart │ │ │ │ │ ├── group/ │ │ │ │ │ │ └── database_group.dart │ │ │ │ │ ├── media_file_type_ext.dart │ │ │ │ │ ├── row/ │ │ │ │ │ │ ├── accessory/ │ │ │ │ │ │ │ ├── cell_accessory.dart │ │ │ │ │ │ │ └── cell_shortcuts.dart │ │ │ │ │ │ ├── cells/ │ │ │ │ │ │ │ ├── cell_container.dart │ │ │ │ │ │ │ └── mobile_cell_container.dart │ │ │ │ │ │ ├── relation_row_detail.dart │ │ │ │ │ │ ├── row_action.dart │ │ │ │ │ │ ├── row_banner.dart │ │ │ │ │ │ ├── row_detail.dart │ │ │ │ │ │ ├── row_document.dart │ │ │ │ │ │ └── row_property.dart │ │ │ │ │ ├── setting/ │ │ │ │ │ │ ├── database_layout_selector.dart │ │ │ │ │ │ ├── database_setting_action.dart │ │ │ │ │ │ ├── database_settings_list.dart │ │ │ │ │ │ ├── field_visibility_extension.dart │ │ │ │ │ │ ├── mobile_database_controls.dart │ │ │ │ │ │ ├── setting_button.dart │ │ │ │ │ │ └── setting_property_list.dart │ │ │ │ │ └── share_button.dart │ │ │ │ ├── database_document/ │ │ │ │ │ ├── database_document_page.dart │ │ │ │ │ ├── database_document_plugin.dart │ │ │ │ │ └── presentation/ │ │ │ │ │ ├── database_document_title.dart │ │ │ │ │ └── database_document_title_bloc.dart │ │ │ │ ├── document/ │ │ │ │ │ ├── application/ │ │ │ │ │ │ ├── doc_sync_state_listener.dart │ │ │ │ │ │ ├── document_appearance_cubit.dart │ │ │ │ │ │ ├── document_awareness_metadata.dart │ │ │ │ │ │ ├── document_bloc.dart │ │ │ │ │ │ ├── document_collab_adapter.dart │ │ │ │ │ │ ├── document_collaborators_bloc.dart │ │ │ │ │ │ ├── document_data_pb_extension.dart │ │ │ │ │ │ ├── document_diff.dart │ │ │ │ │ │ ├── document_listener.dart │ │ │ │ │ │ ├── document_rules.dart │ │ │ │ │ │ ├── document_service.dart │ │ │ │ │ │ ├── document_sync_bloc.dart │ │ │ │ │ │ ├── document_validator.dart │ │ │ │ │ │ ├── editor_transaction_adapter.dart │ │ │ │ │ │ └── prelude.dart │ │ │ │ │ ├── document.dart │ │ │ │ │ ├── document_page.dart │ │ │ │ │ └── presentation/ │ │ │ │ │ ├── banner.dart │ │ │ │ │ ├── collaborator_avatar_stack.dart │ │ │ │ │ ├── compact_mode_event.dart │ │ │ │ │ ├── document_collaborators.dart │ │ │ │ │ ├── editor_configuration.dart │ │ │ │ │ ├── editor_drop_handler.dart │ │ │ │ │ ├── editor_drop_manager.dart │ │ │ │ │ ├── editor_notification.dart │ │ │ │ │ ├── editor_page.dart │ │ │ │ │ ├── editor_plugins/ │ │ │ │ │ │ ├── actions/ │ │ │ │ │ │ │ ├── block_action_add_button.dart │ │ │ │ │ │ │ ├── block_action_button.dart │ │ │ │ │ │ │ ├── block_action_list.dart │ │ │ │ │ │ │ ├── block_action_option_button.dart │ │ │ │ │ │ │ ├── block_action_option_cubit.dart │ │ │ │ │ │ │ ├── drag_to_reorder/ │ │ │ │ │ │ │ │ ├── draggable_option_button.dart │ │ │ │ │ │ │ │ ├── draggable_option_button_feedback.dart │ │ │ │ │ │ │ │ ├── option_button.dart │ │ │ │ │ │ │ │ ├── util.dart │ │ │ │ │ │ │ │ └── visual_drag_area.dart │ │ │ │ │ │ │ ├── mobile_block_action_buttons.dart │ │ │ │ │ │ │ └── option/ │ │ │ │ │ │ │ ├── align_option_action.dart │ │ │ │ │ │ │ ├── color_option_action.dart │ │ │ │ │ │ │ ├── depth_option_action.dart │ │ │ │ │ │ │ ├── divider_option_action.dart │ │ │ │ │ │ │ ├── option_actions.dart │ │ │ │ │ │ │ └── turn_into_option_action.dart │ │ │ │ │ │ ├── ai/ │ │ │ │ │ │ │ ├── ai_writer_block_component.dart │ │ │ │ │ │ │ ├── ai_writer_toolbar_item.dart │ │ │ │ │ │ │ ├── operations/ │ │ │ │ │ │ │ │ ├── ai_writer_block_operations.dart │ │ │ │ │ │ │ │ ├── ai_writer_cubit.dart │ │ │ │ │ │ │ │ ├── ai_writer_entities.dart │ │ │ │ │ │ │ │ └── ai_writer_node_extension.dart │ │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ │ ├── ai_writer_gesture_detector.dart │ │ │ │ │ │ │ ├── ai_writer_prompt_input_more_button.dart │ │ │ │ │ │ │ ├── ai_writer_scroll_wrapper.dart │ │ │ │ │ │ │ └── ai_writer_suggestion_actions.dart │ │ │ │ │ │ ├── align_toolbar_item/ │ │ │ │ │ │ │ ├── align_toolbar_item.dart │ │ │ │ │ │ │ └── custom_text_align_command.dart │ │ │ │ │ │ ├── background_color/ │ │ │ │ │ │ │ └── theme_background_color.dart │ │ │ │ │ │ ├── base/ │ │ │ │ │ │ │ ├── backtick_character_command.dart │ │ │ │ │ │ │ ├── build_context_extension.dart │ │ │ │ │ │ │ ├── built_in_page_widget.dart │ │ │ │ │ │ │ ├── cover_title_command.dart │ │ │ │ │ │ │ ├── emoji_picker_button.dart │ │ │ │ │ │ │ ├── font_colors.dart │ │ │ │ │ │ │ ├── format_arrow_character.dart │ │ │ │ │ │ │ ├── insert_page_command.dart │ │ │ │ │ │ │ ├── link_to_page_widget.dart │ │ │ │ │ │ │ ├── markdown_text_robot.dart │ │ │ │ │ │ │ ├── page_reference_commands.dart │ │ │ │ │ │ │ ├── selectable_item_list_menu.dart │ │ │ │ │ │ │ ├── selectable_svg_widget.dart │ │ │ │ │ │ │ ├── string_extension.dart │ │ │ │ │ │ │ ├── text_robot.dart │ │ │ │ │ │ │ └── toolbar_extension.dart │ │ │ │ │ │ ├── block_menu/ │ │ │ │ │ │ │ └── block_menu_button.dart │ │ │ │ │ │ ├── block_transaction_handler/ │ │ │ │ │ │ │ └── block_transaction_handler.dart │ │ │ │ │ │ ├── bulleted_list/ │ │ │ │ │ │ │ └── bulleted_list_icon.dart │ │ │ │ │ │ ├── callout/ │ │ │ │ │ │ │ ├── callout_block_component.dart │ │ │ │ │ │ │ └── callout_block_shortcuts.dart │ │ │ │ │ │ ├── code_block/ │ │ │ │ │ │ │ ├── code_block_copy_button.dart │ │ │ │ │ │ │ ├── code_block_language_selector.dart │ │ │ │ │ │ │ ├── code_block_menu_item.dart │ │ │ │ │ │ │ └── code_language_screen.dart │ │ │ │ │ │ ├── columns/ │ │ │ │ │ │ │ ├── simple_column_block_component.dart │ │ │ │ │ │ │ ├── simple_column_block_width_resizer.dart │ │ │ │ │ │ │ ├── simple_column_node_extension.dart │ │ │ │ │ │ │ ├── simple_columns_block_component.dart │ │ │ │ │ │ │ └── simple_columns_block_constant.dart │ │ │ │ │ │ ├── context_menu/ │ │ │ │ │ │ │ └── custom_context_menu.dart │ │ │ │ │ │ ├── copy_and_paste/ │ │ │ │ │ │ │ ├── clipboard_service.dart │ │ │ │ │ │ │ ├── custom_copy_command.dart │ │ │ │ │ │ │ ├── custom_cut_command.dart │ │ │ │ │ │ │ ├── custom_paste_command.dart │ │ │ │ │ │ │ ├── paste_from_block_link.dart │ │ │ │ │ │ │ ├── paste_from_file.dart │ │ │ │ │ │ │ ├── paste_from_html.dart │ │ │ │ │ │ │ ├── paste_from_image.dart │ │ │ │ │ │ │ ├── paste_from_in_app_json.dart │ │ │ │ │ │ │ └── paste_from_plain_text.dart │ │ │ │ │ │ ├── cover/ │ │ │ │ │ │ │ ├── document_immersive_cover.dart │ │ │ │ │ │ │ └── document_immersive_cover_bloc.dart │ │ │ │ │ │ ├── database/ │ │ │ │ │ │ │ ├── database_view_block_component.dart │ │ │ │ │ │ │ ├── inline_database_menu_item.dart │ │ │ │ │ │ │ └── referenced_database_menu_item.dart │ │ │ │ │ │ ├── delta/ │ │ │ │ │ │ │ └── text_delta_extension.dart │ │ │ │ │ │ ├── desktop_toolbar/ │ │ │ │ │ │ │ ├── color_picker.dart │ │ │ │ │ │ │ ├── desktop_floating_toolbar.dart │ │ │ │ │ │ │ ├── link/ │ │ │ │ │ │ │ │ ├── link_create_menu.dart │ │ │ │ │ │ │ │ ├── link_edit_menu.dart │ │ │ │ │ │ │ │ ├── link_extension.dart │ │ │ │ │ │ │ │ ├── link_hover_menu.dart │ │ │ │ │ │ │ │ ├── link_replace_menu.dart │ │ │ │ │ │ │ │ ├── link_search_text_field.dart │ │ │ │ │ │ │ │ └── link_styles.dart │ │ │ │ │ │ │ └── toolbar_animation.dart │ │ │ │ │ │ ├── error/ │ │ │ │ │ │ │ └── error_block_component_builder.dart │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ └── flowy_tint_extension.dart │ │ │ │ │ │ ├── file/ │ │ │ │ │ │ │ ├── file_block.dart │ │ │ │ │ │ │ ├── file_block_component.dart │ │ │ │ │ │ │ ├── file_block_menu.dart │ │ │ │ │ │ │ ├── file_selection_menu.dart │ │ │ │ │ │ │ ├── file_upload_menu.dart │ │ │ │ │ │ │ ├── file_util.dart │ │ │ │ │ │ │ └── mobile_file_upload_menu.dart │ │ │ │ │ │ ├── find_and_replace/ │ │ │ │ │ │ │ └── find_and_replace_menu.dart │ │ │ │ │ │ ├── font/ │ │ │ │ │ │ │ └── customize_font_toolbar_item.dart │ │ │ │ │ │ ├── header/ │ │ │ │ │ │ │ ├── cover_editor.dart │ │ │ │ │ │ │ ├── cover_editor_bloc.dart │ │ │ │ │ │ │ ├── cover_title.dart │ │ │ │ │ │ │ ├── custom_cover_picker.dart │ │ │ │ │ │ │ ├── custom_cover_picker_bloc.dart │ │ │ │ │ │ │ ├── desktop_cover.dart │ │ │ │ │ │ │ ├── document_cover_widget.dart │ │ │ │ │ │ │ └── emoji_icon_widget.dart │ │ │ │ │ │ ├── heading/ │ │ │ │ │ │ │ └── heading_toolbar_item.dart │ │ │ │ │ │ ├── i18n/ │ │ │ │ │ │ │ └── editor_i18n.dart │ │ │ │ │ │ ├── image/ │ │ │ │ │ │ │ ├── common.dart │ │ │ │ │ │ │ ├── custom_image_block_component/ │ │ │ │ │ │ │ │ ├── custom_image_block_component.dart │ │ │ │ │ │ │ │ ├── image_menu.dart │ │ │ │ │ │ │ │ └── unsupport_image_widget.dart │ │ │ │ │ │ │ ├── image_picker_screen.dart │ │ │ │ │ │ │ ├── image_placeholder.dart │ │ │ │ │ │ │ ├── image_selection_menu.dart │ │ │ │ │ │ │ ├── image_util.dart │ │ │ │ │ │ │ ├── mobile_image_toolbar_item.dart │ │ │ │ │ │ │ ├── multi_image_block_component/ │ │ │ │ │ │ │ │ ├── image_render.dart │ │ │ │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ │ │ │ ├── image_browser_layout.dart │ │ │ │ │ │ │ │ │ ├── image_grid_layout.dart │ │ │ │ │ │ │ │ │ └── multi_image_layouts.dart │ │ │ │ │ │ │ │ ├── multi_image_block_component.dart │ │ │ │ │ │ │ │ ├── multi_image_menu.dart │ │ │ │ │ │ │ │ └── multi_image_placeholder.dart │ │ │ │ │ │ │ ├── resizeable_image.dart │ │ │ │ │ │ │ ├── unsplash_image_widget.dart │ │ │ │ │ │ │ └── upload_image_menu/ │ │ │ │ │ │ │ ├── upload_image_menu.dart │ │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ │ ├── embed_image_url_widget.dart │ │ │ │ │ │ │ └── upload_image_file_widget.dart │ │ │ │ │ │ ├── inline_math_equation/ │ │ │ │ │ │ │ ├── inline_math_equation.dart │ │ │ │ │ │ │ └── inline_math_equation_toolbar_item.dart │ │ │ │ │ │ ├── keyboard_interceptor/ │ │ │ │ │ │ │ └── keyboard_interceptor.dart │ │ │ │ │ │ ├── link_embed/ │ │ │ │ │ │ │ ├── link_embed_block_component.dart │ │ │ │ │ │ │ └── link_embed_menu.dart │ │ │ │ │ │ ├── link_preview/ │ │ │ │ │ │ │ ├── custom_link_parser.dart │ │ │ │ │ │ │ ├── custom_link_preview.dart │ │ │ │ │ │ │ ├── custom_link_preview_block_component.dart │ │ │ │ │ │ │ ├── default_selectable_mixin.dart │ │ │ │ │ │ │ ├── link_parsers/ │ │ │ │ │ │ │ │ ├── default_parser.dart │ │ │ │ │ │ │ │ └── youtube_parser.dart │ │ │ │ │ │ │ ├── link_preview_menu.dart │ │ │ │ │ │ │ ├── paste_as/ │ │ │ │ │ │ │ │ └── paste_as_menu.dart │ │ │ │ │ │ │ └── shared.dart │ │ │ │ │ │ ├── math_equation/ │ │ │ │ │ │ │ ├── math_equation_block_component.dart │ │ │ │ │ │ │ ├── math_equation_shortcut.dart │ │ │ │ │ │ │ └── mobile_math_equation_toolbar_item.dart │ │ │ │ │ │ ├── mention/ │ │ │ │ │ │ │ ├── child_page_transaction_handler.dart │ │ │ │ │ │ │ ├── date_transaction_handler.dart │ │ │ │ │ │ │ ├── mention_block.dart │ │ │ │ │ │ │ ├── mention_date_block.dart │ │ │ │ │ │ │ ├── mention_link_block.dart │ │ │ │ │ │ │ ├── mention_link_error_preview.dart │ │ │ │ │ │ │ ├── mention_link_preview.dart │ │ │ │ │ │ │ ├── mention_page_bloc.dart │ │ │ │ │ │ │ ├── mention_page_block.dart │ │ │ │ │ │ │ └── mobile_page_selector_sheet.dart │ │ │ │ │ │ ├── menu/ │ │ │ │ │ │ │ └── menu_extension.dart │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ └── editor_migration.dart │ │ │ │ │ │ ├── mobile_floating_toolbar/ │ │ │ │ │ │ │ └── custom_mobile_floating_toolbar.dart │ │ │ │ │ │ ├── mobile_toolbar_item/ │ │ │ │ │ │ │ ├── mobile_add_block_toolbar_item.dart │ │ │ │ │ │ │ └── mobile_block_settings_screen.dart │ │ │ │ │ │ ├── mobile_toolbar_v3/ │ │ │ │ │ │ │ ├── _get_selection_color.dart │ │ │ │ │ │ │ ├── aa_menu/ │ │ │ │ │ │ │ │ ├── _align_items.dart │ │ │ │ │ │ │ │ ├── _bius_items.dart │ │ │ │ │ │ │ │ ├── _block_items.dart │ │ │ │ │ │ │ │ ├── _close_keyboard_or_menu_button.dart │ │ │ │ │ │ │ │ ├── _color_item.dart │ │ │ │ │ │ │ │ ├── _color_list.dart │ │ │ │ │ │ │ │ ├── _font_item.dart │ │ │ │ │ │ │ │ ├── _heading_and_text_items.dart │ │ │ │ │ │ │ │ ├── _indent_items.dart │ │ │ │ │ │ │ │ ├── _menu_item.dart │ │ │ │ │ │ │ │ ├── _popup_menu.dart │ │ │ │ │ │ │ │ └── _toolbar_theme.dart │ │ │ │ │ │ │ ├── aa_toolbar_item.dart │ │ │ │ │ │ │ ├── add_attachment_item.dart │ │ │ │ │ │ │ ├── add_block_menu_item_builder.dart │ │ │ │ │ │ │ ├── add_block_toolbar_item.dart │ │ │ │ │ │ │ ├── appflowy_mobile_toolbar.dart │ │ │ │ │ │ │ ├── appflowy_mobile_toolbar_item.dart │ │ │ │ │ │ │ ├── basic_toolbar_item.dart │ │ │ │ │ │ │ ├── indent_outdent_toolbar_item.dart │ │ │ │ │ │ │ ├── keyboard_height_observer.dart │ │ │ │ │ │ │ ├── link_toolbar_item.dart │ │ │ │ │ │ │ ├── list_toolbar_item.dart │ │ │ │ │ │ │ ├── more_toolbar_item.dart │ │ │ │ │ │ │ ├── toolbar_item_builder.dart │ │ │ │ │ │ │ ├── undo_redo_toolbar_item.dart │ │ │ │ │ │ │ └── util.dart │ │ │ │ │ │ ├── numbered_list/ │ │ │ │ │ │ │ └── numbered_list_icon.dart │ │ │ │ │ │ ├── outline/ │ │ │ │ │ │ │ └── outline_block_component.dart │ │ │ │ │ │ ├── page_block/ │ │ │ │ │ │ │ └── custom_page_block_component.dart │ │ │ │ │ │ ├── page_style/ │ │ │ │ │ │ │ ├── _page_cover_bottom_sheet.dart │ │ │ │ │ │ │ ├── _page_style_cover_image.dart │ │ │ │ │ │ │ ├── _page_style_icon.dart │ │ │ │ │ │ │ ├── _page_style_icon_bloc.dart │ │ │ │ │ │ │ ├── _page_style_layout.dart │ │ │ │ │ │ │ ├── _page_style_util.dart │ │ │ │ │ │ │ └── page_style_bottom_sheet.dart │ │ │ │ │ │ ├── parsers/ │ │ │ │ │ │ │ ├── callout_node_parser.dart │ │ │ │ │ │ │ ├── custom_image_node_parser.dart │ │ │ │ │ │ │ ├── custom_paragraph_node_parser.dart │ │ │ │ │ │ │ ├── database_node_parser.dart │ │ │ │ │ │ │ ├── document_markdown_parsers.dart │ │ │ │ │ │ │ ├── file_block_node_parser.dart │ │ │ │ │ │ │ ├── link_preview_node_parser.dart │ │ │ │ │ │ │ ├── markdown_code_parser.dart │ │ │ │ │ │ │ ├── markdown_parsers.dart │ │ │ │ │ │ │ ├── markdown_simple_table_parser.dart │ │ │ │ │ │ │ ├── math_equation_node_parser.dart │ │ │ │ │ │ │ ├── simple_table_node_parser.dart │ │ │ │ │ │ │ ├── sub_page_node_parser.dart │ │ │ │ │ │ │ └── toggle_list_node_parser.dart │ │ │ │ │ │ ├── plugins.dart │ │ │ │ │ │ ├── quote/ │ │ │ │ │ │ │ ├── quote_block_component.dart │ │ │ │ │ │ │ └── quote_block_shortcuts.dart │ │ │ │ │ │ ├── shared_context/ │ │ │ │ │ │ │ └── shared_context.dart │ │ │ │ │ │ ├── shortcuts/ │ │ │ │ │ │ │ ├── character_shortcuts.dart │ │ │ │ │ │ │ ├── command_shortcuts.dart │ │ │ │ │ │ │ ├── custom_delete_command.dart │ │ │ │ │ │ │ ├── exit_edit_mode_command.dart │ │ │ │ │ │ │ ├── heading_block_shortcuts.dart │ │ │ │ │ │ │ └── numbered_list_block_shortcuts.dart │ │ │ │ │ │ ├── simple_table/ │ │ │ │ │ │ │ ├── simple_table.dart │ │ │ │ │ │ │ ├── simple_table_block_component.dart │ │ │ │ │ │ │ ├── simple_table_cell_block_component.dart │ │ │ │ │ │ │ ├── simple_table_constants.dart │ │ │ │ │ │ │ ├── simple_table_more_action.dart │ │ │ │ │ │ │ ├── simple_table_operations/ │ │ │ │ │ │ │ │ ├── simple_table_content_operation.dart │ │ │ │ │ │ │ │ ├── simple_table_delete_operation.dart │ │ │ │ │ │ │ │ ├── simple_table_duplicate_operation.dart │ │ │ │ │ │ │ │ ├── simple_table_header_operation.dart │ │ │ │ │ │ │ │ ├── simple_table_insert_operation.dart │ │ │ │ │ │ │ │ ├── simple_table_map_operation.dart │ │ │ │ │ │ │ │ ├── simple_table_node_extension.dart │ │ │ │ │ │ │ │ ├── simple_table_operations.dart │ │ │ │ │ │ │ │ ├── simple_table_reorder_operation.dart │ │ │ │ │ │ │ │ └── simple_table_style_operation.dart │ │ │ │ │ │ │ ├── simple_table_row_block_component.dart │ │ │ │ │ │ │ ├── simple_table_shortcuts/ │ │ │ │ │ │ │ │ ├── simple_table_arrow_down_command.dart │ │ │ │ │ │ │ │ ├── simple_table_arrow_left_command.dart │ │ │ │ │ │ │ │ ├── simple_table_arrow_right_command.dart │ │ │ │ │ │ │ │ ├── simple_table_arrow_up_command.dart │ │ │ │ │ │ │ │ ├── simple_table_backspace_command.dart │ │ │ │ │ │ │ │ ├── simple_table_command_extension.dart │ │ │ │ │ │ │ │ ├── simple_table_commands.dart │ │ │ │ │ │ │ │ ├── simple_table_enter_command.dart │ │ │ │ │ │ │ │ ├── simple_table_navigation_command.dart │ │ │ │ │ │ │ │ ├── simple_table_select_all_command.dart │ │ │ │ │ │ │ │ └── simple_table_tab_command.dart │ │ │ │ │ │ │ └── simple_table_widgets/ │ │ │ │ │ │ │ ├── _desktop_simple_table_widget.dart │ │ │ │ │ │ │ ├── _mobile_simple_table_widget.dart │ │ │ │ │ │ │ ├── _simple_table_bottom_sheet_actions.dart │ │ │ │ │ │ │ ├── simple_table_action_sheet.dart │ │ │ │ │ │ │ ├── simple_table_add_column_and_row_button.dart │ │ │ │ │ │ │ ├── simple_table_add_column_button.dart │ │ │ │ │ │ │ ├── simple_table_add_row_button.dart │ │ │ │ │ │ │ ├── simple_table_align_button.dart │ │ │ │ │ │ │ ├── simple_table_background_menu.dart │ │ │ │ │ │ │ ├── simple_table_basic_button.dart │ │ │ │ │ │ │ ├── simple_table_border_builder.dart │ │ │ │ │ │ │ ├── simple_table_bottom_sheet.dart │ │ │ │ │ │ │ ├── simple_table_column_resize_handle.dart │ │ │ │ │ │ │ ├── simple_table_divider.dart │ │ │ │ │ │ │ ├── simple_table_feedback.dart │ │ │ │ │ │ │ ├── simple_table_more_action_popup.dart │ │ │ │ │ │ │ ├── simple_table_reorder_button.dart │ │ │ │ │ │ │ ├── simple_table_widget.dart │ │ │ │ │ │ │ └── widgets.dart │ │ │ │ │ │ ├── slash_menu/ │ │ │ │ │ │ │ ├── slash_command.dart │ │ │ │ │ │ │ ├── slash_menu_items/ │ │ │ │ │ │ │ │ ├── ai_writer_item.dart │ │ │ │ │ │ │ │ ├── bulleted_list_item.dart │ │ │ │ │ │ │ │ ├── callout_item.dart │ │ │ │ │ │ │ │ ├── code_block_item.dart │ │ │ │ │ │ │ │ ├── database_items.dart │ │ │ │ │ │ │ │ ├── date_item.dart │ │ │ │ │ │ │ │ ├── divider_item.dart │ │ │ │ │ │ │ │ ├── emoji_item.dart │ │ │ │ │ │ │ │ ├── file_item.dart │ │ │ │ │ │ │ │ ├── heading_items.dart │ │ │ │ │ │ │ │ ├── image_item.dart │ │ │ │ │ │ │ │ ├── math_equation_item.dart │ │ │ │ │ │ │ │ ├── mobile_items.dart │ │ │ │ │ │ │ │ ├── numbered_list_item.dart │ │ │ │ │ │ │ │ ├── outline_item.dart │ │ │ │ │ │ │ │ ├── paragraph_item.dart │ │ │ │ │ │ │ │ ├── photo_gallery_item.dart │ │ │ │ │ │ │ │ ├── quote_item.dart │ │ │ │ │ │ │ │ ├── simple_columns_item.dart │ │ │ │ │ │ │ │ ├── simple_table_item.dart │ │ │ │ │ │ │ │ ├── slash_menu_item_builder.dart │ │ │ │ │ │ │ │ ├── slash_menu_items.dart │ │ │ │ │ │ │ │ ├── sub_page_item.dart │ │ │ │ │ │ │ │ ├── todo_list_item.dart │ │ │ │ │ │ │ │ └── toggle_list_item.dart │ │ │ │ │ │ │ └── slash_menu_items_builder.dart │ │ │ │ │ │ ├── sub_page/ │ │ │ │ │ │ │ ├── block_transaction_handler.dart │ │ │ │ │ │ │ ├── sub_page_block_component.dart │ │ │ │ │ │ │ └── sub_page_transaction_handler.dart │ │ │ │ │ │ ├── table/ │ │ │ │ │ │ │ ├── table_menu.dart │ │ │ │ │ │ │ └── table_option_action.dart │ │ │ │ │ │ ├── todo_list/ │ │ │ │ │ │ │ └── todo_list_icon.dart │ │ │ │ │ │ ├── toggle/ │ │ │ │ │ │ │ ├── toggle_block_component.dart │ │ │ │ │ │ │ └── toggle_block_shortcuts.dart │ │ │ │ │ │ ├── toolbar_item/ │ │ │ │ │ │ │ ├── custom_format_toolbar_items.dart │ │ │ │ │ │ │ ├── custom_hightlight_color_toolbar_item.dart │ │ │ │ │ │ │ ├── custom_link_toolbar_item.dart │ │ │ │ │ │ │ ├── custom_placeholder_toolbar_item.dart │ │ │ │ │ │ │ ├── custom_text_align_toolbar_item.dart │ │ │ │ │ │ │ ├── custom_text_color_toolbar_item.dart │ │ │ │ │ │ │ ├── more_option_toolbar_item.dart │ │ │ │ │ │ │ ├── text_heading_toolbar_item.dart │ │ │ │ │ │ │ ├── text_suggestions_toolbar_item.dart │ │ │ │ │ │ │ └── toolbar_id_enum.dart │ │ │ │ │ │ ├── transaction_handler/ │ │ │ │ │ │ │ ├── block_transaction_handler.dart │ │ │ │ │ │ │ ├── editor_transaction_handler.dart │ │ │ │ │ │ │ ├── editor_transaction_service.dart │ │ │ │ │ │ │ └── mention_transaction_handler.dart │ │ │ │ │ │ ├── undo_redo/ │ │ │ │ │ │ │ └── custom_undo_redo_commands.dart │ │ │ │ │ │ └── video/ │ │ │ │ │ │ └── video_block_component.dart │ │ │ │ │ └── editor_style.dart │ │ │ │ ├── emoji/ │ │ │ │ │ ├── emoji_actions_command.dart │ │ │ │ │ ├── emoji_handler.dart │ │ │ │ │ └── emoji_menu.dart │ │ │ │ ├── inline_actions/ │ │ │ │ │ ├── handlers/ │ │ │ │ │ │ ├── child_page.dart │ │ │ │ │ │ ├── date_reference.dart │ │ │ │ │ │ ├── inline_page_reference.dart │ │ │ │ │ │ └── reminder_reference.dart │ │ │ │ │ ├── inline_actions_command.dart │ │ │ │ │ ├── inline_actions_menu.dart │ │ │ │ │ ├── inline_actions_result.dart │ │ │ │ │ ├── inline_actions_service.dart │ │ │ │ │ ├── service_handler.dart │ │ │ │ │ └── widgets/ │ │ │ │ │ ├── inline_actions_handler.dart │ │ │ │ │ └── inline_actions_menu_group.dart │ │ │ │ ├── shared/ │ │ │ │ │ ├── callback_shortcuts.dart │ │ │ │ │ ├── cover_type_ext.dart │ │ │ │ │ ├── share/ │ │ │ │ │ │ ├── _shared.dart │ │ │ │ │ │ ├── constants.dart │ │ │ │ │ │ ├── export_tab.dart │ │ │ │ │ │ ├── publish_color_extension.dart │ │ │ │ │ │ ├── publish_name_generator.dart │ │ │ │ │ │ ├── publish_tab.dart │ │ │ │ │ │ ├── share_bloc.dart │ │ │ │ │ │ ├── share_button.dart │ │ │ │ │ │ ├── share_menu.dart │ │ │ │ │ │ └── share_tab.dart │ │ │ │ │ └── sync_indicator.dart │ │ │ │ ├── trash/ │ │ │ │ │ ├── application/ │ │ │ │ │ │ ├── prelude.dart │ │ │ │ │ │ ├── trash_bloc.dart │ │ │ │ │ │ ├── trash_listener.dart │ │ │ │ │ │ └── trash_service.dart │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── sizes.dart │ │ │ │ │ │ ├── trash_cell.dart │ │ │ │ │ │ └── trash_header.dart │ │ │ │ │ ├── trash.dart │ │ │ │ │ └── trash_page.dart │ │ │ │ └── util.dart │ │ │ ├── shared/ │ │ │ │ ├── af_image.dart │ │ │ │ ├── af_role_pb_extension.dart │ │ │ │ ├── af_user_profile_extension.dart │ │ │ │ ├── appflowy_cache_manager.dart │ │ │ │ ├── appflowy_network_image.dart │ │ │ │ ├── appflowy_network_svg.dart │ │ │ │ ├── clipboard_state.dart │ │ │ │ ├── colors.dart │ │ │ │ ├── conditional_listenable_builder.dart │ │ │ │ ├── custom_image_cache_manager.dart │ │ │ │ ├── easy_localiation_service.dart │ │ │ │ ├── error_code/ │ │ │ │ │ └── error_code_map.dart │ │ │ │ ├── error_page/ │ │ │ │ │ └── error_page.dart │ │ │ │ ├── feature_flags.dart │ │ │ │ ├── feedback_gesture_detector.dart │ │ │ │ ├── flowy_error_page.dart │ │ │ │ ├── flowy_gradient_colors.dart │ │ │ │ ├── google_fonts_extension.dart │ │ │ │ ├── icon_emoji_picker/ │ │ │ │ │ ├── colors.dart │ │ │ │ │ ├── emoji_search_bar.dart │ │ │ │ │ ├── emoji_skin_tone.dart │ │ │ │ │ ├── flowy_icon_emoji_picker.dart │ │ │ │ │ ├── icon.dart │ │ │ │ │ ├── icon_color_picker.dart │ │ │ │ │ ├── icon_picker.dart │ │ │ │ │ ├── icon_search_bar.dart │ │ │ │ │ ├── icon_uploader.dart │ │ │ │ │ ├── recent_icons.dart │ │ │ │ │ └── tab.dart │ │ │ │ ├── list_extension.dart │ │ │ │ ├── loading.dart │ │ │ │ ├── markdown_to_document.dart │ │ │ │ ├── patterns/ │ │ │ │ │ ├── common_patterns.dart │ │ │ │ │ ├── date_time_patterns.dart │ │ │ │ │ └── file_type_patterns.dart │ │ │ │ ├── permission/ │ │ │ │ │ └── permission_checker.dart │ │ │ │ ├── popup_menu/ │ │ │ │ │ └── appflowy_popup_menu.dart │ │ │ │ ├── settings/ │ │ │ │ │ └── show_settings.dart │ │ │ │ ├── text_field/ │ │ │ │ │ └── text_filed_with_metric_lines.dart │ │ │ │ ├── time_format.dart │ │ │ │ ├── version_checker/ │ │ │ │ │ └── version_checker.dart │ │ │ │ └── window_title_bar.dart │ │ │ ├── startup/ │ │ │ │ ├── deps_resolver.dart │ │ │ │ ├── entry_point.dart │ │ │ │ ├── launch_configuration.dart │ │ │ │ ├── plugin/ │ │ │ │ │ ├── plugin.dart │ │ │ │ │ └── src/ │ │ │ │ │ ├── runner.dart │ │ │ │ │ └── sandbox.dart │ │ │ │ ├── startup.dart │ │ │ │ └── tasks/ │ │ │ │ ├── af_navigator_observer.dart │ │ │ │ ├── app_widget.dart │ │ │ │ ├── app_window_size_manager.dart │ │ │ │ ├── appflowy_cloud_task.dart │ │ │ │ ├── auto_update_task.dart │ │ │ │ ├── debug_task.dart │ │ │ │ ├── deeplink/ │ │ │ │ │ ├── deeplink_handler.dart │ │ │ │ │ ├── expire_login_deeplink_handler.dart │ │ │ │ │ ├── invitation_deeplink_handler.dart │ │ │ │ │ ├── login_deeplink_handler.dart │ │ │ │ │ ├── open_app_deeplink_handler.dart │ │ │ │ │ └── payment_deeplink_handler.dart │ │ │ │ ├── device_info_task.dart │ │ │ │ ├── feature_flag_task.dart │ │ │ │ ├── file_storage_task.dart │ │ │ │ ├── generate_router.dart │ │ │ │ ├── hot_key.dart │ │ │ │ ├── load_plugin.dart │ │ │ │ ├── localization.dart │ │ │ │ ├── memory_leak_detector.dart │ │ │ │ ├── platform_error_catcher.dart │ │ │ │ ├── platform_service.dart │ │ │ │ ├── prelude.dart │ │ │ │ ├── recent_service_task.dart │ │ │ │ ├── rust_sdk.dart │ │ │ │ └── windows.dart │ │ │ ├── user/ │ │ │ │ ├── application/ │ │ │ │ │ ├── anon_user_bloc.dart │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── af_cloud_auth_service.dart │ │ │ │ │ │ ├── af_cloud_mock_auth_service.dart │ │ │ │ │ │ ├── auth_error.dart │ │ │ │ │ │ ├── auth_service.dart │ │ │ │ │ │ ├── backend_auth_service.dart │ │ │ │ │ │ └── device_id.dart │ │ │ │ │ ├── notification_filter/ │ │ │ │ │ │ └── notification_filter_bloc.dart │ │ │ │ │ ├── password/ │ │ │ │ │ │ ├── password_bloc.dart │ │ │ │ │ │ └── password_http_service.dart │ │ │ │ │ ├── prelude.dart │ │ │ │ │ ├── reminder/ │ │ │ │ │ │ ├── reminder_bloc.dart │ │ │ │ │ │ ├── reminder_extension.dart │ │ │ │ │ │ ├── reminder_listener.dart │ │ │ │ │ │ └── reminder_service.dart │ │ │ │ │ ├── sign_in_bloc.dart │ │ │ │ │ ├── sign_up_bloc.dart │ │ │ │ │ ├── splash_bloc.dart │ │ │ │ │ ├── user_auth_listener.dart │ │ │ │ │ ├── user_listener.dart │ │ │ │ │ ├── user_service.dart │ │ │ │ │ ├── user_settings_service.dart │ │ │ │ │ └── workspace_error_bloc.dart │ │ │ │ ├── domain/ │ │ │ │ │ └── auth_state.dart │ │ │ │ └── presentation/ │ │ │ │ ├── anon_user.dart │ │ │ │ ├── helpers/ │ │ │ │ │ ├── handle_open_workspace_error.dart │ │ │ │ │ └── helpers.dart │ │ │ │ ├── presentation.dart │ │ │ │ ├── router.dart │ │ │ │ ├── screens/ │ │ │ │ │ ├── screens.dart │ │ │ │ │ ├── sign_in_screen/ │ │ │ │ │ │ ├── desktop_sign_in_screen.dart │ │ │ │ │ │ ├── mobile_loading_screen.dart │ │ │ │ │ │ ├── mobile_sign_in_screen.dart │ │ │ │ │ │ ├── sign_in_screen.dart │ │ │ │ │ │ └── widgets/ │ │ │ │ │ │ ├── anonymous_sign_in_button/ │ │ │ │ │ │ │ └── anonymous_sign_in_button.dart │ │ │ │ │ │ ├── anonymous_sign_in_button.dart │ │ │ │ │ │ ├── continue_with/ │ │ │ │ │ │ │ ├── back_to_login_in_button.dart │ │ │ │ │ │ │ ├── continue_with_button.dart │ │ │ │ │ │ │ ├── continue_with_email.dart │ │ │ │ │ │ │ ├── continue_with_email_and_password.dart │ │ │ │ │ │ │ ├── continue_with_magic_link_or_passcode_page.dart │ │ │ │ │ │ │ ├── continue_with_password.dart │ │ │ │ │ │ │ ├── continue_with_password_page.dart │ │ │ │ │ │ │ ├── forgot_password_page.dart │ │ │ │ │ │ │ ├── reset_password.dart │ │ │ │ │ │ │ ├── reset_password_page.dart │ │ │ │ │ │ │ ├── set_new_password.dart │ │ │ │ │ │ │ ├── title_logo.dart │ │ │ │ │ │ │ └── verifying_button.dart │ │ │ │ │ │ ├── logo/ │ │ │ │ │ │ │ └── logo.dart │ │ │ │ │ │ ├── magic_link_sign_in_buttons.dart │ │ │ │ │ │ ├── sign_in_agreement.dart │ │ │ │ │ │ ├── sign_in_anonymous_button.dart │ │ │ │ │ │ ├── sign_in_or_logout_button.dart │ │ │ │ │ │ ├── switch_sign_in_sign_up_button.dart │ │ │ │ │ │ ├── third_party_sign_in_button/ │ │ │ │ │ │ │ ├── third_party_sign_in_button.dart │ │ │ │ │ │ │ └── third_party_sign_in_buttons.dart │ │ │ │ │ │ └── widgets.dart │ │ │ │ │ ├── skip_log_in_screen.dart │ │ │ │ │ ├── splash_screen.dart │ │ │ │ │ ├── workspace_error_screen.dart │ │ │ │ │ └── workspace_start_screen/ │ │ │ │ │ ├── desktop_workspace_start_screen.dart │ │ │ │ │ ├── mobile_workspace_start_screen.dart │ │ │ │ │ └── workspace_start_screen.dart │ │ │ │ └── widgets/ │ │ │ │ ├── auth_form_container.dart │ │ │ │ ├── flowy_logo_title.dart │ │ │ │ ├── folder_widget.dart │ │ │ │ └── widgets.dart │ │ │ ├── util/ │ │ │ │ ├── built_in_svgs.dart │ │ │ │ ├── color_generator/ │ │ │ │ │ └── color_generator.dart │ │ │ │ ├── color_to_hex_string.dart │ │ │ │ ├── debounce.dart │ │ │ │ ├── default_extensions.dart │ │ │ │ ├── expand_views.dart │ │ │ │ ├── field_type_extension.dart │ │ │ │ ├── file_extension.dart │ │ │ │ ├── font_family_extension.dart │ │ │ │ ├── int64_extension.dart │ │ │ │ ├── json_print.dart │ │ │ │ ├── levenshtein.dart │ │ │ │ ├── navigator_context_extension.dart │ │ │ │ ├── share_log_files.dart │ │ │ │ ├── string_extension.dart │ │ │ │ ├── theme_extension.dart │ │ │ │ ├── theme_mode_extension.dart │ │ │ │ ├── throttle.dart │ │ │ │ ├── time.dart │ │ │ │ └── xfile_ext.dart │ │ │ └── workspace/ │ │ │ ├── application/ │ │ │ │ ├── action_navigation/ │ │ │ │ │ ├── action_navigation_bloc.dart │ │ │ │ │ └── navigation_action.dart │ │ │ │ ├── appearance_defaults.dart │ │ │ │ ├── command_palette/ │ │ │ │ │ ├── command_palette_bloc.dart │ │ │ │ │ ├── search_result_ext.dart │ │ │ │ │ ├── search_result_list_bloc.dart │ │ │ │ │ └── search_service.dart │ │ │ │ ├── edit_panel/ │ │ │ │ │ ├── edit_context.dart │ │ │ │ │ └── edit_panel_bloc.dart │ │ │ │ ├── export/ │ │ │ │ │ └── document_exporter.dart │ │ │ │ ├── favorite/ │ │ │ │ │ ├── favorite_bloc.dart │ │ │ │ │ ├── favorite_listener.dart │ │ │ │ │ ├── favorite_service.dart │ │ │ │ │ └── prelude.dart │ │ │ │ ├── home/ │ │ │ │ │ ├── home_bloc.dart │ │ │ │ │ ├── home_setting_bloc.dart │ │ │ │ │ └── prelude.dart │ │ │ │ ├── menu/ │ │ │ │ │ ├── menu_user_bloc.dart │ │ │ │ │ ├── prelude.dart │ │ │ │ │ └── sidebar_sections_bloc.dart │ │ │ │ ├── notification/ │ │ │ │ │ └── notification_service.dart │ │ │ │ ├── recent/ │ │ │ │ │ ├── cached_recent_service.dart │ │ │ │ │ ├── prelude.dart │ │ │ │ │ ├── recent_listener.dart │ │ │ │ │ └── recent_views_bloc.dart │ │ │ │ ├── settings/ │ │ │ │ │ ├── ai/ │ │ │ │ │ │ ├── local_ai_bloc.dart │ │ │ │ │ │ ├── local_ai_on_boarding_bloc.dart │ │ │ │ │ │ ├── local_llm_listener.dart │ │ │ │ │ │ ├── ollama_setting_bloc.dart │ │ │ │ │ │ └── settings_ai_bloc.dart │ │ │ │ │ ├── appearance/ │ │ │ │ │ │ ├── appearance_cubit.dart │ │ │ │ │ │ ├── base_appearance.dart │ │ │ │ │ │ ├── desktop_appearance.dart │ │ │ │ │ │ └── mobile_appearance.dart │ │ │ │ │ ├── appflowy_cloud_setting_bloc.dart │ │ │ │ │ ├── appflowy_cloud_urls_bloc.dart │ │ │ │ │ ├── application_data_storage.dart │ │ │ │ │ ├── billing/ │ │ │ │ │ │ └── settings_billing_bloc.dart │ │ │ │ │ ├── cloud_setting_bloc.dart │ │ │ │ │ ├── cloud_setting_listener.dart │ │ │ │ │ ├── create_file_settings_cubit.dart │ │ │ │ │ ├── date_time/ │ │ │ │ │ │ ├── date_format_ext.dart │ │ │ │ │ │ └── time_format_ext.dart │ │ │ │ │ ├── file_storage/ │ │ │ │ │ │ └── file_storage_listener.dart │ │ │ │ │ ├── notifications/ │ │ │ │ │ │ └── notification_settings_cubit.dart │ │ │ │ │ ├── plan/ │ │ │ │ │ │ ├── settings_plan_bloc.dart │ │ │ │ │ │ ├── workspace_subscription_ext.dart │ │ │ │ │ │ └── workspace_usage_ext.dart │ │ │ │ │ ├── prelude.dart │ │ │ │ │ ├── setting_file_importer_bloc.dart │ │ │ │ │ ├── settings_dialog_bloc.dart │ │ │ │ │ ├── settings_file_exporter_cubit.dart │ │ │ │ │ ├── share/ │ │ │ │ │ │ ├── export_service.dart │ │ │ │ │ │ └── import_service.dart │ │ │ │ │ ├── shortcuts/ │ │ │ │ │ │ ├── settings_shortcuts_cubit.dart │ │ │ │ │ │ ├── settings_shortcuts_service.dart │ │ │ │ │ │ └── shortcuts_model.dart │ │ │ │ │ └── workspace/ │ │ │ │ │ └── workspace_settings_bloc.dart │ │ │ │ ├── sidebar/ │ │ │ │ │ ├── billing/ │ │ │ │ │ │ └── sidebar_plan_bloc.dart │ │ │ │ │ ├── folder/ │ │ │ │ │ │ └── folder_bloc.dart │ │ │ │ │ ├── rename_view/ │ │ │ │ │ │ └── rename_view_bloc.dart │ │ │ │ │ └── space/ │ │ │ │ │ ├── space_bloc.dart │ │ │ │ │ └── space_search_bloc.dart │ │ │ │ ├── subscription_success_listenable/ │ │ │ │ │ └── subscription_success_listenable.dart │ │ │ │ ├── tabs/ │ │ │ │ │ └── tabs_bloc.dart │ │ │ │ ├── user/ │ │ │ │ │ ├── prelude.dart │ │ │ │ │ ├── settings_user_bloc.dart │ │ │ │ │ └── user_workspace_bloc.dart │ │ │ │ ├── view/ │ │ │ │ │ ├── prelude.dart │ │ │ │ │ ├── view_bloc.dart │ │ │ │ │ ├── view_ext.dart │ │ │ │ │ ├── view_listener.dart │ │ │ │ │ └── view_service.dart │ │ │ │ ├── view_info/ │ │ │ │ │ └── view_info_bloc.dart │ │ │ │ ├── view_title/ │ │ │ │ │ ├── view_title_bar_bloc.dart │ │ │ │ │ └── view_title_bloc.dart │ │ │ │ └── workspace/ │ │ │ │ ├── prelude.dart │ │ │ │ ├── workspace_bloc.dart │ │ │ │ ├── workspace_listener.dart │ │ │ │ ├── workspace_sections_listener.dart │ │ │ │ └── workspace_service.dart │ │ │ └── presentation/ │ │ │ ├── command_palette/ │ │ │ │ ├── command_palette.dart │ │ │ │ ├── navigation_bloc_extension.dart │ │ │ │ └── widgets/ │ │ │ │ ├── page_preview.dart │ │ │ │ ├── recent_views_list.dart │ │ │ │ ├── search_ask_ai_entrance.dart │ │ │ │ ├── search_field.dart │ │ │ │ ├── search_icon.dart │ │ │ │ ├── search_recent_view_cell.dart │ │ │ │ ├── search_result_cell.dart │ │ │ │ ├── search_results_list.dart │ │ │ │ └── search_summary_cell.dart │ │ │ ├── home/ │ │ │ │ ├── af_focus_manager.dart │ │ │ │ ├── desktop_home_screen.dart │ │ │ │ ├── errors/ │ │ │ │ │ └── workspace_failed_screen.dart │ │ │ │ ├── home_layout.dart │ │ │ │ ├── home_sizes.dart │ │ │ │ ├── home_stack.dart │ │ │ │ ├── hotkeys.dart │ │ │ │ ├── menu/ │ │ │ │ │ ├── menu_shared_state.dart │ │ │ │ │ ├── sidebar/ │ │ │ │ │ │ ├── favorites/ │ │ │ │ │ │ │ ├── favorite_folder.dart │ │ │ │ │ │ │ ├── favorite_menu.dart │ │ │ │ │ │ │ ├── favorite_menu_bloc.dart │ │ │ │ │ │ │ ├── favorite_more_actions.dart │ │ │ │ │ │ │ ├── favorite_pin_action.dart │ │ │ │ │ │ │ └── favorite_pin_bloc.dart │ │ │ │ │ │ ├── folder/ │ │ │ │ │ │ │ ├── _folder_header.dart │ │ │ │ │ │ │ └── _section_folder.dart │ │ │ │ │ │ ├── footer/ │ │ │ │ │ │ │ ├── sidebar_footer.dart │ │ │ │ │ │ │ ├── sidebar_footer_button.dart │ │ │ │ │ │ │ ├── sidebar_toast.dart │ │ │ │ │ │ │ └── sidebar_upgrade_application_button.dart │ │ │ │ │ │ ├── header/ │ │ │ │ │ │ │ ├── sidebar_top_menu.dart │ │ │ │ │ │ │ └── sidebar_user.dart │ │ │ │ │ │ ├── import/ │ │ │ │ │ │ │ ├── import_panel.dart │ │ │ │ │ │ │ └── import_type.dart │ │ │ │ │ │ ├── move_to/ │ │ │ │ │ │ │ └── move_page_menu.dart │ │ │ │ │ │ ├── shared/ │ │ │ │ │ │ │ ├── sidebar_folder.dart │ │ │ │ │ │ │ ├── sidebar_new_page_button.dart │ │ │ │ │ │ │ └── sidebar_setting.dart │ │ │ │ │ │ ├── sidebar.dart │ │ │ │ │ │ ├── slider_menu_hover_trigger.dart │ │ │ │ │ │ ├── space/ │ │ │ │ │ │ │ ├── _extension.dart │ │ │ │ │ │ │ ├── create_space_popup.dart │ │ │ │ │ │ │ ├── manage_space_popup.dart │ │ │ │ │ │ │ ├── shared_widget.dart │ │ │ │ │ │ │ ├── sidebar_space.dart │ │ │ │ │ │ │ ├── sidebar_space_header.dart │ │ │ │ │ │ │ ├── sidebar_space_menu.dart │ │ │ │ │ │ │ ├── space_action_type.dart │ │ │ │ │ │ │ ├── space_icon.dart │ │ │ │ │ │ │ ├── space_icon_popup.dart │ │ │ │ │ │ │ ├── space_migration.dart │ │ │ │ │ │ │ └── space_more_popup.dart │ │ │ │ │ │ └── workspace/ │ │ │ │ │ │ ├── _sidebar_import_notion.dart │ │ │ │ │ │ ├── _sidebar_workspace_actions.dart │ │ │ │ │ │ ├── _sidebar_workspace_icon.dart │ │ │ │ │ │ ├── _sidebar_workspace_menu.dart │ │ │ │ │ │ ├── sidebar_workspace.dart │ │ │ │ │ │ └── workspace_notifier.dart │ │ │ │ │ └── view/ │ │ │ │ │ ├── draggable_view_item.dart │ │ │ │ │ ├── view_action_type.dart │ │ │ │ │ ├── view_add_button.dart │ │ │ │ │ ├── view_item.dart │ │ │ │ │ └── view_more_action_button.dart │ │ │ │ ├── navigation.dart │ │ │ │ ├── tabs/ │ │ │ │ │ ├── flowy_tab.dart │ │ │ │ │ └── tabs_manager.dart │ │ │ │ └── toast.dart │ │ │ ├── notifications/ │ │ │ │ ├── notification_panel.dart │ │ │ │ ├── number_red_dot.dart │ │ │ │ ├── reminder_extension.dart │ │ │ │ └── widgets/ │ │ │ │ ├── flowy_tab.dart │ │ │ │ ├── inbox_action_bar.dart │ │ │ │ ├── notification_button.dart │ │ │ │ ├── notification_content_v2.dart │ │ │ │ ├── notification_hub_title.dart │ │ │ │ ├── notification_item.dart │ │ │ │ ├── notification_item_v2.dart │ │ │ │ ├── notification_tab.dart │ │ │ │ ├── notification_tab_bar.dart │ │ │ │ ├── notification_view.dart │ │ │ │ └── notifications_hub_empty.dart │ │ │ ├── settings/ │ │ │ │ ├── pages/ │ │ │ │ │ ├── about/ │ │ │ │ │ │ └── app_version.dart │ │ │ │ │ ├── account/ │ │ │ │ │ │ ├── account.dart │ │ │ │ │ │ ├── account_deletion.dart │ │ │ │ │ │ ├── account_sign_in_out.dart │ │ │ │ │ │ ├── account_user_profile.dart │ │ │ │ │ │ ├── email/ │ │ │ │ │ │ │ └── email_section.dart │ │ │ │ │ │ └── password/ │ │ │ │ │ │ ├── change_password.dart │ │ │ │ │ │ ├── error_extensions.dart │ │ │ │ │ │ ├── password_suffix_icon.dart │ │ │ │ │ │ └── setup_password.dart │ │ │ │ │ ├── fix_data_widget.dart │ │ │ │ │ ├── setting_ai_view/ │ │ │ │ │ │ ├── local_ai_setting.dart │ │ │ │ │ │ ├── local_settings_ai_view.dart │ │ │ │ │ │ ├── model_selection.dart │ │ │ │ │ │ ├── ollama_setting.dart │ │ │ │ │ │ ├── plugin_status_indicator.dart │ │ │ │ │ │ └── settings_ai_view.dart │ │ │ │ │ ├── settings_account_view.dart │ │ │ │ │ ├── settings_billing_view.dart │ │ │ │ │ ├── settings_manage_data_view.dart │ │ │ │ │ ├── settings_plan_comparison_dialog.dart │ │ │ │ │ ├── settings_plan_view.dart │ │ │ │ │ ├── settings_shortcuts_view.dart │ │ │ │ │ ├── settings_workspace_view.dart │ │ │ │ │ └── sites/ │ │ │ │ │ ├── constants.dart │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── domain_header.dart │ │ │ │ │ │ ├── domain_item.dart │ │ │ │ │ │ ├── domain_more_action.dart │ │ │ │ │ │ ├── domain_settings_dialog.dart │ │ │ │ │ │ └── home_page_menu.dart │ │ │ │ │ ├── publish_info_view_item.dart │ │ │ │ │ ├── published_page/ │ │ │ │ │ │ ├── published_view_item.dart │ │ │ │ │ │ ├── published_view_item_header.dart │ │ │ │ │ │ ├── published_view_more_action.dart │ │ │ │ │ │ └── published_view_settings_dialog.dart │ │ │ │ │ ├── settings_sites_bloc.dart │ │ │ │ │ └── settings_sites_view.dart │ │ │ │ ├── settings_dialog.dart │ │ │ │ ├── shared/ │ │ │ │ │ ├── af_dropdown_menu_entry.dart │ │ │ │ │ ├── document_color_setting_button.dart │ │ │ │ │ ├── flowy_gradient_button.dart │ │ │ │ │ ├── setting_action.dart │ │ │ │ │ ├── setting_list_tile.dart │ │ │ │ │ ├── setting_value_dropdown.dart │ │ │ │ │ ├── settings_actionable_input.dart │ │ │ │ │ ├── settings_alert_dialog.dart │ │ │ │ │ ├── settings_body.dart │ │ │ │ │ ├── settings_category.dart │ │ │ │ │ ├── settings_category_spacer.dart │ │ │ │ │ ├── settings_dashed_divider.dart │ │ │ │ │ ├── settings_dropdown.dart │ │ │ │ │ ├── settings_header.dart │ │ │ │ │ ├── settings_input_field.dart │ │ │ │ │ ├── settings_radio_select.dart │ │ │ │ │ ├── settings_subcategory.dart │ │ │ │ │ └── single_setting_action.dart │ │ │ │ └── widgets/ │ │ │ │ ├── _restart_app_button.dart │ │ │ │ ├── cancel_plan_survey_dialog.dart │ │ │ │ ├── emoji_picker/ │ │ │ │ │ ├── emoji_picker.dart │ │ │ │ │ ├── emoji_shortcut_event.dart │ │ │ │ │ └── src/ │ │ │ │ │ ├── default_emoji_picker_view.dart │ │ │ │ │ ├── emji_picker_config.dart │ │ │ │ │ ├── emoji_lists.dart │ │ │ │ │ ├── emoji_picker.dart │ │ │ │ │ ├── emoji_picker_builder.dart │ │ │ │ │ ├── emoji_view_state.dart │ │ │ │ │ ├── flowy_emoji_picker_config.dart │ │ │ │ │ └── models/ │ │ │ │ │ ├── emoji_category_models.dart │ │ │ │ │ ├── emoji_model.dart │ │ │ │ │ └── recent_emoji_model.dart │ │ │ │ ├── feature_flags/ │ │ │ │ │ ├── feature_flag_page.dart │ │ │ │ │ └── mobile_feature_flag_screen.dart │ │ │ │ ├── files/ │ │ │ │ │ ├── settings_export_file_widget.dart │ │ │ │ │ └── settings_file_exporter_widget.dart │ │ │ │ ├── members/ │ │ │ │ │ ├── invitation/ │ │ │ │ │ │ ├── invite_member_by_email.dart │ │ │ │ │ │ ├── invite_member_by_link.dart │ │ │ │ │ │ ├── m_invite_member_by_email.dart │ │ │ │ │ │ ├── m_invite_member_by_link.dart │ │ │ │ │ │ └── member_http_service.dart │ │ │ │ │ ├── workspace_member_bloc.dart │ │ │ │ │ └── workspace_member_page.dart │ │ │ │ ├── setting_appflowy_cloud.dart │ │ │ │ ├── setting_cloud.dart │ │ │ │ ├── setting_local_cloud.dart │ │ │ │ ├── setting_third_party_login.dart │ │ │ │ ├── settings_menu.dart │ │ │ │ ├── settings_menu_element.dart │ │ │ │ ├── settings_notifications_view.dart │ │ │ │ ├── theme_upload/ │ │ │ │ │ ├── theme_confirm_delete_dialog.dart │ │ │ │ │ ├── theme_upload.dart │ │ │ │ │ ├── theme_upload_button.dart │ │ │ │ │ ├── theme_upload_decoration.dart │ │ │ │ │ ├── theme_upload_failure_widget.dart │ │ │ │ │ ├── theme_upload_learn_more_button.dart │ │ │ │ │ ├── theme_upload_loading_widget.dart │ │ │ │ │ ├── theme_upload_view.dart │ │ │ │ │ └── upload_new_theme_widget.dart │ │ │ │ ├── utils/ │ │ │ │ │ ├── form_factor.dart │ │ │ │ │ └── hex_opacity_string_extension.dart │ │ │ │ └── web_url_hint_widget.dart │ │ │ └── widgets/ │ │ │ ├── date_picker/ │ │ │ │ ├── appflowy_date_picker_base.dart │ │ │ │ ├── desktop_date_picker.dart │ │ │ │ ├── mobile_date_picker.dart │ │ │ │ ├── utils/ │ │ │ │ │ ├── date_time_format_ext.dart │ │ │ │ │ ├── layout.dart │ │ │ │ │ └── user_time_format_ext.dart │ │ │ │ └── widgets/ │ │ │ │ ├── clear_date_button.dart │ │ │ │ ├── date_picker.dart │ │ │ │ ├── date_picker_dialog.dart │ │ │ │ ├── date_time_settings.dart │ │ │ │ ├── date_time_text_field.dart │ │ │ │ ├── date_type_option_button.dart │ │ │ │ ├── end_time_button.dart │ │ │ │ ├── mobile_date_editor.dart │ │ │ │ ├── mobile_date_header.dart │ │ │ │ └── reminder_selector.dart │ │ │ ├── dialog_v2.dart │ │ │ ├── dialogs.dart │ │ │ ├── draggable_item/ │ │ │ │ └── draggable_item.dart │ │ │ ├── edit_panel/ │ │ │ │ ├── edit_panel.dart │ │ │ │ └── panel_animation.dart │ │ │ ├── favorite_button.dart │ │ │ ├── float_bubble/ │ │ │ │ ├── question_bubble.dart │ │ │ │ ├── social_media_section.dart │ │ │ │ └── version_section.dart │ │ │ ├── image_viewer/ │ │ │ │ ├── image_provider.dart │ │ │ │ ├── interactive_image_toolbar.dart │ │ │ │ └── interactive_image_viewer.dart │ │ │ ├── more_view_actions/ │ │ │ │ ├── more_view_actions.dart │ │ │ │ └── widgets/ │ │ │ │ ├── common_view_action.dart │ │ │ │ ├── font_size_action.dart │ │ │ │ ├── font_size_stepper.dart │ │ │ │ ├── lock_page_action.dart │ │ │ │ └── view_meta_info.dart │ │ │ ├── pop_up_action.dart │ │ │ ├── rename_view_popover.dart │ │ │ ├── sidebar_resizer.dart │ │ │ ├── tab_bar_item.dart │ │ │ ├── toggle/ │ │ │ │ └── toggle.dart │ │ │ ├── user_avatar.dart │ │ │ └── view_title_bar.dart │ │ ├── linux/ │ │ │ ├── .gitignore │ │ │ ├── CMakeLists.txt │ │ │ ├── flutter/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ └── dart_ffi/ │ │ │ │ └── binding.h │ │ │ ├── main.cc │ │ │ ├── my_application.cc │ │ │ ├── my_application.h │ │ │ └── packaging/ │ │ │ ├── deb/ │ │ │ │ └── make_config.yaml │ │ │ └── rpm/ │ │ │ └── make_config.yaml │ │ ├── macos/ │ │ │ ├── .gitignore │ │ │ ├── Flutter/ │ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ │ └── Flutter-Release.xcconfig │ │ │ ├── Podfile │ │ │ ├── Runner/ │ │ │ │ ├── AppDelegate.swift │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Base.lproj/ │ │ │ │ │ └── MainMenu.xib │ │ │ │ ├── Configs/ │ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ ├── Release.xcconfig │ │ │ │ │ └── Warnings.xcconfig │ │ │ │ ├── DebugProfile.entitlements │ │ │ │ ├── Info.plist │ │ │ │ ├── MainFlutterWindow.swift │ │ │ │ └── Release.entitlements │ │ │ ├── Runner.xcodeproj/ │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ └── xcshareddata/ │ │ │ │ └── xcschemes/ │ │ │ │ └── Runner.xcscheme │ │ │ ├── Runner.xcworkspace/ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata/ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── build/ │ │ │ └── ios/ │ │ │ └── XCBuildData/ │ │ │ └── PIFCache/ │ │ │ ├── project/ │ │ │ │ └── PROJECT@v11_mod=a7fbf46937053896f73cc7c7ec6baefb_hash=bfdfe7dc352907fc980b868725387e98plugins=1OJSG6M1FOV3XYQCBH7Z29RZ0FPR9XDE1-json │ │ │ └── workspace/ │ │ │ └── WORKSPACE@v11_hash=(null)_subobjects=9b6915bad2214bcc5eb58b855fe7b55a-json │ │ ├── packages/ │ │ │ ├── appflowy_backend/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .metadata │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── analysis_options.yaml │ │ │ │ ├── android/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── build.gradle │ │ │ │ │ ├── gradle/ │ │ │ │ │ │ └── wrapper/ │ │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ │ ├── gradle.properties │ │ │ │ │ ├── settings.gradle │ │ │ │ │ └── src/ │ │ │ │ │ └── main/ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ └── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── plugin/ │ │ │ │ │ └── appflowy_backend/ │ │ │ │ │ └── AppFlowyBackendPlugin.kt │ │ │ │ ├── example/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .metadata │ │ │ │ │ ├── README.md │ │ │ │ │ ├── analysis_options.yaml │ │ │ │ │ ├── android/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ ├── build.gradle │ │ │ │ │ │ │ └── src/ │ │ │ │ │ │ │ ├── debug/ │ │ │ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ │ │ │ ├── kotlin/ │ │ │ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ │ │ │ └── plugin/ │ │ │ │ │ │ │ │ │ └── flowy_sdk_example/ │ │ │ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ │ │ │ └── res/ │ │ │ │ │ │ │ │ ├── drawable/ │ │ │ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ │ │ ├── drawable-v21/ │ │ │ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ │ │ ├── values/ │ │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ │ └── values-night/ │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ └── profile/ │ │ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ │ ├── build.gradle │ │ │ │ │ │ ├── gradle/ │ │ │ │ │ │ │ └── wrapper/ │ │ │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ │ │ ├── gradle.properties │ │ │ │ │ │ └── settings.gradle │ │ │ │ │ ├── integration_test/ │ │ │ │ │ │ ├── app_test.dart │ │ │ │ │ │ └── driver.dart │ │ │ │ │ ├── ios/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ └── Release.xcconfig │ │ │ │ │ │ ├── Podfile │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ │ │ └── README.md │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ │ │ │ └── Main.storyboard │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ └── Runner-Bridging-Header.h │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ └── Runner.xcworkspace/ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ ├── lib/ │ │ │ │ │ │ └── main.dart │ │ │ │ │ ├── macos/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ │ │ │ │ └── Flutter-Release.xcconfig │ │ │ │ │ │ ├── Podfile │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ └── MainMenu.xib │ │ │ │ │ │ │ ├── Configs/ │ │ │ │ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ │ ├── Release.xcconfig │ │ │ │ │ │ │ │ └── Warnings.xcconfig │ │ │ │ │ │ │ ├── DebugProfile.entitlements │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ ├── MainFlutterWindow.swift │ │ │ │ │ │ │ └── Release.entitlements │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ └── Runner.xcworkspace/ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ ├── pubspec.yaml │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── widget_test.dart │ │ │ │ │ └── windows/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── flutter/ │ │ │ │ │ │ └── CMakeLists.txt │ │ │ │ │ └── runner/ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── Runner.rc │ │ │ │ │ ├── flutter_window.cpp │ │ │ │ │ ├── flutter_window.h │ │ │ │ │ ├── main.cpp │ │ │ │ │ ├── resource.h │ │ │ │ │ ├── runner.exe.manifest │ │ │ │ │ ├── utils.cpp │ │ │ │ │ ├── utils.h │ │ │ │ │ ├── win32_window.cpp │ │ │ │ │ └── win32_window.h │ │ │ │ ├── ios/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── Assets/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── Classes/ │ │ │ │ │ │ ├── AppFlowyBackendPlugin.h │ │ │ │ │ │ ├── AppFlowyBackendPlugin.m │ │ │ │ │ │ ├── AppFlowyBackendPlugin.swift │ │ │ │ │ │ └── binding.h │ │ │ │ │ └── appflowy_backend.podspec │ │ │ │ ├── lib/ │ │ │ │ │ ├── appflowy_backend.dart │ │ │ │ │ ├── appflowy_backend_method_channel.dart │ │ │ │ │ ├── appflowy_backend_platform_interface.dart │ │ │ │ │ ├── dispatch/ │ │ │ │ │ │ ├── dispatch.dart │ │ │ │ │ │ └── error.dart │ │ │ │ │ ├── ffi.dart │ │ │ │ │ ├── log.dart │ │ │ │ │ └── rust_stream.dart │ │ │ │ ├── linux/ │ │ │ │ │ └── Classes/ │ │ │ │ │ └── binding.h │ │ │ │ ├── macos/ │ │ │ │ │ ├── Classes/ │ │ │ │ │ │ ├── AppFlowyBackendPlugin.swift │ │ │ │ │ │ └── binding.h │ │ │ │ │ └── appflowy_backend.podspec │ │ │ │ ├── pubspec.yaml │ │ │ │ ├── test/ │ │ │ │ │ ├── appflowy_backend_method_channel_test.dart │ │ │ │ │ └── appflowy_backend_test.dart │ │ │ │ └── windows/ │ │ │ │ ├── .gitignore │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── app_flowy_backend_plugin.h │ │ │ │ ├── appflowy_backend_plugin.cpp │ │ │ │ ├── appflowy_backend_plugin_c_api.cpp │ │ │ │ └── include/ │ │ │ │ └── appflowy_backend/ │ │ │ │ ├── app_flowy_backend_plugin.h │ │ │ │ └── appflowy_backend_plugin_c_api.h │ │ │ ├── appflowy_popover/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .metadata │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── analysis_options.yaml │ │ │ │ ├── example/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .metadata │ │ │ │ │ ├── README.md │ │ │ │ │ ├── analysis_options.yaml │ │ │ │ │ ├── android/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ ├── build.gradle │ │ │ │ │ │ │ └── src/ │ │ │ │ │ │ │ ├── debug/ │ │ │ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ │ │ │ ├── kotlin/ │ │ │ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ │ │ │ └── res/ │ │ │ │ │ │ │ │ ├── drawable/ │ │ │ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ │ │ ├── drawable-v21/ │ │ │ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ │ │ ├── values/ │ │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ │ └── values-night/ │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ └── profile/ │ │ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ │ ├── build.gradle │ │ │ │ │ │ ├── gradle/ │ │ │ │ │ │ │ └── wrapper/ │ │ │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ │ │ ├── gradle.properties │ │ │ │ │ │ └── settings.gradle │ │ │ │ │ ├── ios/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ └── Release.xcconfig │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ │ │ └── README.md │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ │ │ │ └── Main.storyboard │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ └── Runner-Bridging-Header.h │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ └── Runner.xcworkspace/ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── example_button.dart │ │ │ │ │ │ └── main.dart │ │ │ │ │ ├── linux/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ │ ├── flutter/ │ │ │ │ │ │ │ └── CMakeLists.txt │ │ │ │ │ │ ├── main.cc │ │ │ │ │ │ ├── my_application.cc │ │ │ │ │ │ └── my_application.h │ │ │ │ │ ├── macos/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ │ │ │ │ └── Flutter-Release.xcconfig │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ └── MainMenu.xib │ │ │ │ │ │ │ ├── Configs/ │ │ │ │ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ │ ├── Release.xcconfig │ │ │ │ │ │ │ │ └── Warnings.xcconfig │ │ │ │ │ │ │ ├── DebugProfile.entitlements │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ ├── MainFlutterWindow.swift │ │ │ │ │ │ │ └── Release.entitlements │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ └── Runner.xcworkspace/ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ ├── pubspec.yaml │ │ │ │ │ ├── web/ │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ └── manifest.json │ │ │ │ │ └── windows/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── flutter/ │ │ │ │ │ │ └── CMakeLists.txt │ │ │ │ │ └── runner/ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── Runner.rc │ │ │ │ │ ├── flutter_window.cpp │ │ │ │ │ ├── flutter_window.h │ │ │ │ │ ├── main.cpp │ │ │ │ │ ├── resource.h │ │ │ │ │ ├── runner.exe.manifest │ │ │ │ │ ├── utils.cpp │ │ │ │ │ ├── utils.h │ │ │ │ │ ├── win32_window.cpp │ │ │ │ │ └── win32_window.h │ │ │ │ ├── lib/ │ │ │ │ │ ├── appflowy_popover.dart │ │ │ │ │ └── src/ │ │ │ │ │ ├── follower.dart │ │ │ │ │ ├── layout.dart │ │ │ │ │ ├── mask.dart │ │ │ │ │ ├── mutex.dart │ │ │ │ │ └── popover.dart │ │ │ │ ├── pubspec.yaml │ │ │ │ └── test/ │ │ │ │ └── popover_test.dart │ │ │ ├── appflowy_result/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .metadata │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── analysis_options.yaml │ │ │ │ ├── lib/ │ │ │ │ │ ├── appflowy_result.dart │ │ │ │ │ └── src/ │ │ │ │ │ ├── async_result.dart │ │ │ │ │ └── result.dart │ │ │ │ └── pubspec.yaml │ │ │ ├── appflowy_ui/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .metadata │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── analysis_options.yaml │ │ │ │ ├── example/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .metadata │ │ │ │ │ ├── README.md │ │ │ │ │ ├── analysis_options.yaml │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── main.dart │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── avatar/ │ │ │ │ │ │ │ └── avatar_page.dart │ │ │ │ │ │ ├── buttons/ │ │ │ │ │ │ │ └── buttons_page.dart │ │ │ │ │ │ ├── dropdown_menu/ │ │ │ │ │ │ │ └── dropdown_menu_page.dart │ │ │ │ │ │ ├── menu/ │ │ │ │ │ │ │ └── menu_page.dart │ │ │ │ │ │ ├── modal/ │ │ │ │ │ │ │ └── modal_page.dart │ │ │ │ │ │ └── textfield/ │ │ │ │ │ │ └── textfield_page.dart │ │ │ │ │ ├── macos/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ │ │ │ │ └── Flutter-Release.xcconfig │ │ │ │ │ │ ├── Podfile │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ └── MainMenu.xib │ │ │ │ │ │ │ ├── Configs/ │ │ │ │ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ │ ├── Release.xcconfig │ │ │ │ │ │ │ │ └── Warnings.xcconfig │ │ │ │ │ │ │ ├── DebugProfile.entitlements │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ ├── MainFlutterWindow.swift │ │ │ │ │ │ │ └── Release.entitlements │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ ├── Runner.xcworkspace/ │ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ │ └── RunnerTests/ │ │ │ │ │ │ └── RunnerTests.swift │ │ │ │ │ ├── pubspec.yaml │ │ │ │ │ └── test/ │ │ │ │ │ └── widget_test.dart │ │ │ │ ├── lib/ │ │ │ │ │ ├── appflowy_ui.dart │ │ │ │ │ └── src/ │ │ │ │ │ ├── component/ │ │ │ │ │ │ ├── avatar/ │ │ │ │ │ │ │ └── avatar.dart │ │ │ │ │ │ ├── button/ │ │ │ │ │ │ │ ├── base_button/ │ │ │ │ │ │ │ │ ├── base.dart │ │ │ │ │ │ │ │ ├── base_button.dart │ │ │ │ │ │ │ │ └── base_text_button.dart │ │ │ │ │ │ │ ├── button.dart │ │ │ │ │ │ │ ├── filled_button/ │ │ │ │ │ │ │ │ ├── filled_button.dart │ │ │ │ │ │ │ │ ├── filled_icon_text_button.dart │ │ │ │ │ │ │ │ └── filled_text_button.dart │ │ │ │ │ │ │ ├── ghost_button/ │ │ │ │ │ │ │ │ ├── ghost_button.dart │ │ │ │ │ │ │ │ ├── ghost_icon_text_button.dart │ │ │ │ │ │ │ │ └── ghost_text_button.dart │ │ │ │ │ │ │ └── outlined_button/ │ │ │ │ │ │ │ ├── outlined_button.dart │ │ │ │ │ │ │ ├── outlined_icon_text_button.dart │ │ │ │ │ │ │ └── outlined_text_button.dart │ │ │ │ │ │ ├── component.dart │ │ │ │ │ │ ├── dropdown_menu/ │ │ │ │ │ │ │ └── dropdown_menu.dart │ │ │ │ │ │ ├── menu/ │ │ │ │ │ │ │ ├── menu.dart │ │ │ │ │ │ │ ├── menu_item.dart │ │ │ │ │ │ │ ├── section.dart │ │ │ │ │ │ │ └── text_menu_item.dart │ │ │ │ │ │ ├── modal/ │ │ │ │ │ │ │ ├── dimension.dart │ │ │ │ │ │ │ └── modal.dart │ │ │ │ │ │ ├── popover/ │ │ │ │ │ │ │ ├── anchor.dart │ │ │ │ │ │ │ ├── popover.dart │ │ │ │ │ │ │ └── shadcn/ │ │ │ │ │ │ │ ├── _mouse_area.dart │ │ │ │ │ │ │ └── _portal.dart │ │ │ │ │ │ ├── separator/ │ │ │ │ │ │ │ └── divider.dart │ │ │ │ │ │ └── textfield/ │ │ │ │ │ │ └── textfield.dart │ │ │ │ │ └── theme/ │ │ │ │ │ ├── appflowy_theme.dart │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── appflowy_default/ │ │ │ │ │ │ │ ├── primitive.dart │ │ │ │ │ │ │ └── semantic.dart │ │ │ │ │ │ ├── built_in_themes.dart │ │ │ │ │ │ ├── custom/ │ │ │ │ │ │ │ └── custom_theme.dart │ │ │ │ │ │ └── shared.dart │ │ │ │ │ ├── definition/ │ │ │ │ │ │ ├── border_radius/ │ │ │ │ │ │ │ └── border_radius.dart │ │ │ │ │ │ ├── color_scheme/ │ │ │ │ │ │ │ ├── background_color_scheme.dart │ │ │ │ │ │ │ ├── badge_color_scheme.dart │ │ │ │ │ │ │ ├── border_color_scheme.dart │ │ │ │ │ │ │ ├── brand_color_scheme.dart │ │ │ │ │ │ │ ├── color_scheme.dart │ │ │ │ │ │ │ ├── fill_color_scheme.dart │ │ │ │ │ │ │ ├── icon_color_scheme.dart │ │ │ │ │ │ │ ├── other_color_scheme.dart │ │ │ │ │ │ │ ├── surface_color_scheme.dart │ │ │ │ │ │ │ ├── surface_container_color_scheme.dart │ │ │ │ │ │ │ └── text_color_scheme.dart │ │ │ │ │ │ ├── shadow/ │ │ │ │ │ │ │ └── shadow.dart │ │ │ │ │ │ ├── spacing/ │ │ │ │ │ │ │ └── spacing.dart │ │ │ │ │ │ ├── text_style/ │ │ │ │ │ │ │ ├── base/ │ │ │ │ │ │ │ │ └── default_text_style.dart │ │ │ │ │ │ │ └── text_style.dart │ │ │ │ │ │ └── theme_data.dart │ │ │ │ │ └── theme.dart │ │ │ │ ├── pubspec.yaml │ │ │ │ └── script/ │ │ │ │ ├── Primitive.Mode 1.tokens.json │ │ │ │ ├── Semantic.Dark Mode.tokens.json │ │ │ │ ├── Semantic.Light Mode.tokens.json │ │ │ │ └── generate_theme.dart │ │ │ ├── flowy_infra/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .metadata │ │ │ │ ├── LICENSE │ │ │ │ ├── analysis_options.yaml │ │ │ │ ├── lib/ │ │ │ │ │ ├── colorscheme/ │ │ │ │ │ │ ├── colorscheme.dart │ │ │ │ │ │ ├── dandelion.dart │ │ │ │ │ │ ├── default_colorscheme.dart │ │ │ │ │ │ ├── lavender.dart │ │ │ │ │ │ └── lemonade.dart │ │ │ │ │ ├── file_picker/ │ │ │ │ │ │ ├── file_picker_impl.dart │ │ │ │ │ │ └── file_picker_service.dart │ │ │ │ │ ├── icon_data.dart │ │ │ │ │ ├── language.dart │ │ │ │ │ ├── notifier.dart │ │ │ │ │ ├── platform_extension.dart │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── bloc/ │ │ │ │ │ │ │ ├── dynamic_plugin_bloc.dart │ │ │ │ │ │ │ ├── dynamic_plugin_event.dart │ │ │ │ │ │ │ └── dynamic_plugin_state.dart │ │ │ │ │ │ └── service/ │ │ │ │ │ │ ├── location_service.dart │ │ │ │ │ │ ├── models/ │ │ │ │ │ │ │ ├── exceptions.dart │ │ │ │ │ │ │ ├── flowy_dynamic_plugin.dart │ │ │ │ │ │ │ └── plugin_type.dart │ │ │ │ │ │ └── plugin_service.dart │ │ │ │ │ ├── size.dart │ │ │ │ │ ├── theme.dart │ │ │ │ │ ├── theme_extension.dart │ │ │ │ │ ├── time/ │ │ │ │ │ │ ├── duration.dart │ │ │ │ │ │ └── prelude.dart │ │ │ │ │ ├── utils/ │ │ │ │ │ │ └── color_converter.dart │ │ │ │ │ └── uuid.dart │ │ │ │ └── pubspec.yaml │ │ │ ├── flowy_infra_ui/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .metadata │ │ │ │ ├── CHANGELOG.md │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── analysis_options.yaml │ │ │ │ ├── android/ │ │ │ │ │ ├── .classpath │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .project │ │ │ │ │ ├── .settings/ │ │ │ │ │ │ └── org.eclipse.buildship.core.prefs │ │ │ │ │ ├── build.gradle │ │ │ │ │ ├── gradle/ │ │ │ │ │ │ └── wrapper/ │ │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ │ ├── gradle.properties │ │ │ │ │ ├── settings.gradle │ │ │ │ │ └── src/ │ │ │ │ │ └── main/ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ ├── java/ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ └── flowy_infra_ui/ │ │ │ │ │ │ ├── FlowyInfraUIPlugin.java │ │ │ │ │ │ └── event/ │ │ │ │ │ │ └── KeyboardEventHandler.java │ │ │ │ │ └── kotlin/ │ │ │ │ │ └── com/ │ │ │ │ │ └── example/ │ │ │ │ │ └── flowy_infra_ui/ │ │ │ │ │ └── FlowyInfraUiPlugin.kt │ │ │ │ ├── example/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .metadata │ │ │ │ │ ├── README.md │ │ │ │ │ ├── analysis_options.yaml │ │ │ │ │ ├── android/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── .project │ │ │ │ │ │ ├── .settings/ │ │ │ │ │ │ │ └── org.eclipse.buildship.core.prefs │ │ │ │ │ │ ├── app/ │ │ │ │ │ │ │ ├── .classpath │ │ │ │ │ │ │ ├── .project │ │ │ │ │ │ │ ├── .settings/ │ │ │ │ │ │ │ │ └── org.eclipse.buildship.core.prefs │ │ │ │ │ │ │ ├── build.gradle │ │ │ │ │ │ │ └── src/ │ │ │ │ │ │ │ ├── debug/ │ │ │ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ │ │ │ ├── kotlin/ │ │ │ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ │ │ │ ├── example/ │ │ │ │ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ │ │ │ │ └── flowy_infra_ui_example/ │ │ │ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ │ │ │ └── res/ │ │ │ │ │ │ │ │ ├── drawable/ │ │ │ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ │ │ ├── drawable-v21/ │ │ │ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ │ │ ├── values/ │ │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ │ └── values-night/ │ │ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ │ └── profile/ │ │ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ │ ├── build.gradle │ │ │ │ │ │ ├── gradle/ │ │ │ │ │ │ │ └── wrapper/ │ │ │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ │ │ ├── gradle.properties │ │ │ │ │ │ └── settings.gradle │ │ │ │ │ ├── example/ │ │ │ │ │ │ └── android/ │ │ │ │ │ │ └── app/ │ │ │ │ │ │ └── src/ │ │ │ │ │ │ └── main/ │ │ │ │ │ │ └── java/ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ └── flowy_infra_ui_example/ │ │ │ │ │ │ └── FlutterActivity.java │ │ │ │ │ ├── ios/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ └── Release.xcconfig │ │ │ │ │ │ ├── Podfile │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ │ │ └── README.md │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ │ │ │ └── Main.storyboard │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ └── Runner-Bridging-Header.h │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ └── Runner.xcworkspace/ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── home/ │ │ │ │ │ │ │ ├── demo_item.dart │ │ │ │ │ │ │ └── home_screen.dart │ │ │ │ │ │ ├── keyboard/ │ │ │ │ │ │ │ └── keyboard_screen.dart │ │ │ │ │ │ ├── main.dart │ │ │ │ │ │ └── overlay/ │ │ │ │ │ │ └── overlay_screen.dart │ │ │ │ │ ├── linux/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ │ ├── flutter/ │ │ │ │ │ │ │ └── CMakeLists.txt │ │ │ │ │ │ ├── main.cc │ │ │ │ │ │ ├── my_application.cc │ │ │ │ │ │ └── my_application.h │ │ │ │ │ ├── macos/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ ├── Flutter/ │ │ │ │ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ │ │ │ │ └── Flutter-Release.xcconfig │ │ │ │ │ │ ├── Podfile │ │ │ │ │ │ ├── Runner/ │ │ │ │ │ │ │ ├── AppDelegate.swift │ │ │ │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ │ └── MainMenu.xib │ │ │ │ │ │ │ ├── Configs/ │ │ │ │ │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ │ │ │ ├── Release.xcconfig │ │ │ │ │ │ │ │ └── Warnings.xcconfig │ │ │ │ │ │ │ ├── DebugProfile.entitlements │ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ │ ├── MainFlutterWindow.swift │ │ │ │ │ │ │ └── Release.entitlements │ │ │ │ │ │ ├── Runner.xcodeproj/ │ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ │ └── Runner.xcscheme │ │ │ │ │ │ └── Runner.xcworkspace/ │ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ │ ├── pubspec.yaml │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── widget_test.dart │ │ │ │ │ ├── web/ │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ └── manifest.json │ │ │ │ │ └── windows/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── flutter/ │ │ │ │ │ │ └── CMakeLists.txt │ │ │ │ │ └── runner/ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── Runner.rc │ │ │ │ │ ├── flutter_window.cpp │ │ │ │ │ ├── flutter_window.h │ │ │ │ │ ├── main.cpp │ │ │ │ │ ├── resource.h │ │ │ │ │ ├── runner.exe.manifest │ │ │ │ │ ├── utils.cpp │ │ │ │ │ ├── utils.h │ │ │ │ │ ├── win32_window.cpp │ │ │ │ │ └── win32_window.h │ │ │ │ ├── flowy_infra_ui_platform_interface/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .metadata │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── analysis_options.yaml │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── flowy_infra_ui_platform_interface.dart │ │ │ │ │ │ └── src/ │ │ │ │ │ │ └── method_channel_flowy_infra_ui.dart │ │ │ │ │ ├── pubspec.yaml │ │ │ │ │ └── test/ │ │ │ │ │ └── flowy_infra_ui_platform_interface_test.dart │ │ │ │ ├── flowy_infra_ui_web/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .metadata │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── analysis_options.yaml │ │ │ │ │ ├── lib/ │ │ │ │ │ │ └── flowy_infra_ui_web.dart │ │ │ │ │ ├── pubspec.yaml │ │ │ │ │ └── test/ │ │ │ │ │ └── flowy_infra_ui_web_test.dart │ │ │ │ ├── ios/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── Assets/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── Classes/ │ │ │ │ │ │ ├── Event/ │ │ │ │ │ │ │ └── KeyboardEventHandler.swift │ │ │ │ │ │ ├── FlowyInfraUIPlugin.h │ │ │ │ │ │ ├── FlowyInfraUIPlugin.m │ │ │ │ │ │ └── SwiftFlowyInfraUIPlugin.swift │ │ │ │ │ └── flowy_infra_ui.podspec │ │ │ │ ├── lib/ │ │ │ │ │ ├── basis.dart │ │ │ │ │ ├── flowy_infra_ui.dart │ │ │ │ │ ├── flowy_infra_ui_web.dart │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── flowy_overlay/ │ │ │ │ │ │ │ ├── appflowy_popover.dart │ │ │ │ │ │ │ ├── flowy_dialog.dart │ │ │ │ │ │ │ ├── flowy_overlay.dart │ │ │ │ │ │ │ ├── flowy_popover_layout.dart │ │ │ │ │ │ │ ├── layout.dart │ │ │ │ │ │ │ ├── list_overlay.dart │ │ │ │ │ │ │ └── option_overlay.dart │ │ │ │ │ │ ├── focus/ │ │ │ │ │ │ │ └── auto_unfocus_overlay.dart │ │ │ │ │ │ └── keyboard/ │ │ │ │ │ │ └── keyboard_visibility_detector.dart │ │ │ │ │ ├── style_widget/ │ │ │ │ │ │ ├── bar_title.dart │ │ │ │ │ │ ├── button.dart │ │ │ │ │ │ ├── close_button.dart │ │ │ │ │ │ ├── color_picker.dart │ │ │ │ │ │ ├── container.dart │ │ │ │ │ │ ├── decoration.dart │ │ │ │ │ │ ├── divider.dart │ │ │ │ │ │ ├── extension.dart │ │ │ │ │ │ ├── hover.dart │ │ │ │ │ │ ├── icon_button.dart │ │ │ │ │ │ ├── image_icon.dart │ │ │ │ │ │ ├── primary_rounded_button.dart │ │ │ │ │ │ ├── progress_indicator.dart │ │ │ │ │ │ ├── scrollbar.dart │ │ │ │ │ │ ├── scrolling/ │ │ │ │ │ │ │ ├── styled_list.dart │ │ │ │ │ │ │ ├── styled_scroll_bar.dart │ │ │ │ │ │ │ └── styled_scrollview.dart │ │ │ │ │ │ ├── snap_bar.dart │ │ │ │ │ │ ├── text.dart │ │ │ │ │ │ ├── text_field.dart │ │ │ │ │ │ ├── text_input.dart │ │ │ │ │ │ └── toolbar_button.dart │ │ │ │ │ └── widget/ │ │ │ │ │ ├── buttons/ │ │ │ │ │ │ ├── base_styled_button.dart │ │ │ │ │ │ ├── primary_button.dart │ │ │ │ │ │ └── secondary_button.dart │ │ │ │ │ ├── constraint_flex_view.dart │ │ │ │ │ ├── dialog/ │ │ │ │ │ │ ├── dialog_size.dart │ │ │ │ │ │ └── styled_dialogs.dart │ │ │ │ │ ├── flowy_tooltip.dart │ │ │ │ │ ├── ignore_parent_gesture.dart │ │ │ │ │ ├── mouse_hover_builder.dart │ │ │ │ │ ├── rounded_button.dart │ │ │ │ │ ├── rounded_input_field.dart │ │ │ │ │ ├── route/ │ │ │ │ │ │ └── animation.dart │ │ │ │ │ ├── separated_flex.dart │ │ │ │ │ └── spacing.dart │ │ │ │ ├── linux/ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── flowy_infra_u_i_plugin.cc │ │ │ │ │ ├── flowy_infra_ui_plugin.cc │ │ │ │ │ └── include/ │ │ │ │ │ └── flowy_infra_ui/ │ │ │ │ │ ├── flowy_infra_u_i_plugin.h │ │ │ │ │ └── flowy_infra_ui_plugin.h │ │ │ │ ├── macos/ │ │ │ │ │ ├── Classes/ │ │ │ │ │ │ └── FlowyInfraUiPlugin.swift │ │ │ │ │ └── flowy_infra_ui.podspec │ │ │ │ ├── pubspec.yaml │ │ │ │ ├── test/ │ │ │ │ │ └── flowy_infra_ui_test.dart │ │ │ │ └── windows/ │ │ │ │ ├── .gitignore │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── flowy_infra_ui_plugin.cpp │ │ │ │ └── include/ │ │ │ │ └── flowy_infra_ui/ │ │ │ │ ├── flowy_infra_u_i_plugin.h │ │ │ │ └── flowy_infra_ui_plugin.h │ │ │ └── flowy_svg/ │ │ │ ├── .github/ │ │ │ │ ├── ISSUE_TEMPLATE/ │ │ │ │ │ ├── bug_report.md │ │ │ │ │ ├── build.md │ │ │ │ │ ├── chore.md │ │ │ │ │ ├── ci.md │ │ │ │ │ ├── config.yml │ │ │ │ │ ├── documentation.md │ │ │ │ │ ├── feature_request.md │ │ │ │ │ ├── performance.md │ │ │ │ │ ├── refactor.md │ │ │ │ │ ├── revert.md │ │ │ │ │ ├── style.md │ │ │ │ │ └── test.md │ │ │ │ ├── PULL_REQUEST_TEMPLATE.md │ │ │ │ ├── cspell.json │ │ │ │ ├── dependabot.yaml │ │ │ │ └── workflows/ │ │ │ │ └── main.yaml │ │ │ ├── .gitignore │ │ │ ├── analysis_options.yaml │ │ │ ├── bin/ │ │ │ │ ├── flowy_svg.dart │ │ │ │ └── options.dart │ │ │ ├── lib/ │ │ │ │ ├── flowy_svg.dart │ │ │ │ └── src/ │ │ │ │ └── flowy_svg.dart │ │ │ └── pubspec.yaml │ │ ├── pubspec.lock │ │ ├── pubspec.yaml │ │ ├── test/ │ │ │ ├── bloc_test/ │ │ │ │ ├── ai_writer_test/ │ │ │ │ │ └── ai_writer_bloc_test.dart │ │ │ │ ├── app_setting_test/ │ │ │ │ │ ├── appearance_test.dart │ │ │ │ │ └── document_appearance_test.dart │ │ │ │ ├── board_test/ │ │ │ │ │ ├── create_card_test.dart │ │ │ │ │ ├── create_or_edit_field_test.dart │ │ │ │ │ ├── group_by_checkbox_field_test.dart │ │ │ │ │ ├── group_by_date_test.dart │ │ │ │ │ ├── group_by_multi_select_field_test.dart │ │ │ │ │ ├── group_by_unsupport_field_test.dart │ │ │ │ │ └── util.dart │ │ │ │ ├── chat_test/ │ │ │ │ │ ├── chat_load_message_test.dart │ │ │ │ │ └── util.dart │ │ │ │ ├── grid_test/ │ │ │ │ │ ├── cell/ │ │ │ │ │ │ ├── checklist_cell_bloc_test.dart │ │ │ │ │ │ ├── date_cell_bloc_test.dart │ │ │ │ │ │ ├── select_option_cell_test.dart │ │ │ │ │ │ └── text_cell_bloc_test.dart │ │ │ │ │ ├── field/ │ │ │ │ │ │ ├── field_cell_bloc_test.dart │ │ │ │ │ │ └── field_editor_bloc_test.dart │ │ │ │ │ ├── filter/ │ │ │ │ │ │ ├── filter_editor_bloc_test.dart │ │ │ │ │ │ └── filter_entities_test.dart │ │ │ │ │ ├── grid_bloc_test.dart │ │ │ │ │ ├── sort/ │ │ │ │ │ │ └── sort_editor_bloc_test.dart │ │ │ │ │ └── util.dart │ │ │ │ ├── home_test/ │ │ │ │ │ ├── home_bloc_test.dart │ │ │ │ │ ├── sidebar_section_bloc_test.dart │ │ │ │ │ ├── trash_bloc_test.dart │ │ │ │ │ └── view_bloc_test.dart │ │ │ │ ├── lib/ │ │ │ │ │ └── features/ │ │ │ │ │ ├── settings/ │ │ │ │ │ │ └── data_location_bloc_test.dart │ │ │ │ │ ├── share_section/ │ │ │ │ │ │ └── shared_section_bloc_test.dart │ │ │ │ │ └── share_tab/ │ │ │ │ │ └── share_tab_bloc_test.dart │ │ │ │ ├── shortcuts_test/ │ │ │ │ │ └── shortcuts_cubit_test.dart │ │ │ │ ├── view_selector_test.dart │ │ │ │ └── workspace_test/ │ │ │ │ └── workspace_bloc_test.dart │ │ │ ├── unit_test/ │ │ │ │ ├── algorithm/ │ │ │ │ │ └── levenshtein_test.dart │ │ │ │ ├── deeplink/ │ │ │ │ │ └── deeplink_test.dart │ │ │ │ ├── document/ │ │ │ │ │ ├── document_diff/ │ │ │ │ │ │ └── document_diff_test.dart │ │ │ │ │ ├── html/ │ │ │ │ │ │ ├── _html_samples.dart │ │ │ │ │ │ └── paste_from_html_test.dart │ │ │ │ │ ├── option_menu/ │ │ │ │ │ │ └── block_action_option_cubit_test.dart │ │ │ │ │ ├── shortcuts/ │ │ │ │ │ │ ├── format_shortcut_test.dart │ │ │ │ │ │ └── toggle_list_shortcut_test.dart │ │ │ │ │ ├── text_robot/ │ │ │ │ │ │ ├── markdown_text_robot_test.dart │ │ │ │ │ │ └── text_robot_test.dart │ │ │ │ │ └── turn_into/ │ │ │ │ │ └── turn_into_test.dart │ │ │ │ ├── editor/ │ │ │ │ │ ├── editor_drop_test.dart │ │ │ │ │ ├── editor_migration_test.dart │ │ │ │ │ ├── editor_style_test.dart │ │ │ │ │ ├── file_block_test.dart │ │ │ │ │ ├── share_markdown_test.dart │ │ │ │ │ └── transaction_adapter_test.dart │ │ │ │ ├── image/ │ │ │ │ │ └── appflowy_network_image_test.dart │ │ │ │ ├── link_preview/ │ │ │ │ │ └── link_preview_test.dart │ │ │ │ ├── markdown/ │ │ │ │ │ └── markdown_parser_test.dart │ │ │ │ ├── search/ │ │ │ │ │ └── split_search_test.dart │ │ │ │ ├── select_option_split_text_input.dart │ │ │ │ ├── settings/ │ │ │ │ │ ├── shortcuts/ │ │ │ │ │ │ └── settings_shortcut_service_test.dart │ │ │ │ │ └── theme_missing_keys_test.dart │ │ │ │ ├── simple_table/ │ │ │ │ │ ├── simple_table_contente_operation_test.dart │ │ │ │ │ ├── simple_table_delete_operation_test.dart │ │ │ │ │ ├── simple_table_duplicate_operation_test.dart │ │ │ │ │ ├── simple_table_header_operation_test.dart │ │ │ │ │ ├── simple_table_insert_operation_test.dart │ │ │ │ │ ├── simple_table_markdown_test.dart │ │ │ │ │ ├── simple_table_reorder_operation_test.dart │ │ │ │ │ ├── simple_table_style_operation_test.dart │ │ │ │ │ └── simple_table_test_helper.dart │ │ │ │ ├── theme/ │ │ │ │ │ └── theme_test.dart │ │ │ │ ├── url_launcher/ │ │ │ │ │ └── url_launcher_test.dart │ │ │ │ └── util/ │ │ │ │ ├── recent_icons_test.dart │ │ │ │ └── time.dart │ │ │ ├── util.dart │ │ │ └── widget_test/ │ │ │ ├── confirm_dialog_test.dart │ │ │ ├── date_picker_test.dart │ │ │ ├── direction_setting_test.dart │ │ │ ├── lib/ │ │ │ │ └── features/ │ │ │ │ ├── share_section/ │ │ │ │ │ ├── refresh_button_test.dart │ │ │ │ │ ├── shared_page_actions_button_test.dart │ │ │ │ │ ├── shared_pages_list_test.dart │ │ │ │ │ ├── shared_section_error_test.dart │ │ │ │ │ ├── shared_section_header_test.dart │ │ │ │ │ └── shared_section_loading_test.dart │ │ │ │ └── share_tab/ │ │ │ │ ├── access_level_list_widget_test.dart │ │ │ │ ├── copy_link_widget_test.dart │ │ │ │ ├── edit_access_level_widget_test.dart │ │ │ │ ├── general_access_section_test.dart │ │ │ │ ├── people_with_access_section_test.dart │ │ │ │ ├── share_with_user_widget_test.dart │ │ │ │ ├── shared_group_widget_test.dart │ │ │ │ └── shared_user_widget_test.dart │ │ │ ├── select_option_text_field_test.dart │ │ │ ├── spae_cion_test.dart │ │ │ ├── test_asset_bundle.dart │ │ │ ├── test_material_app.dart │ │ │ ├── theme_font_family_setting_test.dart │ │ │ └── widget_test_wrapper.dart │ │ ├── web/ │ │ │ ├── index.html │ │ │ └── manifest.json │ │ └── windows/ │ │ ├── .gitignore │ │ ├── CMakeLists.txt │ │ ├── flutter/ │ │ │ └── CMakeLists.txt │ │ └── runner/ │ │ ├── CMakeLists.txt │ │ ├── Runner.rc │ │ ├── flutter_window.cpp │ │ ├── flutter_window.h │ │ ├── main.cpp │ │ ├── resource.h │ │ ├── runner.exe.manifest │ │ ├── utils.cpp │ │ ├── utils.h │ │ ├── win32_window.cpp │ │ └── win32_window.h │ ├── resources/ │ │ └── translations/ │ │ ├── am-ET.json │ │ ├── ar-SA.json │ │ ├── ca-ES.json │ │ ├── ckb-KU.json │ │ ├── cs-CZ.json │ │ ├── de-DE.json │ │ ├── el-GR.json │ │ ├── en-GB.json │ │ ├── en-US.json │ │ ├── es-VE.json │ │ ├── eu-ES.json │ │ ├── fa.json │ │ ├── fr-CA.json │ │ ├── fr-FR.json │ │ ├── ga-IE.json │ │ ├── he.json │ │ ├── hin.json │ │ ├── hu-HU.json │ │ ├── id-ID.json │ │ ├── it-IT.json │ │ ├── ja-JP.json │ │ ├── ko-KR.json │ │ ├── mr-IN.json │ │ ├── pl-PL.json │ │ ├── pt-BR.json │ │ ├── pt-PT.json │ │ ├── ru-RU.json │ │ ├── sv-SE.json │ │ ├── th-TH.json │ │ ├── tr-TR.json │ │ ├── uk-UA.json │ │ ├── ur.json │ │ ├── vi-VN.json │ │ ├── vi.json │ │ ├── zh-CN.json │ │ └── zh-TW.json │ ├── rust-lib/ │ │ ├── .gitignore │ │ ├── .vscode/ │ │ │ └── launch.json │ │ ├── Cargo.toml │ │ ├── build-tool/ │ │ │ ├── flowy-ast/ │ │ │ │ ├── Cargo.toml │ │ │ │ └── src/ │ │ │ │ ├── ast.rs │ │ │ │ ├── ctxt.rs │ │ │ │ ├── event_attrs.rs │ │ │ │ ├── lib.rs │ │ │ │ ├── node_attrs.rs │ │ │ │ ├── pb_attrs.rs │ │ │ │ ├── symbol.rs │ │ │ │ └── ty_ext.rs │ │ │ ├── flowy-codegen/ │ │ │ │ ├── Cargo.toml │ │ │ │ └── src/ │ │ │ │ ├── ast.rs │ │ │ │ ├── dart_event/ │ │ │ │ │ ├── dart_event.rs │ │ │ │ │ ├── event_template.rs │ │ │ │ │ ├── event_template.tera │ │ │ │ │ └── mod.rs │ │ │ │ ├── flowy_toml.rs │ │ │ │ ├── lib.rs │ │ │ │ ├── protobuf_file/ │ │ │ │ │ ├── ast.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── proto_gen.rs │ │ │ │ │ ├── proto_info.rs │ │ │ │ │ └── template/ │ │ │ │ │ ├── derive_meta/ │ │ │ │ │ │ ├── derive_meta.rs │ │ │ │ │ │ ├── derive_meta.tera │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── proto_file/ │ │ │ │ │ ├── enum.tera │ │ │ │ │ ├── enum_template.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── struct.tera │ │ │ │ │ └── struct_template.rs │ │ │ │ ├── ts_event/ │ │ │ │ │ ├── event_template.rs │ │ │ │ │ ├── event_template.tera │ │ │ │ │ └── mod.rs │ │ │ │ └── util.rs │ │ │ └── flowy-derive/ │ │ │ ├── .gitignore │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── dart_event/ │ │ │ │ └── mod.rs │ │ │ ├── lib.rs │ │ │ ├── node/ │ │ │ │ └── mod.rs │ │ │ └── proto_buf/ │ │ │ ├── deserialize.rs │ │ │ ├── enum_serde.rs │ │ │ ├── mod.rs │ │ │ ├── serialize.rs │ │ │ └── util.rs │ │ ├── collab-integrate/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── collab_builder.rs │ │ │ ├── config.rs │ │ │ ├── instant_indexed_data_provider.rs │ │ │ ├── lib.rs │ │ │ └── plugin_provider.rs │ │ ├── covtest.rs │ │ ├── dart-ffi/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── binding.h │ │ │ ├── build.rs │ │ │ └── src/ │ │ │ ├── appflowy_yaml.rs │ │ │ ├── c.rs │ │ │ ├── env_serde.rs │ │ │ ├── lib.rs │ │ │ ├── model/ │ │ │ │ ├── ffi_request.rs │ │ │ │ ├── ffi_response.rs │ │ │ │ └── mod.rs │ │ │ └── notification/ │ │ │ ├── mod.rs │ │ │ └── sender.rs │ │ ├── event-integration-test/ │ │ │ ├── Cargo.toml │ │ │ ├── src/ │ │ │ │ ├── chat_event.rs │ │ │ │ ├── database_event.rs │ │ │ │ ├── document/ │ │ │ │ │ ├── document_event.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── utils.rs │ │ │ │ ├── document_event.rs │ │ │ │ ├── event_builder.rs │ │ │ │ ├── folder_event.rs │ │ │ │ ├── lib.rs │ │ │ │ └── user_event.rs │ │ │ └── tests/ │ │ │ ├── asset/ │ │ │ │ ├── database_template_1.afdb │ │ │ │ ├── japan_trip.md │ │ │ │ └── project.csv │ │ │ ├── chat/ │ │ │ │ ├── chat_message_test.rs │ │ │ │ ├── local_chat_test.rs │ │ │ │ └── mod.rs │ │ │ ├── database/ │ │ │ │ ├── af_cloud/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── summarize_row_test.rs │ │ │ │ │ ├── translate_row_test.rs │ │ │ │ │ └── util.rs │ │ │ │ ├── local_test/ │ │ │ │ │ ├── calculate_test.rs │ │ │ │ │ ├── event_test.rs │ │ │ │ │ ├── group_test.rs │ │ │ │ │ └── mod.rs │ │ │ │ └── mod.rs │ │ │ ├── document/ │ │ │ │ ├── af_cloud_test/ │ │ │ │ │ ├── edit_test.rs │ │ │ │ │ ├── file_upload_test.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── local_test/ │ │ │ │ │ ├── edit_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── snapshot_test.rs │ │ │ │ └── mod.rs │ │ │ ├── folder/ │ │ │ │ ├── local_test/ │ │ │ │ │ ├── folder_test.rs │ │ │ │ │ ├── import_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── publish_database_test.rs │ │ │ │ │ ├── publish_document_test.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ ├── subscription_test.rs │ │ │ │ │ └── test.rs │ │ │ │ └── mod.rs │ │ │ ├── main.rs │ │ │ ├── search/ │ │ │ │ ├── document_title_content_search.rs │ │ │ │ └── mod.rs │ │ │ ├── sql_test/ │ │ │ │ ├── chat_message_ordering_test.rs │ │ │ │ ├── chat_message_test.rs │ │ │ │ └── mod.rs │ │ │ ├── user/ │ │ │ │ ├── af_cloud_test/ │ │ │ │ │ ├── auth_test.rs │ │ │ │ │ ├── import_af_data_folder_test.rs │ │ │ │ │ ├── member_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── util.rs │ │ │ │ │ └── workspace_test.rs │ │ │ │ ├── local_test/ │ │ │ │ │ ├── auth_test.rs │ │ │ │ │ ├── helper.rs │ │ │ │ │ ├── import_af_data_local_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── user_awareness_test.rs │ │ │ │ │ └── user_profile_test.rs │ │ │ │ ├── migration_test/ │ │ │ │ │ ├── document_test.rs │ │ │ │ │ ├── history_user_db/ │ │ │ │ │ │ └── README.md │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── version_test.rs │ │ │ │ └── mod.rs │ │ │ └── util.rs │ │ ├── flowy-ai/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ ├── dev.env │ │ │ ├── src/ │ │ │ │ ├── ai_manager.rs │ │ │ │ ├── ai_tool/ │ │ │ │ │ ├── markdown.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── pdf.rs │ │ │ │ ├── chat.rs │ │ │ │ ├── completion.rs │ │ │ │ ├── embeddings/ │ │ │ │ │ ├── context.rs │ │ │ │ │ ├── document_indexer.rs │ │ │ │ │ ├── embedder.rs │ │ │ │ │ ├── indexer.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── scheduler.rs │ │ │ │ │ └── store.rs │ │ │ │ ├── entities.rs │ │ │ │ ├── event_handler.rs │ │ │ │ ├── event_map.rs │ │ │ │ ├── lib.rs │ │ │ │ ├── local_ai/ │ │ │ │ │ ├── chat/ │ │ │ │ │ │ ├── chains/ │ │ │ │ │ │ │ ├── context_question_chain.rs │ │ │ │ │ │ │ ├── conversation_chain.rs │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ └── related_question_chain.rs │ │ │ │ │ │ ├── format_prompt.rs │ │ │ │ │ │ ├── llm.rs │ │ │ │ │ │ ├── llm_chat.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── retriever/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── multi_source_retriever.rs │ │ │ │ │ │ │ └── sqlite_retriever.rs │ │ │ │ │ │ └── summary_memory.rs │ │ │ │ │ ├── completion/ │ │ │ │ │ │ ├── chain.rs │ │ │ │ │ │ ├── impls.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── stream_interpreter.rs │ │ │ │ │ │ └── writer.rs │ │ │ │ │ ├── controller.rs │ │ │ │ │ ├── database/ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── summary.rs │ │ │ │ │ │ └── translate.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── prompt/ │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── request.rs │ │ │ │ │ ├── resource.rs │ │ │ │ │ └── stream_util.rs │ │ │ │ ├── mcp/ │ │ │ │ │ ├── manager.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── middleware/ │ │ │ │ │ ├── chat_service_mw.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── model_select.rs │ │ │ │ ├── model_select_test.rs │ │ │ │ ├── notification.rs │ │ │ │ ├── offline/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── offline_message_sync.rs │ │ │ │ ├── search/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── summary.rs │ │ │ │ └── stream_message.rs │ │ │ └── tests/ │ │ │ ├── asset/ │ │ │ │ └── japan_trip.md │ │ │ ├── chat_test/ │ │ │ │ ├── mod.rs │ │ │ │ ├── qa_test.rs │ │ │ │ └── related_question_test.rs │ │ │ ├── complete_test/ │ │ │ │ └── mod.rs │ │ │ ├── main.rs │ │ │ ├── summary_test/ │ │ │ │ └── mod.rs │ │ │ └── translate_test/ │ │ │ └── mod.rs │ │ ├── flowy-ai-pub/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── cloud.rs │ │ │ ├── entities.rs │ │ │ ├── lib.rs │ │ │ ├── persistence/ │ │ │ │ ├── chat_message_sql.rs │ │ │ │ ├── chat_sql.rs │ │ │ │ ├── collab_metadata_sql.rs │ │ │ │ ├── collab_sql.rs │ │ │ │ ├── local_model_sql.rs │ │ │ │ └── mod.rs │ │ │ └── user_service.rs │ │ ├── flowy-core/ │ │ │ ├── .gitignore │ │ │ ├── Cargo.toml │ │ │ ├── assets/ │ │ │ │ └── read_me.json │ │ │ └── src/ │ │ │ ├── app_life_cycle.rs │ │ │ ├── config.rs │ │ │ ├── deps_resolve/ │ │ │ │ ├── chat_deps.rs │ │ │ │ ├── cloud_service_impl.rs │ │ │ │ ├── collab_deps.rs │ │ │ │ ├── database_deps.rs │ │ │ │ ├── document_deps.rs │ │ │ │ ├── file_storage_deps.rs │ │ │ │ ├── folder_deps/ │ │ │ │ │ ├── folder_deps_chat_impl.rs │ │ │ │ │ ├── folder_deps_database_impl.rs │ │ │ │ │ ├── folder_deps_doc_impl.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── reminder_deps.rs │ │ │ │ ├── search_deps.rs │ │ │ │ └── user_deps.rs │ │ │ ├── folder_view_observer.rs │ │ │ ├── full_indexed_data_provider.rs │ │ │ ├── indexed_data_consumer.rs │ │ │ ├── indexing_data_runner.rs │ │ │ ├── lib.rs │ │ │ ├── log_filter.rs │ │ │ ├── module.rs │ │ │ └── server_layer.rs │ │ ├── flowy-database-pub/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── cloud.rs │ │ │ └── lib.rs │ │ ├── flowy-database2/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ ├── src/ │ │ │ │ ├── entities/ │ │ │ │ │ ├── board_entities.rs │ │ │ │ │ ├── calculation/ │ │ │ │ │ │ ├── calculation_changeset.rs │ │ │ │ │ │ ├── calculation_entities.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── calendar_entities.rs │ │ │ │ │ ├── cell_entities.rs │ │ │ │ │ ├── database_entities.rs │ │ │ │ │ ├── field_entities.rs │ │ │ │ │ ├── field_settings_entities.rs │ │ │ │ │ ├── file_entities.rs │ │ │ │ │ ├── filter_entities/ │ │ │ │ │ │ ├── checkbox_filter.rs │ │ │ │ │ │ ├── checklist_filter.rs │ │ │ │ │ │ ├── date_filter.rs │ │ │ │ │ │ ├── filter_changeset.rs │ │ │ │ │ │ ├── media_filter.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── number_filter.rs │ │ │ │ │ │ ├── relation_filter.rs │ │ │ │ │ │ ├── select_option_filter.rs │ │ │ │ │ │ ├── text_filter.rs │ │ │ │ │ │ ├── time_filter.rs │ │ │ │ │ │ └── util.rs │ │ │ │ │ ├── group_entities/ │ │ │ │ │ │ ├── configuration.rs │ │ │ │ │ │ ├── group.rs │ │ │ │ │ │ ├── group_changeset.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── macros.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── parser.rs │ │ │ │ │ ├── position_entities.rs │ │ │ │ │ ├── row_entities.rs │ │ │ │ │ ├── setting_entities.rs │ │ │ │ │ ├── share_entities.rs │ │ │ │ │ ├── sort_entities.rs │ │ │ │ │ ├── type_option_entities/ │ │ │ │ │ │ ├── checkbox_entities.rs │ │ │ │ │ │ ├── checklist_entities.rs │ │ │ │ │ │ ├── date_entities.rs │ │ │ │ │ │ ├── media_entities.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── number_entities.rs │ │ │ │ │ │ ├── relation_entities.rs │ │ │ │ │ │ ├── select_option_entities.rs │ │ │ │ │ │ ├── summary_entities.rs │ │ │ │ │ │ ├── text_entities.rs │ │ │ │ │ │ ├── time_entities.rs │ │ │ │ │ │ ├── timestamp_entities.rs │ │ │ │ │ │ ├── translate_entities.rs │ │ │ │ │ │ └── url_entities.rs │ │ │ │ │ └── view_entities.rs │ │ │ │ ├── event_handler.rs │ │ │ │ ├── event_map.rs │ │ │ │ ├── lib.rs │ │ │ │ ├── manager.rs │ │ │ │ ├── notification.rs │ │ │ │ ├── services/ │ │ │ │ │ ├── calculations/ │ │ │ │ │ │ ├── cache.rs │ │ │ │ │ │ ├── controller.rs │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── service.rs │ │ │ │ │ │ └── task.rs │ │ │ │ │ ├── cell/ │ │ │ │ │ │ ├── cell_data_cache.rs │ │ │ │ │ │ ├── cell_operation.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ └── type_cell_data.rs │ │ │ │ │ ├── database/ │ │ │ │ │ │ ├── database_editor.rs │ │ │ │ │ │ ├── database_observe.rs │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ └── util.rs │ │ │ │ │ ├── database_view/ │ │ │ │ │ │ ├── layout_deps.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── notifier.rs │ │ │ │ │ │ ├── view_calculations.rs │ │ │ │ │ │ ├── view_editor.rs │ │ │ │ │ │ ├── view_filter.rs │ │ │ │ │ │ ├── view_group.rs │ │ │ │ │ │ ├── view_operation.rs │ │ │ │ │ │ ├── view_sort.rs │ │ │ │ │ │ └── views.rs │ │ │ │ │ ├── field/ │ │ │ │ │ │ ├── field_builder.rs │ │ │ │ │ │ ├── field_operation.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── type_option_transform.rs │ │ │ │ │ │ └── type_options/ │ │ │ │ │ │ ├── checkbox_type_option/ │ │ │ │ │ │ │ ├── checkbox_filter.rs │ │ │ │ │ │ │ ├── checkbox_tests.rs │ │ │ │ │ │ │ ├── checkbox_type_option.rs │ │ │ │ │ │ │ ├── checkbox_type_option_entities.rs │ │ │ │ │ │ │ └── mod.rs │ │ │ │ │ │ ├── checklist_type_option/ │ │ │ │ │ │ │ ├── checklist_filter.rs │ │ │ │ │ │ │ ├── checklist_type_option.rs │ │ │ │ │ │ │ └── mod.rs │ │ │ │ │ │ ├── date_type_option/ │ │ │ │ │ │ │ ├── date_filter.rs │ │ │ │ │ │ │ ├── date_tests.rs │ │ │ │ │ │ │ ├── date_type_option.rs │ │ │ │ │ │ │ └── mod.rs │ │ │ │ │ │ ├── media_type_option/ │ │ │ │ │ │ │ ├── media_file.rs │ │ │ │ │ │ │ ├── media_filter.rs │ │ │ │ │ │ │ ├── media_type_option.rs │ │ │ │ │ │ │ └── mod.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── number_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── number_filter.rs │ │ │ │ │ │ │ ├── number_type_option.rs │ │ │ │ │ │ │ └── number_type_option_entities.rs │ │ │ │ │ │ ├── relation_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── relation.rs │ │ │ │ │ │ │ └── relation_entities.rs │ │ │ │ │ │ ├── selection_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── multi_select_type_option.rs │ │ │ │ │ │ │ ├── select_filter.rs │ │ │ │ │ │ │ ├── select_option_tests.rs │ │ │ │ │ │ │ ├── select_type_option.rs │ │ │ │ │ │ │ ├── single_select_type_option.rs │ │ │ │ │ │ │ └── type_option_transform.rs │ │ │ │ │ │ ├── summary_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ └── summary.rs │ │ │ │ │ │ ├── text_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── text_filter.rs │ │ │ │ │ │ │ ├── text_tests.rs │ │ │ │ │ │ │ └── text_type_option.rs │ │ │ │ │ │ ├── time_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── time.rs │ │ │ │ │ │ │ └── time_filter.rs │ │ │ │ │ │ ├── timestamp_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ └── timestamp_type_option.rs │ │ │ │ │ │ ├── translate_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ └── translate.rs │ │ │ │ │ │ ├── type_option.rs │ │ │ │ │ │ ├── type_option_cell.rs │ │ │ │ │ │ ├── url_type_option/ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── url_tests.rs │ │ │ │ │ │ │ ├── url_type_option.rs │ │ │ │ │ │ │ └── url_type_option_entities.rs │ │ │ │ │ │ └── util.rs │ │ │ │ │ ├── field_settings/ │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ ├── field_settings_builder.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── filter/ │ │ │ │ │ │ ├── controller.rs │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ └── task.rs │ │ │ │ │ ├── group/ │ │ │ │ │ │ ├── action.rs │ │ │ │ │ │ ├── configuration.rs │ │ │ │ │ │ ├── controller.rs │ │ │ │ │ │ ├── controller_impls/ │ │ │ │ │ │ │ ├── checkbox_controller.rs │ │ │ │ │ │ │ ├── date_controller.rs │ │ │ │ │ │ │ ├── default_controller.rs │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ ├── select_option_controller/ │ │ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ │ │ ├── multi_select_controller.rs │ │ │ │ │ │ │ │ ├── single_select_controller.rs │ │ │ │ │ │ │ │ └── util.rs │ │ │ │ │ │ │ └── url_controller.rs │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ ├── group_builder.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── setting/ │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── share/ │ │ │ │ │ │ ├── csv/ │ │ │ │ │ │ │ ├── export.rs │ │ │ │ │ │ │ ├── import.rs │ │ │ │ │ │ │ └── mod.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ ├── snapshot/ │ │ │ │ │ │ ├── entities.rs │ │ │ │ │ │ └── mod.rs │ │ │ │ │ └── sort/ │ │ │ │ │ ├── controller.rs │ │ │ │ │ ├── entities.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── task.rs │ │ │ │ ├── template.rs │ │ │ │ └── utils/ │ │ │ │ ├── cache.rs │ │ │ │ └── mod.rs │ │ │ └── tests/ │ │ │ ├── database/ │ │ │ │ ├── block_test/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── row_test.rs │ │ │ │ │ └── script.rs │ │ │ │ ├── calculations_test/ │ │ │ │ │ ├── calculation_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ └── script.rs │ │ │ │ ├── cell_test/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ └── test.rs │ │ │ │ ├── database_editor.rs │ │ │ │ ├── field_settings_test/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ └── test.rs │ │ │ │ ├── field_test/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ ├── test.rs │ │ │ │ │ └── util.rs │ │ │ │ ├── filter_test/ │ │ │ │ │ ├── advanced_filter_test.rs │ │ │ │ │ ├── checkbox_filter_test.rs │ │ │ │ │ ├── checklist_filter_test.rs │ │ │ │ │ ├── date_filter_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── number_filter_test.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ ├── select_option_filter_test.rs │ │ │ │ │ ├── text_filter_test.rs │ │ │ │ │ └── time_filter_test.rs │ │ │ │ ├── group_test/ │ │ │ │ │ ├── date_group_test.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ ├── test.rs │ │ │ │ │ └── url_group_test.rs │ │ │ │ ├── layout_test/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── script.rs │ │ │ │ │ └── test.rs │ │ │ │ ├── mock_data/ │ │ │ │ │ ├── board_mock_data.rs │ │ │ │ │ ├── calendar_mock_data.rs │ │ │ │ │ ├── grid_mock_data.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── pre_fill_cell_test/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── pre_fill_row_according_to_filter_test.rs │ │ │ │ │ ├── pre_fill_row_with_payload_test.rs │ │ │ │ │ └── script.rs │ │ │ │ ├── share_test/ │ │ │ │ │ ├── export_test.rs │ │ │ │ │ └── mod.rs │ │ │ │ └── sort_test/ │ │ │ │ ├── mod.rs │ │ │ │ ├── multi_sort_test.rs │ │ │ │ ├── script.rs │ │ │ │ └── single_sort_test.rs │ │ │ └── main.rs │ │ ├── flowy-date/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ └── src/ │ │ │ ├── entities.rs │ │ │ ├── event_handler.rs │ │ │ ├── event_map.rs │ │ │ └── lib.rs │ │ ├── flowy-document/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ ├── src/ │ │ │ │ ├── deps.rs │ │ │ │ ├── document.rs │ │ │ │ ├── document_data.rs │ │ │ │ ├── entities.rs │ │ │ │ ├── event_handler.rs │ │ │ │ ├── event_map.rs │ │ │ │ ├── lib.rs │ │ │ │ ├── manager.rs │ │ │ │ ├── notification.rs │ │ │ │ ├── parse.rs │ │ │ │ ├── parser/ │ │ │ │ │ ├── constant.rs │ │ │ │ │ ├── document_data_parser.rs │ │ │ │ │ ├── external/ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── parser.rs │ │ │ │ │ │ └── utils.rs │ │ │ │ │ ├── json/ │ │ │ │ │ │ ├── block.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ └── parser.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── parser_entities.rs │ │ │ │ │ └── utils.rs │ │ │ │ └── reminder.rs │ │ │ └── tests/ │ │ │ ├── assets/ │ │ │ │ ├── html/ │ │ │ │ │ ├── bulleted_list.html │ │ │ │ │ ├── callout.html │ │ │ │ │ ├── code.html │ │ │ │ │ ├── divider.html │ │ │ │ │ ├── google_docs.html │ │ │ │ │ ├── heading.html │ │ │ │ │ ├── image.html │ │ │ │ │ ├── math_equation.html │ │ │ │ │ ├── notion.html │ │ │ │ │ ├── numbered_list.html │ │ │ │ │ ├── paragraph.html │ │ │ │ │ ├── quote.html │ │ │ │ │ ├── simple.html │ │ │ │ │ ├── todo_list.html │ │ │ │ │ └── toggle_list.html │ │ │ │ ├── json/ │ │ │ │ │ ├── bulleted_list.json │ │ │ │ │ ├── callout.json │ │ │ │ │ ├── code.json │ │ │ │ │ ├── divider.json │ │ │ │ │ ├── google_docs.json │ │ │ │ │ ├── heading.json │ │ │ │ │ ├── image.json │ │ │ │ │ ├── initial_document.json │ │ │ │ │ ├── math_equation.json │ │ │ │ │ ├── notion.json │ │ │ │ │ ├── numbered_list.json │ │ │ │ │ ├── paragraph.json │ │ │ │ │ ├── plain_text.json │ │ │ │ │ ├── quote.json │ │ │ │ │ ├── range_1.json │ │ │ │ │ ├── range_2.json │ │ │ │ │ ├── simple.json │ │ │ │ │ ├── todo_list.json │ │ │ │ │ └── toggle_list.json │ │ │ │ └── text/ │ │ │ │ ├── bulleted_list.txt │ │ │ │ ├── callout.txt │ │ │ │ ├── code.txt │ │ │ │ ├── divider.txt │ │ │ │ ├── heading.txt │ │ │ │ ├── image.txt │ │ │ │ ├── math_equation.txt │ │ │ │ ├── numbered_list.txt │ │ │ │ ├── paragraph.txt │ │ │ │ ├── plain_text.txt │ │ │ │ ├── quote.txt │ │ │ │ ├── todo_list.txt │ │ │ │ └── toggle_list.txt │ │ │ ├── document/ │ │ │ │ ├── document_insert_test.rs │ │ │ │ ├── document_redo_undo_test.rs │ │ │ │ ├── document_test.rs │ │ │ │ ├── event_handler_test.rs │ │ │ │ ├── mod.rs │ │ │ │ └── util.rs │ │ │ ├── file_storage.rs │ │ │ ├── main.rs │ │ │ └── parser/ │ │ │ ├── document_data_parser_test.rs │ │ │ ├── html/ │ │ │ │ ├── mod.rs │ │ │ │ └── parser_test.rs │ │ │ ├── json/ │ │ │ │ ├── block_test.rs │ │ │ │ ├── mod.rs │ │ │ │ └── parser_test.rs │ │ │ ├── mod.rs │ │ │ └── parse_to_html_text/ │ │ │ ├── mod.rs │ │ │ ├── test.rs │ │ │ └── utils.rs │ │ ├── flowy-document-pub/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── cloud.rs │ │ │ └── lib.rs │ │ ├── flowy-error/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ └── src/ │ │ │ ├── code.rs │ │ │ ├── errors.rs │ │ │ ├── impl_from/ │ │ │ │ ├── cloud.rs │ │ │ │ ├── collab.rs │ │ │ │ ├── collab_persistence.rs │ │ │ │ ├── database.rs │ │ │ │ ├── dispatch.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── reqwest.rs │ │ │ │ ├── serde.rs │ │ │ │ ├── tantivy.rs │ │ │ │ └── url.rs │ │ │ └── lib.rs │ │ ├── flowy-folder/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ └── src/ │ │ │ ├── entities/ │ │ │ │ ├── icon.rs │ │ │ │ ├── import.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── parser/ │ │ │ │ │ ├── empty_str.rs │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── trash/ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ └── trash_id.rs │ │ │ │ │ ├── view/ │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ ├── view_id.rs │ │ │ │ │ │ ├── view_name.rs │ │ │ │ │ │ └── view_thumbnail.rs │ │ │ │ │ └── workspace/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── workspace_desc.rs │ │ │ │ │ ├── workspace_id.rs │ │ │ │ │ └── workspace_name.rs │ │ │ │ ├── publish.rs │ │ │ │ ├── trash.rs │ │ │ │ ├── view.rs │ │ │ │ └── workspace.rs │ │ │ ├── event_handler.rs │ │ │ ├── event_map.rs │ │ │ ├── lib.rs │ │ │ ├── manager.rs │ │ │ ├── manager_init.rs │ │ │ ├── manager_observer.rs │ │ │ ├── notification.rs │ │ │ ├── publish_util.rs │ │ │ ├── share/ │ │ │ │ ├── import.rs │ │ │ │ └── mod.rs │ │ │ ├── user_default.rs │ │ │ ├── util.rs │ │ │ └── view_operation.rs │ │ ├── flowy-folder-pub/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── cloud.rs │ │ │ ├── entities.rs │ │ │ ├── lib.rs │ │ │ ├── query.rs │ │ │ └── sql/ │ │ │ ├── mod.rs │ │ │ ├── workspace_shared_user_sql.rs │ │ │ └── workspace_shared_view_sql.rs │ │ ├── flowy-notification/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ └── src/ │ │ │ ├── builder.rs │ │ │ ├── debounce.rs │ │ │ ├── entities/ │ │ │ │ ├── mod.rs │ │ │ │ └── subject.rs │ │ │ └── lib.rs │ │ ├── flowy-search/ │ │ │ ├── Cargo.toml │ │ │ ├── Flowy.toml │ │ │ ├── build.rs │ │ │ ├── src/ │ │ │ │ ├── document/ │ │ │ │ │ ├── cloud_search_handler.rs │ │ │ │ │ ├── local_search_handler.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── entities/ │ │ │ │ │ ├── mod.rs │ │ │ │ │ ├── notification.rs │ │ │ │ │ ├── query.rs │ │ │ │ │ ├── result.rs │ │ │ │ │ └── search_filter.rs │ │ │ │ ├── event_handler.rs │ │ │ │ ├── event_map.rs │ │ │ │ ├── lib.rs │ │ │ │ └── services/ │ │ │ │ ├── manager.rs │ │ │ │ └── mod.rs │ │ │ └── tests/ │ │ │ ├── main.rs │ │ │ └── tantivy_test.rs │ │ ├── flowy-search-pub/ │ │ │ ├── Cargo.toml │ │ │ └── src/ │ │ │ ├── cloud.rs │ │ │
Showing preview only (1,244K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (13572 symbols across 1938 files)
FILE: frontend/appflowy_flutter/integration_test/desktop/board/board_add_row_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/board/board_field_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/board/board_group_test.dart
function main (line 15) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/board/board_hide_groups_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/board/board_row_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/board/board_test_runner.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/chat/chat_page_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/cloud_runner.dart
function main (line 15) | Future<void> main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/data_migration/anon_user_data_migration_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/data_migration/data_migration_test_runner.dart
function main (line 1) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/database/database_image_test.dart
function main (line 24) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/database/database_test_runner.dart
function main (line 5) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_ai_writer_test.dart
function main (line 19) | void main()
class _CompletionHistoryValidator (line 183) | class _CompletionHistoryValidator extends StreamCompletionValidator {
method validate (line 201) | bool validate(
method _assertMessage (line 228) | void _assertMessage(String actual, String expected)
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_copy_link_to_block_test.dart
function main (line 18) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_option_actions_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_publish_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_test_runner.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/set_env.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_icon_test.dart
function main (line 17) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_move_page_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_rename_untitled_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_search_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/appflowy_cloud_auth_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/document_sync_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/uncategorized_test_runner.dart
function main (line 4) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/user_setting_sync_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/change_name_and_icon_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/collaborative_workspace_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/share_menu_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/tabs_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/workspace_icon_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/workspace_settings_test.dart
function main (line 23) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/workspace_test_runner.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/command_palette/command_palette_test.dart
function main (line 17) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/command_palette/command_palette_test_runner.dart
function startTesting (line 7) | void startTesting()
FILE: frontend/appflowy_flutter/integration_test/desktop/command_palette/folder_search_test.dart
function main (line 19) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/command_palette/recent_history_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_calendar_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_cell_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_field_settings_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_field_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_filter_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_icon_test.dart
function main (line 22) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_media_test.dart
function main (line 25) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_reminder_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_row_cover_test.dart
function main (line 23) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_row_page_test.dart
function main (line 24) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_setting_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_share_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_sort_test.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_test_runner_1.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_test_runner_2.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/database/database_view_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_alignment_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_app_lifecycle_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_block_option_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_callout_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_codeblock_paste_test.dart
function main (line 13) | void main()
function insertCodeBlockInDocument (line 53) | Future<void> insertCodeBlockInDocument(WidgetTester tester)
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_copy_and_paste_test.dart
function main (line 21) | void main()
function pasteContent (line 527) | Future<void> pasteContent(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_create_and_delete_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_customer_test.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_deletion_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_find_menu_test.dart
function main (line 16) | void main()
function generateRandomString (line 19) | String generateRandomString(int len)
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_inline_page_reference_test.dart
function main (line 12) | void main()
function createDocumentToReference (line 85) | Future<String> createDocumentToReference(WidgetTester tester)
function triggerReferenceDocumentBySlashMenu (line 101) | Future<void> triggerReferenceDocumentBySlashMenu(WidgetTester tester)
function enterDocumentText (line 120) | Future<void> enterDocumentText(WidgetTester tester)
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_inline_sub_page_test.dart
function main (line 33) | void main()
function insertInlineSubPageFromPlusMenu (line 354) | Future<void> insertInlineSubPageFromPlusMenu()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_link_preview_test.dart
function main (line 27) | void main()
function preparePage (line 33) | Future<void> preparePage(WidgetTester tester, {String? pageName})
function pasteLink (line 40) | Future<void> pasteLink(WidgetTester tester, String link)
function pasteAs (line 53) | Future<void> pasteAs(
function checkUrl (line 65) | void checkUrl(Node node, String link)
function checkMention (line 75) | void checkMention(Node node, String link)
function checkBookmark (line 86) | void checkBookmark(Node node, String link)
function checkEmbed (line 91) | void checkEmbed(Node node, String link)
function pasteAndTurnInto (line 98) | Future<void> pasteAndTurnInto(
function pasteAsMention (line 176) | Future<void> pasteAsMention(WidgetTester tester, String link)
function getMentionLink (line 179) | String getMentionLink(Node node)
function hoverMentionAndClick (line 186) | Future<void> hoverMentionAndClick(
function pasteAsBookmark (line 300) | Future<void> pasteAsBookmark(WidgetTester tester, String link)
function hoverAndClick (line 303) | Future<void> hoverAndClick(
function pasteAsEmbed (line 396) | Future<void> pasteAsEmbed(WidgetTester tester, String link)
function hoverAndConvert (line 399) | Future<void> hoverAndConvert(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_more_actions_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_option_action_test.dart
function main (line 11) | void main()
function turnIntoBlock (line 16) | Future<void> turnIntoBlock(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_selection_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_shortcuts_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_sub_page_test.dart
function main (line 43) | void main()
function insertSubPageFromSlashMenu (line 496) | Future<void> insertSubPageFromSlashMenu([bool withTextNode = false])
function renamePageWithSecondary (line 518) | Future<void> renamePageWithSecondary(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_1.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_2.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_3.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_4.dart
function main (line 18) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_text_direction_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_title_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_toolbar_test.dart
function main (line 22) | void main()
function selectText (line 25) | Future<void> selectText(WidgetTester tester, String text)
function prepareForToolbar (line 35) | Future<void> prepareForToolbar(WidgetTester tester, String text)
function testChangeHeading (line 77) | Future<void> testChangeHeading(
function testChangeToggle (line 131) | Future<void> testChangeToggle(
function getLinkFromNode (line 229) | String? getLinkFromNode(Node node)
function isPageLink (line 237) | bool isPageLink(Node node)
function getNodeText (line 245) | String getNodeText(Node node)
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_cover_image_test.dart
function main (line 23) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_database_test.dart
function main (line 18) | void main()
function _loadMoreRows (line 264) | Future<void> _loadMoreRows(
function insertLinkedDatabase (line 285) | Future<void> insertLinkedDatabase(
function createInlineDatabase (line 319) | Future<void> createInlineDatabase(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_date_reminder_test.dart
function main (line 22) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_file_test.dart
function main (line 21) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_image_block_test.dart
function main (line 24) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_inline_math_equation_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_inline_page_test.dart
function main (line 10) | void main()
function insertInlinePage (line 115) | Future<String> insertInlinePage(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_link_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_multi_image_block_test.dart
function main (line 29) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_outline_block_test.dart
function main (line 14) | void main()
function insertOutlineInDocument (line 174) | Future<void> insertOutlineInDocument(WidgetTester tester)
function hoverAndClickDepthOptionAction (line 184) | Future<void> hoverAndClickDepthOptionAction(
function insertHeadingComponent (line 195) | Future<void> insertHeadingComponent(WidgetTester tester)
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_simple_table_test.dart
function main (line 16) | void main()
function insertTableInDocument (line 731) | Future<void> insertTableInDocument()
function clickMoreActionItemInTableMenu (line 740) | Future<void> clickMoreActionItemInTableMenu({
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_toggle_heading_block_test.dart
function main (line 16) | void main()
function _insertToggleHeadingBlockInDocument (line 107) | Future<void> _insertToggleHeadingBlockInDocument(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/document_with_toggle_list_test.dart
function main (line 14) | void main()
function findToggleListIcon (line 19) | Finder findToggleListIcon({
function expectToggleListOpened (line 28) | void expectToggleListOpened()
function expectToggleListClosed (line 33) | void expectToggleListClosed()
function prepareToggleHeadingBlock (line 220) | Future<void> prepareToggleHeadingBlock(
FILE: frontend/appflowy_flutter/integration_test/desktop/document/edit_document_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/first_test/first_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_calculations_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_edit_row_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_filter_and_sort_test.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_reopen_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_reorder_row_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_row_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_test_extensions.dart
function getGridRows (line 6) | List<RowId> getGridRows()
FILE: frontend/appflowy_flutter/integration_test/desktop/grid/grid_test_runner_1.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/reminder/document_reminder_test.dart
function main (line 22) | void main()
function _insertReminderTomorrow (line 126) | Future<DateTime> _insertReminderTomorrow(WidgetTester tester)
function _dateWithTime (line 158) | DateTime _dateWithTime(UserTimeFormatPB format, DateTime date, String time)
function _padZeroLeft (line 168) | String _padZeroLeft(int a)
FILE: frontend/appflowy_flutter/integration_test/desktop/settings/notifications_settings_test.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/settings/settings_billing_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/settings/settings_runner.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/settings/shortcuts_settings_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/settings/sign_in_page_settings_test.dart
function main (line 12) | void main()
function findServerType (line 15) | Finder findServerType(AuthenticatorType type)
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/rename_current_item_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_expand_test.dart
function main (line 15) | void main()
function isExpanded (line 19) | bool isExpanded({required FolderSpaceType type})
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_favorites_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_icon_test.dart
function main (line 17) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_recent_icon_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_test.dart
function main (line 15) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_test_runner.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_view_item_test.dart
function main (line 15) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/board_test.dart
function main (line 31) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/code_block_language_selector_test.dart
function main (line 15) | void main()
function onKey (line 88) | Future<void> onKey(WidgetTester tester, LogicalKeyboardKey key)
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/emoji_shortcut_test.dart
function main (line 12) | void main()
function prepare (line 15) | Future<void> prepare(WidgetTester tester)
function createNewDocumentAndShowEmojiList (line 65) | Future<void> createNewDocumentAndShowEmojiList(
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/empty_document_test.dart
function main (line 27) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/hotkeys_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/import_files_test.dart
function main (line 13) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/language_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/share_markdown_test.dart
function main (line 15) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/switch_folder_test.dart
function main (line 6) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/tabs_test.dart
function main (line 25) | void main()
function isTabPinned (line 329) | bool isTabPinned(String tabName)
function isTabAtIndex (line 341) | bool isTabAtIndex(String tabName, int index)
function openTabMenu (line 359) | Future<void> openTabMenu(String tabName)
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/uncategorized_test_runner_1.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/desktop/uncategorized/zoom_in_out_test.dart
function main (line 12) | void main()
function resetAppFlowyScaleFactor (line 16) | Future<void> resetAppFlowyScaleFactor(
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_1.dart
function main (line 6) | Future<void> main()
function runIntegration1OnDesktop (line 10) | Future<void> runIntegration1OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_2.dart
function main (line 6) | Future<void> main()
function runIntegration2OnDesktop (line 10) | Future<void> runIntegration2OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_3.dart
function main (line 7) | Future<void> main()
function runIntegration3OnDesktop (line 11) | Future<void> runIntegration3OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_4.dart
function main (line 6) | Future<void> main()
function runIntegration4OnDesktop (line 10) | Future<void> runIntegration4OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_5.dart
function main (line 6) | Future<void> main()
function runIntegration5OnDesktop (line 10) | Future<void> runIntegration5OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_6.dart
function main (line 9) | Future<void> main()
function runIntegration6OnDesktop (line 13) | Future<void> runIntegration6OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_7.dart
function main (line 6) | Future<void> main()
function runIntegration7OnDesktop (line 10) | Future<void> runIntegration7OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_8.dart
function main (line 6) | Future<void> main()
function runIntegration8OnDesktop (line 10) | Future<void> runIntegration8OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/desktop_runner_9.dart
function main (line 10) | Future<void> main()
function runIntegration9OnDesktop (line 14) | Future<void> runIntegration9OnDesktop()
FILE: frontend/appflowy_flutter/integration_test/mobile/cloud/cloud_runner.dart
function main (line 6) | Future<void> main()
FILE: frontend/appflowy_flutter/integration_test/mobile/cloud/document/publish_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/cloud/document/share_link_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/cloud/space/space_test.dart
function main (line 24) | void main()
function openSpaceMenu (line 28) | Future<void> openSpaceMenu(WidgetTester tester)
function openSpaceMenuMoreOptions (line 34) | Future<void> openSpaceMenuMoreOptions(
FILE: frontend/appflowy_flutter/integration_test/mobile/cloud/workspace/workspace_operations_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/at_menu_test.dart
function main (line 9) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/document_test_runner.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/icon_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/page_style_test.dart
function main (line 19) | void main()
function getCurrentEditorFontSize (line 30) | double getCurrentEditorFontSize()
function getCurrentEditorLineHeight (line 43) | double getCurrentEditorLineHeight()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/plus_menu_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/simple_table_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/slash_menu_test.dart
function main (line 11) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/title_test.dart
function main (line 10) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/document/toolbar_test.dart
function main (line 14) | void main()
function createNeaPage (line 17) | Future<void> createNeaPage(WidgetTester tester)
function commonDeltaJson (line 78) | Map commonDeltaJson(String insert)
FILE: frontend/appflowy_flutter/integration_test/mobile/home_page/create_new_page_test.dart
function main (line 8) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/search/search_test.dart
function main (line 16) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/settings/default_text_direction_test.dart
function main (line 14) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/settings/scale_factor_test.dart
function main (line 12) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile/sign_in/anonymous_sign_in_test.dart
function main (line 7) | void main()
FILE: frontend/appflowy_flutter/integration_test/mobile_runner_1.dart
function main (line 10) | Future<void> main()
function runIntegration1OnMobile (line 16) | Future<void> runIntegration1OnMobile()
FILE: frontend/appflowy_flutter/integration_test/runner.dart
function main (line 21) | Future<void> main()
FILE: frontend/appflowy_flutter/integration_test/shared/ai_test_op.dart
function selectAIWriter (line 15) | Future<void> selectAIWriter(AiWriterCommand command)
function selectModel (line 21) | Future<void> selectModel(String modelName)
function enterTextInPromptTextField (line 27) | Future<void> enterTextInPromptTextField(String text)
function getCurrentChatBloc (line 47) | ChatBloc getCurrentChatBloc()
function loadDefaultMessages (line 51) | Future<void> loadDefaultMessages(List<Message> messages)
function sendUserMessage (line 57) | Future<void> sendUserMessage(Message message)
function receiveAIMessage (line 64) | Future<void> receiveAIMessage(Message message)
FILE: frontend/appflowy_flutter/integration_test/shared/auth_operation.dart
function tapGoogleLoginInButton (line 13) | Future<void> tapGoogleLoginInButton({bool pumpAndSettle = true})
function logout (line 21) | Future<void> logout()
function tapSignInAsGuest (line 35) | Future<void> tapSignInAsGuest()
function expectToSeeGoogleLoginButton (line 39) | void expectToSeeGoogleLoginButton()
function assertSwitchValue (line 43) | void assertSwitchValue(Finder finder, bool value)
function assertToggleValue (line 49) | void assertToggleValue(Finder finder, bool value)
function assertAppFlowyCloudEnableSyncSwitchValue (line 55) | void assertAppFlowyCloudEnableSyncSwitchValue(bool value)
function toggleEnableSync (line 65) | Future<void> toggleEnableSync(Type syncButton)
FILE: frontend/appflowy_flutter/integration_test/shared/base.dart
class FlowyTestContext (line 26) | class FlowyTestContext {
function initializeAppFlowy (line 33) | Future<FlowyTestContext> initializeAppFlowy({
function _buildRustEnvs (line 71) | Map<String, String> _buildRustEnvs(AuthenticatorType? cloudType)
function _initializeCloudServices (line 89) | Future<void> _initializeCloudServices({
function _setupAppFlowyCloud (line 119) | Future<void> _setupAppFlowyCloud({
function mockHotKeyManagerHandlers (line 141) | void mockHotKeyManagerHandlers()
function waitUntilSignInPageShow (line 152) | Future<void> waitUntilSignInPageShow()
function waitForSeconds (line 164) | Future<void> waitForSeconds(int seconds)
function pumpUntilFound (line 168) | Future<void> pumpUntilFound(
function pumpUntilNotFound (line 186) | Future<void> pumpUntilNotFound(
function tapButton (line 204) | Future<void> tapButton(
function tapDown (line 222) | Future<void> tapDown(
function tapButtonWithName (line 249) | Future<void> tapButtonWithName(
function doubleTapAt (line 267) | Future<void> doubleTapAt(
function wait (line 279) | Future<void> wait(int milliseconds)
function slideToValue (line 283) | Future<void> slideToValue(
function findTextInFlowyText (line 304) | Finder findTextInFlowyText(String text)
function findFlowyTooltip (line 310) | Finder findFlowyTooltip(String richMessage, {bool skipOffstage = true})
function mockApplicationDataStorage (line 321) | Future<String> mockApplicationDataStorage({
FILE: frontend/appflowy_flutter/integration_test/shared/common_operations.dart
function tapAnonymousSignInButton (line 64) | Future<void> tapAnonymousSignInButton()
function tapContinousAnotherWay (line 78) | Future<void> tapContinousAnotherWay()
function tapAddViewButton (line 87) | Future<void> tapAddViewButton({
function tapNewPageButton (line 101) | Future<void> tapNewPageButton()
function tapImportButton (line 109) | Future<void> tapImportButton()
function tapTextAndMarkdownButton (line 116) | Future<void> tapTextAndMarkdownButton()
function tapLanguageSelectorOnWelcomePage (line 121) | Future<void> tapLanguageSelectorOnWelcomePage()
function tapLanguageItem (line 134) | Future<void> tapLanguageItem({
function hoverOnWidget (line 168) | Future<void> hoverOnWidget(
function hoverOnPageName (line 186) | Future<void> hoverOnPageName(
function rightClickOnPageName (line 201) | Future<void> rightClickOnPageName(
function openPage (line 216) | Future<void> openPage(
function tapPageOptionButton (line 228) | Future<void> tapPageOptionButton()
function tapDeletePageButton (line 237) | Future<void> tapDeletePageButton()
function tapRenamePageButton (line 243) | Future<void> tapRenamePageButton()
function tapFavoritePageButton (line 249) | Future<void> tapFavoritePageButton()
function tapUnfavoritePageButton (line 255) | Future<void> tapUnfavoritePageButton()
function tapOpenInTabButton (line 261) | Future<void> tapOpenInTabButton()
function renamePage (line 267) | Future<void> renamePage(String name)
function tapTrashButton (line 273) | Future<void> tapTrashButton()
function tapOKButton (line 277) | Future<void> tapOKButton()
function expandOrCollapsePage (line 287) | Future<void> expandOrCollapsePage({
function tapRestoreButton (line 303) | Future<void> tapRestoreButton()
function tapDeletePermanentlyButton (line 313) | Future<void> tapDeletePermanentlyButton()
function tapShareButton (line 323) | Future<void> tapShareButton()
function openPublishMenu (line 331) | Future<void> openPublishMenu()
function tapMarkdownButton (line 342) | Future<void> tapMarkdownButton()
function createNewPageWithNameUnderParent (line 349) | Future<void> createNewPageWithNameUnderParent({
function createOpenRenameDocumentUnderParent (line 392) | Future<void> createOpenRenameDocumentUnderParent({
function createNewPageInSpace (line 419) | Future<void> createNewPageInSpace({
function clickAddPageButtonInSpaceHeader (line 467) | Future<void> clickAddPageButtonInSpaceHeader()
function clickSpaceHeader (line 476) | Future<void> clickSpaceHeader()
function openSpace (line 480) | Future<void> openSpace(String spaceName)
function createNewPage (line 489) | Future<void> createNewPage({
function simulateKeyEvent (line 496) | Future<void> simulateKeyEvent(
function openAppInNewTab (line 539) | Future<void> openAppInNewTab(String name, ViewLayoutPB layout)
function favoriteViewByName (line 550) | Future<void> favoriteViewByName(
function unfavoriteViewByName (line 564) | Future<void> unfavoriteViewByName(
function movePageToOtherPage (line 578) | Future<void> movePageToOtherPage({
function reorderFavorite (line 606) | Future<void> reorderFavorite({
function tapButtonWithFlowySvgData (line 624) | Future<void> tapButtonWithFlowySvgData(FlowySvgData svg)
function updatePageIconInSidebarByName (line 632) | Future<void> updatePageIconInSidebarByName({
function updatePageIconInTitleBarByName (line 657) | Future<void> updatePageIconInTitleBarByName({
function updatePageIconInTitleBarByPasteALink (line 682) | Future<void> updatePageIconInTitleBarByPasteALink({
function openNotificationHub (line 701) | Future<void> openNotificationHub({int tabIndex = 0})
function toggleCommandPalette (line 723) | Future<void> toggleCommandPalette()
function openCollaborativeWorkspaceMenu (line 733) | Future<void> openCollaborativeWorkspaceMenu()
function createCollaborativeWorkspace (line 744) | Future<void> createCollaborativeWorkspace(String name)
function launchInAnonymousMode (line 773) | Future<void> launchInAnonymousMode()
function tapSvgButton (line 789) | Future<void> tapSvgButton(FlowySvgData svg)
function openMoreViewActions (line 796) | Future<void> openMoreViewActions()
function duplicateByMoreViewActions (line 805) | Future<void> duplicateByMoreViewActions()
function deleteByMoreViewActions (line 818) | Future<void> deleteByMoreViewActions()
function tapFileUploadHint (line 830) | Future<void> tapFileUploadHint()
function createNewDocumentOnMobile (line 843) | Future<void> createNewDocumentOnMobile(String name)
function openPlusMenuAndClickButton (line 865) | Future<void> openPlusMenuAndClickButton(String buttonName)
function clickColumnMenuButton (line 894) | Future<void> clickColumnMenuButton(int index)
function clickRowMenuButton (line 906) | Future<void> clickRowMenuButton(int index)
function clickSimpleTableQuickAction (line 918) | Future<void> clickSimpleTableQuickAction(SimpleTableMoreAction action)
function clickSimpleTableBoldContentAction (line 926) | Future<void> clickSimpleTableBoldContentAction()
function cancelTableActionMenu (line 932) | Future<void> cancelTableActionMenu()
function loadIcon (line 943) | Future<EmojiIconData> loadIcon()
function prepareImageIcon (line 957) | Future<EmojiIconData> prepareImageIcon()
function prepareSvgIcon (line 966) | Future<EmojiIconData> prepareSvgIcon()
function createPageAndShowSlashMenu (line 976) | Future<void> createPageAndShowSlashMenu(String title)
function createPageAndShowAtMenu (line 983) | Future<void> createPageAndShowAtMenu(String title)
function createPageAndShowPlusMenu (line 990) | Future<void> createPageAndShowPlusMenu(String title)
function findSettingsScrollable (line 998) | Finder findSettingsScrollable()
function findSettingsMenuScrollable (line 1010) | Finder findSettingsMenuScrollable()
function byFlowySvg (line 1024) | Finder byFlowySvg(FlowySvgData svg)
class _FlowySvgFinder (line 1027) | class _FlowySvgFinder extends MatchFinder {
method matches (line 1036) | bool matches(Element candidate)
FILE: frontend/appflowy_flutter/integration_test/shared/constants.dart
class Constants (line 1) | class Constants {
FILE: frontend/appflowy_flutter/integration_test/shared/data.dart
type TestWorkspace (line 10) | enum TestWorkspace {
class TestWorkspaceService (line 45) | class TestWorkspaceService {
method setUpAll (line 51) | Future<void> setUpAll()
method setUp (line 58) | Future<void> setUp()
FILE: frontend/appflowy_flutter/integration_test/shared/database_test_op.dart
function openTestDatabase (line 108) | Future<void> openTestDatabase(String fileName)
function hoverOnFirstRowOfGrid (line 138) | Future<void> hoverOnFirstRowOfGrid([Future<void> Function()? onHover])
function editCell (line 146) | Future<void> editCell({
function cellFinder (line 160) | Finder cellFinder(int rowIndex, FieldType fieldType, {int cellIndex = 0})
function tapCheckboxCellInGrid (line 172) | Future<void> tapCheckboxCellInGrid({
function assertCheckboxCell (line 186) | Future<void> assertCheckboxCell({
function tapCellInGrid (line 209) | Future<void> tapCellInGrid({
function assertCellContent (line 219) | void assertCellContent({
function assertSingleSelectOption (line 234) | Future<void> assertSingleSelectOption({
function assertMultiSelectOption (line 252) | void assertMultiSelectOption({
function assertChecklistCellInGrid (line 273) | void assertChecklistCellInGrid({
function selectDay (line 297) | Future<void> selectDay({
function toggleIncludeTime (line 321) | Future<void> toggleIncludeTime()
function selectReminderOption (line 331) | Future<void> selectReminderOption(ReminderOption option)
function selectLastDateInPicker (line 342) | Future<bool> selectLastDateInPicker()
function tapChangeDateTimeFormatButton (line 351) | Future<void> tapChangeDateTimeFormatButton()
function changeDateFormat (line 355) | Future<void> changeDateFormat()
function changeTimeFormat (line 363) | Future<void> changeTimeFormat()
function clearDate (line 371) | Future<void> clearDate()
function tapSelectOptionCellInGrid (line 381) | Future<void> tapSelectOptionCellInGrid({
function createOption (line 401) | Future<void> createOption({required String name})
function selectOption (line 415) | Future<void> selectOption({required String name})
function findSelectOptionWithNameInGrid (line 426) | void findSelectOptionWithNameInGrid({
function assertNumberOfSelectedOptionsInGrid (line 441) | void assertNumberOfSelectedOptionsInGrid({
function tapChecklistCellInGrid (line 455) | Future<void> tapChecklistCellInGrid({required int rowIndex})
function assertChecklistEditorVisible (line 463) | void assertChecklistEditorVisible({required bool visible})
function createNewChecklistTask (line 471) | Future<void> createNewChecklistTask({
function assertChecklistTaskInEditor (line 497) | void assertChecklistTaskInEditor({
function renameChecklistTask (line 509) | Future<void> renameChecklistTask({
function checkChecklistTask (line 528) | Future<void> checkChecklistTask({required int index})
function deleteChecklistTask (line 539) | Future<void> deleteChecklistTask({required int index})
function assertPhantomChecklistItemAtIndex (line 553) | void assertPhantomChecklistItemAtIndex({required int index})
function assertPhantomChecklistItemContent (line 570) | void assertPhantomChecklistItemContent(String content)
function openFirstRowDetailPage (line 576) | Future<void> openFirstRowDetailPage()
function assertRowDetailPageOpened (line 584) | void assertRowDetailPageOpened()
function dismissRowDetailPage (line 589) | Future<void> dismissRowDetailPage()
function hoverRowBanner (line 601) | Future<void> hoverRowBanner()
function tapAddCoverButton (line 616) | Future<void> tapAddCoverButton()
function openEmojiPicker (line 622) | Future<void> openEmojiPicker()
function tapDateCellInRowDetailPage (line 625) | Future<void> tapDateCellInRowDetailPage()
function tapGridFieldWithNameInRowDetailPage (line 630) | Future<void> tapGridFieldWithNameInRowDetailPage(String name)
function hoverOnFieldInRowDetail (line 642) | Future<TestGesture> hoverOnFieldInRowDetail({required int index})
function reorderFieldInRowDetail (line 650) | Future<void> reorderFieldInRowDetail({required double offset})
function assertToggleShowHiddenFieldsVisibility (line 660) | void assertToggleShowHiddenFieldsVisibility(bool shown)
function toggleShowHiddenFields (line 669) | Future<void> toggleShowHiddenFields()
function tapDeletePropertyInFieldEditor (line 674) | Future<void> tapDeletePropertyInFieldEditor()
function scrollRowDetailByOffset (line 682) | Future<void> scrollRowDetailByOffset(Offset offset)
function scrollToRight (line 687) | Future<void> scrollToRight(Finder find)
function tapNewPropertyButton (line 693) | Future<void> tapNewPropertyButton()
function tapGridFieldWithName (line 698) | Future<void> tapGridFieldWithName(String name)
function changeFieldTypeOfFieldWithName (line 706) | Future<void> changeFieldTypeOfFieldWithName(
function changeFieldIcon (line 721) | Future<void> changeFieldIcon(String icon)
function assertFieldSvg (line 741) | void assertFieldSvg(String name, FieldType fieldType)
function assertFieldCustomSvg (line 754) | void assertFieldCustomSvg(String name, String svg)
function changeCalculateAtIndex (line 768) | Future<void> changeCalculateAtIndex(int index, CalculationType type)
function tapEditFieldButton (line 782) | Future<void> tapEditFieldButton()
function tapDeletePropertyButton (line 788) | Future<void> tapDeletePropertyButton()
function tapDialogOkButton (line 796) | Future<void> tapDialogOkButton()
function tapDuplicatePropertyButton (line 804) | Future<void> tapDuplicatePropertyButton()
function tapInsertFieldButton (line 811) | Future<void> tapInsertFieldButton({
function tapHidePropertyButton (line 826) | Future<void> tapHidePropertyButton()
function tapHidePropertyButtonInFieldEditor (line 833) | Future<void> tapHidePropertyButtonInFieldEditor()
function tapClearCellsButton (line 840) | Future<void> tapClearCellsButton()
function tapRowDetailPageRowActionButton (line 848) | Future<void> tapRowDetailPageRowActionButton()
function tapRowDetailPageCreatePropertyButton (line 851) | Future<void> tapRowDetailPageCreatePropertyButton()
function tapRowDetailPageDeleteRowButton (line 854) | Future<void> tapRowDetailPageDeleteRowButton()
function tapRowDetailPageDuplicateRowButton (line 857) | Future<void> tapRowDetailPageDuplicateRowButton()
function tapSwitchFieldTypeButton (line 860) | Future<void> tapSwitchFieldTypeButton()
function tapEscButton (line 863) | Future<void> tapEscButton()
function selectFieldType (line 866) | Future<void> selectFieldType(FieldType fieldType)
function expectEmptyTypeOptionEditor (line 878) | void expectEmptyTypeOptionEditor()
function findCellByFieldType (line 888) | void findCellByFieldType(FieldType fieldType)
function assertNumberOfRowsInGridPage (line 893) | void assertNumberOfRowsInGridPage(int num)
function assertDocumentExistInRowDetailPage (line 900) | Future<void> assertDocumentExistInRowDetailPage()
function assertFieldTypeWithFieldName (line 905) | Future<void> assertFieldTypeWithFieldName(String name, FieldType type)
function assertFirstFieldInRowDetailByType (line 916) | void assertFirstFieldInRowDetailByType(FieldType fieldType)
function findFieldWithName (line 928) | void findFieldWithName(String name)
function noFieldWithName (line 935) | void noFieldWithName(String name)
function renameField (line 942) | Future<void> renameField(String newName)
function dismissFieldEditor (line 949) | Future<void> dismissFieldEditor()
function changeFieldWidth (line 954) | Future<void> changeFieldWidth(String fieldName, double width)
function getFieldWidth (line 971) | double getFieldWidth(String fieldName)
function findDateEditor (line 979) | Future<void> findDateEditor(dynamic matcher)
function findMediaCellEditor (line 984) | Future<void> findMediaCellEditor(dynamic matcher)
function findSelectOptionEditor (line 989) | Future<void> findSelectOptionEditor(dynamic matcher)
function dismissCellEditor (line 994) | Future<void> dismissCellEditor()
function tapCreateRowButtonInGrid (line 999) | Future<void> tapCreateRowButtonInGrid()
function tapCreateRowButtonAfterHoveringOnGridRow (line 1003) | Future<void> tapCreateRowButtonAfterHoveringOnGridRow()
function tapRowMenuButtonInGrid (line 1007) | Future<void> tapRowMenuButtonInGrid()
function tapCreateRowAboveButtonInRowMenu (line 1012) | Future<void> tapCreateRowAboveButtonInRowMenu()
function tapDeleteOnRowMenu (line 1017) | Future<void> tapDeleteOnRowMenu()
function reorderRow (line 1021) | Future<void> reorderRow(
function createField (line 1048) | Future<void> createField(
function tapDatabaseSettingButton (line 1064) | Future<void> tapDatabaseSettingButton()
function tapDatabaseFilterButton (line 1068) | Future<void> tapDatabaseFilterButton()
function tapDatabaseSortButton (line 1072) | Future<void> tapDatabaseSortButton()
function tapCreateFilterByFieldType (line 1076) | Future<void> tapCreateFilterByFieldType(FieldType type, String title)
function tapFilterButtonInGrid (line 1086) | Future<void> tapFilterButtonInGrid(String name)
function tapCreateSortByFieldType (line 1093) | Future<void> tapCreateSortByFieldType(FieldType type, String title)
function tapCreateSortByFieldTypeInSortMenu (line 1104) | Future<void> tapCreateSortByFieldTypeInSortMenu(
function tapSortMenuInSettingBar (line 1121) | Future<void> tapSortMenuInSettingBar()
function tapEditSortConditionButtonByFieldName (line 1127) | Future<void> tapEditSortConditionButtonByFieldName(String name)
function reorderSort (line 1139) | Future<void> reorderSort(
function tapSortByDescending (line 1172) | Future<void> tapSortByDescending()
function tapDeleteAllSortsButton (line 1185) | Future<void> tapDeleteAllSortsButton()
function scrollOptionFilterListByOffset (line 1189) | Future<void> scrollOptionFilterListByOffset(Offset offset)
function enterTextInTextFilter (line 1194) | Future<void> enterTextInTextFilter(String text)
function tapDisclosureButtonInFinder (line 1205) | Future<void> tapDisclosureButtonInFinder(Finder finder)
function tapDeleteFilterButtonInGrid (line 1215) | Future<void> tapDeleteFilterButtonInGrid()
function tapCheckboxFilterButtonInGrid (line 1219) | Future<void> tapCheckboxFilterButtonInGrid()
function tapChecklistFilterButtonInGrid (line 1223) | Future<void> tapChecklistFilterButtonInGrid()
function tapOptionFilterWithName (line 1228) | Future<void> tapOptionFilterWithName(String name)
function tapUnCheckedButtonOnCheckboxFilter (line 1242) | Future<void> tapUnCheckedButtonOnCheckboxFilter()
function tapCompletedButtonOnChecklistFilter (line 1251) | Future<void> tapCompletedButtonOnChecklistFilter()
function changeTextFilterCondition (line 1260) | Future<void> changeTextFilterCondition(
function changeSelectFilterCondition (line 1274) | Future<void> changeSelectFilterCondition(
function changeDateFilterCondition (line 1286) | Future<void> changeDateFilterCondition(
function tapViewPropertiesButton (line 1299) | Future<void> tapViewPropertiesButton()
function tapDatabaseLayoutButton (line 1316) | Future<void> tapDatabaseLayoutButton()
function tapCalendarLayoutSettingButton (line 1332) | Future<void> tapCalendarLayoutSettingButton()
function tapFirstDayOfWeek (line 1348) | Future<void> tapFirstDayOfWeek()
function tapFirstDayOfWeekStartFromMonday (line 1351) | Future<void> tapFirstDayOfWeekStartFromMonday()
function assertFirstDayOfWeekStartFromMonday (line 1363) | void assertFirstDayOfWeekStartFromMonday()
function assertFirstDayOfWeekStartFromSunday (line 1370) | void assertFirstDayOfWeekStartFromSunday()
function scrollToToday (line 1377) | Future<void> scrollToToday()
function hoverOnTodayCalendarCell (line 1393) | Future<void> hoverOnTodayCalendarCell({
function tapAddCalendarEventButton (line 1403) | Future<void> tapAddCalendarEventButton()
function assertNumberOfEventsInCalendar (line 1415) | void assertNumberOfEventsInCalendar(int number, {String? title})
function assertNumberOfEventsOnSpecificDay (line 1423) | void assertNumberOfEventsOnSpecificDay(
function doubleClickCalendarCell (line 1441) | Future<void> doubleClickCalendarCell(DateTime date)
function openCalendarEvent (line 1449) | Future<void> openCalendarEvent({required int index, DateTime? date})
function assertEventEditorOpen (line 1463) | void assertEventEditorOpen()
function dismissEventEditor (line 1466) | Future<void> dismissEventEditor()
function editEventTitle (line 1469) | Future<void> editEventTitle(String title)
function openEventToRowDetailPage (line 1480) | Future<void> openEventToRowDetailPage()
function deleteEventFromEventEditor (line 1491) | Future<void> deleteEventFromEventEditor()
function dragDropRescheduleCalendarEvent (line 1503) | Future<void> dragDropRescheduleCalendarEvent()
function openUnscheduledEventsPopup (line 1509) | Future<void> openUnscheduledEventsPopup()
function findUnscheduledPopup (line 1514) | void findUnscheduledPopup(Matcher matcher, int numUnscheduledEvents)
function clickUnscheduledEvent (line 1524) | Future<void> clickUnscheduledEvent()
function tapCreateLinkedDatabaseViewButton (line 1529) | Future<void> tapCreateLinkedDatabaseViewButton(
function assertNumberOfGroups (line 1542) | void assertNumberOfGroups(int number)
function scrollBoardToEnd (line 1547) | Future<void> scrollBoardToEnd()
function tapNewGroupButton (line 1563) | Future<void> tapNewGroupButton()
function assertNewGroupTextField (line 1574) | void assertNewGroupTextField(bool isVisible)
function enterNewGroupName (line 1585) | Future<void> enterNewGroupName(String name, {required bool submit})
function clearNewGroupTextField (line 1598) | Future<void> clearNewGroupTextField()
function tapTabBarLinkedViewByViewName (line 1619) | Future<void> tapTabBarLinkedViewByViewName(String name)
function findTabBarLinkViewByViewLayout (line 1624) | Finder findTabBarLinkViewByViewLayout(ViewLayoutPB layout)
function findTabBarLinkViewByViewName (line 1630) | Finder findTabBarLinkViewByViewName(String name)
function renameLinkedView (line 1636) | Future<void> renameLinkedView(Finder linkedView, String name)
function deleteDatebaseView (line 1659) | Future<void> deleteDatebaseView(Finder linkedView)
function assertCurrentDatabaseTagIs (line 1679) | void assertCurrentDatabaseTagIs(DatabaseLayoutPB layout)
function selectDatabaseLayoutType (line 1688) | Future<void> selectDatabaseLayoutType(DatabaseLayoutPB layout)
function assertCurrentDatabaseLayoutType (line 1698) | Future<void> assertCurrentDatabaseLayoutType(DatabaseLayoutPB layout)
function tapDatabaseRawDataButton (line 1702) | Future<void> tapDatabaseRawDataButton()
function changeNumberFieldFormat (line 1707) | Future<void> changeNumberFieldFormat()
function tapAddSelectOptionButton (line 1722) | Future<void> tapAddSelectOptionButton()
function tapViewTogglePropertyVisibilityButtonByName (line 1726) | Future<void> tapViewTogglePropertyVisibilityButtonByName(
function finderForDatabaseLayoutType (line 1738) | Finder finderForDatabaseLayoutType(DatabaseLayoutPB layout)
function finderForFieldType (line 1745) | Finder finderForFieldType(FieldType fieldType)
FILE: frontend/appflowy_flutter/integration_test/shared/dir.dart
function deleteDirectoriesWithSameBaseNameAsPrefix (line 6) | Future<void> deleteDirectoriesWithSameBaseNameAsPrefix(
function unzipFile (line 34) | Future<void> unzipFile(File zipFile, Directory targetDirectory)
FILE: frontend/appflowy_flutter/integration_test/shared/document_test_operations.dart
class EditorOperations (line 36) | class EditorOperations {
method getCurrentEditorState (line 41) | EditorState getCurrentEditorState()
method getNodeAtPath (line 44) | Node getNodeAtPath(Path path)
method tapLineOfEditorAt (line 50) | Future<void> tapLineOfEditorAt(int index)
method hoverOnCoverToolbar (line 61) | Future<void> hoverOnCoverToolbar()
method tapAddIconButton (line 71) | Future<void> tapAddIconButton()
method paste (line 78) | Future<void> paste()
method tapGettingStartedIcon (line 92) | Future<void> tapGettingStartedIcon()
method changeEmojiSkinTone (line 104) | Future<void> changeEmojiSkinTone(EmojiSkinTone skinTone)
method tapRemoveIconButton (line 113) | Future<void> tapRemoveIconButton({bool isInPicker = false})
method tapOnIconWidget (line 125) | Future<void> tapOnIconWidget()
method tapOnAddCover (line 130) | Future<void> tapOnAddCover()
method tapOnChangeCover (line 136) | Future<void> tapOnChangeCover()
method switchSolidColorBackground (line 142) | Future<void> switchSolidColorBackground()
method addNetworkImageCover (line 149) | Future<void> addNetworkImageCover(String imageUrl)
method tapOnRemoveCover (line 171) | Future<void> tapOnRemoveCover()
method hoverOnCover (line 176) | Future<void> hoverOnCover()
method dismissCoverPicker (line 185) | Future<void> dismissCoverPicker()
method showSlashMenu (line 191) | Future<void> showSlashMenu()
method showAtMenu (line 196) | Future<void> showAtMenu()
method showPlusMenu (line 201) | Future<void> showPlusMenu()
method tapSlashMenuItemWithName (line 208) | Future<void> tapSlashMenuItemWithName(
method tapAtMenuItemWithName (line 234) | Future<void> tapAtMenuItemWithName(String name)
method updateSelection (line 243) | Future<void> updateSelection(Selection? selection)
method hoverAndClickOptionAddButton (line 255) | Future<void> hoverAndClickOptionAddButton(
method hoverAndClickOptionMenuButton (line 285) | Future<void> hoverAndClickOptionMenuButton(Path path)
method openTurnIntoMenu (line 307) | Future<void> openTurnIntoMenu(Path path)
method copyLinkToBlock (line 320) | Future<void> copyLinkToBlock(Path path)
method openDepthMenu (line 329) | Future<void> openDepthMenu(Path path)
method dragBlock (line 344) | Future<void> dragBlock(
method findDocumentTitle (line 390) | Finder findDocumentTitle(String? title)
method openMoreActionMenuOnMobile (line 422) | Future<void> openMoreActionMenuOnMobile()
method clickMoreActionItemOnMobile (line 431) | Future<void> clickMoreActionItemOnMobile(String name)
FILE: frontend/appflowy_flutter/integration_test/shared/emoji.dart
function tapEmoji (line 24) | Future<void> tapEmoji(String emoji)
function tapIcon (line 32) | Future<void> tapIcon(EmojiIconData icon, {bool enableColor = true})
function pickImage (line 75) | Future<void> pickImage(EmojiIconData icon)
function pasteImageLinkAsIcon (line 112) | Future<void> pasteImageLinkAsIcon(String link)
FILE: frontend/appflowy_flutter/integration_test/shared/expectation.dart
function expectToSeeHomePageWithGetStartedPage (line 36) | Future<void> expectToSeeHomePageWithGetStartedPage()
function expectToSeeHomePage (line 51) | Future<void> expectToSeeHomePage()
function expectToSeePageName (line 58) | void expectToSeePageName(
function expectNotToSeePageName (line 74) | void expectNotToSeePageName(
function expectToSeeDocumentBanner (line 90) | void expectToSeeDocumentBanner()
function expectNotToSeeDocumentBanner (line 95) | void expectNotToSeeDocumentBanner()
function expectToExportSuccess (line 100) | void expectToExportSuccess()
function expectToSeeEmptyDocumentHeaderToolbar (line 108) | void expectToSeeEmptyDocumentHeaderToolbar()
function expectToSeeDocumentIcon (line 119) | void expectToSeeDocumentIcon(String? emoji)
function expectDocumentIconNotNull (line 131) | void expectDocumentIconNotNull()
function expectToSeeDocumentCover (line 138) | void expectToSeeDocumentCover(CoverType type)
function expectToSeeNoDocumentCover (line 145) | void expectToSeeNoDocumentCover()
function expectChangeCoverAndDeleteButton (line 150) | void expectChangeCoverAndDeleteButton()
function expectToSeeText (line 160) | void expectToSeeText(String text)
function findFavoritePageName (line 171) | Finder findFavoritePageName(
function findAllFavoritePages (line 187) | Finder findAllFavoritePages()
function findPageName (line 194) | Finder findPageName(
function expectViewHasIcon (line 232) | void expectViewHasIcon(String name, ViewLayoutPB layout, EmojiIconData d...
function expectViewTitleHasIcon (line 273) | void expectViewTitleHasIcon(
function expectSelectedReminder (line 321) | void expectSelectedReminder(ReminderOption option)
function expectNotificationItems (line 330) | void expectNotificationItems(int amount)
function expectToSeeRowDetailsPageDialog (line 336) | void expectToSeeRowDetailsPageDialog()
FILE: frontend/appflowy_flutter/integration_test/shared/ime.dart
class IMESimulator (line 10) | class IMESimulator {
method insertText (line 18) | Future<void> insertText(String text)
method insertCharacter (line 24) | Future<void> insertCharacter(String character)
method findTextInputClient (line 42) | TextInputClient findTextInputClient()
FILE: frontend/appflowy_flutter/integration_test/shared/keyboard.dart
class FlowyTestKeyboard (line 4) | class FlowyTestKeyboard {
method simulateKeyDownEvent (line 5) | Future<void> simulateKeyDownEvent(
FILE: frontend/appflowy_flutter/integration_test/shared/mock/mock_ai.dart
class StreamCompletionValidator (line 65) | abstract class StreamCompletionValidator {
method validate (line 66) | bool validate(
class MockCompletionStream (line 76) | class MockCompletionStream extends Mock implements CompletionStream {}
class MockAIRepository (line 78) | class MockAIRepository extends Mock implements AppFlowyAIService {
method streamCompletion (line 83) | Future<(String, CompletionStream)?> streamCompletion({
FILE: frontend/appflowy_flutter/integration_test/shared/mock/mock_file_picker.dart
class MockFilePicker (line 4) | class MockFilePicker implements FilePickerService {
method getDirectoryPath (line 14) | Future<String?> getDirectoryPath({String? title})
method saveFile (line 17) | Future<String?> saveFile({
method pickFiles (line 28) | Future<FilePickerResult?> pickFiles({
function mockGetDirectoryPath (line 46) | Future<void> mockGetDirectoryPath(String path)
function mockSaveFilePath (line 53) | Future<String> mockSaveFilePath(String path)
function mockPickFilePaths (line 61) | List<String> mockPickFilePaths({required List<String> paths})
FILE: frontend/appflowy_flutter/integration_test/shared/mock/mock_url_launcher.dart
class MockUrlLauncher (line 10) | class MockUrlLauncher extends Fake
method setCanLaunchExpectations (line 30) | void setCanLaunchExpectations(String url)
method setLaunchExpectations (line 32) | void setLaunchExpectations({
method setResponse (line 54) | void setResponse(bool response)
method canLaunch (line 60) | Future<bool> canLaunch(String url)
method launch (line 67) | Future<bool> launch(
method launchUrl (line 90) | Future<bool> launchUrl(String url, LaunchOptions options)
method closeWebView (line 102) | Future<void> closeWebView()
FILE: frontend/appflowy_flutter/integration_test/shared/settings.dart
function openSettings (line 20) | Future<void> openSettings()
function openSettingsPage (line 37) | Future<void> openSettingsPage(SettingsPage page)
function restoreLocation (line 55) | Future<void> restoreLocation()
function tapCustomLocationButton (line 67) | Future<void> tapCustomLocationButton()
function enterUserName (line 77) | Future<void> enterUserName(String name)
function toggleEnableRTLToolbarItems (line 98) | Future<void> toggleEnableRTLToolbarItems()
function updateNamespace (line 121) | Future<void> updateNamespace(String namespace)
FILE: frontend/appflowy_flutter/integration_test/shared/workspace.dart
function openWorkspaceMenu (line 16) | Future<void> openWorkspaceMenu()
function openWorkspace (line 25) | Future<void> openWorkspace(String name)
function changeWorkspaceName (line 34) | Future<void> changeWorkspaceName(String name)
function changeWorkspaceIcon (line 57) | Future<void> changeWorkspaceIcon(String icon)
FILE: frontend/appflowy_flutter/lib/ai/service/ai_entities.dart
class AIStreamEventPrefix (line 15) | class AIStreamEventPrefix {
type AiType (line 30) | enum AiType {
class PredefinedFormat (line 38) | class PredefinedFormat extends Equatable {
method toPB (line 47) | PredefinedFormatPB toPB()
type ImageFormat (line 68) | enum ImageFormat {
type TextFormat (line 93) | enum TextFormat {
type AiPromptCategory (line 118) | enum AiPromptCategory {
class AiPrompt (line 172) | @JsonSerializable()
method toJson (line 216) | Map<String, dynamic> toJson()
method _buildCategoryNameMap (line 234) | Map<AiPromptCategory, (String, String)> _buildCategoryNameMap()
method _categoryFromJson (line 245) | List<AiPromptCategory> _categoryFromJson(dynamic json)
class CustomPromptDatabaseConfig (line 290) | class CustomPromptDatabaseConfig extends Equatable {
method copyWith (line 339) | CustomPromptDatabaseConfig copyWith({
method toAiPB (line 355) | CustomPromptDatabaseConfigurationPB toAiPB()
method toDbPB (line 371) | CustomPromptDatabaseConfigPB toDbPB()
FILE: frontend/appflowy_flutter/lib/ai/service/ai_model_state_notifier.dart
type OnModelStateChangedCallback (line 12) | typedef OnModelStateChangedCallback = void Function(AIModelState state);
type OnAvailableModelsChangedCallback (line 13) | typedef OnAvailableModelsChangedCallback = void Function(
class AIModelState (line 19) | class AIModelState {
class AIModelStateNotifier (line 42) | class AIModelStateNotifier {
method _startListening (line 67) | void _startListening()
method _init (line 89) | Future<void> _init()
method addListener (line 98) | void addListener({
method removeListener (line 111) | void removeListener({
method dispose (line 123) | Future<void> dispose()
method getState (line 131) | AIModelState getState()
method getModelSelection (line 134) | (List<AIModelPB>, AIModelPB?) getModelSelection()
method _updateAll (line 137) | void _updateAll()
method _loadModelSelection (line 147) | Future<void> _loadModelSelection()
method _loadLocalState (line 160) | Future<void> _loadLocalState()
method _defaultState (line 167) | AIModelState _defaultState()
method _computeState (line 176) | AIModelState _computeState()
FILE: frontend/appflowy_flutter/lib/ai/service/ai_prompt_database_selector_cubit.dart
class AiPromptDatabaseSelectorCubit (line 11) | class AiPromptDatabaseSelectorCubit
method _init (line 19) | void _init(CustomPromptDatabaseConfig? config)
method selectDatabaseView (line 40) | void selectDatabaseView(String viewId)
method selectContentField (line 73) | void selectContentField(String fieldId)
method selectExampleField (line 91) | void selectExampleField(String? fieldId)
method selectCategoryField (line 113) | void selectCategoryField(String? fieldId)
method _getFields (line 135) | Future<List<FieldPB>?> _getFields(String viewId)
method _testDatabase (line 139) | Future<CustomPromptDatabaseConfigPB?> _testDatabase(
class AiPromptDatabaseSelectorState (line 148) | @freezed
FILE: frontend/appflowy_flutter/lib/ai/service/ai_prompt_input_bloc.dart
class AIPromptInputBloc (line 13) | class AIPromptInputBloc extends Bloc<AIPromptInputEvent, AIPromptInputSt...
method close (line 29) | Future<void> close()
method _dispatch (line 34) | void _dispatch()
method _startListening (line 110) | void _startListening()
method _init (line 120) | void _init()
method consumeMetadata (line 127) | Map<String, dynamic> consumeMetadata()
class AIPromptInputEvent (line 141) | @freezed
class AIPromptInputState (line 164) | @freezed
FILE: frontend/appflowy_flutter/lib/ai/service/ai_prompt_selector_cubit.dart
class AiPromptSelectorCubit (line 19) | class AiPromptSelectorCubit extends Cubit<AiPromptSelectorState> {
method close (line 33) | Future<void> close()
method _init (line 38) | void _init()
method loadCustomPrompts (line 61) | void loadCustomPrompts()
method selectCustomSection (line 145) | void selectCustomSection()
method selectFeaturedSection (line 165) | void selectFeaturedSection()
method selectCategory (line 185) | void selectCategory(AiPromptCategory? category)
method selectPrompt (line 213) | void selectPrompt(String promptId)
method toggleFavorite (line 228) | void toggleFavorite(String promptId)
method reset (line 245) | void reset()
method updateCustomPromptDatabaseConfiguration (line 263) | void updateCustomPromptDatabaseConfiguration(
method _filterTextChanged (line 308) | void _filterTextChanged()
method _getFilteredPrompts (line 330) | Iterable<AiPrompt> _getFilteredPrompts(Iterable<AiPrompt> prompts)
method _getPromptsByCategory (line 339) | Iterable<AiPrompt> _getPromptsByCategory(_AiPromptSelectorReadyState s...
method _getVisibleSelectedPrompt (line 354) | String? _getVisibleSelectedPrompt(
method getDatabaseView (line 366) | Future<ViewPB?> getDatabaseView(String viewId)
class AiPromptSelectorState (line 387) | @freezed
FILE: frontend/appflowy_flutter/lib/ai/service/appflowy_ai_service.dart
type LocalAIStreamingState (line 22) | enum LocalAIStreamingState {
class AIRepository (line 27) | abstract class AIRepository {
method streamCompletion (line 28) | Future<(String, CompletionStream)?> streamCompletion({
method getBuiltInPrompts (line 45) | Future<List<AiPrompt>> getBuiltInPrompts()
method getDatabasePrompts (line 47) | Future<List<AiPrompt>?> getDatabasePrompts(
method updateFavoritePrompts (line 51) | void updateFavoritePrompts(List<String> promptIds)
class AppFlowyAIService (line 54) | class AppFlowyAIService implements AIRepository {
method streamCompletion (line 56) | Future<(String, CompletionStream)?> streamCompletion({
method getBuiltInPrompts (line 107) | Future<List<AiPrompt>> getBuiltInPrompts()
method getDatabasePrompts (line 130) | Future<List<AiPrompt>?> getDatabasePrompts(
method updateFavoritePrompts (line 144) | void updateFavoritePrompts(List<String> promptIds)
class CompletionStream (line 147) | abstract class CompletionStream {
class AppFlowyCompletionStream (line 166) | class AppFlowyCompletionStream extends CompletionStream {
method _startListening (line 183) | void _startListening()
method dispose (line 192) | Future<void> dispose()
method _handleEvent (line 198) | Future<void> _handleEvent(String event)
FILE: frontend/appflowy_flutter/lib/ai/service/error.dart
class AIError (line 6) | @freezed
type AIErrorCode (line 17) | enum AIErrorCode {
FILE: frontend/appflowy_flutter/lib/ai/service/select_model_bloc.dart
class SelectModelBloc (line 11) | class SelectModelBloc extends Bloc<SelectModelEvent, SelectModelState> {
method close (line 49) | Future<void> close()
method _onAvailableModelsChanged (line 56) | void _onAvailableModelsChanged(
class SelectModelEvent (line 66) | @freezed
class SelectModelState (line 78) | @freezed
FILE: frontend/appflowy_flutter/lib/ai/service/view_selector_cubit.dart
type ViewSelectedStatus (line 15) | enum ViewSelectedStatus {
class ViewSelectorItem (line 25) | class ViewSelectorItem {
method toggleIsExpanded (line 48) | void toggleIsExpanded()
method copy (line 52) | ViewSelectorItem copy()
method findChildBySourceId (line 64) | ViewSelectorItem? findChildBySourceId(String sourceId)
method setIsDisabledRecursive (line 77) | void setIsDisabledRecursive(bool Function(ViewSelectorItem) newIsDisab...
method setIsSelectedStatusRecursive (line 85) | void setIsSelectedStatusRecursive(ViewSelectedStatus selectedStatus)
method dispose (line 93) | void dispose()
class ViewSelectorCubit (line 103) | class ViewSelectorCubit extends Cubit<ViewSelectorState> {
method updateSelectedSources (line 119) | void updateSelectedSources(List<String> newSelectedSourceIds)
method refreshSources (line 124) | Future<void> refreshSources(
method _recursiveBuild (line 167) | Future<ViewSelectorItem> _recursiveBuild(
method _setIsDisabledAndHideIfNecessary (line 218) | void _setIsDisabledAndHideIfNecessary(
method _restrictSelectionIfNecessary (line 233) | void _restrictSelectionIfNecessary(List<ViewSelectorItem> sources)
method onFilterChanged (line 252) | void onFilterChanged()
method _buildSearchResults (line 273) | ViewSelectorItem? _buildSearchResults(ViewSelectorItem item)
method _buildSelectedSources (line 299) | Iterable<ViewSelectorItem> _buildSelectedSources(
method toggleSelectedStatus (line 322) | void toggleSelectedStatus(ViewSelectorItem item, bool isSelectedSection)
method _recursiveGetSourceIds (line 356) | List<String> _recursiveGetSourceIds(ViewSelectorItem item)
method updateSelectedStatus (line 364) | void updateSelectedStatus()
method _recursiveUpdateSelectedStatus (line 384) | ViewSelectedStatus _recursiveUpdateSelectedStatus(ViewSelectorItem item)
method toggleIsExpanded (line 411) | void toggleIsExpanded(ViewSelectorItem item, bool isSelectedSection)
method close (line 429) | Future<void> close()
class ViewSelectorState (line 447) | @freezed
FILE: frontend/appflowy_flutter/lib/ai/widgets/ai_prompt_modal/ai_prompt_category_list.dart
class AiPromptCategoryList (line 8) | class AiPromptCategoryList extends StatefulWidget {
method createState (line 14) | State<AiPromptCategoryList> createState()
class _AiPromptCategoryListState (line 17) | class _AiPromptCategoryListState extends State<AiPromptCategoryList> {
method build (line 20) | Widget build(BuildContext context)
method _buildCategoryItem (line 79) | Widget _buildCategoryItem(
class AiPromptFeaturedSection (line 92) | class AiPromptFeaturedSection extends StatelessWidget {
method build (line 98) | Widget build(BuildContext context)
class AiPromptCustomPromptSection (line 140) | class AiPromptCustomPromptSection extends StatelessWidget {
method build (line 146) | Widget build(BuildContext context)
class AiPromptCategoryItem (line 195) | class AiPromptCategoryItem extends StatelessWidget {
method build (line 206) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/ai_prompt_modal/ai_prompt_database_modal.dart
function changeCustomPromptDatabaseConfig (line 21) | Future<CustomPromptDatabaseConfig?> changeCustomPromptDatabaseConfig(
class AiPromptDatabaseModal (line 45) | class AiPromptDatabaseModal extends StatefulWidget {
method createState (line 51) | State<AiPromptDatabaseModal> createState()
class _AiPromptDatabaseModalState (line 54) | class _AiPromptDatabaseModalState extends State<AiPromptDatabaseModal> {
method dispose (line 58) | void dispose()
method build (line 64) | Widget build(BuildContext context)
class _Header (line 175) | class _Header extends StatefulWidget {
method createState (line 179) | State<_Header> createState()
class _HeaderState (line 182) | class _HeaderState extends State<_Header> {
method dispose (line 186) | void dispose()
method build (line 192) | Widget build(BuildContext context)
method getIgnoreViewType (line 321) | IgnoreViewType getIgnoreViewType(ViewSelectorItem item)
method hasDatabaseDescendent (line 335) | bool hasDatabaseDescendent(ViewSelectorItem viewSelectorItem)
class _Expanded (line 353) | class _Expanded extends StatelessWidget {
method build (line 357) | Widget build(BuildContext context)
class _PopoverContent (line 435) | class _PopoverContent extends StatefulWidget {
method createState (line 443) | State<_PopoverContent> createState()
class _PopoverContentState (line 446) | class _PopoverContentState extends State<_PopoverContent> {
method initState (line 450) | void initState()
method dispose (line 458) | void dispose()
method build (line 464) | Widget build(BuildContext context)
method _buildVisibleSources (line 510) | Iterable<Widget> _buildVisibleSources(
class _FieldPBWrapper (line 537) | class _FieldPBWrapper extends Equatable with AFDropDownMenuMixin {
class FieldSelector (line 549) | class FieldSelector extends StatelessWidget {
method build (line 568) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/ai_prompt_modal/ai_prompt_modal.dart
function showAiPromptModal (line 18) | Future<AiPrompt?> showAiPromptModal(
class AiPromptModal (line 42) | class AiPromptModal extends StatelessWidget {
method build (line 46) | Widget build(BuildContext context)
function showLoadPromptFailedDialog (line 161) | void showLoadPromptFailedDialog(
FILE: frontend/appflowy_flutter/lib/ai/widgets/ai_prompt_modal/ai_prompt_onboarding.dart
class AiPromptOnboarding (line 11) | class AiPromptOnboarding extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/ai_prompt_modal/ai_prompt_preview.dart
class AiPromptPreview (line 9) | class AiPromptPreview extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
class _PromptContent (line 94) | class _PromptContent extends StatelessWidget {
method build (line 102) | Widget build(BuildContext context)
method _buildTextSpans (line 123) | List<TextSpan> _buildTextSpans(BuildContext context, String text)
method _splitPromptText (line 144) | List<String> _splitPromptText(String text)
class _PromptExample (line 165) | class _PromptExample extends StatelessWidget {
method build (line 173) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/ai_prompt_modal/ai_prompt_visible_list.dart
class AiPromptVisibleList (line 19) | class AiPromptVisibleList extends StatefulWidget {
method createState (line 25) | State<AiPromptVisibleList> createState()
class _AiPromptVisibleListState (line 28) | class _AiPromptVisibleListState extends State<AiPromptVisibleList> {
method initState (line 37) | void initState()
method dispose (line 51) | void dispose()
method build (line 58) | Widget build(BuildContext context)
method buildSearchField (line 205) | Widget buildSearchField(BuildContext context)
method buildEmptyPrompts (line 243) | Widget buildEmptyPrompts()
method buildPromptList (line 268) | Widget buildPromptList()
method buildLoadingIndicator (line 305) | Widget buildLoadingIndicator(AppFlowyThemeData theme)
method handleVisiblePromptListChanged (line 318) | void handleVisiblePromptListChanged(
method handleFilterTextChanged (line 358) | void handleFilterTextChanged()
class _AiPromptListItem (line 365) | class _AiPromptListItem extends StatefulWidget {
method createState (line 377) | State<_AiPromptListItem> createState()
class _AiPromptListItemState (line 380) | class _AiPromptListItemState extends State<_AiPromptListItem> {
method dispose (line 385) | void dispose()
method build (line 392) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/loading_indicator.dart
class AILoadingIndicator (line 6) | class AILoadingIndicator extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
method buildDot (line 67) | Widget buildDot(Color color)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/action_buttons.dart
class PromptInputAttachmentButton (line 11) | class PromptInputAttachmentButton extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
class PromptInputMentionButton (line 37) | class PromptInputMentionButton extends StatelessWidget {
method build (line 50) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/browse_prompts_button.dart
class BrowsePromptsButton (line 11) | class BrowsePromptsButton extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/desktop_prompt_input.dart
type OnPromptInputSubmitted (line 18) | typedef OnPromptInputSubmitted = void Function(
class DesktopPromptInput (line 25) | class DesktopPromptInput extends StatefulWidget {
method createState (line 50) | State<DesktopPromptInput> createState()
class _DesktopPromptInputState (line 53) | class _DesktopPromptInputState extends State<DesktopPromptInput> {
method initState (line 65) | void initState()
method didUpdateWidget (line 91) | void didUpdateWidget(covariant oldWidget)
method dispose (line 97) | void dispose()
method build (line 106) | Widget build(BuildContext context)
method decoration (line 222) | BoxDecoration decoration(BuildContext context)
method checkForAskingAI (line 238) | void checkForAskingAI()
method startMentionPageFromButton (line 260) | void startMentionPageFromButton()
method cancelMentionPage (line 278) | void cancelMentionPage()
method updateSendButtonState (line 285) | void updateSendButtonState()
method handleSend (line 295) | void handleSend()
method handleTextControllerChanged (line 323) | void handleTextControllerChanged()
method handleKeyEvent (line 391) | KeyEventResult handleKeyEvent(FocusNode node, KeyEvent event)
method handlePageSelected (line 406) | void handlePageSelected(ViewPB view)
method inputTextField (line 424) | Widget inputTextField()
method getTextFieldConstraints (line 459) | BoxConstraints getTextFieldConstraints(bool showPredefinedFormats)
method calculateContentPadding (line 471) | EdgeInsetsGeometry calculateContentPadding(bool showPredefinedFormats)
method buildShortcuts (line 482) | Map<ShortcutActivator, Intent> buildShortcuts()
method buildActions (line 495) | Map<Type, Action<Intent>> buildActions()
method handleOnSelectPrompt (line 536) | void handleOnSelectPrompt(AiPrompt prompt)
class _SubmitOrMentionPageIntent (line 559) | class _SubmitOrMentionPageIntent extends Intent {
class _CancelMentionPageIntent (line 563) | class _CancelMentionPageIntent extends Intent {
class _FocusPreviousItemIntent (line 567) | class _FocusPreviousItemIntent extends Intent {
class _FocusNextItemIntent (line 571) | class _FocusNextItemIntent extends Intent {
class PromptInputTextField (line 575) | class PromptInputTextField extends StatelessWidget {
method build (line 594) | Widget build(BuildContext context)
method inputHintTextStyle (line 622) | TextStyle? inputHintTextStyle(BuildContext context)
class _PromptBottomActions (line 631) | class _PromptBottomActions extends StatelessWidget {
method build (line 659) | Widget build(BuildContext context)
method _predefinedFormatButton (line 688) | Widget _predefinedFormatButton()
method _selectSourcesButton (line 695) | Widget _selectSourcesButton()
method _selectModelButton (line 702) | Widget _selectModelButton(BuildContext context)
method _buildBrowsePromptsButton (line 709) | Widget _buildBrowsePromptsButton()
method _attachmentButton (line 723) | Widget _attachmentButton(BuildContext context)
method _sendButton (line 747) | Widget _sendButton()
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/file_attachment_list.dart
class PromptInputFile (line 13) | class PromptInputFile extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
class ChatFilePreview (line 47) | class ChatFilePreview extends StatefulWidget {
method createState (line 58) | State<ChatFilePreview> createState()
class _ChatFilePreviewState (line 61) | class _ChatFilePreviewState extends State<ChatFilePreview> {
method build (line 65) | Widget build(BuildContext context)
method setHover (line 136) | void setHover(bool value)
class _CloseButton (line 143) | class _CloseButton extends StatelessWidget {
method build (line 149) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/layout_define.dart
class DesktopAIPromptSizes (line 3) | class DesktopAIPromptSizes {
class MobileAIPromptSizes (line 24) | class MobileAIPromptSizes {
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/mention_page_bottom_sheet.dart
function showPageSelectorSheet (line 13) | Future<ViewPB?> showPageSelectorSheet(
class _MobilePageSelectorBody (line 34) | class _MobilePageSelectorBody extends StatefulWidget {
method createState (line 44) | State<_MobilePageSelectorBody> createState()
class _MobilePageSelectorBodyState (line 48) | class _MobilePageSelectorBodyState extends State<_MobilePageSelectorBody> {
method dispose (line 53) | void dispose()
method build (line 59) | Widget build(BuildContext context)
method _fetchViews (line 174) | Future<List<ViewPB>> _fetchViews()
class _Header (line 178) | class _Header extends SliverPersistentHeaderDelegate {
method build (line 186) | Widget build(
method shouldRebuild (line 201) | bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/mention_page_menu.dart
class PromptInputAnchor (line 22) | class PromptInputAnchor {
class PromptInputMentionPageMenu (line 29) | class PromptInputMentionPageMenu extends StatefulWidget {
method createState (line 42) | State<PromptInputMentionPageMenu> createState()
class _PromptInputMentionPageMenuState (line 46) | class _PromptInputMentionPageMenuState
method initState (line 49) | void initState()
method build (line 59) | Widget build(BuildContext context)
method getPopupOffsetX (line 111) | double getPopupOffsetX()
class PromptInputMentionPageList (line 150) | class PromptInputMentionPageList extends StatefulWidget {
method createState (line 159) | State<PromptInputMentionPageList> createState()
class _PromptInputMentionPageListState (line 163) | class _PromptInputMentionPageListState
method dispose (line 172) | void dispose()
method build (line 178) | Widget build(BuildContext context)
class _ChatMentionPageItem (line 264) | class _ChatMentionPageItem extends StatelessWidget {
method build (line 276) | Widget build(BuildContext context)
class MentionViewIcon (line 304) | class MentionViewIcon extends StatelessWidget {
method build (line 313) | Widget build(BuildContext context)
class MentionViewTitleAndAncestors (line 343) | class MentionViewTitleAndAncestors extends StatelessWidget {
method build (line 352) | Widget build(BuildContext context)
method _getViewAncestorList (line 397) | String _getViewAncestorList(
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/mentioned_page_text_span.dart
class PromptInputTextSpanBuilder (line 8) | class PromptInputTextSpanBuilder extends SpecialTextSpanBuilder {
method createSpecialText (line 18) | SpecialText? createSpecialText(
class MentionedPageText (line 42) | class MentionedPageText extends SpecialText {
method isEnd (line 56) | bool isEnd(String value)
method finishText (line 59) | InlineSpan finishText()
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/predefined_format_buttons.dart
class PromptInputDesktopToggleFormatButton (line 12) | class PromptInputDesktopToggleFormatButton extends StatelessWidget {
method build (line 23) | Widget build(BuildContext context)
class ChangeFormatBar (line 45) | class ChangeFormatBar extends StatelessWidget {
method build (line 60) | Widget build(BuildContext context)
method _buildFormatButton (line 85) | Widget _buildFormatButton(BuildContext context, ImageFormat format)
method _buildDivider (line 126) | Widget _buildDivider()
method _buildTextFormatButton (line 134) | Widget _buildTextFormatButton(
class PromptInputMobileToggleFormatButton (line 184) | class PromptInputMobileToggleFormatButton extends StatelessWidget {
method build (line 195) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/prompt_input_text_controller.dart
class AiPromptInputTextEditingController (line 7) | class AiPromptInputTextEditingController extends TextEditingController {
method replace (line 10) | String replace(String text)
method restore (line 16) | String restore(String text)
method usePrompt (line 22) | void usePrompt(String content)
method buildTextSpan (line 32) | TextSpan buildTextSpan({
method getTextSpans (line 43) | Iterable<TextSpan> getTextSpans(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/select_model_menu.dart
class SelectModelMenu (line 11) | class SelectModelMenu extends StatefulWidget {
method createState (line 20) | State<SelectModelMenu> createState()
class _SelectModelMenuState (line 23) | class _SelectModelMenuState extends State<SelectModelMenu> {
method build (line 27) | Widget build(BuildContext context)
class SelectModelPopoverContent (line 69) | class SelectModelPopoverContent extends StatelessWidget {
method build (line 82) | Widget build(BuildContext context)
class _ModelSectionHeader (line 132) | class _ModelSectionHeader extends StatelessWidget {
method build (line 140) | Widget build(BuildContext context)
class _ModelItem (line 154) | class _ModelItem extends StatelessWidget {
method build (line 166) | Widget build(BuildContext context)
class _CurrentModelButton (line 202) | class _CurrentModelButton extends StatelessWidget {
method build (line 212) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/select_sources_bottom_sheet.dart
class PromptInputMobileSelectSourcesButton (line 23) | class PromptInputMobileSelectSourcesButton extends StatefulWidget {
method createState (line 34) | State<PromptInputMobileSelectSourcesButton> createState()
class _PromptInputMobileSelectSourcesButtonState (line 38) | class _PromptInputMobileSelectSourcesButtonState
method initState (line 54) | void initState()
method dispose (line 63) | void dispose()
method build (line 70) | Widget build(BuildContext context)
method onSelectedSourcesChanged (line 166) | void onSelectedSourcesChanged()
class _MobileSelectSourcesSheetBody (line 173) | class _MobileSelectSourcesSheetBody extends StatelessWidget {
method build (line 181) | Widget build(BuildContext context)
class _Header (line 298) | class _Header extends SliverPersistentHeaderDelegate {
method build (line 306) | Widget build(
method shouldRebuild (line 321) | bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/select_sources_menu.dart
class PromptInputDesktopSelectSourcesButton (line 24) | class PromptInputDesktopSelectSourcesButton extends StatefulWidget {
method createState (line 35) | State<PromptInputDesktopSelectSourcesButton> createState()
class _PromptInputDesktopSelectSourcesButtonState (line 39) | class _PromptInputDesktopSelectSourcesButtonState
method initState (line 62) | void initState()
method dispose (line 71) | void dispose()
method build (line 78) | Widget build(BuildContext context)
method onSelectedSourcesChanged (line 118) | void onSelectedSourcesChanged()
class _IndicatorButton (line 125) | class _IndicatorButton extends StatelessWidget {
method build (line 135) | Widget build(BuildContext context)
class _PopoverContent (line 188) | class _PopoverContent extends StatelessWidget {
method build (line 192) | Widget build(BuildContext context)
method _buildSelectedSources (line 236) | Iterable<Widget> _buildSelectedSources(
method _buildVisibleSources (line 257) | Iterable<Widget> _buildVisibleSources(
class ViewSelectorTreeItem (line 279) | class ViewSelectorTreeItem extends StatefulWidget {
method createState (line 313) | State<ViewSelectorTreeItem> createState()
class _ViewSelectorTreeItemState (line 316) | class _ViewSelectorTreeItemState extends State<ViewSelectorTreeItem> {
method build (line 318) | Widget build(BuildContext context)
class ViewSelectorTreeItemInner (line 389) | class ViewSelectorTreeItemInner extends StatelessWidget {
method build (line 412) | Widget build(BuildContext context)
class ToggleIsExpandedButton (line 494) | class ToggleIsExpandedButton extends StatelessWidget {
method build (line 505) | Widget build(BuildContext context)
class _DotIconWidget (line 536) | class _DotIconWidget extends StatelessWidget {
method build (line 540) | Widget build(BuildContext context)
class SourceSelectedStatusCheckbox (line 555) | class SourceSelectedStatusCheckbox extends StatelessWidget {
method build (line 564) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/prompt_input/send_button.dart
type SendButtonState (line 10) | enum SendButtonState { enabled, streaming, disabled }
class PromptInputSendButton (line 12) | class PromptInputSendButton extends StatelessWidget {
method build (line 25) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/ai/widgets/view_selector.dart
class ViewSelector (line 8) | class ViewSelector extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/core/config/kv.dart
class KeyValueStorage (line 3) | abstract class KeyValueStorage {
method set (line 4) | Future<void> set(String key, String value)
method get (line 5) | Future<String?> get(String key)
method getWithFormat (line 6) | Future<T?> getWithFormat<T>(
method remove (line 10) | Future<void> remove(String key)
method clear (line 11) | Future<void> clear()
class DartKeyValue (line 14) | class DartKeyValue implements KeyValueStorage {
method get (line 19) | Future<String?> get(String key)
method getWithFormat (line 30) | Future<T?> getWithFormat<T>(
method remove (line 42) | Future<void> remove(String key)
method set (line 49) | Future<void> set(String key, String value)
method clear (line 56) | Future<void> clear()
method _initSharedPreferencesIfNeeded (line 62) | Future<void> _initSharedPreferencesIfNeeded()
FILE: frontend/appflowy_flutter/lib/core/config/kv_keys.dart
class KVKeys (line 1) | class KVKeys {
FILE: frontend/appflowy_flutter/lib/core/frameless_window.dart
class CocoaWindowChannel (line 6) | class CocoaWindowChannel {
method setWindowPosition (line 13) | Future<void> setWindowPosition(Offset offset)
method getWindowPosition (line 17) | Future<List<double>> getWindowPosition()
method zoom (line 24) | Future<void> zoom()
class MoveWindowDetector (line 29) | class MoveWindowDetector extends StatefulWidget {
method createState (line 38) | MoveWindowDetectorState createState()
class MoveWindowDetectorState (line 41) | class MoveWindowDetectorState extends State<MoveWindowDetector> {
method build (line 46) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/core/helpers/url_launcher.dart
type OnFailureCallback (line 16) | typedef OnFailureCallback = void Function(Uri uri);
function afLaunchUri (line 22) | Future<bool> afLaunchUri(
function afLaunchUrlString (line 99) | Future<bool> afLaunchUrlString(
function _afLaunchLocalUri (line 125) | Future<bool> _afLaunchLocalUri(
function _errorHandler (line 163) | void _errorHandler(
FILE: frontend/appflowy_flutter/lib/core/network_monitor.dart
class NetworkListener (line 9) | class NetworkListener {
method start (line 18) | Future<void> start()
method stop (line 30) | Future<void> stop()
method _updateConnectionStatus (line 34) | Future<void> _updateConnectionStatus(ConnectivityResult result)
FILE: frontend/appflowy_flutter/lib/core/notification/document_notification.dart
class DocumentNotificationParser (line 8) | class DocumentNotificationParser
FILE: frontend/appflowy_flutter/lib/core/notification/folder_notification.dart
class FolderNotificationParser (line 15) | class FolderNotificationParser
type FolderNotificationHandler (line 27) | typedef FolderNotificationHandler = Function(
class FolderNotificationListener (line 32) | class FolderNotificationListener {
method stop (line 47) | Future<void> stop()
FILE: frontend/appflowy_flutter/lib/core/notification/grid_notification.dart
class DatabaseNotificationParser (line 15) | class DatabaseNotificationParser
type DatabaseNotificationHandler (line 27) | typedef DatabaseNotificationHandler = Function(
class DatabaseNotificationListener (line 32) | class DatabaseNotificationListener {
method stop (line 44) | Future<void> stop()
FILE: frontend/appflowy_flutter/lib/core/notification/notification_helper.dart
class NotificationParser (line 6) | class NotificationParser<T, E extends Object> {
method parse (line 19) | void parse(SubscribeObject subject)
FILE: frontend/appflowy_flutter/lib/core/notification/search_notification.dart
class SearchNotificationParser (line 16) | class SearchNotificationParser
type SearchNotificationHandler (line 30) | typedef SearchNotificationHandler = Function(
class SearchNotificationListener (line 35) | class SearchNotificationListener {
method stop (line 52) | Future<void> stop()
FILE: frontend/appflowy_flutter/lib/core/notification/user_notification.dart
class UserNotificationParser (line 9) | class UserNotificationParser
FILE: frontend/appflowy_flutter/lib/date/date_service.dart
class DateService (line 6) | class DateService {
method queryDate (line 7) | Future<FlowyResult<DateTime, FlowyError>> queryDate(
FILE: frontend/appflowy_flutter/lib/env/backend_env.dart
class AppFlowyConfiguration (line 8) | @JsonSerializable()
method toJson (line 35) | Map<String, dynamic> toJson()
class AppFlowyCloudConfiguration (line 38) | @JsonSerializable()
method toJson (line 63) | Map<String, dynamic> toJson()
method defaultConfig (line 65) | AppFlowyCloudConfiguration defaultConfig()
FILE: frontend/appflowy_flutter/lib/env/cloud_env.dart
function _setAuthenticatorType (line 24) | Future<void> _setAuthenticatorType(AuthenticatorType ty)
function getAuthenticatorType (line 54) | Future<AuthenticatorType> getAuthenticatorType()
type AuthenticatorType (line 112) | enum AuthenticatorType {
function currentCloudType (line 155) | AuthenticatorType currentCloudType()
function _setAppFlowyCloudUrl (line 159) | Future<void> _setAppFlowyCloudUrl(String? url)
function useBaseWebDomain (line 163) | Future<void> useBaseWebDomain(String? url)
function useSelfHostedAppFlowyCloud (line 170) | Future<void> useSelfHostedAppFlowyCloud(String url)
function useAppFlowyCloudDevelop (line 175) | Future<void> useAppFlowyCloudDevelop(String url)
function useAppFlowyBetaCloudWithURL (line 180) | Future<void> useAppFlowyBetaCloudWithURL(
function useLocalServer (line 188) | Future<void> useLocalServer()
class AppFlowyCloudSharedEnv (line 193) | class AppFlowyCloudSharedEnv {
method fromEnv (line 204) | Future<AppFlowyCloudSharedEnv> fromEnv()
method toString (line 244) | String toString()
function configurationFromUri (line 250) | Future<AppFlowyCloudConfiguration> configurationFromUri(
function getAppFlowyCloudConfig (line 281) | Future<AppFlowyCloudConfiguration> getAppFlowyCloudConfig(
function getAppFlowyCloudUrl (line 301) | Future<String> getAppFlowyCloudUrl()
function getAppFlowyShareDomain (line 307) | Future<String> getAppFlowyShareDomain()
function getSyncLogEnabled (line 313) | Future<bool> getSyncLogEnabled()
function setSyncLogEnabled (line 324) | Future<void> setSyncLogEnabled(bool enable)
function _getAppFlowyCloudWSUrl (line 331) | Future<String> _getAppFlowyCloudWSUrl(String baseURL)
function _getAppFlowyCloudGotrueUrl (line 347) | Future<String> _getAppFlowyCloudGotrueUrl(String baseURL)
FILE: frontend/appflowy_flutter/lib/env/cloud_env_test.dart
class TestEnv (line 10) | @Envied(path: '.env.cloud.test')
FILE: frontend/appflowy_flutter/lib/env/env.dart
class Env (line 8) | @Envied(path: '.env')
FILE: frontend/appflowy_flutter/lib/features/page_access_level/data/repositories/page_access_level_repository.dart
class PageAccessLevelRepository (line 11) | abstract class PageAccessLevelRepository {
method getView (line 13) | Future<FlowyResult<ViewPB, FlowyError>> getView(String pageId)
method lockView (line 16) | Future<FlowyResult<void, FlowyError>> lockView(String pageId)
method unlockView (line 19) | Future<FlowyResult<void, FlowyError>> unlockView(String pageId)
method getAccessLevel (line 22) | Future<FlowyResult<ShareAccessLevel, FlowyError>> getAccessLevel(
method getSectionType (line 27) | Future<FlowyResult<SharedSectionType, FlowyError>> getSectionType(
method getCurrentWorkspace (line 32) | Future<FlowyResult<UserWorkspacePB, FlowyError>> getCurrentWorkspace()
FILE: frontend/appflowy_flutter/lib/features/page_access_level/data/repositories/rust_page_access_level_repository_impl.dart
class RustPageAccessLevelRepositoryImpl (line 16) | class RustPageAccessLevelRepositoryImpl implements PageAccessLevelReposi...
method getView (line 18) | Future<FlowyResult<ViewPB, FlowyError>> getView(String pageId)
method lockView (line 33) | Future<FlowyResult<void, FlowyError>> lockView(String pageId)
method unlockView (line 48) | Future<FlowyResult<void, FlowyError>> unlockView(String pageId)
method getAccessLevel (line 68) | Future<FlowyResult<ShareAccessLevel, FlowyError>> getAccessLevel(
method getSectionType (line 163) | Future<FlowyResult<SharedSectionType, FlowyError>> getSectionType(
method getCurrentWorkspace (line 185) | Future<FlowyResult<UserWorkspacePB, FlowyError>> getCurrentWorkspace()
FILE: frontend/appflowy_flutter/lib/features/page_access_level/logic/page_access_level_bloc.dart
class PageAccessLevelBloc (line 17) | class PageAccessLevelBloc
method close (line 47) | Future<void> close()
method _onInitial (line 52) | Future<void> _onInitial(
method _onLock (line 103) | Future<void> _onLock(
method _onUnlock (line 119) | Future<void> _onUnlock(
method _onUpdateLockStatus (line 136) | void _onUpdateLockStatus(
method _onUpdateSectionType (line 153) | void _onUpdateSectionType(
FILE: frontend/appflowy_flutter/lib/features/page_access_level/logic/page_access_level_event.dart
class PageAccessLevelEvent (line 4) | sealed class PageAccessLevelEvent {
class PageAccessLevelInitialEvent (line 29) | class PageAccessLevelInitialEvent extends PageAccessLevelEvent {
class PageAccessLevelLockEvent (line 33) | class PageAccessLevelLockEvent extends PageAccessLevelEvent {
class PageAccessLevelUnlockEvent (line 37) | class PageAccessLevelUnlockEvent extends PageAccessLevelEvent {
class PageAccessLevelUpdateLockStatusEvent (line 41) | class PageAccessLevelUpdateLockStatusEvent extends PageAccessLevelEvent {
class PageAccessLevelUpdateSectionTypeEvent (line 51) | class PageAccessLevelUpdateSectionTypeEvent extends PageAccessLevelEvent {
FILE: frontend/appflowy_flutter/lib/features/page_access_level/logic/page_access_level_state.dart
class PageAccessLevelState (line 5) | class PageAccessLevelState {
method copyWith (line 47) | PageAccessLevelState copyWith({
method toString (line 94) | String toString()
FILE: frontend/appflowy_flutter/lib/features/settings/data/models/user_data_location.dart
class UserDataLocation (line 3) | class UserDataLocation extends Equatable {
FILE: frontend/appflowy_flutter/lib/features/settings/data/repositories/rust_settings_repository_impl.dart
class RustSettingsRepositoryImpl (line 11) | class RustSettingsRepositoryImpl implements SettingsRepository {
method getUserDataLocation (line 17) | Future<FlowyResult<UserDataLocation, FlowyError>>
method resetUserDataLocation (line 34) | Future<FlowyResult<UserDataLocation, FlowyError>>
method setCustomLocation (line 48) | Future<FlowyResult<UserDataLocation, FlowyError>> setCustomLocation(
FILE: frontend/appflowy_flutter/lib/features/settings/data/repositories/settings_repository.dart
class SettingsRepository (line 6) | abstract class SettingsRepository {
method getUserDataLocation (line 7) | Future<FlowyResult<UserDataLocation, FlowyError>> getUserDataLocation()
method resetUserDataLocation (line 9) | Future<FlowyResult<UserDataLocation, FlowyError>> resetUserDataLocation()
method setCustomLocation (line 11) | Future<FlowyResult<UserDataLocation, FlowyError>> setCustomLocation(
FILE: frontend/appflowy_flutter/lib/features/settings/logic/data_location_bloc.dart
class DataLocationBloc (line 8) | class DataLocationBloc extends Bloc<DataLocationEvent, DataLocationState> {
method _onStarted (line 21) | Future<void> _onStarted(
method _onResetToDefault (line 36) | Future<void> _onResetToDefault(
method _onClearState (line 51) | Future<void> _onClearState(
method _onSetCustomPath (line 62) | Future<void> _onSetCustomPath(
FILE: frontend/appflowy_flutter/lib/features/settings/logic/data_location_event.dart
class DataLocationEvent (line 1) | sealed class DataLocationEvent {
class DataLocationInitial (line 14) | class DataLocationInitial extends DataLocationEvent {}
class DataLocationResetToDefault (line 16) | class DataLocationResetToDefault extends DataLocationEvent {}
class DataLocationSetCustomPath (line 18) | class DataLocationSetCustomPath extends DataLocationEvent {
class DataLocationClearState (line 24) | class DataLocationClearState extends DataLocationEvent {}
FILE: frontend/appflowy_flutter/lib/features/settings/logic/data_location_state.dart
class DataLocationState (line 5) | class DataLocationState extends Equatable {
method copyWith (line 20) | DataLocationState copyWith({
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/models/share_access_level.dart
type ShareAccessLevel (line 6) | enum ShareAccessLevel {
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/models/share_popover_group_id.dart
class SharePopoverGroupId (line 1) | class SharePopoverGroupId {}
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/models/share_role.dart
type ShareRole (line 1) | enum ShareRole {
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/models/share_section_type.dart
type SharedSectionType (line 6) | enum SharedSectionType {
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/models/shared_group.dart
class SharedGroup (line 1) | class SharedGroup {
method copyWith (line 14) | SharedGroup copyWith({
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/models/shared_user.dart
type SharedUsers (line 4) | typedef SharedUsers = List<SharedUser>;
class SharedUser (line 7) | class SharedUser {
method copyWith (line 32) | SharedUser copyWith({
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/repositories/local_share_with_user_repository_impl.dart
class LocalShareWithUserRepositoryImpl (line 11) | class LocalShareWithUserRepositoryImpl extends ShareWithUserRepository {
method getSharedUsersInPage (line 90) | Future<FlowyResult<SharedUsers, FlowyError>> getSharedUsersInPage({
method removeSharedUserFromPage (line 97) | Future<FlowyResult<void, FlowyError>> removeSharedUserFromPage({
method sharePageWithUser (line 109) | Future<FlowyResult<void, FlowyError>> sharePageWithUser({
method getAvailableSharedUsers (line 145) | Future<FlowyResult<SharedUsers, FlowyError>> getAvailableSharedUsers({
method changeRole (line 155) | Future<FlowyResult<void, FlowyError>> changeRole({
method getCurrentUserProfile (line 169) | Future<FlowyResult<UserProfilePB, FlowyError>> getCurrentUserProfile()
method getCurrentPageSectionType (line 179) | Future<FlowyResult<SharedSectionType, FlowyError>> getCurrentPageSecti...
method getUpgradeToProButtonClicked (line 186) | Future<bool> getUpgradeToProButtonClicked({
method setUpgradeToProButtonClicked (line 193) | Future<void> setUpgradeToProButtonClicked({
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/repositories/rust_share_with_user_repository_impl.dart
class RustShareWithUserRepositoryImpl (line 19) | class RustShareWithUserRepositoryImpl extends ShareWithUserRepository {
method getSharedUsersInPage (line 23) | Future<FlowyResult<SharedUsers, FlowyError>> getSharedUsersInPage({
method removeSharedUserFromPage (line 46) | Future<FlowyResult<void, FlowyError>> removeSharedUserFromPage({
method sharePageWithUser (line 71) | Future<FlowyResult<void, FlowyError>> sharePageWithUser({
method getAvailableSharedUsers (line 103) | Future<FlowyResult<SharedUsers, FlowyError>> getAvailableSharedUsers({
method changeRole (line 110) | Future<FlowyResult<void, FlowyError>> changeRole({
method getCurrentUserProfile (line 139) | Future<FlowyResult<UserProfilePB, FlowyError>> getCurrentUserProfile()
method getCurrentPageSectionType (line 145) | Future<FlowyResult<SharedSectionType, FlowyError>> getCurrentPageSecti...
method getUpgradeToProButtonClicked (line 169) | Future<bool> getUpgradeToProButtonClicked({
method setUpgradeToProButtonClicked (line 183) | Future<void> setUpgradeToProButtonClicked({
FILE: frontend/appflowy_flutter/lib/features/share_tab/data/repositories/share_with_user_repository.dart
class ShareWithUserRepository (line 10) | abstract class ShareWithUserRepository {
method getSharedUsersInPage (line 12) | Future<FlowyResult<SharedUsers, FlowyError>> getSharedUsersInPage({
method getAvailableSharedUsers (line 17) | Future<FlowyResult<SharedUsers, FlowyError>> getAvailableSharedUsers({
method removeSharedUserFromPage (line 22) | Future<FlowyResult<void, FlowyError>> removeSharedUserFromPage({
method sharePageWithUser (line 30) | Future<FlowyResult<void, FlowyError>> sharePageWithUser({
method changeRole (line 37) | Future<FlowyResult<void, FlowyError>> changeRole({
method getCurrentUserProfile (line 44) | Future<FlowyResult<UserProfilePB, FlowyError>> getCurrentUserProfile()
method getCurrentPageSectionType (line 47) | Future<FlowyResult<SharedSectionType, FlowyError>> getCurrentPageSecti...
method getUpgradeToProButtonClicked (line 52) | Future<bool> getUpgradeToProButtonClicked({
method setUpgradeToProButtonClicked (line 57) | Future<void> setUpgradeToProButtonClicked({
FILE: frontend/appflowy_flutter/lib/features/share_tab/logic/share_tab_bloc.dart
class ShareTabBloc (line 19) | class ShareTabBloc extends Bloc<ShareTabEvent, ShareTabState> {
method close (line 47) | Future<void> close()
method _onInitial (line 52) | Future<void> _onInitial(
method _onGetSharedUsers (line 106) | Future<void> _onGetSharedUsers(
method _onShare (line 140) | Future<void> _onShare(
method _onRemove (line 178) | Future<void> _onRemove(
method _onUpdateAccessLevel (line 214) | Future<void> _onUpdateAccessLevel(
method _onUpdateGeneralAccess (line 249) | void _onUpdateGeneralAccess(
method _onCopyLink (line 260) | void _onCopyLink(
method _onSearchAvailableUsers (line 277) | Future<void> _onSearchAvailableUsers(
method _onTurnIntoMember (line 312) | Future<void> _onTurnIntoMember(
method _getSharedUsers (line 349) | Future<SharedUsers> _getSharedUsers()
method _onClearState (line 359) | void _onClearState(
method _onUpdateSharedUsers (line 370) | void _onUpdateSharedUsers(
method _onUpgradeToProClicked (line 381) | Future<void> _onUpgradeToProClicked(
method _initFolderNotificationListener (line 395) | void _initFolderNotificationListener()
FILE: frontend/appflowy_flutter/lib/features/share_tab/logic/share_tab_event.dart
class ShareTabEvent (line 3) | sealed class ShareTabEvent {
class ShareTabEventInitialize (line 64) | class ShareTabEventInitialize extends ShareTabEvent {
class ShareTabEventLoadSharedUsers (line 69) | class ShareTabEventLoadSharedUsers extends ShareTabEvent {
class ShareTabEventInviteUsers (line 74) | class ShareTabEventInviteUsers extends ShareTabEvent {
class ShareTabEventRemoveUsers (line 85) | class ShareTabEventRemoveUsers extends ShareTabEvent {
class ShareTabEventUpdateUserAccessLevel (line 94) | class ShareTabEventUpdateUserAccessLevel extends ShareTabEvent {
class ShareTabEventUpdateGeneralAccessLevel (line 105) | class ShareTabEventUpdateGeneralAccessLevel extends ShareTabEvent {
class ShareTabEventCopyShareLink (line 114) | class ShareTabEventCopyShareLink extends ShareTabEvent {
class ShareTabEventSearchAvailableUsers (line 123) | class ShareTabEventSearchAvailableUsers extends ShareTabEvent {
class ShareTabEventConvertToMember (line 132) | class ShareTabEventConvertToMember extends ShareTabEvent {
class ShareTabEventClearState (line 140) | class ShareTabEventClearState extends ShareTabEvent {
class ShareTabEventUpdateSharedUsers (line 144) | class ShareTabEventUpdateSharedUsers extends ShareTabEvent {
class ShareTabEventUpgradeToProClicked (line 152) | class ShareTabEventUpgradeToProClicked extends ShareTabEvent {
FILE: frontend/appflowy_flutter/lib/features/share_tab/logic/share_tab_state.dart
class ShareTabState (line 6) | class ShareTabState {
method copyWith (line 43) | ShareTabState copyWith({
method toString (line 123) | String toString()
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/share_tab.dart
class ShareTab (line 20) | class ShareTab extends StatefulWidget {
method createState (line 42) | State<ShareTab> createState()
class _ShareTabState (line 45) | class _ShareTabState extends State<ShareTab> {
method initState (line 50) | void initState()
method dispose (line 57) | void dispose()
method build (line 65) | Widget build(BuildContext context)
method _onSharePageWithUser (line 147) | void _onSharePageWithUser(
method _buildPeopleWithAccessSectionCallbacks (line 157) | PeopleWithAccessSectionCallbacks _buildPeopleWithAccessSectionCallbacks(
method _onListenShareWithUserState (line 205) | void _onListenShareWithUserState(
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/access_level_list_widget.dart
class AccessLevelListCallbacks (line 8) | class AccessLevelListCallbacks {
method copyWith (line 33) | AccessLevelListCallbacks copyWith({
type AdditionalUserManagementOptions (line 46) | enum AdditionalUserManagementOptions {
class AccessLevelListWidget (line 55) | class AccessLevelListWidget extends StatelessWidget {
method build (line 77) | Widget build(BuildContext context)
method _buildAccessLevelItem (line 112) | Widget _buildAccessLevelItem(
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/copy_link_widget.dart
class CopyLinkWidget (line 12) | class CopyLinkWidget extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/edit_access_level_widget.dart
class EditAccessLevelWidget (line 8) | class EditAccessLevelWidget extends StatefulWidget {
method createState (line 34) | State<EditAccessLevelWidget> createState()
class _EditAccessLevelWidgetState (line 37) | class _EditAccessLevelWidgetState extends State<EditAccessLevelWidget> {
method dispose (line 41) | void dispose()
method build (line 48) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/general_access_section.dart
class GeneralAccessSection (line 8) | class GeneralAccessSection extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/guest_tag.dart
class GuestTag (line 6) | class GuestTag extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/people_with_access_section.dart
class PeopleWithAccessSectionCallbacks (line 8) | class PeopleWithAccessSectionCallbacks {
class PeopleWithAccessSection (line 34) | class PeopleWithAccessSection extends StatelessWidget {
method build (line 49) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/share_with_user_widget.dart
class ShareWithUserWidget (line 9) | class ShareWithUserWidget extends StatefulWidget {
method createState (line 24) | State<ShareWithUserWidget> createState()
class _ShareWithUserWidgetState (line 27) | class _ShareWithUserWidgetState extends State<ShareWithUserWidget> {
method initState (line 32) | void initState()
method dispose (line 40) | void dispose()
method build (line 49) | Widget build(BuildContext context)
method _onTextChanged (line 85) | void _onTextChanged()
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/shared_group_widget.dart
class SharedGroupWidget (line 11) | class SharedGroupWidget extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
method _buildLeading (line 36) | Widget _buildLeading(BuildContext context)
method _buildTitle (line 51) | Widget _buildTitle(BuildContext context)
method _buildSubtitle (line 77) | Widget _buildSubtitle(BuildContext context)
method _buildTrailing (line 88) | Widget _buildTrailing(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/shared_user_widget.dart
class SharedUserWidget (line 13) | class SharedUserWidget extends StatelessWidget {
method build (line 28) | Widget build(BuildContext context)
method _buildTitle (line 49) | Widget _buildTitle(
method _buildSubtitle (line 89) | Widget _buildSubtitle(
method _buildTrailing (line 101) | Widget _buildTrailing(BuildContext context)
method disabledAccessButton (line 106) | Widget disabledAccessButton()
method editAccessWidget (line 113) | Widget editAccessWidget(List<ShareAccessLevel> supported)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/turn_into_member_widget.dart
class TurnIntoMemberWidget (line 8) | class TurnIntoMemberWidget extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/share_tab/presentation/widgets/upgrade_to_pro_widget.dart
class UpgradeToProWidget (line 11) | class UpgradeToProWidget extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/data/repositories/local_shared_pages_repository_impl.dart
class LocalSharedPagesRepositoryImpl (line 9) | class LocalSharedPagesRepositoryImpl implements SharedPagesRepository {
method getSharedPages (line 11) | Future<FlowyResult<SharedPages, FlowyError>> getSharedPages()
method leaveSharedPage (line 36) | Future<FlowyResult<void, FlowyError>> leaveSharedPage(String pageId)
FILE: frontend/appflowy_flutter/lib/features/shared_section/data/repositories/rust_shared_pages_repository_impl.dart
class RustSharePagesRepositoryImpl (line 10) | class RustSharePagesRepositoryImpl implements SharedPagesRepository {
method getSharedPages (line 12) | Future<FlowyResult<SharedPages, FlowyError>> getSharedPages()
method leaveSharedPage (line 31) | Future<FlowyResult<void, FlowyError>> leaveSharedPage(String pageId)
FILE: frontend/appflowy_flutter/lib/features/shared_section/data/repositories/shared_pages_repository.dart
class SharedPagesRepository (line 9) | abstract class SharedPagesRepository {
method getSharedPages (line 11) | Future<FlowyResult<SharedPages, FlowyError>> getSharedPages()
method leaveSharedPage (line 14) | Future<FlowyResult<void, FlowyError>> leaveSharedPage(String pageId)
FILE: frontend/appflowy_flutter/lib/features/shared_section/logic/shared_section_bloc.dart
class SharedSectionBloc (line 16) | class SharedSectionBloc extends Bloc<SharedSectionEvent, SharedSectionSt...
method close (line 49) | Future<void> close()
method _onInit (line 55) | Future<void> _onInit(
method _onRefresh (line 89) | Future<void> _onRefresh(
method _onUpdateSharedPages (line 113) | void _onUpdateSharedPages(
method _onToggleExpanded (line 124) | void _onToggleExpanded(
method _initFolderNotificationListener (line 135) | void _initFolderNotificationListener()
method _onLeaveSharedPage (line 160) | void _onLeaveSharedPage(
method _startPollingIfNeeded (line 182) | void _startPollingIfNeeded()
FILE: frontend/appflowy_flutter/lib/features/shared_section/logic/shared_section_event.dart
class SharedSectionEvent (line 4) | sealed class SharedSectionEvent {
class SharedSectionInitEvent (line 29) | class SharedSectionInitEvent extends SharedSectionEvent {
class SharedSectionRefreshEvent (line 33) | class SharedSectionRefreshEvent extends SharedSectionEvent {
class SharedSectionUpdateSharedPagesEvent (line 37) | class SharedSectionUpdateSharedPagesEvent extends SharedSectionEvent {
class SharedSectionToggleExpandedEvent (line 45) | class SharedSectionToggleExpandedEvent extends SharedSectionEvent {
class SharedSectionLeaveSharedPageEvent (line 49) | class SharedSectionLeaveSharedPageEvent extends SharedSectionEvent {
FILE: frontend/appflowy_flutter/lib/features/shared_section/logic/shared_section_state.dart
class SharedSectionState (line 3) | class SharedSectionState {
method copyWith (line 18) | SharedSectionState copyWith({
method toString (line 53) | String toString()
FILE: frontend/appflowy_flutter/lib/features/shared_section/models/shared_page.dart
type SharedPages (line 4) | typedef SharedPages = List<SharedPage>;
class SharedPage (line 6) | class SharedPage {
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/m_shared_section.dart
class MSharedSection (line 17) | class MSharedSection extends StatelessWidget {
method build (line 26) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/shared_section.dart
class SharedSection (line 26) | class SharedSection extends StatelessWidget {
method build (line 35) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/m_shared_page_list.dart
class MSharedPageList (line 8) | class MSharedPageList extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/m_shared_section_header.dart
class MSharedSectionHeader (line 10) | class MSharedSectionHeader extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/refresh_button.dart
class RefreshSharedSectionButton (line 4) | class RefreshSharedSectionButton extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/shared_page_actions_button.dart
type SharedPageActionsButtonCallback (line 8) | typedef SharedPageActionsButtonCallback = void Function(
type SharedPageActionsButtonSetEditingCallback (line 14) | typedef SharedPageActionsButtonSetEditingCallback = void Function(
class SharedPageActionsButton (line 19) | class SharedPageActionsButton extends StatefulWidget {
method createState (line 38) | State<SharedPageActionsButton> createState()
class _SharedPageActionsButtonState (line 42) | class _SharedPageActionsButtonState extends State<SharedPageActionsButto...
method initState (line 46) | void initState()
method dispose (line 57) | void dispose()
method build (line 64) | Widget build(BuildContext context)
method _buildMenuItems (line 82) | List<Widget> _buildMenuItems(BuildContext context)
method _buildActionTypes (line 118) | List<ViewMoreActionType> _buildActionTypes()
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/shared_page_list.dart
class SharedPageList (line 13) | class SharedPageList extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
method _buildSharedPageMoreActionButton (line 62) | Widget _buildSharedPageMoreActionButton(
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/shared_section_empty.dart
class SharedSectionEmpty (line 6) | class SharedSectionEmpty extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/shared_section_error.dart
class SharedSectionError (line 4) | class SharedSectionError extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/shared_section_header.dart
class SharedSectionHeader (line 7) | class SharedSectionHeader extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/shared_section/presentation/widgets/shared_section_loading.dart
class SharedSectionLoading (line 4) | class SharedSectionLoading extends StatelessWidget {
method build (line 8) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/features/workspace/data/repositories/rust_workspace_repository_impl.dart
class RustWorkspaceRepositoryImpl (line 12) | class RustWorkspaceRepositoryImpl implements WorkspaceRepository {
method getCurrentWorkspace (line 20) | Future<FlowyResult<WorkspacePB, FlowyError>> getCurrentWorkspace()
method getWorkspaces (line 25) | Future<FlowyResult<List<UserWorkspacePB>, FlowyError>> getWorkspaces()
method createWorkspace (line 30) | Future<FlowyResult<UserWorkspacePB, FlowyError>> createWorkspace({
method deleteWorkspace (line 38) | Future<FlowyResult<void, FlowyError>> deleteWorkspace({
method openWorkspace (line 45) | Future<FlowyResult<void, FlowyError>> openWorkspace({
method renameWorkspace (line 53) | Future<FlowyResult<void, FlowyError>> renameWorkspace({
method updateWorkspaceIcon (line 61) | Future<FlowyResult<void, FlowyError>> updateWorkspaceIcon({
method leaveWorkspace (line 69) | Future<FlowyResult<void, FlowyError>> leaveWorkspace({
method getWorkspaceSubscriptionInfo (line 76) | Future<FlowyResult<WorkspaceSubscriptionInfoPB, FlowyError>>
method isBillingEnabled (line 84) | Future<bool> isBillingEnabled()
FILE: frontend/appflowy_flutter/lib/features/workspace/data/repositories/workspace_repository.dart
class WorkspaceRepository (line 10) | abstract class WorkspaceRepository {
method getCurrentWorkspace (line 12) | Future<FlowyResult<WorkspacePB, FlowyError>> getCurrentWorkspace()
method getWorkspaces (line 15) | Future<FlowyResult<List<UserWorkspacePB>, FlowyError>> getWorkspaces()
method createWorkspace (line 18) | Future<FlowyResult<UserWorkspacePB, FlowyError>> createWorkspace({
method deleteWorkspace (line 24) | Future<FlowyResult<void, FlowyError>> deleteWorkspace({
method openWorkspace (line 29) | Future<FlowyResult<void, FlowyError>> openWorkspace({
method renameWorkspace (line 35) | Future<FlowyResult<void, FlowyError>> renameWorkspace({
method updateWorkspaceIcon (line 41) | Future<FlowyResult<void, FlowyError>> updateWorkspaceIcon({
method leaveWorkspace (line 47) | Future<FlowyResult<void, FlowyError>> leaveWorkspace({
method getWorkspaceSubscriptionInfo (line 52) | Future<FlowyResult<WorkspaceSubscriptionInfoPB, FlowyError>>
method isBillingEnabled (line 58) | Future<bool> isBillingEnabled()
FILE: frontend/appflowy_flutter/lib/features/workspace/logic/workspace_bloc.dart
class _WorkspaceFetchResult (line 25) | class _WorkspaceFetchResult {
class UserWorkspaceBloc (line 37) | class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceSt...
method close (line 69) | Future<void> close()
method _onInitialize (line 74) | Future<void> _onInitialize(
method _onFetchWorkspaces (line 82) | Future<void> _onFetchWorkspaces(
method _onCreateWorkspace (line 116) | Future<void> _onCreateWorkspace(
method _onDeleteWorkspace (line 166) | Future<void> _onDeleteWorkspace(
method _onOpenWorkspace (line 256) | Future<void> _onOpenWorkspace(
method _onRenameWorkspace (line 312) | Future<void> _onRenameWorkspace(
method _onUpdateWorkspaceIcon (line 355) | Future<void> _onUpdateWorkspaceIcon(
method _onLeaveWorkspace (line 411) | Future<void> _onLeaveWorkspace(
method _onFetchWorkspaceSubscriptionInfo (line 455) | Future<void> _onFetchWorkspaceSubscriptionInfo(
method _onUpdateWorkspaceSubscriptionInfo (line 496) | Future<void> _onUpdateWorkspaceSubscriptionInfo(
method _onEmitWorkspaces (line 505) | Future<void> _onEmitWorkspaces(
method _onEmitUserProfile (line 516) | Future<void> _onEmitUserProfile(
method _onEmitCurrentWorkspace (line 525) | Future<void> _onEmitCurrentWorkspace(
method _setupListeners (line 534) | Future<void> _setupListeners()
method _initializeWorkspaces (line 565) | Future<void> _initializeWorkspaces(Emitter<UserWorkspaceState> emit)
method _sortWorkspaces (line 611) | List<UserWorkspacePB> _sortWorkspaces(List<UserWorkspacePB> workspaces)
method _findWorkspaceById (line 619) | UserWorkspacePB? _findWorkspaceById(
method _updateWorkspaceInList (line 627) | List<UserWorkspacePB> _updateWorkspaceInList(
method _fetchWorkspaces (line 639) | Future<_WorkspaceFetchResult> _fetchWorkspaces({
method _convertWorkspacePBToUserWorkspace (line 686) | UserWorkspacePB _convertWorkspacePBToUserWorkspace(WorkspacePB workspace)
FILE: frontend/appflowy_flutter/lib/features/workspace/logic/workspace_event.dart
class UserWorkspaceEvent (line 3) | sealed class UserWorkspaceEvent {
class WorkspaceEventInitialize (line 85) | class WorkspaceEventInitialize extends UserWorkspaceEvent {
class WorkspaceEventFetchWorkspaces (line 90) | class WorkspaceEventFetchWorkspaces extends UserWorkspaceEvent {
class WorkspaceEventCreateWorkspace (line 99) | class WorkspaceEventCreateWorkspace extends UserWorkspaceEvent {
class WorkspaceEventDeleteWorkspace (line 110) | class WorkspaceEventDeleteWorkspace extends UserWorkspaceEvent {
class WorkspaceEventOpenWorkspace (line 119) | class WorkspaceEventOpenWorkspace extends UserWorkspaceEvent {
class WorkspaceEventRenameWorkspace (line 130) | class WorkspaceEventRenameWorkspace extends UserWorkspaceEvent {
class WorkspaceEventUpdateWorkspaceIcon (line 141) | class WorkspaceEventUpdateWorkspaceIcon extends UserWorkspaceEvent {
class WorkspaceEventLeaveWorkspace (line 152) | class WorkspaceEventLeaveWorkspace extends UserWorkspaceEvent {
class WorkspaceEventFetchWorkspaceSubscriptionInfo (line 161) | class WorkspaceEventFetchWorkspaceSubscriptionInfo extends UserWorkspace...
class WorkspaceEventUpdateWorkspaceSubscriptionInfo (line 170) | class WorkspaceEventUpdateWorkspaceSubscriptionInfo extends UserWorkspac...
class WorkspaceEventEmitWorkspaces (line 180) | class WorkspaceEventEmitWorkspaces extends UserWorkspaceEvent {
class WorkspaceEventEmitUserProfile (line 188) | class WorkspaceEventEmitUserProfile extends UserWorkspaceEvent {
class WorkspaceEventEmitCurrentWorkspace (line 196) | class WorkspaceEventEmitCurrentWorkspace extends UserWorkspaceEvent {
FILE: frontend/appflowy_flutter/lib/features/workspace/logic/workspace_state.dart
type WorkspaceActionType (line 5) | enum WorkspaceActionType {
class WorkspaceActionResult (line 17) | class WorkspaceActionResult {
method toString (line 29) | String toString()
class UserWorkspaceState (line 34) | class UserWorkspaceState {
method copyWith (line 56) | UserWorkspaceState copyWith({
method toString (line 100) | String toString()
FILE: frontend/appflowy_flutter/lib/flutter/af_dropdown_menu.dart
type CompareFunction (line 19) | typedef CompareFunction<T> = bool Function(T? left, T? right);
class AFDropdownMenu (line 58) | class AFDropdownMenu<T> extends StatefulWidget {
method createState (line 279) | State<AFDropdownMenu<T>> createState()
class _AFDropdownMenuState (line 282) | class _AFDropdownMenuState<T> extends State<AFDropdownMenu<T>> {
method initState (line 300) | void initState()
method dispose (line 335) | void dispose()
method didUpdateWidget (line 342) | void didUpdateWidget(AFDropdownMenu<T> oldWidget)
method canRequestFocus (line 383) | bool canRequestFocus()
method refreshLeadingPadding (line 400) | void refreshLeadingPadding()
method scrollToHighlight (line 413) | void scrollToHighlight()
method getWidth (line 430) | double? getWidth(GlobalKey key)
method filter (line 439) | List<DropdownMenuEntry<T>> filter(
method search (line 452) | int? search(
method _buildButtons (line 468) | List<Widget> _buildButtons(
method handleUpKeyInvoke (line 559) | void handleUpKeyInvoke(_)
method handleDownKeyInvoke (line 578) | void handleDownKeyInvoke(_)
method handlePressed (line 597) | void handlePressed(MenuController controller)
method build (line 612) | Widget build(BuildContext context)
class _ArrowUpIntent (line 802) | class _ArrowUpIntent extends Intent {
class _ArrowDownIntent (line 806) | class _ArrowDownIntent extends Intent {
class _DropdownMenuBody (line 810) | class _DropdownMenuBody extends MultiChildRenderObjectWidget {
method createRenderObject (line 819) | _RenderDropdownMenuBody createRenderObject(BuildContext context)
method updateRenderObject (line 826) | void updateRenderObject(
class _DropdownMenuBodyParentData (line 834) | class _DropdownMenuBodyParentData extends ContainerBoxParentData<RenderB...
class _RenderDropdownMenuBody (line 836) | class _RenderDropdownMenuBody extends RenderBox
method setupParentData (line 856) | void setupParentData(RenderBox child)
method performLayout (line 863) | void performLayout()
method paint (line 899) | void paint(PaintingContext context, Offset offset)
method computeDryLayout (line 909) | Size computeDryLayout(BoxConstraints constraints)
method computeMinIntrinsicWidth (line 945) | double computeMinIntrinsicWidth(double height)
method computeMaxIntrinsicWidth (line 972) | double computeMaxIntrinsicWidth(double height)
method computeMinIntrinsicHeight (line 1001) | double computeMinIntrinsicHeight(double height)
method computeMaxIntrinsicHeight (line 1011) | double computeMaxIntrinsicHeight(double height)
method hitTestChildren (line 1021) | bool hitTestChildren(BoxHitTestResult result, {required Offset position})
class _DropdownMenuDefaultsM3 (line 1043) | class _DropdownMenuDefaultsM3 extends DropdownMenuThemeData {
FILE: frontend/appflowy_flutter/lib/main.dart
function main (line 5) | Future<void> main()
FILE: frontend/appflowy_flutter/lib/mobile/application/base/mobile_view_page_bloc.dart
class MobileViewPageBloc (line 14) | class MobileViewPageBloc
method close (line 57) | Future<void> close()
method _registerListeners (line 62) | void _registerListeners()
method _isImmersiveMode (line 72) | bool _isImmersiveMode(ViewPB? view)
class MobileViewPageEvent (line 89) | @freezed
class MobileViewPageState (line 96) | @freezed
FILE: frontend/appflowy_flutter/lib/mobile/application/mobile_router.dart
function pushView (line 17) | Future<void> pushView(
function queryParameters (line 72) | Map<String, dynamic> queryParameters([Map<String, dynamic>? arguments])
FILE: frontend/appflowy_flutter/lib/mobile/application/notification/notification_reminder_bloc.dart
class NotificationReminderBloc (line 20) | class NotificationReminderBloc
method _getScheduledAt (line 92) | Future<String> _getScheduledAt(
method _getView (line 104) | Future<ViewPB?> _getView(ReminderPB reminder)
method _getContent (line 109) | Future<Node?> _getContent(ReminderPB reminder)
method _searchById (line 135) | Node? _searchById(Node current, String id)
method _formatTimestamp (line 153) | String _formatTimestamp(
class NotificationReminderEvent (line 180) | @freezed
type NotificationReminderStatus (line 191) | enum NotificationReminderStatus {
class NotificationReminderState (line 198) | @freezed
FILE: frontend/appflowy_flutter/lib/mobile/application/page_style/document_page_style_bloc.dart
class DocumentPageStyleBloc (line 15) | class DocumentPageStyleBloc
method updateLayoutObject (line 114) | Future<void> updateLayoutObject()
method decodeLayoutObject (line 124) | String? decodeLayoutObject()
method calculateIconPadding (line 147) | double calculateIconPadding(
method calculateIconScale (line 169) | double calculateIconScale(
method _getSelectedFontLayout (line 179) | PageStyleFontLayout _getSelectedFontLayout(Map layoutObject)
method _getSelectedLineHeightLayout (line 187) | PageStyleLineHeightLayout _getSelectedLineHeightLayout(Map layoutObject)
method _getSelectedFontFamily (line 195) | String? _getSelectedFontFamily(Map layoutObject)
method _getSelectedCover (line 199) | (PageStyleCoverImageType, String colorValue) _getSelectedCover(
class DocumentPageStyleEvent (line 215) | @freezed
class DocumentPageStyleState (line 232) | @freezed
type PageStyleFontLayout (line 249) | enum PageStyleFontLayout {
type PageStyleLineHeightLayout (line 309) | enum PageStyleLineHeightLayout {
type PageStyleCoverImageType (line 368) | enum PageStyleCoverImageType {
class PageStyleCover (line 415) | class PageStyleCover {
FILE: frontend/appflowy_flutter/lib/mobile/application/recent/recent_view_bloc.dart
class RecentViewBloc (line 14) | class RecentViewBloc extends Bloc<RecentViewEvent, RecentViewState> {
method getCoverV2 (line 120) | PageStyleCover? getCoverV2()
method getCoverV1 (line 125) | Future<(CoverType, String?)> getCoverV1()
method close (line 130) | Future<void> close()
class RecentViewEvent (line 137) | @freezed
class RecentViewState (line 154) | @freezed
FILE: frontend/appflowy_flutter/lib/mobile/application/user_profile/user_profile_bloc.dart
class UserProfileBloc (line 11) | class UserProfileBloc extends Bloc<UserProfileEvent, UserProfileState> {
method _initialize (line 20) | Future<void> _initialize(Emitter<UserProfileState> emit)
class UserProfileEvent (line 50) | @freezed
class UserProfileState (line 55) | @freezed
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/animated_gesture.dart
class AnimatedGestureDetector (line 4) | class AnimatedGestureDetector extends StatefulWidget {
method createState (line 25) | State<AnimatedGestureDetector> createState()
class _AnimatedGestureDetectorState (line 29) | class _AnimatedGestureDetectorState extends State<AnimatedGestureDetecto...
method build (line 33) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/app_bar/app_bar.dart
type FlowyAppBarLeadingType (line 5) | enum FlowyAppBarLeadingType {
class FlowyAppBar (line 33) | class FlowyAppBar extends AppBar {
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/app_bar/app_bar_actions.dart
class AppBarBackButton (line 7) | class AppBarBackButton extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
class AppBarImmersiveBackButton (line 29) | class AppBarImmersiveBackButton extends StatelessWidget {
method build (line 38) | Widget build(BuildContext context)
class AppBarCloseButton (line 54) | class AppBarCloseButton extends StatelessWidget {
method build (line 63) | Widget build(BuildContext context)
class AppBarCancelButton (line 73) | class AppBarCancelButton extends StatelessWidget {
method build (line 82) | Widget build(BuildContext context)
class AppBarDoneButton (line 93) | class AppBarDoneButton extends StatelessWidget {
method build (line 102) | Widget build(BuildContext context)
class AppBarSaveButton (line 116) | class AppBarSaveButton extends StatelessWidget {
method build (line 129) | Widget build(BuildContext context)
class AppBarFilledDoneButton (line 149) | class AppBarFilledDoneButton extends StatelessWidget {
method build (line 155) | Widget build(BuildContext context)
class AppBarMoreButton (line 182) | class AppBarMoreButton extends StatelessWidget {
method build (line 191) | Widget build(BuildContext context)
class AppBarButton (line 200) | class AppBarButton extends StatelessWidget {
method build (line 213) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/flowy_search_text_field.dart
class FlowySearchTextField (line 5) | class FlowySearchTextField extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/mobile_view_page.dart
class MobileViewPage (line 35) | class MobileViewPage extends StatefulWidget {
method createState (line 63) | State<MobileViewPage> createState()
class _MobileViewPageState (line 66) | class _MobileViewPageState extends State<MobileViewPage> {
method initState (line 74) | void initState()
method dispose (line 81) | void dispose()
method build (line 93) | Widget build(BuildContext context)
method _buildApp (line 155) | Widget _buildApp(
method _buildBody (line 193) | Widget _buildBody(BuildContext context, MobileViewPageState state)
method _buildAppBarActions (line 239) | List<Widget> _buildAppBarActions(BuildContext context, ViewPB? view)
method _buildTitle (line 295) | Widget _buildTitle(BuildContext context, ViewPB? view)
method _buildLockStatus (line 338) | Widget _buildLockStatus(BuildContext context, ViewPB? view)
method _buildLockStatusIcon (line 367) | Widget _buildLockStatusIcon(BuildContext context, ViewPB? view)
method _rebuildScrollNotificationObserver (line 431) | void _rebuildScrollNotificationObserver(BuildContext context)
method _onScrollNotification (line 439) | void _onScrollNotification(ScrollNotification notification)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/option_color_list.dart
class OptionColorList (line 7) | class OptionColorList extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/type_option_menu_item.dart
class TypeOptionMenuItemValue (line 5) | class TypeOptionMenuItemValue<T> {
class TypeOptionMenu (line 23) | class TypeOptionMenu<T> extends StatelessWidget {
method build (line 43) | Widget build(BuildContext context)
class TypeOptionMenuItem (line 63) | class TypeOptionMenuItem<T> extends StatelessWidget {
method build (line 83) | Widget build(BuildContext context)
class TypeOptionGridView (line 123) | class TypeOptionGridView extends StatelessWidget {
method build (line 138) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/view_page/app_bar_buttons.dart
class MobileViewPageImmersiveAppBar (line 24) | class MobileViewPageImmersiveAppBar extends StatelessWidget
method build (line 43) | Widget build(BuildContext context)
method _buildTitle (line 61) | Widget _buildTitle(
method _buildAppBarBackButton (line 68) | Widget _buildAppBarBackButton(BuildContext context)
class MobileViewPageMoreButton (line 84) | class MobileViewPageMoreButton extends StatelessWidget {
method build (line 97) | Widget build(BuildContext context)
class MobileViewPageLayoutButton (line 131) | class MobileViewPageLayoutButton extends StatelessWidget {
method build (line 146) | Widget build(BuildContext context)
class _ImmersiveAppBarButton (line 188) | class _ImmersiveAppBarButton extends StatelessWidget {
method build (line 204) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/base/view_page/more_bottom_sheet.dart
class MobileViewPageMoreBottomSheet (line 30) | class MobileViewPageMoreBottomSheet extends StatelessWidget {
method build (line 36) | Widget build(BuildContext context)
method _onAction (line 64) | Future<void> _onAction(
method _lockPage (line 132) | Future<void> _lockPage(
method _publish (line 147) | Future<void> _publish(BuildContext context)
method _duplicate (line 167) | void _duplicate(BuildContext context)
method _addFavorite (line 176) | void _addFavorite(BuildContext context)
method _removeFavorite (line 184) | void _removeFavorite(BuildContext context)
method _toggleFavorite (line 192) | void _toggleFavorite(BuildContext context)
method _unpublish (line 197) | void _unpublish(BuildContext context)
method _copyPublishLink (line 201) | void _copyPublishLink(BuildContext context)
method _visitPublishedSite (line 215) | void _visitPublishedSite(BuildContext context)
method _copyShareLink (line 227) | void _copyShareLink(BuildContext context)
method _onRename (line 251) | void _onRename(BuildContext context, String name)
method _updatePathName (line 257) | void _updatePathName(BuildContext context)
method _showToast (line 324) | void _showToast(BuildContext context, ShareState state)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_action_widget.dart
class BottomSheetActionWidget (line 6) | class BottomSheetActionWidget extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_add_new_page.dart
class AddNewPageWidgetBottomSheet (line 8) | class AddNewPageWidgetBottomSheet extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_block_action_widget.dart
type BlockActionBottomSheetType (line 7) | enum BlockActionBottomSheetType {
class BlockActionBottomSheet (line 15) | class BlockActionBottomSheet extends StatelessWidget {
method build (line 26) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_buttons.dart
class BottomSheetCloseButton (line 7) | class BottomSheetCloseButton extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
class BottomSheetDoneButton (line 33) | class BottomSheetDoneButton extends StatelessWidget {
method build (line 42) | Widget build(BuildContext context)
class BottomSheetRemoveButton (line 58) | class BottomSheetRemoveButton extends StatelessWidget {
method build (line 67) | Widget build(BuildContext context)
class BottomSheetBackButton (line 83) | class BottomSheetBackButton extends StatelessWidget {
method build (line 92) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_drag_handler.dart
class MobileBottomSheetDragHandler (line 3) | class MobileBottomSheetDragHandler extends StatelessWidget {
method build (line 7) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_edit_link_widget.dart
class MobileBottomSheetEditLinkWidget (line 20) | class MobileBottomSheetEditLinkWidget extends StatefulWidget {
method createState (line 37) | State<MobileBottomSheetEditLinkWidget> createState()
class _MobileBottomSheetEditLinkWidgetState (line 41) | class _MobileBottomSheetEditLinkWidgetState
method initState (line 61) | void initState()
method dispose (line 93) | void dispose()
method build (line 102) | Widget build(BuildContext context)
method buildNameTextField (line 146) | Widget buildNameTextField()
method buildLinkField (line 175) | Widget buildLinkField()
method buildPageView (line 227) | Widget buildPageView()
method buildLinkView (line 273) | Widget buildLinkView()
method buildRemoveLink (line 300) | Widget buildRemoveLink()
method onConfirm (line 332) | void onConfirm()
method onPageSelected (line 343) | Future<void> onPageSelected(ViewPB view)
method onLinkSelected (line 366) | void onLinkSelected()
method hideSearchResult (line 376) | void hideSearchResult()
method showSearchResult (line 384) | void showSearchResult()
method getPageView (line 392) | Future<void> getPageView()
method buildCardDecoration (line 403) | BoxDecoration buildCardDecoration()
method buildBorderDecoration (line 410) | BoxDecoration buildBorderDecoration()
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_header.dart
class BottomSheetHeader (line 5) | class BottomSheetHeader extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_media_upload.dart
class MobileMediaUploadSheetContent (line 12) | class MobileMediaUploadSheetContent extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
method _onInsertNetworkFile (line 62) | Future<void> _onInsertNetworkFile(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_rename_widget.dart
class MobileBottomSheetRenameWidget (line 6) | class MobileBottomSheetRenameWidget extends StatefulWidget {
method createState (line 19) | State<MobileBottomSheetRenameWidget> createState()
class _MobileBottomSheetRenameWidgetState (line 23) | class _MobileBottomSheetRenameWidgetState
method initState (line 28) | void initState()
method dispose (line 38) | void dispose()
method build (line 44) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_view_item.dart
type MobileBottomSheetType (line 16) | enum MobileBottomSheetType {
class MobileViewItemBottomSheet (line 21) | class MobileViewItemBottomSheet extends StatefulWidget {
method createState (line 34) | State<MobileViewItemBottomSheet> createState()
class _MobileViewItemBottomSheetState (line 38) | class _MobileViewItemBottomSheetState extends State<MobileViewItemBottom...
method initState (line 43) | void initState()
method build (line 51) | Widget build(BuildContext context)
method _removeFromRecent (line 112) | Future<void> _removeFromRecent(BuildContext context)
method _showConfirmDialog (line 124) | Future<void> _showConfirmDialog({required VoidCallback onDelete})
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_view_item_body.dart
type MobileViewItemBottomSheetBodyAction (line 9) | enum MobileViewItemBottomSheetBodyAction {
class MobileViewItemBottomSheetBody (line 20) | class MobileViewItemBottomSheetBody extends StatelessWidget {
method build (line 33) | Widget build(BuildContext context)
method _buildActionButton (line 41) | Widget _buildActionButton(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/bottom_sheet_view_page.dart
type MobileViewBottomSheetBodyAction (line 16) | enum MobileViewBottomSheetBodyAction {
class MobileViewBottomSheetBodyActionArguments (line 41) | class MobileViewBottomSheetBodyActionArguments {
type MobileViewBottomSheetBodyActionCallback (line 45) | typedef MobileViewBottomSheetBodyActionCallback = void Function(
class ViewPageBottomSheet (line 53) | class ViewPageBottomSheet extends StatefulWidget {
method createState (line 66) | State<ViewPageBottomSheet> createState()
class _ViewPageBottomSheetState (line 69) | class _ViewPageBottomSheetState extends State<ViewPageBottomSheet> {
method build (line 73) | Widget build(BuildContext context)
class MobileViewBottomSheetBody (line 102) | class MobileViewBottomSheetBody extends StatelessWidget {
method build (line 113) | Widget build(BuildContext context)
method _buildPublishActions (line 202) | List<Widget> _buildPublishActions(BuildContext context)
method _divider (line 255) | Widget _divider()
class _LockPageRightIconBuilder (line 258) | class _LockPageRightIconBuilder extends StatelessWidget {
method build (line 266) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/default_mobile_action_pane.dart
type MobilePaneActionType (line 20) | enum MobilePaneActionType {
function buildEndActionPane (line 196) | ActionPane buildEndActionPane(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/show_mobile_bottom_sheet.dart
function bottomSheetPadding (line 10) | double bottomSheetPadding({
function showMobileBottomSheet (line 26) | Future<T?> showMobileBottomSheet<T>(
class BottomSheetHeader (line 211) | class BottomSheetHeader extends StatelessWidget {
method build (line 239) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/bottom_sheet/show_transition_bottom_sheet.dart
function showTransitionMobileBottomSheet (line 11) | Future<T?> showTransitionMobileBottomSheet<T>(
class _CupertinoSheetDecorationBuilder (line 107) | class _CupertinoSheetDecorationBuilder extends StatelessWidget {
method build (line 124) | Widget build(BuildContext context)
class TransitionSheetRoute (line 151) | class TransitionSheetRoute<T> extends SheetRoute<T> {
method createSheetController (line 178) | SheetController createSheetController()
method buildSheet (line 187) | Widget buildSheet(BuildContext context, Widget child)
method buildTransitions (line 212) | Widget buildTransitions(
method canDriveSecondaryTransitionForPreviousRoute (line 243) | bool canDriveSecondaryTransitionForPreviousRoute(
method buildSecondaryTransitionForPreviousRoute (line 249) | Widget buildSecondaryTransitionForPreviousRoute(
class CupertinoSheetBottomRouteTransition (line 279) | @visibleForTesting
method build (line 294) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/chat/mobile_chat_screen.dart
class MobileChatScreen (line 5) | class MobileChatScreen extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/board/mobile_board_page.dart
class MobileBoardPage (line 25) | class MobileBoardPage extends StatefulWidget {
method createState (line 41) | State<MobileBoardPage> createState()
class _MobileBoardPageState (line 44) | class _MobileBoardPageState extends State<MobileBoardPage> {
method initState (line 48) | void initState()
method dispose (line 54) | void dispose()
method build (line 62) | Widget build(BuildContext context)
method _handleDidCreateRow (line 85) | void _handleDidCreateRow()
class _BoardContent (line 106) | class _BoardContent extends StatefulWidget {
method createState (line 110) | State<_BoardContent> createState()
class _BoardContentState (line 113) | class _BoardContentState extends State<_BoardContent> {
method initState (line 117) | void initState()
method dispose (line 123) | void dispose()
method build (line 129) | Widget build(BuildContext context)
method _buildFooter (line 191) | Widget _buildFooter(BuildContext context, AppFlowyGroupData columnData)
method _buildCard (line 229) | Widget _buildCard({
method _makeBoxDecoration (line 286) | BoxDecoration _makeBoxDecoration(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/board/mobile_board_screen.dart
class MobileBoardScreen (line 5) | class MobileBoardScreen extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/board/widgets/group_card_header.dart
class GroupCardHeader (line 15) | class GroupCardHeader extends StatefulWidget {
method createState (line 24) | State<GroupCardHeader> createState()
class _GroupCardHeaderState (line 27) | class _GroupCardHeaderState extends State<GroupCardHeader> {
method dispose (line 39) | void dispose()
method build (line 45) | Widget build(BuildContext context)
method _buildHeaderIcon (line 174) | Widget _buildHeaderIcon(GroupData customData)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/board/widgets/mobile_board_trailing.dart
class MobileBoardTrailing (line 9) | class MobileBoardTrailing extends StatefulWidget {
method createState (line 13) | State<MobileBoardTrailing> createState()
class _MobileBoardTrailingState (line 16) | class _MobileBoardTrailingState extends State<MobileBoardTrailing> {
method dispose (line 22) | void dispose()
method build (line 28) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/board/widgets/mobile_hidden_groups_column.dart
class MobileHiddenGroupsColumn (line 20) | class MobileHiddenGroupsColumn extends StatelessWidget {
method build (line 26) | Widget build(BuildContext context)
method _collapseExpandIcon (line 84) | Widget _collapseExpandIcon(BuildContext context, bool isCollapsed)
class MobileHiddenGroupList (line 103) | class MobileHiddenGroupList extends StatelessWidget {
method build (line 112) | Widget build(BuildContext context)
class MobileHiddenGroup (line 148) | class MobileHiddenGroup extends StatelessWidget {
method build (line 159) | Widget build(BuildContext context)
method _titleCellStyle (line 238) | TextCardCellStyle _titleCellStyle(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/card/card_detail/mobile_card_detail_screen.dart
class MobileRowDetailPage (line 38) | class MobileRowDetailPage extends StatefulWidget {
method createState (line 53) | State<MobileRowDetailPage> createState()
class _MobileRowDetailPageState (line 56) | class _MobileRowDetailPageState extends State<MobileRowDetailPage> {
method initState (line 68) | void initState()
method dispose (line 80) | void dispose()
method build (line 86) | Widget build(BuildContext context)
method _showCardActions (line 139) | void _showCardActions(BuildContext context)
method _performAction (line 218) | void _performAction(String viewId, String? rowId, bool deleteRow)
method _onInsertNetworkFile (line 238) | Future<void> _onInsertNetworkFile(
class RowDetailFab (line 271) | class RowDetailFab extends StatelessWidget {
method build (line 282) | Widget build(BuildContext context)
class MobileRowDetailPageContent (line 363) | class MobileRowDetailPageContent extends StatefulWidget {
method createState (line 374) | State<MobileRowDetailPageContent> createState()
class MobileRowDetailPageContentState (line 378) | class MobileRowDetailPageContentState
method initState (line 392) | void initState()
method build (line 408) | Widget build(BuildContext context)
class _TitleSkin (line 543) | class _TitleSkin extends IEditableTextCellSkin {
method build (line 545) | Widget build(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/card/card_detail/widgets/mobile_create_field_button.dart
class MobileRowDetailCreateFieldButton (line 10) | class MobileRowDetailCreateFieldButton extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/card/card_detail/widgets/mobile_row_property_list.dart
class MobileRowPropertyList (line 11) | class MobileRowPropertyList extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
method _isCellPrimary (line 45) | bool _isCellPrimary(CellContext cell)
class _PropertyCell (line 49) | class _PropertyCell extends StatefulWidget {
method createState (line 62) | State<StatefulWidget> createState()
class _PropertyCellState (line 65) | class _PropertyCellState extends State<_PropertyCell> {
method build (line 67) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/card/card_detail/widgets/option_text_field.dart
class OptionTextField (line 10) | class OptionTextField extends StatelessWidget {
method build (line 29) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/card/card_detail/widgets/row_page_button.dart
class OpenRowPageButton (line 21) | class OpenRowPageButton extends StatefulWidget {
method createState (line 35) | State<OpenRowPageButton> createState()
class _OpenRowPageButtonState (line 38) | class _OpenRowPageButtonState extends State<OpenRowPageButton> {
method initState (line 49) | void initState()
method build (line 56) | Widget build(BuildContext context)
method _openRowPage (line 102) | Future<void> _openRowPage(BuildContext context, String fieldName)
method _preloadView (line 126) | Future<void> _preloadView(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/card/mobile_card_content.dart
class MobileCardContent (line 10) | class MobileCardContent extends StatelessWidget {
method build (line 27) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/date_picker/mobile_date_picker_screen.dart
class MobileDateCellEditScreen (line 14) | class MobileDateCellEditScreen extends StatefulWidget {
method createState (line 33) | State<MobileDateCellEditScreen> createState()
class _MobileDateCellEditScreenState (line 37) | class _MobileDateCellEditScreenState extends State<MobileDateCellEditScr...
method build (line 39) | Widget build(BuildContext context)
method _buildFullScreen (line 42) | Widget _buildFullScreen()
method _buildNotFullScreen (line 49) | Widget _buildNotFullScreen()
method _buildDatePicker (line 73) | Widget _buildDatePicker()
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/field/mobile_create_field_screen.dart
class MobileNewPropertyScreen (line 11) | class MobileNewPropertyScreen extends StatefulWidget {
method createState (line 26) | State<MobileNewPropertyScreen> createState()
class _MobileNewPropertyScreenState (line 30) | class _MobileNewPropertyScreenState extends State<MobileNewPropertyScree...
method initState (line 34) | void initState()
method build (line 46) | Widget build(BuildContext context)
class _SaveButton (line 71) | class _SaveButton extends StatelessWidget {
method build (line 79) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/field/mobile_edit_field_screen.dart
class MobileEditPropertyScreen (line 12) | class MobileEditPropertyScreen extends StatefulWidget {
method createState (line 27) | State<MobileEditPropertyScreen> createState()
class _MobileEditPropertyScreenState (line 31) | class _MobileEditPropertyScreenState extends State<MobileEditPropertyScr...
method initState (line 36) | void initState()
method build (line 46) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/field/mobile_field_bottom_sheets.dart
function showFieldTypeGridBottomSheet (line 36) | Future<FieldType?> showFieldTypeGridBottomSheet(
function mobileCreateFieldWorkflow (line 77) | void mobileCreateFieldWorkflow(
function showEditFieldScreen (line 104) | Future<FieldOptionValues?> showEditFieldScreen(
function showQuickEditField (line 119) | void showQuickEditField(
function showFieldPicker (line 141) | Future<String?> showFieldPicker(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/field/mobile_field_picker_list.dart
class MobileFieldPickerList (line 11) | class MobileFieldPickerList extends StatefulWidget {
method createState (line 25) | State<MobileFieldPickerList> createState()
class _MobileFieldPickerListState (line 28) | class _MobileFieldPickerListState extends State<MobileFieldPickerList> {
method initState (line 32) | void initState()
method build (line 38) | Widget build(BuildContext context)
class _Header (line 76) | class _Header extends StatelessWidget {
method build (line 86) | Widget build(BuildContext context)
class _FieldButton (line 116) | class _FieldButton extends StatelessWidget {
method build (line 130) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/field/mobile_full_field_editor.dart
type FieldOptionMode (line 29) | enum FieldOptionMode {
class FieldOptionValues (line 34) | class FieldOptionValues {
method create (line 107) | Future<void> create({
method getTypeOptionData (line 120) | Uint8List? getTypeOptionData()
type FieldOptionAction (line 161) | enum FieldOptionAction {
class MobileFieldEditor (line 168) | class MobileFieldEditor extends StatefulWidget {
method createState (line 191) | State<MobileFieldEditor> createState()
class _MobileFieldEditorState (line 194) | class _MobileFieldEditorState extends State<MobileFieldEditor> {
method initState (line 201) | void initState()
method dispose (line 208) | void dispose()
method build (line 214) | Widget build(BuildContext context)
method _buildOption (line 279) | List<Widget> _buildOption()
method _buildOptionActions (line 359) | List<Widget> _buildOptionActions()
method _updateOptionValues (line 400) | void _updateOptionValues({
class _PropertyType (line 435) | class _PropertyType extends StatelessWidget {
method build (line 445) | Widget build(BuildContext context)
class _Divider (line 481) | class _Divider extends StatelessWidget {
method build (line 485) | Widget build(BuildContext context)
class _DateOption (line 492) | class _DateOption extends StatefulWidget {
method createState (line 502) | State<_DateOption> createState()
class _DateOptionState (line 505) | class _DateOptionState extends State<_DateOption> {
method initState (line 509) | void initState()
method build (line 516) | Widget build(BuildContext context)
class _TimeOption (line 546) | class _TimeOption extends StatefulWidget {
method createState (line 556) | State<_TimeOption> createState()
class _TimeOptionState (line 559) | class _TimeOptionState extends State<_TimeOption> {
method initState (line 563) | void initState()
method build (line 570) | Widget build(BuildContext context)
class _IncludeTimeOption (line 600) | class _IncludeTimeOption extends StatefulWidget {
method createState (line 610) | State<_IncludeTimeOption> createState()
class _IncludeTimeOptionState (line 613) | class _IncludeTimeOptionState extends State<_IncludeTimeOption> {
method build (line 617) | Widget build(BuildContext context)
class _NumberOption (line 631) | class _NumberOption extends StatelessWidget {
method build (line 641) | Widget build(BuildContext context)
class _NumberFormatList (line 683) | class _NumberFormatList extends StatefulWidget {
method createState (line 695) | State<_NumberFormatList> createState()
class _NumberFormatListState (line 698) | class _NumberFormatListState extends State<_NumberFormatList> {
method build (line 702) | Widget build(BuildContext context)
class _SelectOption (line 767) | class _SelectOption extends StatelessWidget {
method build (line 783) | Widget build(BuildContext context)
class _SelectOptionList (line 823) | class _SelectOptionList extends StatefulWidget {
method createState (line 833) | State<_SelectOptionList> createState()
class _SelectOptionListState (line 836) | class _SelectOptionListState extends State<_SelectOptionList> {
method initState (line 840) | void initState()
method didUpdateWidget (line 847) | void didUpdateWidget(covariant _SelectOptionList oldWidget)
method dispose (line 854) | void dispose()
method build (line 859) | Widget build(BuildContext context)
method _updateOption (line 883) | void _updateOption(int index, SelectOptionPB option)
class _SelectOptionTile (line 891) | class _SelectOptionTile extends StatefulWidget {
method createState (line 905) | State<_SelectOptionTile> createState()
class _SelectOptionTileState (line 908) | class _SelectOptionTileState extends State<_SelectOptionTile> {
method initState (line 913) | void initState()
method dispose (line 921) | void dispose()
method build (line 927) | Widget build(BuildContext context)
class _SelectOptionColor (line 955) | class _SelectOptionColor extends StatelessWidget {
method build (line 965) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/field/mobile_quick_field_editor.dart
class QuickEditField (line 19) | class QuickEditField extends StatefulWidget {
method createState (line 32) | State<QuickEditField> createState()
class _QuickEditFieldState (line 35) | class _QuickEditFieldState extends State<QuickEditField> {
method initState (line 46) | void initState()
method dispose (line 54) | void dispose()
method build (line 60) | Widget build(BuildContext context)
class _Divider (line 186) | class _Divider extends StatelessWidget {
method build (line 190) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/mobile_calendar_events_empty.dart
class MobileCalendarEventsEmpty (line 8) | class MobileCalendarEventsEmpty extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/mobile_calendar_events_screen.dart
class MobileCalendarEventsScreen (line 13) | class MobileCalendarEventsScreen extends StatefulWidget {
method createState (line 39) | State<MobileCalendarEventsScreen> createState()
class _MobileCalendarEventsScreenState (line 43) | class _MobileCalendarEventsScreenState
method build (line 48) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/mobile_calendar_screen.dart
class MobileCalendarScreen (line 5) | class MobileCalendarScreen extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/mobile_grid_screen.dart
class MobileGridScreen (line 6) | class MobileGridScreen extends StatelessWidget {
method build (line 25) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_field_list.dart
class MobileDatabaseFieldList (line 21) | class MobileDatabaseFieldList extends StatelessWidget {
method build (line 32) | Widget build(BuildContext context)
class _MobileDatabaseFieldListBody (line 41) | class _MobileDatabaseFieldListBody extends StatelessWidget {
method build (line 53) | Widget build(BuildContext context)
class DatabaseFieldListTile (line 137) | class DatabaseFieldListTile extends StatelessWidget {
method build (line 152) | Widget build(BuildContext context)
class _NewDatabaseFieldTile (line 187) | class _NewDatabaseFieldTile extends StatelessWidget {
method build (line 193) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_filter_bottom_sheet.dart
class MobileFilterEditor (line 30) | class MobileFilterEditor extends StatefulWidget {
method createState (line 34) | State<MobileFilterEditor> createState()
class _MobileFilterEditorState (line 37) | class _MobileFilterEditorState extends State<MobileFilterEditor> {
method dispose (line 42) | void dispose()
method build (line 49) | Widget build(BuildContext context)
class _Header (line 78) | class _Header extends StatelessWidget {
method build (line 82) | Widget build(BuildContext context)
method _isBackButtonShown (line 127) | bool _isBackButtonShown(MobileFilterEditorState state)
method _isSaveButtonShown (line 134) | bool _isSaveButtonShown(MobileFilterEditorState state)
method _isSaveButtonEnabled (line 142) | bool _isSaveButtonEnabled(MobileFilterEditorState state)
method _saveOnTapHandler (line 150) | void _saveOnTapHandler(BuildContext context, MobileFilterEditorState s...
class _ActiveFilters (line 168) | class _ActiveFilters extends StatelessWidget {
method build (line 176) | Widget build(BuildContext context)
method _emptyBackground (line 199) | Widget _emptyBackground(BuildContext context)
method _filterList (line 218) | Widget _filterList(BuildContext context, FilterEditorState state)
class _CreateFilterButton (line 254) | class _CreateFilterButton extends StatelessWidget {
method build (line 258) | Widget build(BuildContext context)
class _FilterItem (line 305) | class _FilterItem extends StatelessWidget {
method build (line 315) | Widget build(BuildContext context)
method _deleteButton (line 397) | Widget _deleteButton(BuildContext context)
class FilterItemInnerButton (line 419) | class FilterItemInnerButton extends StatelessWidget {
method build (line 432) | Widget build(BuildContext context)
class FilterItemInnerTextField (line 472) | class FilterItemInnerTextField extends StatefulWidget {
method createState (line 485) | State<FilterItemInnerTextField> createState()
class _FilterItemInnerTextFieldState (line 489) | class _FilterItemInnerTextFieldState extends State<FilterItemInnerTextFi...
method dispose (line 496) | void dispose()
method build (line 503) | Widget build(BuildContext context)
method _getBorder (line 527) | InputBorder _getBorder(Color color)
class _FilterDetail (line 538) | class _FilterDetail extends StatelessWidget {
method build (line 542) | Widget build(BuildContext context)
class _FilterableFieldList (line 601) | class _FilterableFieldList extends StatelessWidget {
method build (line 609) | Widget build(BuildContext context)
class _FilterConditionList (line 651) | class _FilterConditionList extends StatelessWidget {
method build (line 661) | Widget build(BuildContext context)
method _isSelected (line 726) | bool _isSelected(DatabaseFilter filter, ProtobufEnum condition)
method _updateCondition (line 741) | DatabaseFilter _updateCondition(
class _DateTimeFilterConditionList (line 763) | class _DateTimeFilterConditionList extends StatelessWidget {
method build (line 771) | Widget build(BuildContext context)
class _DateTimeFilterIsStartSelector (line 839) | class _DateTimeFilterIsStartSelector extends StatelessWidget {
method build (line 849) | Widget build(BuildContext context)
method _tab (line 885) | Tab _tab(String name)
class _FilterContentEditor (line 898) | class _FilterContentEditor extends StatelessWidget {
method build (line 908) | Widget build(BuildContext context)
class _SelectOptionFilterContentEditor (line 932) | class _SelectOptionFilterContentEditor extends StatefulWidget {
method createState (line 943) | State<_SelectOptionFilterContentEditor> createState()
class _SelectOptionFilterContentEditorState (line 947) | class _SelectOptionFilterContentEditorState
method initState (line 954) | void initState()
method dispose (line 960) | void dispose()
method build (line 966) | Widget build(BuildContext context)
method filterOptions (line 1016) | void filterOptions()
method _onTapHandler (line 1030) | void _onTapHandler(
method _updateSelectOptions (line 1045) | void _updateSelectOptions(
class _DateTimeFilterContentEditor (line 1057) | class _DateTimeFilterContentEditor extends StatefulWidget {
method createState (line 1065) | State<_DateTimeFilterContentEditor> createState()
class _DateTimeFilterContentEditorState (line 1069) | class _DateTimeFilterContentEditorState
method initState (line 1076) | void initState()
method build (line 1083) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_filter_bottom_sheet_cubit.dart
class MobileFilterEditorCubit (line 8) | class MobileFilterEditorCubit extends Cubit<MobileFilterEditorState> {
method returnToOverview (line 15) | void returnToOverview({bool scrollToBottom = false})
method startCreatingFilter (line 20) | void startCreatingFilter()
method startEditingFilterField (line 25) | void startEditingFilterField(String filterId)
method updateFilter (line 30) | void updateFilter(DatabaseFilter filter)
method startEditingFilterCondition (line 48) | void startEditingFilterCondition(
method startEditingFilterContent (line 63) | void startEditingFilterContent(String filterId, DatabaseFilter filter)
method _animateToPage (line 73) | Future<void> _animateToPage(int page)
class MobileFilterEditorState (line 82) | @freezed
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_filter_condition_list.dart
class FilterCondition (line 8) | abstract class FilterCondition<C> {
method fromFieldType (line 9) | FilterCondition fromFieldType(FieldType fieldType)
function as (line 25) | FilterCondition<T> as<T>()
class TextFilterCondition (line 28) | final class TextFilterCondition
class NumberFilterCondition (line 46) | final class NumberFilterCondition
class CheckboxFilterCondition (line 64) | final class CheckboxFilterCondition
class ChecklistFilterCondition (line 76) | final class ChecklistFilterCondition
class SingleSelectOptionFilterCondition (line 88) | final class SingleSelectOptionFilterCondition
class MultiSelectOptionFilterCondition (line 102) | final class MultiSelectOptionFilterCondition
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_sort_bottom_sheet.dart
class MobileSortEditor (line 21) | class MobileSortEditor extends StatefulWidget {
method createState (line 27) | State<MobileSortEditor> createState()
class _MobileSortEditorState (line 30) | class _MobileSortEditorState extends State<MobileSortEditor> {
method dispose (line 34) | void dispose()
method build (line 40) | Widget build(BuildContext context)
class _Header (line 72) | class _Header extends StatelessWidget {
method build (line 76) | Widget build(BuildContext context)
method _tryCreateSort (line 124) | void _tryCreateSort(BuildContext context, MobileSortEditorState state)
class _Overview (line 136) | class _Overview extends StatelessWidget {
method build (line 140) | Widget build(BuildContext context)
class _SortItem (line 236) | class _SortItem extends StatelessWidget {
method build (line 242) | Widget build(BuildContext context)
class _SortDetail (line 391) | class _SortDetail extends StatelessWidget {
method build (line 395) | Widget build(BuildContext context)
class _SortDetailContent (line 414) | class _SortDetailContent extends StatelessWidget {
method build (line 424) | Widget build(BuildContext context)
method _changeCondition (line 556) | void _changeCondition(BuildContext context, SortConditionPB newCondition)
method _changeFieldId (line 569) | void _changeFieldId(BuildContext context, String newFieldId)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_sort_bottom_sheet_cubit.dart
class MobileSortEditorCubit (line 8) | class MobileSortEditorCubit extends Cubit<MobileSortEditorState> {
method returnToOverview (line 15) | void returnToOverview()
method startCreatingSort (line 20) | void startCreatingSort()
method startEditingSort (line 31) | void startEditingSort(String sortId)
method changeFieldId (line 42) | void changeFieldId(String fieldId)
method changeSortCondition (line 47) | void changeSortCondition(SortConditionPB condition)
method _animateToPage (line 51) | Future<void> _animateToPage(int page)
class MobileSortEditorState (line 60) | @freezed
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_view_layout.dart
class DatabaseViewLayoutPicker (line 18) | class DatabaseViewLayoutPicker extends StatelessWidget {
method build (line 29) | Widget build(BuildContext context)
method _buildButton (line 41) | Widget _buildButton(DatabaseLayoutPB layout, bool showTopBorder)
class MobileCalendarViewLayoutSettings (line 57) | class MobileCalendarViewLayoutSettings extends StatelessWidget {
method build (line 66) | Widget build(BuildContext context)
method _startWeek (line 96) | List<Widget> _startWeek(BuildContext context, int? firstDayOfWeek)
method _divider (line 133) | Widget _divider()
class _CalendarLayoutField (line 136) | class _CalendarLayoutField extends StatelessWidget {
method build (line 148) | Widget build(BuildContext context)
class MobileBoardViewLayoutSettings (line 190) | class MobileBoardViewLayoutSettings extends StatelessWidget {
method build (line 199) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_view_list.dart
class MobileDatabaseViewList (line 27) | class MobileDatabaseViewList extends StatelessWidget {
method build (line 31) | Widget build(BuildContext context)
class _Header (line 78) | class _Header extends StatelessWidget {
method build (line 92) | Widget build(BuildContext context)
class MobileDatabaseViewListButton (line 130) | @visibleForTesting
method build (line 142) | Widget build(BuildContext context)
method _buildViewIconButton (line 167) | Widget _buildViewIconButton(BuildContext context, ViewPB view)
method _trailing (line 185) | Widget _trailing(
class MobileNewDatabaseViewButton (line 233) | class MobileNewDatabaseViewButton extends StatelessWidget {
method build (line 237) | Widget build(BuildContext context)
class MobileCreateDatabaseView (line 264) | class MobileCreateDatabaseView extends StatefulWidget {
method createState (line 268) | State<MobileCreateDatabaseView> createState()
class _MobileCreateDatabaseViewState (line 272) | class _MobileCreateDatabaseViewState extends State<MobileCreateDatabaseV...
method initState (line 277) | void initState()
method dispose (line 285) | void dispose()
method build (line 291) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/database_view_quick_actions.dart
class MobileDatabaseViewQuickActions (line 22) | class MobileDatabaseViewQuickActions extends StatelessWidget {
method build (line 33) | Widget build(BuildContext context)
method _actionButton (line 119) | Widget _actionButton(
type _Action (line 136) | enum _Action {
FILE: frontend/appflowy_flutter/lib/mobile/presentation/database/view/edit_database_view_screen.dart
class MobileEditDatabaseViewScreen (line 24) | class MobileEditDatabaseViewScreen extends StatelessWidget {
method build (line 33) | Widget build(BuildContext context)
method _divider (line 64) | Widget _divider()
class _NameAndIcon (line 67) | class _NameAndIcon extends StatefulWidget {
method createState (line 73) | State<_NameAndIcon> createState()
class _NameAndIconState (line 76) | class _NameAndIconState extends State<_NameAndIcon> {
method initState (line 80) | void initState()
method dispose (line 86) | void dispose()
method build (line 92) | Widget build(BuildContext context)
type DatabaseViewSettings (line 106) | enum DatabaseViewSettings {
class DatabaseViewSettingTile (line 143) | class DatabaseViewSettingTile extends StatelessWidget {
method build (line 158) | Widget build(BuildContext context)
method _trailing (line 168) | Widget _trailing(
method _onTap (line 207) | void _onTap(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/editor/mobile_editor_screen.dart
class MobileDocumentScreen (line 6) | class MobileDocumentScreen extends StatelessWidget {
method build (line 34) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/favorite/mobile_favorite_folder.dart
class MobileFavoritePageFolder (line 15) | class MobileFavoritePageFolder extends StatelessWidget {
method build (line 24) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/favorite/mobile_favorite_page.dart
class MobileFavoriteScreen (line 16) | class MobileFavoriteScreen extends StatelessWidget {
method build (line 24) | Widget build(BuildContext context)
class MobileFavoritePage (line 83) | class MobileFavoritePage extends StatelessWidget {
method build (line 92) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/favorite_folder/favorite_space.dart
class MobileFavoriteSpace (line 15) | class MobileFavoriteSpace extends StatefulWidget {
method createState (line 24) | State<MobileFavoriteSpace> createState()
class _MobileFavoriteSpaceState (line 27) | class _MobileFavoriteSpaceState extends State<MobileFavoriteSpace>
method build (line 33) | Widget build(BuildContext context)
class _FavoriteViews (line 87) | class _FavoriteViews extends StatelessWidget {
method build (line 95) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/favorite_folder/mobile_home_favorite_folder.dart
class MobileFavoriteFolder (line 11) | class MobileFavoriteFolder extends StatelessWidget {
method build (line 24) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/favorite_folder/mobile_home_favorite_folder_header.dart
class MobileFavoriteFolderHeader (line 6) | class MobileFavoriteFolderHeader extends StatefulWidget {
method createState (line 19) | State<MobileFavoriteFolderHeader> createState()
class _MobileFavoriteFolderHeaderState (line 23) | class _MobileFavoriteFolderHeaderState
method build (line 28) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/home_space/home_space.dart
class MobileHomeSpace (line 8) | class MobileHomeSpace extends StatefulWidget {
method createState (line 14) | State<MobileHomeSpace> createState()
class _MobileHomeSpaceState (line 17) | class _MobileHomeSpaceState extends State<MobileHomeSpace>
method build (line 23) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/mobile_folders.dart
class MobileFolders (line 16) | class MobileFolders extends StatelessWidget {
method build (line 29) | Widget build(BuildContext context)
class _MobileFolder (line 57) | class _MobileFolder extends StatefulWidget {
method createState (line 61) | State<_MobileFolder> createState()
class _MobileFolderState (line 64) | class _MobileFolderState extends State<_MobileFolder> {
method build (line 66) | Widget build(BuildContext context)
method _buildSpaceOrSection (line 81) | List<Widget> _buildSpaceOrSection(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/mobile_home_page.dart
class MobileHomeScreen (line 32) | class MobileHomeScreen extends StatelessWidget {
method build (line 38) | Widget build(BuildContext context)
class MobileHomePage (line 88) | class MobileHomePage extends StatefulWidget {
method createState (line 99) | State<MobileHomePage> createState()
class _MobileHomePageState (line 102) | class _MobileHomePageState extends State<MobileHomePage> {
method initState (line 106) | void initState()
method dispose (line 114) | void dispose()
method build (line 121) | Widget build(BuildContext context)
method _onLatestViewChange (line 144) | void _onLatestViewChange()
class _HomePage (line 153) | class _HomePage extends StatefulWidget {
method createState (line 159) | State<_HomePage> createState()
class _HomePageState (line 162) | class _HomePageState extends State<_HomePage> {
method build (line 166) | Widget build(BuildContext context)
method _showResultDialog (line 253) | void _showResultDialog(BuildContext context, UserWorkspaceState state)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/mobile_home_page_header.dart
class MobileHomePageHeader (line 23) | class MobileHomePageHeader extends StatelessWidget {
method build (line 32) | Widget build(BuildContext context)
class _MobileUser (line 63) | class _MobileUser extends StatelessWidget {
method build (line 71) | Widget build(BuildContext context)
class _MobileWorkspace (line 99) | class _MobileWorkspace extends StatelessWidget {
method build (line 107) | Widget build(BuildContext context)
method _showSwitchWorkspacesBottomSheet (line 158) | void _showSwitchWorkspacesBottomSheet(
class _UserIcon (line 209) | class _UserIcon extends StatelessWidget {
method build (line 217) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/mobile_home_setting_page.dart
class MobileHomeSettingPage (line 23) | class MobileHomeSettingPage extends StatefulWidget {
method createState (line 31) | State<MobileHomeSettingPage> createState()
class _MobileHomeSettingPageState (line 34) | class _MobileHomeSettingPageState extends State<MobileHomeSettingPage> {
method build (line 36) | Widget build(BuildContext context)
method _buildErrorWidget (line 67) | Widget _buildErrorWidget(String? errorMsg)
method _buildSettingsWidget (line 76) | Widget _buildSettingsWidget(UserProfilePB userProfile)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/mobile_home_trash_page.dart
class MobileHomeTrashPage (line 14) | class MobileHomeTrashPage extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
type _TrashActionType (line 76) | enum _TrashActionType {
class _EmptyTrashBin (line 81) | class _EmptyTrashBin extends StatelessWidget {
method build (line 85) | Widget build(BuildContext context)
class _TrashActionAllButton (line 116) | class _TrashActionAllButton extends StatelessWidget {
method build (line 126) | Widget build(BuildContext context)
class _DeletedFilesListView (line 185) | class _DeletedFilesListView extends StatelessWidget {
method build (line 192) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/recent_folder/mobile_home_recent_views.dart
class MobileRecentFolder (line 16) | class MobileRecentFolder extends StatefulWidget {
method createState (line 20) | State<MobileRecentFolder> createState()
class _MobileRecentFolderState (line 23) | class _MobileRecentFolderState extends State<MobileRecentFolder> {
method build (line 25) | Widget build(BuildContext context)
class _RecentViews (line 68) | class _RecentViews extends StatelessWidget {
method build (line 77) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/recent_folder/mobile_recent_view.dart
class MobileRecentView (line 21) | class MobileRecentView extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
method _buildCover (line 70) | Widget _buildCover(BuildContext context, RecentViewState state)
method _buildTitle (line 87) | Widget _buildTitle(BuildContext context, RecentViewState state)
method _buildIcon (line 109) | Widget _buildIcon(BuildContext context, RecentViewState state)
class _RecentCover (line 122) | class _RecentCover extends StatelessWidget {
method build (line 134) | Widget build(BuildContext context)
method _buildCoverV2 (line 150) | Widget _buildCoverV2(BuildContext context, String value, Widget placeh...
method _buildCoverV1 (line 198) | Widget _buildCoverV1(BuildContext context, String value, Widget placeh...
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/recent_folder/recent_space.dart
class MobileRecentSpace (line 12) | class MobileRecentSpace extends StatefulWidget {
method createState (line 16) | State<MobileRecentSpace> createState()
class _MobileRecentSpaceState (line 19) | class _MobileRecentSpaceState extends State<MobileRecentSpace>
method build (line 25) | Widget build(BuildContext context)
method _filterRecentViews (line 50) | List<SectionViewPB> _filterRecentViews(List<SectionViewPB> recentViews)
class _RecentViews (line 58) | class _RecentViews extends StatelessWidget {
method build (line 66) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/section_folder/mobile_home_section_folder.dart
class MobileSectionFolder (line 16) | class MobileSectionFolder extends StatelessWidget {
method build (line 29) | Widget build(BuildContext context)
method _createNewPage (line 67) | void _createNewPage(BuildContext context)
class _Pages (line 81) | class _Pages extends StatelessWidget {
method build (line 91) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/section_folder/mobile_home_section_folder_header.dart
class MobileSectionFolderHeader (line 9) | class MobileSectionFolderHeader extends StatefulWidget {
method createState (line 24) | State<MobileSectionFolderHeader> createState()
class _MobileSectionFolderHeaderState (line 28) | class _MobileSectionFolderHeaderState extends State<MobileSectionFolderH...
method build (line 32) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/setting/settings_popup_menu.dart
type _MobileSettingsPopupMenuItem (line 14) | enum _MobileSettingsPopupMenuItem {
class HomePageSettingsPopupMenu (line 22) | class HomePageSettingsPopupMenu extends StatelessWidget {
method build (line 31) | Widget build(BuildContext context)
method _buildItem (line 106) | PopupMenuItem<T> _buildItem<T>({
method _openMembersPage (line 121) | void _openMembersPage(BuildContext context)
method _openTrashPage (line 125) | void _openTrashPage(BuildContext context)
method _openHelpPage (line 129) | void _openHelpPage(BuildContext context)
method _openSettingsPage (line 133) | void _openSettingsPage(BuildContext context)
method _openHelpAndDocumentationPage (line 137) | void _openHelpAndDocumentationPage(BuildContext context)
class _PopupButton (line 142) | class _PopupButton extends StatelessWidget {
method build (line 152) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/shared/empty_placeholder.dart
class EmptySpacePlaceholder (line 8) | class EmptySpacePlaceholder extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/shared/mobile_page_card.dart
type MobilePageCardType (line 35) | enum MobilePageCardType {
class MobileViewPage (line 45) | class MobileViewPage extends StatelessWidget {
method build (line 58) | Widget build(BuildContext context)
method _buildDescription (line 114) | Widget _buildDescription(BuildContext context, RecentViewState state)
method _buildNameAndLastViewed (line 128) | Widget _buildNameAndLastViewed(BuildContext context, RecentViewState s...
method _buildAvatar (line 146) | Widget _buildAvatar(BuildContext context, RecentViewState state)
method _buildCover (line 170) | Widget _buildCover(BuildContext context, RecentViewState state)
method _buildTitle (line 182) | Widget _buildTitle(BuildContext context, RecentViewState state)
method _buildAuthor (line 217) | Widget _buildAuthor(BuildContext context, RecentViewState state)
method _buildLastViewed (line 227) | Widget _buildLastViewed(BuildContext context)
method _formatTimestamp (line 245) | String _formatTimestamp(BuildContext context, int timestamp)
class _ViewCover (line 277) | class _ViewCover extends StatelessWidget {
method build (line 291) | Widget build(BuildContext context)
method _buildPlaceholder (line 303) | Widget _buildPlaceholder(BuildContext context)
method _buildCoverV2 (line 342) | Widget _buildCoverV2(BuildContext context, String value, Widget placeh...
method _buildCoverV1 (line 390) | Widget _buildCoverV1(BuildContext context, String value, Widget placeh...
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/constants.dart
class SpaceUIConstants (line 1) | class SpaceUIConstants {
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/manage_space_widget.dart
type ManageSpaceType (line 8) | enum ManageSpaceType {
class ManageSpaceWidget (line 13) | class ManageSpaceWidget extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/mobile_space.dart
class MobileSpace (line 20) | class MobileSpace extends StatelessWidget {
method build (line 26) | Widget build(BuildContext context)
method _showSpaceMenu (line 58) | void _showSpaceMenu(BuildContext context)
method _showCreatePageMenu (line 83) | void _showCreatePageMenu(BuildContext context, ViewPB space)
class _Pages (line 117) | class _Pages extends StatelessWidget {
method build (line 126) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/mobile_space_header.dart
class MobileSpaceHeader (line 11) | class MobileSpaceHeader extends StatelessWidget {
method build (line 26) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/mobile_space_menu.dart
class MobileSpaceMenu (line 29) | class MobileSpaceMenu extends StatelessWidget {
method build (line 35) | Widget build(BuildContext context)
class MobileSpaceMenuItem (line 69) | class MobileSpaceMenuItem extends StatelessWidget {
method build (line 80) | Widget build(BuildContext context)
class _CreateSpaceButton (line 119) | class _CreateSpaceButton extends StatefulWidget {
method createState (line 123) | State<_CreateSpaceButton> createState()
class _CreateSpaceButtonState (line 126) | class _CreateSpaceButtonState extends State<_CreateSpaceButton> {
method dispose (line 139) | void dispose()
method build (line 149) | Widget build(BuildContext context)
method _showCreateSpaceDialog (line 165) | Future<void> _showCreateSpaceDialog(BuildContext context)
method _resetState (line 210) | void _resetState()
class SpaceMenuItemTrailing (line 218) | class SpaceMenuItemTrailing extends StatefulWidget {
method createState (line 229) | State<SpaceMenuItemTrailing> createState()
class _SpaceMenuItemTrailingState (line 232) | class _SpaceMenuItemTrailingState extends State<SpaceMenuItemTrailing> {
method dispose (line 245) | void dispose()
method build (line 255) | Widget build(BuildContext context)
method _showMoreOptions (line 283) | void _showMoreOptions(BuildContext context)
method _onActions (line 310) | void _onActions(
method _duplicateSpace (line 336) | void _duplicateSpace(BuildContext context, BuildContext bottomSheetCon...
method _showRenameSpaceBottomSheet (line 349) | void _showRenameSpaceBottomSheet(BuildContext context)
method _showManageSpaceBottomSheet (line 384) | Future<void> _showManageSpaceBottomSheet(BuildContext context)
method _deleteSpace (line 442) | void _deleteSpace(
method _showConfirmDialog (line 465) | void _showConfirmDialog(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/space_menu_bottom_sheet.dart
class SpaceMenuMoreOptions (line 10) | class SpaceMenuMoreOptions extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
method _buildActionButton (line 32) | Widget _buildActionButton(
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/space_permission_bottom_sheet.dart
class SpacePermissionBottomSheet (line 8) | class SpacePermissionBottomSheet extends StatelessWidget {
method build (line 19) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/space/widgets.dart
class ManageSpaceNameOption (line 20) | class ManageSpaceNameOption extends StatelessWidget {
method build (line 31) | Widget build(BuildContext context)
class ManageSpacePermissionOption (line 56) | class ManageSpacePermissionOption extends StatelessWidget {
method build (line 65) | Widget build(BuildContext context)
class ManageSpaceIconOption (line 113) | class ManageSpaceIconOption extends StatefulWidget {
method createState (line 124) | State<ManageSpaceIconOption> createState()
class _ManageSpaceIconOptionState (line 127) | class _ManageSpaceIconOptionState extends State<ManageSpaceIconOption> {
method build (line 129) | Widget build(BuildContext context)
method _buildColorOption (line 139) | List<Widget> _buildColorOption(BuildContext context)
method _buildSpaceIconOption (line 177) | List<Widget> _buildSpaceIconOption(BuildContext context)
method _buildIconGroups (line 220) | Widget _buildIconGroups(
class SpaceIconItem (line 270) | class SpaceIconItem extends StatelessWidget {
method build (line 285) | Widget build(BuildContext context)
class SpaceColorItem (line 321) | class SpaceColorItem extends StatelessWidget {
method build (line 334) | Widget build(BuildContext context)
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/tab/_round_underline_tab_indicator.dart
class RoundUnderlineTabIndicator (line 3) | class RoundUnderlineTabIndicator extends Decoration {
method lerpFrom (line 17) | Decoration? lerpFrom(Decoration? a, double t)
method lerpTo (line 28) | Decoration? lerpTo(Decoration? b, double t)
method createBoxPainter (line 39) | BoxPainter createBoxPainter([VoidCallback? onChanged])
method _indicatorRectFor (line 43) | Rect _indicatorRectFor(Rect rect, TextDirection textDirection)
method getClipPath (line 55) | Path getClipPath(Rect rect, TextDirection textDirection)
class _UnderlinePainter (line 66) | class _UnderlinePainter extends BoxPainter {
method paint (line 77) | void paint(Canvas canvas, Offset offset, ImageConfiguration configurat...
FILE: frontend/appflowy_flutter/lib/mobile/presentation/home/tab/_tab_bar.dart
class MobileSpaceTabBar (line 6) | class Mo
Copy disabled (too large)
Download .json
Condensed preview — 3555 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,884K chars).
[
{
"path": ".dockerignore",
"chars": 5,
"preview": ".git\n"
},
{
"path": ".githooks/commit-msg",
"chars": 1324,
"preview": "#!/bin/sh\n#\n# An example hook script to check the commit log message.\n# Called by \"git commit\" with one argument, the na"
},
{
"path": ".githooks/pre-commit",
"chars": 1074,
"preview": "#!/usr/bin/env bash\n\nYELLOW=\"\\e[93m\"\nGREEN=\"\\e[32m\"\nRED=\"\\e[31m\"\nENDCOLOR=\"\\e[0m\"\n\nprintMessage() {\n printf \"${YELLOW}"
},
{
"path": ".githooks/pre-push",
"chars": 691,
"preview": "#!/usr/bin/env bash\n\nYELLOW=\"\\e[93m\"\nGREEN=\"\\e[32m\"\nRED=\"\\e[31m\"\nENDCOLOR=\"\\e[0m\"\n\nprintMessage() {\n printf \"${YELLOW}"
},
{
"path": ".github/FUNDING.yml",
"chars": 17,
"preview": "ko_fi: appflowy\n\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
"chars": 1343,
"preview": "name: Bug Report\ndescription: Create a bug report to help us improve\ntitle: \"[Bug] \"\nbody:\n - type: textarea\n id: de"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
"chars": 621,
"preview": "name: Feature Request\ndescription: Suggest an idea for AppFlowy\ntitle: \"[FR] \"\nbody:\n - type: textarea\n id: desc\n "
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1259,
"preview": "<!---\nThank you for submitting a pull request to AppFlowy. The team will dedicate their best efforts to reviewing and ap"
},
{
"path": ".github/actions/flutter_build/action.yml",
"chars": 3003,
"preview": "name: Flutter Integration Test\ndescription: Run integration tests for AppFlowy\n\ninputs:\n os:\n description: \"The oper"
},
{
"path": ".github/actions/flutter_integration_test/action.yml",
"chars": 2407,
"preview": "name: Flutter Integration Test\ndescription: Run integration tests for AppFlowy\n\ninputs:\n test_path:\n description: \"T"
},
{
"path": ".github/workflows/android_ci.yaml.bak",
"chars": 6731,
"preview": "name: Android CI\n\non:\n push:\n branches:\n - \"main\"\n paths:\n - \".github/workflows/mobile_ci.yaml\"\n -"
},
{
"path": ".github/workflows/build_command.yml",
"chars": 1460,
"preview": "name: build\n\non:\n repository_dispatch:\n types: [build-command]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:"
},
{
"path": ".github/workflows/commit_lint.yml",
"chars": 233,
"preview": "name: Commit messages lint\non: [pull_request, push]\n\njobs:\n commitlint:\n runs-on: ubuntu-latest\n steps:\n - u"
},
{
"path": ".github/workflows/docker_ci.yml",
"chars": 1365,
"preview": "name: Docker-CI\n\non:\n push:\n branches: [ \"main\", \"release/*\" ]\n pull_request:\n branches: [ \"main\", \"release/*\" ]"
},
{
"path": ".github/workflows/flutter_ci.yaml",
"chars": 12003,
"preview": "name: Flutter-CI\n\non:\n push:\n branches:\n - \"main\"\n - \"release/*\"\n paths:\n - \".github/workflows/flu"
},
{
"path": ".github/workflows/ios_ci.yaml",
"chars": 2801,
"preview": "name: iOS CI\n\non:\n push:\n branches:\n - \"main\"\n paths:\n - \".github/workflows/mobile_ci.yaml\"\n - \"fr"
},
{
"path": ".github/workflows/mobile_ci.yml",
"chars": 2951,
"preview": "name: Mobile-CI\n\non:\n workflow_dispatch:\n inputs:\n branch:\n description: \"Branch to build\"\n requi"
},
{
"path": ".github/workflows/ninja_i18n.yml",
"chars": 569,
"preview": "name: Ninja i18n action\n\non:\n pull_request_target:\n\n# explicitly configure permissions, in case your GITHUB_TOKEN workf"
},
{
"path": ".github/workflows/release.yml",
"chars": 20661,
"preview": "name: release\n\non:\n push:\n tags:\n - \"*\"\n\nenv:\n FLUTTER_VERSION: \"3.27.4\"\n RUST_TOOLCHAIN: \"1.85.0\"\n\njobs:\n c"
},
{
"path": ".github/workflows/rust_ci.yaml",
"chars": 3718,
"preview": "name: Rust-CI\n\non:\n push:\n branches:\n - \"main\"\n - \"develop\"\n - \"release/*\"\n paths:\n - \"fronte"
},
{
"path": ".github/workflows/rust_coverage.yml",
"chars": 1591,
"preview": "name: Rust code coverage\n\non:\n push:\n branches:\n - \"main\"\n - \"release/*\"\n paths:\n - \"frontend/rust"
},
{
"path": ".github/workflows/translation_notify.yml",
"chars": 471,
"preview": "name: Translation Notify\non:\n push:\n branches: [ main ]\n paths:\n - \"frontend/appflowy_flutter/assets/transla"
},
{
"path": ".gitignore",
"chars": 838,
"preview": "# Generated by Cargo\n# will have compiled files and executables\n# Remove Cargo.lock from gitignore if creating an execut"
},
{
"path": "CHANGELOG.md",
"chars": 47259,
"preview": "# Release Notes\n## Version 0.9.9 – 11/09/2025\n### Desktop\n#### New Features\n- Workspace user profile: customize your ava"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3366,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "LICENSE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 8547,
"preview": "<h1 align=\"center\" style=\"border-bottom: none\">\n <b>\n <a href=\"https://www.appflowy.com\">AppFlowy</a><br>\n "
},
{
"path": "ROADMAP.md",
"chars": 366,
"preview": "## Our [roadmap](https://github.com/orgs/AppFlowy-IO/projects/5/views/12) is where you can learn about the features we’r"
},
{
"path": "codemagic.yaml",
"chars": 1309,
"preview": "workflows:\n ios-workflow:\n name: iOS Workflow\n instance_type: mac_mini_m2\n max_build_duration: 30\n environm"
},
{
"path": "commitlint.config.js",
"chars": 796,
"preview": "// module.exports = {extends: ['@commitlint/config-conventional']}\nmodule.exports = {\n rules: {\n 'header-max-l"
},
{
"path": "doc/CONTRIBUTING.md",
"chars": 462,
"preview": "<p align=\"center\"><img src=\"imgs/appflowy_title_and_logo.png\" alt=\"The Open Source Notion Alternative.\" width=\"500px\" />"
},
{
"path": "doc/roadmap.md",
"chars": 176,
"preview": "[AppFlowy Roadmap ReadMe](https://appflowy.gitbook.io/docs/essential-documentation/roadmap)\n\n[AppFlowy Public Roadmap](h"
},
{
"path": "frontend/.vscode/launch.json",
"chars": 4157,
"preview": "{\n // Use IntelliSense to learn about possible attributes.\n // Hover to view descriptions of existing attributes.\n //"
},
{
"path": "frontend/.vscode/tasks.json",
"chars": 6847,
"preview": "{\n \"version\": \"2.0.0\",\n // https://code.visualstudio.com/docs/editor/tasks\n // https://gist.github.com/deadalusai/9e1"
},
{
"path": "frontend/Makefile.toml",
"chars": 8762,
"preview": "#https://github.com/sagiegurari/cargo-make\n\nextend = [\n { path = \"scripts/makefile/desktop.toml\" },\n { path = \"scripts"
},
{
"path": "frontend/appflowy_flutter/.gitignore",
"chars": 1138,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
},
{
"path": "frontend/appflowy_flutter/.metadata",
"chars": 931,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": "frontend/appflowy_flutter/Makefile",
"chars": 116,
"preview": ".PHONY: freeze_build, free_watch\n\nfreeze_build:\n\tdart run build_runner build -d\n\nwatch:\n\tdart run build_runner watch"
},
{
"path": "frontend/appflowy_flutter/README.md",
"chars": 2902,
"preview": "<h1 align=\"center\" style=\"margin:0\"> AppFlowy_Flutter</h1>\n<div align=\"center\">\n <img src=\"https://img.shields.io/badge"
},
{
"path": "frontend/appflowy_flutter/analysis_options.yaml",
"chars": 706,
"preview": "include: package:flutter_lints/flutter.yaml\n\nanalyzer:\n exclude:\n - \"**/*.g.dart\"\n - \"**/*.freezed.dart\"\n - \"p"
},
{
"path": "frontend/appflowy_flutter/android/.gitignore",
"chars": 291,
"preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
},
{
"path": "frontend/appflowy_flutter/android/README.md",
"chars": 3127,
"preview": "# Description\n\nThis is a guide on how to build the rust SDK for AppFlowy on android.\nCompiling the sdk is easy it just n"
},
{
"path": "frontend/appflowy_flutter/android/app/build.gradle",
"chars": 2982,
"preview": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
},
{
"path": "frontend/appflowy_flutter/android/app/src/debug/AndroidManifest.xml",
"chars": 293,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <!-- Flutter needs it to communicate with the "
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/AndroidManifest.xml",
"chars": 3510,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <application android:label=\"AppFlowy\" android:ic"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/CMakeLists.txt",
"chars": 653,
"preview": "cmake_minimum_required(VERSION 3.10.0)\n\nproject(AppFlowy)\n\nmessage(CONFIGURE_LOG \"NDK PATH: ${ANDROID_NDK}\")\nmessage(CON"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/Classes/binding.h",
"chars": 455,
"preview": "#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdlib.h>\n\nint64_t init_sdk(int64_t port, char *d"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/kotlin/com/example/app_flowy/MainActivity.kt",
"chars": 125,
"preview": "package io.appflowy.appflowy\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/drawable/launcher_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/drawable/launcher_foreground.xml",
"chars": 433,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 352,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 265,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <b"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/values/ic_launcher_background.xml",
"chars": 120,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/values/styles.xml",
"chars": 994,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "frontend/appflowy_flutter/android/app/src/main/res/values-night/styles.xml",
"chars": 993,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "frontend/appflowy_flutter/android/app/src/profile/AndroidManifest.xml",
"chars": 293,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <!-- Flutter needs it to communicate with the "
},
{
"path": "frontend/appflowy_flutter/android/build.gradle",
"chars": 582,
"preview": "buildscript {\n ext.kotlin_version = '1.8.0'\n repositories {\n google()\n mavenCentral()\n }\n\n dep"
},
{
"path": "frontend/appflowy_flutter/android/gradle/wrapper/gradle-wrapper.properties",
"chars": 250,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
},
{
"path": "frontend/appflowy_flutter/android/gradle.properties",
"chars": 147,
"preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.caching=true\nandroid.suppre"
},
{
"path": "frontend/appflowy_flutter/android/settings.gradle",
"chars": 938,
"preview": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Prop"
},
{
"path": "frontend/appflowy_flutter/assets/built_in_prompts.json",
"chars": 122951,
"preview": "{\n \"prompts\": [\n {\n \"id\": \"builtin_prompt_1\",\n \"name\": \"Linux terminal\",\n \"ca"
},
{
"path": "frontend/appflowy_flutter/assets/fonts/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "frontend/appflowy_flutter/assets/google_fonts/Poppins/OFL.txt",
"chars": 4478,
"preview": "Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins)\r\n\r\nThis Font Software is licensed unde"
},
{
"path": "frontend/appflowy_flutter/assets/google_fonts/Roboto_Mono/LICENSE.txt",
"chars": 11560,
"preview": "\r\n Apache License\r\n Version 2.0, January 2004\r\n "
},
{
"path": "frontend/appflowy_flutter/assets/icons/icons.json",
"chars": 1575237,
"preview": "{ \"artificial_intelligence\": [ { \"name\": \"ai-chip-spark\", \"keywords\": [ \"chip\", \"processor\", \"artificial\", \"intelligence"
},
{
"path": "frontend/appflowy_flutter/assets/template/readme.afdoc",
"chars": 8536,
"preview": "{\n \"document\": {\n \"type\": \"editor\",\n \"children\": [\n { \"type\": \"cover\" },\n {\n \"type\":"
},
{
"path": "frontend/appflowy_flutter/assets/template/readme.json",
"chars": 8536,
"preview": "{\n \"document\": {\n \"type\": \"editor\",\n \"children\": [\n { \"type\": \"cover\" },\n {\n \"type\":"
},
{
"path": "frontend/appflowy_flutter/assets/test/workspaces/database/v020.afdb",
"chars": 8182,
"preview": "\"{\"\"id\"\":\"\"2_OVWb\"\",\"\"name\"\":\"\"Name\"\",\"\"field_type\"\":0,\"\"visibility\"\":true,\"\"width\"\":150,\"\"type_options\"\":{\"\"0\"\":{\"\"data"
},
{
"path": "frontend/appflowy_flutter/assets/test/workspaces/database/v069.afdb",
"chars": 18750,
"preview": "\"{\"\"id\"\":\"\"RGmzka\"\",\"\"name\"\":\"\"Name\"\",\"\"field_type\"\":0,\"\"type_options\"\":{\"\"0\"\":{\"\"data\"\":\"\"\"\"}},\"\"is_primary\"\":true}\",\"{"
},
{
"path": "frontend/appflowy_flutter/assets/test/workspaces/markdowns/markdown_with_table.md",
"chars": 162,
"preview": "# AppFlowy Test Markdown import with table\n\n# Table\n\n| S.No. | Column 2 |\n| --- | --- |\n| 1. | row 1 |\n| 2. | row 2 |\n| "
},
{
"path": "frontend/appflowy_flutter/assets/test/workspaces/markdowns/test1.md",
"chars": 931,
"preview": "# Welcome to AppFlowy!\n\n## Here are the basics\n\n- [ ] Click anywhere and just start typing.\n- [ ] Highlight any text, an"
},
{
"path": "frontend/appflowy_flutter/assets/test/workspaces/markdowns/test2.md",
"chars": 7,
"preview": "# test\n"
},
{
"path": "frontend/appflowy_flutter/assets/translations/mr-IN.json",
"chars": 121321,
"preview": "{\n \"appName\": \"AppFlowy\",\n \"defaultUsername\": \"मी\",\n \"welcomeText\": \"@:appName मध्ये आ पले स्वागत आहे.\",\n \"welcomeTo"
},
{
"path": "frontend/appflowy_flutter/build.yaml",
"chars": 0,
"preview": ""
},
{
"path": "frontend/appflowy_flutter/cargokit_options.yaml",
"chars": 31,
"preview": "use_precompiled_binaries: true\n"
},
{
"path": "frontend/appflowy_flutter/dart_dependency_validator.yaml",
"chars": 124,
"preview": "# dart_dependency_validator.yaml\n\nallow_pins: true\n\ninclude:\n - \"lib/**\"\n\nexclude:\n - \"packages/**\"\n\nignore:\n - analy"
},
{
"path": "frontend/appflowy_flutter/dev.env",
"chars": 19,
"preview": "APPFLOWY_CLOUD_URL="
},
{
"path": "frontend/appflowy_flutter/devtools_options.yaml",
"chars": 12,
"preview": "extensions:\n"
},
{
"path": "frontend/appflowy_flutter/distribute_options.yaml",
"chars": 250,
"preview": "output: dist/\nreleases:\n - name: dev\n jobs:\n - name: release-dev-linux-deb\n package:\n platform:"
},
{
"path": "frontend/appflowy_flutter/dsa_pub.pem",
"chars": 2230,
"preview": "-----BEGIN PUBLIC KEY-----\nMIIGQzCCBDUGByqGSM44BAEwggQoAoICAQDlkozRmUnVH1MJFqOamAmUYu0YruaT\nrrt6rCIZ0LFrfNnmHA4LOQEcXwBT"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/board/board_add_row_test.dart",
"chars": 3251,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/plugins/database/board/presentation/boar"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/board/board_field_test.dart",
"chars": 1254,
"preview": "import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';\nimport 'package:appflowy_backend/protobuf/flow"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/board/board_group_test.dart",
"chars": 5150,
"preview": "import 'package:appflowy/plugins/database/board/presentation/widgets/board_column_header.dart';\nimport 'package:appflowy"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/board/board_hide_groups_test.dart",
"chars": 4476,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/board/board_row_test.dart",
"chars": 5853,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/database/widgets/card/card.dart"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/board/board_test_runner.dart",
"chars": 578,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'board_add_row_test.dart' as board_add_row_test;\nimport"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/chat/chat_page_test.dart",
"chars": 9277,
"preview": "import 'package:appflowy/plugins/ai_chat/presentation/chat_page/chat_animation_list_widget.dart';\nimport 'package:appflo"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/cloud_runner.dart",
"chars": 1606,
"preview": "import 'data_migration/data_migration_test_runner.dart'\n as data_migration_test_runner;\nimport 'database/database_tes"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/data_migration/anon_user_data_migration_test.dart",
"chars": 1694,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/workspace/application/settings/prelude.dart';\nimp"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/data_migration/data_migration_test_runner.dart",
"chars": 50,
"preview": "void main() async {\n // anon_user_test.main();\n}\n"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/database/database_image_test.dart",
"chars": 2913,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/core/config/kv.dart';\nimport 'package:appflowy/core/config/kv_keys.dart';\nim"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/database/database_test_runner.dart",
"chars": 224,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'database_image_test.dart' as database_image_test;\n\nvoi"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_ai_writer_test.dart",
"chars": 7767,
"preview": "import 'package:appflowy/ai/service/ai_entities.dart';\nimport 'package:appflowy/env/cloud_env.dart';\nimport 'package:app"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_copy_link_to_block_test.dart",
"chars": 9306,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_option_actions_test.dart",
"chars": 3947,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_publish_test.dart",
"chars": 7396,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:app"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/document/document_test_runner.dart",
"chars": 576,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'document_ai_writer_test.dart' as document_ai_writer_te"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/set_env.dart",
"chars": 584,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:integrati"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_icon_test.dart",
"chars": 2310,
"preview": "import 'dart:convert';\n\nimport 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/shared/icon_emoji_picker/"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_move_page_test.dart",
"chars": 3635,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_rename_untitled_test.dart",
"chars": 1789,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/sidebar/sidebar_search_test.dart",
"chars": 1647,
"preview": "import 'package:appflowy/ai/widgets/prompt_input/desktop_prompt_input.dart';\nimport 'package:appflowy/env/cloud_env.dart"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/appflowy_cloud_auth_test.dart",
"chars": 3224,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/document_sync_test.dart",
"chars": 1991,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/workspace/application/settings/prelude.dart';\nimp"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/uncategorized_test_runner.dart",
"chars": 207,
"preview": "import 'appflowy_cloud_auth_test.dart' as appflowy_cloud_auth_test;\nimport 'user_setting_sync_test.dart' as user_sync_te"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/uncategorized/user_setting_sync_test.dart",
"chars": 1779,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/workspace/application/settings/prelude.dart';\nimp"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/change_name_and_icon_test.dart",
"chars": 2424,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/collaborative_workspace_test.dart",
"chars": 7567,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/share_menu_test.dart",
"chars": 2265,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/tabs_test.dart",
"chars": 3091,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_page.dart';\n"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/workspace_icon_test.dart",
"chars": 1472,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/workspace_settings_test.dart",
"chars": 12411,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/cloud/workspace/workspace_test_runner.dart",
"chars": 737,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'change_name_and_icon_test.dart' as change_name_and_ico"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/command_palette/command_palette_test.dart",
"chars": 4053,
"preview": "import 'package:appflowy/workspace/presentation/command_palette/command_palette.dart';\nimport 'package:appflowy/workspac"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/command_palette/command_palette_test_runner.dart",
"chars": 447,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'command_palette_test.dart' as command_palette_test;\nim"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/command_palette/folder_search_test.dart",
"chars": 5300,
"preview": "import 'dart:convert';\nimport 'dart:math';\n\nimport 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appfl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/command_palette/recent_history_test.dart",
"chars": 1489,
"preview": "import 'package:appflowy/workspace/presentation/command_palette/command_palette.dart';\nimport 'package:appflowy/workspac"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_calendar_test.dart",
"chars": 12450,
"preview": "import 'package:appflowy/plugins/database/calendar/presentation/calendar_event_editor.dart';\nimport 'package:appflowy/sh"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_cell_test.dart",
"chars": 16092,
"preview": "import 'package:appflowy/util/field_type_extension.dart';\nimport 'package:appflowy_backend/protobuf/flowy-database2/fiel"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_field_settings_test.dart",
"chars": 4194,
"preview": "import 'package:appflowy/plugins/database/grid/presentation/grid_page.dart';\nimport 'package:appflowy_backend/protobuf/f"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_field_test.dart",
"chars": 20403,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/database/grid/presentation/grid"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_filter_test.dart",
"chars": 7738,
"preview": "import 'package:appflowy/plugins/database/application/field/filter_entities.dart';\nimport 'package:appflowy/plugins/data"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_icon_test.dart",
"chars": 6724,
"preview": "import 'dart:convert';\n\nimport 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_media_test.dart",
"chars": 11026,
"preview": "import 'dart:io';\n\nimport 'package:flutter/services.dart';\n\nimport 'package:appflowy/core/config/kv.dart';\nimport 'packa"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_reminder_test.dart",
"chars": 7014,
"preview": "import 'package:appflowy/workspace/presentation/notifications/widgets/notification_item.dart';\nimport 'package:appflowy/"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_row_cover_test.dart",
"chars": 4420,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/core/config/kv.dart';\nimport 'package:appflowy/core/config/kv_keys.dart';\nim"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_row_page_test.dart",
"chars": 17124,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/database/grid/presentation/widg"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_setting_test.dart",
"chars": 1819,
"preview": "import 'package:appflowy_backend/protobuf/flowy-database2/setting_entities.pbenum.dart';\nimport 'package:appflowy_backen"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_share_test.dart",
"chars": 3909,
"preview": "import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pbenum.dart';\nimport 'package:flutter_test/flut"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_sort_test.dart",
"chars": 11314,
"preview": "import 'package:appflowy/plugins/database/grid/presentation/widgets/sort/sort_editor.dart';\nimport 'package:appflowy_bac"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_test_runner_1.dart",
"chars": 735,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'database_cell_test.dart' as database_cell_test;\nimport"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_test_runner_2.dart",
"chars": 802,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'database_calendar_test.dart' as database_calendar_test"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/database/database_view_test.dart",
"chars": 4167,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/database/grid/presentation/grid"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_alignment_test.dart",
"chars": 3443,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_plu"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_app_lifecycle_test.dart",
"chars": 2422,
"preview": "import 'dart:ui';\n\nimport 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter_test/flutter_test.dart"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_block_option_test.dart",
"chars": 1618,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_callout_test.dart",
"chars": 2301,
"preview": "import 'dart:convert';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/base/ic"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_codeblock_paste_test.dart",
"chars": 2156,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/pre"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_copy_and_paste_test.dart",
"chars": 34204,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_create_and_delete_test.dart",
"chars": 2519,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_customer_test.dart",
"chars": 1788,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:appflowy_editor_plugins/appflowy_editor_plugins.d"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_deletion_test.dart",
"chars": 2808,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_pl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_find_menu_test.dart",
"chars": 4927,
"preview": "import 'dart:math';\n\nimport 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/plugins/document/pr"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_inline_page_reference_test.dart",
"chars": 3951,
"preview": "import 'package:appflowy/plugins/document/presentation/editor_plugins/mention/mention_page_block.dart';\nimport 'package:"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_inline_sub_page_test.dart",
"chars": 13217,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/pre"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_link_preview_test.dart",
"chars": 16499,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_more_actions_test.dart",
"chars": 5205,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/workspace/presentation/home/menu/view/v"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_option_action_test.dart",
"chars": 6937,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_pl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_selection_test.dart",
"chars": 3258,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/s"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_shortcuts_test.dart",
"chars": 4051,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter_t"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_sub_page_test.dart",
"chars": 19645,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/pre"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_1.dart",
"chars": 918,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'document_create_and_delete_test.dart'\n as document_"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_2.dart",
"chars": 1075,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'document_app_lifecycle_test.dart' as document_app_life"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_3.dart",
"chars": 886,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'document_alignment_test.dart' as document_alignment_te"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_4.dart",
"chars": 1421,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'document_block_option_test.dart' as document_block_opt"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_text_direction_test.dart",
"chars": 1990,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_title_test.dart",
"chars": 12096,
"preview": "import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';\nimport 'package:appflowy_editor/app"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_toolbar_test.dart",
"chars": 16165,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_cover_image_test.dart",
"chars": 7826,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/pre"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_database_test.dart",
"chars": 10887,
"preview": "import 'package:appflowy/plugins/database/board/presentation/board_page.dart';\nimport 'package:appflowy/plugins/database"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_date_reminder_test.dart",
"chars": 17053,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_file_test.dart",
"chars": 5916,
"preview": "import 'dart:io';\n\nimport 'package:flutter/services.dart';\n\nimport 'package:appflowy/core/config/kv.dart';\nimport 'packa"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_image_block_test.dart",
"chars": 5648,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/core/config/kv.dart';\nimport 'package:appflowy/core/config/kv_keys.dart';\nim"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_inline_math_equation_test.dart",
"chars": 7806,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_inline_page_test.dart",
"chars": 4499,
"preview": "import 'package:appflowy/plugins/database/grid/presentation/grid_page.dart';\nimport 'package:appflowy/plugins/document/p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_link_test.dart",
"chars": 2830,
"preview": "import 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/s"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_multi_image_block_test.dart",
"chars": 10386,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/core/config/kv.dart';\nimport 'package:appflowy/core/config/kv_keys.dart';\nim"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_outline_block_test.dart",
"chars": 5992,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_pl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_simple_table_test.dart",
"chars": 25074,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_pl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_toggle_heading_block_test.dart",
"chars": 4148,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/document_with_toggle_list_test.dart",
"chars": 10248,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/pre"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/document/edit_document_test.dart",
"chars": 3672,
"preview": "import 'dart:io';\n\nimport 'package:appflowy_editor/appflowy_editor.dart';\nimport 'package:flutter/services.dart';\nimport"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/first_test/first_test.dart",
"chars": 489,
"preview": "import 'package:flutter_test/flutter_test.dart';\nimport 'package:integration_test/integration_test.dart';\n\nimport '../.."
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_calculations_test.dart",
"chars": 3203,
"preview": "import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';\nimport 'package:appflowy_backend/protobuf/flow"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_edit_row_test.dart",
"chars": 3682,
"preview": "import 'package:appflowy/plugins/database/grid/presentation/widgets/filter/choicechip/checkbox.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_filter_and_sort_test.dart",
"chars": 3300,
"preview": "import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';\nimport 'package:flutter_test/flutter_test.dart"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_reopen_test.dart",
"chars": 5457,
"preview": "import 'package:appflowy/plugins/database/grid/presentation/widgets/filter/choicechip/checkbox.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_reorder_row_test.dart",
"chars": 5544,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/database/grid/presentation/widg"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_row_test.dart",
"chars": 7491,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/database/grid/presentation/widg"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_test_extensions.dart",
"chars": 473,
"preview": "import 'package:appflowy/plugins/database/application/row/row_service.dart';\nimport 'package:appflowy/plugins/database/g"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/grid/grid_test_runner_1.dart",
"chars": 715,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'grid_edit_row_test.dart' as grid_edit_row_test_runner;"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/reminder/document_reminder_test.dart",
"chars": 5884,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_pl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/settings/notifications_settings_test.dart",
"chars": 1262,
"preview": "import 'package:appflowy/workspace/application/settings/settings_dialog_bloc.dart';\nimport 'package:appflowy/workspace/p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/settings/settings_billing_test.dart",
"chars": 1371,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:easy_localization/easy_localization.dart';\nimpor"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/settings/settings_runner.dart",
"chars": 551,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'notifications_settings_test.dart' as notifications_set"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/settings/shortcuts_settings_test.dart",
"chars": 2981,
"preview": "import 'package:appflowy/generated/flowy_svgs.g.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'p"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/settings/sign_in_page_settings_test.dart",
"chars": 3782,
"preview": "import 'package:appflowy/env/cloud_env.dart';\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/rename_current_item_test.dart",
"chars": 1505,
"preview": "import 'package:appflowy/workspace/presentation/home/menu/view/view_item.dart';\nimport 'package:appflowy/workspace/prese"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_expand_test.dart",
"chars": 4391,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/inline_actions/widgets/inline_a"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_favorites_test.dart",
"chars": 7546,
"preview": "import 'package:appflowy/workspace/application/sidebar/folder/folder_bloc.dart';\nimport 'package:appflowy/workspace/pres"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_icon_test.dart",
"chars": 9214,
"preview": "import 'package:appflowy/plugins/base/emoji/emoji_picker.dart';\nimport 'package:appflowy/plugins/document/presentation/e"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_recent_icon_test.dart",
"chars": 2037,
"preview": "import 'package:appflowy/plugins/document/presentation/editor_plugins/base/emoji_picker_button.dart';\nimport 'package:ap"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_test.dart",
"chars": 6566,
"preview": "import 'package:appflowy/plugins/database/board/presentation/board_page.dart';\nimport 'package:appflowy/plugins/database"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_test_runner.dart",
"chars": 646,
"preview": "import 'package:integration_test/integration_test.dart';\n\nimport 'sidebar_favorites_test.dart' as sidebar_favorite_test;"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/sidebar/sidebar_view_item_test.dart",
"chars": 1866,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/base/emoji/emoji_picker.dart';\n"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/uncategorized/board_test.dart",
"chars": 1717,
"preview": "import 'package:appflowy_board/appflowy_board.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:in"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/uncategorized/code_block_language_selector_test.dart",
"chars": 3251,
"preview": "import 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/document/presentation/editor_pl"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/uncategorized/emoji_shortcut_test.dart",
"chars": 5735,
"preview": "import 'dart:io';\n\nimport 'package:appflowy/generated/locale_keys.g.dart';\nimport 'package:appflowy/plugins/emoji/emoji_"
},
{
"path": "frontend/appflowy_flutter/integration_test/desktop/uncategorized/empty_document_test.dart",
"chars": 5261,
"preview": "import 'package:appflowy/plugins/document/presentation/editor_plugins/base/built_in_page_widget.dart';\nimport 'package:a"
}
]
// ... and 3355 more files (download for full content)
About this extraction
This page contains the full source code of the AppFlowy-IO/AppFlowy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3555 files (18.0 MB), approximately 4.2M tokens, and a symbol index with 13572 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.