diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c70b42e2f..e0b7985e3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,50 +1,35 @@ ## Description -*Replace this paragraph with a description of what this PR is doing. If you're modifying existing behavior, describe the existing behavior, how this PR is changing it, and what motivated the change.* +*Describe what this PR does. If modifying behavior, explain the current and new behavior, along with the motivation.* ## Related Issues - - +*e.g.* - *Fix #123* - *Related #456* +--> ## Type of Change - -- [ ] ✨ **New feature:** Adds new functionality without breaking existing features. +- [ ] ✨ **Feature:** New functionality without breaking existing features. - [ ] 🛠️ **Bug fix:** Resolves an issue without altering current behavior. -- [ ] 🧹 **Code refactor:** Code restructuring that does not affect behavior. -- [ ] ❌ **Breaking change:** Alters existing functionality and requires updates. -- [ ] 🧪 **Tests:** Adds new tests or modifies existing tests. +- [ ] 🧹 **Refactor:** Code reorganization, no behavior change. +- [ ] ❌ **Breaking:** Alters existing functionality and requires updates. +- [ ] 🧪 **Tests:** New or modified tests - [ ] 📝 **Documentation:** Updates or additions to documentation. - [ ] 🗑️ **Chore:** Routine tasks, or maintenance. -- [ ] ✅ **Build configuration change:** Changes to build or deploy processes. - -## Suggestions - - \ No newline at end of file +- [ ] ✅ **Build configuration change:** Build/configuration changes. diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 000000000..ab076ca23 --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,19 @@ +name: 📝 Changelog File Check + +# This workflow only validates if the CHANGELOG.md file was updated and doesn't validate the format. + +on: + pull_request: + types: [assigned, opened, synchronize, reopened, labeled, unlabeled] + branches: + - master + +jobs: + changelog: + name: 🔍 Verify Changelog Modification + runs-on: ubuntu-latest + steps: + - name: ✅ Check if CHANGELOG.md was modified + uses: tarides/changelog-check-action@v2 + with: + changelog: CHANGELOG.md diff --git a/.github/workflows/gh_release_notes.yml b/.github/workflows/gh_release_notes.yml new file mode 100644 index 000000000..4313a72c8 --- /dev/null +++ b/.github/workflows/gh_release_notes.yml @@ -0,0 +1,29 @@ +name: 🚀 Update GitHub Release Notes from CHANGELOG.md + +on: + release: + types: [published] + +jobs: + release-notes: + name: 📝 Publish Release Notes from Changelog + permissions: + # Required for updating GitHub release notes + contents: write + runs-on: ubuntu-latest + steps: + - name: 📦 Checkout Repository + uses: actions/checkout@v4 + + - name: ✂️ Extract Release Notes from CHANGELOG.md + id: extract-release-notes + uses: ffurrer2/extract-release-notes@v2 + with: + changelog_file: CHANGELOG.md + + - name: 🖋️ Update Release Notes + uses: irongut/EditRelease@v1.2.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + id: ${{ github.event.release.id }} + body: ${{ steps.extract-release-notes.outputs.release_notes }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9adb75e62..de45ce382 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,5 +1,7 @@ name: 🧪 Run Tests +# TODO: Split the tests into tests.yml and quality checks into checks.yml once start using https://pub.dev/packages/melos + on: push: branches: [master, dev] @@ -49,4 +51,11 @@ jobs: run: flutter test - name: 🔍 Check the translations - run: dart ./scripts/ensure_translations_correct.dart + run: dart ./scripts/translations_check.dart + + - name: 📥 Install cider + run: dart pub global activate cider + + # TODO: Need a more strict way to validate the format that uses https://keepachangelog.com/en/1.1.0/ + - name: 🔍 Validate CHANGELOG.md format + run: $HOME/.pub-cache/bin/cider list CHANGELOG.md diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3a98c5656..92210d2cf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,5 +1,8 @@ name: 🚀 Publish to pub.dev +# Note: This workflow only publishes flutter_quill package, the flutter_quill_extensions +# need to be manually published. + on: push: tags: @@ -7,21 +10,15 @@ on: jobs: publish: - name: Publish the packages + name: Publish the flutter_quill package permissions: id-token: write - # Give the default GITHUB_TOKEN write permission to commit and push the changed files to the repository. - # Also required for uploading files to the Release assets + # Required for uploading files to the release assets of GitHub. contents: write runs-on: ubuntu-latest steps: - name: 📦 Checkout repository uses: actions/checkout@v4 - # Needed for commit and push changes - with: - # TODO: Try to not hardcode the branch name - ref: master - fetch-depth: 0 # To get all tags - name: 📄 Upload LICENSE file to release assets uses: softprops/action-gh-release@v2 @@ -50,8 +47,6 @@ jobs: # - name: Update the authorization requests to "https://pub.dev" to use the environment variable "PUB_TOKEN". # run: dart pub token add https://pub.dev --env-var PUB_TOKEN - # Before publishing the new packages, update the version for all the packages first - # Extract version from the tag (handles the 'v' prefix) - name: 🏷️ Extract version from tag as pubspec.yaml version id: extract_version @@ -71,33 +66,41 @@ jobs: id: release_tag run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT - - name: 📑 Fetch release notes from Github API and create a required file by the next step - run: dart ./scripts/create_version_content_from_github_release.dart "${{ github.repository }}" "${{ steps.release_tag.outputs.tag }}" + # TODO: Validate the tag, the version must match the one in pubspec.yaml, publishing the package will throw an error + + # TODO: Might automate some changes of the CHANGELOG.md (outdated TODO) + + - name: 📝 Update package version in pubspec.yaml + run: dart ./update_pubspec_version.dart ./pubspec.yaml ${{ steps.extract_version.outputs.VERSION }} + + # - name: 📝 Update CHANGELOG.md to reflect the change + # uses: thomaseizinger/keep-a-changelog-new-release@v2 + # with: + # tag: ${{ steps.release_tag.outputs.tag }} + # changelogPath: ./CHANGELOG.md + + - name: 📝 Update CHANGELOG.md to reflect the change + run: dart ./update_changelog_version.dart ./CHANGELOG.md ${{ steps.extract_version.outputs.VERSION }} + + - name: 📄 Print updated pubspec.yaml + run: | + echo "===== 📜 pubspec.yaml =====" + cat pubspec.yaml | tee /dev/stderr + echo "===========================" - - name: 📝 Update version and CHANGELOG for all the packages - run: dart ./scripts/update_package_version.dart ${{ steps.extract_version.outputs.VERSION }} + - name: 📝 Print updated CHANGELOG.md + run: | + echo "===== 📝 CHANGELOG.md =====" + cat CHANGELOG.md | tee /dev/stderr + echo "===========================" - name: 💾 Commit updated version and CHANGELOG - id: auto-commit-action - uses: stefanzweifel/git-auto-commit-action@v5 + uses: EndBug/add-and-commit@v9 with: - commit_message: "chore(version): update to version ${{ steps.extract_version.outputs.VERSION }}" - - - name: 🔍 Verify changes made by the script - if: steps.auto-commit-action.outputs.changes_detected == 'true' - run: echo "✅ Changes have been committed." + message: "chore(release): prepare to publish ${{ steps.extract_version.outputs.VERSION }}" - name: 🔄 Check if package is ready for publishing run: flutter pub publish --dry-run - name: 📤 Publish flutter_quill run: flutter pub publish --force - - - name: 📤 Publish flutter_quill_extensions - run: flutter pub publish --force - working-directory: ./flutter_quill_extensions/ - - - name: 📤 Publish flutter_quill_test - run: flutter pub publish --force - working-directory: ./flutter_quill_test/ - diff --git a/.gitignore b/.gitignore index ba9cc9155..2a6a92476 100644 --- a/.gitignore +++ b/.gitignore @@ -75,4 +75,5 @@ example/ios/Podfile.lock !**/ios/**/default.mode2v3 !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspec-lock. pubspec.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 45a3e484d..749d3d77f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3180 +1,100 @@ - - # Changelog All notable changes to this project will be documented in this file. -## 10.8.5 - -* fix: allow all correct URLs to be formatted by @orevial in https://github.com/singerdmx/flutter-quill/pull/2328 -* fix(macos): Implement actions for ExpandSelectionToDocumentBoundaryIntent and ExpandSelectionToLineBreakIntent to use keyboard shortcuts, unrelated cleanup to the bug fix. by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2279 - -## New Contributors -* @orevial made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2328 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.4...v10.8.5 - -## 10.8.4 - -- [Fixes an unhandled exception](https://github.com/singerdmx/flutter-quill/commit/8dd559b825030d29b30b32b353a08dcc13dc42b7) in case `getClipboardFiles()` wasn't supported -- [Updates min version](https://github.com/singerdmx/flutter-quill/commit/49569e47b038c5f61b7521571c102cf5ad5a0e3f) of internal dependency `quill_native_bridge` - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.3...v10.8.4 - -## 10.8.3 - -This release is identical to [v10.8.3-dev.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.3-dev.0), mainly published to bump the minimum version of [flutter_quill](https://pub.dev/packages/flutter_quill) in [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) and to publish [quill-super-clipboard](https://github.com/FlutterQuill/quill-super-clipboard/). - -A new identical release `10.9.0` will be published soon with a release description. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3 - -## 10.8.3-dev.0 - -A non-pre-release version with this change will be published soon. - -* feat: Use quill_native_bridge as default impl in DefaultClipboardService, fix related bugs in the extensions package by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2230 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3-dev.0 - -## 10.8.2 - -* Fixed minor typo in Hungarian (hu) localization by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2307 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.1...v10.8.2 - -## 10.8.1 - -- This release fixes the compilation issue when building the project with [Flutter/Wasm](https://docs.flutter.dev/platform-integration/web/wasm) target on the web. Also, update the conditional import check to avoid using `dart.library.html`: - - ```dart - import 'web/quill_controller_web_stub.dart' - if (dart.library.html) 'web/quill_controller_web_real.dart'; - ``` - - To fix critical bugs that prevent using the editor on Wasm. - - > Flutter/Wasm is stable as of [Flutter 3.22](https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3) though it's likely that you might experience some issues when using this new target, if you experienced any issues related to Wasm support related to Flutter Quill, feel free to [open an issue](https://github.com/singerdmx/flutter-quill/issues). - - Issue #1889 is fixed by temporarily replacing the plugin [flutter_keyboard_visibility](https://pub.dev/packages/flutter_keyboard_visibility) with [flutter_keyboard_visibility_temp_fork](https://pub.dev/packages/flutter_keyboard_visibility_temp_fork) since `flutter_keyboard_visibility` depend on `dart:html`. Also updated the `compileSdkVersion` to `34` instead of `31` as a workaround to [Flutter #63533](https://github.com/flutter/flutter/issues/63533). - -- Support for Hungarian (hu) localization was added by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2291. -- [dart_quill_delta](https://pub.dev/packages/dart_quill_delta/) has been moved to [FlutterQuill/dart-quill-delta](https://github.com/FlutterQuill/dart-quill-delta) (outside of this repo) and they have separated version now. - - -## New Contributors -* @G-Greg made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2291 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.0...v10.8.1 - -## 10.8.0 - -> [!CAUTION] -> This release can be breaking change for `flutter_quill_extensions` users as it remove the built-in support for loading YouTube videos - -If you're using [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) then this release, can be a breaking change for you if you load videos in the editor and expect YouTube videos to be supported, [youtube_player_flutter](https://pub.dev/packages/youtube_player_flutter) and [flutter_inappwebview](https://pub.dev/packages/flutter_inappwebview) are no longer dependencies of the extensions package, which are used to support loading YouTube Iframe videos on non-web platforms, more details about the discussion and reasons in [#2286](https://github.com/singerdmx/flutter-quill/pull/2286) and [#2284](https://github.com/singerdmx/flutter-quill/issues/2284). - -We have added an experimental property that gives you more flexibility and control about the implementation you want to use for loading videos. - -> [!WARNING] -> It's likely to experience some common issues while implementing this feature, especially on desktop platforms as the support for [flutter_inappwebview_windows](https://pub.dev/packages/flutter_inappwebview_windows) and [flutter_inappwebview_macos](https://pub.dev/packages/flutter_inappwebview_macos) before 2 days. Some of the issues are in the Flutter Quill editor. - -If you want loading YouTube videos to be a feature again with the latest version of Flutter Quill, you can use an existing plugin or package, or implement your own solution. For example, you might use [`youtube_video_player`](https://pub.dev/packages/youtube_video_player) or [`youtube_player_flutter`](https://pub.dev/packages/youtube_player_flutter), which was previously used in [`flutter_quill_extensions`](https://pub.dev/packages/flutter_quill_extensions). - -Here’s an example setup using `youtube_player_flutter`: - -```shell -flutter pub add youtube_player_flutter -``` - -Example widget configuration: - -```dart -import 'package:flutter/material.dart'; -import 'package:youtube_player_flutter/youtube_player_flutter.dart'; - -class YoutubeVideoPlayer extends StatefulWidget { - const YoutubeVideoPlayer({required this.videoUrl, super.key}); - - final String videoUrl; - - @override - State createState() => _YoutubeVideoPlayerState(); -} - -class _YoutubeVideoPlayerState extends State { - late final YoutubePlayerController _youtubePlayerController; - @override - void initState() { - super.initState(); - _youtubePlayerController = YoutubePlayerController( - initialVideoId: YoutubePlayer.convertUrlToId(widget.videoUrl) ?? - (throw StateError('Expect a valid video URL')), - flags: const YoutubePlayerFlags( - autoPlay: true, - mute: true, - ), - ); - } - - @override - Widget build(BuildContext context) { - return YoutubePlayer( - controller: _youtubePlayerController, - showVideoProgressIndicator: true, - ); - } - - @override - void dispose() { - _youtubePlayerController.dispose(); - super.dispose(); - } -} - -``` - -Then, integrate it with `QuillEditorVideoEmbedConfigurations` - -```dart -FlutterQuillEmbeds.editorBuilders( - videoEmbedConfigurations: QuillEditorVideoEmbedConfigurations( - customVideoBuilder: (videoUrl, readOnly) { - // Example: Check for YouTube Video URL and return your - // YouTube video widget here. - bool isYouTubeUrl(String videoUrl) { - try { - final uri = Uri.parse(videoUrl); - return uri.host == 'www.youtube.com' || - uri.host == 'youtube.com' || - uri.host == 'youtu.be' || - uri.host == 'www.youtu.be'; - } catch (_) { - return false; - } - } - - if (isYouTubeUrl(videoUrl)) { - return YoutubeVideoPlayer( - videoUrl: videoUrl, - ); - } - - // Return null to fallback to the default logic - return null; - }, - ignoreYouTubeSupport: true, - ), -); -``` - -> [!NOTE] -> This example illustrates a basic approach, additional adjustments might be necessary to meet your specific needs. YouTube video support is no longer included in this project. Keep in mind that `customVideoBuilder` is experimental and can change without being considered as breaking change. More details in [breaking changes](https://github.com/singerdmx/flutter-quill#-breaking-changes) section. - -[`super_clipboard`](https://pub.dev/packages/super_clipboard) will also no longer a dependency of `flutter_quill_extensions` once [PR #2230](https://github.com/singerdmx/flutter-quill/pull/2230) is ready. - -We're looking forward to your feedback. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.7...v10.8.0 - -## 10.7.7 - -This version is nearly identical to `10.7.6` with a build failure bug fix in [#2283](https://github.com/singerdmx/flutter-quill/pull/2283) related to unmerged change in [#2230](https://github.com/singerdmx/flutter-quill/pull/2230) - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.6...v10.7.7 - -## 10.7.6 - -* Code Comments Typo fixes by @Luismi74 in https://github.com/singerdmx/flutter-quill/pull/2267 -* docs: add important note for contributors before introducing new features by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2269 -* docs(readme): add 'Breaking Changes' section by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2275 -* Fix: Resolved issue with broken IME composing rect in Windows desktop(re-implementation) by @agata in https://github.com/singerdmx/flutter-quill/pull/2282 - -## New Contributors -* @Luismi74 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2267 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.5...v10.7.6 - -## 10.7.5 - -* fix(ci): add flutter pub get step for quill_native_bridge by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2265 -* revert: "Resolved issue with broken IME composing rect in Windows desktop" by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2266 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.4...v10.7.5 - -## 10.7.4 - -* chore: remove pubspec_overrides.yaml and pubspec_overrides.yaml.disabled by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2262 -* ci: remove quill_native_bridge from automated publishing workflow by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2263 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.3...v10.7.4 - -## 10.7.3 - -- Deprecate `FlutterQuillExtensions` in `flutter_quill_extensions` -- Update the minimum version of `flutter_quill` and `super_clipboard` in `flutter_quill_extensions` to avoid using deprecated code. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.2...v10.7.3 - -## 10.7.2 - -## What's Changed -* chore: deprecate flutter_quill/extensions.dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2258 - -This is a minor release introduced to upload a new version of `flutter_quill` and `flutter_quill_extensions` to update the minimum required to avoid using deprecated code in `flutter_quill_extensions`. - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.1...v10.7.2 - -## 10.7.1 - -* chore: deprecate markdown_quill export, ignore warnings by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2256 -* chore: deprecate spell checker service by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2255 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.0...v10.7.1 - -## 10.7.0 - -* Chore: deprecate embed table feature by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2254 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.6...v10.7.0 - -## 10.6.6 - -* Bug fix: Removing check not allowing spell check on web by @joeserhtf in https://github.com/singerdmx/flutter-quill/pull/2252 - -## New Contributors -* @joeserhtf made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2252 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.5...v10.6.6 - -## 10.6.5 - -* Refine IME composing range styling by applying underline as text style by @agata in https://github.com/singerdmx/flutter-quill/pull/2244 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.4...v10.6.5 - -## 10.6.4 - -* fix: the composing text did not show an underline during IME conversion by @agata in https://github.com/singerdmx/flutter-quill/pull/2242 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.3...v10.6.4 - -## 10.6.3 - -* Fix: Resolved issue with broken IME composing rect in Windows desktop by @agata in https://github.com/singerdmx/flutter-quill/pull/2239 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.2...v10.6.3 - -## 10.6.2 - -* Fix: QuillToolbarToggleStyleButton Switching failure by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2234 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.1...v10.6.2 - -## 10.6.1 - -* Chore: update `flutter_quill_delta_from_html` to remove exception calls by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2232 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.0...v10.6.1 - -## 10.6.0 - -* docs: cleanup the docs, remove outdated resources, general changes by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2227 -* Feat: customizable character and space shortcut events by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2228 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.19...v10.6.0 - -## 10.5.19 - -* fix: properties other than 'style' for custom inline code styles (such as 'backgroundColor') were not being applied correctly by @agata in https://github.com/singerdmx/flutter-quill/pull/2226 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.18...v10.5.19 - -## 10.5.18 - -* feat(web): rich text paste from Clipboard using HTML by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2009 -* revert: disable rich text paste feature on web as a workaround by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2221 -* refactor: moved shortcuts and onKeyEvents to its own file by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2223 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.17...v10.5.18 - -## 10.5.17 - -* feat(l10n): localize all untranslated.json by @erdnx in https://github.com/singerdmx/flutter-quill/pull/2217 -* Fix: Block Attributes are not displayed if the editor is empty by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2210 - -## New Contributors -* @erdnx made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2217 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.16...v10.5.17 - -## 10.5.16 - -* chore: remove device_info_plus and add quill_native_bridge to access platform specific APIs by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2194 -* Not show/update/hiden mangnifier when manifier config is disbale by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2212 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.16 - -## 10.5.15-dev.0 - -Introduce `quill_native_bridge` which is an internal plugin to use by `flutter_quill` to access platform APIs. - -For now, the only functionality it supports is to check whatever the iOS app is running on iOS simulator without requiring [`device_info_plus`](pub.dev/packages/device_info_plus) as a dependency. - -> [!NOTE] -> `quill_native_bridge` is a plugin for internal use and should not be used in production applications -> as breaking changes can happen and can removed at any time. - -For more details and discussion see [#2194](https://github.com/singerdmx/flutter-quill/pull/2194). - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.15-dev.0 - -## 10.5.14 - -* chore(localization): add Greek language support by @DKalathas in https://github.com/singerdmx/flutter-quill/pull/2206 - -## New Contributors -* @DKalathas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2206 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.13...v10.5.14 - -## 10.5.13 - -* Revert "Fix: Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2201 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.12...v10.5.13 - -## 10.5.12 - -* Fix: Backspace remove block attributes at start by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2200 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.11...v10.5.12 - -## 10.5.11 - -* Enhancement: Backspace handling at the start of blocks in delete rules by @agata in https://github.com/singerdmx/flutter-quill/pull/2199 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.10...v10.5.11 - -## 10.5.10 - -* Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2198 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.9...v10.5.10 - -## 10.5.9 - -* chore: improve platform check by using constants and defaultTargetPlatform by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2188 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.8...v10.5.9 - -## 10.5.8 - -* Feat: Add configuration option to always indent on TAB key press by @agata in https://github.com/singerdmx/flutter-quill/pull/2187 - -## New Contributors -* @agata made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2187 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.7...v10.5.8 - -## 10.5.7 - -* chore(example): downgrade Kotlin from 1.9.24 to 1.7.10 by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2185 -* style: refactor build leading function style, width, and padding parameters for custom node leading builder by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2182 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.6...v10.5.7 - -## 10.5.6 - -* chore(deps): update super_clipboard to 0.8.20 in flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2181 -* Update quill_screen.dart, i chaged the logic for showing a lock when … by @rightpossible in https://github.com/singerdmx/flutter-quill/pull/2183 - -## New Contributors -* @rightpossible made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2183 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.5...v10.5.6 - -## 10.5.5 - -* Fix text selection handles when scroll mobile by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2176 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.4...v10.5.5 - -## 10.5.4 - -* Add Thai (th) localization by @silkyland in https://github.com/singerdmx/flutter-quill/pull/2175 - -## New Contributors -* @silkyland made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2175 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.3...v10.5.4 - -## 10.5.3 - -* Fix: Assertion Failure in line.dart When Editing Text with Block-Level Attributes by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2174 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.2...v10.5.3 - -## 10.5.2 - -* fix(toolbar): regard showDividers in simple toolbar by @realth000 in https://github.com/singerdmx/flutter-quill/pull/2172 - -## New Contributors -* @realth000 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2172 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.1...v10.5.2 - -## 10.5.1 - -* fix drag selection extension (does not start at tap location if you are dragging quickly by @jezell in https://github.com/singerdmx/flutter-quill/pull/2170 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.0...v10.5.1 - -## 10.5.0 - -* Feat: custom leading builder by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2146 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.9...v10.5.0 - -## 10.4.9 - -* fix floating cursor not disappearing after scroll end by @vishna in https://github.com/singerdmx/flutter-quill/pull/2163 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.8...v10.4.9 - -## 10.4.8 - -* Fix: direction has no opposite effect if the language is rtl by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2154 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.7...v10.4.8 - -## 10.4.7 - -* Fix: Unable to scroll 2nd editor window by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2152 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.6...v10.4.7 - -## 10.4.6 - -* Handle null child query by @jezell in https://github.com/singerdmx/flutter-quill/pull/2151 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.5...v10.4.6 - -## 10.4.5 - -* chore!: move spell checker to example by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2145 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.4...v10.4.5 - -## 10.4.4 - -* fix custom recognizer builder not being passed to editabletextblock by @jezell in https://github.com/singerdmx/flutter-quill/pull/2143 -* fix null reference exception when dragging selection on non scrollable selection by @jezell in https://github.com/singerdmx/flutter-quill/pull/2144 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.3...v10.4.4 - -## 10.4.3 - -* Chore: update simple_spell_checker package by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2139 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.2...v10.4.3 - -## 10.4.2 - -* Revert "fix: Double click to select text sometimes doesn't work. ([#2086](https://github.com/singerdmx/flutter-quill/pull/2086)) - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.1...v10.4.2 - -## 10.4.1 - -* Chore: improve Spell checker API to the example by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2133 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.0...v10.4.1 - -## 10.4.0 - -* Copy TapAndPanGestureRecognizer from TextField by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2128 -* enhance stringToColor with a custom defined palette from `DefaultStyles` by @vishna in https://github.com/singerdmx/flutter-quill/pull/2095 -* Feat: include spell checker for example app by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2127 - -## New Contributors -* @vishna made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2095 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.3...v10.4.0 - -## 10.3.2 - -* Fix: Loss of style when backspace by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2125 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.1...v10.3.2 - -## 10.3.1 - -* Chore: Move spellchecker service to extensions by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2120 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.0...v10.3.1 - -## 10.3.0 - -* Feat: Spellchecker for Flutter Quill by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2118 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.1...v10.3.0 - -## 10.2.1 - -* Fix: context menu is visible even when selection is collapsed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2116 -* Fix: unsafe operation while getting overlayEntry in text_selection by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2117 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.0...v10.2.1 - -## 10.2.0 - -* refactor!: restructure project into modular architecture for flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2106 -* Fix: Link selection and editing by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2114 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.10...v10.2.0 - -## 10.1.10 - -* Fix(example): image_cropper outdated version by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2100 -* Using dart.library.js_interop instead of dart.library.html by @h1376h in https://github.com/singerdmx/flutter-quill/pull/2103 - -## New Contributors -* @h1376h made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2103 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.9...v10.1.10 - -## 10.1.9 - -* restore ability to pass in key to QuillEditor by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2093 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.8...v10.1.9 - -## 10.1.8 - -* Enhancement: Search within Embed objects by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2090 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.7...v10.1.8 - -## 10.1.7 - -* Feature/allow shortcut override by @InstrinsicAutomations in https://github.com/singerdmx/flutter-quill/pull/2089 - -## New Contributors -* @InstrinsicAutomations made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2089 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.6...v10.1.7 - -## 10.1.6 - -* fixed #1295 Double click to select text sometimes doesn't work. by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2086 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.5...v10.1.6 - -## 10.1.5 - -* ref: add `VerticalSpacing.zero` and `HorizontalSpacing.zero` named constants by @adil192 in https://github.com/singerdmx/flutter-quill/pull/2083 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.4...v10.1.5 - -## 10.1.4 - -* Fix: collectStyles for lists and alignments by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2082 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.3...v10.1.4 - -## 10.1.3 - -* Move Controller outside of configurations data class by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2078 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.2...v10.1.3 - -## 10.1.2 - -* Fix Multiline paste with attributes and embeds by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2074 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.1...v10.1.2 - -## 10.1.1 - -* Toolbar dividers fixes + Docs updates by @troyanskiy in https://github.com/singerdmx/flutter-quill/pull/2071 - -## New Contributors -* @troyanskiy made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2071 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.0...v10.1.1 - -## 10.1.0 - -* Feat: support for customize copy and cut Embeddables to Clipboard by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2067 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.10...v10.1.0 - -## 10.0.10 - -* fix: Hide selection toolbar if editor loses focus by @huandu in https://github.com/singerdmx/flutter-quill/pull/2066 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.9...v10.0.10 - -## 10.0.9 - -* Fix: manual checking of directionality by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2063 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.8...v10.0.9 - -## 10.0.8 - -* feat: add callback to handle performAction by @huandu in https://github.com/singerdmx/flutter-quill/pull/2061 -* fix: Invalid selection when tapping placeholder text by @huandu in https://github.com/singerdmx/flutter-quill/pull/2062 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.7...v10.0.8 - -## 10.0.7 - -* Fix: RTL issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2060 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.6...v10.0.7 - -## 10.0.6 - -* fix: textInputAction is not set when creating QuillRawEditorConfiguration by @huandu in https://github.com/singerdmx/flutter-quill/pull/2057 - -## New Contributors -* @huandu made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2057 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.5...v10.0.6 - -## 10.0.5 - -* Add tests for PreserveInlineStylesRule and fix link editing. Other minor fixes. by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2058 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.4...v10.0.5 - -## 10.0.4 - -* Add ability to set up horizontal spacing for block style by @dimkanovikov in https://github.com/singerdmx/flutter-quill/pull/2051 -* add catalan language by @spilioio in https://github.com/singerdmx/flutter-quill/pull/2054 - -## New Contributors -* @dimkanovikov made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2051 -* @spilioio made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2054 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.3...v10.0.4 - -## 10.0.3 - -* doc(Delta): more documentation about Delta by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2042 -* doc(attribute): added documentation about Attribute class and how create one by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2048 -* if magnifier removes toolbar, restore it when it is hidden by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2049 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.2...v10.0.3 - -## 10.0.2 - -* chore(scripts): migrate the scripts from sh to dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2036 -* Have the ability to create custom rules, closes #1162 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/2040 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.1...v10.0.2 - -## 10.0.1 - -This release is identical to [10.0.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.0.0) with a fix that addresses issue #2034 by requiring `10.0.0` as the minimum version for quill related dependencies. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.0...v10.0.1 - -## 10.0.0 - -* refactor: restructure project into modular architecture for flutter_quill by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2032 -* chore: update GitHub PR template by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2033 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.6.0...v10.0.0 - -## 9.6.0 - -* [feature] : quill add magnifier by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2026 - -## New Contributors -* @demoYang made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2026 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.23...v9.6.0 - -## 9.5.23 - -* add untranslated Kurdish keys by @Xoshbin in https://github.com/singerdmx/flutter-quill/pull/2029 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.22...v9.5.23 - -## 9.5.22 - -* Fix outdated contributor guide link on PR template by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2027 -* Fix(rule): PreserveInlineStyleRule assume the type of the operation data and throw stacktrace by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2028 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.21...v9.5.22 - -## 9.5.21 - -* Fix: Key actions not being handled by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2025 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.20...v9.5.21 - -## 9.5.20 - -* Remove useless delta_x_test by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2017 -* Update flutter_quill_delta_from_html package on pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2018 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.19...v9.5.20 - -## 9.5.19 - -* fixed #1835 Embed Reloads on Cmd Key Press by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2013 - -## New Contributors -* @li8607 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2013 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.18...v9.5.19 - -## 9.5.18 - -* Refactor: Moved core link button functions to link.dart by @Alspb in https://github.com/singerdmx/flutter-quill/pull/2008 -* doc: more documentation about Rules by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2014 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.17...v9.5.18 - -## 9.5.17 - -* Feat(config): added option to disable automatic list conversion by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2011 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.16...v9.5.17 - -## 9.5.16 - -* chore: drop support for HTML, PDF, and Markdown converting functions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1997 -* docs(readme): update the extensions package to document the Rich Text Paste feature on web by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2001 -* Fix(test): delta_x tests fail by wrong expected Delta for video embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2010 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.15...v9.5.16 - -## 9.5.15 - -* Update delta_from_html to fix nested lists issues and more by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2000 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.14...v9.5.15 - -## 9.5.14 - -* docs(readme): update 'Conversion to HTML' section to include more details by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1996 -* Update flutter_quill_delta_from_html on pubspec.yaml to fix current issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1999 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.13...v9.5.14 - -## 9.5.13 - -* Added new default ConverterOptions configurations by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1990 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.12...v9.5.13 - -## 9.5.12 - -* fix: Fixed passing textStyle to formula embed by @shubham030 in https://github.com/singerdmx/flutter-quill/pull/1989 - -## New Contributors -* @shubham030 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1989 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.11...v9.5.12 - -## 9.5.11 - -* Update flutter_quill_delta_from_html in pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1988 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.10...v9.5.11 - -## 9.5.10 - -* chore: remove dependency html converter by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1987 -* Fix: LineHeight button to use MenuAnchor by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1986 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.9...v9.5.10 - -## 9.5.9 - -* Update pubspec.yaml to remove html2md by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1985 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.8...v9.5.9 - -## 9.5.8 - -* fix(typo): fix typo ClipboardServiceProvider.instacne by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1983 -* Feat: New way to get Delta from HTML inputs by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1984 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.7...v9.5.8 - -## 9.5.7 - -* refactor: context menu function, add test code by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1979 -* Fix: PreserveInlineStylesRule by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1980 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.6...v9.5.7 - -## 9.5.6 - -* fix: common link is detected as a video link by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1978 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.5...v9.5.6 - -## 9.5.5 - -* fix: context menu behavior in mouse, desktop env by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1976 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.4...v9.5.5 - -## 9.5.4 - -* Feat: Line height support by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1972 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.3...v9.5.4 - -## 9.5.3 - -* Perf: Performance optimization by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1964 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.2...v9.5.3 - -## 9.5.2 - -* Fix style settings by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1962 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.1...v9.5.2 - -## 9.5.1 - -* feat(extensions): Youtube Video Player Support Mode by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1916 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.0...v9.5.1 - -## 9.5.0 - -* Partial support for table embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1960 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.9...v9.5.0 - -## 9.4.9 - -* Upgrade photo_view to 0.15.0 for flutter_quill_extensions by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1958 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.8...v9.4.9 - -## 9.4.8 - -* Add support for html underline and videos by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1955 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.7...v9.4.8 - -## 9.4.7 - -* fixed #1953 italic detection error by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1954 - -## New Contributors -* @CatHood0 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1954 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.6...v9.4.7 - -## 9.4.6 - -* fix: search dialog throw an exception due to missing FlutterQuillLocalizations.delegate in the editor by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1938 -* fix(editor): implement editor shortcut action for home and end keys to fix exception about unimplemented ScrollToDocumentBoundaryIntent by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1937 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.5...v9.4.6 - -## 9.4.5 - -* fix: color picker hex unfocus on web by @geronimol in https://github.com/singerdmx/flutter-quill/pull/1934 - -## New Contributors -* @geronimol made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1934 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.4...v9.4.5 - -## 9.4.4 - -* fix: Enabled link regex to be overridden by @JoepHeijnen in https://github.com/singerdmx/flutter-quill/pull/1931 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.3...v9.4.4 - -## 9.4.3 - -* Fix: setState() called after dispose(): QuillToolbarClipboardButtonState #1895 by @windows7lake in https://github.com/singerdmx/flutter-quill/pull/1926 - -## New Contributors -* @windows7lake made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1926 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.2...v9.4.3 - -## 9.4.2 - -* Respect autofocus, closes #1923 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/1924 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.1...v9.4.2 - -## 9.4.1 - -* replace base64 regex string by @salba360496 in https://github.com/singerdmx/flutter-quill/pull/1919 - -## New Contributors -* @salba360496 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1919 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.0...v9.4.1 - -## 9.4.0 - -This release can be used without changing anything, although it can break the behavior a little, we provided a way to use the old behavior in `9.3.x` - -- Thanks to @Alspb, the search bar/dialog has been reworked for improved UI that fits **Material 3** look and feel, the search happens on the fly, and other minor changes, if you want the old search bar, you can restore it with one line if you're using `QuillSimpleToolbar`: - ```dart - QuillToolbar.simple( - configurations: QuillSimpleToolbarConfigurations( - searchButtonType: SearchButtonType.legacy, - ), - ) - ``` - While the changes are mostly to the `QuillToolbarSearchDialog` and it seems this should be `searchDialogType`, we provided the old button with the old dialog in case we update the button in the future. - - If you're using `QuillToolbarSearchButton` in a custom Toolbar, you don't need anything to get the new button. if you want the old button, use the `QuillToolbarLegacySearchButton` widget - - Consider using the improved button with the improved dialog as the legacy button might removed in future releases (for now, it's not deprecated) - -
- Before - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/9b40ad03-717f-4518-95f1-8d9cad773b2b) - - -
- -
- Improved - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/e581733d-63fa-4984-9c41-4a325a0a0c04) - -
- - For the detailed changes, see #1904 - -- Korean translations by @leegh519 in https://github.com/singerdmx/flutter-quill/pull/1911 - -- The usage of `super_clipboard` plugin in `flutter_quill` has been moved to the `flutter_quill_extensions` package, this will restore the old behavior in `8.x.x` though it will break the `onImagePaste`, `onGifPaste` and rich text pasting from HTML or Markdown, most of those features are available in `super_clipboard` plugin except `onImagePaste` which was available as we were using [pasteboard](https://pub.dev/packages/pasteboard), Unfortunately, it's no longer supported on recent versions of Flutter, and some functionalities such as an image from Clipboard and Html paste are not supported on some platforms such as Android, your project will continue to work, calls of `onImagePaste` and `onGifPaste` will be ignored unless you include [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) package in your project and call: - - ```dart - FlutterQuillExtensions.useSuperClipboardPlugin(); - ``` - Before using any `flutter_quill` widgets, this will restore the old behavior in `9.x.x` - - We initially wanted to publish `flutter_quill_super_clipboard` to allow: - - Using `super_clipboard` without `flutter_quill_extensions` packages and plugins - - Using `flutter_quill_extensions` with optional `super_clipboard` - - To simplify the usage, we moved it to `flutter_quill_extensions`, let us know if you want any of the use cases above. - - Overall `super_clipboard` is a Comprehensive clipboard plugin with a lot of features, the only thing that developers didn't want is Rust installation even though it's automated. - - The main goal of `ClipboardService` is to make `super_clipboard` optional, you can use your own implementation, and create a class that implements `ClipboardService`, which you can get by: - ```dart - // ignore: implementation_imports - import 'package:flutter_quill/src/services/clipboard/clipboard_service.dart'; - ``` - - Then you can call: - ```dart - // ignore: implementation_imports -import 'package:flutter_quill/src/services/clipboard/clipboard_service_provider.dart'; - ClipboardServiceProvider.setInstance(YourClipboardService()); -``` - - The interface could change at any time and will be updated internally for `flutter_quill` and `flutter_quill_extensions`, we didn't export those two classes by default to avoid breaking changes in case you use them as we might change them in the future. - - If you use the above imports, you might get **breaking changes** in **non-breaking change releases**. - -- Subscript and Superscript should now work for all languages and characters - - The previous implementation required the Apple 'SF-Pro-Display-Regular.otf' font which is only licensed/permitted for use on Apple devices. -We have removed the Apple font from the example - -- Allow pasting Markdown and HTML file content from the system to the editor - - Before `9.4.x` if you try to copy an HTML or Markdown file, and paste it into the editor, you will get the file name in the editor - Copying an HTML file, or HTML content from apps and websites is different than copying plain text. - - This is why this change requires `super_clipboard` implementation as this is platform-dependent: - ```dart - FlutterQuillExtensions.useSuperClipboardPlugin(); - ``` - as mentioned above. - - The following example for copying a Markdown file: - -
- Markdown File Content - - ```md - - **Note**: This package supports converting from HTML back to Quill delta but it's experimental and used internally when pasting HTML content from the clipboard to the Quill Editor - - You have two options: - - 1. Using [quill_html_converter](./quill_html_converter/) to convert to HTML, the package can convert the Quill delta to HTML well - (it uses [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html)), it is just a handy extension to do it more quickly - 1. Another option is to use - [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html) to convert your document - to HTML. - This package has full support for all Quill operations—including images, videos, formulas, - tables, and mentions. - Conversion can be performed in vanilla Dart (i.e., server-side or CLI) or in Flutter. - It is a complete Dart part of the popular and mature [quill-delta-to-html](https://www.npmjs.com/package/quill-delta-to-html) - Typescript/Javascript package. - this package doesn't convert the HTML back to Quill Delta as far as we know - - ``` - -
- -
- Before - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/03f5ae20-796c-4e8b-8668-09a994211c1e) - -
- -
- After - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/7e3a1987-36e7-4665-944a-add87d24e788) - -
- - Markdown, and HTML converting from and to Delta are **currently far from perfect**, the current implementation could improved a lot - however **it will likely not work like expected**, due to differences between HTML and Delta, see this [comment](https://github.com/slab/quill/issues/1551#issuecomment-311458570) for more info. - - ![Copying Markdown file into Flutter Quill Editor](https://github.com/singerdmx/flutter-quill/assets/73608287/63bd6ba6-cc49-4335-84dc-91a0fa5c95a9) - - For more details see #1915 - - Using or converting to HTML or Markdown is highly experimental and shouldn't be used for production applications. - - We use it internally as it is more suitable for our specific use case., copying content from external websites and pasting it into the editor - previously breaks the styles, while the current implementation is not ready, it provides a better user experience and doesn't have many downsides. - - Feel free to report any bugs or feature requests at [Issues](https://github.com/singerdmx/flutter-quill/issues) or drop any suggestions and questions at [Discussions](https://github.com/singerdmx/flutter-quill/discussions) - -## New Contributors -* @leegh519 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1911 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.21...v9.4.0 - -## 9.3.21 - -* fix: assertion failure for swipe typing and undo on Android by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1898 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.20...v9.3.21 - -## 9.3.20 - -* Fix: Issue 1887 by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1892 -* fix: toolbar style change will be invalid when inputting more than 2 characters at a time by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1890 - -## New Contributors -* @crasowas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1890 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.19...v9.3.20 - -## 9.3.19 - -* Fix reported issues by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1886 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.18...v9.3.19 - -## 9.3.18 - -* Fix: Undo/redo cursor position fixed by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1885 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.17...v9.3.18 - -## 9.3.17 - -* Update super_clipboard plugin to 0.8.15 to address [#1882](https://github.com/singerdmx/flutter-quill/issues/1882) - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.16...v9.3.17 - -## 9.3.16 - -* Update `lint` dev package to 4.0.0 -* Require at least version 0.8.13 of the plugin - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.15...v9.3.16 - -## 9.3.15 - - -* Ci/automate updating the files by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1879 -* Updating outdated README.md and adding a few guidelines for CONTRIBUTING.md - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.14...v9.3.15 - -## 9.3.14 - -* Chore/use original color picker package in [#1877](https://github.com/singerdmx/flutter-quill/pull/1877) - -## 9.3.13 - -* fix: `readOnlyMouseCursor` losing in construction function -* Fix block multi-line selection style - -## 9.3.12 - -* Add `readOnlyMouseCursor` to config mouse cursor type - -## 9.3.11 - -* Fix typo in QuillHtmlConverter -* Fix re-create checkbox - -## 9.3.10 - -* Support clipboard actions from the toolbar - -## 9.3.9 - -* fix: MD Parsing for multi space -* fix: FontFamily and FontSize toolbars track the text selected in the editor -* feat: Add checkBoxReadOnly property which can override readOnly for checkbox - -## 9.3.8 - -* fix: removed misleading parameters -* fix: added missed translations for ru, es, de -* added translations for Nepali Locale('ne', 'NP') - -## 9.3.7 - -* Fix for keyboard jumping when switching focus from a TextField -* Toolbar button styling to reflect cursor position when running on desktops with keyboard to move care - -## 9.3.6 - -* Add SK and update CS locales [#1796](https://github.com/singerdmx/flutter-quill/pull/1796) -* Fixes: - * QuillIconTheme changes for FontFamily and FontSize buttons are not applied [#1797](https://github.com/singerdmx/flutter-quill/pull/1796) - * Make the arrow_drop_down icons in the QuillToolbar the same size for all MenuAnchor buttons [#1799](https://github.com/singerdmx/flutter-quill/pull/1796) - -## 9.3.5 - -* Update the minimum version for the packages to support `device_info_plus` version 10.0.0 [#1783](https://github.com/singerdmx/flutter-quill/issues/1783) -* Update the minimum version for `youtube_player_flutter` to new major version 9.0.0 in the `flutter_quill_extensions` - -## 9.3.4 - -* fix: multiline styling stuck/not working properly [#1782](https://github.com/singerdmx/flutter-quill/pull/1782) - -## 9.3.3 - -* Update `quill_html_converter` versions - -## 9.3.2 - -* Fix dispose of text painter [#1774](https://github.com/singerdmx/flutter-quill/pull/1774) - -## 9.3.1 - -* Require Flutter 3.19.0 as minimum version - -## 9.3.0 - -* **Breaking change**: `Document.fromHtml(html)` is now returns `Document` instead of `Delta`, use `DeltaX.fromHtml` to return `Delta` -* Update old deprecated api from Flutter 3.19 -* Scribble scroll fix by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/1745 - -## 9.2.14 - -* feat: move cursor after inserting video/image -* Apple pencil - -## 9.2.13 - -* Fix crash with inserting text from contextMenuButtonItems -* Fix incorrect behaviour of context menu -* fix: selection handles behaviour and unnessesary style assert -* Update quill_fr.arb - -## 9.2.12 - -* Fix safari clipboard bug -* Add the option to disable clipboard functionality - -## 9.2.11 - -* Fix a bug where it has problems with pasting text into the editor when the clipboard has styled text - -## 9.2.10 - -* Update example screenshots -* Refactor `Container` to `QuillContainer` with backward compatibility -* A workaround fix in history feature - -## 9.2.9 - -* Refactor the type of `Delta().toJson()` to be more clear type - -## 9.2.8 - -* feat: Export Container node as QuillContainer -* fix web cursor position / height (don't use iOS logic) -* Added Swedish translation - -## 9.2.6 - -* [fix selection.affinity always downstream after updateEditingValue](https://github.com/singerdmx/flutter-quill/pull/1682) -* Bumb version of `super_clipboard` - -## 9.2.5 - -* Bumb version of `super_clipboard` - -## 9.2.4 - -* Use fixed version of intl - -## 9.2.3 - -* remove unncessary column in Flutter quill video embed block - -## 9.2.2 - -* Fix bug [#1627](https://github.com/singerdmx/flutter-quill/issues/1627) - -## 9.2.1 - -* Fix [bug](https://github.com/singerdmx/flutter-quill/issues/1119#issuecomment-1872605246) with font size button -* Added ro RO translations -* 📖 Update zh, zh_CN translations - -## 9.2.0 - -* Require minimum version `6.0.0` of `flutter_keyboard_visibility` to fix some build issues with Android Gradle Plugin 8.2.0 -* Add on image clicked in `flutter_quill_extensions` callback -* Deprecate `globalIconSize` and `globalIconButtonFactor`, use `iconSize` and `iconButtonFactor` instead -* Fix the `QuillToolbarSelectAlignmentButtons` - -## 9.1.1 - -* Require `super_clipboard` minimum version `0.8.1` to fix some bug with Linux build failure - -## 9.1.1-dev - -* Fix bug [#1636](https://github.com/singerdmx/flutter-quill/issues/1636) -* Fix a where you paste styled content (HTML) it always insert a new line at first even if the document is empty -* Fix the font size button and migrate to `MenuAnchor` -* The `defaultDisplayText` is no longer required in the font size and header dropdown buttons -* Add pdf converter in a new package (`quill_pdf_converter`) - -## 9.1.0 - -* Fix the simple toolbar by add properties of `IconButton` and fix some buttons - -## 9.1.0-dev.2 - -* Fix the history buttons - -## 9.1.0-dev.1 - -* Bug fixes in the simple toolbar buttons - -## 9.1.0-dev - -* **Breaking Change**: in the `QuillSimpleToolbar` Fix the `QuillIconTheme` by replacing all the properties with two properties of type `ButtonStyle`, use `IconButton.styleFrom()` - -## 9.0.6 - -* Fix bug in QuillToolbarSelectAlignmentButtons - -## 9.0.5 - -* You can now use most of the buttons without internal provider - -## 9.0.4 - -* Feature: [#1611](https://github.com/singerdmx/flutter-quill/issues/1611) -* Export missing widgets - -## 9.0.3 - -* Flutter Quill Extensions: - * Fix file image support for web image emebed builder - -## 9.0.2 - -* Remove unused properties in the `QuillToolbarSelectHeaderStyleDropdownButton` -* Fix the `QuillSimpleToolbar` when `useMaterial3` is false, please upgrade to the latest version of flutter for better support - -## 9.0.2-dev.3 - -* Export `QuillSingleChildScrollView` - -## 9.0.2-dev.2 - -* Add the new translations for ru, uk arb files by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) -* Add a new dropdown button by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) -* Update the default style values by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) -* Fix bug [#1562](https://github.com/singerdmx/flutter-quill/issues/1562) -* Fix the second bug of [#1480](https://github.com/singerdmx/flutter-quill/issues/1480) - -## 9.0.2-dev.1 - -* Add configurations for the new dropdown `QuillToolbarSelectHeaderStyleButton`, you can use the orignal one or this -* Fix the [issue](https://github.com/singerdmx/flutter-quill/issues/1119) when enter is pressed, all font settings is lost - -## 9.0.2-dev - -* **Breaking change** Remove the spacer widget, removed the controller option for each button -* Add `toolbarRunSpacing` property to the simple toolbar - -## 9.0.1 - -* Fix default icon size - -## 9.0.0 - -* This version is quite stable but it's not how we wanted to be, because the lack of time and there are not too many maintainers active, we decided to publish it, we might make a new breaking changes verion - -## 9.0.1-dev.1 - -* Flutter Quill Extensions: - * Update `QuillImageUtilities` and fixining some bugs - -## 9.0.1-dev - -* Test new GitHub workflows - -## 9.0.0-dev-10 - -* Fix a bug of the improved pasting HTML contents contents into the editor - -## 9.0.0-dev-9 - -* Improves the new logic of pasting HTML contents into the Editor -* Update `README.md` and the doc -* Dispose the `QuillToolbarSelectHeaderStyleButton` state listener in `dispose` -* Upgrade the font family button to material 3 -* Rework the font family and font size functionalities to change the font once and type all over the editor - -## 9.0.0-dev-8 - -* Better support for pasting HTML contents from external websites to the editor -* The experimental support of converting the HTML from `quill_html_converter` is now built-in in the `flutter_quill` and removed from there (Breaking change for `quill_html_converter`) - -## 9.0.0-dev-7 - -* Fix a bug in chaning the background/font color of ol/ul list -* Flutter Quill Extensions: - * Fix link bug in the video url - * Fix patterns - -## 9.0.0-dev-6 - -* Move the `child` from `QuillToolbarConfigurations` into `QuillToolbar` directly -* Bug fixes -* Add the ability to change the background and font color of the ol/ul elements dots and numbers -* Flutter Quill Extensions: - * **Breaking Change**: The `imageProviderBuilder`is now providing the context and image url - -## 9.0.0-dev-5 - -* The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard -* Flutter Quill Extensions: - * Improve the camera button - -## 9.0.0-dev-4 - -* The options parameter in all of the buttons is no longer required which can be useful to create custom toolbar with minimal efforts -* Toolbar buttons fixes in both `flutter_quill` and `flutter_quill_extensions` -* The `QuillProvider` has been dropped and no longer used, the providers will be used only internally from now on and we will not using them as much as possible - -## 9.0.0-dev-3 - -* Breaking Changes: - * Rename `QuillToolbar` to `QuillSimpleToolbar` - * Rename `QuillBaseToolbar` to `QuillToolbar` - * Replace `pasteboard` with `rich_cliboard` -* Fix a bug in the example when inserting an image from url -* Flutter Quill Extensions: - * Add support for copying the image to the system cliboard - -## 9.0.0-dev-2 - -* An attemp to fix CI automated publishing - -## 9.0.0-dev-1 - -* An attemp to fix CI automated publishing - -## 9.0.0-dev - -* **Major Breaking change**: The `QuillProvider` is now optional, the `controller` parameter has been moved to the `QuillEditor` and `QuillToolbar` once again. -* Flutter Quill Extensions; - * **Breaking Change**: Completly change the way how the source code structured to more basic and simple way, organize folders and file names, if you use the library -from `flutter_quill_extensions.dart` then there is nothing you need to do, but if you are using any other import then you need to re-imports -embed, this won't affect how quill js work - * Improvemenets to the image embed - * Add support for `margin` for web - * Add untranslated strings to the `quill_en.arb` - -## 8.6.4 - -* The default value of `keyboardAppearance` for the iOS will be the one from the App/System theme mode instead of always using the `Brightness.light` -* Fix typos in `README.md` - -## 8.6.3 - -* Update the minimum flutter version to `3.16.0` - -## 8.6.2 - -* Restore use of alternative QuillToolbarLinkStyleButton2 widget - -## 8.6.1 - -* Temporary revert style bug fix - -## 8.6.0 - -* **Breaking Change** Support [Flutter 3.16](https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1), please upgrade to the latest stable version of flutter to use this update -* **Breaking Change**: Remove Deprecated Fields -* **Breaking Change**: Extract the shared things between `QuillToolbarConfigurations` and `QuillBaseToolbarConfigurations` -* **Breaking Change**: You no longer need to use `QuillToolbarProvider` when using custom toolbar buttons, the example has been updated -* Bug fixes - -## 8.5.5 - -* Now when opening dialogs by `QuillToolbar` you will not get an exception when you don't use `FlutterQuillLocalizations.delegate` in your `WidgetsApp`, `MaterialApp`, or `CupertinoApp`. The fix is for the `QuillToolbarSearchButton`, `QuillToolbarLinkStyleButton`, and `QuillToolbarColorButton` buttons - -## 8.5.4 - -* The `mobileWidth`, `mobileHeight`, `mobileMargin`, and `mobileAlignment` is now deprecated in `flutter_quill`, they are now defined in `flutter_quill_extensions` -* Deprecate `replaceStyleStringWithSize` function which is in `string.dart` -* Deprecate `alignment`, and `margin` as they don't conform to official Quill JS - -## 8.5.3 - -* Update doc -* Update `README.md` and `CHANGELOG.md` -* Fix typos -* Use `immutable` when possible -* Update `.pubignore` - -## 8.5.2 - -* Updated `README.md`. -* Feature: Added the ability to include a custom callback when the `QuillToolbarColorButton` is pressed. -* The `QuillToolbar` now implements `PreferredSizeWidget`, enabling usage in the AppBar, similar to `QuillBaseToolbar`. - -## 8.5.1 - -* Updated `README.md`. - -## 8.5.0 - -* Migrated to `flutter_localizations` for translations. -* Fixed: Translated all previously untranslated localizations. -* Fixed: Added translations for missing items. -* Fixed: Introduced default Chinese fallback translation. -* Removed: Unused parameters `items` in `QuillToolbarFontFamilyButtonOptions` and `QuillToolbarFontSizeButtonOptions`. -* Updated: Documentation. - -## 8.4.4 - -* Updated `.pubignore` to ignore unnecessary files and folders. - -## 8.4.3 - -* Updated `CHANGELOG.md`. - -## 8.4.2 - -* **Breaking change**: Configuration for `QuillRawEditor` has been moved to a separate class. Additionally, `readOnly` has been renamed to `isReadOnly`. If using `QuillEditor`, no action is required. -* Introduced the ability for developers to override `TextInputAction` in both `QuillRawEditor` and `QuillEditor`. -* Enabled using `QuillRawEditor` without `QuillEditorProvider`. -* Bug fixes. -* Added image cropping implementation in the example. - -## 8.4.1 - -* Added `copyWith` in `OptionalSize` class. - -## 8.4.0 - -* **Breaking change**: Updated `QuillCustomButton` to use `QuillCustomButtonOptions`. Moved all properties from `QuillCustomButton` to `QuillCustomButtonOptions`, replacing `iconData` with `icon` widget for increased customization. -* **Breaking change**: `customButtons` in `QuillToolbarConfigurations` is now of type `List`. -* Bug fixes following the `8.0.0` update. -* Updated `README.md`. -* Improved platform checking. - -## 8.3.0 - -* Added `iconButtonFactor` property to `QuillToolbarBaseButtonOptions` for customizing button size relative to its icon size (defaults to `kIconButtonFactor`, consistent with previous releases). - -## 8.2.6 - -* Organized `QuillRawEditor` code. - -## 8.2.5 - -* Added `builder` property in `QuillEditorConfigurations`. - -## 8.2.4 - -* Adhered to Flutter best practices. -* Fixed auto-focus bug. - -## 8.2.3 - -* Updated `README.md`. - -## 8.2.2 - -* Moved `flutter_quill_test` to a separate package: [flutter_quill_test](https://pub.dev/packages/flutter_quill_test). - -## 8.2.1 - -* Updated `README.md`. - -## 8.2.0 - -* Added the option to add configurations for `flutter_quill_extensions` using `extraConfigurations`. - -## 8.1.11 - -* Followed Dart best practices by using `lints` and removed `pedantic` and `platform` since they are not used. -* Fixed text direction bug. -* Updated `README.md`. - -## 8.1.10 - -* Secret for automated publishing to pub.dev. - -## 8.1.9 - -* Fixed automated publishing to pub.dev. - -## 8.1.8 - -* Fixed automated publishing to pub.dev. - -## 8.1.7 - -* Automated publishing to pub.dev. - -## 8.1.6 - -* Fixed compatibility with `integration_test` by downgrading the minimum version of the platform package to 3.1.0. - -## 8.1.5 - -* Reversed background/font color toolbar button icons. - -## 8.1.4 - -* Reversed background/font color toolbar button tooltips. - -## 8.1.3 - -* Moved images to screenshots instead of `README.md`. - -## 8.1.2 - -* Fixed a bug related to the regexp of the insert link dialog. -* Required Dart 3 as the minimum version. -* Code cleanup. -* Added a spacer widget between each button in the `QuillToolbar`. - -## 8.1.1 - -* Fixed null error in line.dart #1487(https://github.com/singerdmx/flutter*quill/issues/1487). - -## 8.1.0 - -* Fixed a word typo of `mirgration` to `migration` in the readme & migration document. -* Updated migration guide. -* Removed property `enableUnfocusOnTapOutside` in `QuillEditor` configurations and added `isOnTapOutsideEnabled` instead. -* Added a new callback called `onTapOutside` in the `QuillEditorConfigurations` to perform actions when tapping outside the editor. -* Fixed a bug that caused the web platform to not unfocus the editor when tapping outside of it. To override this, please pass a value to the `onTapOutside` callback. -* Removed the old property of `iconTheme`. Instead, pass `iconTheme` in the button options; you will find the `base` property inside it with `iconTheme`. - -## 8.0.0 - -* If you have migrated recently, don't be alarmed by this update; it adds documentation, a migration guide, and marks the version as a more stable release. Although there are breaking changes (as reported by some developers), the major version was not changed due to time constraints during development. A single property was also renamed from `code` to `codeBlock` in the `elements` of the new `QuillEditorConfigurations` class. -* Updated the README for better readability. - -## 7.10.2 - -* Removed line numbers from code blocks by default. You can still enable this feature thanks to the new configurations in the `QuillEditor`. Find the `elementOptions` property and enable `enableLineNumbers`. - -## 7.10.1 - -* Fixed issues and utilized the new parameters. -* No longer need to use `MaterialApp` for most toolbar button child builders. -* Compatibility with [fresh_quill_extensions](https://pub.dev/packages/fresh_quill_extensions), a temporary alternative to [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions). -* Updated most of the documentation in `README.md`. - -## 7.10.0 - -* **Breaking change**: `QuillToolbar.basic()` can be accessed directly from `QuillToolbar()`, and the old `QuillToolbar` can be accessed from `QuillBaseToolbar`. -* Refactored Quill editor and toolbar configurations into a single class each. -* After changing checkbox list values, the controller will not request keyboard focus by default. -* Moved toolbar and editor configurations directly into the widget but still use inherited widgets internally. -* Fixes to some code after the refactoring. - -## 7.9.0 - -* Buttons Improvemenets -* Refactor all the button configurations that used in `QuillToolbar.basic()` but there are still few lefts -* **Breaking change**: Remove some configurations from the QuillToolbar and move them to the new `QuillProvider`, please notice this is a development version and this might be changed in the next few days, the stable release will be ready in less than 3 weeks -* Update `flutter_quill_extensions` and it will be published into pub.dev soon. -* Allow you to customize the search dialog by custom callback with child builder - -## 7.8.0 - -* **Important note**: this is not test release yet, it works but need more test and changes and breaking changes, we don't have development version and it will help us if you try the latest version and report the issues in Github but if you want a stable version please use `7.4.16`. this refactoring process will not take long and should be done less than three weeks with the testing. -* We managed to refactor most of the buttons configurations and customizations in the `QuillProvider`, only three lefts then will start on refactoring the toolbar configurations -* Code improvemenets - -## 7.7.0 - -* **Breaking change**: We have mirgrated more buttons in the toolbar configurations, you can do change them in the `QuillProvider` -* Important bug fixes - -## 7.6.1 - -* Bug fixes - -## 7.6.0 - -* **Breaking change**: To customize the buttons in the toolbar, you can do that in the `QuillProvider` - -## 7.5.0 - -* **Breaking change**: The widgets `QuillEditor` and `QuillToolbar` are no longer have controller parameter, instead you need to make sure in the widget tree you have wrapped them with `QuillProvider` widget and provide the controller and the require configurations - -## 7.4.16 - -* Update documentation and README.md - -## 7.4.15 - -* Custom style attrbuites for platforms other than mobile (alignment, margin, width, height) -* Bug fixes and other improvemenets - -## 7.4.14 - -* Improve performance by reducing the number of widgets rebuilt by listening to media query for only the needed things, for example instead of using `MediaQuery.of(context).size`, now we are using `MediaQuery.sizeOf(context)` -* Add MediaButton for picking the images only since the video one is not ready -* A new feature which allows customizing the text selection in quill editor which is useful for custom theme design system for custom app widget - -## 7.4.13 - -* Fixed tab editing when in readOnly mode. - -## 7.4.12 - -* Update the minimum version of device_info_plus to 9.1.0. - -## 7.4.11 - -* Add sw locale. - -## 7.4.10 - -* Update translations. - -## 7.4.9 - -* Style recognition fixes. - -## 7.4.8 - -* Upgrade dependencies. - -## 7.4.7 - -* Add Vietnamese and German translations. - -## 7.4.6 - -* Fix more null errors in Leaf.retain [##1394](https://github.com/singerdmx/flutter-quill/issues/1394) and Line.delete [##1395](https://github.com/singerdmx/flutter-quill/issues/1395). - -## 7.4.5 - -* Fix null error in Container.insert [##1392](https://github.com/singerdmx/flutter-quill/issues/1392). - -## 7.4.4 - -* Fix extra padding on checklists [##1131](https://github.com/singerdmx/flutter-quill/issues/1131). - -## 7.4.3 - -* Fixed a space input error on iPad. - -## 7.4.2 - -* Fix bug with keepStyleOnNewLine for link. - -## 7.4.1 - -* Fix toolbar dividers condition. - -## 7.4.0 - -* Support Flutter version 3.13.0. - -## 7.3.3 - -* Updated Dependencies conflicting. - -## 7.3.2 - -* Added builder for custom button in _LinkDialog. - -## 7.3.1 - -* Added case sensitive and whole word search parameters. -* Added wrap around. -* Moved search dialog to the bottom in order not to override the editor and the text found. -* Other minor search dialog enhancements. - -## 7.3.0 - -* Add default attributes to basic factory. - -## 7.2.19 - -* Feat/link regexp. - -## 7.2.18 - -* Fix paste block text in words apply same style. - -## 7.2.17 - -* Fix paste text mess up style. -* Add support copy/cut block text. - -## 7.2.16 - -* Allow for custom context menu. - -## 7.2.15 - -* Add flutter_quill.delta library which only exposes Delta datatype. - -## 7.2.14 - -* Fix errors when the editor is used in the `screenshot` package. - -## 7.2.13 - -* Fix around image can't delete line break. - -## 7.2.12 - -* Add support for copy/cut select image and text together. - -## 7.2.11 - -* Add affinity for localPosition. - -## 7.2.10 - -* LINE._getPlainText queryChild inclusive=false. - -## 7.2.9 - -* Add toPlainText method to `EmbedBuilder`. - -## 7.2.8 - -* Add custom button widget in toolbar. - -## 7.2.7 - -* Fix language code of Japan. - -## 7.2.6 - -* Style custom toolbar buttons like builtins. - -## 7.2.5 - -* Always use text cursor for editor on desktop. - -## 7.2.4 - -* Fixed keepStyleOnNewLine. - -## 7.2.3 - -* Get pixel ratio from view. - -## 7.2.2 - -* Prevent operations on stale editor state. - -## 7.2.1 - -* Add support for android keyboard content insertion. -* Enhance color picker, enter hex color and color palette option. - -## 7.2.0 - -* Checkboxes, bullet points, and number points are now scaled based on the default paragraph font size. - -## 7.1.20 - -* Pass linestyle to embedded block. - -## 7.1.19 - -* Fix Rtl leading alignment problem. - -## 7.1.18 - -* Support flutter latest version. - -## 7.1.17+1 - -* Updates `device_info_plus` to version 9.0.0 to benefit from AGP 8 (see [changelog##900](https://pub.dev/packages/device_info_plus/changelog##900)). - -## 7.1.16 - -* Fixed subscript key from 'sup' to 'sub'. - -## 7.1.15 - -* Fixed a bug introduced in 7.1.7 where each section in `QuillToolbar` was displayed on its own line. - -## 7.1.14 - -* Add indents change for multiline selection. - -## 7.1.13 - -* Add custom recognizer. - -## 7.1.12 - -* Add superscript and subscript styles. - -## 7.1.11 - -* Add inserting indents for lines of list if text is selected. - -## 7.1.10 - -* Image embedding tweaks - * Add MediaButton which is intened to superseed the ImageButton and VideoButton. Only image selection is working. - * Implement image insert for web (image as base64) - -## 7.1.9 - -* Editor tweaks PR from bambinoua(https://github.com/bambinoua). - * Shortcuts now working in Mac OS - * QuillDialogTheme is extended with new properties buttonStyle, linkDialogConstraints, imageDialogConstraints, isWrappable, runSpacing, - * Added LinkStyleButton2 with new LinkStyleDialog (similar to Quill implementation - * Conditinally use Row or Wrap for dialog's children. - * Update minimum Dart SDK version to 2.17.0 to use enum extensions. - * Use merging shortcuts and actions correclty (if the key combination is the same) - -## 7.1.8 - -* Dropdown tweaks - * Add itemHeight, itemPadding, defaultItemColor for customization of dropdown items. - * Remove alignment property as useless. - * Fix bugs with max width when width property is null. - -## 7.1.7 - -* Toolbar tweaks. - * Implement tooltips for embed CameraButton, VideoButton, FormulaButton, ImageButton. - * Extends customization for SelectAlignmentButton, QuillFontFamilyButton, QuillFontSizeButton adding padding, text style, alignment, width. - * Add renderFontFamilies to QuillFontFamilyButton to show font faces in dropdown. - * Add AxisDivider and its named constructors for for use in parent project. - * Export ToolbarButtons enum to allow specify tooltips for SelectAlignmentButton. - * Export QuillFontFamilyButton, SearchButton as they were not exported before. - * Deprecate items property in QuillFontFamilyButton, QuillFontSizeButton as the it can be built usinr rawItemsMap. - * Make onSelection QuillFontFamilyButton, QuillFontSizeButton omittable as no need to execute callback outside if controller is passed to widget. - -Now the package is more friendly for web projects. - -## 7.1.6 - -* Add enableUnfocusOnTapOutside field to RawEditor and Editor widgets. - -## 7.1.5 - -* Add tooltips for toolbar buttons. - -## 7.1.4 - -* Fix inserting tab character in lists. - -## 7.1.3 - -* Fix ios cursor bug when word.length==1. - -## 7.1.2 - -* Fix non scrollable editor exception, when tapped under content. - -## 7.1.1 - -* customLinkPrefixes parameter * makes possible to open links with custom protoco. - -## 7.1.0 - -* Fix ordered list numeration with several lists in document. - -## 7.0.9 - -* Use const constructor for EmbedBuilder. - -## 7.0.8 - -* Fix IME position bug with scroller. - -## 7.0.7 - -* Add TextFieldTapRegion for contextMenu. - -## 7.0.6 - -* Fix line style loss on new line from non string. - -## 7.0.5 - -* Fix IME position bug for Mac and Windows. -* Unfocus when tap outside editor. fix the bug that cant refocus in afterButtonPressed after click ToggleStyleButton on Mac. - -## 7.0.4 - -* Have text selection span full line height for uneven sized text. - -## 7.0.3 - -* Fix ordered list numeration for lists with more than one level of list. - -## 7.0.2 - -* Allow widgets to override widget span properties. - -## 7.0.1 - -* Update i18n_extension dependency to version 8.0.0. - -## 7.0.0 - -* Breaking change: Tuples are no longer used. They have been replaced with a number of data classes. - -## 6.4.4 - -* Increased compatibility with Flutter widget tests. - -## 6.4.3 - -* Update dependencies (collection: 1.17.0, flutter_keyboard_visibility: 5.4.0, quiver: 3.2.1, tuple: 2.0.1, url_launcher: 6.1.9, characters: 1.2.1, i18n_extension: 7.0.0, device_info_plus: 8.1.0) - -## 6.4.2 - -* Replace `buildToolbar` with `contextMenuBuilder`. - -## 6.4.1 - -* Control the detect word boundary behaviour. - -## 6.4.0 - -* Use `axis` to make the toolbar vertical. -* Use `toolbarIconCrossAlignment` to align the toolbar icons on the cross axis. -* Breaking change: `QuillToolbar`'s parameter `toolbarHeight` was renamed to `toolbarSize`. - -## 6.3.5 - -* Ability to add custom shortcuts. - -## 6.3.4 - -* Update clipboard status prior to showing selected text overlay. - -## 6.3.3 - -* Fixed handling of mac intents. - -## 6.3.2 - -* Added `unknownEmbedBuilder` to QuillEditor. -* Fix error style when input chinese japanese or korean. - -## 6.3.1 - -* Add color property to the basic factory function. - -## 6.3.0 - -* Support Flutter 3.7. - -## 6.2.2 - -* Fix: nextLine getter null where no assertion. - -## 6.2.1 - -* Revert "Align numerical and bullet lists along with text content". - -## 6.2.0 - -* Align numerical and bullet lists along with text content. - -## 6.1.12 - -* Apply i18n for default font dropdown option labels corresponding to 'Clear'. - -## 6.1.11 - -* Remove iOS hack for delaying focus calculation. - -## 6.1.10 - -* Delay focus calculation for iOS. - -## 6.1.9 - -* Bump keyboard show up wait to 1 sec. - -## 6.1.8 - -* Recalculate focus when showing keyboard. - -## 6.1.7 - -* Add czech localizations. - -## 6.1.6 - -* Upgrade i18n_extension to 6.0.0. - -## 6.1.5 - -* Fix formatting exception. - -## 6.1.4 - -* Add double quotes validation. - -## 6.1.3 - -* Revert "fix order list numbering (##988)". - -## 6.1.2 - -* Add typing shortcuts. - -## 6.1.1 - -* Fix order list numbering. - -## 6.1.0 - -* Add keyboard shortcuts for editor actions. - -## 6.0.10 - -* Upgrade device info plus to ^7.0.0. - -## 6.0.9 - -* Don't throw showAutocorrectionPromptRect not implemented. The function is called with every keystroke as a user is typing. - -## 6.0.8+1 - -* Fixes null pointer when setting documents. - -## 6.0.8 - -* Make QuillController.document mutable. - -## 6.0.7 - -* Allow disabling of selection toolbar. - -## 6.0.6+1 - -* Revert 6.0.6. - -## 6.0.6 - -* Fix wrong custom embed key. - -## 6.0.5 - -* Fixes toolbar buttons stealing focus from editor. - -## 6.0.4 - -* Bug fix for Type 'Uint8List' not found. - -## 6.0.3 - -* Add ability to paste images. - -## 6.0.2 - -* Address Dart Analysis issues. - -## 6.0.1 - -* Changed translation country code (zh_HK -> zh_hk) to lower case, which is required for i18n_extension used in flutter_quill. -* Add localization in example's main to demonstrate translation. -* Issue Windows selection's copy / paste tool bar not shown ##861: add selection's copy / paste toolbar, escape to hide toolbar, mouse right click to show toolbar, ctrl-Y / ctrl-Z to undo / redo. -* Image and video displayed in Windows platform caused screen flickering while selecting text, a sample_data_nomedia.json asset is added for Desktop to demonstrate the added features. -* Known issue: keyboard action sometimes causes exception mentioned in Flutter's issue ##106475 (Windows Keyboard shortcuts stop working after modifier key repeat flutter/flutter##106475). -* Know issue: user needs to click the editor to get focus before toolbar is able to display. - -## 6.0.0 BREAKING CHANGE - -* Removed embed (image, video & formula) blocks from the package to reduce app size. - -These blocks have been moved to the package `flutter_quill_extensions`, migrate by filling the `embedBuilders` and `embedButtons` parameters as follows: - -``` -import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; - -QuillEditor.basic( - controller: controller, - embedBuilders: FlutterQuillEmbeds.builders(), -); - -QuillToolbar.basic( - controller: controller, - embedButtons: FlutterQuillEmbeds.buttons(), -); -``` - -## 5.4.2 - -* Upgrade i18n_extension. - -## 5.4.1 - -* Update German Translation. - -## 5.4.0 - -* Added Formula Button (for maths support). - -## 5.3.2 - -* Add more font family. - -## 5.3.1 - -* Enable search when text is not empty. - -## 5.3.0 - -* Added search function. - -## 5.2.11 - -* Remove default small color. - -## 5.2.10 - -* Don't wrap the QuillEditor's child in the EditorTextSelectionGestureDetector if selection is disabled. - -## 5.2.9 - -* Added option to modify SelectHeaderStyleButton options. -* Added option to click again on h1, h2, h3 button to go back to normal. - -## 5.2.8 - -* Remove tooltip for LinkStyleButton. -* Make link match regex case insensitive. - -## 5.2.7 - -* Add locale to QuillEditor.basic. - -## 5.2.6 - -* Fix keyboard pops up when resizing the image. - -## 5.2.5 - -* Upgrade youtube_player_flutter_quill to 8.2.2. - -## 5.2.4 - -* Upgrade youtube_player_flutter_quill to 8.2.1. - -## 5.2.3 - -* Flutter Quill Doesn't Work On iOS 16 or Xcode 14 Betas (Stored properties cannot be marked potentially unavailable with '@available'). - -## 5.2.2 - -* Fix Web Unsupported operation: Platform.\_operatingSystem error. - -## 5.2.1 - -* Rename QuillCustomIcon to QuillCustomButton. - -## 5.2.0 - -* Support font family selection. - -## 5.1.1 - -* Update README. - -## 5.1.0 - -* Added CustomBlockEmbed and customElementsEmbedBuilder. - -## 5.0.5 - -* Upgrade device_info_plus to 4.0.0. - -## 5.0.4 - -* Added onVideoInit callback for video documents. - -## 5.0.3 - -* Update dependencies. - -## 5.0.2 - -* Keep cursor position on checkbox tap. - -## 5.0.1 - -* Fix static analysis errors. - -## 5.0.0 - -* Flutter 3.0.0 support. - -## 4.2.3 - -* Ignore color:inherit and convert double to int for level. - -## 4.2.2 - -* Add clear option to font size dropdown. - -## 4.2.1 - -* Refactor font size dropdown. - -## 4.2.0 - -* Ensure selectionOverlay is available for showToolbar. - -## 4.1.9 - -* Using properly iconTheme colors. - -## 4.1.8 - -* Update font size dropdown. - -## 4.1.7 - -* Convert FontSize to a Map to allow for named Font Size. - -## 4.1.6 - -* Update quill_dropdown_button.dart. - -## 4.1.5 - -* Add Font Size dropdown to the toolbar. - -## 4.1.4 - -* New borderRadius for iconTheme. - -## 4.1.3 - -* Fix selection handles show/hide after paste, backspace, copy. - -## 4.1.2 - -* Add full support for hardware keyboards (Chromebook, Android tablets, etc) that don't alter screen UI. - -## 4.1.1 - -* Added textSelectionControls field in QuillEditor. - -## 4.1.0 - -* Added Node to linkActionPickerDelegate. - -## 4.0.12 - -* Add Persian(fa) language. - -## 4.0.11 - -* Fix cut selection error in multi-node line. - -## 4.0.10 - -* Fix vertical caret position bug. - -## 4.0.9 - -* Request keyboard focus when no child is found. - -## 4.0.8 - -* Fix blank lines do not display when **web*renderer=html. - -## 4.0.7 - -* Refactor getPlainText (better handling of blank lines and lines with multiple markups. - -## 4.0.6 - -* Bug fix for copying text with new lines. - -## 4.0.5 - -* Fixed casting null to Tuple2 when link dialog is dismissed without any input (e.g. barrier dismissed). - -## 4.0.4 - -* Bug fix for text direction rtl. - -## 4.0.3 - -* Support text direction rtl. - -## 4.0.2 - -* Clear toggled style on selection change. - -## 4.0.1 - -* Fix copy/cut/paste/selectAll not working. - -## 4.0.0 - -* Upgrade for Flutter 2.10. - -## 3.9.11 - -* Added Indonesian translation. - -## 3.9.10 - -* Fix for undoing a modification ending with an indented line. - -## 3.9.9 - -* iOS: Save image whose filename does not end with image file extension. - -## 3.9.8 - -* Added Urdu translation. - -## 3.9.7 - -* Fix for clicking on the Link button without any text on a new line crashes. - -## 3.9.6 - -* Apply locale to QuillEditor(contents). - -## 3.9.5 - -* Fix image pasting. - -## 3.9.4 - -* Hiding dialog after selecting action for image. - -## 3.9.3 - -* Update ImageResizer for Android. - -## 3.9.2 - -* Copy image with its style. - -## 3.9.1 - -* Support resizing image. - -## 3.9.0 - -* Image menu options for copy/remove. - -## 3.8.8 - -* Update set textEditingValue. - -## 3.8.7 - -* Fix checkbox not toggled correctly in toolbar button. - -## 3.8.6 - -* Fix cursor position changes when checking/unchecking the checkbox. - -## 3.8.5 - -* Fix \_handleDragUpdate in \_TextSelectionHandleOverlayState. - -## 3.8.4 - -* Fix link dialog layout. - -## 3.8.3 - -* Fix for errors on a non scrollable editor. - -## 3.8.2 - -* Fix certain keys not working on web when editor is a child of a scroll view. - -## 3.8.1 - -* Refactor \_QuillEditorState to QuillEditorState. - -## 3.8.0 - -* Support pasting with format. - -## 3.7.3 - -* Fix selection overlay for collapsed selection. - -## 3.7.2 - -* Reverted Embed toPlainText change. - -## 3.7.1 - -* Change Embed toPlainText to be empty string. - -## 3.7.0 - -* Replace Toolbar showHistory group with individual showRedo and showUndo. - -## 3.6.5 - -* Update Link dialogue for image/video. - -## 3.6.4 - -* Link dialogue TextInputType.multiline. - -## 3.6.3 - -* Bug fix for link button text selection. - -## 3.6.2 - -* Improve link button. - -## 3.6.1 - -* Remove SnackBar 'What is entered is not a link'. - -## 3.6.0 - -* Allow link button to enter text. - -## 3.5.3 - -* Change link button behavior. - -## 3.5.2 - -* Bug fix for embed. - -## 3.5.1 - -* Bug fix for platform util. - -## 3.5.0 - -* Removed redundant classes. - -## 3.4.4 - -* Add more translations. - -## 3.4.3 - -* Preset link from attributes. - -## 3.4.2 - -* Fix launch link edit mode. - -## 3.4.1 - -* Placeholder effective in scrollable. - -## 3.4.0 - -* Option to save image in read-only mode. - -## 3.3.1 - -* Pass any specified key in QuillEditor constructor to super. - -## 3.3.0 - -* Fixed Style toggle issue. - -## 3.2.1 - -* Added new translations. - -## 3.2.0 - -* Support multiple links insertion on the go. - -## 3.1.1 - -* Add selection completed callback. - -## 3.1.0 - -* Fixed image ontap functionality. - -## 3.0.4 - -* Add maxContentWidth constraint to editor. - -## 3.0.3 - -* Do not show caret on screen when the editor is not focused. - -## 3.0.2 - -* Fix launch link for read-only mode. - -## 3.0.1 - -* Handle null value of Attribute.link. - -## 3.0.0 - -* Launch link improvements. -* Removed QuillSimpleViewer. - -## 2.5.2 - -* Skip image when pasting. - -## 2.5.1 - -* Bug fix for Desktop `Shift` + `Click` support. - -## 2.5.0 - -* Update checkbox list. - -## 2.4.1 - -* Desktop selection improvements. - -## 2.4.0 - -* Improve inline code style. - -## 2.3.3 - -* Improves selection rects to have consistent height regardless of individual segment text styles. - -## 2.3.2 - -* Allow disabling floating cursor. - -## 2.3.1 - -* Preserve last newline character on delete. - -## 2.3.0 - -* Massive changes to support flutter 2.8. - -## 2.2.2 - -* iOS - floating cursor. - -## 2.2.1 - -* Bug fix for imports supporting flutter 2.8. - -## 2.2.0 - -* Support flutter 2.8. - -## 2.1.1 - -* Add methods of clearing editor and moving cursor. - -## 2.1.0 - -* Add delete handler. - -## 2.0.23 - -* Support custom replaceText handler. - -## 2.0.22 - -* Fix attribute compare and fix font size parsing. - -## 2.0.21 - -* Handle click on embed object. - -## 2.0.20 - -* Improved UX/UI of Image widget. - -## 2.0.19 - -* When uploading a video, applying indicator. - -## 2.0.18 - -* Make toolbar dividers optional. - -## 2.0.17 - -* Allow alignment of the toolbar icons to match WrapAlignment. - -## 2.0.16 - -* Add hide / show alignment buttons. - -## 2.0.15 - -* Implement change cursor to SystemMouseCursors.click when hovering a link styled text. - -## 2.0.14 - -* Enable customize the checkbox widget using DefaultListBlockStyle style. - -## 2.0.13 - -* Improve the scrolling performance by reducing the repaint areas. - -## 2.0.12 - -* Fix the selection effect can't be seen as the textLine with background color. - -## 2.0.11 - -* Fix visibility of text selection handlers on scroll. - -## 2.0.10 - -* cursorConnt.color notify the text_line to repaint if it was disposed. - -## 2.0.9 - -* Improve UX when trying to add a link. - -## 2.0.8 - -* Adding translations to the toolbar. - -## 2.0.7 - -* Added theming options for toolbar icons and LinkDialog. - -## 2.0.6 - -* Avoid runtime error when placed inside TabBarView. - -## 2.0.5 - -* Support inline code formatting. - -## 2.0.4 - -* Enable history shortcuts for desktop. - -## 2.0.3 - -* Fix cursor when line contains image. - -## 2.0.2 - -* Address KeyboardListener class name conflict. - -## 2.0.1 - -* Upgrade flutter_colorpicker to 0.5.0. - -## 2.0.0 - -* Text Alignment functions + Block Format standards. - -## 1.9.6 - -* Support putting QuillEditor inside a Scrollable view. - -## 1.9.5 - -* Skip image when pasting. - -## 1.9.4 - -* Bug fix for cursor position when tapping at the end of line with image(s). - -## 1.9.3 - -* Bug fix when line only contains one image. - -## 1.9.2 - -* Support for building custom inline styles. - -## 1.9.1 - -* Cursor jumps to the most appropriate offset to display selection. - -## 1.9.0 - -* Support inline image. - -## 1.8.3 - -* Updated quill_delta. - -## 1.8.2 - -* Support mobile image alignment. - -## 1.8.1 - -* Support mobile custom size image. - -## 1.8.0 - -* Support entering link for image/video. - -## 1.7.3 - -* Bumps photo_view version. - -## 1.7.2 - -* Fix static analysis error. - -## 1.7.1 - -* Support Youtube video. - -## 1.7.0 - -* Support video. - -## 1.6.4 - -* Bug fix for clear format button. - -## 1.6.3 - -* Fixed dragging right handle scrolling issue. - -## 1.6.2 - -* Fixed the position of the selection status drag handle. - -## 1.6.1 - -* Upgrade image_picker and flutter_colorpicker. - -## 1.6.0 - -* Support Multi Row Toolbar. - -## 1.5.0 - -* Remove file_picker dependency. - -## 1.4.1 - -* Remove filesystem_picker dependency. - -## 1.4.0 - -* Remove path_provider dependency. - -## 1.3.4 - -* Add option to paintCursorAboveText. - -## 1.3.3 - -* Upgrade file_picker version. - -## 1.3.2 - -* Fix copy/paste bug. - -## 1.3.1 - -* New logo. - -## 1.3.0 - -* Support flutter 2.2.0. - -## 1.2.2 - -* Checkbox supports tapping. - -## 1.2.1 - -* Indented position not holding while editing. - -## 1.2.0 - -* Fix image button cancel causes crash. - -## 1.1.8 - -* Fix height of empty line bug. - -## 1.1.7 - -* Fix text selection in read-only mode. - -## 1.1.6 - -* Remove universal_html dependency. - -## 1.1.5 - -* Enable "Select", "Select All" and "Copy" in read-only mode. - -## 1.1.4 - -* Fix text selection issue. - -## 1.1.3 - -* Update example folder. - -## 1.1.2 - -* Add pedantic. - -## 1.1.1 - -* Base64 image support. - -## 1.1.0 - -* Support null safety. - -## 1.0.9 - -* Web support for raw editor and keyboard listener. - -## 1.0.8 - -* Support token attribute. - -## 1.0.7 - -* Fix crash on web (dart:io). - -## 1.0.6 - -* Add desktop support WINDOWS, MACOS and LINUX. - -## 1.0.5 - -* Bug fix: Can not insert newline when Bold is toggled ON. - -## 1.0.4 - -* Upgrade photo_view to ^0.11.0. - -## 1.0.3 - -* Fix issue that text is not displayed while typing WEB. - -## 1.0.2 - -* Update toolbar in sample home page. - -## 1.0.1 - -* Fix static analysis errors. - -## 1.0.0 - -* Support flutter 2.0. - -## 1.0.0-dev.2 - -* Improve link handling for tel, mailto and etc. - -## 1.0.0-dev.1 - -* Upgrade prerelease SDK & Bump for master. - -## 0.3.5 - -* Fix for cursor focus issues when keyboard is on. - -## 0.3.4 - -* Improve link handling for tel, mailto and etc. - -## 0.3.3 - -* More fix on cursor focus issue when keyboard is on. - -## 0.3.2 - -* Fix cursor focus issue when keyboard is on. - -## 0.3.1 - -* cursor focus when keyboard is on. - -## 0.3.0 - -* Line Height calculated based on font size. - -## 0.2.12 - -* Support placeholder. - -## 0.2.11 - -* Fix static analysis error. - -## 0.2.10 - -* Update TextInputConfiguration autocorrect to true in stable branch. - -## 0.2.9 - -* Update TextInputConfiguration autocorrect to true. - -## 0.2.8 - -* Support display local image besides network image in stable branch. - -## 0.2.7 - -* Support display local image besides network image. - -## 0.2.6 - -* Fix cursor after pasting. - -## 0.2.5 - -* Toggle text/background color button in toolbar. - -## 0.2.4 - -* Support the use of custom icon size in toolbar. - -## 0.2.3 - -* Support custom styles and image on local device storage without uploading. - -## 0.2.2 - -* Update git repo. - -## 0.2.1 - -* Fix static analysis error. - -## 0.2.0 - -* Add checked/unchecked list button in toolbar. - -## 0.1.8 - -* Support font and size attributes. - -## 0.1.7 +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -* Support checked/unchecked list. +> [!NOTE] +> The [previous `CHANGELOG.md`](https://github.com/singerdmx/flutter-quill/blob/master/doc/OLD_CHANGELOG.md) has been archived. -## 0.1.6 +## [Unreleased] -* Fix getExtentEndpointForSelection. +> [!IMPORTANT] +> See the [migration guide from 10.0.0 to 11.0.0](https://github.com/singerdmx/flutter-quill/blob/master/doc/migration/10_to_11.md) for the full breaking changes and migration. Ensure to read the [breaking behavior](https://github.com/singerdmx/flutter-quill/blob/release/v11/doc/migration/10_to_11.md#-breaking-behavior) section to avoid unexpected changes. -## 0.1.5 +### Added -* Support text alignment. +- `QuillClipboardConfig` class with customizable clipboard paste handling callbacks, partial fix to [#2350](https://github.com/singerdmx/flutter-quill/issues/2350). +- The option to enable/disable rich text paste (from other apps) in `QuillClipboardConfig`. +- `Insert video` string in `quill_en.arb` to support localization for `flutter_quill_extensions`. Currently available **only in English**. -## 0.1.4 +### Fixed -* Handle url with trailing spaces. +- **[iOS]** Localize the Cupertino link menu actions. +- Export `QuillToolbarSelectLineHeightStyleDropdownButtonOptions`, fixing [#2333](https://github.com/singerdmx/flutter-quill/issues/2333). -## 0.1.3 +### Changed -* Handle cursor position change when undo/redo. +- Update the minimum supported SDK version to **Flutter 3.0/Dart 3.0** for compatibility, fixing [#2347](https://github.com/singerdmx/flutter-quill/issues/2347). +- Improve dependencies constraints for compatibility. +- Improve `README.md`. +- [Always call `setState()` in `_markNeedsBuild()` in `QuillRawEditorState`](https://github.com/singerdmx/flutter-quill/pull/2338/commits/a127628214c23bb4a7a3b0cdc644fefb21eee738) (**revert to the old behavior**). +- **BREAKING**: Update configuration class names to use the suffix `Config` instead of `Configurations`. +- **BREAKING**: Refactor **embed block interface** for both the `EmbedBuilder.build()` and `EmbedButtonBuilder`. +- [Minor cleanup](https://github.com/singerdmx/flutter-quill/pull/2338/commits/b739b700cbae9c3d4427e4966963d97cebf0a852) to magnifier feature. +- The `QuillSimpleToolbar` base button options now support buttons of `flutter_quill_extensions`. -## 0.1.2 +### Removed -* Handle more text colors. +- **BREAKING**: The quill shared configuration class. +- The dependency [equatable](https://pub.dev/packages/equatable). +- The experimental support for spell checking. See [#2246](https://github.com/singerdmx/flutter-quill/issues/2246). -## 0.1.1 +## [11.0.0-dev.5] - 2024-11-08 -* Fix cursor issue when undo. +### Changed -## 0.1.0 +- The option to enable/disable rich text paste (from other apps) in `QuillClipboardConfig`. +- Improve `README.md`. +- Simplify the `example` app. -* Fix insert image. +## [11.0.0-dev.4] - 2024-11-08 -## 0.0.9 +### Changed -* Handle rgba color. +- Publish the [`flutter_quill`](https://pub.dev/packages/flutter_quill) package with no changes to test the CI workflow. -## 0.0.8 +## [11.0.0-dev.3] - 2024-11-08 -* Fix launching url. +### Added -## 0.0.7 +- `Insert video` string in `quill_en.arb` to support localization for `flutter_quill_extensions`. Currently available **only in English**. -* Handle multiple image inserts. +## [11.0.0-dev.2] - 2024-11-08 -## 0.0.6 +### Changed -* More toolbar functionality. +- Restore [base button options](https://github.com/singerdmx/flutter-quill/pull/2338/commits/1f51935f1eaa229f01c4d14398708ab2d3bd05b0), now works without the inherited widgets, and support buttons of `flutter_quill_extensions`. -## 0.0.5 +## [10.8.5] - 2024-10-24 -* Update example. +### Fixed -## 0.0.4 +- Allow all correct URLs to be formatted [#2328](https://github.com/singerdmx/flutter-quill/pull/2328). +- **[macOS]** Implement actions for `ExpandSelectionToDocumentBoundaryIntent` and `ExpandSelectionToLineBreakIntent` to use keyboard shortcuts, along with unrelated cleanup [#2279](https://github.com/singerdmx/flutter-quill/pull/2279). -* Update example. +## [9.4.0] - 2024-06-13 -## 0.0.3 +### Added -* Update home page meta data. +- Korean translations [#1911](https://github.com/singerdmx/flutter-quill/pull/1911). -## 0.0.2 +### Changed -* Support image upload and launch url in read-only mode. +- Rework search bar/dialog for **Material 3** UI with on-the-fly search [#1904](https://github.com/singerdmx/flutter-quill/pull/1904). +- Support for subscript and superscript across all languages. +- Improve pasting of Markdown and HTML file content from the system clipboard [#1915](https://github.com/singerdmx/flutter-quill/pull/1915). -## 0.0.1 +### Removed -* Rich text editor based on Quill Delta. +- Apple-specific font dependency for subscript and superscript functionality from the example. +- **BREAKING**: The [`super_clipboard`](https://pub.dev/packages/super_clipboard) plugin, To restore legacy behavior for `super_clipboard`, use [`flutter_quill_extensions`](https://pub.dev/packages/flutter_quill_extensions) package and `FlutterQuillExtensions.useSuperClipboardPlugin()`. +[unreleased]: https://github.com/singerdmx/flutter-quill/compare/v11.0.0-dev.5...HEAD +[11.0.0-dev.5]: https://github.com/singerdmx/flutter-quill/compare/v11.0.0-dev.4...v11.0.0-dev.5 +[11.0.0-dev.4]: https://github.com/singerdmx/flutter-quill/compare/v11.0.0-dev.3...v11.0.0-dev.4 +[11.0.0-dev.3]: https://github.com/singerdmx/flutter-quill/compare/v11.0.0-dev.2...v11.0.0-dev.3 +[11.0.0-dev.2]: https://github.com/singerdmx/flutter-quill/compare/v10.8.5...v11.0.0-dev.2 +[10.8.5]: https://github.com/singerdmx/flutter-quill/compare/v9.4.0...v10.8.5 +[9.4.0]: https://github.com/singerdmx/flutter-quill/releases/tag/v9.4.0 diff --git a/CHANGELOG_DATA.json b/CHANGELOG_DATA.json deleted file mode 100644 index 2ebc06c7e..000000000 --- a/CHANGELOG_DATA.json +++ /dev/null @@ -1,571 +0,0 @@ -{ - "10.8.5": "* fix: allow all correct URLs to be formatted by @orevial in https://github.com/singerdmx/flutter-quill/pull/2328\r\n* fix(macos): Implement actions for ExpandSelectionToDocumentBoundaryIntent and ExpandSelectionToLineBreakIntent to use keyboard shortcuts, unrelated cleanup to the bug fix. by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2279\r\n\r\n## New Contributors\r\n* @orevial made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2328\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.4...v10.8.5", - "10.8.4": "- [Fixes an unhandled exception](https://github.com/singerdmx/flutter-quill/commit/8dd559b825030d29b30b32b353a08dcc13dc42b7) in case `getClipboardFiles()` wasn't supported\r\n- [Updates min version](https://github.com/singerdmx/flutter-quill/commit/49569e47b038c5f61b7521571c102cf5ad5a0e3f) of internal dependency `quill_native_bridge`\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.3...v10.8.4", - "10.8.3": "This release is identical to [v10.8.3-dev.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.3-dev.0), mainly published to bump the minimum version of [flutter_quill](https://pub.dev/packages/flutter_quill) in [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) and to publish [quill-super-clipboard](https://github.com/FlutterQuill/quill-super-clipboard/).\r\n\r\nA new identical release `10.9.0` will be published soon with a release description.\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3", - "10.8.3-dev.0": "A non-pre-release version with this change will be published soon.\r\n\r\n* feat: Use quill_native_bridge as default impl in DefaultClipboardService, fix related bugs in the extensions package by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2230\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3-dev.0", - "10.8.2": "* Fixed minor typo in Hungarian (hu) localization by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2307\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.1...v10.8.2", - "10.8.1": "- This release fixes the compilation issue when building the project with [Flutter/Wasm](https://docs.flutter.dev/platform-integration/web/wasm) target on the web. Also, update the conditional import check to avoid using `dart.library.html`:\r\n\r\n ```dart\r\n import 'web/quill_controller_web_stub.dart'\r\n if (dart.library.html) 'web/quill_controller_web_real.dart';\r\n ```\r\n \r\n To fix critical bugs that prevent using the editor on Wasm.\r\n \r\n > Flutter/Wasm is stable as of [Flutter 3.22](https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3) though it's likely that you might experience some issues when using this new target, if you experienced any issues related to Wasm support related to Flutter Quill, feel free to [open an issue](https://github.com/singerdmx/flutter-quill/issues).\r\n \r\n Issue #1889 is fixed by temporarily replacing the plugin [flutter_keyboard_visibility](https://pub.dev/packages/flutter_keyboard_visibility) with [flutter_keyboard_visibility_temp_fork](https://pub.dev/packages/flutter_keyboard_visibility_temp_fork) since `flutter_keyboard_visibility` depend on `dart:html`. Also updated the `compileSdkVersion` to `34` instead of `31` as a workaround to [Flutter #63533](https://github.com/flutter/flutter/issues/63533).\r\n\r\n- Support for Hungarian (hu) localization was added by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2291.\r\n- [dart_quill_delta](https://pub.dev/packages/dart_quill_delta/) has been moved to [FlutterQuill/dart-quill-delta](https://github.com/FlutterQuill/dart-quill-delta) (outside of this repo) and they have separated version now.\r\n\r\n\r\n## New Contributors\r\n* @G-Greg made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2291\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.0...v10.8.1", - "10.8.0": "> [!CAUTION]\r\n> This release can be breaking change for `flutter_quill_extensions` users as it remove the built-in support for loading YouTube videos\r\n\r\nIf you're using [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) then this release, can be a breaking change for you if you load videos in the editor and expect YouTube videos to be supported, [youtube_player_flutter](https://pub.dev/packages/youtube_player_flutter) and [flutter_inappwebview](https://pub.dev/packages/flutter_inappwebview) are no longer dependencies of the extensions package, which are used to support loading YouTube Iframe videos on non-web platforms, more details about the discussion and reasons in [#2286](https://github.com/singerdmx/flutter-quill/pull/2286) and [#2284](https://github.com/singerdmx/flutter-quill/issues/2284).\r\n\r\nWe have added an experimental property that gives you more flexibility and control about the implementation you want to use for loading videos.\r\n\r\n> [!WARNING]\r\n> It's likely to experience some common issues while implementing this feature, especially on desktop platforms as the support for [flutter_inappwebview_windows](https://pub.dev/packages/flutter_inappwebview_windows) and [flutter_inappwebview_macos](https://pub.dev/packages/flutter_inappwebview_macos) before 2 days. Some of the issues are in the Flutter Quill editor.\r\n\r\nIf you want loading YouTube videos to be a feature again with the latest version of Flutter Quill, you can use an existing plugin or package, or implement your own solution. For example, you might use [`youtube_video_player`](https://pub.dev/packages/youtube_video_player) or [`youtube_player_flutter`](https://pub.dev/packages/youtube_player_flutter), which was previously used in [`flutter_quill_extensions`](https://pub.dev/packages/flutter_quill_extensions).\r\n\r\nHere’s an example setup using `youtube_player_flutter`:\r\n\r\n```shell\r\nflutter pub add youtube_player_flutter\r\n```\r\n\r\nExample widget configuration:\r\n\r\n```dart\r\nimport 'package:flutter/material.dart';\r\nimport 'package:youtube_player_flutter/youtube_player_flutter.dart';\r\n\r\nclass YoutubeVideoPlayer extends StatefulWidget {\r\n const YoutubeVideoPlayer({required this.videoUrl, super.key});\r\n\r\n final String videoUrl;\r\n\r\n @override\r\n State createState() => _YoutubeVideoPlayerState();\r\n}\r\n\r\nclass _YoutubeVideoPlayerState extends State {\r\n late final YoutubePlayerController _youtubePlayerController;\r\n @override\r\n void initState() {\r\n super.initState();\r\n _youtubePlayerController = YoutubePlayerController(\r\n initialVideoId: YoutubePlayer.convertUrlToId(widget.videoUrl) ??\r\n (throw StateError('Expect a valid video URL')),\r\n flags: const YoutubePlayerFlags(\r\n autoPlay: true,\r\n mute: true,\r\n ),\r\n );\r\n }\r\n\r\n @override\r\n Widget build(BuildContext context) {\r\n return YoutubePlayer(\r\n controller: _youtubePlayerController,\r\n showVideoProgressIndicator: true,\r\n );\r\n }\r\n\r\n @override\r\n void dispose() {\r\n _youtubePlayerController.dispose();\r\n super.dispose();\r\n }\r\n}\r\n\r\n```\r\n\r\nThen, integrate it with `QuillEditorVideoEmbedConfigurations`\r\n\r\n```dart\r\nFlutterQuillEmbeds.editorBuilders(\r\n videoEmbedConfigurations: QuillEditorVideoEmbedConfigurations(\r\n customVideoBuilder: (videoUrl, readOnly) {\r\n // Example: Check for YouTube Video URL and return your\r\n // YouTube video widget here.\r\n bool isYouTubeUrl(String videoUrl) {\r\n try {\r\n final uri = Uri.parse(videoUrl);\r\n return uri.host == 'www.youtube.com' ||\r\n uri.host == 'youtube.com' ||\r\n uri.host == 'youtu.be' ||\r\n uri.host == 'www.youtu.be';\r\n } catch (_) {\r\n return false;\r\n }\r\n }\r\n\r\n if (isYouTubeUrl(videoUrl)) {\r\n return YoutubeVideoPlayer(\r\n videoUrl: videoUrl,\r\n );\r\n }\r\n\r\n // Return null to fallback to the default logic\r\n return null;\r\n },\r\n ignoreYouTubeSupport: true,\r\n ),\r\n);\r\n```\r\n\r\n> [!NOTE]\r\n> This example illustrates a basic approach, additional adjustments might be necessary to meet your specific needs. YouTube video support is no longer included in this project. Keep in mind that `customVideoBuilder` is experimental and can change without being considered as breaking change. More details in [breaking changes](https://github.com/singerdmx/flutter-quill#-breaking-changes) section.\r\n\r\n[`super_clipboard`](https://pub.dev/packages/super_clipboard) will also no longer a dependency of `flutter_quill_extensions` once [PR #2230](https://github.com/singerdmx/flutter-quill/pull/2230) is ready.\r\n\r\nWe're looking forward to your feedback.\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.7...v10.8.0", - "10.7.7": "This version is nearly identical to `10.7.6` with a build failure bug fix in [#2283](https://github.com/singerdmx/flutter-quill/pull/2283) related to unmerged change in [#2230](https://github.com/singerdmx/flutter-quill/pull/2230)\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.6...v10.7.7", - "10.7.6": "* Code Comments Typo fixes by @Luismi74 in https://github.com/singerdmx/flutter-quill/pull/2267\r\n* docs: add important note for contributors before introducing new features by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2269\r\n* docs(readme): add 'Breaking Changes' section by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2275\r\n* Fix: Resolved issue with broken IME composing rect in Windows desktop(re-implementation) by @agata in https://github.com/singerdmx/flutter-quill/pull/2282\r\n\r\n## New Contributors\r\n* @Luismi74 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2267\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.5...v10.7.6", - "10.7.5": "* fix(ci): add flutter pub get step for quill_native_bridge by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2265\r\n* revert: \"Resolved issue with broken IME composing rect in Windows desktop\" by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2266\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.4...v10.7.5", - "10.7.4": "* chore: remove pubspec_overrides.yaml and pubspec_overrides.yaml.disabled by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2262\r\n* ci: remove quill_native_bridge from automated publishing workflow by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2263\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.3...v10.7.4", - "10.7.3": "- Deprecate `FlutterQuillExtensions` in `flutter_quill_extensions`\r\n- Update the minimum version of `flutter_quill` and `super_clipboard` in `flutter_quill_extensions` to avoid using deprecated code.\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.2...v10.7.3", - "10.7.2": "## What's Changed\r\n* chore: deprecate flutter_quill/extensions.dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2258\r\n\r\nThis is a minor release introduced to upload a new version of `flutter_quill` and `flutter_quill_extensions` to update the minimum required to avoid using deprecated code in `flutter_quill_extensions`.\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.1...v10.7.2", - "10.7.1": "* chore: deprecate markdown_quill export, ignore warnings by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2256\r\n* chore: deprecate spell checker service by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2255\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.0...v10.7.1", - "10.7.0": "* Chore: deprecate embed table feature by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2254\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.6...v10.7.0", - "10.6.6": "* Bug fix: Removing check not allowing spell check on web by @joeserhtf in https://github.com/singerdmx/flutter-quill/pull/2252\r\n\r\n## New Contributors\r\n* @joeserhtf made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2252\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.5...v10.6.6", - "10.6.5": "* Refine IME composing range styling by applying underline as text style by @agata in https://github.com/singerdmx/flutter-quill/pull/2244\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.4...v10.6.5", - "10.6.4": "* fix: the composing text did not show an underline during IME conversion by @agata in https://github.com/singerdmx/flutter-quill/pull/2242\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.3...v10.6.4", - "10.6.3": "* Fix: Resolved issue with broken IME composing rect in Windows desktop by @agata in https://github.com/singerdmx/flutter-quill/pull/2239\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.2...v10.6.3", - "10.6.2": "* Fix: QuillToolbarToggleStyleButton Switching failure by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2234\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.1...v10.6.2", - "10.6.1": "* Chore: update `flutter_quill_delta_from_html` to remove exception calls by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2232\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.0...v10.6.1", - "10.6.0": "* docs: cleanup the docs, remove outdated resources, general changes by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2227\r\n* Feat: customizable character and space shortcut events by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2228\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.19...v10.6.0", - "10.5.19": "* fix: properties other than 'style' for custom inline code styles (such as 'backgroundColor') were not being applied correctly by @agata in https://github.com/singerdmx/flutter-quill/pull/2226\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.18...v10.5.19", - "10.5.18": "* feat(web): rich text paste from Clipboard using HTML by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2009\r\n* revert: disable rich text paste feature on web as a workaround by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2221\r\n* refactor: moved shortcuts and onKeyEvents to its own file by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2223\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.17...v10.5.18", - "10.5.17": "* feat(l10n): localize all untranslated.json by @erdnx in https://github.com/singerdmx/flutter-quill/pull/2217\r\n* Fix: Block Attributes are not displayed if the editor is empty by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2210\r\n\r\n## New Contributors\r\n* @erdnx made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2217\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.16...v10.5.17", - "10.5.16": "* chore: remove device_info_plus and add quill_native_bridge to access platform specific APIs by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2194\r\n* Not show/update/hiden mangnifier when manifier config is disbale by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2212\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.16", - "10.5.15-dev.0": "Introduce `quill_native_bridge` which is an internal plugin to use by `flutter_quill` to access platform APIs.\r\n\r\nFor now, the only functionality it supports is to check whatever the iOS app is running on iOS simulator without requiring [`device_info_plus`](pub.dev/packages/device_info_plus) as a dependency.\r\n\r\n> [!NOTE]\r\n> `quill_native_bridge` is a plugin for internal use and should not be used in production applications\r\n> as breaking changes can happen and can removed at any time.\r\n\r\nFor more details and discussion see [#2194](https://github.com/singerdmx/flutter-quill/pull/2194).\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.15-dev.0", - "10.5.14": "* chore(localization): add Greek language support by @DKalathas in https://github.com/singerdmx/flutter-quill/pull/2206\r\n\r\n## New Contributors\r\n* @DKalathas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2206\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.13...v10.5.14", - "10.5.13": "* Revert \"Fix: Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2201\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.12...v10.5.13", - "10.5.12": "* Fix: Backspace remove block attributes at start by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2200\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.11...v10.5.12", - "10.5.11": "* Enhancement: Backspace handling at the start of blocks in delete rules by @agata in https://github.com/singerdmx/flutter-quill/pull/2199\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.10...v10.5.11", - "10.5.10": "* Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2198\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.9...v10.5.10", - "10.5.9": "* chore: improve platform check by using constants and defaultTargetPlatform by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2188\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.8...v10.5.9", - "10.5.8": "* Feat: Add configuration option to always indent on TAB key press by @agata in https://github.com/singerdmx/flutter-quill/pull/2187\r\n\r\n## New Contributors\r\n* @agata made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2187\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.7...v10.5.8", - "10.5.7": "* chore(example): downgrade Kotlin from 1.9.24 to 1.7.10 by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2185\r\n* style: refactor build leading function style, width, and padding parameters for custom node leading builder by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2182\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.6...v10.5.7", - "10.5.6": "* chore(deps): update super_clipboard to 0.8.20 in flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2181\r\n* Update quill_screen.dart, i chaged the logic for showing a lock when … by @rightpossible in https://github.com/singerdmx/flutter-quill/pull/2183\r\n\r\n## New Contributors\r\n* @rightpossible made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2183\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.5...v10.5.6", - "10.5.5": "* Fix text selection handles when scroll mobile by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2176\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.4...v10.5.5", - "10.5.4": "* Add Thai (th) localization by @silkyland in https://github.com/singerdmx/flutter-quill/pull/2175\r\n\r\n## New Contributors\r\n* @silkyland made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2175\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.3...v10.5.4", - "10.5.3": "* Fix: Assertion Failure in line.dart When Editing Text with Block-Level Attributes by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2174\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.2...v10.5.3", - "10.5.2": "* fix(toolbar): regard showDividers in simple toolbar by @realth000 in https://github.com/singerdmx/flutter-quill/pull/2172\r\n\r\n## New Contributors\r\n* @realth000 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2172\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.1...v10.5.2", - "10.5.1": "* fix drag selection extension (does not start at tap location if you are dragging quickly by @jezell in https://github.com/singerdmx/flutter-quill/pull/2170\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.0...v10.5.1", - "10.5.0": "* Feat: custom leading builder by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2146\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.9...v10.5.0", - "10.4.9": "* fix floating cursor not disappearing after scroll end by @vishna in https://github.com/singerdmx/flutter-quill/pull/2163\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.8...v10.4.9", - "10.4.8": "* Fix: direction has no opposite effect if the language is rtl by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2154\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.7...v10.4.8", - "10.4.7": "* Fix: Unable to scroll 2nd editor window by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2152\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.6...v10.4.7", - "10.4.6": "* Handle null child query by @jezell in https://github.com/singerdmx/flutter-quill/pull/2151\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.5...v10.4.6", - "10.4.5": "* chore!: move spell checker to example by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2145\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.4...v10.4.5", - "10.4.4": "* fix custom recognizer builder not being passed to editabletextblock by @jezell in https://github.com/singerdmx/flutter-quill/pull/2143\r\n* fix null reference exception when dragging selection on non scrollable selection by @jezell in https://github.com/singerdmx/flutter-quill/pull/2144\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.3...v10.4.4", - "10.4.3": "* Chore: update simple_spell_checker package by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2139\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.2...v10.4.3", - "10.4.2": "* Revert \"fix: Double click to select text sometimes doesn't work. ([#2086](https://github.com/singerdmx/flutter-quill/pull/2086))\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.1...v10.4.2", - "10.4.1": "* Chore: improve Spell checker API to the example by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2133\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.0...v10.4.1", - "10.4.0": "* Copy TapAndPanGestureRecognizer from TextField by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2128\r\n* enhance stringToColor with a custom defined palette from `DefaultStyles` by @vishna in https://github.com/singerdmx/flutter-quill/pull/2095\r\n* Feat: include spell checker for example app by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2127\r\n\r\n## New Contributors\r\n* @vishna made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2095\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.3...v10.4.0", - "10.3.2": "* Fix: Loss of style when backspace by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2125\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.1...v10.3.2", - "10.3.1": "* Chore: Move spellchecker service to extensions by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2120\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.0...v10.3.1", - "10.3.0": "* Feat: Spellchecker for Flutter Quill by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2118\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.1...v10.3.0", - "10.2.1": "* Fix: context menu is visible even when selection is collapsed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2116\r\n* Fix: unsafe operation while getting overlayEntry in text_selection by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2117\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.0...v10.2.1", - "10.2.0": "* refactor!: restructure project into modular architecture for flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2106\r\n* Fix: Link selection and editing by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2114\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.10...v10.2.0", - "10.1.10": "* Fix(example): image_cropper outdated version by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2100\r\n* Using dart.library.js_interop instead of dart.library.html by @h1376h in https://github.com/singerdmx/flutter-quill/pull/2103\r\n\r\n## New Contributors\r\n* @h1376h made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2103\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.9...v10.1.10", - "10.1.9": "* restore ability to pass in key to QuillEditor by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2093\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.8...v10.1.9", - "10.1.8": "* Enhancement: Search within Embed objects by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2090\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.7...v10.1.8", - "10.1.7": "* Feature/allow shortcut override by @InstrinsicAutomations in https://github.com/singerdmx/flutter-quill/pull/2089\r\n\r\n## New Contributors\r\n* @InstrinsicAutomations made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2089\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.6...v10.1.7", - "10.1.6": "* fixed #1295 Double click to select text sometimes doesn't work. by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2086\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.5...v10.1.6", - "10.1.5": "* ref: add `VerticalSpacing.zero` and `HorizontalSpacing.zero` named constants by @adil192 in https://github.com/singerdmx/flutter-quill/pull/2083\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.4...v10.1.5", - "10.1.4": "* Fix: collectStyles for lists and alignments by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2082\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.3...v10.1.4", - "10.1.3": "* Move Controller outside of configurations data class by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2078\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.2...v10.1.3", - "10.1.2": "* Fix Multiline paste with attributes and embeds by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2074\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.1...v10.1.2", - "10.1.1": "* Toolbar dividers fixes + Docs updates by @troyanskiy in https://github.com/singerdmx/flutter-quill/pull/2071\r\n\r\n## New Contributors\r\n* @troyanskiy made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2071\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.0...v10.1.1", - "10.1.0": "* Feat: support for customize copy and cut Embeddables to Clipboard by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2067\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.10...v10.1.0", - "10.0.10": "* fix: Hide selection toolbar if editor loses focus by @huandu in https://github.com/singerdmx/flutter-quill/pull/2066\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.9...v10.0.10", - "10.0.9": "* Fix: manual checking of directionality by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2063\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.8...v10.0.9", - "10.0.8": "* feat: add callback to handle performAction by @huandu in https://github.com/singerdmx/flutter-quill/pull/2061\r\n* fix: Invalid selection when tapping placeholder text by @huandu in https://github.com/singerdmx/flutter-quill/pull/2062\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.7...v10.0.8", - "10.0.7": "* Fix: RTL issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2060\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.6...v10.0.7", - "10.0.6": "* fix: textInputAction is not set when creating QuillRawEditorConfiguration by @huandu in https://github.com/singerdmx/flutter-quill/pull/2057\r\n\r\n## New Contributors\r\n* @huandu made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2057\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.5...v10.0.6", - "10.0.5": "* Add tests for PreserveInlineStylesRule and fix link editing. Other minor fixes. by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2058\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.4...v10.0.5", - "10.0.4": "* Add ability to set up horizontal spacing for block style by @dimkanovikov in https://github.com/singerdmx/flutter-quill/pull/2051\r\n* add catalan language by @spilioio in https://github.com/singerdmx/flutter-quill/pull/2054\r\n\r\n## New Contributors\r\n* @dimkanovikov made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2051\r\n* @spilioio made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2054\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.3...v10.0.4", - "10.0.3": "* doc(Delta): more documentation about Delta by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2042\r\n* doc(attribute): added documentation about Attribute class and how create one by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2048\r\n* if magnifier removes toolbar, restore it when it is hidden by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2049\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.2...v10.0.3", - "10.0.2": "* chore(scripts): migrate the scripts from sh to dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2036\r\n* Have the ability to create custom rules, closes #1162 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/2040\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.1...v10.0.2", - "10.0.1": "This release is identical to [10.0.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.0.0) with a fix that addresses issue #2034 by requiring `10.0.0` as the minimum version for quill related dependencies.\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.0...v10.0.1", - "10.0.0": "* refactor: restructure project into modular architecture for flutter_quill by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2032\r\n* chore: update GitHub PR template by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2033\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.6.0...v10.0.0", - "9.6.0": "* [feature] : quill add magnifier by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2026\r\n\r\n## New Contributors\r\n* @demoYang made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2026\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.23...v9.6.0", - "9.5.23": "* add untranslated Kurdish keys by @Xoshbin in https://github.com/singerdmx/flutter-quill/pull/2029\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.22...v9.5.23", - "9.5.22": "* Fix outdated contributor guide link on PR template by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2027\r\n* Fix(rule): PreserveInlineStyleRule assume the type of the operation data and throw stacktrace by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2028\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.21...v9.5.22", - "9.5.21": "* Fix: Key actions not being handled by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2025\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.20...v9.5.21", - "9.5.20": "* Remove useless delta_x_test by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2017\r\n* Update flutter_quill_delta_from_html package on pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2018\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.19...v9.5.20", - "9.5.19": "* fixed #1835 Embed Reloads on Cmd Key Press by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2013\r\n\r\n## New Contributors\r\n* @li8607 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2013\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.18...v9.5.19", - "9.5.18": "* Refactor: Moved core link button functions to link.dart by @Alspb in https://github.com/singerdmx/flutter-quill/pull/2008\r\n* doc: more documentation about Rules by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2014\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.17...v9.5.18", - "9.5.17": "* Feat(config): added option to disable automatic list conversion by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2011\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.16...v9.5.17", - "9.5.16": "* chore: drop support for HTML, PDF, and Markdown converting functions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1997\r\n* docs(readme): update the extensions package to document the Rich Text Paste feature on web by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2001\r\n* Fix(test): delta_x tests fail by wrong expected Delta for video embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2010\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.15...v9.5.16", - "9.5.15": "* Update delta_from_html to fix nested lists issues and more by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2000\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.14...v9.5.15", - "9.5.14": "* docs(readme): update 'Conversion to HTML' section to include more details by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1996\r\n* Update flutter_quill_delta_from_html on pubspec.yaml to fix current issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1999\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.13...v9.5.14", - "9.5.13": "* Added new default ConverterOptions configurations by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1990\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.12...v9.5.13", - "9.5.12": "* fix: Fixed passing textStyle to formula embed by @shubham030 in https://github.com/singerdmx/flutter-quill/pull/1989\r\n\r\n## New Contributors\r\n* @shubham030 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1989\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.11...v9.5.12", - "9.5.11": "* Update flutter_quill_delta_from_html in pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1988\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.10...v9.5.11", - "9.5.10": "* chore: remove dependency html converter by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1987\r\n* Fix: LineHeight button to use MenuAnchor by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1986\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.9...v9.5.10", - "9.5.9": "* Update pubspec.yaml to remove html2md by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1985\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.8...v9.5.9", - "9.5.8": "* fix(typo): fix typo ClipboardServiceProvider.instacne by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1983\r\n* Feat: New way to get Delta from HTML inputs by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1984\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.7...v9.5.8", - "9.5.7": "* refactor: context menu function, add test code by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1979\r\n* Fix: PreserveInlineStylesRule by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1980\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.6...v9.5.7", - "9.5.6": "* fix: common link is detected as a video link by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1978\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.5...v9.5.6", - "9.5.5": "* fix: context menu behavior in mouse, desktop env by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1976\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.4...v9.5.5", - "9.5.4": "* Feat: Line height support by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1972\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.3...v9.5.4", - "9.5.3": "* Perf: Performance optimization by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1964\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.2...v9.5.3", - "9.5.2": "* Fix style settings by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1962\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.1...v9.5.2", - "9.5.1": "* feat(extensions): Youtube Video Player Support Mode by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1916\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.0...v9.5.1", - "9.5.0": "* Partial support for table embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1960\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.9...v9.5.0", - "9.4.9": "* Upgrade photo_view to 0.15.0 for flutter_quill_extensions by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1958\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.8...v9.4.9", - "9.4.8": "* Add support for html underline and videos by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1955\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.7...v9.4.8", - "9.4.7": "* fixed #1953 italic detection error by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1954\r\n\r\n## New Contributors\r\n* @CatHood0 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1954\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.6...v9.4.7", - "9.4.6": "* fix: search dialog throw an exception due to missing FlutterQuillLocalizations.delegate in the editor by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1938\r\n* fix(editor): implement editor shortcut action for home and end keys to fix exception about unimplemented ScrollToDocumentBoundaryIntent by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1937\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.5...v9.4.6", - "9.4.5": "* fix: color picker hex unfocus on web by @geronimol in https://github.com/singerdmx/flutter-quill/pull/1934\r\n\r\n## New Contributors\r\n* @geronimol made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1934\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.4...v9.4.5", - "9.4.4": "* fix: Enabled link regex to be overridden by @JoepHeijnen in https://github.com/singerdmx/flutter-quill/pull/1931\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.3...v9.4.4", - "9.4.3": "* Fix: setState() called after dispose(): QuillToolbarClipboardButtonState #1895 by @windows7lake in https://github.com/singerdmx/flutter-quill/pull/1926\r\n\r\n## New Contributors\r\n* @windows7lake made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1926\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.2...v9.4.3", - "9.4.2": "* Respect autofocus, closes #1923 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/1924\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.1...v9.4.2", - "9.4.1": "* replace base64 regex string by @salba360496 in https://github.com/singerdmx/flutter-quill/pull/1919\r\n\r\n## New Contributors\r\n* @salba360496 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1919\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.0...v9.4.1", - "9.4.0": "This release can be used without changing anything, although it can break the behavior a little, we provided a way to use the old behavior in `9.3.x`\r\n\r\n- Thanks to @Alspb, the search bar/dialog has been reworked for improved UI that fits **Material 3** look and feel, the search happens on the fly, and other minor changes, if you want the old search bar, you can restore it with one line if you're using `QuillSimpleToolbar`:\r\n ```dart\r\n QuillToolbar.simple(\r\n configurations: QuillSimpleToolbarConfigurations(\r\n searchButtonType: SearchButtonType.legacy,\r\n ),\r\n )\r\n ```\r\n While the changes are mostly to the `QuillToolbarSearchDialog` and it seems this should be `searchDialogType`, we provided the old button with the old dialog in case we update the button in the future.\r\n\r\n If you're using `QuillToolbarSearchButton` in a custom Toolbar, you don't need anything to get the new button. if you want the old button, use the `QuillToolbarLegacySearchButton` widget\r\n \r\n Consider using the improved button with the improved dialog as the legacy button might removed in future releases (for now, it's not deprecated)\r\n\r\n
\r\n Before\r\n \r\n ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/9b40ad03-717f-4518-95f1-8d9cad773b2b)\r\n \r\n \r\n
\r\n \r\n
\r\n Improved\r\n \r\n ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/e581733d-63fa-4984-9c41-4a325a0a0c04)\r\n \r\n
\r\n \r\n For the detailed changes, see #1904\r\n\r\n- Korean translations by @leegh519 in https://github.com/singerdmx/flutter-quill/pull/1911\r\n\r\n- The usage of `super_clipboard` plugin in `flutter_quill` has been moved to the `flutter_quill_extensions` package, this will restore the old behavior in `8.x.x` though it will break the `onImagePaste`, `onGifPaste` and rich text pasting from HTML or Markdown, most of those features are available in `super_clipboard` plugin except `onImagePaste` which was available as we were using [pasteboard](https://pub.dev/packages/pasteboard), Unfortunately, it's no longer supported on recent versions of Flutter, and some functionalities such as an image from Clipboard and Html paste are not supported on some platforms such as Android, your project will continue to work, calls of `onImagePaste` and `onGifPaste` will be ignored unless you include [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) package in your project and call:\r\n\r\n ```dart\r\n FlutterQuillExtensions.useSuperClipboardPlugin();\r\n ```\r\n Before using any `flutter_quill` widgets, this will restore the old behavior in `9.x.x`\r\n \r\n We initially wanted to publish `flutter_quill_super_clipboard` to allow:\r\n - Using `super_clipboard` without `flutter_quill_extensions` packages and plugins\r\n - Using `flutter_quill_extensions` with optional `super_clipboard`\r\n \r\n To simplify the usage, we moved it to `flutter_quill_extensions`, let us know if you want any of the use cases above.\r\n \r\n Overall `super_clipboard` is a Comprehensive clipboard plugin with a lot of features, the only thing that developers didn't want is Rust installation even though it's automated.\r\n\r\n The main goal of `ClipboardService` is to make `super_clipboard` optional, you can use your own implementation, and create a class that implements `ClipboardService`, which you can get by:\r\n ```dart\r\n // ignore: implementation_imports\r\n import 'package:flutter_quill/src/services/clipboard/clipboard_service.dart';\r\n ```\r\n\r\n Then you can call:\r\n ```dart\r\n // ignore: implementation_imports\r\nimport 'package:flutter_quill/src/services/clipboard/clipboard_service_provider.dart';\r\n ClipboardServiceProvider.setInstance(YourClipboardService());\r\n```\r\n \r\n The interface could change at any time and will be updated internally for `flutter_quill` and `flutter_quill_extensions`, we didn't export those two classes by default to avoid breaking changes in case you use them as we might change them in the future.\r\n\r\n If you use the above imports, you might get **breaking changes** in **non-breaking change releases**.\r\n\r\n- Subscript and Superscript should now work for all languages and characters\r\n\r\n The previous implementation required the Apple 'SF-Pro-Display-Regular.otf' font which is only licensed/permitted for use on Apple devices.\r\nWe have removed the Apple font from the example\r\n\r\n- Allow pasting Markdown and HTML file content from the system to the editor\r\n\r\n Before `9.4.x` if you try to copy an HTML or Markdown file, and paste it into the editor, you will get the file name in the editor\r\n Copying an HTML file, or HTML content from apps and websites is different than copying plain text.\r\n\r\n This is why this change requires `super_clipboard` implementation as this is platform-dependent:\r\n ```dart\r\n FlutterQuillExtensions.useSuperClipboardPlugin();\r\n ```\r\n as mentioned above.\r\n \r\n The following example for copying a Markdown file:\r\n\r\n
\r\n Markdown File Content\r\n \r\n ```md\r\n \r\n **Note**: This package supports converting from HTML back to Quill delta but it's experimental and used internally when pasting HTML content from the clipboard to the Quill Editor\r\n \r\n You have two options:\r\n \r\n 1. Using [quill_html_converter](./quill_html_converter/) to convert to HTML, the package can convert the Quill delta to HTML well\r\n (it uses [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html)), it is just a handy extension to do it more quickly\r\n 1. Another option is to use\r\n [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html) to convert your document\r\n to HTML.\r\n This package has full support for all Quill operations—including images, videos, formulas,\r\n tables, and mentions.\r\n Conversion can be performed in vanilla Dart (i.e., server-side or CLI) or in Flutter.\r\n It is a complete Dart part of the popular and mature [quill-delta-to-html](https://www.npmjs.com/package/quill-delta-to-html)\r\n Typescript/Javascript package.\r\n this package doesn't convert the HTML back to Quill Delta as far as we know \r\n \r\n ```\r\n\r\n
\r\n \r\n
\r\n Before\r\n \r\n ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/03f5ae20-796c-4e8b-8668-09a994211c1e)\r\n \r\n
\r\n \r\n
\r\n After\r\n \r\n ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/7e3a1987-36e7-4665-944a-add87d24e788)\r\n \r\n
\r\n \r\n Markdown, and HTML converting from and to Delta are **currently far from perfect**, the current implementation could improved a lot \r\n however **it will likely not work like expected**, due to differences between HTML and Delta, see this [comment](https://github.com/slab/quill/issues/1551#issuecomment-311458570) for more info.\r\n \r\n ![Copying Markdown file into Flutter Quill Editor](https://github.com/singerdmx/flutter-quill/assets/73608287/63bd6ba6-cc49-4335-84dc-91a0fa5c95a9)\r\n \r\n For more details see #1915\r\n \r\n Using or converting to HTML or Markdown is highly experimental and shouldn't be used for production applications. \r\n \r\n We use it internally as it is more suitable for our specific use case., copying content from external websites and pasting it into the editor \r\n previously breaks the styles, while the current implementation is not ready, it provides a better user experience and doesn't have many downsides.\r\n\r\n Feel free to report any bugs or feature requests at [Issues](https://github.com/singerdmx/flutter-quill/issues) or drop any suggestions and questions at [Discussions](https://github.com/singerdmx/flutter-quill/discussions)\r\n\r\n## New Contributors\r\n* @leegh519 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1911\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.21...v9.4.0", - "9.3.21": "* fix: assertion failure for swipe typing and undo on Android by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1898\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.20...v9.3.21", - "9.3.20": "* Fix: Issue 1887 by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1892\r\n* fix: toolbar style change will be invalid when inputting more than 2 characters at a time by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1890\r\n\r\n## New Contributors\r\n* @crasowas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1890\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.19...v9.3.20", - "9.3.19": "* Fix reported issues by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1886\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.18...v9.3.19", - "9.3.18": "* Fix: Undo/redo cursor position fixed by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1885\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.17...v9.3.18", - "9.3.17": "* Update super_clipboard plugin to 0.8.15 to address [#1882](https://github.com/singerdmx/flutter-quill/issues/1882)\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.16...v9.3.17", - "9.3.16": "* Update `lint` dev package to 4.0.0\r\n* Require at least version 0.8.13 of the plugin\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.15...v9.3.16", - "9.3.15": "\r\n* Ci/automate updating the files by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1879\r\n* Updating outdated README.md and adding a few guidelines for CONTRIBUTING.md\r\n\r\n\r\n**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.14...v9.3.15", - "9.3.14": "* Chore/use original color picker package in [#1877](https://github.com/singerdmx/flutter-quill/pull/1877)", - "9.3.13": "* fix: `readOnlyMouseCursor` losing in construction function\n* Fix block multi-line selection style", - "9.3.12": "* Add `readOnlyMouseCursor` to config mouse cursor type", - "9.3.11": "* Fix typo in QuillHtmlConverter\n* Fix re-create checkbox", - "9.3.10": "* Support clipboard actions from the toolbar", - "9.3.9": "* fix: MD Parsing for multi space\n* fix: FontFamily and FontSize toolbars track the text selected in the editor\n* feat: Add checkBoxReadOnly property which can override readOnly for checkbox", - "9.3.8": "* fix: removed misleading parameters\n* fix: added missed translations for ru, es, de\n* added translations for Nepali Locale('ne', 'NP')", - "9.3.7": "* Fix for keyboard jumping when switching focus from a TextField\n* Toolbar button styling to reflect cursor position when running on desktops with keyboard to move care", - "9.3.6": "* Add SK and update CS locales [#1796](https://github.com/singerdmx/flutter-quill/pull/1796)\n* Fixes:\n * QuillIconTheme changes for FontFamily and FontSize buttons are not applied [#1797](https://github.com/singerdmx/flutter-quill/pull/1796)\n * Make the arrow_drop_down icons in the QuillToolbar the same size for all MenuAnchor buttons [#1799](https://github.com/singerdmx/flutter-quill/pull/1796)", - "9.3.5": "* Update the minimum version for the packages to support `device_info_plus` version 10.0.0 [#1783](https://github.com/singerdmx/flutter-quill/issues/1783)\n* Update the minimum version for `youtube_player_flutter` to new major version 9.0.0 in the `flutter_quill_extensions`", - "9.3.4": "* fix: multiline styling stuck/not working properly [#1782](https://github.com/singerdmx/flutter-quill/pull/1782)", - "9.3.3": "* Update `quill_html_converter` versions", - "9.3.2": "* Fix dispose of text painter [#1774](https://github.com/singerdmx/flutter-quill/pull/1774)", - "9.3.1": "* Require Flutter 3.19.0 as minimum version", - "9.3.0": "* **Breaking change**: `Document.fromHtml(html)` is now returns `Document` instead of `Delta`, use `DeltaX.fromHtml` to return `Delta`\n* Update old deprecated api from Flutter 3.19\n* Scribble scroll fix by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/1745", - "9.2.14": "* feat: move cursor after inserting video/image\n* Apple pencil", - "9.2.13": "* Fix crash with inserting text from contextMenuButtonItems\n* Fix incorrect behaviour of context menu \n* fix: selection handles behaviour and unnessesary style assert\n* Update quill_fr.arb", - "9.2.12": "* Fix safari clipboard bug\n* Add the option to disable clipboard functionality", - "9.2.11": "* Fix a bug where it has problems with pasting text into the editor when the clipboard has styled text", - "9.2.10": "* Update example screenshots\n* Refactor `Container` to `QuillContainer` with backward compatibility\n* A workaround fix in history feature", - "9.2.9": "* Refactor the type of `Delta().toJson()` to be more clear type", - "9.2.8": "* feat: Export Container node as QuillContainer\n* fix web cursor position / height (don't use iOS logic)\n* Added Swedish translation", - "9.2.6": "* [fix selection.affinity always downstream after updateEditingValue](https://github.com/singerdmx/flutter-quill/pull/1682)\n* Bumb version of `super_clipboard`", - "9.2.5": "* Bumb version of `super_clipboard`", - "9.2.4": "* Use fixed version of intl", - "9.2.3": "* remove unncessary column in Flutter quill video embed block", - "9.2.2": "* Fix bug [#1627](https://github.com/singerdmx/flutter-quill/issues/1627)", - "9.2.1": "* Fix [bug](https://github.com/singerdmx/flutter-quill/issues/1119#issuecomment-1872605246) with font size button\n* Added ro RO translations\n* 📖 Update zh, zh_CN translations", - "9.2.0": "* Require minimum version `6.0.0` of `flutter_keyboard_visibility` to fix some build issues with Android Gradle Plugin 8.2.0\n* Add on image clicked in `flutter_quill_extensions` callback\n* Deprecate `globalIconSize` and `globalIconButtonFactor`, use `iconSize` and `iconButtonFactor` instead\n* Fix the `QuillToolbarSelectAlignmentButtons`", - "9.1.1": "* Require `super_clipboard` minimum version `0.8.1` to fix some bug with Linux build failure", - "9.1.1-dev": "* Fix bug [#1636](https://github.com/singerdmx/flutter-quill/issues/1636)\n* Fix a where you paste styled content (HTML) it always insert a new line at first even if the document is empty\n* Fix the font size button and migrate to `MenuAnchor`\n* The `defaultDisplayText` is no longer required in the font size and header dropdown buttons\n* Add pdf converter in a new package (`quill_pdf_converter`)", - "9.1.0": "* Fix the simple toolbar by add properties of `IconButton` and fix some buttons", - "9.1.0-dev.2": "* Fix the history buttons", - "9.1.0-dev.1": "* Bug fixes in the simple toolbar buttons", - "9.1.0-dev": "* **Breaking Change**: in the `QuillSimpleToolbar` Fix the `QuillIconTheme` by replacing all the properties with two properties of type `ButtonStyle`, use `IconButton.styleFrom()`", - "9.0.6": "* Fix bug in QuillToolbarSelectAlignmentButtons", - "9.0.5": "* You can now use most of the buttons without internal provider", - "9.0.4": "* Feature: [#1611](https://github.com/singerdmx/flutter-quill/issues/1611)\n* Export missing widgets", - "9.0.3": "* Flutter Quill Extensions:\n * Fix file image support for web image emebed builder", - "9.0.2": "* Remove unused properties in the `QuillToolbarSelectHeaderStyleDropdownButton`\n* Fix the `QuillSimpleToolbar` when `useMaterial3` is false, please upgrade to the latest version of flutter for better support", - "9.0.2-dev.3": "* Export `QuillSingleChildScrollView`", - "9.0.2-dev.2": "* Add the new translations for ru, uk arb files by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575)\n* Add a new dropdown button by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575)\n* Update the default style values by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575)\n* Fix bug [#1562](https://github.com/singerdmx/flutter-quill/issues/1562)\n* Fix the second bug of [#1480](https://github.com/singerdmx/flutter-quill/issues/1480)", - "9.0.2-dev.1": "* Add configurations for the new dropdown `QuillToolbarSelectHeaderStyleButton`, you can use the orignal one or this\n* Fix the [issue](https://github.com/singerdmx/flutter-quill/issues/1119) when enter is pressed, all font settings is lost", - "9.0.2-dev": "* **Breaking change** Remove the spacer widget, removed the controller option for each button\n* Add `toolbarRunSpacing` property to the simple toolbar", - "9.0.1": "* Fix default icon size", - "9.0.0": "* This version is quite stable but it's not how we wanted to be, because the lack of time and there are not too many maintainers active, we decided to publish it, we might make a new breaking changes verion", - "9.0.1-dev.1": "* Flutter Quill Extensions:\n * Update `QuillImageUtilities` and fixining some bugs", - "9.0.1-dev": "* Test new GitHub workflows", - "9.0.0-dev-10": "* Fix a bug of the improved pasting HTML contents contents into the editor", - "9.0.0-dev-9": "* Improves the new logic of pasting HTML contents into the Editor\n* Update `README.md` and the doc\n* Dispose the `QuillToolbarSelectHeaderStyleButton` state listener in `dispose`\n* Upgrade the font family button to material 3\n* Rework the font family and font size functionalities to change the font once and type all over the editor", - "9.0.0-dev-8": "* Better support for pasting HTML contents from external websites to the editor\n* The experimental support of converting the HTML from `quill_html_converter` is now built-in in the `flutter_quill` and removed from there (Breaking change for `quill_html_converter`)", - "9.0.0-dev-7": "* Fix a bug in chaning the background/font color of ol/ul list\n* Flutter Quill Extensions:\n * Fix link bug in the video url\n * Fix patterns", - "9.0.0-dev-6": "* Move the `child` from `QuillToolbarConfigurations` into `QuillToolbar` directly\n* Bug fixes\n* Add the ability to change the background and font color of the ol/ul elements dots and numbers\n* Flutter Quill Extensions:\n * **Breaking Change**: The `imageProviderBuilder`is now providing the context and image url", - "9.0.0-dev-5": "* The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard\n* Flutter Quill Extensions:\n * Improve the camera button", - "9.0.0-dev-4": "* The options parameter in all of the buttons is no longer required which can be useful to create custom toolbar with minimal efforts\n* Toolbar buttons fixes in both `flutter_quill` and `flutter_quill_extensions`\n* The `QuillProvider` has been dropped and no longer used, the providers will be used only internally from now on and we will not using them as much as possible", - "9.0.0-dev-3": "* Breaking Changes:\n * Rename `QuillToolbar` to `QuillSimpleToolbar`\n * Rename `QuillBaseToolbar` to `QuillToolbar`\n * Replace `pasteboard` with `rich_cliboard`\n* Fix a bug in the example when inserting an image from url\n* Flutter Quill Extensions:\n * Add support for copying the image to the system cliboard", - "9.0.0-dev-2": "* An attemp to fix CI automated publishing", - "9.0.0-dev-1": "* An attemp to fix CI automated publishing", - "9.0.0-dev": "* **Major Breaking change**: The `QuillProvider` is now optional, the `controller` parameter has been moved to the `QuillEditor` and `QuillToolbar` once again.\n* Flutter Quill Extensions;\n * **Breaking Change**: Completly change the way how the source code structured to more basic and simple way, organize folders and file names, if you use the library\nfrom `flutter_quill_extensions.dart` then there is nothing you need to do, but if you are using any other import then you need to re-imports\nembed, this won't affect how quill js work\n * Improvemenets to the image embed\n * Add support for `margin` for web\n * Add untranslated strings to the `quill_en.arb`", - "8.6.4": "* The default value of `keyboardAppearance` for the iOS will be the one from the App/System theme mode instead of always using the `Brightness.light`\n* Fix typos in `README.md`", - "8.6.3": "* Update the minimum flutter version to `3.16.0`", - "8.6.2": "* Restore use of alternative QuillToolbarLinkStyleButton2 widget", - "8.6.1": "* Temporary revert style bug fix", - "8.6.0": "* **Breaking Change** Support [Flutter 3.16](https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1), please upgrade to the latest stable version of flutter to use this update\n* **Breaking Change**: Remove Deprecated Fields\n* **Breaking Change**: Extract the shared things between `QuillToolbarConfigurations` and `QuillBaseToolbarConfigurations`\n* **Breaking Change**: You no longer need to use `QuillToolbarProvider` when using custom toolbar buttons, the example has been updated\n* Bug fixes", - "8.5.5": "* Now when opening dialogs by `QuillToolbar` you will not get an exception when you don't use `FlutterQuillLocalizations.delegate` in your `WidgetsApp`, `MaterialApp`, or `CupertinoApp`. The fix is for the `QuillToolbarSearchButton`, `QuillToolbarLinkStyleButton`, and `QuillToolbarColorButton` buttons", - "8.5.4": "* The `mobileWidth`, `mobileHeight`, `mobileMargin`, and `mobileAlignment` is now deprecated in `flutter_quill`, they are now defined in `flutter_quill_extensions`\n* Deprecate `replaceStyleStringWithSize` function which is in `string.dart`\n* Deprecate `alignment`, and `margin` as they don't conform to official Quill JS", - "8.5.3": "* Update doc\n* Update `README.md` and `CHANGELOG.md`\n* Fix typos\n* Use `immutable` when possible\n* Update `.pubignore`", - "8.5.2": "* Updated `README.md`.\n* Feature: Added the ability to include a custom callback when the `QuillToolbarColorButton` is pressed.\n* The `QuillToolbar` now implements `PreferredSizeWidget`, enabling usage in the AppBar, similar to `QuillBaseToolbar`.", - "8.5.1": "* Updated `README.md`.", - "8.5.0": "* Migrated to `flutter_localizations` for translations.\n* Fixed: Translated all previously untranslated localizations.\n* Fixed: Added translations for missing items.\n* Fixed: Introduced default Chinese fallback translation.\n* Removed: Unused parameters `items` in `QuillToolbarFontFamilyButtonOptions` and `QuillToolbarFontSizeButtonOptions`.\n* Updated: Documentation.", - "8.4.4": "* Updated `.pubignore` to ignore unnecessary files and folders.", - "8.4.3": "* Updated `CHANGELOG.md`.", - "8.4.2": "* **Breaking change**: Configuration for `QuillRawEditor` has been moved to a separate class. Additionally, `readOnly` has been renamed to `isReadOnly`. If using `QuillEditor`, no action is required.\n* Introduced the ability for developers to override `TextInputAction` in both `QuillRawEditor` and `QuillEditor`.\n* Enabled using `QuillRawEditor` without `QuillEditorProvider`.\n* Bug fixes.\n* Added image cropping implementation in the example.", - "8.4.1": "* Added `copyWith` in `OptionalSize` class.", - "8.4.0": "* **Breaking change**: Updated `QuillCustomButton` to use `QuillCustomButtonOptions`. Moved all properties from `QuillCustomButton` to `QuillCustomButtonOptions`, replacing `iconData` with `icon` widget for increased customization.\n* **Breaking change**: `customButtons` in `QuillToolbarConfigurations` is now of type `List`.\n* Bug fixes following the `8.0.0` update.\n* Updated `README.md`.\n* Improved platform checking.", - "8.3.0": "* Added `iconButtonFactor` property to `QuillToolbarBaseButtonOptions` for customizing button size relative to its icon size (defaults to `kIconButtonFactor`, consistent with previous releases).", - "8.2.6": "* Organized `QuillRawEditor` code.", - "8.2.5": "* Added `builder` property in `QuillEditorConfigurations`.", - "8.2.4": "* Adhered to Flutter best practices.\n* Fixed auto-focus bug.", - "8.2.3": "* Updated `README.md`.", - "8.2.2": "* Moved `flutter_quill_test` to a separate package: [flutter_quill_test](https://pub.dev/packages/flutter_quill_test).", - "8.2.1": "* Updated `README.md`.", - "8.2.0": "* Added the option to add configurations for `flutter_quill_extensions` using `extraConfigurations`.", - "8.1.11": "* Followed Dart best practices by using `lints` and removed `pedantic` and `platform` since they are not used.\n* Fixed text direction bug.\n* Updated `README.md`.", - "8.1.10": "* Secret for automated publishing to pub.dev.", - "8.1.9": "* Fixed automated publishing to pub.dev.", - "8.1.8": "* Fixed automated publishing to pub.dev.", - "8.1.7": "* Automated publishing to pub.dev.", - "8.1.6": "* Fixed compatibility with `integration_test` by downgrading the minimum version of the platform package to 3.1.0.", - "8.1.5": "* Reversed background/font color toolbar button icons.", - "8.1.4": "* Reversed background/font color toolbar button tooltips.", - "8.1.3": "* Moved images to screenshots instead of `README.md`.", - "8.1.2": "* Fixed a bug related to the regexp of the insert link dialog.\n* Required Dart 3 as the minimum version.\n* Code cleanup.\n* Added a spacer widget between each button in the `QuillToolbar`.", - "8.1.1": "* Fixed null error in line.dart #1487(https://github.com/singerdmx/flutter*quill/issues/1487).", - "8.1.0": "* Fixed a word typo of `mirgration` to `migration` in the readme & migration document.\n* Updated migration guide.\n* Removed property `enableUnfocusOnTapOutside` in `QuillEditor` configurations and added `isOnTapOutsideEnabled` instead.\n* Added a new callback called `onTapOutside` in the `QuillEditorConfigurations` to perform actions when tapping outside the editor.\n* Fixed a bug that caused the web platform to not unfocus the editor when tapping outside of it. To override this, please pass a value to the `onTapOutside` callback.\n* Removed the old property of `iconTheme`. Instead, pass `iconTheme` in the button options; you will find the `base` property inside it with `iconTheme`.", - "8.0.0": "* If you have migrated recently, don't be alarmed by this update; it adds documentation, a migration guide, and marks the version as a more stable release. Although there are breaking changes (as reported by some developers), the major version was not changed due to time constraints during development. A single property was also renamed from `code` to `codeBlock` in the `elements` of the new `QuillEditorConfigurations` class.\n* Updated the README for better readability.", - "7.10.2": "* Removed line numbers from code blocks by default. You can still enable this feature thanks to the new configurations in the `QuillEditor`. Find the `elementOptions` property and enable `enableLineNumbers`.", - "7.10.1": "* Fixed issues and utilized the new parameters.\n* No longer need to use `MaterialApp` for most toolbar button child builders.\n* Compatibility with [fresh_quill_extensions](https://pub.dev/packages/fresh_quill_extensions), a temporary alternative to [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions).\n* Updated most of the documentation in `README.md`.", - "7.10.0": "* **Breaking change**: `QuillToolbar.basic()` can be accessed directly from `QuillToolbar()`, and the old `QuillToolbar` can be accessed from `QuillBaseToolbar`.\n* Refactored Quill editor and toolbar configurations into a single class each.\n* After changing checkbox list values, the controller will not request keyboard focus by default.\n* Moved toolbar and editor configurations directly into the widget but still use inherited widgets internally.\n* Fixes to some code after the refactoring.", - "7.9.0": "* Buttons Improvemenets\n* Refactor all the button configurations that used in `QuillToolbar.basic()` but there are still few lefts\n* **Breaking change**: Remove some configurations from the QuillToolbar and move them to the new `QuillProvider`, please notice this is a development version and this might be changed in the next few days, the stable release will be ready in less than 3 weeks\n* Update `flutter_quill_extensions` and it will be published into pub.dev soon.\n* Allow you to customize the search dialog by custom callback with child builder", - "7.8.0": "* **Important note**: this is not test release yet, it works but need more test and changes and breaking changes, we don't have development version and it will help us if you try the latest version and report the issues in Github but if you want a stable version please use `7.4.16`. this refactoring process will not take long and should be done less than three weeks with the testing.\n* We managed to refactor most of the buttons configurations and customizations in the `QuillProvider`, only three lefts then will start on refactoring the toolbar configurations\n* Code improvemenets", - "7.7.0": "* **Breaking change**: We have mirgrated more buttons in the toolbar configurations, you can do change them in the `QuillProvider`\n* Important bug fixes", - "7.6.1": "* Bug fixes", - "7.6.0": "* **Breaking change**: To customize the buttons in the toolbar, you can do that in the `QuillProvider`", - "7.5.0": "* **Breaking change**: The widgets `QuillEditor` and `QuillToolbar` are no longer have controller parameter, instead you need to make sure in the widget tree you have wrapped them with `QuillProvider` widget and provide the controller and the require configurations", - "7.4.16": "* Update documentation and README.md", - "7.4.15": "* Custom style attrbuites for platforms other than mobile (alignment, margin, width, height)\n* Bug fixes and other improvemenets", - "7.4.14": "* Improve performance by reducing the number of widgets rebuilt by listening to media query for only the needed things, for example instead of using `MediaQuery.of(context).size`, now we are using `MediaQuery.sizeOf(context)`\n* Add MediaButton for picking the images only since the video one is not ready\n* A new feature which allows customizing the text selection in quill editor which is useful for custom theme design system for custom app widget", - "7.4.13": "* Fixed tab editing when in readOnly mode.", - "7.4.12": "* Update the minimum version of device_info_plus to 9.1.0.", - "7.4.11": "* Add sw locale.", - "7.4.10": "* Update translations.", - "7.4.9": "* Style recognition fixes.", - "7.4.8": "* Upgrade dependencies.", - "7.4.7": "* Add Vietnamese and German translations.", - "7.4.6": "* Fix more null errors in Leaf.retain [##1394](https://github.com/singerdmx/flutter-quill/issues/1394) and Line.delete [##1395](https://github.com/singerdmx/flutter-quill/issues/1395).", - "7.4.5": "* Fix null error in Container.insert [##1392](https://github.com/singerdmx/flutter-quill/issues/1392).", - "7.4.4": "* Fix extra padding on checklists [##1131](https://github.com/singerdmx/flutter-quill/issues/1131).", - "7.4.3": "* Fixed a space input error on iPad.", - "7.4.2": "* Fix bug with keepStyleOnNewLine for link.", - "7.4.1": "* Fix toolbar dividers condition.", - "7.4.0": "* Support Flutter version 3.13.0.", - "7.3.3": "* Updated Dependencies conflicting.", - "7.3.2": "* Added builder for custom button in _LinkDialog.", - "7.3.1": "* Added case sensitive and whole word search parameters.\n* Added wrap around.\n* Moved search dialog to the bottom in order not to override the editor and the text found.\n* Other minor search dialog enhancements.", - "7.3.0": "* Add default attributes to basic factory.", - "7.2.19": "* Feat/link regexp.", - "7.2.18": "* Fix paste block text in words apply same style.", - "7.2.17": "* Fix paste text mess up style.\n* Add support copy/cut block text.", - "7.2.16": "* Allow for custom context menu.", - "7.2.15": "* Add flutter_quill.delta library which only exposes Delta datatype.", - "7.2.14": "* Fix errors when the editor is used in the `screenshot` package.", - "7.2.13": "* Fix around image can't delete line break.", - "7.2.12": "* Add support for copy/cut select image and text together.", - "7.2.11": "* Add affinity for localPosition.", - "7.2.10": "* LINE._getPlainText queryChild inclusive=false.", - "7.2.9": "* Add toPlainText method to `EmbedBuilder`.", - "7.2.8": "* Add custom button widget in toolbar.", - "7.2.7": "* Fix language code of Japan.", - "7.2.6": "* Style custom toolbar buttons like builtins.", - "7.2.5": "* Always use text cursor for editor on desktop.", - "7.2.4": "* Fixed keepStyleOnNewLine.", - "7.2.3": "* Get pixel ratio from view.", - "7.2.2": "* Prevent operations on stale editor state.", - "7.2.1": "* Add support for android keyboard content insertion.\n* Enhance color picker, enter hex color and color palette option.", - "7.2.0": "* Checkboxes, bullet points, and number points are now scaled based on the default paragraph font size.", - "7.1.20": "* Pass linestyle to embedded block.", - "7.1.19": "* Fix Rtl leading alignment problem.", - "7.1.18": "* Support flutter latest version.", - "7.1.17+1": "* Updates `device_info_plus` to version 9.0.0 to benefit from AGP 8 (see [changelog##900](https://pub.dev/packages/device_info_plus/changelog##900)).", - "7.1.16": "* Fixed subscript key from 'sup' to 'sub'.", - "7.1.15": "* Fixed a bug introduced in 7.1.7 where each section in `QuillToolbar` was displayed on its own line.", - "7.1.14": "* Add indents change for multiline selection.", - "7.1.13": "* Add custom recognizer.", - "7.1.12": "* Add superscript and subscript styles.", - "7.1.11": "* Add inserting indents for lines of list if text is selected.", - "7.1.10": "* Image embedding tweaks\n * Add MediaButton which is intened to superseed the ImageButton and VideoButton. Only image selection is working.\n * Implement image insert for web (image as base64)", - "7.1.9": "* Editor tweaks PR from bambinoua(https://github.com/bambinoua).\n * Shortcuts now working in Mac OS\n * QuillDialogTheme is extended with new properties buttonStyle, linkDialogConstraints, imageDialogConstraints, isWrappable, runSpacing,\n * Added LinkStyleButton2 with new LinkStyleDialog (similar to Quill implementation\n * Conditinally use Row or Wrap for dialog's children.\n * Update minimum Dart SDK version to 2.17.0 to use enum extensions.\n * Use merging shortcuts and actions correclty (if the key combination is the same)", - "7.1.8": "* Dropdown tweaks\n * Add itemHeight, itemPadding, defaultItemColor for customization of dropdown items.\n * Remove alignment property as useless.\n * Fix bugs with max width when width property is null.", - "7.1.7": "* Toolbar tweaks.\n * Implement tooltips for embed CameraButton, VideoButton, FormulaButton, ImageButton.\n * Extends customization for SelectAlignmentButton, QuillFontFamilyButton, QuillFontSizeButton adding padding, text style, alignment, width.\n * Add renderFontFamilies to QuillFontFamilyButton to show font faces in dropdown.\n * Add AxisDivider and its named constructors for for use in parent project.\n * Export ToolbarButtons enum to allow specify tooltips for SelectAlignmentButton.\n * Export QuillFontFamilyButton, SearchButton as they were not exported before.\n * Deprecate items property in QuillFontFamilyButton, QuillFontSizeButton as the it can be built usinr rawItemsMap.\n * Make onSelection QuillFontFamilyButton, QuillFontSizeButton omittable as no need to execute callback outside if controller is passed to widget.\n\nNow the package is more friendly for web projects.", - "7.1.6": "* Add enableUnfocusOnTapOutside field to RawEditor and Editor widgets.", - "7.1.5": "* Add tooltips for toolbar buttons.", - "7.1.4": "* Fix inserting tab character in lists.", - "7.1.3": "* Fix ios cursor bug when word.length==1.", - "7.1.2": "* Fix non scrollable editor exception, when tapped under content.", - "7.1.1": "* customLinkPrefixes parameter * makes possible to open links with custom protoco.", - "7.1.0": "* Fix ordered list numeration with several lists in document.", - "7.0.9": "* Use const constructor for EmbedBuilder.", - "7.0.8": "* Fix IME position bug with scroller.", - "7.0.7": "* Add TextFieldTapRegion for contextMenu.", - "7.0.6": "* Fix line style loss on new line from non string.", - "7.0.5": "* Fix IME position bug for Mac and Windows.\n* Unfocus when tap outside editor. fix the bug that cant refocus in afterButtonPressed after click ToggleStyleButton on Mac.", - "7.0.4": "* Have text selection span full line height for uneven sized text.", - "7.0.3": "* Fix ordered list numeration for lists with more than one level of list.", - "7.0.2": "* Allow widgets to override widget span properties.", - "7.0.1": "* Update i18n_extension dependency to version 8.0.0.", - "7.0.0": "* Breaking change: Tuples are no longer used. They have been replaced with a number of data classes.", - "6.4.4": "* Increased compatibility with Flutter widget tests.", - "6.4.3": "* Update dependencies (collection: 1.17.0, flutter_keyboard_visibility: 5.4.0, quiver: 3.2.1, tuple: 2.0.1, url_launcher: 6.1.9, characters: 1.2.1, i18n_extension: 7.0.0, device_info_plus: 8.1.0)", - "6.4.2": "* Replace `buildToolbar` with `contextMenuBuilder`.", - "6.4.1": "* Control the detect word boundary behaviour.", - "6.4.0": "* Use `axis` to make the toolbar vertical.\n* Use `toolbarIconCrossAlignment` to align the toolbar icons on the cross axis.\n* Breaking change: `QuillToolbar`'s parameter `toolbarHeight` was renamed to `toolbarSize`.", - "6.3.5": "* Ability to add custom shortcuts.", - "6.3.4": "* Update clipboard status prior to showing selected text overlay.", - "6.3.3": "* Fixed handling of mac intents.", - "6.3.2": "* Added `unknownEmbedBuilder` to QuillEditor.\n* Fix error style when input chinese japanese or korean.", - "6.3.1": "* Add color property to the basic factory function.", - "6.3.0": "* Support Flutter 3.7.", - "6.2.2": "* Fix: nextLine getter null where no assertion.", - "6.2.1": "* Revert \"Align numerical and bullet lists along with text content\".", - "6.2.0": "* Align numerical and bullet lists along with text content.", - "6.1.12": "* Apply i18n for default font dropdown option labels corresponding to 'Clear'.", - "6.1.11": "* Remove iOS hack for delaying focus calculation.", - "6.1.10": "* Delay focus calculation for iOS.", - "6.1.9": "* Bump keyboard show up wait to 1 sec.", - "6.1.8": "* Recalculate focus when showing keyboard.", - "6.1.7": "* Add czech localizations.", - "6.1.6": "* Upgrade i18n_extension to 6.0.0.", - "6.1.5": "* Fix formatting exception.", - "6.1.4": "* Add double quotes validation.", - "6.1.3": "* Revert \"fix order list numbering (##988)\".", - "6.1.2": "* Add typing shortcuts.", - "6.1.1": "* Fix order list numbering.", - "6.1.0": "* Add keyboard shortcuts for editor actions.", - "6.0.10": "* Upgrade device info plus to ^7.0.0.", - "6.0.9": "* Don't throw showAutocorrectionPromptRect not implemented. The function is called with every keystroke as a user is typing.", - "6.0.8+1": "* Fixes null pointer when setting documents.", - "6.0.8": "* Make QuillController.document mutable.", - "6.0.7": "* Allow disabling of selection toolbar.", - "6.0.6+1": "* Revert 6.0.6.", - "6.0.6": "* Fix wrong custom embed key.", - "6.0.5": "* Fixes toolbar buttons stealing focus from editor.", - "6.0.4": "* Bug fix for Type 'Uint8List' not found.", - "6.0.3": "* Add ability to paste images.", - "6.0.2": "* Address Dart Analysis issues.", - "6.0.1": "* Changed translation country code (zh_HK -> zh_hk) to lower case, which is required for i18n_extension used in flutter_quill.\n* Add localization in example's main to demonstrate translation.\n* Issue Windows selection's copy / paste tool bar not shown ##861: add selection's copy / paste toolbar, escape to hide toolbar, mouse right click to show toolbar, ctrl-Y / ctrl-Z to undo / redo.\n* Image and video displayed in Windows platform caused screen flickering while selecting text, a sample_data_nomedia.json asset is added for Desktop to demonstrate the added features.\n* Known issue: keyboard action sometimes causes exception mentioned in Flutter's issue ##106475 (Windows Keyboard shortcuts stop working after modifier key repeat flutter/flutter##106475).\n* Know issue: user needs to click the editor to get focus before toolbar is able to display.", - "6.0.0 BREAKING CHANGE": "* Removed embed (image, video & formula) blocks from the package to reduce app size.\n\nThese blocks have been moved to the package `flutter_quill_extensions`, migrate by filling the `embedBuilders` and `embedButtons` parameters as follows:\n\n```\nimport 'package:flutter_quill_extensions/flutter_quill_extensions.dart';\n\nQuillEditor.basic(\n controller: controller,\n embedBuilders: FlutterQuillEmbeds.builders(),\n);\n\nQuillToolbar.basic(\n controller: controller,\n embedButtons: FlutterQuillEmbeds.buttons(),\n);\n```", - "5.4.2": "* Upgrade i18n_extension.", - "5.4.1": "* Update German Translation.", - "5.4.0": "* Added Formula Button (for maths support).", - "5.3.2": "* Add more font family.", - "5.3.1": "* Enable search when text is not empty.", - "5.3.0": "* Added search function.", - "5.2.11": "* Remove default small color.", - "5.2.10": "* Don't wrap the QuillEditor's child in the EditorTextSelectionGestureDetector if selection is disabled.", - "5.2.9": "* Added option to modify SelectHeaderStyleButton options.\n* Added option to click again on h1, h2, h3 button to go back to normal.", - "5.2.8": "* Remove tooltip for LinkStyleButton.\n* Make link match regex case insensitive.", - "5.2.7": "* Add locale to QuillEditor.basic.", - "5.2.6": "* Fix keyboard pops up when resizing the image.", - "5.2.5": "* Upgrade youtube_player_flutter_quill to 8.2.2.", - "5.2.4": "* Upgrade youtube_player_flutter_quill to 8.2.1.", - "5.2.3": "* Flutter Quill Doesn't Work On iOS 16 or Xcode 14 Betas (Stored properties cannot be marked potentially unavailable with '@available').", - "5.2.2": "* Fix Web Unsupported operation: Platform.\\_operatingSystem error.", - "5.2.1": "* Rename QuillCustomIcon to QuillCustomButton.", - "5.2.0": "* Support font family selection.", - "5.1.1": "* Update README.", - "5.1.0": "* Added CustomBlockEmbed and customElementsEmbedBuilder.", - "5.0.5": "* Upgrade device_info_plus to 4.0.0.", - "5.0.4": "* Added onVideoInit callback for video documents.", - "5.0.3": "* Update dependencies.", - "5.0.2": "* Keep cursor position on checkbox tap.", - "5.0.1": "* Fix static analysis errors.", - "5.0.0": "* Flutter 3.0.0 support.", - "4.2.3": "* Ignore color:inherit and convert double to int for level.", - "4.2.2": "* Add clear option to font size dropdown.", - "4.2.1": "* Refactor font size dropdown.", - "4.2.0": "* Ensure selectionOverlay is available for showToolbar.", - "4.1.9": "* Using properly iconTheme colors.", - "4.1.8": "* Update font size dropdown.", - "4.1.7": "* Convert FontSize to a Map to allow for named Font Size.", - "4.1.6": "* Update quill_dropdown_button.dart.", - "4.1.5": "* Add Font Size dropdown to the toolbar.", - "4.1.4": "* New borderRadius for iconTheme.", - "4.1.3": "* Fix selection handles show/hide after paste, backspace, copy.", - "4.1.2": "* Add full support for hardware keyboards (Chromebook, Android tablets, etc) that don't alter screen UI.", - "4.1.1": "* Added textSelectionControls field in QuillEditor.", - "4.1.0": "* Added Node to linkActionPickerDelegate.", - "4.0.12": "* Add Persian(fa) language.", - "4.0.11": "* Fix cut selection error in multi-node line.", - "4.0.10": "* Fix vertical caret position bug.", - "4.0.9": "* Request keyboard focus when no child is found.", - "4.0.8": "* Fix blank lines do not display when **web*renderer=html.", - "4.0.7": "* Refactor getPlainText (better handling of blank lines and lines with multiple markups.", - "4.0.6": "* Bug fix for copying text with new lines.", - "4.0.5": "* Fixed casting null to Tuple2 when link dialog is dismissed without any input (e.g. barrier dismissed).", - "4.0.4": "* Bug fix for text direction rtl.", - "4.0.3": "* Support text direction rtl.", - "4.0.2": "* Clear toggled style on selection change.", - "4.0.1": "* Fix copy/cut/paste/selectAll not working.", - "4.0.0": "* Upgrade for Flutter 2.10.", - "3.9.11": "* Added Indonesian translation.", - "3.9.10": "* Fix for undoing a modification ending with an indented line.", - "3.9.9": "* iOS: Save image whose filename does not end with image file extension.", - "3.9.8": "* Added Urdu translation.", - "3.9.7": "* Fix for clicking on the Link button without any text on a new line crashes.", - "3.9.6": "* Apply locale to QuillEditor(contents).", - "3.9.5": "* Fix image pasting.", - "3.9.4": "* Hiding dialog after selecting action for image.", - "3.9.3": "* Update ImageResizer for Android.", - "3.9.2": "* Copy image with its style.", - "3.9.1": "* Support resizing image.", - "3.9.0": "* Image menu options for copy/remove.", - "3.8.8": "* Update set textEditingValue.", - "3.8.7": "* Fix checkbox not toggled correctly in toolbar button.", - "3.8.6": "* Fix cursor position changes when checking/unchecking the checkbox.", - "3.8.5": "* Fix \\_handleDragUpdate in \\_TextSelectionHandleOverlayState.", - "3.8.4": "* Fix link dialog layout.", - "3.8.3": "* Fix for errors on a non scrollable editor.", - "3.8.2": "* Fix certain keys not working on web when editor is a child of a scroll view.", - "3.8.1": "* Refactor \\_QuillEditorState to QuillEditorState.", - "3.8.0": "* Support pasting with format.", - "3.7.3": "* Fix selection overlay for collapsed selection.", - "3.7.2": "* Reverted Embed toPlainText change.", - "3.7.1": "* Change Embed toPlainText to be empty string.", - "3.7.0": "* Replace Toolbar showHistory group with individual showRedo and showUndo.", - "3.6.5": "* Update Link dialogue for image/video.", - "3.6.4": "* Link dialogue TextInputType.multiline.", - "3.6.3": "* Bug fix for link button text selection.", - "3.6.2": "* Improve link button.", - "3.6.1": "* Remove SnackBar 'What is entered is not a link'.", - "3.6.0": "* Allow link button to enter text.", - "3.5.3": "* Change link button behavior.", - "3.5.2": "* Bug fix for embed.", - "3.5.1": "* Bug fix for platform util.", - "3.5.0": "* Removed redundant classes.", - "3.4.4": "* Add more translations.", - "3.4.3": "* Preset link from attributes.", - "3.4.2": "* Fix launch link edit mode.", - "3.4.1": "* Placeholder effective in scrollable.", - "3.4.0": "* Option to save image in read-only mode.", - "3.3.1": "* Pass any specified key in QuillEditor constructor to super.", - "3.3.0": "* Fixed Style toggle issue.", - "3.2.1": "* Added new translations.", - "3.2.0": "* Support multiple links insertion on the go.", - "3.1.1": "* Add selection completed callback.", - "3.1.0": "* Fixed image ontap functionality.", - "3.0.4": "* Add maxContentWidth constraint to editor.", - "3.0.3": "* Do not show caret on screen when the editor is not focused.", - "3.0.2": "* Fix launch link for read-only mode.", - "3.0.1": "* Handle null value of Attribute.link.", - "3.0.0": "* Launch link improvements.\n* Removed QuillSimpleViewer.", - "2.5.2": "* Skip image when pasting.", - "2.5.1": "* Bug fix for Desktop `Shift` + `Click` support.", - "2.5.0": "* Update checkbox list.", - "2.4.1": "* Desktop selection improvements.", - "2.4.0": "* Improve inline code style.", - "2.3.3": "* Improves selection rects to have consistent height regardless of individual segment text styles.", - "2.3.2": "* Allow disabling floating cursor.", - "2.3.1": "* Preserve last newline character on delete.", - "2.3.0": "* Massive changes to support flutter 2.8.", - "2.2.2": "* iOS - floating cursor.", - "2.2.1": "* Bug fix for imports supporting flutter 2.8.", - "2.2.0": "* Support flutter 2.8.", - "2.1.1": "* Add methods of clearing editor and moving cursor.", - "2.1.0": "* Add delete handler.", - "2.0.23": "* Support custom replaceText handler.", - "2.0.22": "* Fix attribute compare and fix font size parsing.", - "2.0.21": "* Handle click on embed object.", - "2.0.20": "* Improved UX/UI of Image widget.", - "2.0.19": "* When uploading a video, applying indicator.", - "2.0.18": "* Make toolbar dividers optional.", - "2.0.17": "* Allow alignment of the toolbar icons to match WrapAlignment.", - "2.0.16": "* Add hide / show alignment buttons.", - "2.0.15": "* Implement change cursor to SystemMouseCursors.click when hovering a link styled text.", - "2.0.14": "* Enable customize the checkbox widget using DefaultListBlockStyle style.", - "2.0.13": "* Improve the scrolling performance by reducing the repaint areas.", - "2.0.12": "* Fix the selection effect can't be seen as the textLine with background color.", - "2.0.11": "* Fix visibility of text selection handlers on scroll.", - "2.0.10": "* cursorConnt.color notify the text_line to repaint if it was disposed.", - "2.0.9": "* Improve UX when trying to add a link.", - "2.0.8": "* Adding translations to the toolbar.", - "2.0.7": "* Added theming options for toolbar icons and LinkDialog.", - "2.0.6": "* Avoid runtime error when placed inside TabBarView.", - "2.0.5": "* Support inline code formatting.", - "2.0.4": "* Enable history shortcuts for desktop.", - "2.0.3": "* Fix cursor when line contains image.", - "2.0.2": "* Address KeyboardListener class name conflict.", - "2.0.1": "* Upgrade flutter_colorpicker to 0.5.0.", - "2.0.0": "* Text Alignment functions + Block Format standards.", - "1.9.6": "* Support putting QuillEditor inside a Scrollable view.", - "1.9.5": "* Skip image when pasting.", - "1.9.4": "* Bug fix for cursor position when tapping at the end of line with image(s).", - "1.9.3": "* Bug fix when line only contains one image.", - "1.9.2": "* Support for building custom inline styles.", - "1.9.1": "* Cursor jumps to the most appropriate offset to display selection.", - "1.9.0": "* Support inline image.", - "1.8.3": "* Updated quill_delta.", - "1.8.2": "* Support mobile image alignment.", - "1.8.1": "* Support mobile custom size image.", - "1.8.0": "* Support entering link for image/video.", - "1.7.3": "* Bumps photo_view version.", - "1.7.2": "* Fix static analysis error.", - "1.7.1": "* Support Youtube video.", - "1.7.0": "* Support video.", - "1.6.4": "* Bug fix for clear format button.", - "1.6.3": "* Fixed dragging right handle scrolling issue.", - "1.6.2": "* Fixed the position of the selection status drag handle.", - "1.6.1": "* Upgrade image_picker and flutter_colorpicker.", - "1.6.0": "* Support Multi Row Toolbar.", - "1.5.0": "* Remove file_picker dependency.", - "1.4.1": "* Remove filesystem_picker dependency.", - "1.4.0": "* Remove path_provider dependency.", - "1.3.4": "* Add option to paintCursorAboveText.", - "1.3.3": "* Upgrade file_picker version.", - "1.3.2": "* Fix copy/paste bug.", - "1.3.1": "* New logo.", - "1.3.0": "* Support flutter 2.2.0.", - "1.2.2": "* Checkbox supports tapping.", - "1.2.1": "* Indented position not holding while editing.", - "1.2.0": "* Fix image button cancel causes crash.", - "1.1.8": "* Fix height of empty line bug.", - "1.1.7": "* Fix text selection in read-only mode.", - "1.1.6": "* Remove universal_html dependency.", - "1.1.5": "* Enable \"Select\", \"Select All\" and \"Copy\" in read-only mode.", - "1.1.4": "* Fix text selection issue.", - "1.1.3": "* Update example folder.", - "1.1.2": "* Add pedantic.", - "1.1.1": "* Base64 image support.", - "1.1.0": "* Support null safety.", - "1.0.9": "* Web support for raw editor and keyboard listener.", - "1.0.8": "* Support token attribute.", - "1.0.7": "* Fix crash on web (dart:io).", - "1.0.6": "* Add desktop support WINDOWS, MACOS and LINUX.", - "1.0.5": "* Bug fix: Can not insert newline when Bold is toggled ON.", - "1.0.4": "* Upgrade photo_view to ^0.11.0.", - "1.0.3": "* Fix issue that text is not displayed while typing WEB.", - "1.0.2": "* Update toolbar in sample home page.", - "1.0.1": "* Fix static analysis errors.", - "1.0.0": "* Support flutter 2.0.", - "1.0.0-dev.2": "* Improve link handling for tel, mailto and etc.", - "1.0.0-dev.1": "* Upgrade prerelease SDK & Bump for master.", - "0.3.5": "* Fix for cursor focus issues when keyboard is on.", - "0.3.4": "* Improve link handling for tel, mailto and etc.", - "0.3.3": "* More fix on cursor focus issue when keyboard is on.", - "0.3.2": "* Fix cursor focus issue when keyboard is on.", - "0.3.1": "* cursor focus when keyboard is on.", - "0.3.0": "* Line Height calculated based on font size.", - "0.2.12": "* Support placeholder.", - "0.2.11": "* Fix static analysis error.", - "0.2.10": "* Update TextInputConfiguration autocorrect to true in stable branch.", - "0.2.9": "* Update TextInputConfiguration autocorrect to true.", - "0.2.8": "* Support display local image besides network image in stable branch.", - "0.2.7": "* Support display local image besides network image.", - "0.2.6": "* Fix cursor after pasting.", - "0.2.5": "* Toggle text/background color button in toolbar.", - "0.2.4": "* Support the use of custom icon size in toolbar.", - "0.2.3": "* Support custom styles and image on local device storage without uploading.", - "0.2.2": "* Update git repo.", - "0.2.1": "* Fix static analysis error.", - "0.2.0": "* Add checked/unchecked list button in toolbar.", - "0.1.8": "* Support font and size attributes.", - "0.1.7": "* Support checked/unchecked list.", - "0.1.6": "* Fix getExtentEndpointForSelection.", - "0.1.5": "* Support text alignment.", - "0.1.4": "* Handle url with trailing spaces.", - "0.1.3": "* Handle cursor position change when undo/redo.", - "0.1.2": "* Handle more text colors.", - "0.1.1": "* Fix cursor issue when undo.", - "0.1.0": "* Fix insert image.", - "0.0.9": "* Handle rgba color.", - "0.0.8": "* Fix launching url.", - "0.0.7": "* Handle multiple image inserts.", - "0.0.6": "* More toolbar functionality.", - "0.0.5": "* Update example.", - "0.0.4": "* Update example.", - "0.0.3": "* Update home page meta data.", - "0.0.2": "* Support image upload and launch url in read-only mode.", - "0.0.1": "* Rich text editor based on Quill Delta." -} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 56f899f86..1b182aa60 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,11 +9,9 @@ First, we would like to thank you for your time and efforts on this project, we > We encourage you to create an issue or reach out beforehand, > explaining your proposed changes and their rationale for a higher chance of acceptance. Thank you! -If you don't have anything specific in mind to improve or fix, you can take a look at the issues tab or take a look at -the todos of the project, they all start with `TODO:` so you can search in your IDE or use the todos tab in the IDE. - -> Make sure to not edit the `CHANGELOG.md` or the version in `pubspec.yaml` for any of the packages, CI will automate -> this process. +> [!NOTE] +> Updating the `CHANGELOG.md` is optional. If updated, follow the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format in the `Unreleased` section. +The package version in `pubspec.yaml` should not be modified; this will be handled by a maintainer or CI. ## 📋 Development Prerequisites @@ -78,24 +76,5 @@ To test your changes: ## 📝 Development Notes -- When updating the translations or localizations in the app, please take a look at the [Translation](./translation.md) - page as it has important notes to work. - If you also add a feature that adds new localizations, then you need it - to the instructions of it in order for the translations to take effect -- We use the same package version and `CHANGELOG.md` for all the packages, for - more [details](https://github.com/singerdmx/flutter-quill/pull/1878), the process is automated. We have a script that - will do the following: - 1. Generate the `CHANGELOG.md` files by `CHANGELOG_JSON.json` (source of data) and then paste them into all the - packages we have (overwrite), you don't need to - manually change/update any of the mentioned files above, once a new GitHub release published, the CI will take - the release notes from the release, pass the info to the - script, the release notes can be auto-generated by GitHub using a button, a descriptive PRs title would help but - you don't have to since we can change it at any time. - 2. The script require the new version as an argument, you don't need to run the script manually, when a maintainer - create a new tag and publish a new GitHub release, the publishing workflow will extract the new version from the - tag - name, run the script (pass the extracted version as an argument), commit the changes and push them into the - repository, the script will update the `version` property for all the packages so the `flutter pub publish` will - use the new version for each package correctly. - - the script will be used the CI and no need to run it manually \ No newline at end of file +- When updating the translations, refer to the [translation](./translation.md) page. +- Package versioning is automated, PRs need to update `CHANGELOG.md` to add the changes in the `Unreleased` per [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. diff --git a/README.md b/README.md index 9b545160c..7bfc8cd59 100644 --- a/README.md +++ b/README.md @@ -42,23 +42,23 @@ Check out our [Youtube Playlist] or [Code Introduction](./doc/code_introduction. to take a detailed walkthrough of the code base. You can join our [Slack Group] for discussion. -> [!NOTE] -> If you are viewing this page from [pub.dev](https://pub.dev/) page, then you -> might experience some issues with opening some links or -> unsupported [GitHub alerts](https://github.com/orgs/community/discussions/16925) +

+ A screenshot of the iOS example app +      + A screenshot of the web example app +

## 📚 Table of contents -- [📸 Screenshots](#-screenshots) - [📦 Installation](#-installation) -- [🛠 Platform Specific Configurations](#-platform-specific-configurations) +- [🛠 Platform Setup](#-platform-setup) - [🚀 Usage](#-usage) -- [💥 Breaking Changes](#-breaking-changes) - [🔤 Input / Output](#-input--output) - [⚙️ Configurations](#️-configurations) - [📦 Embed Blocks](#-embed-blocks) -- [🔄 Conversion to HTML](#-conversion-to-html) -- [📝 Spelling checker](#-spelling-checker) +- [🔄 Delta Conversion](#-delta-conversion) - [📝 Rich Text Paste](#-rich-text-paste) - [✂️ Shortcut events](#-shortcut-events) - [🌐 Translation](#-translation) @@ -66,26 +66,10 @@ You can join our [Slack Group] for discussion. - [🤝 Contributing](#-contributing) - [📜 Acknowledgments](#-acknowledgments) - -## 📸 Screenshots - -
-Tap to show/hide screenshots - -
- -Screenshot 1 -Screenshot 2 -Screenshot 3 -Screenshot 4 - -
- ## 📦 Installation -```yaml -dependencies: - flutter_quill: ^ +```shell +flutter pub add flutter_quill ```

OR

@@ -99,13 +83,9 @@ dependencies: ``` > [!TIP] -> Using the latest version and reporting any issues you encounter on GitHub will greatly contribute to the improvement -> of the library. -> Your input and insights are valuable in shaping a stable and reliable version for all the developers. Thank you for -> being part of the open-source community! -> +> If you're using version `10.0.0`, see [the migration guide to migrate to `11.0.0`](https://github.com/singerdmx/flutter-quill/blob/master/doc/migration/10_to_11.md). -## 🛠 Platform Specific Configurations +## 🛠 Platform Setup The `flutter_quill` package uses the following plugins: @@ -158,29 +138,45 @@ Create the file `your_project/android/app/src/main/res/xml/file_paths.xml` with > [!NOTE] > Starting with Flutter Quill `10.8.4`, [super_clipboard](https://pub.dev/packages/super_clipboard) is no longer required in `flutter_quill` or `flutter_quill_extensions`. -> The new default is an internal plugin, [`quill_native_bridge`](https://pub.dev/packages/quill_native_bridge). +> The new default is an internal plugin [`quill_native_bridge`](https://pub.dev/packages/quill_native_bridge). > If you want to continue using `super_clipboard`, you can use the [quill_super_clipboard](https://pub.dev/packages/quill_super_clipboard) package (support may be discontinued). ## 🚀 Usage +Add the localization delegate to your app widget: + +```dart +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; + +MaterialApp( + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, + ], +); +``` + Instantiate a controller: ```dart QuillController _controller = QuillController.basic(); ``` -Use the `QuillEditor`, and `QuillSimpleToolbar` widgets, +Use the `QuillEditor` and `QuillSimpleToolbar` widgets, and attach the `QuillController` to them: ```dart QuillSimpleToolbar( controller: _controller, - configurations: const QuillSimpleToolbarConfigurations(), + config: const QuillSimpleToolbarConfig(), ), Expanded( child: QuillEditor.basic( controller: _controller, - configurations: const QuillEditorConfigurations(), + config: const QuillEditorConfig(), ), ) ``` @@ -197,7 +193,7 @@ void dispose() { Check out [Sample Page] for more advanced usage. -## 💥 Breaking Changes +### 💥 Breaking Changes - APIs marked with [`@experimental`](https://api.flutter.dev/flutter/meta/experimental-constant.html) are subject to change or removal at any time and should be used with caution, @@ -207,7 +203,7 @@ as they may be altered even in minor versions. and [`@visibleForTesting`](https://api.flutter.dev/flutter/meta/visibleForTesting-constant.html) are not intended for public use and should be avoided entirely. -- The `package:flutter_quill/flutter_quill_internal.dart` expose internal APIs +- The `package:flutter_quill/internal.dart` expose internal APIs to be used by other related packages and should be avoided when possible. We make every effort to ensure internal APIs are not exported by default. Use experimental features at your own discretion. @@ -216,27 +212,19 @@ We recommend checking the `CHANGELOG.md` or release notes for each update to sta ## 🔤 Input / Output -This library uses [Quill Delta](https://quilljs.com/docs/delta/) -to represent the document content. -The Delta format is a compact and versatile way to describe document changes. -It consists of a series of operations, each representing an insertion, deletion, -or formatting change within the document. - -> [!NOTE] -> Don’t be confused by its name Delta—Deltas represents both documents and changes to documents. -> If you think of Deltas as the instructions for going from one document to another, -> the way Deltas represents a document is by expressing the instructions starting from an empty document. +This library utilizes [Quill Delta](https://quilljs.com/docs/delta/) to represent document content. +The Delta format is a compact and versatile method for describing document changes through a series of operations that denote insertions, deletions, or formatting changes. * Use `_controller.document.toDelta()` to extract the deltas. * Use `_controller.document.toPlainText()` to extract plain text. -To save a document as a JSON: +To save the document as JSON: ```dart final json = jsonEncode(_controller.document.toDelta().toJson()); ``` -To open the editor with an existing JSON representation that you've previously stored: +To open an existing JSON representation that has been previously stored: ```dart final json = jsonDecode(r'{"insert":"hello\n"}'); @@ -248,10 +236,6 @@ _controller.document = Document.fromJson(json); - [Quill Delta](https://quilljs.com/docs/delta/) - [Quill Delta Formats](https://quilljs.com/docs/formats) -- [Why Quill](https://quilljs.com/guides/why-quill/) -- [Quill JS Configurations](https://quilljs.com/docs/configuration/) -- [Quill JS Interactive Playground](https://quilljs.com/playground/) -- [Quill JS GitHub repo](https://github.com/quilljs/quill) ## ⚙️ Configurations @@ -293,37 +277,29 @@ of [FlutterQuill Extensions] - [Custom Embed Blocks](./doc/custom_embed_blocks.md) - [Custom Toolbar](./doc/custom_toolbar.md) -## 🔄 Conversion to HTML +## 🔄 Delta Conversion > [!CAUTION] -> **Converting HTML or Markdown to Delta is highly experimental and shouldn't be used for production applications**, -> while the current implementation we have internally is far from perfect, it could improved however **it will likely -not -work as expected**, due to differences between **HTML** and **Delta**, see -> this [Quill JS Comment #311458570](https://github.com/slab/quill/issues/1551#issuecomment-311458570) for more -> info.
-> We only use it **internally** as it is more suitable for our specific use case, copying content from external websites -> and pasting it into the editor -> previously breaks the styles, while the current implementation is not designed for converting a **full Document** from -> other formats to **Delta**, it provides a better user experience and doesn't have many downsides. -> -> The support for converting HTML to **Quill Delta** is quite experimental and used internally when -> pasting HTML content from the clipboard to the Quill Document. +> Storing the **Delta** as **HTML** in the database to convert it back to **Delta** when +> loading the document is not recommended due to the structural and functional differences between HTML and Delta ([see this comment](https://github.com/slab/quill/issues/1551#issuecomment-311458570)). +> We recommend storing the **Document** as **Delta JSON** +> instead of other formats (e.g., HTML, Markdown, PDF, Microsoft Word, Google Docs, Apple Pages, XML). > > Converting **Delta** from/to **HTML** is not a standard feature in [Quill JS](https://github.com/slab/quill) > or [FlutterQuill]. -> [!IMPORTANT] -> Converting **HTML** to **Delta** usually won't work as expected, we highly recommend storing the **Document** as * -*Delta JSON** -> in the database instead of other formats (e.g., HTML, Markdown, PDF, Microsoft Word, Google Docs, Apple Pages, XML, -> CSV, -> etc...) -> -> Converting between **HTML** and **Delta** JSON is generally not recommended due to their structural and functional -> differences. -> -> Sometimes you might want to convert between **HTML** and **Delta** for specific use cases: +Available Packages for Conversion + +| Package | Description | +| ------- | ----------- | +| [`vsc_quill_delta_to_html`](https://pub.dev/packages/vsc_quill_delta_to_html) | Converts **Delta** to **HTML**. | +| [`flutter_quill_delta_from_html`](https://pub.dev/packages/flutter_quill_delta_from_html) | Converts **HTML** to **Delta**. | +| [`flutter_quill_to_pdf`](https://pub.dev/packages/flutter_quill_to_pdf) | Converts **Delta** to **PDF**. | +| [`markdown_quill`](https://pub.dev/packages/markdown_quill) | Converts **Markdown** to **Delta** and vice versa. | +| [`flutter_quill_delta_easy_parser`](https://pub.dev/packages/flutter_quill_delta_easy_parser) | Converts Quill **Delta** into a simplified document format, making it easier to manage and manipulate text attributes. | + +> [!TIP] +> You might want to convert between **HTML** and **Delta** for some use cases: > > 1. **Migration**: If you're using an existing system that stores the data in HTML and want to convert the document data to **Delta**. @@ -332,51 +308,43 @@ work as expected**, due to differences between **HTML** and **Delta**, see > 4. **Rich text pasting**: If you copy some content from websites or apps, and want to paste it into the app. > 5. **SEO**: In case you want to use HTML for SEO support. -The following packages can be used: - -1. [`vsc_quill_delta_to_html`](https://pub.dev/packages/vsc_quill_delta_to_html): To convert **Delta** - to **HTML**. -2. [`flutter_quill_delta_from_html`](https://pub.dev/packages/flutter_quill_delta_from_html): To convert **HTML** to **Delta**. -3. [`flutter_quill_to_pdf`](https://pub.dev/packages/flutter_quill_to_pdf): To convert **Delta** To **PDF**. -4. [`markdown_quill`](https://pub.dev/packages/markdown_quill): To convert **Markdown** To **Delta** and vice versa. - -## 📝 Spelling checker - -This feature is currently not implemented and is being planned. Refer to [#2246](https://github.com/singerdmx/flutter-quill/issues/2246) -for discussion. - ## 📝 Rich Text Paste This feature allows the user to paste the content copied from other apps into the editor as rich text. The plugin [`quill_native_bridge`](https://pub.dev/packages/quill_native_bridge) provides access to the system Clipboard. +

+ An animated image of the rich text paste on macOS +

+ > [!IMPORTANT] > Currently this feature is not supported on the web. > See [issue #1998](https://github.com/singerdmx/flutter-quill/issues/1998) and [issue #2220](https://github.com/singerdmx/flutter-quill/issues/2220) - for more details + for more details. ## ✂️ Shortcut events -We can customize some Shorcut events, using the parameters `characterShortcutEvents` or `spaceShortcutEvents` from `QuillEditorConfigurations` to add more functionality to our editor. +We can customize some Shorcut events, using the parameters `characterShortcutEvents` or `spaceShortcutEvents` from `QuillEditorConfig` to add more functionality to the editor. > [!NOTE] > -> You can get all standard shortcuts using `standardCharactersShortcutEvents` or `standardSpaceShorcutEvents` +> You can get all standard shortcuts using `standardCharactersShortcutEvents` or `standardSpaceShorcutEvents`. -To see an example of this, you can check [customizing_shortcuts](./doc/customizing_shortcuts.md) +To see an example of this, refer to [shortcut events](./doc/customizing_shortcuts.md) page. ## 🌐 Translation -The package offers translations for the quill toolbar and editor, it will follow the system locale unless you set your +The package offers translations for the toolbar and editor widgets, it will follow the system locale unless you set your own locale. -Open this [page](./doc/translation.md) for more info +See the [translation](./doc/translation.md) page for more info. ## 🧪 Testing Take a look at [flutter_quill_test](https://pub.dev/packages/flutter_quill_test) for testing. -Notice that currently, the support for testing is limited. +Currently, the support for testing is limited. ## 🤝 Contributing @@ -428,4 +396,4 @@ See [Contributing](./CONTRIBUTING.md) for more details. [Slack Group]: https://join.slack.com/t/bulletjournal1024/shared_invite/zt-fys7t9hi-ITVU5PGDen1rNRyCjdcQ2g -[Sample Page]: https://github.com/singerdmx/flutter-quill/blob/master/example/lib/screens/quill/quill_screen.dart +[Sample Page]: https://github.com/singerdmx/flutter-quill/blob/master/example/lib/main.dart diff --git a/doc/OLD_CHANGELOG.md b/doc/OLD_CHANGELOG.md new file mode 100644 index 000000000..03860e9a3 --- /dev/null +++ b/doc/OLD_CHANGELOG.md @@ -0,0 +1,3189 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +> [!NOTE] +> This is the archived version of the `CHANGELOG.md` file. See [the newer `CHANGELOG.md`](https://github.com/singerdmx/flutter-quill/blob/master/CHANGELOG.md). + +## 11.0.0-dev.1 + +This release is identical to [11.0.0-dev.0](https://github.com/singerdmx/flutter-quill/releases/tag/v11.0.0-dev.0), mainly published to update the min published version (from pub.dev) of `flutter_quill` in `flutter_quill_test` and `flutter_quill_extensions`. + +See the [migration guide](https://github.com/singerdmx/flutter-quill/blob/release/v11/doc/migration/10_to_11.md). + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v11.0.0-dev.0...v11.0.0-dev.1 + +## 10.8.5 + +* fix: allow all correct URLs to be formatted by @orevial in https://github.com/singerdmx/flutter-quill/pull/2328 +* fix(macos): Implement actions for ExpandSelectionToDocumentBoundaryIntent and ExpandSelectionToLineBreakIntent to use keyboard shortcuts, unrelated cleanup to the bug fix. by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2279 + +## New Contributors +* @orevial made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2328 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.4...v10.8.5 + +## 10.8.4 + +- [Fixes an unhandled exception](https://github.com/singerdmx/flutter-quill/commit/8dd559b825030d29b30b32b353a08dcc13dc42b7) in case `getClipboardFiles()` wasn't supported +- [Updates min version](https://github.com/singerdmx/flutter-quill/commit/49569e47b038c5f61b7521571c102cf5ad5a0e3f) of internal dependency `quill_native_bridge` + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.3...v10.8.4 + +## 10.8.3 + +This release is identical to [v10.8.3-dev.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.3-dev.0), mainly published to bump the minimum version of [flutter_quill](https://pub.dev/packages/flutter_quill) in [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) and to publish [quill-super-clipboard](https://github.com/FlutterQuill/quill-super-clipboard/). + +A new identical release `10.9.0` will be published soon with a release description. + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3 + +## 10.8.3-dev.0 + +A non-pre-release version with this change will be published soon. + +* feat: Use quill_native_bridge as default impl in DefaultClipboardService, fix related bugs in the extensions package by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2230 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3-dev.0 + +## 10.8.2 + +* Fixed minor typo in Hungarian (hu) localization by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2307 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.1...v10.8.2 + +## 10.8.1 + +- This release fixes the compilation issue when building the project with [Flutter/Wasm](https://docs.flutter.dev/platform-integration/web/wasm) target on the web. Also, update the conditional import check to avoid using `dart.library.html`: + + ```dart + import 'web/quill_controller_web_stub.dart' + if (dart.library.html) 'web/quill_controller_web_real.dart'; + ``` + + To fix critical bugs that prevent using the editor on Wasm. + + > Flutter/Wasm is stable as of [Flutter 3.22](https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3) though it's likely that you might experience some issues when using this new target, if you experienced any issues related to Wasm support related to Flutter Quill, feel free to [open an issue](https://github.com/singerdmx/flutter-quill/issues). + + Issue #1889 is fixed by temporarily replacing the plugin [flutter_keyboard_visibility](https://pub.dev/packages/flutter_keyboard_visibility) with [flutter_keyboard_visibility_temp_fork](https://pub.dev/packages/flutter_keyboard_visibility_temp_fork) since `flutter_keyboard_visibility` depend on `dart:html`. Also updated the `compileSdkVersion` to `34` instead of `31` as a workaround to [Flutter #63533](https://github.com/flutter/flutter/issues/63533). + +- Support for Hungarian (hu) localization was added by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2291. +- [dart_quill_delta](https://pub.dev/packages/dart_quill_delta/) has been moved to [FlutterQuill/dart-quill-delta](https://github.com/FlutterQuill/dart-quill-delta) (outside of this repo) and they have separated version now. + + +## New Contributors +* @G-Greg made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2291 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.0...v10.8.1 + +## 10.8.0 + +> [!CAUTION] +> This release can be breaking change for `flutter_quill_extensions` users as it remove the built-in support for loading YouTube videos + +If you're using [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) then this release, can be a breaking change for you if you load videos in the editor and expect YouTube videos to be supported, [youtube_player_flutter](https://pub.dev/packages/youtube_player_flutter) and [flutter_inappwebview](https://pub.dev/packages/flutter_inappwebview) are no longer dependencies of the extensions package, which are used to support loading YouTube Iframe videos on non-web platforms, more details about the discussion and reasons in [#2286](https://github.com/singerdmx/flutter-quill/pull/2286) and [#2284](https://github.com/singerdmx/flutter-quill/issues/2284). + +We have added an experimental property that gives you more flexibility and control about the implementation you want to use for loading videos. + +> [!WARNING] +> It's likely to experience some common issues while implementing this feature, especially on desktop platforms as the support for [flutter_inappwebview_windows](https://pub.dev/packages/flutter_inappwebview_windows) and [flutter_inappwebview_macos](https://pub.dev/packages/flutter_inappwebview_macos) before 2 days. Some of the issues are in the Flutter Quill editor. + +If you want loading YouTube videos to be a feature again with the latest version of Flutter Quill, you can use an existing plugin or package, or implement your own solution. For example, you might use [`youtube_video_player`](https://pub.dev/packages/youtube_video_player) or [`youtube_player_flutter`](https://pub.dev/packages/youtube_player_flutter), which was previously used in [`flutter_quill_extensions`](https://pub.dev/packages/flutter_quill_extensions). + +Here’s an example setup using `youtube_player_flutter`: + +```shell +flutter pub add youtube_player_flutter +``` + +Example widget configuration: + +```dart +import 'package:flutter/material.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart'; + +class YoutubeVideoPlayer extends StatefulWidget { + const YoutubeVideoPlayer({required this.videoUrl, super.key}); + + final String videoUrl; + + @override + State createState() => _YoutubeVideoPlayerState(); +} + +class _YoutubeVideoPlayerState extends State { + late final YoutubePlayerController _youtubePlayerController; + @override + void initState() { + super.initState(); + _youtubePlayerController = YoutubePlayerController( + initialVideoId: YoutubePlayer.convertUrlToId(widget.videoUrl) ?? + (throw StateError('Expect a valid video URL')), + flags: const YoutubePlayerFlags( + autoPlay: true, + mute: true, + ), + ); + } + + @override + Widget build(BuildContext context) { + return YoutubePlayer( + controller: _youtubePlayerController, + showVideoProgressIndicator: true, + ); + } + + @override + void dispose() { + _youtubePlayerController.dispose(); + super.dispose(); + } +} + +``` + +Then, integrate it with `QuillEditorVideoEmbedConfigurations` + +```dart +FlutterQuillEmbeds.editorBuilders( + videoEmbedConfigurations: QuillEditorVideoEmbedConfigurations( + customVideoBuilder: (videoUrl, readOnly) { + // Example: Check for YouTube Video URL and return your + // YouTube video widget here. + bool isYouTubeUrl(String videoUrl) { + try { + final uri = Uri.parse(videoUrl); + return uri.host == 'www.youtube.com' || + uri.host == 'youtube.com' || + uri.host == 'youtu.be' || + uri.host == 'www.youtu.be'; + } catch (_) { + return false; + } + } + + if (isYouTubeUrl(videoUrl)) { + return YoutubeVideoPlayer( + videoUrl: videoUrl, + ); + } + + // Return null to fallback to the default logic + return null; + }, + ignoreYouTubeSupport: true, + ), +); +``` + +> [!NOTE] +> This example illustrates a basic approach, additional adjustments might be necessary to meet your specific needs. YouTube video support is no longer included in this project. Keep in mind that `customVideoBuilder` is experimental and can change without being considered as breaking change. More details in [breaking changes](https://github.com/singerdmx/flutter-quill#-breaking-changes) section. + +[`super_clipboard`](https://pub.dev/packages/super_clipboard) will also no longer a dependency of `flutter_quill_extensions` once [PR #2230](https://github.com/singerdmx/flutter-quill/pull/2230) is ready. + +We're looking forward to your feedback. + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.7...v10.8.0 + +## 10.7.7 + +This version is nearly identical to `10.7.6` with a build failure bug fix in [#2283](https://github.com/singerdmx/flutter-quill/pull/2283) related to unmerged change in [#2230](https://github.com/singerdmx/flutter-quill/pull/2230) + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.6...v10.7.7 + +## 10.7.6 + +* Code Comments Typo fixes by @Luismi74 in https://github.com/singerdmx/flutter-quill/pull/2267 +* docs: add important note for contributors before introducing new features by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2269 +* docs(readme): add 'Breaking Changes' section by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2275 +* Fix: Resolved issue with broken IME composing rect in Windows desktop(re-implementation) by @agata in https://github.com/singerdmx/flutter-quill/pull/2282 + +## New Contributors +* @Luismi74 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2267 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.5...v10.7.6 + +## 10.7.5 + +* fix(ci): add flutter pub get step for quill_native_bridge by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2265 +* revert: "Resolved issue with broken IME composing rect in Windows desktop" by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2266 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.4...v10.7.5 + +## 10.7.4 + +* chore: remove pubspec_overrides.yaml and pubspec_overrides.yaml.disabled by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2262 +* ci: remove quill_native_bridge from automated publishing workflow by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2263 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.3...v10.7.4 + +## 10.7.3 + +- Deprecate `FlutterQuillExtensions` in `flutter_quill_extensions` +- Update the minimum version of `flutter_quill` and `super_clipboard` in `flutter_quill_extensions` to avoid using deprecated code. + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.2...v10.7.3 + +## 10.7.2 + +## What's Changed +* chore: deprecate flutter_quill/extensions.dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2258 + +This is a minor release introduced to upload a new version of `flutter_quill` and `flutter_quill_extensions` to update the minimum required to avoid using deprecated code in `flutter_quill_extensions`. + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.1...v10.7.2 + +## 10.7.1 + +* chore: deprecate markdown_quill export, ignore warnings by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2256 +* chore: deprecate spell checker service by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2255 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.0...v10.7.1 + +## 10.7.0 + +* Chore: deprecate embed table feature by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2254 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.6...v10.7.0 + +## 10.6.6 + +* Bug fix: Removing check not allowing spell check on web by @joeserhtf in https://github.com/singerdmx/flutter-quill/pull/2252 + +## New Contributors +* @joeserhtf made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2252 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.5...v10.6.6 + +## 10.6.5 + +* Refine IME composing range styling by applying underline as text style by @agata in https://github.com/singerdmx/flutter-quill/pull/2244 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.4...v10.6.5 + +## 10.6.4 + +* fix: the composing text did not show an underline during IME conversion by @agata in https://github.com/singerdmx/flutter-quill/pull/2242 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.3...v10.6.4 + +## 10.6.3 + +* Fix: Resolved issue with broken IME composing rect in Windows desktop by @agata in https://github.com/singerdmx/flutter-quill/pull/2239 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.2...v10.6.3 + +## 10.6.2 + +* Fix: QuillToolbarToggleStyleButton Switching failure by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2234 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.1...v10.6.2 + +## 10.6.1 + +* Chore: update `flutter_quill_delta_from_html` to remove exception calls by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2232 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.0...v10.6.1 + +## 10.6.0 + +* docs: cleanup the docs, remove outdated resources, general changes by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2227 +* Feat: customizable character and space shortcut events by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2228 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.19...v10.6.0 + +## 10.5.19 + +* fix: properties other than 'style' for custom inline code styles (such as 'backgroundColor') were not being applied correctly by @agata in https://github.com/singerdmx/flutter-quill/pull/2226 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.18...v10.5.19 + +## 10.5.18 + +* feat(web): rich text paste from Clipboard using HTML by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2009 +* revert: disable rich text paste feature on web as a workaround by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2221 +* refactor: moved shortcuts and onKeyEvents to its own file by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2223 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.17...v10.5.18 + +## 10.5.17 + +* feat(l10n): localize all untranslated.json by @erdnx in https://github.com/singerdmx/flutter-quill/pull/2217 +* Fix: Block Attributes are not displayed if the editor is empty by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2210 + +## New Contributors +* @erdnx made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2217 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.16...v10.5.17 + +## 10.5.16 + +* chore: remove device_info_plus and add quill_native_bridge to access platform specific APIs by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2194 +* Not show/update/hiden mangnifier when manifier config is disbale by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2212 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.16 + +## 10.5.15-dev.0 + +Introduce `quill_native_bridge` which is an internal plugin to use by `flutter_quill` to access platform APIs. + +For now, the only functionality it supports is to check whatever the iOS app is running on iOS simulator without requiring [`device_info_plus`](pub.dev/packages/device_info_plus) as a dependency. + +> [!NOTE] +> `quill_native_bridge` is a plugin for internal use and should not be used in production applications +> as breaking changes can happen and can removed at any time. + +For more details and discussion see [#2194](https://github.com/singerdmx/flutter-quill/pull/2194). + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.15-dev.0 + +## 10.5.14 + +* chore(localization): add Greek language support by @DKalathas in https://github.com/singerdmx/flutter-quill/pull/2206 + +## New Contributors +* @DKalathas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2206 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.13...v10.5.14 + +## 10.5.13 + +* Revert "Fix: Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2201 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.12...v10.5.13 + +## 10.5.12 + +* Fix: Backspace remove block attributes at start by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2200 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.11...v10.5.12 + +## 10.5.11 + +* Enhancement: Backspace handling at the start of blocks in delete rules by @agata in https://github.com/singerdmx/flutter-quill/pull/2199 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.10...v10.5.11 + +## 10.5.10 + +* Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2198 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.9...v10.5.10 + +## 10.5.9 + +* chore: improve platform check by using constants and defaultTargetPlatform by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2188 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.8...v10.5.9 + +## 10.5.8 + +* Feat: Add configuration option to always indent on TAB key press by @agata in https://github.com/singerdmx/flutter-quill/pull/2187 + +## New Contributors +* @agata made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2187 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.7...v10.5.8 + +## 10.5.7 + +* chore(example): downgrade Kotlin from 1.9.24 to 1.7.10 by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2185 +* style: refactor build leading function style, width, and padding parameters for custom node leading builder by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2182 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.6...v10.5.7 + +## 10.5.6 + +* chore(deps): update super_clipboard to 0.8.20 in flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2181 +* Update quill_screen.dart, i chaged the logic for showing a lock when … by @rightpossible in https://github.com/singerdmx/flutter-quill/pull/2183 + +## New Contributors +* @rightpossible made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2183 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.5...v10.5.6 + +## 10.5.5 + +* Fix text selection handles when scroll mobile by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2176 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.4...v10.5.5 + +## 10.5.4 + +* Add Thai (th) localization by @silkyland in https://github.com/singerdmx/flutter-quill/pull/2175 + +## New Contributors +* @silkyland made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2175 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.3...v10.5.4 + +## 10.5.3 + +* Fix: Assertion Failure in line.dart When Editing Text with Block-Level Attributes by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2174 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.2...v10.5.3 + +## 10.5.2 + +* fix(toolbar): regard showDividers in simple toolbar by @realth000 in https://github.com/singerdmx/flutter-quill/pull/2172 + +## New Contributors +* @realth000 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2172 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.1...v10.5.2 + +## 10.5.1 + +* fix drag selection extension (does not start at tap location if you are dragging quickly by @jezell in https://github.com/singerdmx/flutter-quill/pull/2170 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.0...v10.5.1 + +## 10.5.0 + +* Feat: custom leading builder by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2146 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.9...v10.5.0 + +## 10.4.9 + +* fix floating cursor not disappearing after scroll end by @vishna in https://github.com/singerdmx/flutter-quill/pull/2163 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.8...v10.4.9 + +## 10.4.8 + +* Fix: direction has no opposite effect if the language is rtl by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2154 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.7...v10.4.8 + +## 10.4.7 + +* Fix: Unable to scroll 2nd editor window by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2152 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.6...v10.4.7 + +## 10.4.6 + +* Handle null child query by @jezell in https://github.com/singerdmx/flutter-quill/pull/2151 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.5...v10.4.6 + +## 10.4.5 + +* chore!: move spell checker to example by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2145 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.4...v10.4.5 + +## 10.4.4 + +* fix custom recognizer builder not being passed to editabletextblock by @jezell in https://github.com/singerdmx/flutter-quill/pull/2143 +* fix null reference exception when dragging selection on non scrollable selection by @jezell in https://github.com/singerdmx/flutter-quill/pull/2144 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.3...v10.4.4 + +## 10.4.3 + +* Chore: update simple_spell_checker package by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2139 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.2...v10.4.3 + +## 10.4.2 + +* Revert "fix: Double click to select text sometimes doesn't work. ([#2086](https://github.com/singerdmx/flutter-quill/pull/2086)) + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.1...v10.4.2 + +## 10.4.1 + +* Chore: improve Spell checker API to the example by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2133 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.0...v10.4.1 + +## 10.4.0 + +* Copy TapAndPanGestureRecognizer from TextField by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2128 +* enhance stringToColor with a custom defined palette from `DefaultStyles` by @vishna in https://github.com/singerdmx/flutter-quill/pull/2095 +* Feat: include spell checker for example app by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2127 + +## New Contributors +* @vishna made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2095 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.3...v10.4.0 + +## 10.3.2 + +* Fix: Loss of style when backspace by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2125 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.1...v10.3.2 + +## 10.3.1 + +* Chore: Move spellchecker service to extensions by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2120 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.0...v10.3.1 + +## 10.3.0 + +* Feat: Spellchecker for Flutter Quill by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2118 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.1...v10.3.0 + +## 10.2.1 + +* Fix: context menu is visible even when selection is collapsed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2116 +* Fix: unsafe operation while getting overlayEntry in text_selection by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2117 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.0...v10.2.1 + +## 10.2.0 + +* refactor!: restructure project into modular architecture for flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2106 +* Fix: Link selection and editing by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2114 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.10...v10.2.0 + +## 10.1.10 + +* Fix(example): image_cropper outdated version by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2100 +* Using dart.library.js_interop instead of dart.library.html by @h1376h in https://github.com/singerdmx/flutter-quill/pull/2103 + +## New Contributors +* @h1376h made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2103 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.9...v10.1.10 + +## 10.1.9 + +* restore ability to pass in key to QuillEditor by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2093 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.8...v10.1.9 + +## 10.1.8 + +* Enhancement: Search within Embed objects by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2090 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.7...v10.1.8 + +## 10.1.7 + +* Feature/allow shortcut override by @InstrinsicAutomations in https://github.com/singerdmx/flutter-quill/pull/2089 + +## New Contributors +* @InstrinsicAutomations made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2089 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.6...v10.1.7 + +## 10.1.6 + +* fixed #1295 Double click to select text sometimes doesn't work. by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2086 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.5...v10.1.6 + +## 10.1.5 + +* ref: add `VerticalSpacing.zero` and `HorizontalSpacing.zero` named constants by @adil192 in https://github.com/singerdmx/flutter-quill/pull/2083 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.4...v10.1.5 + +## 10.1.4 + +* Fix: collectStyles for lists and alignments by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2082 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.3...v10.1.4 + +## 10.1.3 + +* Move Controller outside of configurations data class by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2078 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.2...v10.1.3 + +## 10.1.2 + +* Fix Multiline paste with attributes and embeds by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2074 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.1...v10.1.2 + +## 10.1.1 + +* Toolbar dividers fixes + Docs updates by @troyanskiy in https://github.com/singerdmx/flutter-quill/pull/2071 + +## New Contributors +* @troyanskiy made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2071 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.0...v10.1.1 + +## 10.1.0 + +* Feat: support for customize copy and cut Embeddables to Clipboard by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2067 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.10...v10.1.0 + +## 10.0.10 + +* fix: Hide selection toolbar if editor loses focus by @huandu in https://github.com/singerdmx/flutter-quill/pull/2066 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.9...v10.0.10 + +## 10.0.9 + +* Fix: manual checking of directionality by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2063 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.8...v10.0.9 + +## 10.0.8 + +* feat: add callback to handle performAction by @huandu in https://github.com/singerdmx/flutter-quill/pull/2061 +* fix: Invalid selection when tapping placeholder text by @huandu in https://github.com/singerdmx/flutter-quill/pull/2062 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.7...v10.0.8 + +## 10.0.7 + +* Fix: RTL issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2060 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.6...v10.0.7 + +## 10.0.6 + +* fix: textInputAction is not set when creating QuillRawEditorConfiguration by @huandu in https://github.com/singerdmx/flutter-quill/pull/2057 + +## New Contributors +* @huandu made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2057 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.5...v10.0.6 + +## 10.0.5 + +* Add tests for PreserveInlineStylesRule and fix link editing. Other minor fixes. by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2058 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.4...v10.0.5 + +## 10.0.4 + +* Add ability to set up horizontal spacing for block style by @dimkanovikov in https://github.com/singerdmx/flutter-quill/pull/2051 +* add catalan language by @spilioio in https://github.com/singerdmx/flutter-quill/pull/2054 + +## New Contributors +* @dimkanovikov made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2051 +* @spilioio made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2054 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.3...v10.0.4 + +## 10.0.3 + +* doc(Delta): more documentation about Delta by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2042 +* doc(attribute): added documentation about Attribute class and how create one by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2048 +* if magnifier removes toolbar, restore it when it is hidden by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2049 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.2...v10.0.3 + +## 10.0.2 + +* chore(scripts): migrate the scripts from sh to dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2036 +* Have the ability to create custom rules, closes #1162 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/2040 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.1...v10.0.2 + +## 10.0.1 + +This release is identical to [10.0.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.0.0) with a fix that addresses issue #2034 by requiring `10.0.0` as the minimum version for quill related dependencies. + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.0...v10.0.1 + +## 10.0.0 + +* refactor: restructure project into modular architecture for flutter_quill by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2032 +* chore: update GitHub PR template by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2033 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.6.0...v10.0.0 + +## 9.6.0 + +* [feature] : quill add magnifier by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2026 + +## New Contributors +* @demoYang made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2026 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.23...v9.6.0 + +## 9.5.23 + +* add untranslated Kurdish keys by @Xoshbin in https://github.com/singerdmx/flutter-quill/pull/2029 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.22...v9.5.23 + +## 9.5.22 + +* Fix outdated contributor guide link on PR template by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2027 +* Fix(rule): PreserveInlineStyleRule assume the type of the operation data and throw stacktrace by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2028 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.21...v9.5.22 + +## 9.5.21 + +* Fix: Key actions not being handled by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2025 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.20...v9.5.21 + +## 9.5.20 + +* Remove useless delta_x_test by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2017 +* Update flutter_quill_delta_from_html package on pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2018 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.19...v9.5.20 + +## 9.5.19 + +* fixed #1835 Embed Reloads on Cmd Key Press by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2013 + +## New Contributors +* @li8607 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2013 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.18...v9.5.19 + +## 9.5.18 + +* Refactor: Moved core link button functions to link.dart by @Alspb in https://github.com/singerdmx/flutter-quill/pull/2008 +* doc: more documentation about Rules by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2014 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.17...v9.5.18 + +## 9.5.17 + +* Feat(config): added option to disable automatic list conversion by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2011 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.16...v9.5.17 + +## 9.5.16 + +* chore: drop support for HTML, PDF, and Markdown converting functions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1997 +* docs(readme): update the extensions package to document the Rich Text Paste feature on web by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2001 +* Fix(test): delta_x tests fail by wrong expected Delta for video embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2010 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.15...v9.5.16 + +## 9.5.15 + +* Update delta_from_html to fix nested lists issues and more by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2000 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.14...v9.5.15 + +## 9.5.14 + +* docs(readme): update 'Conversion to HTML' section to include more details by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1996 +* Update flutter_quill_delta_from_html on pubspec.yaml to fix current issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1999 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.13...v9.5.14 + +## 9.5.13 + +* Added new default ConverterOptions configurations by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1990 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.12...v9.5.13 + +## 9.5.12 + +* fix: Fixed passing textStyle to formula embed by @shubham030 in https://github.com/singerdmx/flutter-quill/pull/1989 + +## New Contributors +* @shubham030 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1989 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.11...v9.5.12 + +## 9.5.11 + +* Update flutter_quill_delta_from_html in pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1988 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.10...v9.5.11 + +## 9.5.10 + +* chore: remove dependency html converter by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1987 +* Fix: LineHeight button to use MenuAnchor by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1986 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.9...v9.5.10 + +## 9.5.9 + +* Update pubspec.yaml to remove html2md by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1985 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.8...v9.5.9 + +## 9.5.8 + +* fix(typo): fix typo ClipboardServiceProvider.instacne by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1983 +* Feat: New way to get Delta from HTML inputs by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1984 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.7...v9.5.8 + +## 9.5.7 + +* refactor: context menu function, add test code by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1979 +* Fix: PreserveInlineStylesRule by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1980 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.6...v9.5.7 + +## 9.5.6 + +* fix: common link is detected as a video link by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1978 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.5...v9.5.6 + +## 9.5.5 + +* fix: context menu behavior in mouse, desktop env by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1976 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.4...v9.5.5 + +## 9.5.4 + +* Feat: Line height support by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1972 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.3...v9.5.4 + +## 9.5.3 + +* Perf: Performance optimization by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1964 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.2...v9.5.3 + +## 9.5.2 + +* Fix style settings by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1962 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.1...v9.5.2 + +## 9.5.1 + +* feat(extensions): Youtube Video Player Support Mode by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1916 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.0...v9.5.1 + +## 9.5.0 + +* Partial support for table embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1960 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.9...v9.5.0 + +## 9.4.9 + +* Upgrade photo_view to 0.15.0 for flutter_quill_extensions by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1958 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.8...v9.4.9 + +## 9.4.8 + +* Add support for html underline and videos by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1955 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.7...v9.4.8 + +## 9.4.7 + +* fixed #1953 italic detection error by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1954 + +## New Contributors +* @CatHood0 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1954 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.6...v9.4.7 + +## 9.4.6 + +* fix: search dialog throw an exception due to missing FlutterQuillLocalizations.delegate in the editor by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1938 +* fix(editor): implement editor shortcut action for home and end keys to fix exception about unimplemented ScrollToDocumentBoundaryIntent by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1937 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.5...v9.4.6 + +## 9.4.5 + +* fix: color picker hex unfocus on web by @geronimol in https://github.com/singerdmx/flutter-quill/pull/1934 + +## New Contributors +* @geronimol made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1934 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.4...v9.4.5 + +## 9.4.4 + +* fix: Enabled link regex to be overridden by @JoepHeijnen in https://github.com/singerdmx/flutter-quill/pull/1931 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.3...v9.4.4 + +## 9.4.3 + +* Fix: setState() called after dispose(): QuillToolbarClipboardButtonState #1895 by @windows7lake in https://github.com/singerdmx/flutter-quill/pull/1926 + +## New Contributors +* @windows7lake made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1926 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.2...v9.4.3 + +## 9.4.2 + +* Respect autofocus, closes #1923 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/1924 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.1...v9.4.2 + +## 9.4.1 + +* replace base64 regex string by @salba360496 in https://github.com/singerdmx/flutter-quill/pull/1919 + +## New Contributors +* @salba360496 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1919 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.0...v9.4.1 + +## 9.4.0 + +This release can be used without changing anything, although it can break the behavior a little, we provided a way to use the old behavior in `9.3.x` + +- Thanks to @Alspb, the search bar/dialog has been reworked for improved UI that fits **Material 3** look and feel, the search happens on the fly, and other minor changes, if you want the old search bar, you can restore it with one line if you're using `QuillSimpleToolbar`: + ```dart + QuillToolbar.simple( + configurations: QuillSimpleToolbarConfigurations( + searchButtonType: SearchButtonType.legacy, + ), + ) + ``` + While the changes are mostly to the `QuillToolbarSearchDialog` and it seems this should be `searchDialogType`, we provided the old button with the old dialog in case we update the button in the future. + + If you're using `QuillToolbarSearchButton` in a custom Toolbar, you don't need anything to get the new button. if you want the old button, use the `QuillToolbarLegacySearchButton` widget + + Consider using the improved button with the improved dialog as the legacy button might removed in future releases (for now, it's not deprecated) + +
+ Before + + ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/9b40ad03-717f-4518-95f1-8d9cad773b2b) + + +
+ +
+ Improved + + ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/e581733d-63fa-4984-9c41-4a325a0a0c04) + +
+ + For the detailed changes, see #1904 + +- Korean translations by @leegh519 in https://github.com/singerdmx/flutter-quill/pull/1911 + +- The usage of `super_clipboard` plugin in `flutter_quill` has been moved to the `flutter_quill_extensions` package, this will restore the old behavior in `8.x.x` though it will break the `onImagePaste`, `onGifPaste` and rich text pasting from HTML or Markdown, most of those features are available in `super_clipboard` plugin except `onImagePaste` which was available as we were using [pasteboard](https://pub.dev/packages/pasteboard), Unfortunately, it's no longer supported on recent versions of Flutter, and some functionalities such as an image from Clipboard and Html paste are not supported on some platforms such as Android, your project will continue to work, calls of `onImagePaste` and `onGifPaste` will be ignored unless you include [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) package in your project and call: + + ```dart + FlutterQuillExtensions.useSuperClipboardPlugin(); + ``` + Before using any `flutter_quill` widgets, this will restore the old behavior in `9.x.x` + + We initially wanted to publish `flutter_quill_super_clipboard` to allow: + - Using `super_clipboard` without `flutter_quill_extensions` packages and plugins + - Using `flutter_quill_extensions` with optional `super_clipboard` + + To simplify the usage, we moved it to `flutter_quill_extensions`, let us know if you want any of the use cases above. + + Overall `super_clipboard` is a Comprehensive clipboard plugin with a lot of features, the only thing that developers didn't want is Rust installation even though it's automated. + + The main goal of `ClipboardService` is to make `super_clipboard` optional, you can use your own implementation, and create a class that implements `ClipboardService`, which you can get by: + ```dart + // ignore: implementation_imports + import 'package:flutter_quill/src/services/clipboard/clipboard_service.dart'; + ``` + + Then you can call: + ```dart + // ignore: implementation_imports +import 'package:flutter_quill/src/services/clipboard/clipboard_service_provider.dart'; + ClipboardServiceProvider.setInstance(YourClipboardService()); +``` + + The interface could change at any time and will be updated internally for `flutter_quill` and `flutter_quill_extensions`, we didn't export those two classes by default to avoid breaking changes in case you use them as we might change them in the future. + + If you use the above imports, you might get **breaking changes** in **non-breaking change releases**. + +- Subscript and Superscript should now work for all languages and characters + + The previous implementation required the Apple 'SF-Pro-Display-Regular.otf' font which is only licensed/permitted for use on Apple devices. +We have removed the Apple font from the example + +- Allow pasting Markdown and HTML file content from the system to the editor + + Before `9.4.x` if you try to copy an HTML or Markdown file, and paste it into the editor, you will get the file name in the editor + Copying an HTML file, or HTML content from apps and websites is different than copying plain text. + + This is why this change requires `super_clipboard` implementation as this is platform-dependent: + ```dart + FlutterQuillExtensions.useSuperClipboardPlugin(); + ``` + as mentioned above. + + The following example for copying a Markdown file: + +
+ Markdown File Content + + ```md + + **Note**: This package supports converting from HTML back to Quill delta but it's experimental and used internally when pasting HTML content from the clipboard to the Quill Editor + + You have two options: + + 1. Using [quill_html_converter](./quill_html_converter/) to convert to HTML, the package can convert the Quill delta to HTML well + (it uses [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html)), it is just a handy extension to do it more quickly + 1. Another option is to use + [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html) to convert your document + to HTML. + This package has full support for all Quill operations—including images, videos, formulas, + tables, and mentions. + Conversion can be performed in vanilla Dart (i.e., server-side or CLI) or in Flutter. + It is a complete Dart part of the popular and mature [quill-delta-to-html](https://www.npmjs.com/package/quill-delta-to-html) + Typescript/Javascript package. + this package doesn't convert the HTML back to Quill Delta as far as we know + + ``` + +
+ +
+ Before + + ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/03f5ae20-796c-4e8b-8668-09a994211c1e) + +
+ +
+ After + + ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/7e3a1987-36e7-4665-944a-add87d24e788) + +
+ + Markdown, and HTML converting from and to Delta are **currently far from perfect**, the current implementation could improved a lot + however **it will likely not work like expected**, due to differences between HTML and Delta, see this [comment](https://github.com/slab/quill/issues/1551#issuecomment-311458570) for more info. + + ![Copying Markdown file into Flutter Quill Editor](https://github.com/singerdmx/flutter-quill/assets/73608287/63bd6ba6-cc49-4335-84dc-91a0fa5c95a9) + + For more details see #1915 + + Using or converting to HTML or Markdown is highly experimental and shouldn't be used for production applications. + + We use it internally as it is more suitable for our specific use case., copying content from external websites and pasting it into the editor + previously breaks the styles, while the current implementation is not ready, it provides a better user experience and doesn't have many downsides. + + Feel free to report any bugs or feature requests at [Issues](https://github.com/singerdmx/flutter-quill/issues) or drop any suggestions and questions at [Discussions](https://github.com/singerdmx/flutter-quill/discussions) + +## New Contributors +* @leegh519 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1911 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.21...v9.4.0 + +## 9.3.21 + +* fix: assertion failure for swipe typing and undo on Android by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1898 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.20...v9.3.21 + +## 9.3.20 + +* Fix: Issue 1887 by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1892 +* fix: toolbar style change will be invalid when inputting more than 2 characters at a time by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1890 + +## New Contributors +* @crasowas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1890 + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.19...v9.3.20 + +## 9.3.19 + +* Fix reported issues by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1886 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.18...v9.3.19 + +## 9.3.18 + +* Fix: Undo/redo cursor position fixed by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1885 + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.17...v9.3.18 + +## 9.3.17 + +* Update super_clipboard plugin to 0.8.15 to address [#1882](https://github.com/singerdmx/flutter-quill/issues/1882) + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.16...v9.3.17 + +## 9.3.16 + +* Update `lint` dev package to 4.0.0 +* Require at least version 0.8.13 of the plugin + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.15...v9.3.16 + +## 9.3.15 + + +* Ci/automate updating the files by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1879 +* Updating outdated README.md and adding a few guidelines for CONTRIBUTING.md + + +**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.14...v9.3.15 + +## 9.3.14 + +* Chore/use original color picker package in [#1877](https://github.com/singerdmx/flutter-quill/pull/1877) + +## 9.3.13 + +* fix: `readOnlyMouseCursor` losing in construction function +* Fix block multi-line selection style + +## 9.3.12 + +* Add `readOnlyMouseCursor` to config mouse cursor type + +## 9.3.11 + +* Fix typo in QuillHtmlConverter +* Fix re-create checkbox + +## 9.3.10 + +* Support clipboard actions from the toolbar + +## 9.3.9 + +* fix: MD Parsing for multi space +* fix: FontFamily and FontSize toolbars track the text selected in the editor +* feat: Add checkBoxReadOnly property which can override readOnly for checkbox + +## 9.3.8 + +* fix: removed misleading parameters +* fix: added missed translations for ru, es, de +* added translations for Nepali Locale('ne', 'NP') + +## 9.3.7 + +* Fix for keyboard jumping when switching focus from a TextField +* Toolbar button styling to reflect cursor position when running on desktops with keyboard to move care + +## 9.3.6 + +* Add SK and update CS locales [#1796](https://github.com/singerdmx/flutter-quill/pull/1796) +* Fixes: + * QuillIconTheme changes for FontFamily and FontSize buttons are not applied [#1797](https://github.com/singerdmx/flutter-quill/pull/1796) + * Make the arrow_drop_down icons in the QuillToolbar the same size for all MenuAnchor buttons [#1799](https://github.com/singerdmx/flutter-quill/pull/1796) + +## 9.3.5 + +* Update the minimum version for the packages to support `device_info_plus` version 10.0.0 [#1783](https://github.com/singerdmx/flutter-quill/issues/1783) +* Update the minimum version for `youtube_player_flutter` to new major version 9.0.0 in the `flutter_quill_extensions` + +## 9.3.4 + +* fix: multiline styling stuck/not working properly [#1782](https://github.com/singerdmx/flutter-quill/pull/1782) + +## 9.3.3 + +* Update `quill_html_converter` versions + +## 9.3.2 + +* Fix dispose of text painter [#1774](https://github.com/singerdmx/flutter-quill/pull/1774) + +## 9.3.1 + +* Require Flutter 3.19.0 as minimum version + +## 9.3.0 + +* **Breaking change**: `Document.fromHtml(html)` is now returns `Document` instead of `Delta`, use `DeltaX.fromHtml` to return `Delta` +* Update old deprecated api from Flutter 3.19 +* Scribble scroll fix by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/1745 + +## 9.2.14 + +* feat: move cursor after inserting video/image +* Apple pencil + +## 9.2.13 + +* Fix crash with inserting text from contextMenuButtonItems +* Fix incorrect behaviour of context menu +* fix: selection handles behaviour and unnessesary style assert +* Update quill_fr.arb + +## 9.2.12 + +* Fix safari clipboard bug +* Add the option to disable clipboard functionality + +## 9.2.11 + +* Fix a bug where it has problems with pasting text into the editor when the clipboard has styled text + +## 9.2.10 + +* Update example screenshots +* Refactor `Container` to `QuillContainer` with backward compatibility +* A workaround fix in history feature + +## 9.2.9 + +* Refactor the type of `Delta().toJson()` to be more clear type + +## 9.2.8 + +* feat: Export Container node as QuillContainer +* fix web cursor position / height (don't use iOS logic) +* Added Swedish translation + +## 9.2.6 + +* [fix selection.affinity always downstream after updateEditingValue](https://github.com/singerdmx/flutter-quill/pull/1682) +* Bumb version of `super_clipboard` + +## 9.2.5 + +* Bumb version of `super_clipboard` + +## 9.2.4 + +* Use fixed version of intl + +## 9.2.3 + +* remove unncessary column in Flutter quill video embed block + +## 9.2.2 + +* Fix bug [#1627](https://github.com/singerdmx/flutter-quill/issues/1627) + +## 9.2.1 + +* Fix [bug](https://github.com/singerdmx/flutter-quill/issues/1119#issuecomment-1872605246) with font size button +* Added ro RO translations +* 📖 Update zh, zh_CN translations + +## 9.2.0 + +* Require minimum version `6.0.0` of `flutter_keyboard_visibility` to fix some build issues with Android Gradle Plugin 8.2.0 +* Add on image clicked in `flutter_quill_extensions` callback +* Deprecate `globalIconSize` and `globalIconButtonFactor`, use `iconSize` and `iconButtonFactor` instead +* Fix the `QuillToolbarSelectAlignmentButtons` + +## 9.1.1 + +* Require `super_clipboard` minimum version `0.8.1` to fix some bug with Linux build failure + +## 9.1.1-dev + +* Fix bug [#1636](https://github.com/singerdmx/flutter-quill/issues/1636) +* Fix a where you paste styled content (HTML) it always insert a new line at first even if the document is empty +* Fix the font size button and migrate to `MenuAnchor` +* The `defaultDisplayText` is no longer required in the font size and header dropdown buttons +* Add pdf converter in a new package (`quill_pdf_converter`) + +## 9.1.0 + +* Fix the simple toolbar by add properties of `IconButton` and fix some buttons + +## 9.1.0-dev.2 + +* Fix the history buttons + +## 9.1.0-dev.1 + +* Bug fixes in the simple toolbar buttons + +## 9.1.0-dev + +* **Breaking Change**: in the `QuillSimpleToolbar` Fix the `QuillIconTheme` by replacing all the properties with two properties of type `ButtonStyle`, use `IconButton.styleFrom()` + +## 9.0.6 + +* Fix bug in QuillToolbarSelectAlignmentButtons + +## 9.0.5 + +* You can now use most of the buttons without internal provider + +## 9.0.4 + +* Feature: [#1611](https://github.com/singerdmx/flutter-quill/issues/1611) +* Export missing widgets + +## 9.0.3 + +* Flutter Quill Extensions: + * Fix file image support for web image emebed builder + +## 9.0.2 + +* Remove unused properties in the `QuillToolbarSelectHeaderStyleDropdownButton` +* Fix the `QuillSimpleToolbar` when `useMaterial3` is false, please upgrade to the latest version of flutter for better support + +## 9.0.2-dev.3 + +* Export `QuillSingleChildScrollView` + +## 9.0.2-dev.2 + +* Add the new translations for ru, uk arb files by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) +* Add a new dropdown button by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) +* Update the default style values by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) +* Fix bug [#1562](https://github.com/singerdmx/flutter-quill/issues/1562) +* Fix the second bug of [#1480](https://github.com/singerdmx/flutter-quill/issues/1480) + +## 9.0.2-dev.1 + +* Add configurations for the new dropdown `QuillToolbarSelectHeaderStyleButton`, you can use the orignal one or this +* Fix the [issue](https://github.com/singerdmx/flutter-quill/issues/1119) when enter is pressed, all font settings is lost + +## 9.0.2-dev + +* **Breaking change** Remove the spacer widget, removed the controller option for each button +* Add `toolbarRunSpacing` property to the simple toolbar + +## 9.0.1 + +* Fix default icon size + +## 9.0.0 + +* This version is quite stable but it's not how we wanted to be, because the lack of time and there are not too many maintainers active, we decided to publish it, we might make a new breaking changes verion + +## 9.0.1-dev.1 + +* Flutter Quill Extensions: + * Update `QuillImageUtilities` and fixining some bugs + +## 9.0.1-dev + +* Test new GitHub workflows + +## 9.0.0-dev-10 + +* Fix a bug of the improved pasting HTML contents contents into the editor + +## 9.0.0-dev-9 + +* Improves the new logic of pasting HTML contents into the Editor +* Update `README.md` and the doc +* Dispose the `QuillToolbarSelectHeaderStyleButton` state listener in `dispose` +* Upgrade the font family button to material 3 +* Rework the font family and font size functionalities to change the font once and type all over the editor + +## 9.0.0-dev-8 + +* Better support for pasting HTML contents from external websites to the editor +* The experimental support of converting the HTML from `quill_html_converter` is now built-in in the `flutter_quill` and removed from there (Breaking change for `quill_html_converter`) + +## 9.0.0-dev-7 + +* Fix a bug in chaning the background/font color of ol/ul list +* Flutter Quill Extensions: + * Fix link bug in the video url + * Fix patterns + +## 9.0.0-dev-6 + +* Move the `child` from `QuillToolbarConfigurations` into `QuillToolbar` directly +* Bug fixes +* Add the ability to change the background and font color of the ol/ul elements dots and numbers +* Flutter Quill Extensions: + * **Breaking Change**: The `imageProviderBuilder`is now providing the context and image url + +## 9.0.0-dev-5 + +* The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard +* Flutter Quill Extensions: + * Improve the camera button + +## 9.0.0-dev-4 + +* The options parameter in all of the buttons is no longer required which can be useful to create custom toolbar with minimal efforts +* Toolbar buttons fixes in both `flutter_quill` and `flutter_quill_extensions` +* The `QuillProvider` has been dropped and no longer used, the providers will be used only internally from now on and we will not using them as much as possible + +## 9.0.0-dev-3 + +* Breaking Changes: + * Rename `QuillToolbar` to `QuillSimpleToolbar` + * Rename `QuillBaseToolbar` to `QuillToolbar` + * Replace `pasteboard` with `rich_cliboard` +* Fix a bug in the example when inserting an image from url +* Flutter Quill Extensions: + * Add support for copying the image to the system cliboard + +## 9.0.0-dev-2 + +* An attemp to fix CI automated publishing + +## 9.0.0-dev-1 + +* An attemp to fix CI automated publishing + +## 9.0.0-dev + +* **Major Breaking change**: The `QuillProvider` is now optional, the `controller` parameter has been moved to the `QuillEditor` and `QuillToolbar` once again. +* Flutter Quill Extensions; + * **Breaking Change**: Completly change the way how the source code structured to more basic and simple way, organize folders and file names, if you use the library +from `flutter_quill_extensions.dart` then there is nothing you need to do, but if you are using any other import then you need to re-imports +embed, this won't affect how quill js work + * Improvemenets to the image embed + * Add support for `margin` for web + * Add untranslated strings to the `quill_en.arb` + +## 8.6.4 + +* The default value of `keyboardAppearance` for the iOS will be the one from the App/System theme mode instead of always using the `Brightness.light` +* Fix typos in `README.md` + +## 8.6.3 + +* Update the minimum flutter version to `3.16.0` + +## 8.6.2 + +* Restore use of alternative QuillToolbarLinkStyleButton2 widget + +## 8.6.1 + +* Temporary revert style bug fix + +## 8.6.0 + +* **Breaking Change** Support [Flutter 3.16](https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1), please upgrade to the latest stable version of flutter to use this update +* **Breaking Change**: Remove Deprecated Fields +* **Breaking Change**: Extract the shared things between `QuillToolbarConfigurations` and `QuillBaseToolbarConfigurations` +* **Breaking Change**: You no longer need to use `QuillToolbarProvider` when using custom toolbar buttons, the example has been updated +* Bug fixes + +## 8.5.5 + +* Now when opening dialogs by `QuillToolbar` you will not get an exception when you don't use `FlutterQuillLocalizations.delegate` in your `WidgetsApp`, `MaterialApp`, or `CupertinoApp`. The fix is for the `QuillToolbarSearchButton`, `QuillToolbarLinkStyleButton`, and `QuillToolbarColorButton` buttons + +## 8.5.4 + +* The `mobileWidth`, `mobileHeight`, `mobileMargin`, and `mobileAlignment` is now deprecated in `flutter_quill`, they are now defined in `flutter_quill_extensions` +* Deprecate `replaceStyleStringWithSize` function which is in `string.dart` +* Deprecate `alignment`, and `margin` as they don't conform to official Quill JS + +## 8.5.3 + +* Update doc +* Update `README.md` and `CHANGELOG.md` +* Fix typos +* Use `immutable` when possible +* Update `.pubignore` + +## 8.5.2 + +* Updated `README.md`. +* Feature: Added the ability to include a custom callback when the `QuillToolbarColorButton` is pressed. +* The `QuillToolbar` now implements `PreferredSizeWidget`, enabling usage in the AppBar, similar to `QuillBaseToolbar`. + +## 8.5.1 + +* Updated `README.md`. + +## 8.5.0 + +* Migrated to `flutter_localizations` for translations. +* Fixed: Translated all previously untranslated localizations. +* Fixed: Added translations for missing items. +* Fixed: Introduced default Chinese fallback translation. +* Removed: Unused parameters `items` in `QuillToolbarFontFamilyButtonOptions` and `QuillToolbarFontSizeButtonOptions`. +* Updated: Documentation. + +## 8.4.4 + +* Updated `.pubignore` to ignore unnecessary files and folders. + +## 8.4.3 + +* Updated `CHANGELOG.md`. + +## 8.4.2 + +* **Breaking change**: Configuration for `QuillRawEditor` has been moved to a separate class. Additionally, `readOnly` has been renamed to `isReadOnly`. If using `QuillEditor`, no action is required. +* Introduced the ability for developers to override `TextInputAction` in both `QuillRawEditor` and `QuillEditor`. +* Enabled using `QuillRawEditor` without `QuillEditorProvider`. +* Bug fixes. +* Added image cropping implementation in the example. + +## 8.4.1 + +* Added `copyWith` in `OptionalSize` class. + +## 8.4.0 + +* **Breaking change**: Updated `QuillCustomButton` to use `QuillCustomButtonOptions`. Moved all properties from `QuillCustomButton` to `QuillCustomButtonOptions`, replacing `iconData` with `icon` widget for increased customization. +* **Breaking change**: `customButtons` in `QuillToolbarConfigurations` is now of type `List`. +* Bug fixes following the `8.0.0` update. +* Updated `README.md`. +* Improved platform checking. + +## 8.3.0 + +* Added `iconButtonFactor` property to `QuillToolbarBaseButtonOptions` for customizing button size relative to its icon size (defaults to `kIconButtonFactor`, consistent with previous releases). + +## 8.2.6 + +* Organized `QuillRawEditor` code. + +## 8.2.5 + +* Added `builder` property in `QuillEditorConfigurations`. + +## 8.2.4 + +* Adhered to Flutter best practices. +* Fixed auto-focus bug. + +## 8.2.3 + +* Updated `README.md`. + +## 8.2.2 + +* Moved `flutter_quill_test` to a separate package: [flutter_quill_test](https://pub.dev/packages/flutter_quill_test). + +## 8.2.1 + +* Updated `README.md`. + +## 8.2.0 + +* Added the option to add configurations for `flutter_quill_extensions` using `extraConfigurations`. + +## 8.1.11 + +* Followed Dart best practices by using `lints` and removed `pedantic` and `platform` since they are not used. +* Fixed text direction bug. +* Updated `README.md`. + +## 8.1.10 + +* Secret for automated publishing to pub.dev. + +## 8.1.9 + +* Fixed automated publishing to pub.dev. + +## 8.1.8 + +* Fixed automated publishing to pub.dev. + +## 8.1.7 + +* Automated publishing to pub.dev. + +## 8.1.6 + +* Fixed compatibility with `integration_test` by downgrading the minimum version of the platform package to 3.1.0. + +## 8.1.5 + +* Reversed background/font color toolbar button icons. + +## 8.1.4 + +* Reversed background/font color toolbar button tooltips. + +## 8.1.3 + +* Moved images to screenshots instead of `README.md`. + +## 8.1.2 + +* Fixed a bug related to the regexp of the insert link dialog. +* Required Dart 3 as the minimum version. +* Code cleanup. +* Added a spacer widget between each button in the `QuillToolbar`. + +## 8.1.1 + +* Fixed null error in line.dart #1487(https://github.com/singerdmx/flutter*quill/issues/1487). + +## 8.1.0 + +* Fixed a word typo of `mirgration` to `migration` in the readme & migration document. +* Updated migration guide. +* Removed property `enableUnfocusOnTapOutside` in `QuillEditor` configurations and added `isOnTapOutsideEnabled` instead. +* Added a new callback called `onTapOutside` in the `QuillEditorConfigurations` to perform actions when tapping outside the editor. +* Fixed a bug that caused the web platform to not unfocus the editor when tapping outside of it. To override this, please pass a value to the `onTapOutside` callback. +* Removed the old property of `iconTheme`. Instead, pass `iconTheme` in the button options; you will find the `base` property inside it with `iconTheme`. + +## 8.0.0 + +* If you have migrated recently, don't be alarmed by this update; it adds documentation, a migration guide, and marks the version as a more stable release. Although there are breaking changes (as reported by some developers), the major version was not changed due to time constraints during development. A single property was also renamed from `code` to `codeBlock` in the `elements` of the new `QuillEditorConfigurations` class. +* Updated the README for better readability. + +## 7.10.2 + +* Removed line numbers from code blocks by default. You can still enable this feature thanks to the new configurations in the `QuillEditor`. Find the `elementOptions` property and enable `enableLineNumbers`. + +## 7.10.1 + +* Fixed issues and utilized the new parameters. +* No longer need to use `MaterialApp` for most toolbar button child builders. +* Compatibility with [fresh_quill_extensions](https://pub.dev/packages/fresh_quill_extensions), a temporary alternative to [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions). +* Updated most of the documentation in `README.md`. + +## 7.10.0 + +* **Breaking change**: `QuillToolbar.basic()` can be accessed directly from `QuillToolbar()`, and the old `QuillToolbar` can be accessed from `QuillBaseToolbar`. +* Refactored Quill editor and toolbar configurations into a single class each. +* After changing checkbox list values, the controller will not request keyboard focus by default. +* Moved toolbar and editor configurations directly into the widget but still use inherited widgets internally. +* Fixes to some code after the refactoring. + +## 7.9.0 + +* Buttons Improvemenets +* Refactor all the button configurations that used in `QuillToolbar.basic()` but there are still few lefts +* **Breaking change**: Remove some configurations from the QuillToolbar and move them to the new `QuillProvider`, please notice this is a development version and this might be changed in the next few days, the stable release will be ready in less than 3 weeks +* Update `flutter_quill_extensions` and it will be published into pub.dev soon. +* Allow you to customize the search dialog by custom callback with child builder + +## 7.8.0 + +* **Important note**: this is not test release yet, it works but need more test and changes and breaking changes, we don't have development version and it will help us if you try the latest version and report the issues in Github but if you want a stable version please use `7.4.16`. this refactoring process will not take long and should be done less than three weeks with the testing. +* We managed to refactor most of the buttons configurations and customizations in the `QuillProvider`, only three lefts then will start on refactoring the toolbar configurations +* Code improvemenets + +## 7.7.0 + +* **Breaking change**: We have mirgrated more buttons in the toolbar configurations, you can do change them in the `QuillProvider` +* Important bug fixes + +## 7.6.1 + +* Bug fixes + +## 7.6.0 + +* **Breaking change**: To customize the buttons in the toolbar, you can do that in the `QuillProvider` + +## 7.5.0 + +* **Breaking change**: The widgets `QuillEditor` and `QuillToolbar` are no longer have controller parameter, instead you need to make sure in the widget tree you have wrapped them with `QuillProvider` widget and provide the controller and the require configurations + +## 7.4.16 + +* Update documentation and README.md + +## 7.4.15 + +* Custom style attrbuites for platforms other than mobile (alignment, margin, width, height) +* Bug fixes and other improvemenets + +## 7.4.14 + +* Improve performance by reducing the number of widgets rebuilt by listening to media query for only the needed things, for example instead of using `MediaQuery.of(context).size`, now we are using `MediaQuery.sizeOf(context)` +* Add MediaButton for picking the images only since the video one is not ready +* A new feature which allows customizing the text selection in quill editor which is useful for custom theme design system for custom app widget + +## 7.4.13 + +* Fixed tab editing when in readOnly mode. + +## 7.4.12 + +* Update the minimum version of device_info_plus to 9.1.0. + +## 7.4.11 + +* Add sw locale. + +## 7.4.10 + +* Update translations. + +## 7.4.9 + +* Style recognition fixes. + +## 7.4.8 + +* Upgrade dependencies. + +## 7.4.7 + +* Add Vietnamese and German translations. + +## 7.4.6 + +* Fix more null errors in Leaf.retain [##1394](https://github.com/singerdmx/flutter-quill/issues/1394) and Line.delete [##1395](https://github.com/singerdmx/flutter-quill/issues/1395). + +## 7.4.5 + +* Fix null error in Container.insert [##1392](https://github.com/singerdmx/flutter-quill/issues/1392). + +## 7.4.4 + +* Fix extra padding on checklists [##1131](https://github.com/singerdmx/flutter-quill/issues/1131). + +## 7.4.3 + +* Fixed a space input error on iPad. + +## 7.4.2 + +* Fix bug with keepStyleOnNewLine for link. + +## 7.4.1 + +* Fix toolbar dividers condition. + +## 7.4.0 + +* Support Flutter version 3.13.0. + +## 7.3.3 + +* Updated Dependencies conflicting. + +## 7.3.2 + +* Added builder for custom button in _LinkDialog. + +## 7.3.1 + +* Added case sensitive and whole word search parameters. +* Added wrap around. +* Moved search dialog to the bottom in order not to override the editor and the text found. +* Other minor search dialog enhancements. + +## 7.3.0 + +* Add default attributes to basic factory. + +## 7.2.19 + +* Feat/link regexp. + +## 7.2.18 + +* Fix paste block text in words apply same style. + +## 7.2.17 + +* Fix paste text mess up style. +* Add support copy/cut block text. + +## 7.2.16 + +* Allow for custom context menu. + +## 7.2.15 + +* Add flutter_quill.delta library which only exposes Delta datatype. + +## 7.2.14 + +* Fix errors when the editor is used in the `screenshot` package. + +## 7.2.13 + +* Fix around image can't delete line break. + +## 7.2.12 + +* Add support for copy/cut select image and text together. + +## 7.2.11 + +* Add affinity for localPosition. + +## 7.2.10 + +* LINE._getPlainText queryChild inclusive=false. + +## 7.2.9 + +* Add toPlainText method to `EmbedBuilder`. + +## 7.2.8 + +* Add custom button widget in toolbar. + +## 7.2.7 + +* Fix language code of Japan. + +## 7.2.6 + +* Style custom toolbar buttons like builtins. + +## 7.2.5 + +* Always use text cursor for editor on desktop. + +## 7.2.4 + +* Fixed keepStyleOnNewLine. + +## 7.2.3 + +* Get pixel ratio from view. + +## 7.2.2 + +* Prevent operations on stale editor state. + +## 7.2.1 + +* Add support for android keyboard content insertion. +* Enhance color picker, enter hex color and color palette option. + +## 7.2.0 + +* Checkboxes, bullet points, and number points are now scaled based on the default paragraph font size. + +## 7.1.20 + +* Pass linestyle to embedded block. + +## 7.1.19 + +* Fix Rtl leading alignment problem. + +## 7.1.18 + +* Support flutter latest version. + +## 7.1.17+1 + +* Updates `device_info_plus` to version 9.0.0 to benefit from AGP 8 (see [changelog##900](https://pub.dev/packages/device_info_plus/changelog##900)). + +## 7.1.16 + +* Fixed subscript key from 'sup' to 'sub'. + +## 7.1.15 + +* Fixed a bug introduced in 7.1.7 where each section in `QuillToolbar` was displayed on its own line. + +## 7.1.14 + +* Add indents change for multiline selection. + +## 7.1.13 + +* Add custom recognizer. + +## 7.1.12 + +* Add superscript and subscript styles. + +## 7.1.11 + +* Add inserting indents for lines of list if text is selected. + +## 7.1.10 + +* Image embedding tweaks + * Add MediaButton which is intened to superseed the ImageButton and VideoButton. Only image selection is working. + * Implement image insert for web (image as base64) + +## 7.1.9 + +* Editor tweaks PR from bambinoua(https://github.com/bambinoua). + * Shortcuts now working in Mac OS + * QuillDialogTheme is extended with new properties buttonStyle, linkDialogConstraints, imageDialogConstraints, isWrappable, runSpacing, + * Added LinkStyleButton2 with new LinkStyleDialog (similar to Quill implementation + * Conditinally use Row or Wrap for dialog's children. + * Update minimum Dart SDK version to 2.17.0 to use enum extensions. + * Use merging shortcuts and actions correclty (if the key combination is the same) + +## 7.1.8 + +* Dropdown tweaks + * Add itemHeight, itemPadding, defaultItemColor for customization of dropdown items. + * Remove alignment property as useless. + * Fix bugs with max width when width property is null. + +## 7.1.7 + +* Toolbar tweaks. + * Implement tooltips for embed CameraButton, VideoButton, FormulaButton, ImageButton. + * Extends customization for SelectAlignmentButton, QuillFontFamilyButton, QuillFontSizeButton adding padding, text style, alignment, width. + * Add renderFontFamilies to QuillFontFamilyButton to show font faces in dropdown. + * Add AxisDivider and its named constructors for for use in parent project. + * Export ToolbarButtons enum to allow specify tooltips for SelectAlignmentButton. + * Export QuillFontFamilyButton, SearchButton as they were not exported before. + * Deprecate items property in QuillFontFamilyButton, QuillFontSizeButton as the it can be built usinr rawItemsMap. + * Make onSelection QuillFontFamilyButton, QuillFontSizeButton omittable as no need to execute callback outside if controller is passed to widget. + +Now the package is more friendly for web projects. + +## 7.1.6 + +* Add enableUnfocusOnTapOutside field to RawEditor and Editor widgets. + +## 7.1.5 + +* Add tooltips for toolbar buttons. + +## 7.1.4 + +* Fix inserting tab character in lists. + +## 7.1.3 + +* Fix ios cursor bug when word.length==1. + +## 7.1.2 + +* Fix non scrollable editor exception, when tapped under content. + +## 7.1.1 + +* customLinkPrefixes parameter * makes possible to open links with custom protoco. + +## 7.1.0 + +* Fix ordered list numeration with several lists in document. + +## 7.0.9 + +* Use const constructor for EmbedBuilder. + +## 7.0.8 + +* Fix IME position bug with scroller. + +## 7.0.7 + +* Add TextFieldTapRegion for contextMenu. + +## 7.0.6 + +* Fix line style loss on new line from non string. + +## 7.0.5 + +* Fix IME position bug for Mac and Windows. +* Unfocus when tap outside editor. fix the bug that cant refocus in afterButtonPressed after click ToggleStyleButton on Mac. + +## 7.0.4 + +* Have text selection span full line height for uneven sized text. + +## 7.0.3 + +* Fix ordered list numeration for lists with more than one level of list. + +## 7.0.2 + +* Allow widgets to override widget span properties. + +## 7.0.1 + +* Update i18n_extension dependency to version 8.0.0. + +## 7.0.0 + +* Breaking change: Tuples are no longer used. They have been replaced with a number of data classes. + +## 6.4.4 + +* Increased compatibility with Flutter widget tests. + +## 6.4.3 + +* Update dependencies (collection: 1.17.0, flutter_keyboard_visibility: 5.4.0, quiver: 3.2.1, tuple: 2.0.1, url_launcher: 6.1.9, characters: 1.2.1, i18n_extension: 7.0.0, device_info_plus: 8.1.0) + +## 6.4.2 + +* Replace `buildToolbar` with `contextMenuBuilder`. + +## 6.4.1 + +* Control the detect word boundary behaviour. + +## 6.4.0 + +* Use `axis` to make the toolbar vertical. +* Use `toolbarIconCrossAlignment` to align the toolbar icons on the cross axis. +* Breaking change: `QuillToolbar`'s parameter `toolbarHeight` was renamed to `toolbarSize`. + +## 6.3.5 + +* Ability to add custom shortcuts. + +## 6.3.4 + +* Update clipboard status prior to showing selected text overlay. + +## 6.3.3 + +* Fixed handling of mac intents. + +## 6.3.2 + +* Added `unknownEmbedBuilder` to QuillEditor. +* Fix error style when input chinese japanese or korean. + +## 6.3.1 + +* Add color property to the basic factory function. + +## 6.3.0 + +* Support Flutter 3.7. + +## 6.2.2 + +* Fix: nextLine getter null where no assertion. + +## 6.2.1 + +* Revert "Align numerical and bullet lists along with text content". + +## 6.2.0 + +* Align numerical and bullet lists along with text content. + +## 6.1.12 + +* Apply i18n for default font dropdown option labels corresponding to 'Clear'. + +## 6.1.11 + +* Remove iOS hack for delaying focus calculation. + +## 6.1.10 + +* Delay focus calculation for iOS. + +## 6.1.9 + +* Bump keyboard show up wait to 1 sec. + +## 6.1.8 + +* Recalculate focus when showing keyboard. + +## 6.1.7 + +* Add czech localizations. + +## 6.1.6 + +* Upgrade i18n_extension to 6.0.0. + +## 6.1.5 + +* Fix formatting exception. + +## 6.1.4 + +* Add double quotes validation. + +## 6.1.3 + +* Revert "fix order list numbering (##988)". + +## 6.1.2 + +* Add typing shortcuts. + +## 6.1.1 + +* Fix order list numbering. + +## 6.1.0 + +* Add keyboard shortcuts for editor actions. + +## 6.0.10 + +* Upgrade device info plus to ^7.0.0. + +## 6.0.9 + +* Don't throw showAutocorrectionPromptRect not implemented. The function is called with every keystroke as a user is typing. + +## 6.0.8+1 + +* Fixes null pointer when setting documents. + +## 6.0.8 + +* Make QuillController.document mutable. + +## 6.0.7 + +* Allow disabling of selection toolbar. + +## 6.0.6+1 + +* Revert 6.0.6. + +## 6.0.6 + +* Fix wrong custom embed key. + +## 6.0.5 + +* Fixes toolbar buttons stealing focus from editor. + +## 6.0.4 + +* Bug fix for Type 'Uint8List' not found. + +## 6.0.3 + +* Add ability to paste images. + +## 6.0.2 + +* Address Dart Analysis issues. + +## 6.0.1 + +* Changed translation country code (zh_HK -> zh_hk) to lower case, which is required for i18n_extension used in flutter_quill. +* Add localization in example's main to demonstrate translation. +* Issue Windows selection's copy / paste tool bar not shown ##861: add selection's copy / paste toolbar, escape to hide toolbar, mouse right click to show toolbar, ctrl-Y / ctrl-Z to undo / redo. +* Image and video displayed in Windows platform caused screen flickering while selecting text, a sample_data_nomedia.json asset is added for Desktop to demonstrate the added features. +* Known issue: keyboard action sometimes causes exception mentioned in Flutter's issue ##106475 (Windows Keyboard shortcuts stop working after modifier key repeat flutter/flutter##106475). +* Know issue: user needs to click the editor to get focus before toolbar is able to display. + +## 6.0.0 BREAKING CHANGE + +* Removed embed (image, video & formula) blocks from the package to reduce app size. + +These blocks have been moved to the package `flutter_quill_extensions`, migrate by filling the `embedBuilders` and `embedButtons` parameters as follows: + +``` +import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; + +QuillEditor.basic( + controller: controller, + embedBuilders: FlutterQuillEmbeds.builders(), +); + +QuillToolbar.basic( + controller: controller, + embedButtons: FlutterQuillEmbeds.buttons(), +); +``` + +## 5.4.2 + +* Upgrade i18n_extension. + +## 5.4.1 + +* Update German Translation. + +## 5.4.0 + +* Added Formula Button (for maths support). + +## 5.3.2 + +* Add more font family. + +## 5.3.1 + +* Enable search when text is not empty. + +## 5.3.0 + +* Added search function. + +## 5.2.11 + +* Remove default small color. + +## 5.2.10 + +* Don't wrap the QuillEditor's child in the EditorTextSelectionGestureDetector if selection is disabled. + +## 5.2.9 + +* Added option to modify SelectHeaderStyleButton options. +* Added option to click again on h1, h2, h3 button to go back to normal. + +## 5.2.8 + +* Remove tooltip for LinkStyleButton. +* Make link match regex case insensitive. + +## 5.2.7 + +* Add locale to QuillEditor.basic. + +## 5.2.6 + +* Fix keyboard pops up when resizing the image. + +## 5.2.5 + +* Upgrade youtube_player_flutter_quill to 8.2.2. + +## 5.2.4 + +* Upgrade youtube_player_flutter_quill to 8.2.1. + +## 5.2.3 + +* Flutter Quill Doesn't Work On iOS 16 or Xcode 14 Betas (Stored properties cannot be marked potentially unavailable with '@available'). + +## 5.2.2 + +* Fix Web Unsupported operation: Platform.\_operatingSystem error. + +## 5.2.1 + +* Rename QuillCustomIcon to QuillCustomButton. + +## 5.2.0 + +* Support font family selection. + +## 5.1.1 + +* Update README. + +## 5.1.0 + +* Added CustomBlockEmbed and customElementsEmbedBuilder. + +## 5.0.5 + +* Upgrade device_info_plus to 4.0.0. + +## 5.0.4 + +* Added onVideoInit callback for video documents. + +## 5.0.3 + +* Update dependencies. + +## 5.0.2 + +* Keep cursor position on checkbox tap. + +## 5.0.1 + +* Fix static analysis errors. + +## 5.0.0 + +* Flutter 3.0.0 support. + +## 4.2.3 + +* Ignore color:inherit and convert double to int for level. + +## 4.2.2 + +* Add clear option to font size dropdown. + +## 4.2.1 + +* Refactor font size dropdown. + +## 4.2.0 + +* Ensure selectionOverlay is available for showToolbar. + +## 4.1.9 + +* Using properly iconTheme colors. + +## 4.1.8 + +* Update font size dropdown. + +## 4.1.7 + +* Convert FontSize to a Map to allow for named Font Size. + +## 4.1.6 + +* Update quill_dropdown_button.dart. + +## 4.1.5 + +* Add Font Size dropdown to the toolbar. + +## 4.1.4 + +* New borderRadius for iconTheme. + +## 4.1.3 + +* Fix selection handles show/hide after paste, backspace, copy. + +## 4.1.2 + +* Add full support for hardware keyboards (Chromebook, Android tablets, etc) that don't alter screen UI. + +## 4.1.1 + +* Added textSelectionControls field in QuillEditor. + +## 4.1.0 + +* Added Node to linkActionPickerDelegate. + +## 4.0.12 + +* Add Persian(fa) language. + +## 4.0.11 + +* Fix cut selection error in multi-node line. + +## 4.0.10 + +* Fix vertical caret position bug. + +## 4.0.9 + +* Request keyboard focus when no child is found. + +## 4.0.8 + +* Fix blank lines do not display when **web*renderer=html. + +## 4.0.7 + +* Refactor getPlainText (better handling of blank lines and lines with multiple markups. + +## 4.0.6 + +* Bug fix for copying text with new lines. + +## 4.0.5 + +* Fixed casting null to Tuple2 when link dialog is dismissed without any input (e.g. barrier dismissed). + +## 4.0.4 + +* Bug fix for text direction rtl. + +## 4.0.3 + +* Support text direction rtl. + +## 4.0.2 + +* Clear toggled style on selection change. + +## 4.0.1 + +* Fix copy/cut/paste/selectAll not working. + +## 4.0.0 + +* Upgrade for Flutter 2.10. + +## 3.9.11 + +* Added Indonesian translation. + +## 3.9.10 + +* Fix for undoing a modification ending with an indented line. + +## 3.9.9 + +* iOS: Save image whose filename does not end with image file extension. + +## 3.9.8 + +* Added Urdu translation. + +## 3.9.7 + +* Fix for clicking on the Link button without any text on a new line crashes. + +## 3.9.6 + +* Apply locale to QuillEditor(contents). + +## 3.9.5 + +* Fix image pasting. + +## 3.9.4 + +* Hiding dialog after selecting action for image. + +## 3.9.3 + +* Update ImageResizer for Android. + +## 3.9.2 + +* Copy image with its style. + +## 3.9.1 + +* Support resizing image. + +## 3.9.0 + +* Image menu options for copy/remove. + +## 3.8.8 + +* Update set textEditingValue. + +## 3.8.7 + +* Fix checkbox not toggled correctly in toolbar button. + +## 3.8.6 + +* Fix cursor position changes when checking/unchecking the checkbox. + +## 3.8.5 + +* Fix \_handleDragUpdate in \_TextSelectionHandleOverlayState. + +## 3.8.4 + +* Fix link dialog layout. + +## 3.8.3 + +* Fix for errors on a non scrollable editor. + +## 3.8.2 + +* Fix certain keys not working on web when editor is a child of a scroll view. + +## 3.8.1 + +* Refactor \_QuillEditorState to QuillEditorState. + +## 3.8.0 + +* Support pasting with format. + +## 3.7.3 + +* Fix selection overlay for collapsed selection. + +## 3.7.2 + +* Reverted Embed toPlainText change. + +## 3.7.1 + +* Change Embed toPlainText to be empty string. + +## 3.7.0 + +* Replace Toolbar showHistory group with individual showRedo and showUndo. + +## 3.6.5 + +* Update Link dialogue for image/video. + +## 3.6.4 + +* Link dialogue TextInputType.multiline. + +## 3.6.3 + +* Bug fix for link button text selection. + +## 3.6.2 + +* Improve link button. + +## 3.6.1 + +* Remove SnackBar 'What is entered is not a link'. + +## 3.6.0 + +* Allow link button to enter text. + +## 3.5.3 + +* Change link button behavior. + +## 3.5.2 + +* Bug fix for embed. + +## 3.5.1 + +* Bug fix for platform util. + +## 3.5.0 + +* Removed redundant classes. + +## 3.4.4 + +* Add more translations. + +## 3.4.3 + +* Preset link from attributes. + +## 3.4.2 + +* Fix launch link edit mode. + +## 3.4.1 + +* Placeholder effective in scrollable. + +## 3.4.0 + +* Option to save image in read-only mode. + +## 3.3.1 + +* Pass any specified key in QuillEditor constructor to super. + +## 3.3.0 + +* Fixed Style toggle issue. + +## 3.2.1 + +* Added new translations. + +## 3.2.0 + +* Support multiple links insertion on the go. + +## 3.1.1 + +* Add selection completed callback. + +## 3.1.0 + +* Fixed image ontap functionality. + +## 3.0.4 + +* Add maxContentWidth constraint to editor. + +## 3.0.3 + +* Do not show caret on screen when the editor is not focused. + +## 3.0.2 + +* Fix launch link for read-only mode. + +## 3.0.1 + +* Handle null value of Attribute.link. + +## 3.0.0 + +* Launch link improvements. +* Removed QuillSimpleViewer. + +## 2.5.2 + +* Skip image when pasting. + +## 2.5.1 + +* Bug fix for Desktop `Shift` + `Click` support. + +## 2.5.0 + +* Update checkbox list. + +## 2.4.1 + +* Desktop selection improvements. + +## 2.4.0 + +* Improve inline code style. + +## 2.3.3 + +* Improves selection rects to have consistent height regardless of individual segment text styles. + +## 2.3.2 + +* Allow disabling floating cursor. + +## 2.3.1 + +* Preserve last newline character on delete. + +## 2.3.0 + +* Massive changes to support flutter 2.8. + +## 2.2.2 + +* iOS - floating cursor. + +## 2.2.1 + +* Bug fix for imports supporting flutter 2.8. + +## 2.2.0 + +* Support flutter 2.8. + +## 2.1.1 + +* Add methods of clearing editor and moving cursor. + +## 2.1.0 + +* Add delete handler. + +## 2.0.23 + +* Support custom replaceText handler. + +## 2.0.22 + +* Fix attribute compare and fix font size parsing. + +## 2.0.21 + +* Handle click on embed object. + +## 2.0.20 + +* Improved UX/UI of Image widget. + +## 2.0.19 + +* When uploading a video, applying indicator. + +## 2.0.18 + +* Make toolbar dividers optional. + +## 2.0.17 + +* Allow alignment of the toolbar icons to match WrapAlignment. + +## 2.0.16 + +* Add hide / show alignment buttons. + +## 2.0.15 + +* Implement change cursor to SystemMouseCursors.click when hovering a link styled text. + +## 2.0.14 + +* Enable customize the checkbox widget using DefaultListBlockStyle style. + +## 2.0.13 + +* Improve the scrolling performance by reducing the repaint areas. + +## 2.0.12 + +* Fix the selection effect can't be seen as the textLine with background color. + +## 2.0.11 + +* Fix visibility of text selection handlers on scroll. + +## 2.0.10 + +* cursorConnt.color notify the text_line to repaint if it was disposed. + +## 2.0.9 + +* Improve UX when trying to add a link. + +## 2.0.8 + +* Adding translations to the toolbar. + +## 2.0.7 + +* Added theming options for toolbar icons and LinkDialog. + +## 2.0.6 + +* Avoid runtime error when placed inside TabBarView. + +## 2.0.5 + +* Support inline code formatting. + +## 2.0.4 + +* Enable history shortcuts for desktop. + +## 2.0.3 + +* Fix cursor when line contains image. + +## 2.0.2 + +* Address KeyboardListener class name conflict. + +## 2.0.1 + +* Upgrade flutter_colorpicker to 0.5.0. + +## 2.0.0 + +* Text Alignment functions + Block Format standards. + +## 1.9.6 + +* Support putting QuillEditor inside a Scrollable view. + +## 1.9.5 + +* Skip image when pasting. + +## 1.9.4 + +* Bug fix for cursor position when tapping at the end of line with image(s). + +## 1.9.3 + +* Bug fix when line only contains one image. + +## 1.9.2 + +* Support for building custom inline styles. + +## 1.9.1 + +* Cursor jumps to the most appropriate offset to display selection. + +## 1.9.0 + +* Support inline image. + +## 1.8.3 + +* Updated quill_delta. + +## 1.8.2 + +* Support mobile image alignment. + +## 1.8.1 + +* Support mobile custom size image. + +## 1.8.0 + +* Support entering link for image/video. + +## 1.7.3 + +* Bumps photo_view version. + +## 1.7.2 + +* Fix static analysis error. + +## 1.7.1 + +* Support Youtube video. + +## 1.7.0 + +* Support video. + +## 1.6.4 + +* Bug fix for clear format button. + +## 1.6.3 + +* Fixed dragging right handle scrolling issue. + +## 1.6.2 + +* Fixed the position of the selection status drag handle. + +## 1.6.1 + +* Upgrade image_picker and flutter_colorpicker. + +## 1.6.0 + +* Support Multi Row Toolbar. + +## 1.5.0 + +* Remove file_picker dependency. + +## 1.4.1 + +* Remove filesystem_picker dependency. + +## 1.4.0 + +* Remove path_provider dependency. + +## 1.3.4 + +* Add option to paintCursorAboveText. + +## 1.3.3 + +* Upgrade file_picker version. + +## 1.3.2 + +* Fix copy/paste bug. + +## 1.3.1 + +* New logo. + +## 1.3.0 + +* Support flutter 2.2.0. + +## 1.2.2 + +* Checkbox supports tapping. + +## 1.2.1 + +* Indented position not holding while editing. + +## 1.2.0 + +* Fix image button cancel causes crash. + +## 1.1.8 + +* Fix height of empty line bug. + +## 1.1.7 + +* Fix text selection in read-only mode. + +## 1.1.6 + +* Remove universal_html dependency. + +## 1.1.5 + +* Enable "Select", "Select All" and "Copy" in read-only mode. + +## 1.1.4 + +* Fix text selection issue. + +## 1.1.3 + +* Update example folder. + +## 1.1.2 + +* Add pedantic. + +## 1.1.1 + +* Base64 image support. + +## 1.1.0 + +* Support null safety. + +## 1.0.9 + +* Web support for raw editor and keyboard listener. + +## 1.0.8 + +* Support token attribute. + +## 1.0.7 + +* Fix crash on web (dart:io). + +## 1.0.6 + +* Add desktop support WINDOWS, MACOS and LINUX. + +## 1.0.5 + +* Bug fix: Can not insert newline when Bold is toggled ON. + +## 1.0.4 + +* Upgrade photo_view to ^0.11.0. + +## 1.0.3 + +* Fix issue that text is not displayed while typing WEB. + +## 1.0.2 + +* Update toolbar in sample home page. + +## 1.0.1 + +* Fix static analysis errors. + +## 1.0.0 + +* Support flutter 2.0. + +## 1.0.0-dev.2 + +* Improve link handling for tel, mailto and etc. + +## 1.0.0-dev.1 + +* Upgrade prerelease SDK & Bump for master. + +## 0.3.5 + +* Fix for cursor focus issues when keyboard is on. + +## 0.3.4 + +* Improve link handling for tel, mailto and etc. + +## 0.3.3 + +* More fix on cursor focus issue when keyboard is on. + +## 0.3.2 + +* Fix cursor focus issue when keyboard is on. + +## 0.3.1 + +* cursor focus when keyboard is on. + +## 0.3.0 + +* Line Height calculated based on font size. + +## 0.2.12 + +* Support placeholder. + +## 0.2.11 + +* Fix static analysis error. + +## 0.2.10 + +* Update TextInputConfiguration autocorrect to true in stable branch. + +## 0.2.9 + +* Update TextInputConfiguration autocorrect to true. + +## 0.2.8 + +* Support display local image besides network image in stable branch. + +## 0.2.7 + +* Support display local image besides network image. + +## 0.2.6 + +* Fix cursor after pasting. + +## 0.2.5 + +* Toggle text/background color button in toolbar. + +## 0.2.4 + +* Support the use of custom icon size in toolbar. + +## 0.2.3 + +* Support custom styles and image on local device storage without uploading. + +## 0.2.2 + +* Update git repo. + +## 0.2.1 + +* Fix static analysis error. + +## 0.2.0 + +* Add checked/unchecked list button in toolbar. + +## 0.1.8 + +* Support font and size attributes. + +## 0.1.7 + +* Support checked/unchecked list. + +## 0.1.6 + +* Fix getExtentEndpointForSelection. + +## 0.1.5 + +* Support text alignment. + +## 0.1.4 + +* Handle url with trailing spaces. + +## 0.1.3 + +* Handle cursor position change when undo/redo. + +## 0.1.2 + +* Handle more text colors. + +## 0.1.1 + +* Fix cursor issue when undo. + +## 0.1.0 + +* Fix insert image. + +## 0.0.9 + +* Handle rgba color. + +## 0.0.8 + +* Fix launching url. + +## 0.0.7 + +* Handle multiple image inserts. + +## 0.0.6 + +* More toolbar functionality. + +## 0.0.5 + +* Update example. + +## 0.0.4 + +* Update example. + +## 0.0.3 + +* Update home page meta data. + +## 0.0.2 + +* Support image upload and launch url in read-only mode. + +## 0.0.1 + +* Rich text editor based on Quill Delta. + diff --git a/doc/attribute_introduction.md b/doc/attribute_introduction.md index c0304e755..26d26bb4f 100644 --- a/doc/attribute_introduction.md +++ b/doc/attribute_introduction.md @@ -91,8 +91,8 @@ class HighlightAttr extends Attribute { ##### Where should we add this `HighlightAttr`? -On `QuillEditor` or `QuillEditorConfigurations` **doesn't exist** a param that let us pass our `Attribute` -implementations. To make this more easy, we can use just `customStyleBuilder` param from `QuillEditorConfigurations`, +On `QuillEditor` or `QuillEditorConfig` **doesn't exist** a param that let us pass our `Attribute` +implementations. To make this more easy, we can use just `customStyleBuilder` param from `QuillEditorConfig`, that let us define a function to return a `TextStyle`. With this, we can define now our `HighlightAttr` ##### The editor @@ -100,7 +100,7 @@ that let us define a function to return a `TextStyle`. With this, we can define ```dart QuillEditor.basic( controller: controller, - configurations: QuillEditorConfigurations( + config: QuillEditorConfig( customStyleBuilder: (Attribute attribute) { if (attribute.key.equals(highlightKey)) { return TextStyle(color: Colors.black, backgroundColor: Colors.yellow); diff --git a/doc/configurations/custom_buttons.md b/doc/configurations/custom_buttons.md index 1bff246f1..a641adfd1 100644 --- a/doc/configurations/custom_buttons.md +++ b/doc/configurations/custom_buttons.md @@ -1,18 +1,17 @@ -# Custom `QuillToolbar` Buttons ✨ +# Custom `QuillSimpleToolbar` Buttons ✨ You may add custom buttons to the _end_ of the toolbar, via the `customButtons` option, which is a `List` of `QuillToolbarCustomButtonOptions`. ## Adding an Icon 🖌️ -To add an Icon, we should use a new `QuillToolbarCustomButtonOptions` class +To add an Icon: ```dart QuillToolbarCustomButtonOptions( icon: const Icon(Icons.ac_unit), - tooltip: '', + tooltip: 'Tooltip', onPressed: () {}, - afterButtonPressed: () {}, ), ``` @@ -21,9 +20,9 @@ To add an Icon, we should use a new `QuillToolbarCustomButtonOptions` class Each `QuillCustomButton` is used as part of the `customButtons` option as follows: ```dart -QuillToolbar.simple( +QuillSimpleToolbar( controller: _controller, - configurations: QuillSimpleToolbarConfigurations( + config: QuillSimpleToolbarConfig( customButtons: [ QuillToolbarCustomButtonOptions( icon: const Icon(Icons.ac_unit), diff --git a/doc/configurations/font_size.md b/doc/configurations/font_size.md index 2eb3d8e9f..bc0fee040 100644 --- a/doc/configurations/font_size.md +++ b/doc/configurations/font_size.md @@ -1,19 +1,34 @@ # 🔠 Font Size Within the editor toolbar, a drop-down with font-sizing capabilities is available. -This can be enabled or disabled -with `showFontSize`. +This can be enabled or disabled with `showFontSize`. -When enabled, the default font-size values can be modified via _optional_ `fontSizeValues`. +When enabled, the default font-size values can be modified via _optional_ `rawItemsMap`. Accepts a `Map` consisting of a `String` title for the font size and a `String` value for the font size. Example: ```dart -fontSizeValues: const {'Small': '8', 'Medium': '24.5', 'Large': '46'} +QuillSimpleToolbar( + config: const QuillSimpleToolbarConfig( + buttonOptions: QuillSimpleToolbarButtonOptions( + fontSize: QuillToolbarFontSizeButtonOptions( + items: {'Small': '8', 'Medium': '24.5', 'Large': '46'}, + ), + ), + ), + ); ``` Font size can be cleared with a value of `0`, for example: ```dart -fontSizeValues: const {'Small': '8', 'Medium': '24.5', 'Large': '46', 'Clear': '0'} +QuillSimpleToolbar( + config: const QuillSimpleToolbarConfig( + buttonOptions: QuillSimpleToolbarButtonOptions( + fontSize: QuillToolbarFontSizeButtonOptions( + items: {'Small': '8', 'Medium': '24.5', 'Large': '46', 'Clear': '0'}, + ), + ), + ), + ); ``` \ No newline at end of file diff --git a/doc/configurations/localizations_setup.md b/doc/configurations/localizations_setup.md index a2184dfe9..1bb6298cc 100644 --- a/doc/configurations/localizations_setup.md +++ b/doc/configurations/localizations_setup.md @@ -1,31 +1,14 @@ # 🌍 Localizations Setup -In addition to the required delegates mentioned above in [Using custom app widget](./using_custom_app_widget.md), -which are: +The required localization delegates: ```dart localizationsDelegates: const [ DefaultCupertinoLocalizations.delegate, DefaultMaterialLocalizations.delegate, DefaultWidgetsLocalizations.delegate, -], + FlutterQuillLocalizations.delegate, +] ``` -Which are used by Flutter widgets. - -📌 Note: The library also needs the `FlutterQuillLocalizations.delegate`: - -```dart -// Required localizations delegates ... -FlutterQuillLocalizations.delegate -``` - -**You don't have to add this explicitly** because we have wrapped the `QuillEditor` and `QuillToolbar` with -`FlutterQuillLocalizationsWidget`. -This widget will check if the necessary localizations are set; if not, it will -provide them only for these widgets. -Therefore, it's not strictly required. -However, if you are overriding the -`localizationsDelegates`, you can also add the `FlutterQuillLocalizations.delegate`. - 📄 For additional notes, refer to the [Translation](../translation.md) section. diff --git a/doc/configurations/search.md b/doc/configurations/search.md index 78aba4723..04fdfa16c 100644 --- a/doc/configurations/search.md +++ b/doc/configurations/search.md @@ -7,13 +7,13 @@ Use the 3 vertical dots icon to turn on case-sensitivity or whole word constrain ## Search configuration options By default, the content of Embed objects are not searched. -You can enable search by setting the [searchEmbedMode] in searchConfigurations: +You can enable search by setting the [searchEmbedMode] in `searchConfig`: ```dart - MyQuillEditor( + QuillEditor.basic( controller: _controller, - configurations: QuillEditorConfigurations( - searchConfigurations: const QuillSearchConfigurations( + config: QuillEditorConfig( + searchConfig: const QuillSearchConfig( searchEmbedMode: SearchEmbedMode.plainText, ), ), diff --git a/doc/configurations/using_custom_app_widget.md b/doc/configurations/using_custom_app_widget.md index f498db587..a1fe497a4 100644 --- a/doc/configurations/using_custom_app_widget.md +++ b/doc/configurations/using_custom_app_widget.md @@ -16,19 +16,5 @@ localizationsDelegates: const [ ], ``` +📄 For additional notes, see the [localizations setup](./localizations_setup.md) page. -You might need more depending on your use case. For example, if you are using custom localizations for your app with a custom app widget like `FluentApp` from [FluentUI], you will also need: - -```dart -localizationsDelegates: const [ - // Required localizations delegates ... - FluentLocalizations.delegate, - AppLocalizations.delegate, -], -``` - -📌 Note: In recent versions of `FluentApp`, you no longer need to add the `localizationsDelegates`. This is just an example. For more information, refer to the [#946](https://github.com/bdlukaa/fluent_ui/pull/946). - -📄 For additional notes, see the [Localizations](./localizations_setup.md) page. - -[FluentUI]: https://pub.dev/packages/fluent_ui diff --git a/doc/custom_embed_blocks.md b/doc/custom_embed_blocks.md index d61b4faa9..e0ee5d2a5 100644 --- a/doc/custom_embed_blocks.md +++ b/doc/custom_embed_blocks.md @@ -41,13 +41,9 @@ class NotesEmbedBuilder extends EmbedBuilder { @override Widget build( BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, + EmbedContext embedContext, ) { - final notes = NotesBlockEmbed(node.value.data).document; + final notes = NotesBlockEmbed(embedContext.node.value.data).document; return Material( color: Colors.transparent, @@ -78,7 +74,7 @@ the `CustomBlockEmbed` inside of a `BlockEmbed.custom`). ```dart Future _addEditNote(BuildContext context, {Document? document}) async { final isEditing = document != null; - final quillEditorController = QuillController( + final controller = QuillController( document: document ?? Document(), selection: const TextSelection.collapsed(offset: 0), ); @@ -98,16 +94,16 @@ Future _addEditNote(BuildContext context, {Document? document}) async { ], ), content: QuillEditor.basic( - controller: quillEditorController, - configurations: const QuillEditorConfigurations(), + controller: controller, + config: const QuillEditorConfig(), ), ), ); - if (quillEditorController.document.isEmpty()) return; + if (controller.document.isEmpty()) return; final block = BlockEmbed.custom( - NotesBlockEmbed.fromDocument(quillEditorController.document), + NotesBlockEmbed.fromDocument(controller.document), ); final controller = _controller!; final index = controller.selection.baseOffset; diff --git a/doc/custom_toolbar.md b/doc/custom_toolbar.md index 53d04229d..c76accdb1 100644 --- a/doc/custom_toolbar.md +++ b/doc/custom_toolbar.md @@ -1,124 +1,103 @@ -# Custom Toolbar +# 🎨 Custom Toolbar -If you want to use a custom toolbar but still want the support of this library, -You can use the `QuillBaseToolbar` which is the base for the `QuillToolbar` - -Example: +You can use the `QuillController` in your custom toolbar or use the button widgets of the `QuillSimpleToolbar`: ```dart -QuillToolbar.simple( - configurations: const QuillSimpleToolbarConfigurations( - buttonOptions: QuillToolbarButtonOptions( - base: QuillToolbarBaseButtonOptions( - globalIconSize: 20, - globalIconButtonFactor: 1.4, - ), - ), - ), - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: [ - IconButton( - onPressed: () => context - .read() - .updateSettings( - state.copyWith(useCustomQuillToolbar: false)), - icon: const Icon( - Icons.width_normal, - ), - ), - QuillToolbarHistoryButton( - isUndo: true, - controller: controller, - ), - QuillToolbarHistoryButton( - isUndo: false, - controller: controller, - ), - QuillToolbarToggleStyleButton( - options: const QuillToolbarToggleStyleButtonOptions(), - controller: controller, - attribute: Attribute.bold, - ), - QuillToolbarToggleStyleButton( - options: const QuillToolbarToggleStyleButtonOptions(), - controller: controller, - attribute: Attribute.italic, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.underline, - ), - QuillToolbarClearFormatButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarImageButton( - controller: controller, - ), - QuillToolbarCameraButton( - controller: controller, - ), - QuillToolbarVideoButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarColorButton( - controller: controller, - isBackground: false, - ), - QuillToolbarColorButton( - controller: controller, - isBackground: true, - ), - const VerticalDivider(), - // This is an implementation that only is used on - // flutter_quill and it's not originally - // implemented in Quill JS API, so it could cause conflicts - // with the original Quill Delta format - QuillToolbarSelectLineHeightStyleDropdownButton( - controller: globalController, - ), - const VerticalDivider(), - QuillToolbarSelectHeaderStyleButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarToggleCheckListButton( - controller: controller, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.ol, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.ul, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.inlineCode, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.blockQuote, - ), - QuillToolbarIndentButton( - controller: controller, - isIncrease: true, - ), - QuillToolbarIndentButton( - controller: controller, - isIncrease: false, +SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Wrap( + children: [ + IconButton( + onPressed: () => context.read().updateSettings( + state.copyWith(useCustomQuillToolbar: false)), + icon: const Icon( + Icons.width_normal, ), - const VerticalDivider(), - QuillToolbarLinkStyleButton(controller: controller), - ], - ), + ), + QuillToolbarHistoryButton( + isUndo: true, + controller: controller, + ), + QuillToolbarHistoryButton( + isUndo: false, + controller: controller, + ), + QuillToolbarToggleStyleButton( + options: const QuillToolbarToggleStyleButtonOptions(), + controller: controller, + attribute: Attribute.bold, + ), + QuillToolbarToggleStyleButton( + options: const QuillToolbarToggleStyleButtonOptions(), + controller: controller, + attribute: Attribute.italic, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.underline, + ), + QuillToolbarClearFormatButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarImageButton( + controller: controller, + ), + QuillToolbarCameraButton( + controller: controller, + ), + QuillToolbarVideoButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarColorButton( + controller: controller, + isBackground: false, + ), + QuillToolbarColorButton( + controller: controller, + isBackground: true, + ), + const VerticalDivider(), + QuillToolbarSelectHeaderStyleDropdownButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarSelectLineHeightStyleDropdownButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarToggleCheckListButton( + controller: controller, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.ol, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.ul, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.inlineCode, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.blockQuote, + ), + QuillToolbarIndentButton( + controller: controller, + isIncrease: true, + ), + QuillToolbarIndentButton( + controller: controller, + isIncrease: false, + ), + const VerticalDivider(), + QuillToolbarLinkStyleButton(controller: controller), + ], ), ) ``` -if you want a more customized toolbar feel free to create your own and use the `controller` to interact with the editor. -checkout the `QuillToolbar` and the buttons inside it to see an example of how that will work diff --git a/doc/customizing_shortcuts.md b/doc/customizing_shortcuts.md index c4b88f7cc..cae78b6e7 100644 --- a/doc/customizing_shortcuts.md +++ b/doc/customizing_shortcuts.md @@ -15,11 +15,9 @@ class AsteriskToItalicStyle extends StatelessWidget { @override Widget build(BuildContext context) { - return QuillEditor( - scrollController: , - focusNode: , + return QuillEditor.basic( controller: , - configurations: QuillEditorConfigurations( + config: QuillEditorConfig( characterShortcutEvents: [], ), ); @@ -62,7 +60,7 @@ CharacterShortcutEvent asteriskToItalicStyleEvent = CharacterShortcutEvent( ); ``` -Now our 'asterisk handler' function is done and the only task left is to inject it into the `QuillEditorConfigurations`. +Now our 'asterisk handler' function is done and the only task left is to inject it into the `QuillEditorConfig`. ```dart import 'package:flutter_quill/flutter_quill.dart'; @@ -73,11 +71,9 @@ class AsteriskToItalicStyle extends StatelessWidget { @override Widget build(BuildContext context) { - return QuillEditor( - scrollController: , - focusNode: , + return QuillEditor.basic( controller: , - configurations: QuillEditorConfigurations( + config: QuillEditorConfig( characterShortcutEvents: [ asteriskToItalicStyleEvent, ], diff --git a/doc/migration/10_to_11.md b/doc/migration/10_to_11.md new file mode 100644 index 000000000..d6d4abd73 --- /dev/null +++ b/doc/migration/10_to_11.md @@ -0,0 +1,482 @@ +# 🔄 Migration from 10.x.x to 11.x.x + +If you're using version `10.x.x`, we recommend fixing all the deprecations before migrating to `11.x.x` for a smoother migration. + +> [!IMPORTANT] +> Once you're able to build and run the app successfully, ensure to read [breaking behavior](#-breaking-behavior). +> See if any changes affect your usage and update the existing code. + +## 📋 1. Clipboard + +The `super_clipboard` plugin has been removed from `flutter_quill` and `flutter_quill_extensions`. + +Remove the following if used: + +```diff +- FlutterQuillExtensions.useSuperClipboardPlugin(); +``` + +You can either use our default implementation or continue using `super_clipboard`, if you're unsure, try with **option A** unless you have a reason to use **option B**. + +### ⚙️ A. Using the new default implementation + +> [!NOTE] +> You only need to remove the `super_clipboard` configuration if you're not using [super_clipboard](https://pub.dev/packages/super_clipboard) which was introduced in your app as a transitive dependency. + +The [configuration of `super_clipboard`](https://pub.dev/packages/super_clipboard#getting-started) is no longer required. + +The following snippet in your `android/app/src/main/AndroidManifest.xml` **should be removed** otherwise you will be unable to launch the **Android app**: + +```xml + + +``` + +It can be found inside the `` tag if you have [added it](https://pub.dev/packages/super_clipboard#android-support). + +See the [`quill_native_bridge` platform configuration](https://pub.dev/packages/quill_native_bridge#-platform-configuration) (**optional** for copying images on **Android**). + +#### 🔧 Other Optional changes + +The `super_clipboard` is no longer a dependency of `flutter_quill_extensions`. + +As such it's no longer required to set the `minSdkVersion` to `23` on **Android**. If the main reason you updated +the version was `flutter_quill_extensions` then you can restore the Flutter default now (currently `21`). + +Open the `android/app/build.gradle` file: + +- Use the Flutter default `minSdkVersion`: + +```kotlin +android { + defaultConfig { + minSdk = flutter.minSdkVersion + } +} +``` + +- Use the Flutter default `ndkVersion`: + +```kotlin +android { + ndkVersion = flutter.ndkVersion +} +``` + +> [!NOTE] +> You should only apply this optional change if you're not using +> [`super_clipboard`](https://pub.dev/packages/super_clipboard) or you don't have a reason to change the Flutter default. + +### ⚙️ B. Continue using the `super_clipboard` implementation + +Use the new default implementation or if you want to continue using `super_clipboard`, use the package [quill_super_clipboard](https://pub.dev/packages/quill_super_clipboard) (**support might be discontinued in future releases**). + +> [!WARNING] +> The support of [quill_super_clipboard](https://pub.dev/packages/quill_super_clipboard) might be discontinued. It's still possible to +> override the default implementation manually. + +See [#2229](https://github.com/singerdmx/flutter-quill/issues/2229). + +## 📝 2. Quill Controller + +The `QuillController` should now be passed to the `QuillEditor` and `QuillSimpleToolbar` constructors instead of the configuration class. + +**Before**: + +```dart +QuillEditor.basic( + config: QuillEditorConfig( + controller: _controller, + ), + ) +``` + +**After**: + +```dart +QuillEditor.basic( + controller: _controller, +) +``` + +
+The change + +```diff +QuillEditor.basic( + config: QuillEditorConfig( +- controller: _controller, + ), ++ controller: _controller, + ) +``` + +
+ +> [!NOTE] +> The class `QuillEditorConfigurations` has been renamed to `QuillEditorConfig`. See [renames to configuration classes](#5-renames-to-configuration-classes) section. + +See [#2037](https://github.com/singerdmx/flutter-quill/discussions/2037) for discussion. Thanks to [#2078](https://github.com/singerdmx/flutter-quill/pull/2078). + +> [!TIP] +> The `QuillToolbar` widget has been removed and is no longer +required for custom toolbars, see [removal of the `QuillToolbar`](#️-8-removal-of-the-quilltoolbar) section. + +## 🧹 3. Removal of the `QuillEditorProvider` and `QuillToolbarProvider` inherited widgets + +It's no longer possible to access the `QuillController`, the `QuillEditorConfiugrations`, and `QuillSimpleToolbarConfigurations` using the `BuildContext`. +Instead, you will have to pass them through constructors (revert to the old behavior). + +The extension methods on `BuildContext` like `requireQuillEditorConfigurations`, `quillEditorConfigurations`, and `quillEditorElementOptions` have been removed. + +See [#2301](https://github.com/singerdmx/flutter-quill/issues/2301). + +## 🌐 4. Required localization delegate + +This project uses the [Flutter Localizations library](https://api.flutter.dev/flutter/flutter_localizations/flutter_localizations-library.html), requiring `FlutterQuillLocalizations.delegate` to be included in your app widget (e.g., `MaterialApp`, `WidgetsApp`, `CupertinoApp`). + +Previously, we used a helper widget (`FlutterQuillLocalizationsWidget`) to manually provide localization delegates, but this approach was inefficient and error-prone, causing unexpected bugs. It has been removed. + +To use the `QuillEditor` and `QuillSimpleToolbar` widgets, add the required delegates as shown: + +```dart +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; + +MaterialApp( + localizationsDelegates: const [ + // Your other delegates... + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, + ], +); +``` + +

OR (less code with less control)

+ +```dart +import 'package:flutter_quill/flutter_quill.dart'; + +MaterialApp( + localizationsDelegates: FlutterQuillLocalizations.localizationsDelegates, +); +``` + +The widget `FlutterQuillLocalizationsWidget` has been removed. + +The library `package:flutter_quill/translations.dart` has been removed and the replacement is `package:flutter_quill/flutter_quill.dart` + +## 🔧 5. Renames to configuration classes + +- **Renames `QuillEditorConfigurations` to `QuillEditorConfig` and `QuillEditor.configurations` to `QuillEditor.config`.** +- **Renames `QuillRawEditorConfigurations` to `QuillRawEditorConfig` and `QuillRawEditor.configurations` to `QuillRawEditor.config`.** +- **Renames `QuillSimpleToolbarConfigurations` to `QuillSimpleToolbarConfig` and `QuillSimpleToolbar.configurations` to `QuillSimpleToolbar.config`.** +- **Renames `QuillSearchConfigurations` to `QuillSearchConfig` and `QuillEditorConfig.searchConfigurations` to `QuillEditorConfig.searchConfig`.** +- **Renames `QuillControllerConfigurations` to `QuillControllerConfig` and `QuillController.configurations` to `QuillController.config`.** The `configurations` parameter in the `QuillController.basic()` factory constructor was also renamed to `config`. +- **Renames `QuillToolbarImageConfigurations` to `QuillToolbarImageConfig` and `QuillToolbarImageButtonOptions.imageButtonConfigurations` to `QuillToolbarImageButtonOptions.imageButtonConfig`.** + +All class names have been updated to replace `Configurations` with `Config`, and the related parameter name has been changed from `configurations` to `config`. + +## 🧩 6. Refactoring of the Embed block interface + +The `EmbedBuilder.build()` and `EmbedButtonBuilder` have both been changed. + +### 📥 The `EmbedBuilder.build()` method + +All the properties (except `context`) have been encapsulated into one class `EmbedContext`. + +```diff + Widget build( + BuildContext context, +- QuillController controller, +- Embed node, +- bool readOnly, +- bool inline, +- TextStyle textStyle, ++ EmbedContext embedContext, + ) { +- controller.replaceText(); ++ embedContext.controller.replaceText(); + } +``` + +### 🔘 The `EmbedButtonBuilder` function + +All the properties have been encapsulated into one class `EmbedButtonContext` and the `BuildContext` property has been added. + +```diff +- (controller, toolbarIconSize, iconTheme, dialogTheme) => +- QuillToolbarImageButton( +- controller: controller, +- options: imageButtonOptions, +- ) ++ (context, embedContext) => QuillToolbarImageButton( ++ controller: embedContext.controller, ++ options: imageButtonOptions, ++ ), +``` + +The `flutter_quill_extensions` has been updated. + +> [!TIP] +> For more details, see [custom embed blocks](https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_embed_blocks.md). + +## 🔄 7. The `flutter_quill_extensions` + +- Removes `ImagePickerService` from `OnRequestPickVideo` and `OnRequestPickImage`. +- Removes `ImageSaverService` from `ImageOptionsMenu`. +- Removes `QuillSharedExtensionsConfigurations`. +- The return type (`ImageProvider`) of `ImageEmbedBuilderProviderBuilder` has been made `null` so you can return `null` and fallback to our default handling. See [#2317](https://github.com/singerdmx/flutter-quill/pull/2317). +- Removes `QuillSharedExtensionsConfigurations.assetsPrefix`. Use `imageProviderBuilder` to support image assets. See [Image assets support](https://pub.dev/packages/flutter_quill_extensions#-image-assets). +- Removes YouTube video support. To migrate see [CHANGELOG of 10.8.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.0). See [#2284](https://github.com/singerdmx/flutter-quill/issues/2284). +- Removes the deprecated class `FlutterQuillExtensions`. +- Removes the deprecated and experimental table embed support. +- Avoid exporting `flutter_quill_extensions/utils.dart`. + +## ✒️ 8. Removal of the `QuillToolbar` + +The `QuillToolbar` widget has been removed as it's no longer necessary for `QuillSimpleToolbar` or **custom toolbars**. + +Previously, `QuillToolbar` was required to provide a toolbar provider and localization delegate. Additionally, the `QuillToolbarConfigurations` class has been removed. + +To migrate, add the [required localization delegate](#-4-required-localization-delegate) in your app widget +and remove the `QuillToolbar`. + +```diff +- QuillToolbar( +- configurations: const QuillToolbarConfigurations(), +- child: YourCustomToolbar(), +- ); ++ YourCustomToolbar(); +``` + +See the [custom toolbar](https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md) page for an example. + +Customizing the buttons (that are from `flutter_quill`) within `QuillToolbarConfigurations` in a custom toolbar is **no longer supported**. +Instead, you can use the constructor of each button widget, an example: + +```dart +final QuillController _controller = QuillController.basic(); +final QuillToolbarBaseButtonOptions _baseOptions = QuillToolbarBaseButtonOptions( + afterButtonPressed: () { + // Do something + } +); + +YourCustomToolbar( + buttons: [ + // Example of using buttons of the `QuillSimpleToolbar` in your custom toolbar. + // Those buttons are from the flutter_quill library. + // Pass the _baseOptions to all buttons. + QuillToolbarToggleStyleButton( + controller: _controller, + baseOptions: _baseOptions, + attribute: Attribute.bold, + ), + QuillToolbarClearFormatButton( + controller: _controller, + baseOptions: _baseOptions, + ), + QuillToolbarFontSizeButton( + controller: _controller, + baseOptions: _baseOptions, + // Override the base button options within options, also allow button-specific options + options: const QuillToolbarFontSizeButtonOptions( + items: {'Small': '8', 'Medium': '24.5', 'Large': '46'}, + ) + ) + ] +); +``` + +> [!NOTE] +> This might be confusing: `QuillToolbar` is **not a visual toolbar** on its own like `QuillSimpleToolbar`. It's a non-visual widget that only +ensures to provide the localization delegate and the toolbar provider. + +
+ +Expand to see explanation about QuillToolbar vs QuillSimpleToolbar + +This section explains the main difference between `QuillSimpleToolbar` and `QuillToolbar`. + +- The `QuillSimpleToolbar` widget is a basic, straightforward toolbar provided by the library, which uses `QuillToolbar` internally. +- The non-visual `QuillToolbar` widget is utilized within `QuillSimpleToolbar` and can also be used to build a custom toolbar. +Before version `11.0.0`, it provided the toolbar provider and localization delegate, +which supported the buttons provided by the library used in `QuillSimpleToolbar`. For custom toolbars, `QuillToolbar` +is only needed if you use the library’s toolbar buttons from `flutter_quill`. Those buttons are used in `QuillSimpleToolbar`. + +The `QuillToolbar` is different depending on the release you're using: + +* On `7.x.x` and older versions, the `QuillToolbar.basic()` was the equivalent of `QuillSimpleToolbar`. The widget `QuillSimpleToolbar` didn't exist. +* On `9.x.x` and newer versions, the `QuillToolbar` has been changed to be a non-visual widget and `QuillSimpleToolbar` was added (the visual widget). +* On `11.0.0` and newer versions, the `QuillToolbar` is no longer needed and has been removed, and the `QuillSimpleToolbar` works without. It is no longer +required for **custom toolbars**. + +
+ +## 📎 Minor changes + +- `QuillEditorConfig.readOnly` has been removed and is accessible in `QuillController.readOnly`. +- `QuillController.editorFocusNode` has been removed, and is accessible in the `QuillEditor` widget. +- `QuillController.editorConfig` has been removed, and is accessible in the `QuillEditor` widget. +- `QuillEditorBuilderWidget` and `QuillEditorConfig.builder` have been removed as there's no valid use-case and this can be confusing. +- `QuillToolbarLegacySearchDialog` and `QuillToolbarLegacySearchButton` have been removed and replaced with `QuillToolbarSearchDialog` and `QuillToolbarSearchButton` which has been introduced in [9.4.0](https://github.com/singerdmx/flutter-quill/releases/tag/v9.4.0). `QuillSimpleToolbarConfigu.searchButtonType` is removed too. +- The property `dialogBarrierColor` has been removed from all buttons, use the `DialogTheme` in your `ThemeData` instead to customize it. See [Override a theme](https://docs.flutter.dev/cookbook/design/themes#override-a-theme). +- The deprecated members `QuillRawEditorConfig.enableMarkdownStyleConversion` and `QuillEditorConfig.enableMarkdownStyleConversion` has been removed. See [#2214](https://github.com/singerdmx/flutter-quill/issues/2214). +- Removes `QuillSharedConfigurations.extraConfigurations`. The optional configuration of `flutter_quill_extensions` should be separated. +- Renames the classes: + - `QuillEditorBulletPoint` to `QuillBulletPoint` + - `QuillEditorCheckboxPoint` to `QuillCheckbox` + - `QuillEditorNumberPoint` to `QuillNumberPoint`. +- Removes `QuillEditorElementOptions` and `QuillEditorConfig.elementOptions`. To customize the leading, see [#2146](https://github.com/singerdmx/flutter-quill/pull/2146) as an example. The classes related to `QuillEditorElementOptions` such as `QuillEditorCodeBlockElementOptions` has been removed. +- Removes `QuillController.toolbarConfigurations` to not store anything specific to the `QuillSimpleToolbar` in the `QuillController`. +- Removes `QuillToolbarBaseButtonOptions.globalIconSize` and `QuillToolbarBaseButtonOptions.globalIconButtonFactor`. Both are deprecated for at least 10 months. +- Removes `QuillToolbarFontSizeButton.defaultDisplayText` (deprecated for more than 10 months). +- Removes `fontSizesValues` and `fontFamilyValues` from `QuillSimpleToolbarConfig` since those were used only in `QuillToolbarFontSizeButton` and `QuillToolbarFontFamilyButton`. Pass them to `items` (which exist in each button configuration) directly. +- Removes the deprecated library `flutter_quill/extensions.dart` since the name was confusing, it's for `flutter_quill_extensions`. +- Removes the deprecated library `flutter_quill/markdown_quill.dart`. Suggested alternatives: [markdown_quill](https://pub.dev/packages/markdown_quill) or [quill_markdown](https://pub.dev/packages/quill_markdown). +- Removes `Document.fromHtml`. Use an alternative such as [flutter_quill_delta_from_html](https://pub.dev/packages/flutter_quill_delta_from_html). +- Removes `QuillControllerConfig.editorConfig` (not being used and invalid). +- Remove `QuillSharedConfigurations` (it's no longer used). It was previously used to set the `Local` for both `QuillEditor` and `QuillToolbar` simultaneously. +- Removes the experimental method `QuillController.setContents`. +- Renames `isOnTapOutsideEnabled` from `QuillRawEditorConfig` and `QuillEditorConfig` to `onTapOutsideEnabled`. +- Removes editor configuration from `Document`. Instead, only require the needed parameters as internal members. Updates `Line.getPlainText()`. +- The class `OptionalSize` are no longer exported as part of `package:flutter_quill/flutter_quill.dart`. +- Renames `QuillToolbarToggleCheckListButtonOptions.isShouldRequestKeyboard` to `QuillToolbarToggleCheckListButtonOptions.shouldRequestKeyboard`. +- Moved `onClipboardPaste` from `QuillControllerConfig` to `QuillClipboardConfig`. Added `clipboardConfig` property to `QuillControllerConfig`. +- Moved `onImagePaste` and `onGifPaste` from the editor's config (`QuillEditorConfig` or `QuillRawEditorConfig`) to the clipboard's config (`QuillClipboardConfig`), which is part of the controller's config (`QuillControllerConfig`). + +## 💥 Breaking behavior + +The existing code works and compiles but the functionality has changed in a non-backward-compatible way: + +### 1. The `QuillClipboardConfig.onClipboardPaste` is not a fallback anymore when couldn't handle the paste operation by default + +The `QuillClipboardConfig.onClipboardPaste` has been updated to allow to override of the default clipboard paste handling instead of only handling the clipboard paste if the default logic didn't paste. See the updated docs comment of [`QuillClipboardConfig.onClipboardPaste`](https://github.com/singerdmx/flutter-quill/blob/release/v11/lib/src/controller/clipboard/quill_clipboard_config.dart#L18-L47) for an example. + +Previously it was a fallback function that will be called when the default paste is not handled successfully. + +To migrate, use the [`QuillClipboardConfig.onUnprocessedPaste`](https://github.com/singerdmx/flutter-quill/blob/release/v11/lib/src/controller/clipboard/quill_clipboard_config.dart#L49-L53) callback instead. + +```diff +- QuillControllerConfig( +- onClipboardPaste: () {} +- ) ++ QuillControllerConfig( ++ clipboardConfig: QuillClipboardConfig( ++ onUnprocessedPaste: () {} ++ ) ++ ) +``` + +### 2. No longer handle asset images by default in `flutter_quill_extensions` + +The **flutter_quill_extensions** does not handle `AssetImage` anymore by default when loading images, instead use `imageProviderBuilder` to override the default handling. + +To support loading image assets (images bundled within your app): + +```dart +FlutterQuillEmbeds.editorBuilders( + imageEmbedConfig: + QuillEditorImageEmbedConfig( + imageProviderBuilder: (context, imageUrl) { + if (imageUrl.startsWith('assets/')) { + return AssetImage(imageUrl); + } + // Fallback to default handling + return null; + }, + ), +) +``` + +Ensures to replace `assets` with your assets directory name or change the logic to fit your needs. + +### 3. No longer request editor focus by default after pressing a `QuillSimpleToolbar`'s button + +The `QuillSimpleToolbar` and related toolbar buttons no longer request focus from the editor after pressing a button (**revert to the old behavior**). + +Here is a minimal example to use to the old behavior using `QuillSimpleToolbar`: + +```dart +final QuillController _controller = QuillController.basic(); +final _editorFocusNode = FocusNode(); +final _editorScrollController = ScrollController(); + +QuillSimpleToolbar( + controller: _controller, + config: QuillSimpleToolbarConfig( + buttonOptions: QuillSimpleToolbarButtonOptions( + base: QuillToolbarBaseButtonOptions( + afterButtonPressed: _editorFocusNode.requestFocus + ) + ) + ) +), +Expanded( + child: QuillEditor(controller: _controller, focusNode: _editorFocusNode, scrollController: _editorScrollController) +) +``` + +With a custom toolbar: + +```dart +final QuillController _controller = QuillController.basic(); +final _editorFocusNode = FocusNode(); +final _editorScrollController = ScrollController(); + +final QuillToolbarBaseButtonOptions _baseOptions = QuillToolbarBaseButtonOptions( + afterButtonPressed: _editorFocusNode.requestFocus +); + +YourCustomToolbar( + buttons: [ + // Pass the _baseOptions to all buttons. + QuillToolbarClearFormatButton( + controller: _controller, + baseOptions: _baseOptions, + ), + QuillToolbarFontSizeButton( + controller: _controller, + baseOptions: _baseOptions, + ), + // all the other buttons + ] +), +Expanded( + child: QuillEditor(controller: _controller, focusNode: _editorFocusNode, scrollController: _editorScrollController) +) +``` + +Don't forgot to dispose the `QuillController`, `FocusNode` and `ScrollController` in the `dispose()` method: + +```dart +@override +void dispose() { + _controller.dispose(); + _editorFocusNode.dispose(); + _editorScrollController.dispose(); + super.dispose(); +} +``` + +## 🚧 Experimental + +APIs that were indicated as stable but are now updated to indicate +that they are experimental, which means that they might be removed or changed +in non-major releases: + +- The `QuillSearchConfig` and search within embed objects feature. Related [#2090](https://github.com/singerdmx/flutter-quill/pull/2090). +- The `QuillController.clipboardPaste()` and `QuillEditorConfig.onGifPaste`. +- The `QuillEditorConfig.characterShortcutEvents` and `QuillEditorConfig.spaceShortcutEvents`. +- The `QuillControllerConfig.onClipboardPaste`. +- The `QuillEditorConfig.customLeadingBlockBuilder`. +- The magnifier feature including `QuillEditorConfig.magnifierConfiguration`. + +The functionality itself has not changed and no experimental changes were introduced. \ No newline at end of file diff --git a/doc/translation.md b/doc/translation.md index 8eae802fc..2ea400dd4 100644 --- a/doc/translation.md +++ b/doc/translation.md @@ -1,29 +1,7 @@ # 🌍 Translation The package offers translations for the quill toolbar and editor, it will follow the locale that is defined in -your `WidgetsApp` for example `MaterialApp` which usually follows the system locally unless you set your own locale -with: - -```dart -QuillToolbar.simple( - controller: _controller, - configurations: QuillSimpleToolbarConfigurations( - sharedConfigurations: const QuillSharedConfigurations( - locale: Locale('de'), - ), - ), -), -Expanded( - child: QuillEditor.basic( - controller: _controller, - configurations: QuillEditorConfigurations( - sharedConfigurations: const QuillSharedConfigurations( - locale: Locale('de'), - ), - ), - ), -) -``` +your `WidgetsApp` for example `MaterialApp` which usually follows the system locally unless you set your own locale. ## 🌐 Supported Locales @@ -95,7 +73,7 @@ The script above will generate Dart files from the Arb files to test the changes won't notice a difference. > 🔧 If you added or removed translations in the template file, make sure to update `_expectedTranslationKeysLength` -> variable in [scripts/ensure_translations_correct.dart](../scripts/ensure_translations_correct.dart)
+> variable in [scripts/translations_check.dart](../scripts/translations_check.dart)
> Otherwise you don't need to update it. Then open a pull request so everyone can benefit from your translations! diff --git a/example/.gitignore b/example/.gitignore index 24476c5d1..12b4e0432 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -27,7 +27,6 @@ migrate_working_dir/ .dart_tool/ .flutter-plugins .flutter-plugins-dependencies -.packages .pub-cache/ .pub/ /build/ @@ -42,3 +41,6 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release + +# Apps should include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspec-lock. +!pubspec.lock \ No newline at end of file diff --git a/example/.metadata b/example/.metadata index 68b331fb1..c2aa44bdb 100644 --- a/example/.metadata +++ b/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" + revision: "603104015dd692ea3403755b55d07813d5cf8965" channel: "stable" project_type: app @@ -13,11 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 + - platform: android + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 + - platform: ios + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 + - platform: linux + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 + - platform: macos + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 - platform: web - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 + - platform: windows + create_revision: 603104015dd692ea3403755b55d07813d5cf8965 + base_revision: 603104015dd692ea3403755b55d07813d5cf8965 # User provided section diff --git a/example/README.md b/example/README.md index c727691cc..1db1a0b88 100644 --- a/example/README.md +++ b/example/README.md @@ -1,18 +1,10 @@ -# Demo - -This is just a demo of Flutter Quill +# Flutter Quill Example +Demonstrates how to use the [flutter_quill](https://pub.dev/packages/flutter_quill) package. ## Screenshots -Screenshot 1 -Screenshot 2 -Screenshot 3 -Screenshot 4 - -## Development notes - -- When changing the `assets` please run: -``` -dart run build_runner build --delete-conflicting-outputs -``` \ No newline at end of file +Screenshot 1 +Screenshot 2 +Screenshot 3 +Screenshot 4 diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index f20ebe56a..f9b303465 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -1,37 +1 @@ include: package:flutter_lints/flutter.yaml - -analyzer: - errors: - invalid_annotation_target: ignore - -linter: - rules: - always_declare_return_types: true - always_put_required_named_parameters_first: true - annotate_overrides: true - avoid_empty_else: true - avoid_escaping_inner_quotes: true - avoid_print: true - avoid_redundant_argument_values: false - avoid_types_on_closure_parameters: true - avoid_void_async: true - cascade_invocations: true - directives_ordering: true - omit_local_variable_types: true - prefer_const_constructors: true - prefer_const_constructors_in_immutables: true - prefer_const_declarations: true - prefer_final_fields: true - prefer_final_in_for_each: true - prefer_final_locals: true - prefer_initializing_formals: true - prefer_int_literals: true - prefer_interpolation_to_compose_strings: true - prefer_relative_imports: true - prefer_single_quotes: true - sort_constructors_first: true - sort_unnamed_constructors_first: true - unnecessary_lambdas: true - unnecessary_parenthesis: true - unnecessary_string_interpolations: true - library_private_types_in_public_api: false \ No newline at end of file diff --git a/example/android/.gitignore b/example/android/.gitignore index 6f568019d..55afd919c 100644 --- a/example/android/.gitignore +++ b/example/android/.gitignore @@ -7,7 +7,7 @@ gradle-wrapper.jar GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +# See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 41df88424..9caa6dd24 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -5,44 +5,26 @@ plugins { id "dev.flutter.flutter-gradle-plugin" } -def localProperties = new Properties() -def localPropertiesFile = rootProject.file("local.properties") -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader("UTF-8") { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty("flutter.versionCode") -if (flutterVersionCode == null) { - flutterVersionCode = "1" -} - -def flutterVersionName = localProperties.getProperty("flutter.versionName") -if (flutterVersionName == null) { - flutterVersionName = "1.0" -} - android { - namespace = "com.example.example" + namespace = "dev.flutterquill.flutter_quill_example" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_17 + jvmTarget = JavaVersion.VERSION_11 } defaultConfig { - applicationId = "com.example.example" - minSdk = 23 + applicationId = "dev.flutterquill.flutter_quill_example" + minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion - versionCode = flutterVersionCode.toInteger() - versionName = flutterVersionName + versionCode = flutter.versionCode + versionName = flutter.versionName } buildTypes { diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index b4ca5acfe..c72122824 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,69 +1,40 @@ - + - - - - - - - - - - + android:icon="@mipmap/ic_launcher"> + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" + /> - - + + - - - - - - + - \ No newline at end of file + + + + + + + + diff --git a/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/example/android/app/src/main/kotlin/dev/flutterquill/flutter_quill_example/MainActivity.kt similarity index 66% rename from example/android/app/src/main/kotlin/com/example/example/MainActivity.kt rename to example/android/app/src/main/kotlin/dev/flutterquill/flutter_quill_example/MainActivity.kt index 70f8f08f2..92044fc19 100644 --- a/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt +++ b/example/android/app/src/main/kotlin/dev/flutterquill/flutter_quill_example/MainActivity.kt @@ -1,4 +1,4 @@ -package com.example.example +package dev.flutterquill.flutter_quill_example import io.flutter.embedding.android.FlutterActivity diff --git a/example/android/app/src/main/res/xml/file_paths.xml b/example/android/app/src/main/res/xml/file_paths.xml index 11a4d5070..3f0135bae 100644 --- a/example/android/app/src/main/res/xml/file_paths.xml +++ b/example/android/app/src/main/res/xml/file_paths.xml @@ -1,3 +1,4 @@ + \ No newline at end of file diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 5f5d39d06..259717082 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1,6 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 1af9e0930..b82aa23a4 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 29e2c11de..a00f9ea70 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -18,7 +18,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.3.1' apply false + id "com.android.application" version "8.3.1" apply false id "org.jetbrains.kotlin.android" version "1.8.22" apply false } diff --git a/example/assets/fonts/IbarraRealNova-Regular.ttf b/example/assets/fonts/IbarraRealNova-Regular.ttf deleted file mode 100755 index b38e2e9b2..000000000 Binary files a/example/assets/fonts/IbarraRealNova-Regular.ttf and /dev/null differ diff --git a/example/assets/fonts/MonoSpace.ttf b/example/assets/fonts/MonoSpace.ttf deleted file mode 100644 index d71349518..000000000 Binary files a/example/assets/fonts/MonoSpace.ttf and /dev/null differ diff --git a/example/assets/fonts/Nunito-Regular.ttf b/example/assets/fonts/Nunito-Regular.ttf deleted file mode 100644 index fdeb0186c..000000000 Binary files a/example/assets/fonts/Nunito-Regular.ttf and /dev/null differ diff --git a/example/assets/fonts/Pacifico-Regular.ttf b/example/assets/fonts/Pacifico-Regular.ttf deleted file mode 100644 index b9265a2a5..000000000 Binary files a/example/assets/fonts/Pacifico-Regular.ttf and /dev/null differ diff --git a/example/assets/fonts/RobotoMono-Regular.ttf b/example/assets/fonts/RobotoMono-Regular.ttf deleted file mode 100644 index 5919b5d1b..000000000 Binary files a/example/assets/fonts/RobotoMono-Regular.ttf and /dev/null differ diff --git a/example/assets/fonts/SansSerif.ttf b/example/assets/fonts/SansSerif.ttf deleted file mode 100644 index e21ff5f1e..000000000 Binary files a/example/assets/fonts/SansSerif.ttf and /dev/null differ diff --git a/example/assets/fonts/Serif.ttf b/example/assets/fonts/Serif.ttf deleted file mode 100644 index 892423b57..000000000 Binary files a/example/assets/fonts/Serif.ttf and /dev/null differ diff --git a/example/assets/fonts/SquarePeg-Regular.ttf b/example/assets/fonts/SquarePeg-Regular.ttf deleted file mode 100755 index dfc6f841a..000000000 Binary files a/example/assets/fonts/SquarePeg-Regular.ttf and /dev/null differ diff --git a/example/assets/images/rich_text_paste.gif b/example/assets/images/rich_text_paste.gif new file mode 100644 index 000000000..9657d6b74 Binary files /dev/null and b/example/assets/images/rich_text_paste.gif differ diff --git a/example/assets/images/screenshot_1.png b/example/assets/images/screenshot_1.png index de08d956d..9f16e95bb 100644 Binary files a/example/assets/images/screenshot_1.png and b/example/assets/images/screenshot_1.png differ diff --git a/example/assets/images/screenshot_2.png b/example/assets/images/screenshot_2.png index 3da4b33d0..0ecb7bffe 100644 Binary files a/example/assets/images/screenshot_2.png and b/example/assets/images/screenshot_2.png differ diff --git a/example/assets/images/screenshot_3.png b/example/assets/images/screenshot_3.png index 57b9258f6..450f0aca9 100644 Binary files a/example/assets/images/screenshot_3.png and b/example/assets/images/screenshot_3.png differ diff --git a/example/assets/images/screenshot_4.png b/example/assets/images/screenshot_4.png index d0ed8aa74..8b90452cb 100644 Binary files a/example/assets/images/screenshot_4.png and b/example/assets/images/screenshot_4.png differ diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 99a591f26..bb504d176 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 204C5A31D5F7A86E45DB119F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9794CCA1F165099F5BDCEA39 /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 6AB2329557D1981D6B17B057 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04DE71649CFF61B6EA443C6C /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 95A4F67B5B7C7331534DAE52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CC42284313298068A87F511 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - AAE3AA97C25C7C7B5295A599 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EB7E0F1AF21A3BBAD9B0604 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,51 +42,60 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 04DE71649CFF61B6EA443C6C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 26F2BF435A317FA7A918D4C4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1E6E80686AEE93DAC1D78B29 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 669C4A4209C8AA9C2A4E1EF6 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 6F7E0A20E20DB7725721ACD2 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 71300142A7AF02C530456ED5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7620E88D08B8BDBA8A156E5A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 823133B7D76EAD2B34DAB23A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7CC42284313298068A87F511 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9794CCA1F165099F5BDCEA39 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9EB7E0F1AF21A3BBAD9B0604 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CF3DC413E242DB747F1A27C3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D51EC220C03C73DE33621091 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 9DD762FA5857F2B531FF16E5 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + CFC3FEF6AFF3650E4EE6A41D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + DD86B4B806817CB345ACF05D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 940D3C4C6DD542413E14FFBD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 204C5A31D5F7A86E45DB119F /* Pods_Runner.framework in Frameworks */, + 95A4F67B5B7C7331534DAE52 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CDFE8E31CEDD3DF5E4C7D568 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AAE3AA97C25C7C7B5295A599 /* Pods_RunnerTests.framework in Frameworks */, + 6AB2329557D1981D6B17B057 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 02F746990DACB0D119F72F34 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 04DE71649CFF61B6EA443C6C /* Pods_Runner.framework */, + 7CC42284313298068A87F511 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -95,6 +104,20 @@ path = RunnerTests; sourceTree = ""; }; + 6FE303D04C9AABB6B0EEFED3 /* Pods */ = { + isa = PBXGroup; + children = ( + 6F7E0A20E20DB7725721ACD2 /* Pods-Runner.debug.xcconfig */, + 71300142A7AF02C530456ED5 /* Pods-Runner.release.xcconfig */, + 1E6E80686AEE93DAC1D78B29 /* Pods-Runner.profile.xcconfig */, + CFC3FEF6AFF3650E4EE6A41D /* Pods-RunnerTests.debug.xcconfig */, + 9DD762FA5857F2B531FF16E5 /* Pods-RunnerTests.release.xcconfig */, + DD86B4B806817CB345ACF05D /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -113,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - E66594D1F14CB994BDE9644D /* Pods */, - C29E1BD83CA1C73E4197B5EA /* Frameworks */, + 6FE303D04C9AABB6B0EEFED3 /* Pods */, + 02F746990DACB0D119F72F34 /* Frameworks */, ); sourceTree = ""; }; @@ -142,29 +165,6 @@ path = Runner; sourceTree = ""; }; - C29E1BD83CA1C73E4197B5EA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 9794CCA1F165099F5BDCEA39 /* Pods_Runner.framework */, - 9EB7E0F1AF21A3BBAD9B0604 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - E66594D1F14CB994BDE9644D /* Pods */ = { - isa = PBXGroup; - children = ( - 823133B7D76EAD2B34DAB23A /* Pods-Runner.debug.xcconfig */, - 26F2BF435A317FA7A918D4C4 /* Pods-Runner.release.xcconfig */, - CF3DC413E242DB747F1A27C3 /* Pods-Runner.profile.xcconfig */, - D51EC220C03C73DE33621091 /* Pods-RunnerTests.debug.xcconfig */, - 7620E88D08B8BDBA8A156E5A /* Pods-RunnerTests.release.xcconfig */, - 669C4A4209C8AA9C2A4E1EF6 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - DC705E6385CFCEC52BABE54E /* [CP] Check Pods Manifest.lock */, + 7E4B580A265C6F44F99FF718 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - CDFE8E31CEDD3DF5E4C7D568 /* Frameworks */, + 940D3C4C6DD542413E14FFBD /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 3B5BCAF5D6A0771F3ECE5763 /* [CP] Check Pods Manifest.lock */, + CF9215DAB0314651DACBA279 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 7DDCD63F73F20B2D2C31DC11 /* [CP] Embed Pods Frameworks */, + DEF0130752E58C6B1DAAA7EE /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,7 +286,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3B5BCAF5D6A0771F3ECE5763 /* [CP] Check Pods Manifest.lock */ = { + 7E4B580A265C6F44F99FF718 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -301,30 +301,13 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 7DDCD63F73F20B2D2C31DC11 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -340,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - DC705E6385CFCEC52BABE54E /* [CP] Check Pods Manifest.lock */ = { + CF9215DAB0314651DACBA279 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -355,13 +338,30 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + DEF0130752E58C6B1DAAA7EE /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -416,6 +416,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -445,6 +446,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -469,13 +471,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 5Q9F367K9K; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -485,14 +488,14 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D51EC220C03C73DE33621091 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CFC3FEF6AFF3650E4EE6A41D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -503,14 +506,14 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7620E88D08B8BDBA8A156E5A /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 9DD762FA5857F2B531FF16E5 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -519,14 +522,14 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 669C4A4209C8AA9C2A4E1EF6 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = DD86B4B806817CB345ACF05D /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -537,6 +540,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -566,6 +570,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -592,6 +597,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -621,6 +627,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -647,13 +654,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 5Q9F367K9K; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -669,13 +677,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 5Q9F367K9K; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift index b63630348..626664468 100644 --- a/example/ios/Runner/AppDelegate.swift +++ b/example/ios/Runner/AppDelegate.swift @@ -1,5 +1,5 @@ -import UIKit import Flutter +import UIKit @main @objc class AppDelegate: FlutterAppDelegate { diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index c2822be9e..2636dbfb2 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Example + Flutter Quill Example CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - example + flutter_quill_example CFBundlePackageType APPL CFBundleShortVersionString @@ -45,13 +45,13 @@ UIApplicationSupportsIndirectInputEvents - NSPhotoLibraryUsageDescription - We need permission to the photo library in order for inserting images in the text editor NSCameraUsageDescription - We need permission to the camera in order for takeing a photos and record videos in the text editor + Used to demonstrate flutter_quill package NSMicrophoneUsageDescription - We don't really need that permission + Used to capture audio for flutter_quill package + NSPhotoLibraryUsageDescription + Used to demonstrate flutter_quill package NSPhotoLibraryAddUsageDescription - We need this permission for saving the images in the editor + Used to demonstrate flutter_quill package diff --git a/example/lib/assets.dart b/example/lib/assets.dart new file mode 100644 index 000000000..36ca565bb --- /dev/null +++ b/example/lib/assets.dart @@ -0,0 +1,4 @@ +const kScreenshot1 = 'assets/images/screenshot_1.png'; +const kScreenshot2 = 'assets/images/screenshot_2.png'; +const kScreenshot3 = 'assets/images/screenshot_3.png'; +const kScreenshot4 = 'assets/images/screenshot_4.png'; diff --git a/example/lib/custom_toolbar.dart b/example/lib/custom_toolbar.dart new file mode 100644 index 000000000..5b308ac58 --- /dev/null +++ b/example/lib/custom_toolbar.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; + +/// Custom toolbar that uses the buttons of [`flutter_quill`](https://pub.dev/packages/flutter_quill). +/// +/// See also: [Custom toolbar](https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md). +class CustomToolbar extends StatelessWidget { + const CustomToolbar({super.key, required this.controller}); + + final QuillController controller; + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Wrap( + children: [ + QuillToolbarHistoryButton( + isUndo: true, + controller: controller, + ), + QuillToolbarHistoryButton( + isUndo: false, + controller: controller, + ), + QuillToolbarToggleStyleButton( + options: const QuillToolbarToggleStyleButtonOptions(), + controller: controller, + attribute: Attribute.bold, + ), + QuillToolbarToggleStyleButton( + options: const QuillToolbarToggleStyleButtonOptions(), + controller: controller, + attribute: Attribute.italic, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.underline, + ), + QuillToolbarClearFormatButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarImageButton( + controller: controller, + ), + QuillToolbarCameraButton( + controller: controller, + ), + QuillToolbarVideoButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarColorButton( + controller: controller, + isBackground: false, + ), + QuillToolbarColorButton( + controller: controller, + isBackground: true, + ), + const VerticalDivider(), + QuillToolbarSelectHeaderStyleDropdownButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarSelectLineHeightStyleDropdownButton( + controller: controller, + ), + const VerticalDivider(), + QuillToolbarToggleCheckListButton( + controller: controller, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.ol, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.ul, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.inlineCode, + ), + QuillToolbarToggleStyleButton( + controller: controller, + attribute: Attribute.blockQuote, + ), + QuillToolbarIndentButton( + controller: controller, + isIncrease: true, + ), + QuillToolbarIndentButton( + controller: controller, + isIncrease: false, + ), + const VerticalDivider(), + QuillToolbarLinkStyleButton(controller: controller), + ], + ), + ); + } +} diff --git a/example/lib/extensions/scaffold_messenger.dart b/example/lib/extensions/scaffold_messenger.dart deleted file mode 100644 index c46783dec..000000000 --- a/example/lib/extensions/scaffold_messenger.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/material.dart' - show ScaffoldMessenger, ScaffoldMessengerState, SnackBar; -import 'package:flutter/widgets.dart' show BuildContext, Text; - -extension ScaffoldMessengerStateExt on ScaffoldMessengerState { - void showText(String text) { - showSnackBar(SnackBar(content: Text(text))); - } -} - -extension BuildContextExt on BuildContext { - ScaffoldMessengerState get messenger => ScaffoldMessenger.of(this); -} diff --git a/example/lib/gen/assets.gen.dart b/example/lib/gen/assets.gen.dart deleted file mode 100644 index 3075816eb..000000000 --- a/example/lib/gen/assets.gen.dart +++ /dev/null @@ -1,114 +0,0 @@ -/// GENERATED CODE - DO NOT MODIFY BY HAND -/// ***************************************************** -/// FlutterGen -/// ***************************************************** - -// coverage:ignore-file -// ignore_for_file: type=lint -// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use - -import 'package:flutter/widgets.dart'; - -class $AssetsImagesGen { - const $AssetsImagesGen(); - - /// File path: assets/images/screenshot_1.png - AssetGenImage get screenshot1 => - const AssetGenImage('assets/images/screenshot_1.png'); - - /// File path: assets/images/screenshot_2.png - AssetGenImage get screenshot2 => - const AssetGenImage('assets/images/screenshot_2.png'); - - /// File path: assets/images/screenshot_3.png - AssetGenImage get screenshot3 => - const AssetGenImage('assets/images/screenshot_3.png'); - - /// File path: assets/images/screenshot_4.png - AssetGenImage get screenshot4 => - const AssetGenImage('assets/images/screenshot_4.png'); - - /// List of all assets - List get values => - [screenshot1, screenshot2, screenshot3, screenshot4]; -} - -class Assets { - Assets._(); - - static const $AssetsImagesGen images = $AssetsImagesGen(); -} - -class AssetGenImage { - const AssetGenImage(this._assetName); - - final String _assetName; - - Image image({ - Key? key, - AssetBundle? bundle, - ImageFrameBuilder? frameBuilder, - ImageErrorWidgetBuilder? errorBuilder, - String? semanticLabel, - bool excludeFromSemantics = false, - double? scale, - double? width, - double? height, - Color? color, - Animation? opacity, - BlendMode? colorBlendMode, - BoxFit? fit, - AlignmentGeometry alignment = Alignment.center, - ImageRepeat repeat = ImageRepeat.noRepeat, - Rect? centerSlice, - bool matchTextDirection = false, - bool gaplessPlayback = false, - bool isAntiAlias = false, - String? package, - FilterQuality filterQuality = FilterQuality.low, - int? cacheWidth, - int? cacheHeight, - }) { - return Image.asset( - _assetName, - key: key, - bundle: bundle, - frameBuilder: frameBuilder, - errorBuilder: errorBuilder, - semanticLabel: semanticLabel, - excludeFromSemantics: excludeFromSemantics, - scale: scale, - width: width, - height: height, - color: color, - opacity: opacity, - colorBlendMode: colorBlendMode, - fit: fit, - alignment: alignment, - repeat: repeat, - centerSlice: centerSlice, - matchTextDirection: matchTextDirection, - gaplessPlayback: gaplessPlayback, - isAntiAlias: isAntiAlias, - package: package, - filterQuality: filterQuality, - cacheWidth: cacheWidth, - cacheHeight: cacheHeight, - ); - } - - ImageProvider provider({ - AssetBundle? bundle, - String? package, - }) { - return AssetImage( - _assetName, - bundle: bundle, - package: package, - ); - } - - String get path => _assetName; - - String get keyName => _assetName; -} diff --git a/example/lib/gen/fonts.gen.dart b/example/lib/gen/fonts.gen.dart deleted file mode 100644 index 5a0580f1b..000000000 --- a/example/lib/gen/fonts.gen.dart +++ /dev/null @@ -1,36 +0,0 @@ -/// GENERATED CODE - DO NOT MODIFY BY HAND -/// ***************************************************** -/// FlutterGen -/// ***************************************************** - -// coverage:ignore-file -// ignore_for_file: type=lint -// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use - -class FontFamily { - FontFamily._(); - - /// Font family: ibarra-real-nova - static const String ibarraRealNova = 'ibarra-real-nova'; - - /// Font family: monospace - static const String monospace = 'monospace'; - - /// Font family: nunito - static const String nunito = 'nunito'; - - /// Font family: pacifico - static const String pacifico = 'pacifico'; - - /// Font family: roboto-mono - static const String robotoMono = 'roboto-mono'; - - /// Font family: sans-serif - static const String sansSerif = 'sans-serif'; - - /// Font family: serif - static const String serif = 'serif'; - - /// Font family: square-peg - static const String squarePeg = 'square-peg'; -} diff --git a/example/lib/main.dart b/example/lib/main.dart index 27e107671..27e922e3a 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,162 +1,221 @@ +import 'dart:convert'; +import 'dart:io' as io show Directory, File; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_localizations/flutter_localizations.dart' - show - GlobalCupertinoLocalizations, - GlobalMaterialLocalizations, - GlobalWidgetsLocalizations; -import 'package:flutter_quill/flutter_quill.dart' show Document; -import 'package:flutter_quill/translations.dart' show FlutterQuillLocalizations; - -import 'screens/home/widgets/home_screen.dart'; -import 'screens/quill/quill_screen.dart'; -import 'screens/quill/samples/quill_default_sample.dart'; -import 'screens/quill/samples/quill_images_sample.dart'; -import 'screens/quill/samples/quill_text_sample.dart'; -import 'screens/quill/samples/quill_videos_sample.dart'; -import 'screens/settings/cubit/settings_cubit.dart'; -import 'screens/settings/widgets/settings_screen.dart'; - -void main() async { - WidgetsFlutterBinding.ensureInitialized(); - runApp(const MyApp()); -} +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_quill_example/quill_delta_sample.dart'; +import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; +import 'package:path/path.dart' as path; -class MyApp extends StatelessWidget { - const MyApp({super.key}); +void main() => runApp(const MainApp()); + +class MainApp extends StatelessWidget { + const MainApp({super.key}); @override Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => SettingsCubit(), - ), + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData.light(useMaterial3: true), + darkTheme: ThemeData.dark(useMaterial3: true), + themeMode: ThemeMode.system, + home: HomePage(), + localizationsDelegates: [ + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + FlutterQuillLocalizations.delegate, ], - child: BlocBuilder( - builder: (context, state) { - return MaterialApp( - title: 'Flutter Quill Demo', - theme: ThemeData( - useMaterial3: true, - visualDensity: VisualDensity.adaptivePlatformDensity, - colorScheme: ColorScheme.fromSeed( - brightness: Brightness.light, - seedColor: Colors.red, - ), - ), - darkTheme: ThemeData( - useMaterial3: true, - visualDensity: VisualDensity.adaptivePlatformDensity, - colorScheme: ColorScheme.fromSeed( - brightness: Brightness.dark, - seedColor: Colors.red, - ), - ), - themeMode: state.themeMode, - debugShowCheckedModeBanner: false, - localizationsDelegates: const [ - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - // Uncomment this line to use provide flutter quill localizations - // in your widgets app, otherwise the quill widgets will provide it - // internally: - // FlutterQuillLocalizations.delegate, - ], - supportedLocales: FlutterQuillLocalizations.supportedLocales, - routes: { - SettingsScreen.routeName: (context) => const SettingsScreen(), - }, - onGenerateRoute: (settings) { - final name = settings.name; - if (name == HomeScreen.routeName) { - return MaterialPageRoute( - builder: (context) { - return const HomeScreen(); - }, - ); - } - if (name == QuillScreen.routeName) { - return MaterialPageRoute( - builder: (context) { - final args = settings.arguments as QuillScreenArgs; - return QuillScreen( - args: args, - ); - }, - ); - } - return null; + ); + } +} + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + final QuillController _controller = () { + return QuillController.basic( + config: QuillControllerConfig( + clipboardConfig: QuillClipboardConfig( + enableExternalRichPaste: true, + onImagePaste: (imageBytes) async { + if (kIsWeb) { + // Dart IO is unsupported on the web. + return null; + } + // Save the image somewhere and return the image URL that will be + // stored in the Quill Delta JSON (the document). + final newFileName = + 'image-file-${DateTime.now().toIso8601String()}.png'; + final newPath = path.join( + io.Directory.systemTemp.path, + newFileName, + ); + final file = await io.File( + newPath, + ).writeAsBytes(imageBytes, flush: true); + return file.path; + }, + ), + )); + }(); + final FocusNode _editorFocusNode = FocusNode(); + final ScrollController _editorScrollController = ScrollController(); + + @override + void initState() { + super.initState(); + // Load document + _controller.document = Document.fromJson(kQuillDefaultSample); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Flutter Quill Example'), + actions: [ + IconButton( + icon: const Icon(Icons.output), + tooltip: 'Print Delta JSON to log', + onPressed: () { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('This is a snackbar'))); }, - onUnknownRoute: (settings) { - return MaterialPageRoute( - builder: (context) => Scaffold( - appBar: AppBar( - title: const Text('Not found'), + ), + ], + ), + body: SafeArea( + child: Column( + children: [ + QuillSimpleToolbar( + controller: _controller, + config: QuillSimpleToolbarConfig( + embedButtons: FlutterQuillEmbeds.toolbarButtons(), + showClipboardCopy: false, + showClipboardCut: false, + showClipboardPaste: true, + customButtons: [ + QuillToolbarCustomButtonOptions( + icon: const Icon(Icons.add_alarm_rounded), + onPressed: () { + _controller.document.insert( + _controller.selection.extentOffset, + TimeStampEmbed( + DateTime.now().toString(), + ), + ); + + _controller.updateSelection( + TextSelection.collapsed( + offset: _controller.selection.extentOffset + 1, + ), + ChangeSource.local, + ); + }, + ), + ], + buttonOptions: QuillSimpleToolbarButtonOptions( + base: QuillToolbarBaseButtonOptions( + afterButtonPressed: () { + final isDesktop = { + TargetPlatform.linux, + TargetPlatform.windows, + TargetPlatform.macOS + }.contains(defaultTargetPlatform); + if (isDesktop) { + _editorFocusNode.requestFocus(); + } + }, ), - body: const Text('404'), ), - ); - }, - home: Builder( - builder: (context) { - final screen = switch (state.defaultScreen) { - DefaultScreen.home => const HomeScreen(), - DefaultScreen.settings => const SettingsScreen(), - DefaultScreen.imagesSample => QuillScreen( - args: QuillScreenArgs( - document: Document.fromJson(quillImagesSample), - ), - ), - DefaultScreen.videosSample => QuillScreen( - args: QuillScreenArgs( - document: Document.fromJson(quillVideosSample), - ), - ), - DefaultScreen.textSample => QuillScreen( - args: QuillScreenArgs( - document: Document.fromJson(quillTextSample), - ), - ), - DefaultScreen.emptySample => QuillScreen( - args: QuillScreenArgs( - document: Document(), + ), + ), + Expanded( + child: QuillEditor( + focusNode: _editorFocusNode, + scrollController: _editorScrollController, + controller: _controller, + config: QuillEditorConfig( + placeholder: 'Start writing your notes...', + padding: const EdgeInsets.all(16), + embedBuilders: [ + ...FlutterQuillEmbeds.editorBuilders( + imageEmbedConfig: QuillEditorImageEmbedConfig( + imageProviderBuilder: (context, imageUrl) { + // https://pub.dev/packages/flutter_quill_extensions#-image-assets + if (imageUrl.startsWith('assets/')) { + return AssetImage(imageUrl); + } + return null; + }, ), - ), - DefaultScreen.defaultSample => QuillScreen( - args: QuillScreenArgs( - document: Document.fromJson(quillDefaultSample), + videoEmbedConfig: QuillEditorVideoEmbedConfig( + customVideoBuilder: (videoUrl, readOnly) { + // To load YouTube videos https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.0 + return null; + }, ), ), - }; - return AnimatedSwitcher( - duration: const Duration(milliseconds: 330), - transitionBuilder: (child, animation) { - // This animation is from flutter.dev example - const begin = Offset(0, 1); - const end = Offset.zero; - const curve = Curves.ease; - - final tween = Tween( - begin: begin, - end: end, - ).chain( - CurveTween(curve: curve), - ); - - return SlideTransition( - position: animation.drive(tween), - child: child, - ); - }, - child: screen, - ); - }, + TimeStampEmbedBuilder(), + ], + ), + ), ), - ); - }, + ], + ), ), ); } + + @override + void dispose() { + _controller.dispose(); + _editorScrollController.dispose(); + _editorFocusNode.dispose(); + super.dispose(); + } +} + +class TimeStampEmbed extends Embeddable { + const TimeStampEmbed( + String value, + ) : super(timeStampType, value); + + static const String timeStampType = 'timeStamp'; + + static TimeStampEmbed fromDocument(Document document) => + TimeStampEmbed(jsonEncode(document.toDelta().toJson())); + + Document get document => Document.fromJson(jsonDecode(data)); +} + +class TimeStampEmbedBuilder extends EmbedBuilder { + @override + String get key => 'timeStamp'; + + @override + String toPlainText(Embed node) { + return node.value.data; + } + + @override + Widget build( + BuildContext context, + EmbedContext embedContext, + ) { + return Row( + children: [ + const Icon(Icons.access_time_rounded), + Text(embedContext.node.value.data as String), + ], + ); + } } diff --git a/example/lib/screens/quill/samples/quill_default_sample.dart b/example/lib/quill_delta_sample.dart similarity index 96% rename from example/lib/screens/quill/samples/quill_default_sample.dart rename to example/lib/quill_delta_sample.dart index 618775cfc..616ac8453 100644 --- a/example/lib/screens/quill/samples/quill_default_sample.dart +++ b/example/lib/quill_delta_sample.dart @@ -1,8 +1,8 @@ -import '../../../gen/assets.gen.dart'; +import 'package:flutter_quill_example/assets.dart'; -final quillDefaultSample = [ +const kQuillDefaultSample = [ { - 'insert': {'image': Assets.images.screenshot1.path}, + 'insert': {'image': kScreenshot2}, 'attributes': { 'width': '100', 'height': '100', @@ -284,7 +284,7 @@ final quillDefaultSample = [ { 'insert': { 'image': - 'https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png' + 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg' }, 'attributes': { 'width': '230', diff --git a/example/lib/screens/home/widgets/example_item.dart b/example/lib/screens/home/widgets/example_item.dart deleted file mode 100644 index 5c1badd39..000000000 --- a/example/lib/screens/home/widgets/example_item.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; - -class HomeScreenExampleItem extends StatelessWidget { - const HomeScreenExampleItem({ - required this.title, - required this.icon, - required this.text, - required this.onPressed, - super.key, - }); - final String title; - final Widget icon; - final String text; - final VoidCallback onPressed; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - SizedBox( - height: 200, - width: double.infinity, - child: GestureDetector( - onTap: onPressed, - child: Card( - child: SingleChildScrollView( - child: Column( - children: [ - const SizedBox(height: 2), - Text( - title, - style: Theme.of(context).textTheme.titleLarge, - ), - const SizedBox(height: 8), - icon, - const SizedBox(height: 8), - Padding( - padding: const EdgeInsets.all(8), - child: Text( - text, - style: Theme.of(context).textTheme.bodyMedium, - ), - ), - ], - ), - ), - ), - ), - ), - ], - ); - } -} diff --git a/example/lib/screens/home/widgets/home_screen.dart b/example/lib/screens/home/widgets/home_screen.dart deleted file mode 100644 index c75a6e514..000000000 --- a/example/lib/screens/home/widgets/home_screen.dart +++ /dev/null @@ -1,201 +0,0 @@ -import 'dart:convert' show jsonDecode; - -import 'package:cross_file/cross_file.dart'; -import 'package:file_picker/file_picker.dart' show FilePicker, FileType; -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; - -import '../../../extensions/scaffold_messenger.dart'; -import '../../quill/quill_screen.dart'; -import '../../quill/samples/quill_default_sample.dart'; -import '../../quill/samples/quill_images_sample.dart'; -import '../../quill/samples/quill_text_sample.dart'; -import '../../quill/samples/quill_videos_sample.dart'; - -import '../../settings/widgets/settings_screen.dart'; -import 'example_item.dart'; - -class HomeScreen extends StatefulWidget { - const HomeScreen({super.key}); - - static const routeName = '/home'; - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - @override - void dispose() { - // ignore: deprecated_member_use - SpellCheckerServiceProvider.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Flutter Quill Demo'), - ), - drawer: Drawer( - child: ListView( - children: [ - const DrawerHeader( - child: Text( - 'Flutter Quill Demo', - ), - ), - ListTile( - title: const Text('Settings'), - leading: const Icon(Icons.settings), - onTap: () { - Navigator.of(context) - ..pop() - ..pushNamed(SettingsScreen.routeName); - }, - ), - ], - ), - ), - body: SafeArea( - child: Column( - children: [ - SizedBox( - width: double.infinity, - child: Text( - 'Welcome to Flutter Quill Demo!', - style: Theme.of(context).textTheme.titleLarge, - textAlign: TextAlign.center, - ), - ), - Expanded( - child: ListView( - padding: const EdgeInsets.all(16), - children: [ - HomeScreenExampleItem( - title: 'Default', - icon: const Icon( - Icons.home, - size: 50, - ), - text: - 'If you want to see how the editor work with default content, ' - 'see any samples or you are working on it', - onPressed: () => Navigator.of(context).pushNamed( - QuillScreen.routeName, - arguments: QuillScreenArgs( - document: Document.fromJson(quillDefaultSample), - ), - ), - ), - const SizedBox(height: 4), - HomeScreenExampleItem( - title: 'Images', - icon: const Icon( - Icons.image, - size: 50, - ), - text: 'If you want to see how the editor work with images, ' - 'see any samples or you are working on it', - onPressed: () => Navigator.of(context).pushNamed( - QuillScreen.routeName, - arguments: QuillScreenArgs( - document: Document.fromJson(quillImagesSample), - ), - ), - ), - const SizedBox(height: 4), - HomeScreenExampleItem( - title: 'Videos', - icon: const Icon( - Icons.video_chat, - size: 50, - ), - text: 'If you want to see how the editor work with videos, ' - 'see any samples or you are working on it', - onPressed: () => Navigator.of(context).pushNamed( - QuillScreen.routeName, - arguments: QuillScreenArgs( - document: Document.fromJson(quillVideosSample), - ), - ), - ), - HomeScreenExampleItem( - title: 'Text', - icon: const Icon( - Icons.edit_document, - size: 50, - ), - text: 'If you want to see how the editor work with text, ' - 'see any samples or you are working on it', - onPressed: () => Navigator.of(context).pushNamed( - QuillScreen.routeName, - arguments: QuillScreenArgs( - document: Document.fromJson(quillTextSample), - ), - ), - ), - HomeScreenExampleItem( - title: 'Open a document by delta json', - icon: const Icon( - Icons.file_copy, - size: 50, - ), - text: 'If you want to load a document by delta json file', - onPressed: () async { - final scaffoldMessenger = ScaffoldMessenger.of(context); - final navigator = Navigator.of(context); - try { - final result = await FilePicker.platform.pickFiles( - dialogTitle: 'Pick json delta', - type: FileType.custom, - allowedExtensions: ['json'], - allowMultiple: false, - ); - final file = result?.files.firstOrNull; - final filePath = file?.path; - if (file == null || filePath == null) { - return; - } - final jsonString = await XFile(filePath).readAsString(); - - navigator.pushNamed( - QuillScreen.routeName, - arguments: QuillScreenArgs( - document: Document.fromJson(jsonDecode(jsonString)), - ), - ); - } catch (e) { - debugPrint( - 'Error while loading json delta file: ${e.toString()}', - ); - scaffoldMessenger.showText( - 'Error while loading json delta file: ${e.toString()}', - ); - } - }, - ), - HomeScreenExampleItem( - title: 'Empty', - icon: const Icon( - Icons.insert_drive_file, - size: 50, - ), - text: 'Want start clean? be my guest', - onPressed: () => Navigator.of(context).pushNamed( - QuillScreen.routeName, - arguments: QuillScreenArgs( - document: Document(), - ), - ), - ), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/example/lib/screens/quill/embeds/timestamp_embed.dart b/example/lib/screens/quill/embeds/timestamp_embed.dart deleted file mode 100644 index bffe16c64..000000000 --- a/example/lib/screens/quill/embeds/timestamp_embed.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'dart:convert' show jsonDecode, jsonEncode; - -import 'package:flutter/material.dart' show Icons; -import 'package:flutter/widgets.dart'; -import 'package:flutter_quill/flutter_quill.dart'; - -class TimeStampEmbed extends Embeddable { - const TimeStampEmbed( - String value, - ) : super(timeStampType, value); - - static const String timeStampType = 'timeStamp'; - - static TimeStampEmbed fromDocument(Document document) => - TimeStampEmbed(jsonEncode(document.toDelta().toJson())); - - Document get document => Document.fromJson(jsonDecode(data)); -} - -class TimeStampEmbedBuilderWidget extends EmbedBuilder { - @override - String get key => 'timeStamp'; - - @override - String toPlainText(Embed node) { - return node.value.data; - } - - @override - Widget build( - BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, - ) { - return Row( - children: [ - const Icon(Icons.access_time_rounded), - Text(node.value.data as String), - ], - ); - } -} diff --git a/example/lib/screens/quill/my_quill_editor.dart b/example/lib/screens/quill/my_quill_editor.dart deleted file mode 100644 index c9fb632c8..000000000 --- a/example/lib/screens/quill/my_quill_editor.dart +++ /dev/null @@ -1,170 +0,0 @@ -import 'dart:io' as io show Directory, File; - -import 'package:cached_network_image/cached_network_image.dart' - show CachedNetworkImageProvider; -import 'package:desktop_drop/desktop_drop.dart' show DropTarget; -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:flutter_quill/flutter_quill_internal.dart'; -import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; -// ignore: implementation_imports -import 'package:flutter_quill_extensions/src/editor/image/widgets/image.dart' - show getImageProviderByImageSource, imageFileExtensions; -import 'package:path/path.dart' as path; - -import '../../extensions/scaffold_messenger.dart'; -import 'embeds/timestamp_embed.dart'; - -class MyQuillEditor extends StatelessWidget { - const MyQuillEditor({ - required this.controller, - required this.configurations, - required this.scrollController, - required this.focusNode, - super.key, - }); - - final QuillController controller; - final QuillEditorConfigurations configurations; - final ScrollController scrollController; - final FocusNode focusNode; - - @override - Widget build(BuildContext context) { - final defaultTextStyle = DefaultTextStyle.of(context); - return QuillEditor( - scrollController: scrollController, - focusNode: focusNode, - controller: controller, - configurations: configurations.copyWith( - elementOptions: const QuillEditorElementOptions( - codeBlock: QuillEditorCodeBlockElementOptions( - enableLineNumbers: true, - ), - orderedList: QuillEditorOrderedListElementOptions(), - unorderedList: QuillEditorUnOrderedListElementOptions( - useTextColorForDot: true, - ), - ), - customStyles: DefaultStyles( - h1: DefaultTextBlockStyle( - defaultTextStyle.style.copyWith( - fontSize: 32, - height: 1.15, - fontWeight: FontWeight.w300, - ), - HorizontalSpacing.zero, - const VerticalSpacing(16, 0), - VerticalSpacing.zero, - null, - ), - sizeSmall: defaultTextStyle.style.copyWith(fontSize: 9), - ), - scrollable: true, - placeholder: 'Start writing your notes...', - padding: const EdgeInsets.all(16), - onImagePaste: (imageBytes) async { - if (kIsWeb) { - return null; - } - // We will save it to system temporary files - final newFileName = - 'imageFile-${DateTime.now().toIso8601String()}.png'; - final newPath = path.join( - io.Directory.systemTemp.path, - newFileName, - ); - final file = await io.File( - newPath, - ).writeAsBytes(imageBytes, flush: true); - return file.path; - }, - onGifPaste: (gifBytes) async { - if (kIsWeb) { - return null; - } - // We will save it to system temporary files - final newFileName = 'gifFile-${DateTime.now().toIso8601String()}.gif'; - final newPath = path.join( - io.Directory.systemTemp.path, - newFileName, - ); - final file = await io.File( - newPath, - ).writeAsBytes(gifBytes, flush: true); - return file.path; - }, - embedBuilders: [ - ...(kIsWeb - ? FlutterQuillEmbeds.editorWebBuilders() - : FlutterQuillEmbeds.editorBuilders( - imageEmbedConfigurations: QuillEditorImageEmbedConfigurations( - imageErrorWidgetBuilder: (context, error, stackTrace) { - return Text( - 'Error while loading an image: ${error.toString()}', - ); - }, - imageProviderBuilder: (context, imageUrl) { - // cached_network_image is supported - // only for Android, iOS and web - - // We will use it only if image from network - if (isAndroidApp || isIosApp || kIsWeb) { - if (isHttpBasedUrl(imageUrl)) { - return CachedNetworkImageProvider( - imageUrl, - ); - } - } - return getImageProviderByImageSource( - imageUrl, - imageProviderBuilder: null, - context: context, - assetsPrefix: QuillSharedExtensionsConfigurations.get( - context: context) - .assetsPrefix, - ); - }, - ), - videoEmbedConfigurations: QuillEditorVideoEmbedConfigurations( - customVideoBuilder: (videoUrl, readOnly) { - // Example: Check for YouTube Video URL and return your - // YouTube video widget here. - - // Otherwise return null to fallback to the defualt logic - return null; - }, - ignoreYouTubeSupport: true, - ), - )), - TimeStampEmbedBuilderWidget(), - ], - builder: (context, rawEditor) { - // The `desktop_drop` plugin doesn't support iOS platform for now - if (isIosApp) { - return rawEditor; - } - return DropTarget( - onDragDone: (details) { - final scaffoldMessenger = ScaffoldMessenger.of(context); - final file = details.files.first; - final isSupported = imageFileExtensions.any(file.name.endsWith); - if (!isSupported) { - scaffoldMessenger.showText( - 'Only images are supported right now: ${file.mimeType}, ${file.name}, ${file.path}, $imageFileExtensions', - ); - return; - } - context.requireQuillController.insertImageBlock( - imageSource: file.path, - ); - scaffoldMessenger.showText('Image is inserted.'); - }, - child: rawEditor, - ); - }, - ), - ); - } -} diff --git a/example/lib/screens/quill/my_quill_toolbar.dart b/example/lib/screens/quill/my_quill_toolbar.dart deleted file mode 100644 index ef13bd34d..000000000 --- a/example/lib/screens/quill/my_quill_toolbar.dart +++ /dev/null @@ -1,311 +0,0 @@ -import 'dart:io' as io show File; - -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:flutter_quill/flutter_quill_internal.dart'; -import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:image_cropper/image_cropper.dart'; -import 'package:path/path.dart' as path; -import 'package:path_provider/path_provider.dart' - show getApplicationDocumentsDirectory; - -import '../settings/cubit/settings_cubit.dart'; -import 'embeds/timestamp_embed.dart'; - -class MyQuillToolbar extends StatelessWidget { - const MyQuillToolbar({ - required this.controller, - required this.focusNode, - super.key, - }); - - final QuillController controller; - final FocusNode focusNode; - - Future onImageInsertWithCropping( - String image, - QuillController controller, - BuildContext context, - ) async { - final croppedFile = await ImageCropper().cropImage( - sourcePath: image, - uiSettings: [ - AndroidUiSettings( - toolbarTitle: 'Cropper', - aspectRatioPresets: [ - CropAspectRatioPreset.square, - CropAspectRatioPreset.ratio3x2, - CropAspectRatioPreset.original, - CropAspectRatioPreset.ratio4x3, - CropAspectRatioPreset.ratio16x9 - ], - toolbarColor: Colors.deepOrange, - toolbarWidgetColor: Colors.white, - initAspectRatio: CropAspectRatioPreset.original, - lockAspectRatio: false, - ), - IOSUiSettings( - title: 'Cropper', - aspectRatioPresets: [ - CropAspectRatioPreset.square, - CropAspectRatioPreset.ratio3x2, - CropAspectRatioPreset.original, - CropAspectRatioPreset.ratio4x3, - CropAspectRatioPreset.ratio16x9 - ], - ), - WebUiSettings( - context: context, - ), - ], - ); - final newImage = croppedFile?.path; - if (newImage == null) { - return; - } - if (kIsWeb) { - controller.insertImageBlock(imageSource: newImage); - return; - } - final newSavedImage = await saveImage(io.File(newImage)); - controller.insertImageBlock(imageSource: newSavedImage); - } - - Future onImageInsert(String image, QuillController controller) async { - if (kIsWeb || isHttpBasedUrl(image)) { - controller.insertImageBlock(imageSource: image); - return; - } - final newSavedImage = await saveImage(io.File(image)); - controller.insertImageBlock(imageSource: newSavedImage); - } - - /// For mobile platforms it will copies the picked file from temporary cache - /// to applications directory - /// - /// for desktop platforms, it will do the same but from user files this time - Future saveImage(io.File file) async { - final appDocDir = await getApplicationDocumentsDirectory(); - final fileExt = path.extension(file.path); - final newFileName = '${DateTime.now().toIso8601String()}$fileExt'; - final newPath = path.join( - appDocDir.path, - newFileName, - ); - final copiedFile = await file.copy(newPath); - return copiedFile.path; - } - - @override - Widget build(BuildContext context) { - return BlocBuilder( - buildWhen: (previous, current) => - previous.useCustomQuillToolbar != current.useCustomQuillToolbar, - builder: (context, state) { - if (state.useCustomQuillToolbar) { - // For more info - // https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md - return QuillToolbar( - configurations: const QuillToolbarConfigurations(), - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Wrap( - children: [ - IconButton( - onPressed: () => context - .read() - .updateSettings( - state.copyWith(useCustomQuillToolbar: false)), - icon: const Icon( - Icons.width_normal, - ), - ), - QuillToolbarHistoryButton( - isUndo: true, - controller: controller, - ), - QuillToolbarHistoryButton( - isUndo: false, - controller: controller, - ), - QuillToolbarToggleStyleButton( - options: const QuillToolbarToggleStyleButtonOptions(), - controller: controller, - attribute: Attribute.bold, - ), - QuillToolbarToggleStyleButton( - options: const QuillToolbarToggleStyleButtonOptions(), - controller: controller, - attribute: Attribute.italic, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.underline, - ), - QuillToolbarClearFormatButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarImageButton( - controller: controller, - ), - QuillToolbarCameraButton( - controller: controller, - ), - QuillToolbarVideoButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarColorButton( - controller: controller, - isBackground: false, - ), - QuillToolbarColorButton( - controller: controller, - isBackground: true, - ), - const VerticalDivider(), - QuillToolbarSelectHeaderStyleDropdownButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarSelectLineHeightStyleDropdownButton( - controller: controller, - ), - const VerticalDivider(), - QuillToolbarToggleCheckListButton( - controller: controller, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.ol, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.ul, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.inlineCode, - ), - QuillToolbarToggleStyleButton( - controller: controller, - attribute: Attribute.blockQuote, - ), - QuillToolbarIndentButton( - controller: controller, - isIncrease: true, - ), - QuillToolbarIndentButton( - controller: controller, - isIncrease: false, - ), - const VerticalDivider(), - QuillToolbarLinkStyleButton(controller: controller), - ], - ), - ), - ); - } - return QuillToolbar.simple( - controller: controller, - - /// configurations parameter: - /// Optional: if not provided will use the configuration set when the controller was instantiated. - /// Override: Provide parameter here to override the default configuration - useful if configuration will change. - configurations: QuillSimpleToolbarConfigurations( - showAlignmentButtons: true, - multiRowsDisplay: true, - fontFamilyValues: { - 'Amatic': GoogleFonts.amaticSc().fontFamily!, - 'Annie': GoogleFonts.annieUseYourTelescope().fontFamily!, - 'Formal': GoogleFonts.petitFormalScript().fontFamily!, - 'Roboto': GoogleFonts.roboto().fontFamily! - }, - fontSizesValues: const { - '14': '14.0', - '16': '16.0', - '18': '18.0', - '20': '20.0', - '22': '22.0', - '24': '24.0', - '26': '26.0', - '28': '28.0', - '30': '30.0', - '35': '35.0', - '40': '40.0' - }, - searchButtonType: SearchButtonType.modern, - customButtons: [ - QuillToolbarCustomButtonOptions( - icon: const Icon(Icons.add_alarm_rounded), - onPressed: () { - controller.document - .insert(controller.selection.extentOffset, '\n'); - controller.updateSelection( - TextSelection.collapsed( - offset: controller.selection.extentOffset + 1, - ), - ChangeSource.local, - ); - - controller.document.insert( - controller.selection.extentOffset, - TimeStampEmbed( - DateTime.now().toString(), - ), - ); - - controller.updateSelection( - TextSelection.collapsed( - offset: controller.selection.extentOffset + 1, - ), - ChangeSource.local, - ); - - controller.document - .insert(controller.selection.extentOffset, ' '); - controller.updateSelection( - TextSelection.collapsed( - offset: controller.selection.extentOffset + 1, - ), - ChangeSource.local, - ); - - controller.document - .insert(controller.selection.extentOffset, '\n'); - controller.updateSelection( - TextSelection.collapsed( - offset: controller.selection.extentOffset + 1, - ), - ChangeSource.local, - ); - }, - ), - QuillToolbarCustomButtonOptions( - icon: const Icon(Icons.dashboard_customize), - onPressed: () { - context.read().updateSettings( - state.copyWith(useCustomQuillToolbar: true)); - }, - ), - ], - embedButtons: FlutterQuillEmbeds.toolbarButtons( - imageButtonOptions: QuillToolbarImageButtonOptions( - imageButtonConfigurations: QuillToolbarImageConfigurations( - onImageInsertCallback: isAndroidApp || isIosApp || kIsWeb - ? (image, controller) => - onImageInsertWithCropping(image, controller, context) - : onImageInsert, - ), - ), - ), - ), - ); - }, - ); - } -} diff --git a/example/lib/screens/quill/quill_screen.dart b/example/lib/screens/quill/quill_screen.dart deleted file mode 100644 index acb3dffe4..000000000 --- a/example/lib/screens/quill/quill_screen.dart +++ /dev/null @@ -1,162 +0,0 @@ -import 'dart:convert' show jsonEncode; - -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:flutter_quill_extensions/flutter_quill_extensions.dart' - show FlutterQuillEmbeds, QuillSharedExtensionsConfigurations; -import 'package:share_plus/share_plus.dart' show Share; - -import '../../extensions/scaffold_messenger.dart'; -import '../../spell_checker/spell_checker.dart'; -import '../shared/widgets/home_screen_button.dart'; -import 'my_quill_editor.dart'; -import 'my_quill_toolbar.dart'; - -@immutable -class QuillScreenArgs { - const QuillScreenArgs({required this.document}); - - final Document document; -} - -class QuillScreen extends StatefulWidget { - const QuillScreen({ - required this.args, - super.key, - }); - - final QuillScreenArgs args; - - static const routeName = '/quill'; - - @override - State createState() => _QuillScreenState(); -} - -class _QuillScreenState extends State { - /// Instantiate the controller - final _controller = QuillController.basic(); - final _editorFocusNode = FocusNode(); - final _editorScrollController = ScrollController(); - var _isReadOnly = false; - var _isSpellcheckerActive = false; - - @override - void initState() { - super.initState(); - _controller.document = widget.args.document; - } - - @override - void dispose() { - _controller.dispose(); - _editorFocusNode.dispose(); - _editorScrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - _controller.readOnly = _isReadOnly; - if (!_isSpellcheckerActive) { - _isSpellcheckerActive = true; - SpellChecker.useSpellCheckerService( - Localizations.localeOf(context).languageCode); - } - return Scaffold( - appBar: AppBar( - title: const Text('Flutter Quill'), - actions: [ - IconButton( - tooltip: 'Spell-checker', - onPressed: () { - // ignore: deprecated_member_use - SpellCheckerServiceProvider.toggleState(); - setState(() {}); - }, - icon: Icon( - Icons.document_scanner, - // ignore: deprecated_member_use - color: SpellCheckerServiceProvider.isServiceActive() - ? Colors.red.withOpacity(0.5) - : null, - ), - ), - IconButton( - tooltip: 'Share', - onPressed: () { - final plainText = _controller.document.toPlainText( - FlutterQuillEmbeds.defaultEditorBuilders(), - ); - if (plainText.trim().isEmpty) { - ScaffoldMessenger.of(context).showText( - "We can't share empty document, please enter some text first", - ); - return; - } - Share.share(plainText); - }, - icon: const Icon(Icons.share), - ), - IconButton( - tooltip: 'Print to log', - onPressed: () { - debugPrint( - jsonEncode(_controller.document.toDelta().toJson()), - ); - ScaffoldMessenger.of(context).showText( - 'The quill delta json has been printed to the log.', - ); - }, - icon: const Icon(Icons.print), - ), - const HomeScreenButton(), - ], - ), - body: Column( - children: [ - if (!_isReadOnly) - MyQuillToolbar( - controller: _controller, - focusNode: _editorFocusNode, - ), - Builder( - builder: (context) { - return Expanded( - child: MyQuillEditor( - controller: _controller, - configurations: QuillEditorConfigurations( - characterShortcutEvents: standardCharactersShortcutEvents, - spaceShortcutEvents: standardSpaceShorcutEvents, - searchConfigurations: const QuillSearchConfigurations( - searchEmbedMode: SearchEmbedMode.plainText, - ), - sharedConfigurations: _sharedConfigurations, - ), - scrollController: _editorScrollController, - focusNode: _editorFocusNode, - ), - ); - }, - ), - ], - ), - floatingActionButton: FloatingActionButton( - child: Icon(!_isReadOnly ? Icons.lock : Icons.edit), - onPressed: () => setState(() => _isReadOnly = !_isReadOnly), - ), - ); - } - - QuillSharedConfigurations get _sharedConfigurations { - return const QuillSharedConfigurations( - // locale: Locale('en'), - extraConfigurations: { - QuillSharedExtensionsConfigurations.key: - QuillSharedExtensionsConfigurations( - assetsPrefix: 'assets', // Defaults to assets - ), - }, - ); - } -} diff --git a/example/lib/screens/quill/samples/quill_images_sample.dart b/example/lib/screens/quill/samples/quill_images_sample.dart deleted file mode 100644 index 7ba723b31..000000000 --- a/example/lib/screens/quill/samples/quill_images_sample.dart +++ /dev/null @@ -1,71 +0,0 @@ -import '../../../gen/assets.gen.dart'; - -final quillImagesSample = [ - {'insert': 'This is an asset image: \n'}, - {'insert': '\n'}, - { - 'insert': {'image': Assets.images.screenshot1.path}, - 'attributes': {'style': 'width: 40vh; height:350px; margin: 20px;'} - }, - {'insert': '\n'}, - {'insert': 'Here is a network image: \n'}, - {'insert': '\n'}, - { - 'insert': { - 'image': true - ? 'https://upload.wikimedia.org/wikipedia/commons/b/b6/Image_created_with_a_mobile_phone.png' - // TODO: Doesn't work on web, finds out why - // ignore: dead_code - : 'https://helpx.adobe.com/content/dam/help/en/photoshop/using/convert-color-image-black-white/jcr_content/main-pars/before_and_after/image-before/Landscape-Color.jpg' - }, - 'attributes': { - 'width': '250', - 'height': '250', - 'style': 'width:250px; height:250px;' - } - }, - {'insert': '\n'}, - {'insert': '\n'}, - { - 'insert': - '\nThe image above have 250px width and height in the css style attribute which will be used for web, and 100 width and height that is in the attributes which will be used for desktop and mobile\n' - }, - {'insert': '\n'}, - { - 'insert': { - 'image': - '/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBYWFRgWFRUYGRgaGBgYGhoYGBgaGhgYGBgaGRoaGBwcIS4lHB4rIRgYJjgmKy8xNTU1GiQ7QDszPy40NTEBDAwMEA8QHhISHjYkJCs0NDY2NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDY0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NP/AABEIALEBHQMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAAAwECBAUGB//EADkQAAEDAgMECAUEAgEFAAAAAAEAAhEDIQQxQRJRYXEFIlKBkaHR8BMUMpKxBmLB4ULxFSNTcoKy/8QAGQEAAwEBAQAAAAAAAAAAAAAAAAECAwQF/8QALBEAAgIBAwMDAwMFAAAAAAAAAAECESEDEjEEE0EiUWEUkaEFQnEVIzJSgf/aAAwDAQACEQMRAD8A+TseQpN10MRhHDNnG2ixERmFommaz05RdMvRiCD3KGUpMKWmcldpJysfymNU6GMoltyYniPwpczkfJUBn6s+Ofih7SDYqcmuEsLBDsONx9FmfSIW2lWj6itDgHCzxyMeR1RbXIu1GStcnKa4qWt1WmtRM6dxSmkixVowcWnTGPgwY4JlPDzeQBvKVKlgMyJQ0aJq8qxjxIIGnmsTwuiynORvySH0N+9JBOLeTLTNwVsfRsHaFIDIK30q7Q0sdkbtO47uRTeBacU7TwZDVgRqqHepqNl3imsp9XvhMVNuh+HEgjh/az1KUStNFhkAZgyr1GmTIzHkp4Zu47omN4BaL3iElqa9u5KGapGD5HFshIfktFHcqOYgJK1ZmhS0qXNVqQumjKslnsS015S4TG+SrwqkWTHBVcEEsoxspxsFNNh0HsqXsjNAVixGzK6WFbsQcoafNYmG40T31paecD1UtWaabUXYrEPkczKzhsprm2VC+ECbt2x9LE/+XirVagP0kcQshaQpISoruSqmSQRl4KzHb57lDHxvWho3T5ICKvgWDJzPemlh1mVX4aY185oLS9wps0KH0IyunhivVZZKzXZjJla+NEuJOa0ihItmqtokFO0Q4SxfAksK14XDTmmGNVJdIAGYRZpGEYu3kz4inExoYSmui575/K6TMPInyVquGaGzpqlfgrtN+pYOa9sxAPelOYVpa0tJbeFpp0AU7M9jkIwuGm58/wCEVeo4gQW5iOK14l+xZu6RwScMzbhuWg/vzQvcval6VyWwDuuHbuYCdiiCTExMzqTu5KcXR2C1g+odZ3hYK1KkC3NTjk3jFpPTOa+ne2SVVp3nRa8SyDAV6TAWOnfPkndKznencnEwMtdMYJlWNEjkmUYVMhRd0zDVaq0QnYkJTbBNGE1UijyrsbaUuJTn5QmSsiiqgKxCEyRzK2zlnP8ApJe6VRXSHbeC7W2JPD1VaTSfeQV3mx7o8FLGZjKw8SgpRyD2zkqupN3+Cs1si2iz1M1DLapcFmmc0MbHJUa5NaUyU7LVGRqDxCbQeB3pb3znf8qgJQXuUXaNNip+GlNctm1LRlMaT5pPBrGpcht2j+FQ3VXlRRdcfyihuWaY6ky8LUynNvBZ3G9vfehrzndQzaLSdF67IKZQbbcrE7Weau2mRCVmih6rXAtry0hVc8kxock0gG0KatMti3cFSYOLr4LYbCbTgHeJSq31m0AQO4WT2VpETBV6lPa628AH3vU27yabIyjUTDUp6xPFUw745rc2j1SLpDMMJmVUWZS0pJpo07W20PIuLHkq0KRBIBV8M/YJ/B13wtjmgwW5HPepbrB0RimrfPk5lTDEyTnuSmN2XQ+wIWikNp0HMT7CdicM0kck7rDMdm71ROdiARYXAy4hKczKE7EsLbbsuSJ6seCpcGMo3J2Z6tKVkqsW90xByWZzLxvKqJhqRRFLDHYL9xhKcF38RhtimG74PkuI5iIy3WVraHapPmhQbOSoWLbhmXuDAH+lmqG9lV5OZxxZnIVg1XayUx0JkJFWiZPJOpM2p4m/IKNieq3P8J9PqsIzvpGSiXBvpxzngQx+zI0IM/wsVXNNe8pClImc/CJhXaoa9MseCohEICtsHNDRGiodFgzJaGUjGnvcq0HgWcJB8uKY5kQJnOD7ySZrFJZK1WkC4SV12bIA2htNIAHWFjF1hq4W20zLmD+OSlM0np+UUY7Ja7EW9lYGv0hOpm9j4puIQnWDWam7vn0XQwtTaAkXGXsLl0XdbetzCBkBM2I3e96zlE7dGebbFOeWPuLTcLazZc4DaAERfPu3rFin3mb/AJVsMWky4kEZIatDjOpNeLNTsKAZE9xVWYgNgeI0jwVn4oCwOf53FVGH22yCJGlvGNVOa9Rs6v8At8j8RTBBdOYELNgLkx9Q0WukzZGzYgg7hHOLarDQGy8jI70ReGg1LUk6/kfVwpcXEC41Rh2FtnfTIGc+UBbMMyoTf6SDCc9jS2TbllPCMlDl4NVpJ+rhnCxDYeDMZ+/Na6WKcXfTtTYmMgq9I4cm4GXvNasBScGEbTTlkQfwSVo2nGzlhGS1XFY8nMxjNB7CzPqWjculjKUaQf4K5uzzTi8GWtBqTIgkC5KTk9vAhdLDt/aO9Z6jOsTG5WpGUtNqmdjpj6BG4fhee2F3cY8vptPALAGQMllo4R1dat8017IyYt4b1Wm035rCQn12GVWmxdEcI8qduVAynZVcxPcICq5ylyK7eBVNhBBORMKcTVnLkqPfKoQir5E5bVSEuUFqYWqibMKDZUwmQiEytpUEpnxJzUbKkNQNWXsck5rtPZWcNTBKdFpjHAxY23KaWKIscp00VFXYRVj3NO0aq8ZjXXLvWZ7NZlWAUtQo0De7kii4jVa2YrxWZwUBiGkxxlKOEbmO2hI8FRzt/wDrks7SU6m8ze6W00WpYmo4gxK34DFlptnHvvWasySltsbEEd/8hDimhRnKErTPSYfFMcQ2QHHKJA7wd6XisBBDjkezc9wWDBuBERff6LrPxQazYMHOSc44ELCUalg9OOvGcPUZamIa1ogm3+JPmpoVGPHWcZM2E7swuZiCCbJDHlpkEhadtNHM+rallWjqVq5HUfPppfgtuBwzXMlj+twtuXBq1HO6xJJOafgK7wYEj3qlKHpwEOoT1Latfk71TCy2XZ3EmMxoVi/407JLBN96s/H7DSJknfYepSMN0wWG3LK0ctVioS5R2S19JtKRjfIsQQQhhkR5r0FSm2o0HYAcdRMELmPwhHIajK/EJqSarhkvRae5O0Q1+0wNjXyUPa0y2chbitD6OwwkmIsD/iZ4ysNNhngBJPD3CItU6HqJ2k1yYK4lZnG601DJnjlqstYrTdg86cKbZDnKuatTpklMfSjNTuyPZJqxGyquTnMUFkK9xk4GchV2E5xVSEnJkbUP+Ej4S6LaKn5dPca9o5opKfhLpDDI+WT3i7LOcKasKa3/AC6t8snvH2mYRTU/CW8UEwUEbhrRZzhSR8FdIYZT8sjeHZZzfgqfhLpjDKlemGNLjojegek0rOd8NKfVa0wXCd2qw4npVzpDRsjK1z4rnc/evcpcznlJXg7jukGCZJJ4DNYqnSTjk0AeJWAqQJUObE5SkaW9JVBdro5AKW9JVZJ2iZEXgjwKQynKsKShyZSUvcsMbU7R7wPRWHSD5m3KLJfw1QsvmmpP3JcWb6PSejx3j0W3D9INNtqOdvNcEqQfeatTYlJxZ6Vjw+4O15pnwDuXmaFdzCHMMHf/AAdF6DorpX4jg14AJ1mJ7j/Ce9m+nOMnUuTp4LFuZbMbjuXZovY8yI2gL6G3fuuuY7DQhjSDr5rKUVLKPT0taWl6XlD+mLsERIzkZnS29c6oNmmLHrCSSD/AXcovEbTjJk2tPvJJxzWEWgxcczosVujivJ2PZO3aujy7i3Qgc80gtJPuy246BaPZSGUH5xA3n3daqR509P1Vz/A6kNgTqlCk5xlXpgzJPvlmnGTvjgIQmW43FLwZ30g3VZajwtb6RSvg3vbvVJnPOLeEqMoBOiNkrWSBkElz1VmLhR320kwUk8NRsrKzuUEJFJT8JODVcNRuL2Iz/CV20eCeGqwCW4agjP8ABV20Vpa1MYxTvKUEIZRVxh1paxPa0KXMtQRiGGXD/Vb9ilA2ZcYubxrsjU+q9UTC8r07+n31qwe02Ih0kAN2cgLE35FOEs5OfqYvY1FW2eNoYfavIA4mL896vTY3Xa2p1sLTY7jluyK19J4H4VQU3OB+klrZJAOgtnF0us9pAYGNadr6y51hFg4kx6Qt7PF206fJb5Zjg0M+oi7bkzJmd1t/DmodgjNhJuSGyYA4opS36QQf8ocC0gXaWunPPImy6FDFA5ghwjZAygznnfLzUSdG2nC2ZMPhSYjzGROXkt2G6P3tJMGwtaM76T70XQ6OwpfoLNbmf2mBnHGN67rOjn/WwbO1YBs2EDjf6fErmnq0enp9NFrJ4x+AOYBjfGmsCbhY34QlxGZgk7pE2nJe2xXRRaNghoJlwcbRAiAcrxPcRmVwK5DXdYDZl4dsF2RIkC/LXTxuGpZlraCStHIbgJbtSIAkxnESRB15bwlVmssG7rkTv1Ha4X5rdisS4kta3ZEnZJMGAZG1Ag6Wyk8Vz3tEFwIEQeses46xw9890zz5Roq2m1xMdUR/kbcp1N7WUYd5p1GmQNk65RN5ibJlaoHAkMa3KNkERGcifMDRJYxzyGtaS4mBxJ0GgVGfnB9FwzNtoMgjOQU8U4sAk9A9H/BotaSScyJEBxzA4LqFgsYWDlk9tJuKbVMzUuj3OvkE44BoF3SeY/2ukKzS2AALa71y6uHe6esO4yO9ZT1ZfwdWho6by2c/E4SnMwCdy5+JuYtbdl3+i67sEG5unjB9IhZ3YZgyI8D/AAs4ydndJQapHFdTJMD+/wCldlB+QHeuoKbNxPcU1j4yYfABa9w5Hp5wmckdHPO9NHQx1Hius2sRp5kqj8Q85DwB/JR3fYT6a8tHJqdFgZx4eqyuwrRu8l0q7ah/xPiFz6uHfOg7wtFqfJy6ug1wjrhymV4L5l/bf97vVW+Zf23/AHO9Vv2/k4F1vwe8EK0rwYxT+2/73eqn5h/bf9zvVLt/I/rfg94HKwevBDEP7b/ud6qRWf23fcfVHavyV9b8H0BhT2L50Kr+277irio/tu+4pdj5KXW/H5PpLGpwYvmjaj+077irNc/tO8Sk+mfuUusT8fk+h1EMavBsL+0fErSwP7R8SjsNeTWOvu8HqsZ0NSqElzGkkESBDoIjMXWEfpyiA1oaeqLHaJ33M2Jv7Fly2U37ynMpO3+f9JKDXkfbhJ24m6p+m2Cm9rHPbtCdluwZ2bgbJEG4GoJymMuTU/TdZjC8kFgkkWaQDHW2chraf8e5b2MO8+K00id6mUZe5UemjdrAdC9E1s2gggTcObIIiJI1BI7l9K/S9Sm1kPADg2OsADHhy8F4rCv4rH+puk3sbT2XES5wnhAXJKLUk0aa+lu06vB3+n8EatQ/CBa2HXuGxNxuPJeLxH6frPf1Wk3glwLQBlMuF9fpnK0r1tWuSIk2EBc6s528o0oy5NFoeja2cnD/AKJkzVqzlIa0HIW6zgbAzpuXQH6Pw4BGzY2zvG7az80qpUf2neJ9VlqV6vbf9x9V07ZPyYPpoR8Wdan+ksPLf+m3qgtGZEHtXvzK3N6Kp07Ma1utgBc8l5N9at23/e71SH4mt23/AHu9Udmb/cJbIu1Gv+HtPhDgoNMLwdTFVe2/7nLM/F1f+4/73Jrp5e5M+ogvDPoL3BuqyPxf7o7gvBvxVQ5vf9zvVKdXf23/AHFKXSSlywj1+nD9r+57l2Jn/I++QSDif3eX9rxJrv7bvuKoaz+277il9G15Kf6rDxF/c9yMUO049/oFLsUB7v5rwhxD+2/7iqnEP7bvuPqj6V+4f1WNf4v7nvDjkt+P9yvCmu/tu+4qhrO7bvuKpdJ8mcv1Vf6/k9nVxnELI7FDteS8r8V3bd4lRtu7R8SqXT15MpfqSf7SAphRKkLrPJRIClQFIKQ7LhWASw5WBTKTGNV2lKDlcP4popMe0+7JjZ9grMH8kxruCClI2Mf79haqT/c3XPY/mnMfzPc0pNG0NSjqNefYTw/n3gj+FzG1QNR9npATWVRw32MeAlZuJ0w1WdFtRWZVg5rnVcaxou4bjtTPJcut02BIYO/RZSRu+ohHlntaFfiPfJcL9Y4jq094c7/5/pcB3T1XQgeKyYjGvfG07ai91nsd2yNXrISg4xu2fTqWJlufvuUPfx/C+d0um6rRAdI4ick6n+pKwN4I7wlGDRquv0ms2e0quWJ9T37C49L9SNdZwLcr3PO6eMe1ws6Z4wDP/tc8FrFe4pdTCS9LNb38/NJqP3z3gDzssz6w48QAe7MpT38PJoWyic09Zk1X8vH+1me/3f0Uvefdx+El7/crRI5ZTshx95Jbioc/kluf7ugyciSqFBcqEoJskqpCC5VlImwIUEIJUFAmyFBUyhBJEoUBSEASrBVlUNYBJtIBwUrK6uVRzydVLkh2bC8DVHzLd/ksKEbmG42nFN4o+cHZKxIRuYbmbh0h+3zTG9KftP3f0uagJbmNSaOoelj2fP0ASK2Pe60wNwkf7WRCTbZW6T8kucTmSUSoQkKywcjaVUJUO2X21UuUIQFsJQHRkhCYjSzHPFptxAV/+SfrB8fVY1Up2wcn7m49IHsjzVfnj2QsaE9zFuZr+c/aj5vh5rIhG5itmv5kcVYVWnVYkJ7mFm7aCgrGHEZFXbWKFJBY8oS21AVeVadiAqJQoQBQ1FBqJaFnuYElxKhCFIAhCEACEIQAIQhAAhCEATKFCAgdlkKFKCgRKEJUAIUKJTE2ShQhArJJUIQgQIQhAAhCEACEIQAIQhAApBUIQBcPKn4iWhPcwBCEJACEIQAIQhAAhCEACEIQAIQhAAhCEASFKEIKQIQhAyCoQhBDBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgD//2Q==' - }, - 'attributes': { - 'width': '300', - 'height': '500', - 'style': 'width:250px; height:250px;' - } - }, - {'insert': '\n'}, - { - 'insert': - '\nThe source of the above image is image base 64 directly without `data:image/png;base64,` in the start' - }, - {'insert': '\n'}, - {'insert': '\n'}, - {'insert': ''}, - { - 'insert': { - 'image': - 'data:image/png;base64,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' - }, - 'attributes': { - 'width': '150', - 'height': '250', - 'style': 'width:250px; height:250px;' - } - }, - {'insert': '\n'}, - {'insert': '\n'}, - { - 'insert': - 'The source of the above image is also image base 64 but this time it start with `data:image/png;base64,`' - }, - {'insert': '\n'}, -]; diff --git a/example/lib/screens/quill/samples/quill_text_sample.dart b/example/lib/screens/quill/samples/quill_text_sample.dart deleted file mode 100644 index 4e047db93..000000000 --- a/example/lib/screens/quill/samples/quill_text_sample.dart +++ /dev/null @@ -1,270 +0,0 @@ -const quillTextSample = [ - {'insert': 'Flutter Quill'}, - { - 'attributes': {'header': 1}, - 'insert': '\n' - }, - {'insert': '\nRich text editor for Flutter'}, - { - 'attributes': {'header': 2}, - 'insert': '\n' - }, - {'insert': 'Quill component for Flutter'}, - { - 'attributes': {'color': 'rgba(0, 0, 0, 0.847)'}, - 'insert': ' and ' - }, - { - 'attributes': {'link': 'https://bulletjournal.us/home/index.html'}, - 'insert': 'Bullet Journal' - }, - { - 'insert': - ':\nTrack personal and group journals (ToDo, Note, Ledger) from multiple views with timely reminders' - }, - { - 'attributes': {'list': 'ordered'}, - 'insert': '\n' - }, - { - 'insert': - 'Share your tasks and notes with teammates, and see changes as they happen in real-time, across all devices' - }, - { - 'attributes': {'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'Check out what you and your teammates are working on each day'}, - { - 'attributes': {'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': '\nSplitting bills with friends can never be easier.'}, - { - 'attributes': {'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'Start creating a group and invite your friends to join.'}, - { - 'attributes': {'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'Create a BuJo of Ledger type to see expense or balance summary.'}, - { - 'attributes': {'list': 'bullet'}, - 'insert': '\n' - }, - { - 'insert': - '\nAttach one or multiple labels to tasks, notes or transactions. Later you can track them just using the label(s).' - }, - { - 'attributes': {'blockquote': true}, - 'insert': '\n' - }, - {'insert': "\nvar BuJo = 'Bullet' + 'Journal'"}, - { - 'attributes': {'code-block': true}, - 'insert': '\n' - }, - {'insert': '\nStart tracking in your browser'}, - { - 'attributes': {'indent': 1}, - 'insert': '\n' - }, - {'insert': 'Stop the timer on your phone'}, - { - 'attributes': {'indent': 1}, - 'insert': '\n' - }, - {'insert': 'All your time entries are synced'}, - { - 'attributes': {'indent': 2}, - 'insert': '\n' - }, - {'insert': 'between the phone apps'}, - { - 'attributes': {'indent': 2}, - 'insert': '\n' - }, - {'insert': 'and the website.'}, - { - 'attributes': {'indent': 3}, - 'insert': '\n' - }, - {'insert': '\n'}, - {'insert': '\nCenter Align'}, - { - 'attributes': {'align': 'center'}, - 'insert': '\n' - }, - {'insert': 'Right Align'}, - { - 'attributes': {'align': 'right'}, - 'insert': '\n' - }, - {'insert': 'Justify Align'}, - { - 'attributes': {'align': 'justify'}, - 'insert': '\n' - }, - {'insert': 'Have trouble finding things? '}, - { - 'attributes': {'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'Just type in the search bar'}, - { - 'attributes': {'indent': 1, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'and easily find contents'}, - { - 'attributes': {'indent': 2, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'across projects or folders.'}, - { - 'attributes': {'indent': 2, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'It matches text in your note or task.'}, - { - 'attributes': {'indent': 1, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'Enable reminders so that you will get notified by'}, - { - 'attributes': {'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'email'}, - { - 'attributes': {'indent': 1, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'message on your phone'}, - { - 'attributes': {'indent': 1, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'popup on the web site'}, - { - 'attributes': {'indent': 1, 'list': 'ordered'}, - 'insert': '\n' - }, - {'insert': 'Create a BuJo serving as project or folder'}, - { - 'attributes': {'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'Organize your'}, - { - 'attributes': {'indent': 1, 'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'tasks'}, - { - 'attributes': {'indent': 2, 'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'notes'}, - { - 'attributes': {'indent': 2, 'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'transactions'}, - { - 'attributes': {'indent': 2, 'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'under BuJo '}, - { - 'attributes': {'indent': 3, 'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'See them in Calendar'}, - { - 'attributes': {'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'or hierarchical view'}, - { - 'attributes': {'indent': 1, 'list': 'bullet'}, - 'insert': '\n' - }, - {'insert': 'this is a check list'}, - { - 'attributes': {'list': 'checked'}, - 'insert': '\n' - }, - {'insert': 'this is a uncheck list'}, - { - 'attributes': {'list': 'unchecked'}, - 'insert': '\n' - }, - {'insert': 'Font '}, - { - 'attributes': {'font': 'sans-serif'}, - 'insert': 'Sans Serif' - }, - {'insert': ' '}, - { - 'attributes': {'font': 'serif'}, - 'insert': 'Serif' - }, - {'insert': ' '}, - { - 'attributes': {'font': 'monospace'}, - 'insert': 'Monospace' - }, - {'insert': ' Size '}, - { - 'attributes': {'size': 'small'}, - 'insert': 'Small' - }, - {'insert': ' '}, - { - 'attributes': {'size': 'large'}, - 'insert': 'Large' - }, - {'insert': ' '}, - { - 'attributes': {'size': 'huge'}, - 'insert': 'Huge' - }, - { - 'attributes': {'size': '15.0'}, - 'insert': 'font size 15' - }, - {'insert': ' '}, - { - 'attributes': {'size': '35'}, - 'insert': 'font size 35' - }, - {'insert': ' '}, - { - 'attributes': {'size': '20'}, - 'insert': 'font size 20' - }, - { - 'attributes': {'token': 'built_in'}, - 'insert': ' diff' - }, - { - 'attributes': {'token': 'operator'}, - 'insert': '-match' - }, - { - 'attributes': {'token': 'literal'}, - 'insert': '-patch' - }, - { - 'insert': { - 'image': - 'https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png' - }, - 'attributes': {'width': '230', 'style': 'display: block; margin: auto;'} - }, - {'insert': '\n'} -]; diff --git a/example/lib/screens/quill/samples/quill_videos_sample.dart b/example/lib/screens/quill/samples/quill_videos_sample.dart deleted file mode 100644 index 9e47456df..000000000 --- a/example/lib/screens/quill/samples/quill_videos_sample.dart +++ /dev/null @@ -1,17 +0,0 @@ -const quillVideosSample = [ - {'insert': '\n'}, - { - 'insert': {'video': 'https://youtu.be/fq4N0hgOWzU?si=SqoY_bAZYnjCkUvn'}, - 'attributes': { - 'width': '300', - 'height': '300', - 'style': 'width:400px; height:500px;' - } - }, - {'insert': '\n'}, - {'insert': '\n'}, - {'insert': '\n'}, - {'insert': 'The video above is a Youtube video.'}, - {'insert': '\n'}, - {'insert': '\n'}, -]; diff --git a/example/lib/screens/settings/cubit/settings_cubit.dart b/example/lib/screens/settings/cubit/settings_cubit.dart deleted file mode 100644 index f577f95c8..000000000 --- a/example/lib/screens/settings/cubit/settings_cubit.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart' show ThemeMode; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'settings_state.dart'; -part 'settings_cubit.freezed.dart'; -part 'settings_cubit.g.dart'; - -class SettingsCubit extends Cubit { - SettingsCubit() : super(const SettingsState()); - - void updateSettings(SettingsState newSettingsState) { - emit(newSettingsState); - } -} diff --git a/example/lib/screens/settings/cubit/settings_cubit.freezed.dart b/example/lib/screens/settings/cubit/settings_cubit.freezed.dart deleted file mode 100644 index f87c0072f..000000000 --- a/example/lib/screens/settings/cubit/settings_cubit.freezed.dart +++ /dev/null @@ -1,202 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'settings_cubit.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -SettingsState _$SettingsStateFromJson(Map json) { - return _SettingsState.fromJson(json); -} - -/// @nodoc -mixin _$SettingsState { - ThemeMode get themeMode => throw _privateConstructorUsedError; - DefaultScreen get defaultScreen => throw _privateConstructorUsedError; - bool get useCustomQuillToolbar => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $SettingsStateCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SettingsStateCopyWith<$Res> { - factory $SettingsStateCopyWith( - SettingsState value, $Res Function(SettingsState) then) = - _$SettingsStateCopyWithImpl<$Res, SettingsState>; - @useResult - $Res call( - {ThemeMode themeMode, - DefaultScreen defaultScreen, - bool useCustomQuillToolbar}); -} - -/// @nodoc -class _$SettingsStateCopyWithImpl<$Res, $Val extends SettingsState> - implements $SettingsStateCopyWith<$Res> { - _$SettingsStateCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? themeMode = null, - Object? defaultScreen = null, - Object? useCustomQuillToolbar = null, - }) { - return _then(_value.copyWith( - themeMode: null == themeMode - ? _value.themeMode - : themeMode // ignore: cast_nullable_to_non_nullable - as ThemeMode, - defaultScreen: null == defaultScreen - ? _value.defaultScreen - : defaultScreen // ignore: cast_nullable_to_non_nullable - as DefaultScreen, - useCustomQuillToolbar: null == useCustomQuillToolbar - ? _value.useCustomQuillToolbar - : useCustomQuillToolbar // ignore: cast_nullable_to_non_nullable - as bool, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$SettingsStateImplCopyWith<$Res> - implements $SettingsStateCopyWith<$Res> { - factory _$$SettingsStateImplCopyWith( - _$SettingsStateImpl value, $Res Function(_$SettingsStateImpl) then) = - __$$SettingsStateImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {ThemeMode themeMode, - DefaultScreen defaultScreen, - bool useCustomQuillToolbar}); -} - -/// @nodoc -class __$$SettingsStateImplCopyWithImpl<$Res> - extends _$SettingsStateCopyWithImpl<$Res, _$SettingsStateImpl> - implements _$$SettingsStateImplCopyWith<$Res> { - __$$SettingsStateImplCopyWithImpl( - _$SettingsStateImpl _value, $Res Function(_$SettingsStateImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? themeMode = null, - Object? defaultScreen = null, - Object? useCustomQuillToolbar = null, - }) { - return _then(_$SettingsStateImpl( - themeMode: null == themeMode - ? _value.themeMode - : themeMode // ignore: cast_nullable_to_non_nullable - as ThemeMode, - defaultScreen: null == defaultScreen - ? _value.defaultScreen - : defaultScreen // ignore: cast_nullable_to_non_nullable - as DefaultScreen, - useCustomQuillToolbar: null == useCustomQuillToolbar - ? _value.useCustomQuillToolbar - : useCustomQuillToolbar // ignore: cast_nullable_to_non_nullable - as bool, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$SettingsStateImpl implements _SettingsState { - const _$SettingsStateImpl( - {this.themeMode = ThemeMode.system, - this.defaultScreen = DefaultScreen.home, - this.useCustomQuillToolbar = false}); - - factory _$SettingsStateImpl.fromJson(Map json) => - _$$SettingsStateImplFromJson(json); - - @override - @JsonKey() - final ThemeMode themeMode; - @override - @JsonKey() - final DefaultScreen defaultScreen; - @override - @JsonKey() - final bool useCustomQuillToolbar; - - @override - String toString() { - return 'SettingsState(themeMode: $themeMode, defaultScreen: $defaultScreen, useCustomQuillToolbar: $useCustomQuillToolbar)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SettingsStateImpl && - (identical(other.themeMode, themeMode) || - other.themeMode == themeMode) && - (identical(other.defaultScreen, defaultScreen) || - other.defaultScreen == defaultScreen) && - (identical(other.useCustomQuillToolbar, useCustomQuillToolbar) || - other.useCustomQuillToolbar == useCustomQuillToolbar)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => - Object.hash(runtimeType, themeMode, defaultScreen, useCustomQuillToolbar); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$SettingsStateImplCopyWith<_$SettingsStateImpl> get copyWith => - __$$SettingsStateImplCopyWithImpl<_$SettingsStateImpl>(this, _$identity); - - @override - Map toJson() { - return _$$SettingsStateImplToJson( - this, - ); - } -} - -abstract class _SettingsState implements SettingsState { - const factory _SettingsState( - {final ThemeMode themeMode, - final DefaultScreen defaultScreen, - final bool useCustomQuillToolbar}) = _$SettingsStateImpl; - - factory _SettingsState.fromJson(Map json) = - _$SettingsStateImpl.fromJson; - - @override - ThemeMode get themeMode; - @override - DefaultScreen get defaultScreen; - @override - bool get useCustomQuillToolbar; - @override - @JsonKey(ignore: true) - _$$SettingsStateImplCopyWith<_$SettingsStateImpl> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/example/lib/screens/settings/cubit/settings_cubit.g.dart b/example/lib/screens/settings/cubit/settings_cubit.g.dart deleted file mode 100644 index fe3fd931b..000000000 --- a/example/lib/screens/settings/cubit/settings_cubit.g.dart +++ /dev/null @@ -1,40 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'settings_cubit.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$SettingsStateImpl _$$SettingsStateImplFromJson(Map json) => - _$SettingsStateImpl( - themeMode: $enumDecodeNullable(_$ThemeModeEnumMap, json['themeMode']) ?? - ThemeMode.system, - defaultScreen: - $enumDecodeNullable(_$DefaultScreenEnumMap, json['defaultScreen']) ?? - DefaultScreen.home, - useCustomQuillToolbar: json['useCustomQuillToolbar'] as bool? ?? false, - ); - -Map _$$SettingsStateImplToJson(_$SettingsStateImpl instance) => - { - 'themeMode': _$ThemeModeEnumMap[instance.themeMode]!, - 'defaultScreen': _$DefaultScreenEnumMap[instance.defaultScreen]!, - 'useCustomQuillToolbar': instance.useCustomQuillToolbar, - }; - -const _$ThemeModeEnumMap = { - ThemeMode.system: 'system', - ThemeMode.light: 'light', - ThemeMode.dark: 'dark', -}; - -const _$DefaultScreenEnumMap = { - DefaultScreen.home: 'home', - DefaultScreen.settings: 'settings', - DefaultScreen.defaultSample: 'defaultSample', - DefaultScreen.imagesSample: 'imagesSample', - DefaultScreen.videosSample: 'videosSample', - DefaultScreen.textSample: 'textSample', - DefaultScreen.emptySample: 'emptySample', -}; diff --git a/example/lib/screens/settings/cubit/settings_state.dart b/example/lib/screens/settings/cubit/settings_state.dart deleted file mode 100644 index 67e5adae1..000000000 --- a/example/lib/screens/settings/cubit/settings_state.dart +++ /dev/null @@ -1,22 +0,0 @@ -part of 'settings_cubit.dart'; - -enum DefaultScreen { - home, - settings, - defaultSample, - imagesSample, - videosSample, - textSample, - emptySample, -} - -@freezed -class SettingsState with _$SettingsState { - const factory SettingsState({ - @Default(ThemeMode.system) ThemeMode themeMode, - @Default(DefaultScreen.home) DefaultScreen defaultScreen, - @Default(false) bool useCustomQuillToolbar, - }) = _SettingsState; - factory SettingsState.fromJson(Map json) => - _$SettingsStateFromJson(json); -} diff --git a/example/lib/screens/settings/widgets/settings_screen.dart b/example/lib/screens/settings/widgets/settings_screen.dart deleted file mode 100644 index 3bee862f3..000000000 --- a/example/lib/screens/settings/widgets/settings_screen.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../shared/widgets/dialog_action.dart'; -import '../../shared/widgets/home_screen_button.dart'; -import '../cubit/settings_cubit.dart'; - -class SettingsScreen extends StatelessWidget { - const SettingsScreen({super.key}); - - static const routeName = '/settings'; - - @override - Widget build(BuildContext context) { - final materialTheme = Theme.of(context); - final isDark = materialTheme.brightness == Brightness.dark; - return Scaffold( - appBar: AppBar( - title: const Text('Settings'), - actions: const [ - HomeScreenButton(), - ], - ), - body: BlocBuilder( - builder: (context, state) { - return ListView( - children: [ - CheckboxListTile.adaptive( - value: isDark, - onChanged: (value) { - final isNewValueDark = value ?? false; - context.read().updateSettings( - state.copyWith( - themeMode: - isNewValueDark ? ThemeMode.dark : ThemeMode.light, - ), - ); - }, - title: const Text('Dark Theme'), - subtitle: const Text( - 'By default we will use your system theme, but you can set if you want dark or light theme', - ), - secondary: Icon(isDark ? Icons.nightlight : Icons.sunny), - ), - ListTile( - title: const Text('Default screen'), - subtitle: const Text( - 'Which screen should be used when the flutter app starts?', - ), - leading: const Icon(Icons.home), - onTap: () async { - final settingsBloc = context.read(); - final newDefaultScreen = - await showAdaptiveDialog( - context: context, - builder: (context) { - return AlertDialog.adaptive( - title: const Text('Select default screen'), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ...DefaultScreen.values.map( - (e) => Material( - child: ListTile( - onTap: () { - Navigator.of(context).pop(e); - }, - title: Text(e.name), - leading: CircleAvatar( - child: Text((e.index + 1).toString()), - ), - ), - ), - ), - ], - ), - actions: [ - AppDialogAction( - onPressed: () => Navigator.of(context).pop(null), - child: const Text('Cancel'), - ), - ], - ); - }, - ); - if (newDefaultScreen != null) { - settingsBloc.updateSettings( - settingsBloc.state - .copyWith(defaultScreen: newDefaultScreen), - ); - } - }, - ), - CheckboxListTile.adaptive( - value: state.useCustomQuillToolbar, - onChanged: (value) { - final useCustomToolbarNewValue = value ?? false; - context.read().updateSettings( - state.copyWith( - useCustomQuillToolbar: useCustomToolbarNewValue, - ), - ); - }, - title: const Text('Use custom Quill toolbar'), - subtitle: const Text( - 'By default we will default QuillToolbar, but you can decide if you the built-in or the custom one', - ), - secondary: const Icon(Icons.dashboard_customize), - ), - ], - ); - }, - ), - ); - } -} diff --git a/example/lib/screens/shared/widgets/dialog_action.dart b/example/lib/screens/shared/widgets/dialog_action.dart deleted file mode 100644 index 74d19840a..000000000 --- a/example/lib/screens/shared/widgets/dialog_action.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; - -class AppDialogAction extends StatelessWidget { - const AppDialogAction({ - required this.child, - required this.onPressed, - this.textStyle, - super.key, - }); - - final VoidCallback? onPressed; - final Widget child; - - final ButtonStyle? textStyle; - - @override - Widget build(BuildContext context) { - return TextButton( - onPressed: onPressed, - style: textStyle, - child: child, - ); - } -} diff --git a/example/lib/screens/shared/widgets/home_screen_button.dart b/example/lib/screens/shared/widgets/home_screen_button.dart deleted file mode 100644 index b1ac053aa..000000000 --- a/example/lib/screens/shared/widgets/home_screen_button.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../settings/cubit/settings_cubit.dart'; - -class HomeScreenButton extends StatelessWidget { - const HomeScreenButton({super.key}); - - @override - Widget build(BuildContext context) { - return IconButton( - onPressed: () { - final settingsCubit = context.read(); - settingsCubit.updateSettings( - settingsCubit.state.copyWith( - defaultScreen: DefaultScreen.home, - ), - ); - }, - icon: const Icon(Icons.home), - tooltip: 'Set the default to home screen', - ); - } -} diff --git a/example/lib/screens/simple/simple_screen.dart b/example/lib/screens/simple/simple_screen.dart deleted file mode 100644 index 15ab1e5e8..000000000 --- a/example/lib/screens/simple/simple_screen.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; - -class SimpleScreen extends StatefulWidget { - const SimpleScreen({super.key}); - - @override - State createState() => _SimpleScreenState(); -} - -class _SimpleScreenState extends State { - final _controller = QuillController.basic(); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: Column( - children: [ - QuillToolbar.simple( - controller: _controller, - configurations: const QuillSimpleToolbarConfigurations(), - ), - Expanded( - child: QuillEditor.basic( - controller: _controller, - configurations: const QuillEditorConfigurations( - padding: EdgeInsets.all(16), - ), - ), - ), - ], - ), - ); - } -} diff --git a/example/lib/spell_checker/simple_spell_checker_service.dart b/example/lib/spell_checker/simple_spell_checker_service.dart deleted file mode 100644 index 26c109e11..000000000 --- a/example/lib/spell_checker/simple_spell_checker_service.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:simple_spell_checker/simple_spell_checker.dart'; - -/// SimpleSpellChecker is a simple spell checker for get -/// all words divide on different objects if them are wrong or not. -/// -/// **Important**: A breaking change is planned and this shouldn't be used -/// for new applications. A replacement will arrive soon. -/// See: https://github.com/singerdmx/flutter-quill/issues/2246 -class SimpleSpellCheckerService - // ignore: deprecated_member_use - extends SpellCheckerService { - SimpleSpellCheckerService({required super.language}) - : checker = SimpleSpellChecker( - language: language, - safeDictionaryLoad: true, - ); - - /// [SimpleSpellChecker] comes from the package [simple_spell_checker] - /// that give us all necessary methods for get our spans with highlighting - /// where needed - final SimpleSpellChecker checker; - - @override - List? checkSpelling( - String text, { - LongPressGestureRecognizer Function(String word)? - customLongPressRecognizerOnWrongSpan, - }) { - return checker.check( - text, - customLongPressRecognizerOnWrongSpan: - customLongPressRecognizerOnWrongSpan, - ); - } - - @override - void toggleChecker() => checker.toggleChecker(); - - @override - bool isServiceActive() => checker.isCheckerActive(); - - @override - void dispose({bool onlyPartial = false}) { - if (onlyPartial) { - checker.disposeControllers(); - return; - } - checker.dispose(); - } - - @override - void addCustomLanguage({required languageIdentifier}) { - checker - ..registerLanguage(languageIdentifier.language) - ..addCustomLanguage(languageIdentifier); - } - - @override - void setNewLanguageState({required String language}) { - checker.setNewLanguageToState(language); - } - - @override - void updateCustomLanguageIfExist({required languageIdentifier}) { - checker.updateCustomLanguageIfExist(languageIdentifier); - } -} diff --git a/example/lib/spell_checker/spell_checker.dart b/example/lib/spell_checker/spell_checker.dart deleted file mode 100644 index df9eea350..000000000 --- a/example/lib/spell_checker/spell_checker.dart +++ /dev/null @@ -1,29 +0,0 @@ -// ignore_for_file: deprecated_member_use - -import 'package:flutter_quill/flutter_quill.dart'; - -import 'simple_spell_checker_service.dart'; - -class SpellChecker { - SpellChecker._(); - - /// override the default implementation of [SpellCheckerServiceProvider] - /// to allow a `flutter quill` support a better check spelling - /// - /// # !WARNING - /// To avoid memory leaks, ensure to use [dispose()] method to - /// close stream controllers that used by this custom implementation - /// when them no longer needed - /// - /// Example: - /// - ///```dart - ///// set partial true if you only need to close the controllers - ///SpellCheckerServiceProvider.dispose(onlyPartial: false); - ///``` - static void useSpellCheckerService(String language) { - SpellCheckerServiceProvider.setNewCheckerService( - SimpleSpellCheckerService(language: language), - ); - } -} diff --git a/example/linux/CMakeLists.txt b/example/linux/CMakeLists.txt index 9cb0d1dd0..280c69355 100644 --- a/example/linux/CMakeLists.txt +++ b/example/linux/CMakeLists.txt @@ -4,10 +4,10 @@ project(runner LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "example") +set(BINARY_NAME "flutter_quill_example") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.example") +set(APPLICATION_ID "dev.flutterquill.flutter_quill_example") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/example/linux/flutter/generated_plugin_registrant.cc b/example/linux/flutter/generated_plugin_registrant.cc index 12dc8c820..7299b5cf2 100644 --- a/example/linux/flutter/generated_plugin_registrant.cc +++ b/example/linux/flutter/generated_plugin_registrant.cc @@ -6,25 +6,13 @@ #include "generated_plugin_registrant.h" -#include #include -#include -#include #include void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) desktop_drop_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); - desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); - g_autoptr(FlPluginRegistrar) irondash_engine_context_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "IrondashEngineContextPlugin"); - irondash_engine_context_plugin_register_with_registrar(irondash_engine_context_registrar); - g_autoptr(FlPluginRegistrar) super_native_extensions_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "SuperNativeExtensionsPlugin"); - super_native_extensions_plugin_register_with_registrar(super_native_extensions_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/example/linux/flutter/generated_plugins.cmake b/example/linux/flutter/generated_plugins.cmake index b75263bb2..786ff5c29 100644 --- a/example/linux/flutter/generated_plugins.cmake +++ b/example/linux/flutter/generated_plugins.cmake @@ -3,10 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST - desktop_drop file_selector_linux - irondash_engine_context - super_native_extensions url_launcher_linux ) diff --git a/example/linux/my_application.cc b/example/linux/my_application.cc index c0530d422..693e9b88f 100644 --- a/example/linux/my_application.cc +++ b/example/linux/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "example"); + gtk_header_bar_set_title(header_bar, "flutter_quill_example"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "example"); + gtk_window_set_title(window, "flutter_quill_example"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index 10abb57dc..7d5b8c182 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,30 +5,16 @@ import FlutterMacOS import Foundation -import desktop_drop -import device_info_plus import file_selector_macos import gal -import irondash_engine_context -import path_provider_foundation import quill_native_bridge_macos -import share_plus -import sqflite_darwin -import super_native_extensions import url_launcher_macos import video_player_avfoundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) - DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) GalPlugin.register(with: registry.registrar(forPlugin: "GalPlugin")) - IrondashEngineContextPlugin.register(with: registry.registrar(forPlugin: "IrondashEngineContextPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) QuillNativeBridgePlugin.register(with: registry.registrar(forPlugin: "QuillNativeBridgePlugin")) - SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) - SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) - SuperNativeExtensionsPlugin.register(with: registry.registrar(forPlugin: "SuperNativeExtensionsPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) } diff --git a/example/macos/Podfile b/example/macos/Podfile index 35ac88833..dbccf89c9 100644 --- a/example/macos/Podfile +++ b/example/macos/Podfile @@ -39,9 +39,5 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) - # TODO: Workaround to fix build failure - target.build_configurations.each do |config| - config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0' - end end end diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index 3df1b3747..b3544367a 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -1,28 +1,12 @@ PODS: - - desktop_drop (0.0.1): - - FlutterMacOS - - device_info_plus (0.0.1): - - FlutterMacOS - file_selector_macos (0.0.1): - FlutterMacOS - FlutterMacOS (1.0.0) - gal (1.0.0): - Flutter - FlutterMacOS - - irondash_engine_context (0.0.1): - - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - quill_native_bridge_macos (0.0.1): - FlutterMacOS - - share_plus (0.0.1): - - FlutterMacOS - - sqflite_darwin (0.0.4): - - Flutter - - FlutterMacOS - - super_native_extensions (0.0.1): - - FlutterMacOS - url_launcher_macos (0.0.1): - FlutterMacOS - video_player_avfoundation (0.0.1): @@ -30,63 +14,35 @@ PODS: - FlutterMacOS DEPENDENCIES: - - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - gal (from `Flutter/ephemeral/.symlinks/plugins/gal/darwin`) - - irondash_engine_context (from `Flutter/ephemeral/.symlinks/plugins/irondash_engine_context/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - quill_native_bridge_macos (from `Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos`) - - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) - - super_native_extensions (from `Flutter/ephemeral/.symlinks/plugins/super_native_extensions/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) EXTERNAL SOURCES: - desktop_drop: - :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos - device_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos file_selector_macos: :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos FlutterMacOS: :path: Flutter/ephemeral gal: :path: Flutter/ephemeral/.symlinks/plugins/gal/darwin - irondash_engine_context: - :path: Flutter/ephemeral/.symlinks/plugins/irondash_engine_context/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin quill_native_bridge_macos: :path: Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos - share_plus: - :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos - sqflite_darwin: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin - super_native_extensions: - :path: Flutter/ephemeral/.symlinks/plugins/super_native_extensions/macos url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos video_player_avfoundation: :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin SPEC CHECKSUMS: - desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 - device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 gal: 61e868295d28fe67ffa297fae6dacebf56fd53e1 - irondash_engine_context: da62996ee25616d2f01bbeb85dc115d813359478 - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 quill_native_bridge_macos: f90985c5269ac7ba84d933605b463d96e5f544fe - share_plus: a182a58e04e51647c0481aadabbc4de44b3a2bce - sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 - super_native_extensions: 85efee3a7495b46b04befcfc86ed12069264ebf3 url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 -PODFILE CHECKSUM: 7159dd71cf9f57a5669bb2dee7a5030dbcc0483f +PODFILE CHECKSUM: c2e95c8c0fe03c5c57e438583cae4cc732296009 COCOAPODS: 1.15.2 diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj index 2cbcd98aa..6d907a32c 100644 --- a/example/macos/Runner.xcodeproj/project.pbxproj +++ b/example/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0819A4118119F0FB90CC792A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF9630B171C82D9F157D8A7A /* Pods_RunnerTests.framework */; }; - 0ECAC09CE6CB433383FE46BA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F25EE7A42A9A7B340553AFD5 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 8E3774B08A93A8D54E597870 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C6627E85DE71088607AABDE /* Pods_RunnerTests.framework */; }; + CBFCAD814543F1F46CF7EB02 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B7FF1B5F74BB7EE9AEAADC6 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,14 +62,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 08857C82C866FAA72A6112E1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 1AE7B8BE0097CC9BD2CEB71C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 213343C812B541CBD55EC002 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2D37AD789A348E0ED9F8CF95 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* flutter_quill_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = flutter_quill_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -81,13 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 382159709DCCA9047A6B60BF /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4C6627E85DE71088607AABDE /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 7C0DBFDB60FEA7B74A31DCD6 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8B7FF1B5F74BB7EE9AEAADC6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD4F0BE8B3C0868B8BCD1802 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B6A180C3D11679D4FEC36007 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - DF9630B171C82D9F157D8A7A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F25EE7A42A9A7B340553AFD5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9DFF9F1E9DBEBF88D3130224 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + A469B99595D46C18EEEAB749 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B94E8E7585B52349284FEC7C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + C0A4ACB16DD0C36754B830CC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0819A4118119F0FB90CC792A /* Pods_RunnerTests.framework in Frameworks */, + 8E3774B08A93A8D54E597870 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0ECAC09CE6CB433383FE46BA /* Pods_Runner.framework in Frameworks */, + CBFCAD814543F1F46CF7EB02 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -136,15 +136,15 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, - 50A36B439D603B27B2A10103 /* Pods */, - 6BD6849B62426A4BAFC71567 /* Frameworks */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + FA0924593192DA52F60E2347 /* Pods */, ); sourceTree = ""; }; 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* example.app */, + 33CC10ED2044A3C60003C045 /* flutter_quill_example.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -185,27 +185,27 @@ path = Runner; sourceTree = ""; }; - 50A36B439D603B27B2A10103 /* Pods */ = { + D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 213343C812B541CBD55EC002 /* Pods-Runner.debug.xcconfig */, - B6A180C3D11679D4FEC36007 /* Pods-Runner.release.xcconfig */, - 1AE7B8BE0097CC9BD2CEB71C /* Pods-Runner.profile.xcconfig */, - AD4F0BE8B3C0868B8BCD1802 /* Pods-RunnerTests.debug.xcconfig */, - 08857C82C866FAA72A6112E1 /* Pods-RunnerTests.release.xcconfig */, - 382159709DCCA9047A6B60BF /* Pods-RunnerTests.profile.xcconfig */, + 8B7FF1B5F74BB7EE9AEAADC6 /* Pods_Runner.framework */, + 4C6627E85DE71088607AABDE /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; - 6BD6849B62426A4BAFC71567 /* Frameworks */ = { + FA0924593192DA52F60E2347 /* Pods */ = { isa = PBXGroup; children = ( - F25EE7A42A9A7B340553AFD5 /* Pods_Runner.framework */, - DF9630B171C82D9F157D8A7A /* Pods_RunnerTests.framework */, + A469B99595D46C18EEEAB749 /* Pods-Runner.debug.xcconfig */, + B94E8E7585B52349284FEC7C /* Pods-Runner.release.xcconfig */, + 2D37AD789A348E0ED9F8CF95 /* Pods-Runner.profile.xcconfig */, + C0A4ACB16DD0C36754B830CC /* Pods-RunnerTests.debug.xcconfig */, + 9DFF9F1E9DBEBF88D3130224 /* Pods-RunnerTests.release.xcconfig */, + 7C0DBFDB60FEA7B74A31DCD6 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; /* End PBXGroup section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - B106B712E930130681A09692 /* [CP] Check Pods Manifest.lock */, + C27377F9664DD6D00B8324C5 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 1C8E506F11B9603AA202D203 /* [CP] Check Pods Manifest.lock */, + ADA7845785713A6AD96ACC83 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - CCF759434F90A85A86F6BD32 /* [CP] Embed Pods Frameworks */, + 3C5A23DA7F8245D72F435A4A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -249,7 +249,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productReference = 33CC10ED2044A3C60003C045 /* flutter_quill_example.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -258,6 +258,7 @@ 33CC10E52044A3C60003C045 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0920; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; @@ -322,67 +323,62 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1C8E506F11B9603AA202D203 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3C5A23DA7F8245D72F435A4A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, - ); - inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B106B712E930130681A09692 /* [CP] Check Pods Manifest.lock */ = { + ADA7845785713A6AD96ACC83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -397,28 +393,33 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - CCF759434F90A85A86F6BD32 /* [CP] Embed Pods Frameworks */ = { + C27377F9664DD6D00B8324C5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -472,46 +473,46 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AD4F0BE8B3C0868B8BCD1802 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = C0A4ACB16DD0C36754B830CC /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_quill_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_quill_example"; }; name = Debug; }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 08857C82C866FAA72A6112E1 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 9DFF9F1E9DBEBF88D3130224 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_quill_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_quill_example"; }; name = Release; }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 382159709DCCA9047A6B60BF /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7C0DBFDB60FEA7B74A31DCD6 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_quill_example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_quill_example"; }; name = Profile; }; @@ -520,6 +521,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -543,9 +545,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -575,7 +579,6 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -594,6 +597,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -617,9 +621,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -647,6 +653,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -670,9 +677,11 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -702,7 +711,6 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -723,7 +731,6 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; diff --git a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 15368eccb..5e42bdff0 100644 --- a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -65,7 +65,7 @@ @@ -82,7 +82,7 @@ diff --git a/example/macos/Runner/Configs/AppInfo.xcconfig b/example/macos/Runner/Configs/AppInfo.xcconfig index dda192bcd..fc59759d9 100644 --- a/example/macos/Runner/Configs/AppInfo.xcconfig +++ b/example/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = example +PRODUCT_NAME = flutter_quill_example // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.example +PRODUCT_BUNDLE_IDENTIFIER = dev.flutterquill.flutterQuillExample // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2024 dev.flutterquill. All rights reserved. diff --git a/example/macos/Runner/DebugProfile.entitlements b/example/macos/Runner/DebugProfile.entitlements index ba77acf8f..ef070abf0 100644 --- a/example/macos/Runner/DebugProfile.entitlements +++ b/example/macos/Runner/DebugProfile.entitlements @@ -12,9 +12,5 @@ com.apple.security.files.user-selected.read-only - - com.apple.security.print - diff --git a/example/macos/Runner/Info.plist b/example/macos/Runner/Info.plist index 0eae602e9..a3107c6ac 100644 --- a/example/macos/Runner/Info.plist +++ b/example/macos/Runner/Info.plist @@ -28,9 +28,9 @@ MainMenu NSPrincipalClass NSApplication - NSPhotoLibraryUsageDescription - We need permission to the photo library in order for inserting images in the text editor NSPhotoLibraryAddUsageDescription - We need this permission for saving the images in the editor + Used to demonstrate flutter_quill package + NSPhotoLibraryUsageDescription + Used to demonstrate flutter_quill package diff --git a/example/macos/Runner/Release.entitlements b/example/macos/Runner/Release.entitlements index 282c087b6..389e8f35f 100644 --- a/example/macos/Runner/Release.entitlements +++ b/example/macos/Runner/Release.entitlements @@ -8,9 +8,5 @@ com.apple.security.files.user-selected.read-only - - com.apple.security.print - diff --git a/example/macos/RunnerTests/RunnerTests.swift b/example/macos/RunnerTests/RunnerTests.swift index 5418c9f53..61f3bd1fc 100644 --- a/example/macos/RunnerTests/RunnerTests.swift +++ b/example/macos/RunnerTests/RunnerTests.swift @@ -1,5 +1,5 @@ -import FlutterMacOS import Cocoa +import FlutterMacOS import XCTest class RunnerTests: XCTestCase { diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 000000000..7f27f4b91 --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,748 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" + source: hosted + version: "1.3.1" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + dart_quill_delta: + dependency: transitive + description: + name: dart_quill_delta + sha256: "2962476fb9471439a959b68b0e032febee76475e934f2d65d8d86dd0d5bff7a6" + url: "https://pub.dev" + source: hosted + version: "10.8.2" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev" + source: hosted + version: "0.4.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "712ce7fab537ba532c8febdb1a8f167b32441e74acd68c3ccb2e36dcb52c4ab2" + url: "https://pub.dev" + source: hosted + version: "0.9.3" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" + url: "https://pub.dev" + source: hosted + version: "0.9.4+2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4" + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_colorpicker: + dependency: transitive + description: + name: flutter_colorpicker + sha256: "969de5f6f9e2a570ac660fb7b501551451ea2a1ab9e2097e89475f60e07816ea" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_temp_fork: + dependency: transitive + description: + name: flutter_keyboard_visibility_temp_fork + sha256: "2d94acecfc170d244157821cc67e784f60972677aac94a6672626a5d6b2dc537" + url: "https://pub.dev" + source: hosted + version: "0.1.3" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + url: "https://pub.dev" + source: hosted + version: "2.0.23" + flutter_quill: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "11.0.0-dev.5" + flutter_quill_delta_from_html: + dependency: transitive + description: + name: flutter_quill_delta_from_html + sha256: "288f879bd11f9b6857868e7b198e69918530bd63d196ead6d8a9ee780b4b44d2" + url: "https://pub.dev" + source: hosted + version: "1.4.2" + flutter_quill_extensions: + dependency: "direct main" + description: + path: "../flutter_quill_extensions" + relative: true + source: path + version: "11.0.0-dev.3" + flutter_quill_test: + dependency: "direct dev" + description: + path: "../flutter_quill_test" + relative: true + source: path + version: "11.0.0-dev.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + gal: + dependency: transitive + description: + name: gal + sha256: "54c9b72528efce7c66234f3b6dd01cb0304fd8af8196de15571d7bdddb940977" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + gal_linux: + dependency: transitive + description: + name: gal_linux + sha256: "0040d61843134cc5a93e4597080a86f2ba073217957e28b2a684b4d8b050873c" + url: "https://pub.dev" + source: hosted + version: "0.1.2" + html: + dependency: transitive + description: + name: html + sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + url: "https://pub.dev" + source: hosted + version: "0.15.5" + http: + dependency: transitive + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image_picker: + dependency: transitive + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "8faba09ba361d4b246dc0a17cb4289b3324c2b9f6db7b3d457ee69106a86bd32" + url: "https://pub.dev" + source: hosted + version: "0.8.12+17" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b" + url: "https://pub.dev" + source: hosted + version: "0.8.12+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + url: "https://pub.dev" + source: hosted + version: "2.10.0" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + intl: + dependency: transitive + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 + url: "https://pub.dev" + source: hosted + version: "7.2.2" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + path: + dependency: "direct main" + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + photo_view: + dependency: transitive + description: + name: photo_view + sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e" + url: "https://pub.dev" + source: hosted + version: "0.15.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + quill_native_bridge: + dependency: transitive + description: + name: quill_native_bridge + sha256: "5ccf1930fe52db91846754bd56391d251071524ec594eb4c8509b3095f7f9e28" + url: "https://pub.dev" + source: hosted + version: "10.7.9" + quill_native_bridge_android: + dependency: transitive + description: + name: quill_native_bridge_android + sha256: "4e787041ad4ab99421dfed0199cb5a6f136b5f6a9e68d20b199064d85d4161d8" + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.4" + quill_native_bridge_ios: + dependency: transitive + description: + name: quill_native_bridge_ios + sha256: "16dd18a56bdc60f396eb873a0786141d8e3281cc0cb6ad7af24c2286abec43d8" + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.4" + quill_native_bridge_linux: + dependency: transitive + description: + name: quill_native_bridge_linux + sha256: a0d8aa775b36a7b8ac7ace5bd6ba05b21fed6c9b04a9f328f95489254ae0f7a3 + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.3" + quill_native_bridge_macos: + dependency: transitive + description: + name: quill_native_bridge_macos + sha256: "76d441a905181af04c51b9cf71a13e04c3dd51ed482dcb543a01e14d78ad3fc0" + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.2" + quill_native_bridge_platform_interface: + dependency: transitive + description: + name: quill_native_bridge_platform_interface + sha256: "5ad4a9cdb6fadd6575bca29c277f83daa324539c97f58cf45cff6195135defb9" + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.4" + quill_native_bridge_web: + dependency: transitive + description: + name: quill_native_bridge_web + sha256: bb3ab017fdb9b60a29cac0bce3acfd48396d13c1bd0499c97af112c84937b4d1 + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.5" + quill_native_bridge_windows: + dependency: transitive + description: + name: quill_native_bridge_windows + sha256: "78bc40cc4a23387ed79a309fc04f7a95a0b6da9ebce67f739dd08b0fd0523641" + url: "https://pub.dev" + source: hosted + version: "0.0.1-dev.3" + quiver: + dependency: transitive + description: + name: quiver + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + universal_html: + dependency: transitive + description: + name: universal_html + sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971" + url: "https://pub.dev" + source: hosted + version: "2.2.4" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + url: "https://pub.dev" + source: hosted + version: "6.3.14" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + video_player: + dependency: transitive + description: + name: video_player + sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" + url: "https://pub.dev" + source: hosted + version: "2.9.2" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898" + url: "https://pub.dev" + source: hosted + version: "2.7.16" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: cd5ab8a8bc0eab65ab0cea40304097edc46da574c8c1ecdee96f28cd8ef3792f + url: "https://pub.dev" + source: hosted + version: "2.6.2" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" + url: "https://pub.dev" + source: hosted + version: "6.2.3" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2" + url: "https://pub.dev" + source: hosted + version: "5.8.0" +sdks: + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 5666871d5..5f97bdeb2 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,55 +1,27 @@ -name: example -description: A demo for the Flutter Quill +name: flutter_quill_example +description: "Demonstrates how to use the flutter_quill package." publish_to: 'none' -version: 1.0.0+1 +version: 0.1.0+1 environment: - sdk: '>=3.1.5 <4.0.0' + sdk: ^3.0.0 + flutter: ">=3.10.0" + dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.6 - - # Flutter Quill Packages - flutter_quill: ^10.7.3 - dart_quill_delta: ^10.7.3 - flutter_quill_extensions: ^10.7.3 - flutter_quill_test: ^10.7.3 - # Dart Packages - path: ^1.8.3 - equatable: ^2.0.5 - cross_file: ^0.3.4 - cached_network_image: ^3.3.1 - simple_spell_checker: 1.2.1 - - # Bloc libraries - bloc: ^8.1.4 - flutter_bloc: ^8.1.5 - - # Freezed - freezed_annotation: ^2.4.1 - - # Json - json_annotation: ^4.8.1 + + flutter_quill: ^11.0.0-dev.4 + flutter_quill_extensions: ^11.0.0-dev.3 + path: ^1.9.0 - # Plugins - image_cropper: ^8.0.1 - path_provider: ^2.1.2 - # For drag and drop feature - # Switch to the pub.dev version after https://github.com/MixinNetwork/flutter-plugins/pull/351 - # is published - desktop_drop: - git: - url: https://github.com/MixinNetwork/flutter-plugins.git - path: packages/desktop_drop - ref: 0d1ce578abddd171b309b15847bd6e4f9163881e - # For picking quill document files - file_picker: ^8.0.0+1 - # For sharing text - share_plus: ^10.0.2 - google_fonts: ^6.2.1 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + flutter_quill_test: ^11.0.0-dev.2 dependency_overrides: flutter_quill: @@ -59,47 +31,7 @@ dependency_overrides: flutter_quill_test: path: ../flutter_quill_test -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^5.0.0 - build_runner: ^2.4.8 - flutter_gen_runner: ^5.4.0 - - # Freezed - freezed: ^2.4.7 - # Json - json_serializable: ^6.7.1 flutter: uses-material-design: true assets: - - assets/ - assets/images/ - - fonts: - - family: monospace - fonts: - - asset: assets/fonts/MonoSpace.ttf - - family: serif - fonts: - - asset: assets/fonts/Serif.ttf - - family: sans-serif - fonts: - - asset: assets/fonts/SansSerif.ttf - - family: ibarra-real-nova - fonts: - - asset: assets/fonts/IbarraRealNova-Regular.ttf - - family: square-peg - fonts: - - asset: assets/fonts/SquarePeg-Regular.ttf - - family: nunito - fonts: - - asset: assets/fonts/Nunito-Regular.ttf - - family: pacifico - fonts: - - asset: assets/fonts/Pacifico-Regular.ttf - - family: roboto-mono - fonts: - - asset: assets/fonts/RobotoMono-Regular.ttf - -flutter_gen: diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart deleted file mode 100644 index ab73b3a23..000000000 --- a/example/test/widget_test.dart +++ /dev/null @@ -1 +0,0 @@ -void main() {} diff --git a/example/web/index.html b/example/web/index.html index 27dfe197d..ae2b52d14 100644 --- a/example/web/index.html +++ b/example/web/index.html @@ -18,24 +18,19 @@ - + - + - Flutter Quill Example + flutter_quill_example - - - - - diff --git a/example/web/manifest.json b/example/web/manifest.json index 1088bbfd4..a5e32f660 100644 --- a/example/web/manifest.json +++ b/example/web/manifest.json @@ -1,11 +1,11 @@ { - "name": "Flutter Quill Example", - "short_name": "example", + "name": "flutter_quill_example", + "short_name": "flutter_quill_example", "start_url": ".", "display": "standalone", "background_color": "#0175C2", "theme_color": "#0175C2", - "description": "A new Flutter project.", + "description": "Demonstrates how to use the flutter_quill package.", "orientation": "portrait-primary", "prefer_related_applications": false, "icons": [ diff --git a/example/windows/CMakeLists.txt b/example/windows/CMakeLists.txt index d960948af..a46f53b49 100644 --- a/example/windows/CMakeLists.txt +++ b/example/windows/CMakeLists.txt @@ -1,10 +1,10 @@ # Project-level configuration. cmake_minimum_required(VERSION 3.14) -project(example LANGUAGES CXX) +project(flutter_quill_example LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. -set(BINARY_NAME "example") +set(BINARY_NAME "flutter_quill_example") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index 084810413..236a2f2b3 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -6,27 +6,15 @@ #include "generated_plugin_registrant.h" -#include #include #include -#include -#include -#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { - DesktopDropPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("DesktopDropPlugin")); FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); GalPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("GalPluginCApi")); - IrondashEngineContextPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("IrondashEngineContextPluginCApi")); - SharePlusWindowsPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); - SuperNativeExtensionsPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("SuperNativeExtensionsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index f568d1445..5d19bf7c2 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -3,12 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST - desktop_drop file_selector_windows gal - irondash_engine_context - share_plus - super_native_extensions url_launcher_windows ) diff --git a/example/windows/runner/Runner.rc b/example/windows/runner/Runner.rc index aecaa2b50..b72457872 100644 --- a/example/windows/runner/Runner.rc +++ b/example/windows/runner/Runner.rc @@ -89,13 +89,13 @@ BEGIN BEGIN BLOCK "040904e4" BEGIN - VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "example" "\0" + VALUE "CompanyName", "dev.flutterquill" "\0" + VALUE "FileDescription", "flutter_quill_example" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "example" "\0" - VALUE "LegalCopyright", "Copyright (C) 2023 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "example.exe" "\0" - VALUE "ProductName", "example" "\0" + VALUE "InternalName", "flutter_quill_example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 dev.flutterquill. All rights reserved." "\0" + VALUE "OriginalFilename", "flutter_quill_example.exe" "\0" + VALUE "ProductName", "flutter_quill_example" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/example/windows/runner/main.cpp b/example/windows/runner/main.cpp index a61bf80d3..bf60396fb 100644 --- a/example/windows/runner/main.cpp +++ b/example/windows/runner/main.cpp @@ -27,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); - if (!window.Create(L"example", origin, size)) { + if (!window.Create(L"flutter_quill_example", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); diff --git a/example/windows/runner/runner.exe.manifest b/example/windows/runner/runner.exe.manifest index a42ea7687..153653e8d 100644 --- a/example/windows/runner/runner.exe.manifest +++ b/example/windows/runner/runner.exe.manifest @@ -9,12 +9,6 @@ - - - - - - diff --git a/example/windows/runner/utils.cpp b/example/windows/runner/utils.cpp index b2b08734d..3a0b46511 100644 --- a/example/windows/runner/utils.cpp +++ b/example/windows/runner/utils.cpp @@ -45,13 +45,13 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { if (utf16_string == nullptr) { return std::string(); } - int target_length = ::WideCharToMultiByte( + unsigned int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, nullptr, 0, nullptr, nullptr) -1; // remove the trailing null character int input_length = (int)wcslen(utf16_string); std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { + if (target_length == 0 || target_length > utf8_string.max_size()) { return utf8_string; } utf8_string.resize(target_length); diff --git a/flutter_quill_extensions/CHANGELOG.md b/flutter_quill_extensions/CHANGELOG.md index 45a3e484d..1ac481e5a 100644 --- a/flutter_quill_extensions/CHANGELOG.md +++ b/flutter_quill_extensions/CHANGELOG.md @@ -1,3180 +1,42 @@ - - # Changelog All notable changes to this project will be documented in this file. -## 10.8.5 - -* fix: allow all correct URLs to be formatted by @orevial in https://github.com/singerdmx/flutter-quill/pull/2328 -* fix(macos): Implement actions for ExpandSelectionToDocumentBoundaryIntent and ExpandSelectionToLineBreakIntent to use keyboard shortcuts, unrelated cleanup to the bug fix. by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2279 - -## New Contributors -* @orevial made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2328 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.4...v10.8.5 - -## 10.8.4 - -- [Fixes an unhandled exception](https://github.com/singerdmx/flutter-quill/commit/8dd559b825030d29b30b32b353a08dcc13dc42b7) in case `getClipboardFiles()` wasn't supported -- [Updates min version](https://github.com/singerdmx/flutter-quill/commit/49569e47b038c5f61b7521571c102cf5ad5a0e3f) of internal dependency `quill_native_bridge` - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.3...v10.8.4 - -## 10.8.3 - -This release is identical to [v10.8.3-dev.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.3-dev.0), mainly published to bump the minimum version of [flutter_quill](https://pub.dev/packages/flutter_quill) in [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) and to publish [quill-super-clipboard](https://github.com/FlutterQuill/quill-super-clipboard/). - -A new identical release `10.9.0` will be published soon with a release description. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3 - -## 10.8.3-dev.0 - -A non-pre-release version with this change will be published soon. - -* feat: Use quill_native_bridge as default impl in DefaultClipboardService, fix related bugs in the extensions package by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2230 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.2...v10.8.3-dev.0 - -## 10.8.2 - -* Fixed minor typo in Hungarian (hu) localization by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2307 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.1...v10.8.2 - -## 10.8.1 - -- This release fixes the compilation issue when building the project with [Flutter/Wasm](https://docs.flutter.dev/platform-integration/web/wasm) target on the web. Also, update the conditional import check to avoid using `dart.library.html`: - - ```dart - import 'web/quill_controller_web_stub.dart' - if (dart.library.html) 'web/quill_controller_web_real.dart'; - ``` - - To fix critical bugs that prevent using the editor on Wasm. - - > Flutter/Wasm is stable as of [Flutter 3.22](https://medium.com/flutter/whats-new-in-flutter-3-22-fbde6c164fe3) though it's likely that you might experience some issues when using this new target, if you experienced any issues related to Wasm support related to Flutter Quill, feel free to [open an issue](https://github.com/singerdmx/flutter-quill/issues). - - Issue #1889 is fixed by temporarily replacing the plugin [flutter_keyboard_visibility](https://pub.dev/packages/flutter_keyboard_visibility) with [flutter_keyboard_visibility_temp_fork](https://pub.dev/packages/flutter_keyboard_visibility_temp_fork) since `flutter_keyboard_visibility` depend on `dart:html`. Also updated the `compileSdkVersion` to `34` instead of `31` as a workaround to [Flutter #63533](https://github.com/flutter/flutter/issues/63533). - -- Support for Hungarian (hu) localization was added by @G-Greg in https://github.com/singerdmx/flutter-quill/pull/2291. -- [dart_quill_delta](https://pub.dev/packages/dart_quill_delta/) has been moved to [FlutterQuill/dart-quill-delta](https://github.com/FlutterQuill/dart-quill-delta) (outside of this repo) and they have separated version now. - - -## New Contributors -* @G-Greg made their first contribution at https://github.com/singerdmx/flutter-quill/pull/2291 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.8.0...v10.8.1 - -## 10.8.0 - -> [!CAUTION] -> This release can be breaking change for `flutter_quill_extensions` users as it remove the built-in support for loading YouTube videos - -If you're using [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) then this release, can be a breaking change for you if you load videos in the editor and expect YouTube videos to be supported, [youtube_player_flutter](https://pub.dev/packages/youtube_player_flutter) and [flutter_inappwebview](https://pub.dev/packages/flutter_inappwebview) are no longer dependencies of the extensions package, which are used to support loading YouTube Iframe videos on non-web platforms, more details about the discussion and reasons in [#2286](https://github.com/singerdmx/flutter-quill/pull/2286) and [#2284](https://github.com/singerdmx/flutter-quill/issues/2284). - -We have added an experimental property that gives you more flexibility and control about the implementation you want to use for loading videos. - -> [!WARNING] -> It's likely to experience some common issues while implementing this feature, especially on desktop platforms as the support for [flutter_inappwebview_windows](https://pub.dev/packages/flutter_inappwebview_windows) and [flutter_inappwebview_macos](https://pub.dev/packages/flutter_inappwebview_macos) before 2 days. Some of the issues are in the Flutter Quill editor. - -If you want loading YouTube videos to be a feature again with the latest version of Flutter Quill, you can use an existing plugin or package, or implement your own solution. For example, you might use [`youtube_video_player`](https://pub.dev/packages/youtube_video_player) or [`youtube_player_flutter`](https://pub.dev/packages/youtube_player_flutter), which was previously used in [`flutter_quill_extensions`](https://pub.dev/packages/flutter_quill_extensions). - -Here’s an example setup using `youtube_player_flutter`: - -```shell -flutter pub add youtube_player_flutter -``` - -Example widget configuration: - -```dart -import 'package:flutter/material.dart'; -import 'package:youtube_player_flutter/youtube_player_flutter.dart'; - -class YoutubeVideoPlayer extends StatefulWidget { - const YoutubeVideoPlayer({required this.videoUrl, super.key}); - - final String videoUrl; - - @override - State createState() => _YoutubeVideoPlayerState(); -} - -class _YoutubeVideoPlayerState extends State { - late final YoutubePlayerController _youtubePlayerController; - @override - void initState() { - super.initState(); - _youtubePlayerController = YoutubePlayerController( - initialVideoId: YoutubePlayer.convertUrlToId(widget.videoUrl) ?? - (throw StateError('Expect a valid video URL')), - flags: const YoutubePlayerFlags( - autoPlay: true, - mute: true, - ), - ); - } - - @override - Widget build(BuildContext context) { - return YoutubePlayer( - controller: _youtubePlayerController, - showVideoProgressIndicator: true, - ); - } - - @override - void dispose() { - _youtubePlayerController.dispose(); - super.dispose(); - } -} - -``` - -Then, integrate it with `QuillEditorVideoEmbedConfigurations` - -```dart -FlutterQuillEmbeds.editorBuilders( - videoEmbedConfigurations: QuillEditorVideoEmbedConfigurations( - customVideoBuilder: (videoUrl, readOnly) { - // Example: Check for YouTube Video URL and return your - // YouTube video widget here. - bool isYouTubeUrl(String videoUrl) { - try { - final uri = Uri.parse(videoUrl); - return uri.host == 'www.youtube.com' || - uri.host == 'youtube.com' || - uri.host == 'youtu.be' || - uri.host == 'www.youtu.be'; - } catch (_) { - return false; - } - } - - if (isYouTubeUrl(videoUrl)) { - return YoutubeVideoPlayer( - videoUrl: videoUrl, - ); - } - - // Return null to fallback to the default logic - return null; - }, - ignoreYouTubeSupport: true, - ), -); -``` - -> [!NOTE] -> This example illustrates a basic approach, additional adjustments might be necessary to meet your specific needs. YouTube video support is no longer included in this project. Keep in mind that `customVideoBuilder` is experimental and can change without being considered as breaking change. More details in [breaking changes](https://github.com/singerdmx/flutter-quill#-breaking-changes) section. - -[`super_clipboard`](https://pub.dev/packages/super_clipboard) will also no longer a dependency of `flutter_quill_extensions` once [PR #2230](https://github.com/singerdmx/flutter-quill/pull/2230) is ready. - -We're looking forward to your feedback. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.7...v10.8.0 - -## 10.7.7 - -This version is nearly identical to `10.7.6` with a build failure bug fix in [#2283](https://github.com/singerdmx/flutter-quill/pull/2283) related to unmerged change in [#2230](https://github.com/singerdmx/flutter-quill/pull/2230) - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.6...v10.7.7 - -## 10.7.6 - -* Code Comments Typo fixes by @Luismi74 in https://github.com/singerdmx/flutter-quill/pull/2267 -* docs: add important note for contributors before introducing new features by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2269 -* docs(readme): add 'Breaking Changes' section by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2275 -* Fix: Resolved issue with broken IME composing rect in Windows desktop(re-implementation) by @agata in https://github.com/singerdmx/flutter-quill/pull/2282 - -## New Contributors -* @Luismi74 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2267 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.5...v10.7.6 - -## 10.7.5 - -* fix(ci): add flutter pub get step for quill_native_bridge by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2265 -* revert: "Resolved issue with broken IME composing rect in Windows desktop" by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2266 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.4...v10.7.5 - -## 10.7.4 - -* chore: remove pubspec_overrides.yaml and pubspec_overrides.yaml.disabled by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2262 -* ci: remove quill_native_bridge from automated publishing workflow by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2263 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.3...v10.7.4 - -## 10.7.3 - -- Deprecate `FlutterQuillExtensions` in `flutter_quill_extensions` -- Update the minimum version of `flutter_quill` and `super_clipboard` in `flutter_quill_extensions` to avoid using deprecated code. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.2...v10.7.3 - -## 10.7.2 - -## What's Changed -* chore: deprecate flutter_quill/extensions.dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2258 - -This is a minor release introduced to upload a new version of `flutter_quill` and `flutter_quill_extensions` to update the minimum required to avoid using deprecated code in `flutter_quill_extensions`. - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.1...v10.7.2 - -## 10.7.1 - -* chore: deprecate markdown_quill export, ignore warnings by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2256 -* chore: deprecate spell checker service by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2255 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.7.0...v10.7.1 - -## 10.7.0 - -* Chore: deprecate embed table feature by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2254 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.6...v10.7.0 - -## 10.6.6 - -* Bug fix: Removing check not allowing spell check on web by @joeserhtf in https://github.com/singerdmx/flutter-quill/pull/2252 - -## New Contributors -* @joeserhtf made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2252 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.5...v10.6.6 - -## 10.6.5 - -* Refine IME composing range styling by applying underline as text style by @agata in https://github.com/singerdmx/flutter-quill/pull/2244 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.4...v10.6.5 - -## 10.6.4 - -* fix: the composing text did not show an underline during IME conversion by @agata in https://github.com/singerdmx/flutter-quill/pull/2242 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.3...v10.6.4 - -## 10.6.3 - -* Fix: Resolved issue with broken IME composing rect in Windows desktop by @agata in https://github.com/singerdmx/flutter-quill/pull/2239 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.2...v10.6.3 - -## 10.6.2 - -* Fix: QuillToolbarToggleStyleButton Switching failure by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2234 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.1...v10.6.2 - -## 10.6.1 - -* Chore: update `flutter_quill_delta_from_html` to remove exception calls by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2232 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.6.0...v10.6.1 - -## 10.6.0 - -* docs: cleanup the docs, remove outdated resources, general changes by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2227 -* Feat: customizable character and space shortcut events by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2228 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.19...v10.6.0 - -## 10.5.19 - -* fix: properties other than 'style' for custom inline code styles (such as 'backgroundColor') were not being applied correctly by @agata in https://github.com/singerdmx/flutter-quill/pull/2226 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.18...v10.5.19 - -## 10.5.18 - -* feat(web): rich text paste from Clipboard using HTML by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2009 -* revert: disable rich text paste feature on web as a workaround by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2221 -* refactor: moved shortcuts and onKeyEvents to its own file by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2223 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.17...v10.5.18 - -## 10.5.17 - -* feat(l10n): localize all untranslated.json by @erdnx in https://github.com/singerdmx/flutter-quill/pull/2217 -* Fix: Block Attributes are not displayed if the editor is empty by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2210 - -## New Contributors -* @erdnx made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2217 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.16...v10.5.17 - -## 10.5.16 - -* chore: remove device_info_plus and add quill_native_bridge to access platform specific APIs by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2194 -* Not show/update/hiden mangnifier when manifier config is disbale by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2212 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.16 - -## 10.5.15-dev.0 - -Introduce `quill_native_bridge` which is an internal plugin to use by `flutter_quill` to access platform APIs. - -For now, the only functionality it supports is to check whatever the iOS app is running on iOS simulator without requiring [`device_info_plus`](pub.dev/packages/device_info_plus) as a dependency. - -> [!NOTE] -> `quill_native_bridge` is a plugin for internal use and should not be used in production applications -> as breaking changes can happen and can removed at any time. - -For more details and discussion see [#2194](https://github.com/singerdmx/flutter-quill/pull/2194). - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.14...v10.5.15-dev.0 - -## 10.5.14 - -* chore(localization): add Greek language support by @DKalathas in https://github.com/singerdmx/flutter-quill/pull/2206 - -## New Contributors -* @DKalathas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2206 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.13...v10.5.14 - -## 10.5.13 - -* Revert "Fix: Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2201 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.12...v10.5.13 - -## 10.5.12 - -* Fix: Backspace remove block attributes at start by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2200 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.11...v10.5.12 - -## 10.5.11 - -* Enhancement: Backspace handling at the start of blocks in delete rules by @agata in https://github.com/singerdmx/flutter-quill/pull/2199 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.10...v10.5.11 - -## 10.5.10 - -* Allow backspace at start of document to remove block style and header style by @agata in https://github.com/singerdmx/flutter-quill/pull/2198 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.9...v10.5.10 - -## 10.5.9 - -* chore: improve platform check by using constants and defaultTargetPlatform by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2188 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.8...v10.5.9 - -## 10.5.8 - -* Feat: Add configuration option to always indent on TAB key press by @agata in https://github.com/singerdmx/flutter-quill/pull/2187 - -## New Contributors -* @agata made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2187 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.7...v10.5.8 - -## 10.5.7 - -* chore(example): downgrade Kotlin from 1.9.24 to 1.7.10 by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2185 -* style: refactor build leading function style, width, and padding parameters for custom node leading builder by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2182 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.6...v10.5.7 - -## 10.5.6 - -* chore(deps): update super_clipboard to 0.8.20 in flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2181 -* Update quill_screen.dart, i chaged the logic for showing a lock when … by @rightpossible in https://github.com/singerdmx/flutter-quill/pull/2183 - -## New Contributors -* @rightpossible made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2183 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.5...v10.5.6 - -## 10.5.5 - -* Fix text selection handles when scroll mobile by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2176 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.4...v10.5.5 - -## 10.5.4 - -* Add Thai (th) localization by @silkyland in https://github.com/singerdmx/flutter-quill/pull/2175 - -## New Contributors -* @silkyland made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2175 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.3...v10.5.4 - -## 10.5.3 - -* Fix: Assertion Failure in line.dart When Editing Text with Block-Level Attributes by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2174 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.2...v10.5.3 - -## 10.5.2 - -* fix(toolbar): regard showDividers in simple toolbar by @realth000 in https://github.com/singerdmx/flutter-quill/pull/2172 - -## New Contributors -* @realth000 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2172 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.1...v10.5.2 - -## 10.5.1 - -* fix drag selection extension (does not start at tap location if you are dragging quickly by @jezell in https://github.com/singerdmx/flutter-quill/pull/2170 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.5.0...v10.5.1 - -## 10.5.0 - -* Feat: custom leading builder by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2146 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.9...v10.5.0 - -## 10.4.9 - -* fix floating cursor not disappearing after scroll end by @vishna in https://github.com/singerdmx/flutter-quill/pull/2163 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.8...v10.4.9 - -## 10.4.8 - -* Fix: direction has no opposite effect if the language is rtl by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2154 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.7...v10.4.8 - -## 10.4.7 - -* Fix: Unable to scroll 2nd editor window by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2152 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.6...v10.4.7 - -## 10.4.6 - -* Handle null child query by @jezell in https://github.com/singerdmx/flutter-quill/pull/2151 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.5...v10.4.6 - -## 10.4.5 - -* chore!: move spell checker to example by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2145 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.4...v10.4.5 - -## 10.4.4 - -* fix custom recognizer builder not being passed to editabletextblock by @jezell in https://github.com/singerdmx/flutter-quill/pull/2143 -* fix null reference exception when dragging selection on non scrollable selection by @jezell in https://github.com/singerdmx/flutter-quill/pull/2144 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.3...v10.4.4 - -## 10.4.3 - -* Chore: update simple_spell_checker package by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2139 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.2...v10.4.3 - -## 10.4.2 - -* Revert "fix: Double click to select text sometimes doesn't work. ([#2086](https://github.com/singerdmx/flutter-quill/pull/2086)) - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.1...v10.4.2 - -## 10.4.1 - -* Chore: improve Spell checker API to the example by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2133 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.4.0...v10.4.1 - -## 10.4.0 - -* Copy TapAndPanGestureRecognizer from TextField by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2128 -* enhance stringToColor with a custom defined palette from `DefaultStyles` by @vishna in https://github.com/singerdmx/flutter-quill/pull/2095 -* Feat: include spell checker for example app by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2127 - -## New Contributors -* @vishna made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2095 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.3...v10.4.0 - -## 10.3.2 - -* Fix: Loss of style when backspace by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2125 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.1...v10.3.2 - -## 10.3.1 - -* Chore: Move spellchecker service to extensions by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2120 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.3.0...v10.3.1 - -## 10.3.0 - -* Feat: Spellchecker for Flutter Quill by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2118 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.1...v10.3.0 - -## 10.2.1 - -* Fix: context menu is visible even when selection is collapsed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2116 -* Fix: unsafe operation while getting overlayEntry in text_selection by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2117 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.2.0...v10.2.1 - -## 10.2.0 - -* refactor!: restructure project into modular architecture for flutter_quill_extensions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2106 -* Fix: Link selection and editing by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2114 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.10...v10.2.0 - -## 10.1.10 - -* Fix(example): image_cropper outdated version by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2100 -* Using dart.library.js_interop instead of dart.library.html by @h1376h in https://github.com/singerdmx/flutter-quill/pull/2103 - -## New Contributors -* @h1376h made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2103 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.9...v10.1.10 - -## 10.1.9 - -* restore ability to pass in key to QuillEditor by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2093 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.8...v10.1.9 - -## 10.1.8 - -* Enhancement: Search within Embed objects by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2090 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.7...v10.1.8 - -## 10.1.7 - -* Feature/allow shortcut override by @InstrinsicAutomations in https://github.com/singerdmx/flutter-quill/pull/2089 - -## New Contributors -* @InstrinsicAutomations made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2089 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.6...v10.1.7 - -## 10.1.6 - -* fixed #1295 Double click to select text sometimes doesn't work. by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2086 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.5...v10.1.6 - -## 10.1.5 - -* ref: add `VerticalSpacing.zero` and `HorizontalSpacing.zero` named constants by @adil192 in https://github.com/singerdmx/flutter-quill/pull/2083 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.4...v10.1.5 - -## 10.1.4 - -* Fix: collectStyles for lists and alignments by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2082 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.3...v10.1.4 - -## 10.1.3 - -* Move Controller outside of configurations data class by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2078 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.2...v10.1.3 - -## 10.1.2 - -* Fix Multiline paste with attributes and embeds by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2074 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.1...v10.1.2 - -## 10.1.1 - -* Toolbar dividers fixes + Docs updates by @troyanskiy in https://github.com/singerdmx/flutter-quill/pull/2071 - -## New Contributors -* @troyanskiy made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2071 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.1.0...v10.1.1 - -## 10.1.0 - -* Feat: support for customize copy and cut Embeddables to Clipboard by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2067 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.10...v10.1.0 - -## 10.0.10 - -* fix: Hide selection toolbar if editor loses focus by @huandu in https://github.com/singerdmx/flutter-quill/pull/2066 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.9...v10.0.10 - -## 10.0.9 - -* Fix: manual checking of directionality by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2063 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.8...v10.0.9 - -## 10.0.8 - -* feat: add callback to handle performAction by @huandu in https://github.com/singerdmx/flutter-quill/pull/2061 -* fix: Invalid selection when tapping placeholder text by @huandu in https://github.com/singerdmx/flutter-quill/pull/2062 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.7...v10.0.8 - -## 10.0.7 - -* Fix: RTL issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2060 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.6...v10.0.7 - -## 10.0.6 - -* fix: textInputAction is not set when creating QuillRawEditorConfiguration by @huandu in https://github.com/singerdmx/flutter-quill/pull/2057 - -## New Contributors -* @huandu made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2057 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.5...v10.0.6 - -## 10.0.5 - -* Add tests for PreserveInlineStylesRule and fix link editing. Other minor fixes. by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2058 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.4...v10.0.5 - -## 10.0.4 - -* Add ability to set up horizontal spacing for block style by @dimkanovikov in https://github.com/singerdmx/flutter-quill/pull/2051 -* add catalan language by @spilioio in https://github.com/singerdmx/flutter-quill/pull/2054 - -## New Contributors -* @dimkanovikov made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2051 -* @spilioio made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2054 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.3...v10.0.4 - -## 10.0.3 - -* doc(Delta): more documentation about Delta by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2042 -* doc(attribute): added documentation about Attribute class and how create one by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2048 -* if magnifier removes toolbar, restore it when it is hidden by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/2049 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.2...v10.0.3 - -## 10.0.2 - -* chore(scripts): migrate the scripts from sh to dart by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2036 -* Have the ability to create custom rules, closes #1162 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/2040 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.1...v10.0.2 - -## 10.0.1 - -This release is identical to [10.0.0](https://github.com/singerdmx/flutter-quill/releases/tag/v10.0.0) with a fix that addresses issue #2034 by requiring `10.0.0` as the minimum version for quill related dependencies. - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v10.0.0...v10.0.1 - -## 10.0.0 - -* refactor: restructure project into modular architecture for flutter_quill by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2032 -* chore: update GitHub PR template by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2033 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.6.0...v10.0.0 - -## 9.6.0 - -* [feature] : quill add magnifier by @demoYang in https://github.com/singerdmx/flutter-quill/pull/2026 - -## New Contributors -* @demoYang made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2026 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.23...v9.6.0 - -## 9.5.23 - -* add untranslated Kurdish keys by @Xoshbin in https://github.com/singerdmx/flutter-quill/pull/2029 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.22...v9.5.23 - -## 9.5.22 - -* Fix outdated contributor guide link on PR template by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2027 -* Fix(rule): PreserveInlineStyleRule assume the type of the operation data and throw stacktrace by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2028 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.21...v9.5.22 - -## 9.5.21 - -* Fix: Key actions not being handled by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/2025 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.20...v9.5.21 - -## 9.5.20 - -* Remove useless delta_x_test by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2017 -* Update flutter_quill_delta_from_html package on pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2018 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.19...v9.5.20 - -## 9.5.19 - -* fixed #1835 Embed Reloads on Cmd Key Press by @li8607 in https://github.com/singerdmx/flutter-quill/pull/2013 - -## New Contributors -* @li8607 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/2013 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.18...v9.5.19 - -## 9.5.18 - -* Refactor: Moved core link button functions to link.dart by @Alspb in https://github.com/singerdmx/flutter-quill/pull/2008 -* doc: more documentation about Rules by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2014 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.17...v9.5.18 - -## 9.5.17 - -* Feat(config): added option to disable automatic list conversion by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2011 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.16...v9.5.17 - -## 9.5.16 - -* chore: drop support for HTML, PDF, and Markdown converting functions by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1997 -* docs(readme): update the extensions package to document the Rich Text Paste feature on web by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/2001 -* Fix(test): delta_x tests fail by wrong expected Delta for video embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2010 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.15...v9.5.16 - -## 9.5.15 - -* Update delta_from_html to fix nested lists issues and more by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/2000 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.14...v9.5.15 - -## 9.5.14 - -* docs(readme): update 'Conversion to HTML' section to include more details by @EchoEllet in https://github.com/singerdmx/flutter-quill/pull/1996 -* Update flutter_quill_delta_from_html on pubspec.yaml to fix current issues by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1999 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.13...v9.5.14 - -## 9.5.13 - -* Added new default ConverterOptions configurations by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1990 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.12...v9.5.13 - -## 9.5.12 - -* fix: Fixed passing textStyle to formula embed by @shubham030 in https://github.com/singerdmx/flutter-quill/pull/1989 - -## New Contributors -* @shubham030 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1989 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.11...v9.5.12 - -## 9.5.11 - -* Update flutter_quill_delta_from_html in pubspec.yaml by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1988 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.10...v9.5.11 - -## 9.5.10 - -* chore: remove dependency html converter by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1987 -* Fix: LineHeight button to use MenuAnchor by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1986 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.9...v9.5.10 - -## 9.5.9 - -* Update pubspec.yaml to remove html2md by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1985 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.8...v9.5.9 - -## 9.5.8 - -* fix(typo): fix typo ClipboardServiceProvider.instacne by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1983 -* Feat: New way to get Delta from HTML inputs by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1984 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.7...v9.5.8 - -## 9.5.7 - -* refactor: context menu function, add test code by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1979 -* Fix: PreserveInlineStylesRule by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1980 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.6...v9.5.7 - -## 9.5.6 - -* fix: common link is detected as a video link by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1978 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.5...v9.5.6 - -## 9.5.5 - -* fix: context menu behavior in mouse, desktop env by @n7484443 in https://github.com/singerdmx/flutter-quill/pull/1976 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.4...v9.5.5 - -## 9.5.4 - -* Feat: Line height support by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1972 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.3...v9.5.4 - -## 9.5.3 - -* Perf: Performance optimization by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1964 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.2...v9.5.3 - -## 9.5.2 - -* Fix style settings by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1962 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.1...v9.5.2 - -## 9.5.1 - -* feat(extensions): Youtube Video Player Support Mode by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1916 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.5.0...v9.5.1 - -## 9.5.0 - -* Partial support for table embed by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1960 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.9...v9.5.0 - -## 9.4.9 - -* Upgrade photo_view to 0.15.0 for flutter_quill_extensions by @singerdmx in https://github.com/singerdmx/flutter-quill/pull/1958 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.8...v9.4.9 - -## 9.4.8 - -* Add support for html underline and videos by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1955 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.7...v9.4.8 - -## 9.4.7 - -* fixed #1953 italic detection error by @CatHood0 in https://github.com/singerdmx/flutter-quill/pull/1954 - -## New Contributors -* @CatHood0 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1954 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.6...v9.4.7 - -## 9.4.6 - -* fix: search dialog throw an exception due to missing FlutterQuillLocalizations.delegate in the editor by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1938 -* fix(editor): implement editor shortcut action for home and end keys to fix exception about unimplemented ScrollToDocumentBoundaryIntent by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1937 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.5...v9.4.6 - -## 9.4.5 - -* fix: color picker hex unfocus on web by @geronimol in https://github.com/singerdmx/flutter-quill/pull/1934 - -## New Contributors -* @geronimol made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1934 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.4...v9.4.5 - -## 9.4.4 - -* fix: Enabled link regex to be overridden by @JoepHeijnen in https://github.com/singerdmx/flutter-quill/pull/1931 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.3...v9.4.4 - -## 9.4.3 - -* Fix: setState() called after dispose(): QuillToolbarClipboardButtonState #1895 by @windows7lake in https://github.com/singerdmx/flutter-quill/pull/1926 - -## New Contributors -* @windows7lake made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1926 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.2...v9.4.3 - -## 9.4.2 - -* Respect autofocus, closes #1923 by @Guillergood in https://github.com/singerdmx/flutter-quill/pull/1924 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.1...v9.4.2 - -## 9.4.1 - -* replace base64 regex string by @salba360496 in https://github.com/singerdmx/flutter-quill/pull/1919 - -## New Contributors -* @salba360496 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1919 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.4.0...v9.4.1 - -## 9.4.0 - -This release can be used without changing anything, although it can break the behavior a little, we provided a way to use the old behavior in `9.3.x` - -- Thanks to @Alspb, the search bar/dialog has been reworked for improved UI that fits **Material 3** look and feel, the search happens on the fly, and other minor changes, if you want the old search bar, you can restore it with one line if you're using `QuillSimpleToolbar`: - ```dart - QuillToolbar.simple( - configurations: QuillSimpleToolbarConfigurations( - searchButtonType: SearchButtonType.legacy, - ), - ) - ``` - While the changes are mostly to the `QuillToolbarSearchDialog` and it seems this should be `searchDialogType`, we provided the old button with the old dialog in case we update the button in the future. - - If you're using `QuillToolbarSearchButton` in a custom Toolbar, you don't need anything to get the new button. if you want the old button, use the `QuillToolbarLegacySearchButton` widget - - Consider using the improved button with the improved dialog as the legacy button might removed in future releases (for now, it's not deprecated) - -
- Before - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/9b40ad03-717f-4518-95f1-8d9cad773b2b) - - -
- -
- Improved - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/e581733d-63fa-4984-9c41-4a325a0a0c04) - -
- - For the detailed changes, see #1904 - -- Korean translations by @leegh519 in https://github.com/singerdmx/flutter-quill/pull/1911 - -- The usage of `super_clipboard` plugin in `flutter_quill` has been moved to the `flutter_quill_extensions` package, this will restore the old behavior in `8.x.x` though it will break the `onImagePaste`, `onGifPaste` and rich text pasting from HTML or Markdown, most of those features are available in `super_clipboard` plugin except `onImagePaste` which was available as we were using [pasteboard](https://pub.dev/packages/pasteboard), Unfortunately, it's no longer supported on recent versions of Flutter, and some functionalities such as an image from Clipboard and Html paste are not supported on some platforms such as Android, your project will continue to work, calls of `onImagePaste` and `onGifPaste` will be ignored unless you include [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions) package in your project and call: - - ```dart - FlutterQuillExtensions.useSuperClipboardPlugin(); - ``` - Before using any `flutter_quill` widgets, this will restore the old behavior in `9.x.x` - - We initially wanted to publish `flutter_quill_super_clipboard` to allow: - - Using `super_clipboard` without `flutter_quill_extensions` packages and plugins - - Using `flutter_quill_extensions` with optional `super_clipboard` - - To simplify the usage, we moved it to `flutter_quill_extensions`, let us know if you want any of the use cases above. - - Overall `super_clipboard` is a Comprehensive clipboard plugin with a lot of features, the only thing that developers didn't want is Rust installation even though it's automated. - - The main goal of `ClipboardService` is to make `super_clipboard` optional, you can use your own implementation, and create a class that implements `ClipboardService`, which you can get by: - ```dart - // ignore: implementation_imports - import 'package:flutter_quill/src/services/clipboard/clipboard_service.dart'; - ``` - - Then you can call: - ```dart - // ignore: implementation_imports -import 'package:flutter_quill/src/services/clipboard/clipboard_service_provider.dart'; - ClipboardServiceProvider.setInstance(YourClipboardService()); -``` - - The interface could change at any time and will be updated internally for `flutter_quill` and `flutter_quill_extensions`, we didn't export those two classes by default to avoid breaking changes in case you use them as we might change them in the future. - - If you use the above imports, you might get **breaking changes** in **non-breaking change releases**. - -- Subscript and Superscript should now work for all languages and characters - - The previous implementation required the Apple 'SF-Pro-Display-Regular.otf' font which is only licensed/permitted for use on Apple devices. -We have removed the Apple font from the example - -- Allow pasting Markdown and HTML file content from the system to the editor - - Before `9.4.x` if you try to copy an HTML or Markdown file, and paste it into the editor, you will get the file name in the editor - Copying an HTML file, or HTML content from apps and websites is different than copying plain text. - - This is why this change requires `super_clipboard` implementation as this is platform-dependent: - ```dart - FlutterQuillExtensions.useSuperClipboardPlugin(); - ``` - as mentioned above. - - The following example for copying a Markdown file: - -
- Markdown File Content - - ```md - - **Note**: This package supports converting from HTML back to Quill delta but it's experimental and used internally when pasting HTML content from the clipboard to the Quill Editor - - You have two options: - - 1. Using [quill_html_converter](./quill_html_converter/) to convert to HTML, the package can convert the Quill delta to HTML well - (it uses [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html)), it is just a handy extension to do it more quickly - 1. Another option is to use - [vsc_quill_delta_to_html](https://pub.dev/packages/vsc_quill_delta_to_html) to convert your document - to HTML. - This package has full support for all Quill operations—including images, videos, formulas, - tables, and mentions. - Conversion can be performed in vanilla Dart (i.e., server-side or CLI) or in Flutter. - It is a complete Dart part of the popular and mature [quill-delta-to-html](https://www.npmjs.com/package/quill-delta-to-html) - Typescript/Javascript package. - this package doesn't convert the HTML back to Quill Delta as far as we know - - ``` - -
- -
- Before - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/03f5ae20-796c-4e8b-8668-09a994211c1e) - -
- -
- After - - ![image](https://github.com/singerdmx/flutter-quill/assets/73608287/7e3a1987-36e7-4665-944a-add87d24e788) - -
- - Markdown, and HTML converting from and to Delta are **currently far from perfect**, the current implementation could improved a lot - however **it will likely not work like expected**, due to differences between HTML and Delta, see this [comment](https://github.com/slab/quill/issues/1551#issuecomment-311458570) for more info. - - ![Copying Markdown file into Flutter Quill Editor](https://github.com/singerdmx/flutter-quill/assets/73608287/63bd6ba6-cc49-4335-84dc-91a0fa5c95a9) - - For more details see #1915 - - Using or converting to HTML or Markdown is highly experimental and shouldn't be used for production applications. - - We use it internally as it is more suitable for our specific use case., copying content from external websites and pasting it into the editor - previously breaks the styles, while the current implementation is not ready, it provides a better user experience and doesn't have many downsides. - - Feel free to report any bugs or feature requests at [Issues](https://github.com/singerdmx/flutter-quill/issues) or drop any suggestions and questions at [Discussions](https://github.com/singerdmx/flutter-quill/discussions) - -## New Contributors -* @leegh519 made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1911 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.21...v9.4.0 - -## 9.3.21 - -* fix: assertion failure for swipe typing and undo on Android by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1898 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.20...v9.3.21 - -## 9.3.20 - -* Fix: Issue 1887 by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1892 -* fix: toolbar style change will be invalid when inputting more than 2 characters at a time by @crasowas in https://github.com/singerdmx/flutter-quill/pull/1890 - -## New Contributors -* @crasowas made their first contribution in https://github.com/singerdmx/flutter-quill/pull/1890 - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.19...v9.3.20 - -## 9.3.19 - -* Fix reported issues by @AtlasAutocode in https://github.com/singerdmx/flutter-quill/pull/1886 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.18...v9.3.19 - -## 9.3.18 - -* Fix: Undo/redo cursor position fixed by @Alspb in https://github.com/singerdmx/flutter-quill/pull/1885 - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.17...v9.3.18 - -## 9.3.17 - -* Update super_clipboard plugin to 0.8.15 to address [#1882](https://github.com/singerdmx/flutter-quill/issues/1882) - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.16...v9.3.17 - -## 9.3.16 - -* Update `lint` dev package to 4.0.0 -* Require at least version 0.8.13 of the plugin - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.15...v9.3.16 - -## 9.3.15 - - -* Ci/automate updating the files by @ellet0 in https://github.com/singerdmx/flutter-quill/pull/1879 -* Updating outdated README.md and adding a few guidelines for CONTRIBUTING.md - - -**Full Changelog**: https://github.com/singerdmx/flutter-quill/compare/v9.3.14...v9.3.15 - -## 9.3.14 - -* Chore/use original color picker package in [#1877](https://github.com/singerdmx/flutter-quill/pull/1877) - -## 9.3.13 - -* fix: `readOnlyMouseCursor` losing in construction function -* Fix block multi-line selection style - -## 9.3.12 - -* Add `readOnlyMouseCursor` to config mouse cursor type - -## 9.3.11 - -* Fix typo in QuillHtmlConverter -* Fix re-create checkbox - -## 9.3.10 - -* Support clipboard actions from the toolbar - -## 9.3.9 - -* fix: MD Parsing for multi space -* fix: FontFamily and FontSize toolbars track the text selected in the editor -* feat: Add checkBoxReadOnly property which can override readOnly for checkbox - -## 9.3.8 - -* fix: removed misleading parameters -* fix: added missed translations for ru, es, de -* added translations for Nepali Locale('ne', 'NP') - -## 9.3.7 - -* Fix for keyboard jumping when switching focus from a TextField -* Toolbar button styling to reflect cursor position when running on desktops with keyboard to move care - -## 9.3.6 - -* Add SK and update CS locales [#1796](https://github.com/singerdmx/flutter-quill/pull/1796) -* Fixes: - * QuillIconTheme changes for FontFamily and FontSize buttons are not applied [#1797](https://github.com/singerdmx/flutter-quill/pull/1796) - * Make the arrow_drop_down icons in the QuillToolbar the same size for all MenuAnchor buttons [#1799](https://github.com/singerdmx/flutter-quill/pull/1796) - -## 9.3.5 - -* Update the minimum version for the packages to support `device_info_plus` version 10.0.0 [#1783](https://github.com/singerdmx/flutter-quill/issues/1783) -* Update the minimum version for `youtube_player_flutter` to new major version 9.0.0 in the `flutter_quill_extensions` - -## 9.3.4 - -* fix: multiline styling stuck/not working properly [#1782](https://github.com/singerdmx/flutter-quill/pull/1782) - -## 9.3.3 - -* Update `quill_html_converter` versions - -## 9.3.2 - -* Fix dispose of text painter [#1774](https://github.com/singerdmx/flutter-quill/pull/1774) - -## 9.3.1 - -* Require Flutter 3.19.0 as minimum version - -## 9.3.0 - -* **Breaking change**: `Document.fromHtml(html)` is now returns `Document` instead of `Delta`, use `DeltaX.fromHtml` to return `Delta` -* Update old deprecated api from Flutter 3.19 -* Scribble scroll fix by @mtallenca in https://github.com/singerdmx/flutter-quill/pull/1745 - -## 9.2.14 - -* feat: move cursor after inserting video/image -* Apple pencil - -## 9.2.13 - -* Fix crash with inserting text from contextMenuButtonItems -* Fix incorrect behaviour of context menu -* fix: selection handles behaviour and unnessesary style assert -* Update quill_fr.arb - -## 9.2.12 - -* Fix safari clipboard bug -* Add the option to disable clipboard functionality - -## 9.2.11 - -* Fix a bug where it has problems with pasting text into the editor when the clipboard has styled text - -## 9.2.10 - -* Update example screenshots -* Refactor `Container` to `QuillContainer` with backward compatibility -* A workaround fix in history feature - -## 9.2.9 - -* Refactor the type of `Delta().toJson()` to be more clear type - -## 9.2.8 - -* feat: Export Container node as QuillContainer -* fix web cursor position / height (don't use iOS logic) -* Added Swedish translation - -## 9.2.6 - -* [fix selection.affinity always downstream after updateEditingValue](https://github.com/singerdmx/flutter-quill/pull/1682) -* Bumb version of `super_clipboard` - -## 9.2.5 - -* Bumb version of `super_clipboard` - -## 9.2.4 - -* Use fixed version of intl - -## 9.2.3 - -* remove unncessary column in Flutter quill video embed block - -## 9.2.2 - -* Fix bug [#1627](https://github.com/singerdmx/flutter-quill/issues/1627) - -## 9.2.1 - -* Fix [bug](https://github.com/singerdmx/flutter-quill/issues/1119#issuecomment-1872605246) with font size button -* Added ro RO translations -* 📖 Update zh, zh_CN translations - -## 9.2.0 - -* Require minimum version `6.0.0` of `flutter_keyboard_visibility` to fix some build issues with Android Gradle Plugin 8.2.0 -* Add on image clicked in `flutter_quill_extensions` callback -* Deprecate `globalIconSize` and `globalIconButtonFactor`, use `iconSize` and `iconButtonFactor` instead -* Fix the `QuillToolbarSelectAlignmentButtons` - -## 9.1.1 - -* Require `super_clipboard` minimum version `0.8.1` to fix some bug with Linux build failure - -## 9.1.1-dev - -* Fix bug [#1636](https://github.com/singerdmx/flutter-quill/issues/1636) -* Fix a where you paste styled content (HTML) it always insert a new line at first even if the document is empty -* Fix the font size button and migrate to `MenuAnchor` -* The `defaultDisplayText` is no longer required in the font size and header dropdown buttons -* Add pdf converter in a new package (`quill_pdf_converter`) - -## 9.1.0 - -* Fix the simple toolbar by add properties of `IconButton` and fix some buttons - -## 9.1.0-dev.2 - -* Fix the history buttons - -## 9.1.0-dev.1 - -* Bug fixes in the simple toolbar buttons - -## 9.1.0-dev - -* **Breaking Change**: in the `QuillSimpleToolbar` Fix the `QuillIconTheme` by replacing all the properties with two properties of type `ButtonStyle`, use `IconButton.styleFrom()` - -## 9.0.6 - -* Fix bug in QuillToolbarSelectAlignmentButtons - -## 9.0.5 - -* You can now use most of the buttons without internal provider - -## 9.0.4 - -* Feature: [#1611](https://github.com/singerdmx/flutter-quill/issues/1611) -* Export missing widgets - -## 9.0.3 - -* Flutter Quill Extensions: - * Fix file image support for web image emebed builder - -## 9.0.2 - -* Remove unused properties in the `QuillToolbarSelectHeaderStyleDropdownButton` -* Fix the `QuillSimpleToolbar` when `useMaterial3` is false, please upgrade to the latest version of flutter for better support - -## 9.0.2-dev.3 - -* Export `QuillSingleChildScrollView` - -## 9.0.2-dev.2 - -* Add the new translations for ru, uk arb files by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) -* Add a new dropdown button by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) -* Update the default style values by [#1575](https://github.com/singerdmx/flutter-quill/pull/1575) -* Fix bug [#1562](https://github.com/singerdmx/flutter-quill/issues/1562) -* Fix the second bug of [#1480](https://github.com/singerdmx/flutter-quill/issues/1480) - -## 9.0.2-dev.1 - -* Add configurations for the new dropdown `QuillToolbarSelectHeaderStyleButton`, you can use the orignal one or this -* Fix the [issue](https://github.com/singerdmx/flutter-quill/issues/1119) when enter is pressed, all font settings is lost - -## 9.0.2-dev - -* **Breaking change** Remove the spacer widget, removed the controller option for each button -* Add `toolbarRunSpacing` property to the simple toolbar - -## 9.0.1 - -* Fix default icon size - -## 9.0.0 - -* This version is quite stable but it's not how we wanted to be, because the lack of time and there are not too many maintainers active, we decided to publish it, we might make a new breaking changes verion - -## 9.0.1-dev.1 - -* Flutter Quill Extensions: - * Update `QuillImageUtilities` and fixining some bugs - -## 9.0.1-dev - -* Test new GitHub workflows - -## 9.0.0-dev-10 - -* Fix a bug of the improved pasting HTML contents contents into the editor - -## 9.0.0-dev-9 - -* Improves the new logic of pasting HTML contents into the Editor -* Update `README.md` and the doc -* Dispose the `QuillToolbarSelectHeaderStyleButton` state listener in `dispose` -* Upgrade the font family button to material 3 -* Rework the font family and font size functionalities to change the font once and type all over the editor - -## 9.0.0-dev-8 - -* Better support for pasting HTML contents from external websites to the editor -* The experimental support of converting the HTML from `quill_html_converter` is now built-in in the `flutter_quill` and removed from there (Breaking change for `quill_html_converter`) - -## 9.0.0-dev-7 - -* Fix a bug in chaning the background/font color of ol/ul list -* Flutter Quill Extensions: - * Fix link bug in the video url - * Fix patterns - -## 9.0.0-dev-6 - -* Move the `child` from `QuillToolbarConfigurations` into `QuillToolbar` directly -* Bug fixes -* Add the ability to change the background and font color of the ol/ul elements dots and numbers -* Flutter Quill Extensions: - * **Breaking Change**: The `imageProviderBuilder`is now providing the context and image url - -## 9.0.0-dev-5 - -* The `QuillToolbar` is now accepting only `child` with no configurations so you can customize everything you wants, the `QuillToolbar.simple()` or `QuillSimpleToolbar` implements a simple toolbar that is based on `QuillToolbar`, you are free to use it but it just an example and not standard -* Flutter Quill Extensions: - * Improve the camera button - -## 9.0.0-dev-4 - -* The options parameter in all of the buttons is no longer required which can be useful to create custom toolbar with minimal efforts -* Toolbar buttons fixes in both `flutter_quill` and `flutter_quill_extensions` -* The `QuillProvider` has been dropped and no longer used, the providers will be used only internally from now on and we will not using them as much as possible - -## 9.0.0-dev-3 - -* Breaking Changes: - * Rename `QuillToolbar` to `QuillSimpleToolbar` - * Rename `QuillBaseToolbar` to `QuillToolbar` - * Replace `pasteboard` with `rich_cliboard` -* Fix a bug in the example when inserting an image from url -* Flutter Quill Extensions: - * Add support for copying the image to the system cliboard - -## 9.0.0-dev-2 - -* An attemp to fix CI automated publishing - -## 9.0.0-dev-1 - -* An attemp to fix CI automated publishing - -## 9.0.0-dev - -* **Major Breaking change**: The `QuillProvider` is now optional, the `controller` parameter has been moved to the `QuillEditor` and `QuillToolbar` once again. -* Flutter Quill Extensions; - * **Breaking Change**: Completly change the way how the source code structured to more basic and simple way, organize folders and file names, if you use the library -from `flutter_quill_extensions.dart` then there is nothing you need to do, but if you are using any other import then you need to re-imports -embed, this won't affect how quill js work - * Improvemenets to the image embed - * Add support for `margin` for web - * Add untranslated strings to the `quill_en.arb` - -## 8.6.4 - -* The default value of `keyboardAppearance` for the iOS will be the one from the App/System theme mode instead of always using the `Brightness.light` -* Fix typos in `README.md` - -## 8.6.3 - -* Update the minimum flutter version to `3.16.0` - -## 8.6.2 - -* Restore use of alternative QuillToolbarLinkStyleButton2 widget - -## 8.6.1 - -* Temporary revert style bug fix - -## 8.6.0 - -* **Breaking Change** Support [Flutter 3.16](https://medium.com/flutter/whats-new-in-flutter-3-16-dba6cb1015d1), please upgrade to the latest stable version of flutter to use this update -* **Breaking Change**: Remove Deprecated Fields -* **Breaking Change**: Extract the shared things between `QuillToolbarConfigurations` and `QuillBaseToolbarConfigurations` -* **Breaking Change**: You no longer need to use `QuillToolbarProvider` when using custom toolbar buttons, the example has been updated -* Bug fixes - -## 8.5.5 - -* Now when opening dialogs by `QuillToolbar` you will not get an exception when you don't use `FlutterQuillLocalizations.delegate` in your `WidgetsApp`, `MaterialApp`, or `CupertinoApp`. The fix is for the `QuillToolbarSearchButton`, `QuillToolbarLinkStyleButton`, and `QuillToolbarColorButton` buttons - -## 8.5.4 - -* The `mobileWidth`, `mobileHeight`, `mobileMargin`, and `mobileAlignment` is now deprecated in `flutter_quill`, they are now defined in `flutter_quill_extensions` -* Deprecate `replaceStyleStringWithSize` function which is in `string.dart` -* Deprecate `alignment`, and `margin` as they don't conform to official Quill JS - -## 8.5.3 - -* Update doc -* Update `README.md` and `CHANGELOG.md` -* Fix typos -* Use `immutable` when possible -* Update `.pubignore` - -## 8.5.2 - -* Updated `README.md`. -* Feature: Added the ability to include a custom callback when the `QuillToolbarColorButton` is pressed. -* The `QuillToolbar` now implements `PreferredSizeWidget`, enabling usage in the AppBar, similar to `QuillBaseToolbar`. - -## 8.5.1 - -* Updated `README.md`. - -## 8.5.0 - -* Migrated to `flutter_localizations` for translations. -* Fixed: Translated all previously untranslated localizations. -* Fixed: Added translations for missing items. -* Fixed: Introduced default Chinese fallback translation. -* Removed: Unused parameters `items` in `QuillToolbarFontFamilyButtonOptions` and `QuillToolbarFontSizeButtonOptions`. -* Updated: Documentation. - -## 8.4.4 - -* Updated `.pubignore` to ignore unnecessary files and folders. - -## 8.4.3 - -* Updated `CHANGELOG.md`. - -## 8.4.2 - -* **Breaking change**: Configuration for `QuillRawEditor` has been moved to a separate class. Additionally, `readOnly` has been renamed to `isReadOnly`. If using `QuillEditor`, no action is required. -* Introduced the ability for developers to override `TextInputAction` in both `QuillRawEditor` and `QuillEditor`. -* Enabled using `QuillRawEditor` without `QuillEditorProvider`. -* Bug fixes. -* Added image cropping implementation in the example. - -## 8.4.1 - -* Added `copyWith` in `OptionalSize` class. - -## 8.4.0 - -* **Breaking change**: Updated `QuillCustomButton` to use `QuillCustomButtonOptions`. Moved all properties from `QuillCustomButton` to `QuillCustomButtonOptions`, replacing `iconData` with `icon` widget for increased customization. -* **Breaking change**: `customButtons` in `QuillToolbarConfigurations` is now of type `List`. -* Bug fixes following the `8.0.0` update. -* Updated `README.md`. -* Improved platform checking. - -## 8.3.0 - -* Added `iconButtonFactor` property to `QuillToolbarBaseButtonOptions` for customizing button size relative to its icon size (defaults to `kIconButtonFactor`, consistent with previous releases). - -## 8.2.6 - -* Organized `QuillRawEditor` code. - -## 8.2.5 - -* Added `builder` property in `QuillEditorConfigurations`. - -## 8.2.4 - -* Adhered to Flutter best practices. -* Fixed auto-focus bug. - -## 8.2.3 - -* Updated `README.md`. - -## 8.2.2 - -* Moved `flutter_quill_test` to a separate package: [flutter_quill_test](https://pub.dev/packages/flutter_quill_test). - -## 8.2.1 - -* Updated `README.md`. - -## 8.2.0 - -* Added the option to add configurations for `flutter_quill_extensions` using `extraConfigurations`. - -## 8.1.11 - -* Followed Dart best practices by using `lints` and removed `pedantic` and `platform` since they are not used. -* Fixed text direction bug. -* Updated `README.md`. - -## 8.1.10 - -* Secret for automated publishing to pub.dev. - -## 8.1.9 - -* Fixed automated publishing to pub.dev. - -## 8.1.8 - -* Fixed automated publishing to pub.dev. - -## 8.1.7 - -* Automated publishing to pub.dev. - -## 8.1.6 - -* Fixed compatibility with `integration_test` by downgrading the minimum version of the platform package to 3.1.0. - -## 8.1.5 - -* Reversed background/font color toolbar button icons. - -## 8.1.4 - -* Reversed background/font color toolbar button tooltips. - -## 8.1.3 - -* Moved images to screenshots instead of `README.md`. - -## 8.1.2 - -* Fixed a bug related to the regexp of the insert link dialog. -* Required Dart 3 as the minimum version. -* Code cleanup. -* Added a spacer widget between each button in the `QuillToolbar`. - -## 8.1.1 - -* Fixed null error in line.dart #1487(https://github.com/singerdmx/flutter*quill/issues/1487). - -## 8.1.0 - -* Fixed a word typo of `mirgration` to `migration` in the readme & migration document. -* Updated migration guide. -* Removed property `enableUnfocusOnTapOutside` in `QuillEditor` configurations and added `isOnTapOutsideEnabled` instead. -* Added a new callback called `onTapOutside` in the `QuillEditorConfigurations` to perform actions when tapping outside the editor. -* Fixed a bug that caused the web platform to not unfocus the editor when tapping outside of it. To override this, please pass a value to the `onTapOutside` callback. -* Removed the old property of `iconTheme`. Instead, pass `iconTheme` in the button options; you will find the `base` property inside it with `iconTheme`. - -## 8.0.0 - -* If you have migrated recently, don't be alarmed by this update; it adds documentation, a migration guide, and marks the version as a more stable release. Although there are breaking changes (as reported by some developers), the major version was not changed due to time constraints during development. A single property was also renamed from `code` to `codeBlock` in the `elements` of the new `QuillEditorConfigurations` class. -* Updated the README for better readability. - -## 7.10.2 - -* Removed line numbers from code blocks by default. You can still enable this feature thanks to the new configurations in the `QuillEditor`. Find the `elementOptions` property and enable `enableLineNumbers`. - -## 7.10.1 - -* Fixed issues and utilized the new parameters. -* No longer need to use `MaterialApp` for most toolbar button child builders. -* Compatibility with [fresh_quill_extensions](https://pub.dev/packages/fresh_quill_extensions), a temporary alternative to [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions). -* Updated most of the documentation in `README.md`. - -## 7.10.0 - -* **Breaking change**: `QuillToolbar.basic()` can be accessed directly from `QuillToolbar()`, and the old `QuillToolbar` can be accessed from `QuillBaseToolbar`. -* Refactored Quill editor and toolbar configurations into a single class each. -* After changing checkbox list values, the controller will not request keyboard focus by default. -* Moved toolbar and editor configurations directly into the widget but still use inherited widgets internally. -* Fixes to some code after the refactoring. - -## 7.9.0 - -* Buttons Improvemenets -* Refactor all the button configurations that used in `QuillToolbar.basic()` but there are still few lefts -* **Breaking change**: Remove some configurations from the QuillToolbar and move them to the new `QuillProvider`, please notice this is a development version and this might be changed in the next few days, the stable release will be ready in less than 3 weeks -* Update `flutter_quill_extensions` and it will be published into pub.dev soon. -* Allow you to customize the search dialog by custom callback with child builder - -## 7.8.0 - -* **Important note**: this is not test release yet, it works but need more test and changes and breaking changes, we don't have development version and it will help us if you try the latest version and report the issues in Github but if you want a stable version please use `7.4.16`. this refactoring process will not take long and should be done less than three weeks with the testing. -* We managed to refactor most of the buttons configurations and customizations in the `QuillProvider`, only three lefts then will start on refactoring the toolbar configurations -* Code improvemenets - -## 7.7.0 - -* **Breaking change**: We have mirgrated more buttons in the toolbar configurations, you can do change them in the `QuillProvider` -* Important bug fixes - -## 7.6.1 - -* Bug fixes - -## 7.6.0 - -* **Breaking change**: To customize the buttons in the toolbar, you can do that in the `QuillProvider` - -## 7.5.0 - -* **Breaking change**: The widgets `QuillEditor` and `QuillToolbar` are no longer have controller parameter, instead you need to make sure in the widget tree you have wrapped them with `QuillProvider` widget and provide the controller and the require configurations - -## 7.4.16 - -* Update documentation and README.md - -## 7.4.15 - -* Custom style attrbuites for platforms other than mobile (alignment, margin, width, height) -* Bug fixes and other improvemenets - -## 7.4.14 - -* Improve performance by reducing the number of widgets rebuilt by listening to media query for only the needed things, for example instead of using `MediaQuery.of(context).size`, now we are using `MediaQuery.sizeOf(context)` -* Add MediaButton for picking the images only since the video one is not ready -* A new feature which allows customizing the text selection in quill editor which is useful for custom theme design system for custom app widget - -## 7.4.13 - -* Fixed tab editing when in readOnly mode. - -## 7.4.12 - -* Update the minimum version of device_info_plus to 9.1.0. - -## 7.4.11 - -* Add sw locale. - -## 7.4.10 - -* Update translations. - -## 7.4.9 - -* Style recognition fixes. - -## 7.4.8 - -* Upgrade dependencies. - -## 7.4.7 - -* Add Vietnamese and German translations. - -## 7.4.6 - -* Fix more null errors in Leaf.retain [##1394](https://github.com/singerdmx/flutter-quill/issues/1394) and Line.delete [##1395](https://github.com/singerdmx/flutter-quill/issues/1395). - -## 7.4.5 - -* Fix null error in Container.insert [##1392](https://github.com/singerdmx/flutter-quill/issues/1392). - -## 7.4.4 - -* Fix extra padding on checklists [##1131](https://github.com/singerdmx/flutter-quill/issues/1131). - -## 7.4.3 - -* Fixed a space input error on iPad. - -## 7.4.2 - -* Fix bug with keepStyleOnNewLine for link. - -## 7.4.1 - -* Fix toolbar dividers condition. - -## 7.4.0 - -* Support Flutter version 3.13.0. - -## 7.3.3 - -* Updated Dependencies conflicting. - -## 7.3.2 - -* Added builder for custom button in _LinkDialog. - -## 7.3.1 - -* Added case sensitive and whole word search parameters. -* Added wrap around. -* Moved search dialog to the bottom in order not to override the editor and the text found. -* Other minor search dialog enhancements. - -## 7.3.0 - -* Add default attributes to basic factory. - -## 7.2.19 - -* Feat/link regexp. - -## 7.2.18 - -* Fix paste block text in words apply same style. - -## 7.2.17 - -* Fix paste text mess up style. -* Add support copy/cut block text. - -## 7.2.16 - -* Allow for custom context menu. - -## 7.2.15 - -* Add flutter_quill.delta library which only exposes Delta datatype. - -## 7.2.14 - -* Fix errors when the editor is used in the `screenshot` package. - -## 7.2.13 - -* Fix around image can't delete line break. - -## 7.2.12 - -* Add support for copy/cut select image and text together. - -## 7.2.11 - -* Add affinity for localPosition. - -## 7.2.10 - -* LINE._getPlainText queryChild inclusive=false. - -## 7.2.9 - -* Add toPlainText method to `EmbedBuilder`. - -## 7.2.8 - -* Add custom button widget in toolbar. - -## 7.2.7 - -* Fix language code of Japan. - -## 7.2.6 - -* Style custom toolbar buttons like builtins. - -## 7.2.5 - -* Always use text cursor for editor on desktop. - -## 7.2.4 - -* Fixed keepStyleOnNewLine. - -## 7.2.3 - -* Get pixel ratio from view. - -## 7.2.2 - -* Prevent operations on stale editor state. - -## 7.2.1 - -* Add support for android keyboard content insertion. -* Enhance color picker, enter hex color and color palette option. - -## 7.2.0 - -* Checkboxes, bullet points, and number points are now scaled based on the default paragraph font size. - -## 7.1.20 - -* Pass linestyle to embedded block. - -## 7.1.19 - -* Fix Rtl leading alignment problem. - -## 7.1.18 - -* Support flutter latest version. - -## 7.1.17+1 - -* Updates `device_info_plus` to version 9.0.0 to benefit from AGP 8 (see [changelog##900](https://pub.dev/packages/device_info_plus/changelog##900)). - -## 7.1.16 - -* Fixed subscript key from 'sup' to 'sub'. - -## 7.1.15 - -* Fixed a bug introduced in 7.1.7 where each section in `QuillToolbar` was displayed on its own line. - -## 7.1.14 - -* Add indents change for multiline selection. - -## 7.1.13 - -* Add custom recognizer. - -## 7.1.12 - -* Add superscript and subscript styles. - -## 7.1.11 - -* Add inserting indents for lines of list if text is selected. - -## 7.1.10 - -* Image embedding tweaks - * Add MediaButton which is intened to superseed the ImageButton and VideoButton. Only image selection is working. - * Implement image insert for web (image as base64) - -## 7.1.9 - -* Editor tweaks PR from bambinoua(https://github.com/bambinoua). - * Shortcuts now working in Mac OS - * QuillDialogTheme is extended with new properties buttonStyle, linkDialogConstraints, imageDialogConstraints, isWrappable, runSpacing, - * Added LinkStyleButton2 with new LinkStyleDialog (similar to Quill implementation - * Conditinally use Row or Wrap for dialog's children. - * Update minimum Dart SDK version to 2.17.0 to use enum extensions. - * Use merging shortcuts and actions correclty (if the key combination is the same) - -## 7.1.8 - -* Dropdown tweaks - * Add itemHeight, itemPadding, defaultItemColor for customization of dropdown items. - * Remove alignment property as useless. - * Fix bugs with max width when width property is null. - -## 7.1.7 - -* Toolbar tweaks. - * Implement tooltips for embed CameraButton, VideoButton, FormulaButton, ImageButton. - * Extends customization for SelectAlignmentButton, QuillFontFamilyButton, QuillFontSizeButton adding padding, text style, alignment, width. - * Add renderFontFamilies to QuillFontFamilyButton to show font faces in dropdown. - * Add AxisDivider and its named constructors for for use in parent project. - * Export ToolbarButtons enum to allow specify tooltips for SelectAlignmentButton. - * Export QuillFontFamilyButton, SearchButton as they were not exported before. - * Deprecate items property in QuillFontFamilyButton, QuillFontSizeButton as the it can be built usinr rawItemsMap. - * Make onSelection QuillFontFamilyButton, QuillFontSizeButton omittable as no need to execute callback outside if controller is passed to widget. - -Now the package is more friendly for web projects. - -## 7.1.6 - -* Add enableUnfocusOnTapOutside field to RawEditor and Editor widgets. - -## 7.1.5 - -* Add tooltips for toolbar buttons. - -## 7.1.4 - -* Fix inserting tab character in lists. - -## 7.1.3 - -* Fix ios cursor bug when word.length==1. - -## 7.1.2 - -* Fix non scrollable editor exception, when tapped under content. - -## 7.1.1 - -* customLinkPrefixes parameter * makes possible to open links with custom protoco. - -## 7.1.0 - -* Fix ordered list numeration with several lists in document. - -## 7.0.9 - -* Use const constructor for EmbedBuilder. - -## 7.0.8 - -* Fix IME position bug with scroller. - -## 7.0.7 - -* Add TextFieldTapRegion for contextMenu. - -## 7.0.6 - -* Fix line style loss on new line from non string. - -## 7.0.5 - -* Fix IME position bug for Mac and Windows. -* Unfocus when tap outside editor. fix the bug that cant refocus in afterButtonPressed after click ToggleStyleButton on Mac. - -## 7.0.4 - -* Have text selection span full line height for uneven sized text. - -## 7.0.3 - -* Fix ordered list numeration for lists with more than one level of list. - -## 7.0.2 - -* Allow widgets to override widget span properties. - -## 7.0.1 - -* Update i18n_extension dependency to version 8.0.0. - -## 7.0.0 - -* Breaking change: Tuples are no longer used. They have been replaced with a number of data classes. - -## 6.4.4 - -* Increased compatibility with Flutter widget tests. - -## 6.4.3 - -* Update dependencies (collection: 1.17.0, flutter_keyboard_visibility: 5.4.0, quiver: 3.2.1, tuple: 2.0.1, url_launcher: 6.1.9, characters: 1.2.1, i18n_extension: 7.0.0, device_info_plus: 8.1.0) - -## 6.4.2 - -* Replace `buildToolbar` with `contextMenuBuilder`. - -## 6.4.1 - -* Control the detect word boundary behaviour. - -## 6.4.0 - -* Use `axis` to make the toolbar vertical. -* Use `toolbarIconCrossAlignment` to align the toolbar icons on the cross axis. -* Breaking change: `QuillToolbar`'s parameter `toolbarHeight` was renamed to `toolbarSize`. - -## 6.3.5 - -* Ability to add custom shortcuts. - -## 6.3.4 - -* Update clipboard status prior to showing selected text overlay. - -## 6.3.3 - -* Fixed handling of mac intents. - -## 6.3.2 - -* Added `unknownEmbedBuilder` to QuillEditor. -* Fix error style when input chinese japanese or korean. - -## 6.3.1 - -* Add color property to the basic factory function. - -## 6.3.0 - -* Support Flutter 3.7. - -## 6.2.2 - -* Fix: nextLine getter null where no assertion. - -## 6.2.1 - -* Revert "Align numerical and bullet lists along with text content". - -## 6.2.0 - -* Align numerical and bullet lists along with text content. - -## 6.1.12 - -* Apply i18n for default font dropdown option labels corresponding to 'Clear'. - -## 6.1.11 - -* Remove iOS hack for delaying focus calculation. - -## 6.1.10 - -* Delay focus calculation for iOS. - -## 6.1.9 - -* Bump keyboard show up wait to 1 sec. - -## 6.1.8 - -* Recalculate focus when showing keyboard. - -## 6.1.7 - -* Add czech localizations. - -## 6.1.6 - -* Upgrade i18n_extension to 6.0.0. - -## 6.1.5 - -* Fix formatting exception. - -## 6.1.4 - -* Add double quotes validation. - -## 6.1.3 - -* Revert "fix order list numbering (##988)". - -## 6.1.2 - -* Add typing shortcuts. - -## 6.1.1 - -* Fix order list numbering. - -## 6.1.0 - -* Add keyboard shortcuts for editor actions. - -## 6.0.10 - -* Upgrade device info plus to ^7.0.0. - -## 6.0.9 - -* Don't throw showAutocorrectionPromptRect not implemented. The function is called with every keystroke as a user is typing. - -## 6.0.8+1 - -* Fixes null pointer when setting documents. - -## 6.0.8 - -* Make QuillController.document mutable. - -## 6.0.7 - -* Allow disabling of selection toolbar. - -## 6.0.6+1 - -* Revert 6.0.6. - -## 6.0.6 - -* Fix wrong custom embed key. - -## 6.0.5 - -* Fixes toolbar buttons stealing focus from editor. - -## 6.0.4 - -* Bug fix for Type 'Uint8List' not found. - -## 6.0.3 - -* Add ability to paste images. - -## 6.0.2 - -* Address Dart Analysis issues. - -## 6.0.1 - -* Changed translation country code (zh_HK -> zh_hk) to lower case, which is required for i18n_extension used in flutter_quill. -* Add localization in example's main to demonstrate translation. -* Issue Windows selection's copy / paste tool bar not shown ##861: add selection's copy / paste toolbar, escape to hide toolbar, mouse right click to show toolbar, ctrl-Y / ctrl-Z to undo / redo. -* Image and video displayed in Windows platform caused screen flickering while selecting text, a sample_data_nomedia.json asset is added for Desktop to demonstrate the added features. -* Known issue: keyboard action sometimes causes exception mentioned in Flutter's issue ##106475 (Windows Keyboard shortcuts stop working after modifier key repeat flutter/flutter##106475). -* Know issue: user needs to click the editor to get focus before toolbar is able to display. - -## 6.0.0 BREAKING CHANGE - -* Removed embed (image, video & formula) blocks from the package to reduce app size. - -These blocks have been moved to the package `flutter_quill_extensions`, migrate by filling the `embedBuilders` and `embedButtons` parameters as follows: - -``` -import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; - -QuillEditor.basic( - controller: controller, - embedBuilders: FlutterQuillEmbeds.builders(), -); - -QuillToolbar.basic( - controller: controller, - embedButtons: FlutterQuillEmbeds.buttons(), -); -``` - -## 5.4.2 - -* Upgrade i18n_extension. - -## 5.4.1 - -* Update German Translation. - -## 5.4.0 - -* Added Formula Button (for maths support). - -## 5.3.2 - -* Add more font family. - -## 5.3.1 - -* Enable search when text is not empty. - -## 5.3.0 - -* Added search function. - -## 5.2.11 - -* Remove default small color. - -## 5.2.10 - -* Don't wrap the QuillEditor's child in the EditorTextSelectionGestureDetector if selection is disabled. - -## 5.2.9 - -* Added option to modify SelectHeaderStyleButton options. -* Added option to click again on h1, h2, h3 button to go back to normal. - -## 5.2.8 - -* Remove tooltip for LinkStyleButton. -* Make link match regex case insensitive. - -## 5.2.7 - -* Add locale to QuillEditor.basic. - -## 5.2.6 - -* Fix keyboard pops up when resizing the image. - -## 5.2.5 - -* Upgrade youtube_player_flutter_quill to 8.2.2. - -## 5.2.4 - -* Upgrade youtube_player_flutter_quill to 8.2.1. - -## 5.2.3 - -* Flutter Quill Doesn't Work On iOS 16 or Xcode 14 Betas (Stored properties cannot be marked potentially unavailable with '@available'). - -## 5.2.2 - -* Fix Web Unsupported operation: Platform.\_operatingSystem error. - -## 5.2.1 - -* Rename QuillCustomIcon to QuillCustomButton. - -## 5.2.0 - -* Support font family selection. - -## 5.1.1 - -* Update README. - -## 5.1.0 - -* Added CustomBlockEmbed and customElementsEmbedBuilder. - -## 5.0.5 - -* Upgrade device_info_plus to 4.0.0. - -## 5.0.4 - -* Added onVideoInit callback for video documents. - -## 5.0.3 - -* Update dependencies. - -## 5.0.2 - -* Keep cursor position on checkbox tap. - -## 5.0.1 - -* Fix static analysis errors. - -## 5.0.0 - -* Flutter 3.0.0 support. - -## 4.2.3 - -* Ignore color:inherit and convert double to int for level. - -## 4.2.2 - -* Add clear option to font size dropdown. - -## 4.2.1 - -* Refactor font size dropdown. - -## 4.2.0 - -* Ensure selectionOverlay is available for showToolbar. - -## 4.1.9 - -* Using properly iconTheme colors. - -## 4.1.8 - -* Update font size dropdown. - -## 4.1.7 - -* Convert FontSize to a Map to allow for named Font Size. - -## 4.1.6 - -* Update quill_dropdown_button.dart. - -## 4.1.5 - -* Add Font Size dropdown to the toolbar. - -## 4.1.4 - -* New borderRadius for iconTheme. - -## 4.1.3 - -* Fix selection handles show/hide after paste, backspace, copy. - -## 4.1.2 - -* Add full support for hardware keyboards (Chromebook, Android tablets, etc) that don't alter screen UI. - -## 4.1.1 - -* Added textSelectionControls field in QuillEditor. - -## 4.1.0 - -* Added Node to linkActionPickerDelegate. - -## 4.0.12 - -* Add Persian(fa) language. - -## 4.0.11 - -* Fix cut selection error in multi-node line. - -## 4.0.10 - -* Fix vertical caret position bug. - -## 4.0.9 - -* Request keyboard focus when no child is found. - -## 4.0.8 - -* Fix blank lines do not display when **web*renderer=html. - -## 4.0.7 - -* Refactor getPlainText (better handling of blank lines and lines with multiple markups. - -## 4.0.6 - -* Bug fix for copying text with new lines. - -## 4.0.5 - -* Fixed casting null to Tuple2 when link dialog is dismissed without any input (e.g. barrier dismissed). - -## 4.0.4 - -* Bug fix for text direction rtl. - -## 4.0.3 - -* Support text direction rtl. - -## 4.0.2 - -* Clear toggled style on selection change. - -## 4.0.1 - -* Fix copy/cut/paste/selectAll not working. - -## 4.0.0 - -* Upgrade for Flutter 2.10. - -## 3.9.11 - -* Added Indonesian translation. - -## 3.9.10 - -* Fix for undoing a modification ending with an indented line. - -## 3.9.9 - -* iOS: Save image whose filename does not end with image file extension. - -## 3.9.8 - -* Added Urdu translation. - -## 3.9.7 - -* Fix for clicking on the Link button without any text on a new line crashes. - -## 3.9.6 - -* Apply locale to QuillEditor(contents). - -## 3.9.5 - -* Fix image pasting. - -## 3.9.4 - -* Hiding dialog after selecting action for image. - -## 3.9.3 - -* Update ImageResizer for Android. - -## 3.9.2 - -* Copy image with its style. - -## 3.9.1 - -* Support resizing image. - -## 3.9.0 - -* Image menu options for copy/remove. - -## 3.8.8 - -* Update set textEditingValue. - -## 3.8.7 - -* Fix checkbox not toggled correctly in toolbar button. - -## 3.8.6 - -* Fix cursor position changes when checking/unchecking the checkbox. - -## 3.8.5 - -* Fix \_handleDragUpdate in \_TextSelectionHandleOverlayState. - -## 3.8.4 - -* Fix link dialog layout. - -## 3.8.3 - -* Fix for errors on a non scrollable editor. - -## 3.8.2 - -* Fix certain keys not working on web when editor is a child of a scroll view. - -## 3.8.1 - -* Refactor \_QuillEditorState to QuillEditorState. - -## 3.8.0 - -* Support pasting with format. - -## 3.7.3 - -* Fix selection overlay for collapsed selection. - -## 3.7.2 - -* Reverted Embed toPlainText change. - -## 3.7.1 - -* Change Embed toPlainText to be empty string. - -## 3.7.0 - -* Replace Toolbar showHistory group with individual showRedo and showUndo. - -## 3.6.5 - -* Update Link dialogue for image/video. - -## 3.6.4 - -* Link dialogue TextInputType.multiline. - -## 3.6.3 - -* Bug fix for link button text selection. - -## 3.6.2 - -* Improve link button. - -## 3.6.1 - -* Remove SnackBar 'What is entered is not a link'. - -## 3.6.0 - -* Allow link button to enter text. - -## 3.5.3 - -* Change link button behavior. - -## 3.5.2 - -* Bug fix for embed. - -## 3.5.1 - -* Bug fix for platform util. - -## 3.5.0 - -* Removed redundant classes. - -## 3.4.4 - -* Add more translations. - -## 3.4.3 - -* Preset link from attributes. - -## 3.4.2 - -* Fix launch link edit mode. - -## 3.4.1 - -* Placeholder effective in scrollable. - -## 3.4.0 - -* Option to save image in read-only mode. - -## 3.3.1 - -* Pass any specified key in QuillEditor constructor to super. - -## 3.3.0 - -* Fixed Style toggle issue. - -## 3.2.1 - -* Added new translations. - -## 3.2.0 - -* Support multiple links insertion on the go. - -## 3.1.1 - -* Add selection completed callback. - -## 3.1.0 - -* Fixed image ontap functionality. - -## 3.0.4 - -* Add maxContentWidth constraint to editor. - -## 3.0.3 - -* Do not show caret on screen when the editor is not focused. - -## 3.0.2 - -* Fix launch link for read-only mode. - -## 3.0.1 - -* Handle null value of Attribute.link. - -## 3.0.0 - -* Launch link improvements. -* Removed QuillSimpleViewer. - -## 2.5.2 - -* Skip image when pasting. - -## 2.5.1 - -* Bug fix for Desktop `Shift` + `Click` support. - -## 2.5.0 - -* Update checkbox list. - -## 2.4.1 - -* Desktop selection improvements. - -## 2.4.0 - -* Improve inline code style. - -## 2.3.3 - -* Improves selection rects to have consistent height regardless of individual segment text styles. - -## 2.3.2 - -* Allow disabling floating cursor. - -## 2.3.1 - -* Preserve last newline character on delete. - -## 2.3.0 - -* Massive changes to support flutter 2.8. - -## 2.2.2 - -* iOS - floating cursor. - -## 2.2.1 - -* Bug fix for imports supporting flutter 2.8. - -## 2.2.0 - -* Support flutter 2.8. - -## 2.1.1 - -* Add methods of clearing editor and moving cursor. - -## 2.1.0 - -* Add delete handler. - -## 2.0.23 - -* Support custom replaceText handler. - -## 2.0.22 - -* Fix attribute compare and fix font size parsing. - -## 2.0.21 - -* Handle click on embed object. - -## 2.0.20 - -* Improved UX/UI of Image widget. - -## 2.0.19 - -* When uploading a video, applying indicator. - -## 2.0.18 - -* Make toolbar dividers optional. - -## 2.0.17 - -* Allow alignment of the toolbar icons to match WrapAlignment. - -## 2.0.16 - -* Add hide / show alignment buttons. - -## 2.0.15 - -* Implement change cursor to SystemMouseCursors.click when hovering a link styled text. - -## 2.0.14 - -* Enable customize the checkbox widget using DefaultListBlockStyle style. - -## 2.0.13 - -* Improve the scrolling performance by reducing the repaint areas. - -## 2.0.12 - -* Fix the selection effect can't be seen as the textLine with background color. - -## 2.0.11 - -* Fix visibility of text selection handlers on scroll. - -## 2.0.10 - -* cursorConnt.color notify the text_line to repaint if it was disposed. - -## 2.0.9 - -* Improve UX when trying to add a link. - -## 2.0.8 - -* Adding translations to the toolbar. - -## 2.0.7 - -* Added theming options for toolbar icons and LinkDialog. - -## 2.0.6 - -* Avoid runtime error when placed inside TabBarView. - -## 2.0.5 - -* Support inline code formatting. - -## 2.0.4 - -* Enable history shortcuts for desktop. - -## 2.0.3 - -* Fix cursor when line contains image. - -## 2.0.2 - -* Address KeyboardListener class name conflict. - -## 2.0.1 - -* Upgrade flutter_colorpicker to 0.5.0. - -## 2.0.0 - -* Text Alignment functions + Block Format standards. - -## 1.9.6 - -* Support putting QuillEditor inside a Scrollable view. - -## 1.9.5 - -* Skip image when pasting. - -## 1.9.4 - -* Bug fix for cursor position when tapping at the end of line with image(s). - -## 1.9.3 - -* Bug fix when line only contains one image. - -## 1.9.2 - -* Support for building custom inline styles. - -## 1.9.1 - -* Cursor jumps to the most appropriate offset to display selection. - -## 1.9.0 - -* Support inline image. - -## 1.8.3 - -* Updated quill_delta. - -## 1.8.2 - -* Support mobile image alignment. - -## 1.8.1 - -* Support mobile custom size image. - -## 1.8.0 - -* Support entering link for image/video. - -## 1.7.3 - -* Bumps photo_view version. - -## 1.7.2 - -* Fix static analysis error. - -## 1.7.1 - -* Support Youtube video. - -## 1.7.0 - -* Support video. - -## 1.6.4 - -* Bug fix for clear format button. - -## 1.6.3 - -* Fixed dragging right handle scrolling issue. - -## 1.6.2 - -* Fixed the position of the selection status drag handle. - -## 1.6.1 - -* Upgrade image_picker and flutter_colorpicker. - -## 1.6.0 - -* Support Multi Row Toolbar. - -## 1.5.0 - -* Remove file_picker dependency. - -## 1.4.1 - -* Remove filesystem_picker dependency. - -## 1.4.0 - -* Remove path_provider dependency. - -## 1.3.4 - -* Add option to paintCursorAboveText. - -## 1.3.3 - -* Upgrade file_picker version. - -## 1.3.2 - -* Fix copy/paste bug. - -## 1.3.1 - -* New logo. - -## 1.3.0 - -* Support flutter 2.2.0. - -## 1.2.2 - -* Checkbox supports tapping. - -## 1.2.1 - -* Indented position not holding while editing. - -## 1.2.0 - -* Fix image button cancel causes crash. - -## 1.1.8 - -* Fix height of empty line bug. - -## 1.1.7 - -* Fix text selection in read-only mode. - -## 1.1.6 - -* Remove universal_html dependency. - -## 1.1.5 - -* Enable "Select", "Select All" and "Copy" in read-only mode. - -## 1.1.4 - -* Fix text selection issue. - -## 1.1.3 - -* Update example folder. - -## 1.1.2 - -* Add pedantic. - -## 1.1.1 - -* Base64 image support. - -## 1.1.0 - -* Support null safety. - -## 1.0.9 - -* Web support for raw editor and keyboard listener. - -## 1.0.8 - -* Support token attribute. - -## 1.0.7 - -* Fix crash on web (dart:io). - -## 1.0.6 - -* Add desktop support WINDOWS, MACOS and LINUX. - -## 1.0.5 - -* Bug fix: Can not insert newline when Bold is toggled ON. - -## 1.0.4 - -* Upgrade photo_view to ^0.11.0. - -## 1.0.3 - -* Fix issue that text is not displayed while typing WEB. - -## 1.0.2 - -* Update toolbar in sample home page. - -## 1.0.1 - -* Fix static analysis errors. - -## 1.0.0 - -* Support flutter 2.0. - -## 1.0.0-dev.2 - -* Improve link handling for tel, mailto and etc. - -## 1.0.0-dev.1 - -* Upgrade prerelease SDK & Bump for master. - -## 0.3.5 - -* Fix for cursor focus issues when keyboard is on. - -## 0.3.4 - -* Improve link handling for tel, mailto and etc. - -## 0.3.3 - -* More fix on cursor focus issue when keyboard is on. - -## 0.3.2 - -* Fix cursor focus issue when keyboard is on. - -## 0.3.1 - -* cursor focus when keyboard is on. - -## 0.3.0 - -* Line Height calculated based on font size. - -## 0.2.12 - -* Support placeholder. - -## 0.2.11 - -* Fix static analysis error. - -## 0.2.10 - -* Update TextInputConfiguration autocorrect to true in stable branch. - -## 0.2.9 - -* Update TextInputConfiguration autocorrect to true. - -## 0.2.8 - -* Support display local image besides network image in stable branch. - -## 0.2.7 - -* Support display local image besides network image. - -## 0.2.6 - -* Fix cursor after pasting. - -## 0.2.5 - -* Toggle text/background color button in toolbar. - -## 0.2.4 - -* Support the use of custom icon size in toolbar. - -## 0.2.3 - -* Support custom styles and image on local device storage without uploading. - -## 0.2.2 - -* Update git repo. - -## 0.2.1 - -* Fix static analysis error. - -## 0.2.0 - -* Add checked/unchecked list button in toolbar. - -## 0.1.8 - -* Support font and size attributes. - -## 0.1.7 - -* Support checked/unchecked list. - -## 0.1.6 - -* Fix getExtentEndpointForSelection. - -## 0.1.5 - -* Support text alignment. - -## 0.1.4 - -* Handle url with trailing spaces. - -## 0.1.3 - -* Handle cursor position change when undo/redo. - -## 0.1.2 - -* Handle more text colors. - -## 0.1.1 - -* Fix cursor issue when undo. - -## 0.1.0 - -* Fix insert image. - -## 0.0.9 - -* Handle rgba color. - -## 0.0.8 - -* Fix launching url. +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 0.0.7 +> [!NOTE] +> The [previous `CHANGELOG.md`](https://github.com/singerdmx/flutter-quill/blob/master/doc/OLD_CHANGELOG.md) has been archived. -* Handle multiple image inserts. +## [Unreleased] -## 0.0.6 +> [!IMPORTANT] +> See the [migration guide from 10.0.0 to 11.0.0](https://github.com/singerdmx/flutter-quill/blob/master/doc/migration/10_to_11.md) for the full breaking changes and migration. Ensure to read the [breaking behavior](https://github.com/singerdmx/flutter-quill/blob/release/v11/doc/migration/10_to_11.md#-breaking-behavior) section to avoid unexpected changes. -* More toolbar functionality. +### Changed -## 0.0.5 +- Update the minimum supported SDK version to **Flutter 3.0/Dart 3.0** for compatibility, fixing [#2347](https://github.com/singerdmx/flutter-quill/issues/2347). +- Improve dependencies constraints for compatibility. +- **BREAKING**: Update configuration class names to use the suffix `Config` instead of `Configurations`. +- The `QuillSimpleToolbar` base button options now support buttons of `flutter_quill_extensions`. -* Update example. +### Removed -## 0.0.4 +- **BREAKING**: The [`super_clipboard`](https://pub.dev/packages/super_clipboard) plugin from [flutter_quill_extensions](https://pub.dev/packages/flutter_quill_extensions). +- **BREAKING**: The deprecated support for loading YouTube videos in `flutter_quill_extensions`. -* Update example. +### Added -## 0.0.3 +- `Insert video` string in `quill_en.arb` to support localization. Currently available **only in English**. -* Update home page meta data. +## [11.0.0-dev.3] - 2024-11-08 -## 0.0.2 +### Changed -* Support image upload and launch url in read-only mode. +- Updates minimum supported [`flutter_quill`](https://pub.dev/packages/flutter_quill) version to `11.0.0-dev.3`. -## 0.0.1 +## [11.0.0-dev.2] - 2024-11-08 -* Rich text editor based on Quill Delta. +### Changed +- Separate the package version and `CHANGELOG.md` from [flutter_quill](https://pub.dev/packages/flutter_quill). diff --git a/flutter_quill_extensions/README.md b/flutter_quill_extensions/README.md index 98988ae9d..e40a5a294 100644 --- a/flutter_quill_extensions/README.md +++ b/flutter_quill_extensions/README.md @@ -1,13 +1,13 @@ # Flutter Quill Extensions An extension for [flutter_quill](https://pub.dev/packages/flutter_quill) -to support embedding widgets images, formulas, and videos. +to support embedding widgets images, and videos. ## 📚 Table of Contents - [📝 About](#-about) - [📦 Installation](#-installation) -- [🛠 Platform Specific Configurations](#-platform-specific-configurations) +- [🛠 Platform Setup](#-platform-setup) - [🚀 Usage](#-usage) - [⚙️ Configurations](#-configurations) - [🤝 Contributing](#-contributing) @@ -25,9 +25,8 @@ Follow the usage instructions of [`flutter_quill`](https://github.com/singerdmx/ Add the `flutter_quill_extensions` dependency to your project: -```yaml -dependencies: - flutter_quill_extensions: ^ +```shell +flutter pub add flutter_quill_extensions ```

OR

@@ -41,15 +40,15 @@ dependencies: path: flutter_quill_extensions ``` -## 🛠 Platform Specific Configurations +## 🛠 Platform Setup The package uses the following plugins: 1. [`gal`](https://github.com/natsuk4ze/gal) to save images. - Ensure to follow the [Get Started](https://github.com/natsuk4ze/gal#-get-started) guide as it requires - platform-specific setup. + Ensure to follow the [gal setup](https://pub.dev/packages/gal#-get-started) guide as it requires platform-specific setup. 2. [`image_picker`](https://pub.dev/packages/image_picker) for picking images. - See the [Installation](https://pub.dev/packages/image_picker#installation) section. + See the [image_picker installation](https://pub.dev/packages/image_picker#installation) section. +3. [`video_player`](https://pub.dev/packages/video_player) for playing videos. See the [video_player setup](https://pub.dev/packages/video_player#setup) section. ### Loading Images from the Internet @@ -75,13 +74,13 @@ the [Flutter macOS Networking documentation](https://docs.flutter.dev/data-and-b ## 🚀 Usage Once you follow the [Installation](#-installation) section. -Set the `embedBuilders` and `embedToolbar` params in configurations of `QuillEditor` and `QuillToolbar`. +Set the `embedBuilders` and `embedToolbar` params in configurations of `QuillEditor` and `QuillSimpleToolbar`. **Quill Toolbar**: ```dart -QuillToolbar.simple( - configurations: QuillSimpleToolbarConfigurations( +QuillSimpleToolbar( + config: QuillSimpleToolbarConfig( embedButtons: FlutterQuillEmbeds.toolbarButtons(), ), ), @@ -92,7 +91,7 @@ QuillToolbar.simple( ```dart Expanded( child: QuillEditor.basic( - configurations: QuillEditorConfigurations( + config: QuillEditorConfig( embedBuilders: kIsWeb ? FlutterQuillEmbeds.editorWebBuilders() : FlutterQuillEmbeds.editorBuilders(), ), ), @@ -103,9 +102,10 @@ Expanded( ### 📦 Embed Blocks -[Flutter_quill](https://pub.dev/packages/flutter_quill) provides an interface for all the users to provide their +The [flutter_quill](https://pub.dev/packages/flutter_quill) provides an interface for all the users to provide their implementations for embed blocks. -Implementations for image, video, and formula embed blocks are proved in this package. + +Implementations for image, video embed blocks are provided in this package. The instructions for using the embed blocks are in the [Usage](#-usage) section. @@ -144,111 +144,25 @@ Define flutterAlignment` as follows: This works only for non-web platforms. -### 📝 Rich Text Paste Feature - -The rich text paste feature is now supported directly in `flutter_quill` -as platform code is not bundled with the project. - ### 🖼️ Image Assets -If you want to use image assets in the Quill Editor, you need to make sure your assets folder is `assets` otherwise: +To support loading image assets in the editor: ```dart -QuillEditor.basic( - configurations: const QuillEditorConfigurations( - // ... - sharedConfigurations: QuillSharedConfigurations( - extraConfigurations: { - QuillSharedExtensionsConfigurations.key: - QuillSharedExtensionsConfigurations( - assetsPrefix: 'your-assets-folder-name', // Defaults to `assets` - ), +FlutterQuillEmbeds.editorBuilders( + imageEmbedConfig: + QuillEditorImageEmbedConfig( + imageProviderBuilder: (context, imageUrl) { + if (imageUrl.startsWith('assets/')) { + return AssetImage(imageUrl); + } + return null; }, - ), - ), -); + ), +) ``` -This info is necessary for the package to check if its asset image to use the `AssetImage` provider. - -### 🎯 Drag and drop feature - -Currently, the drag-and-drop feature is not officially supported, but you can achieve this very easily in the following -steps: - -1. Drag and drop require native code, you can use any Flutter plugin you like, if you want a suggestion we - recommend [desktop_drop](https://pub.dev/packages/desktop_drop), it was originally developed for desktop. - It has support for the web as well as Android (that is not the case for iOS) -2. Add the dependency in your `pubspec.yaml` using the following command: - - ```yaml - flutter pub add desktop_drop - ``` - and import it with - ```dart - import 'package:desktop_drop/desktop_drop.dart'; - ``` -3. in the configurations of `QuillEditor`, use the `builder` to wrap the editor with `DropTarget` which comes - from `desktop_drop` - - ```dart - import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; - - QuillEditor.basic( - configurations: QuillEditorConfigurations( - padding: const EdgeInsets.all(16), - builder: (context, rawEditor) { - return DropTarget( - onDragDone: _onDragDone, - child: rawEditor, - ); - }, - embedBuilders: kIsWeb - ? FlutterQuillEmbeds.editorWebBuilders() - : FlutterQuillEmbeds.editorBuilders(), - ), - ) - ``` -4. Implement the `_onDragDone`, it depends on your use case but this is just a simple example - -```dart -const List imageFileExtensions = [ - '.jpeg', - '.png', - '.jpg', - '.gif', - '.webp', - '.tif', - '.heic' -]; -OnDragDoneCallback get _onDragDone { - return (details) { - final scaffoldMessenger = ScaffoldMessenger.of(context); - final file = details.files.first; - final isSupported = - imageFileExtensions.any((ext) => file.name.endsWith(ext)); - if (!isSupported) { - scaffoldMessenger.showSnackBar( - SnackBar( - content: Text( - 'Only images are supported right now: ${file.mimeType}, ${file.name}, ${file.path}, $imageFileExtensions', - ), - ), - ); - return; - } - // To get this extension function please import flutter_quill_extensions - _controller.insertImageBlock( - imageSource: file.path, - ); - scaffoldMessenger.showSnackBar( - const SnackBar( - content: Text('Image is inserted.'), - ), - ); - }; - } -``` +Ensures to replace `assets` with your assets directory name or change the logic to fit your needs. ## 🤝 Contributing diff --git a/flutter_quill_extensions/lib/flutter_quill_extensions.dart b/flutter_quill_extensions/lib/flutter_quill_extensions.dart index e36dce9e1..4bba28ce9 100644 --- a/flutter_quill_extensions/lib/flutter_quill_extensions.dart +++ b/flutter_quill_extensions/lib/flutter_quill_extensions.dart @@ -1,77 +1,21 @@ library; -import 'package:flutter_quill/flutter_quill_internal.dart' - show ClipboardServiceProvider; -import 'package:meta/meta.dart' show experimental; - -import 'src/editor_toolbar_controller_shared/clipboard/super_clipboard_service.dart'; - export 'src/common/extensions/controller_ext.dart'; -export 'src/common/utils/utils.dart'; +export 'src/editor/image/config/image_config.dart'; +export 'src/editor/image/config/image_web_config.dart'; export 'src/editor/image/image_embed.dart'; export 'src/editor/image/image_embed_types.dart'; export 'src/editor/image/image_web_embed.dart'; -export 'src/editor/image/models/image_configurations.dart'; -export 'src/editor/image/models/image_web_configurations.dart'; -// TODO: Remove Simple Spell Checker Service -export 'src/editor/spell_checker/simple_spell_checker_service.dart'; -export 'src/editor/table/table_cell_embed.dart'; -export 'src/editor/table/table_embed.dart'; -export 'src/editor/table/table_models.dart'; -export 'src/editor/video/models/video_configurations.dart'; -export 'src/editor/video/models/video_web_configurations.dart'; -export 'src/editor/video/models/youtube_video_support_mode.dart'; +export 'src/editor/video/config/video_config.dart'; +export 'src/editor/video/config/video_web_config.dart'; export 'src/editor/video/video_embed.dart'; export 'src/editor/video/video_web_embed.dart'; -export 'src/editor_toolbar_shared/shared_configurations.dart'; export 'src/flutter_quill_embeds.dart'; export 'src/toolbar/camera/camera_button.dart'; export 'src/toolbar/camera/camera_types.dart'; -export 'src/toolbar/camera/models/camera_configurations.dart'; -export 'src/toolbar/formula/formula_button.dart'; -export 'src/toolbar/formula/models/formula_configurations.dart'; +export 'src/toolbar/camera/config/camera_config.dart'; +export 'src/toolbar/image/config/image_config.dart'; export 'src/toolbar/image/image_button.dart'; -export 'src/toolbar/image/models/image_configurations.dart'; -export 'src/toolbar/table/models/table_configurations.dart'; -export 'src/toolbar/table/table_button.dart'; -export 'src/toolbar/video/models/video.dart'; -export 'src/toolbar/video/models/video_configurations.dart'; +export 'src/toolbar/video/config/video.dart'; +export 'src/toolbar/video/config/video_config.dart'; export 'src/toolbar/video/video_button.dart'; - -@Deprecated( - 'Should not be used as will removed soon in future releases.', -) -@experimental -class FlutterQuillExtensions { - FlutterQuillExtensions._(); - - @Deprecated( - ''' - Spell checker feature has been removed from the package to make it optional and - reduce bundle size. See issue https://github.com/singerdmx/flutter-quill/issues/2142 - for more details. - - Calling this function will no longer activate the feature. - ''', - ) - @experimental - static void useSpellCheckerService(String language) { - // This feature has been removed from the package. - // See https://github.com/singerdmx/flutter-quill/issues/2142 - } - - /// Override default implementation of [ClipboardServiceProvider.instance] - /// to allow `flutter_quill` package to use `super_clipboard` plugin - /// to support rich text features, gif and images. - @Deprecated( - 'The functionality of super_clipboard is now built-in in recent versions of flutter_quill.\n' - 'To migrate, remove this function call and see ' - 'https://pub.dev/packages/quill_native_bridge#-platform-configuration (optional for copying images on Android) to use quill_native_bridge implementation (the new default).\n' - 'Or if you want to use super_clipboard implementation (support might discontinued in newer versions), use the package https://pub.dev/packages/quill_super_clipboard\n' - 'See https://github.com/singerdmx/flutter-quill/pull/2230 for more details.', - ) - @experimental - static void useSuperClipboardPlugin() { - ClipboardServiceProvider.setInstance(SuperClipboardService()); - } -} diff --git a/flutter_quill_extensions/lib/src/common/default_image_insert.dart b/flutter_quill_extensions/lib/src/common/default_image_insert.dart new file mode 100644 index 000000000..bec31d9dd --- /dev/null +++ b/flutter_quill_extensions/lib/src/common/default_image_insert.dart @@ -0,0 +1,30 @@ +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:meta/meta.dart'; + +import '../editor/image/image_embed_types.dart'; +import 'extensions/controller_ext.dart'; + +OnImageInsertCallback _defaultOnImageInsert() { + return (imageUrl, controller) async { + controller + ..skipRequestKeyboard = true + // ignore: deprecated_member_use_from_same_package + ..insertImageBlock(imageSource: imageUrl); + }; +} + +@internal +Future handleImageInsert( + String imageUrl, { + required QuillController controller, + required OnImageInsertCallback? onImageInsertCallback, + required OnImageInsertedCallback? onImageInsertedCallback, +}) async { + final customOnImageInsert = onImageInsertCallback; + if (customOnImageInsert != null) { + await customOnImageInsert.call(imageUrl, controller); + } else { + await _defaultOnImageInsert().call(imageUrl, controller); + } + await onImageInsertedCallback?.call(imageUrl); +} diff --git a/flutter_quill_extensions/lib/src/common/default_video_insert.dart b/flutter_quill_extensions/lib/src/common/default_video_insert.dart new file mode 100644 index 000000000..e92d3ce0e --- /dev/null +++ b/flutter_quill_extensions/lib/src/common/default_video_insert.dart @@ -0,0 +1,30 @@ +import 'package:flutter_quill/flutter_quill.dart'; +import 'package:meta/meta.dart'; + +import '../toolbar/video/config/video.dart'; +import 'extensions/controller_ext.dart'; + +OnVideoInsertCallback _defaultOnVideoInsert() { + return (imageUrl, controller) async { + controller + ..skipRequestKeyboard = true + // ignore: deprecated_member_use_from_same_package + ..insertVideoBlock(videoUrl: imageUrl); + }; +} + +@internal +Future handleVideoInsert( + String videoUrl, { + required QuillController controller, + required OnVideoInsertCallback? onVideoInsertCallback, + required OnVideoInsertedCallback? onVideoInsertedCallback, +}) async { + final customOnVideoInsert = onVideoInsertCallback; + if (customOnVideoInsert != null) { + await customOnVideoInsert.call(videoUrl, controller); + } else { + await _defaultOnVideoInsert().call(videoUrl, controller); + } + await onVideoInsertedCallback?.call(videoUrl); +} diff --git a/flutter_quill_extensions/lib/src/common/extensions/attribute.dart b/flutter_quill_extensions/lib/src/common/extensions/attribute.dart index 2467be3f2..5331b552a 100644 --- a/flutter_quill_extensions/lib/src/common/extensions/attribute.dart +++ b/flutter_quill_extensions/lib/src/common/extensions/attribute.dart @@ -1,32 +1,12 @@ import 'package:flutter_quill/flutter_quill.dart' show Attribute, AttributeScope; -// class FlutterWidthAttribute extends Attribute { -// const FlutterWidthAttribute(String? val) -// : super('flutterWidth', AttributeScope.ignore, val); -// } - -// class FlutterHeightAttribute extends Attribute { -// const FlutterHeightAttribute(String? val) -// : super('flutterHeight', AttributeScope.ignore, val); -// } - -// class FlutterMarginAttribute extends Attribute { -// const FlutterMarginAttribute(String? val) -// : super('flutterMargin', AttributeScope.ignore, val); -// } - class FlutterAlignmentAttribute extends Attribute { const FlutterAlignmentAttribute(String? val) : super('flutterAlignment', AttributeScope.ignore, val); } extension AttributeExt on Attribute { - // static const FlutterWidthAttribute flutterWidth = FlutterWidthAttribute(null); - // static const FlutterHeightAttribute flutterHeight = - // FlutterHeightAttribute(null); - // static const FlutterMarginAttribute flutterMargin = - // FlutterMarginAttribute(null); static const FlutterAlignmentAttribute flutterAlignment = FlutterAlignmentAttribute(null); } diff --git a/flutter_quill_extensions/lib/src/common/extensions/controller_ext.dart b/flutter_quill_extensions/lib/src/common/extensions/controller_ext.dart index 8346538a8..eb67e61c4 100644 --- a/flutter_quill_extensions/lib/src/common/extensions/controller_ext.dart +++ b/flutter_quill_extensions/lib/src/common/extensions/controller_ext.dart @@ -1,19 +1,15 @@ import 'package:flutter_quill/flutter_quill.dart'; -/// Extension functions on [QuillController] -/// that make it easier to insert the embed blocks -/// -/// and provide some other extra utilities +@Deprecated('Invalid extension') extension QuillControllerExt on QuillController { + @Deprecated( + 'Invalid extension property and will be removed, use selection.baseOffset instead') int get index => selection.baseOffset; + @Deprecated( + 'Invalid extension property and will be removed, use selection.baseOffset instead') int get length => selection.extentOffset - index; - /// Insert image embed block, it requires the [imageSource] - /// - /// it could be local image on the system file - /// http image on the network - /// - /// image base 64 + @Deprecated('Invalid extension method and will be removed.') void insertImageBlock({ required String imageSource, }) { @@ -28,13 +24,7 @@ extension QuillControllerExt on QuillController { ..moveCursorToPosition(index + 1); } - /// Insert video embed block, it requires the [videoUrl] - /// - /// it could be the video url directly (.mp4) - /// either locally on file system - /// or http video on the network - /// - /// it also supports youtube video url + @Deprecated('Invalid extension method and will be removed.') void insertVideoBlock({ required String videoUrl, }) { diff --git a/flutter_quill_extensions/lib/src/common/image_video_utils.dart b/flutter_quill_extensions/lib/src/common/image_video_utils.dart index 48ab383ee..216566586 100644 --- a/flutter_quill_extensions/lib/src/common/image_video_utils.dart +++ b/flutter_quill_extensions/lib/src/common/image_video_utils.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_quill/flutter_quill.dart' show QuillDialogTheme; -import 'package:flutter_quill/translations.dart'; +import 'package:flutter_quill/internal.dart'; import 'utils/patterns.dart'; diff --git a/flutter_quill_extensions/lib/src/common/utils/element_utils/element_shared_utils.dart b/flutter_quill_extensions/lib/src/common/utils/element_utils/element_shared_utils.dart index 8632fba0f..c5a7d1fd5 100644 --- a/flutter_quill_extensions/lib/src/common/utils/element_utils/element_shared_utils.dart +++ b/flutter_quill_extensions/lib/src/common/utils/element_utils/element_shared_utils.dart @@ -73,11 +73,9 @@ double? parseCssPropertyAsDouble( doubleValue = MediaQuery.textScalerOf(context).scale(doubleValue); break; case _CssUnit.rem: - // Not fully supported yet doubleValue = MediaQuery.textScalerOf(context).scale(doubleValue); break; case _CssUnit.invalid: - // Ignore doubleValue = null; break; } diff --git a/flutter_quill_extensions/lib/src/common/utils/element_utils/element_utils.dart b/flutter_quill_extensions/lib/src/common/utils/element_utils/element_utils.dart index a350f288e..86a95f461 100644 --- a/flutter_quill_extensions/lib/src/common/utils/element_utils/element_utils.dart +++ b/flutter_quill_extensions/lib/src/common/utils/element_utils/element_utils.dart @@ -1,7 +1,7 @@ import 'package:flutter/foundation.dart' show immutable; import 'package:flutter/widgets.dart' show Alignment, BuildContext; import 'package:flutter_quill/flutter_quill.dart' show Attribute, Node; -import 'package:flutter_quill/flutter_quill_internal.dart'; +import 'package:flutter_quill/internal.dart'; import 'element_shared_utils.dart'; diff --git a/flutter_quill_extensions/lib/src/common/utils/quill_image_utils.dart b/flutter_quill_extensions/lib/src/common/utils/quill_image_utils.dart deleted file mode 100644 index 20721d36a..000000000 --- a/flutter_quill_extensions/lib/src/common/utils/quill_image_utils.dart +++ /dev/null @@ -1,284 +0,0 @@ -import 'dart:io' show Directory, File, Platform; - -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter_quill/flutter_quill.dart' as quill; -import 'package:flutter_quill/quill_delta.dart'; -import 'package:path/path.dart' as path; - -typedef OnGenerateNewFileNameCallback = String Function( - String currentFileName, - String fileExt, -); - -@Deprecated( - 'QuillImageUtilities is no longer supported an will be removed in future releases.', -) -class QuillImageUtilities { - const QuillImageUtilities({ - required this.document, - }); - - final quill.Document document; - - /// Private function that is throw an error if the platform is web - static void _webIsNotSupported(String functionName) { - if (kIsWeb) { - throw UnsupportedError( - 'The static function "$functionName()"' - ' on class "QuillImageUtilities" is not supported in Web', - ); - } - } - - /// Saves a list of images to a specified directory. - /// - /// This function is designed to work efficiently on - /// mobile platforms, but it can also be used on other platforms. - /// But it's not supported on web for now - /// - /// When you have a list of cached image paths - /// from a Quill document and you want to save them, - /// you can use this function. - /// It takes a list of image paths and copies each image to the specified - /// directory. If the image - /// path does not exist, it returns an - /// empty string for that item. - /// - /// Make sure that the image paths provided in the [images] - /// list exist, and handle the cases where images are not found accordingly. - /// - /// [images]: List of image paths to be saved. - /// [deleteThePreviousImages]: Indicates whether to delete the - /// original cached images after copying. - /// [saveDirectory]: The directory where the images will be saved. - /// [startOfEachFile]: Each file will have a name and it need to be unique - /// but to make the file name is clear we will need a string represent - /// the start of each file - /// - /// Returns a list of paths to the newly saved images. - /// For images that do not exist, their paths are returned as empty strings. - /// - /// Example usage: - /// ```dart - /// final documentsDir = await getApplicationDocumentsDirectory(); - /// final savedImagePaths = await saveImagesToDirectory( - /// images: cachedImagePaths, - /// deleteThePreviousImages: true, - /// saveDirectory: documentsDir, - /// startOfEachFile: 'quill-image-', // default - /// ); - /// ``` - static Future> saveImagesToDirectory({ - required Iterable images, - required deleteThePreviousImages, - required Directory saveDirectory, - OnGenerateNewFileNameCallback? onGenerateNewFileName, - }) async { - _webIsNotSupported('saveImagesToDirectory'); - final newImagesFutures = images.map((cachedImagePath) async { - final previousImageFile = File(cachedImagePath); - final isPreviousImageFileExists = await previousImageFile.exists(); - - if (!isPreviousImageFileExists) { - return ''; - } - - final newImageFileExtension = path.extension(cachedImagePath); // with dot - - final dateTimeString = DateTime.now().toIso8601String(); - final newImageFileName = onGenerateNewFileName?.call( - cachedImagePath, - newImageFileExtension, - ) ?? - 'quill-image-$dateTimeString$newImageFileExtension'; - final newImagePath = path.join(saveDirectory.path, newImageFileName); - final newImageFile = await previousImageFile.copy(newImagePath); - if (deleteThePreviousImages) { - await previousImageFile.delete(); - } - return newImageFile.path; - }); - // Await for the saving process for each image - final newImages = await Future.wait(newImagesFutures); - return newImages; - } - - /// Deletes all local images referenced in a Quill document. - /// it's not supported on web for now - /// - /// Be **careful**, on desktop you should never delete user images. only if you - /// are sure the image is saved in applicaton documents directory - /// - /// on mobile the app is sandboxed so you can't delete user images - /// because it will be a copy of the image for the app - /// so you should be safe - /// - /// This function removes local images from the - /// file system that are referenced in the provided [document]. - /// - /// [document]: The Quill document from which images will be deleted. - /// - /// Throws an [Exception] if any errors occur during the deletion process. - /// - /// Example usage: - /// ```dart - /// try { - /// await deleteAllLocalImagesOfDocument(myQuillDocument); - /// } catch (e) { - /// print('Error deleting local images: $e'); - /// } - /// ``` - Future deleteAllLocalImages() async { - _webIsNotSupported('deleteAllLocalImagesOfDocument'); - final imagesPaths = getImagesPathsFromDocument( - onlyLocalImages: true, - ); - for (final image in imagesPaths) { - final imageFile = File(image); - final fileExists = await imageFile.exists(); - if (!fileExists) { - return; - } - final deletedFile = await imageFile.delete(); - final deletedFileStillExists = await deletedFile.exists(); - if (deletedFileStillExists) { - throw Exception( - 'We have successfully deleted the file and it is still exists!!', - ); - } - } - } - - /// Retrieves paths to images embedded in a Quill document. - /// - /// it's not supported on web for now. - /// This function parses the Document and returns a list of image paths. - /// - /// [document]: The Quill document from which image paths will be retrieved. - /// [onlyLocalImages]: If `true`, - /// only local (non-web-url) image paths will be included. - /// - /// Returns an iterable of image paths. - /// - /// Example usage: - /// ```dart - /// final quillDocument = _controller.document; - /// final imagePaths - /// = getImagesPathsFromDocument(quillDocument, onlyLocalImages: true); - /// print('Image paths: $imagePaths'); - /// ``` - /// - /// Note: This function assumes that images are - /// embedded as block embeds in the Quill document. - Iterable getImagesPathsFromDocument({ - required bool onlyLocalImages, - }) { - _webIsNotSupported('getImagesPathsFromDocument'); - // final images = document.root.children - // .whereType() - // .where((node) { - // if (node.isEmpty) { - // return false; - // } - // final firstNode = node.children.first; - // if (firstNode is! quill.Embed) { - // return false; - // } - - // if (firstNode.value.type != quill.BlockEmbed.imageType) { - // return false; - // } - // final imageSource = firstNode.value.data; - // if (imageSource is! String) { - // return false; - // } - // if (onlyLocalImages && isHttpBasedUrl(imageSource)) { - // return false; - // } - // return imageSource.trim().isNotEmpty; - // }) - // .toList() - // .map((e) => (e.children.first as quill.Embed).value.data as String); - - final images = []; - for (final item in document.toDelta().toJson()) { - if (!item.containsKey(Operation.insertKey)) { - return []; - } - final insertValue = item[Operation.insertKey]; - - // Check if the insert value is a map with the "image" key - if (insertValue is Map && - insertValue.containsKey(quill.BlockEmbed.imageType)) { - final String imageUrl = insertValue[quill.BlockEmbed.imageType]; - images.add(imageUrl); - } - } - return images; - } - - /// Determines if an image file is cached based on the platform. - /// it's not supported on web for now - /// - /// On mobile platforms (Android and iOS), images are typically - /// cached in temporary directories. - /// This function helps identify whether the given image file path - /// is a cached path on supported platforms. - /// - /// [imagePath] is the path of the image file to check for caching. - /// - /// Returns `true` if the image is cached, `false` otherwise. - /// On other platforms it will always return false - static bool isImageCached(String imagePath) { - // Determine if the image path is a cached path based on platform - if (kIsWeb) { - // For now this will not work for web - return false; - } - if (Platform.isAndroid) { - return imagePath.contains('cache'); - } - if (Platform.isIOS) { - // Don't use isAppleOS() since macOS has different behavior - return imagePath.contains('tmp'); - } - // On other platforms like desktop - // The image is not cached and we will get a direct - // access to the image - return false; - } - - /// Retrieves cached image paths from a Quill document, - /// primarily for mobile platforms. - /// - /// it's not supported on web for now - /// - /// This function scans a Quill document to identify - /// and return paths to locally cached images. - /// It is specifically designed for mobile - /// operating systems (Android and iOS). - /// - /// - /// [replaceUnexistentImagesWith] is an optional parameter. - /// If provided, it replaces non-existent image paths - /// with the specified value. If not provided, non-existent - /// image paths are removed from the result. - /// - /// Returns a list of cached image paths found in the document. - /// On non-mobile platforms, this function returns an empty list. - Iterable getCachedImagePathsFromDocument({ - String? replaceUnexistentImagesWith, - }) { - _webIsNotSupported('getCachedImagePathsFromDocument'); - final imagePaths = getImagesPathsFromDocument( - onlyLocalImages: true, - ); - - // We don't want the not cached images to be saved again for example. - final cachesImagePaths = imagePaths.where((imagePath) { - final isCurrentImageCached = isImageCached(imagePath); - return isCurrentImageCached; - }).toList(); - return cachesImagePaths; - } -} diff --git a/flutter_quill_extensions/lib/src/common/utils/quill_table_utils.dart b/flutter_quill_extensions/lib/src/common/utils/quill_table_utils.dart deleted file mode 100644 index df2f8d00a..000000000 --- a/flutter_quill_extensions/lib/src/common/utils/quill_table_utils.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/widgets.dart' - show - BuildContext, - MediaQuery, - Offset, - Overlay, - Rect, - RelativeRect, - RenderBox, - Size, - TextSelection; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:flutter_quill/quill_delta.dart'; - -enum TableOperation { - addColumn, - addRow, - removeColumn, - removeRow, -} - -RelativeRect renderPosition(BuildContext context, [Size? size]) { - size ??= MediaQuery.sizeOf(context); - final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; - final button = context.findRenderObject() as RenderBox; - final position = RelativeRect.fromRect( - Rect.fromPoints( - button.localToGlobal(const Offset(0, -65), ancestor: overlay), - button.localToGlobal( - button.size.bottomRight(Offset.zero) + const Offset(-50, 0), - ancestor: overlay), - ), - Offset.zero & size * 0.40, - ); - return position; -} - -void insertTable(int rows, int columns, QuillController quillController, - ChangeSource? changeFrom) { - final tableData = _createTableData(rows, columns); - final delta = Delta()..insert({'table': tableData}); - final selection = quillController.selection; - final replacedLength = selection.extentOffset - selection.baseOffset; - final newBaseOffset = selection.baseOffset; - final newExtentOffsetCandidate = - (selection.baseOffset + 1 - replacedLength).toInt(); - final newExtentOffsetAdjusted = - newExtentOffsetCandidate < 0 ? 0 : newExtentOffsetCandidate; - quillController.replaceText( - newBaseOffset, - replacedLength, - delta, - TextSelection( - baseOffset: newBaseOffset, extentOffset: newExtentOffsetAdjusted), - ); -} - -Map _createTableData(int rows, int columns) { - // Crear el mapa para las columnas - final columnsData = {}; - for (var col = 0; col < columns; col++) { - final columnId = '${col + 1}'; - columnsData[columnId] = {'id': columnId, 'position': col}; - } - - // Crear el mapa para las filas - final rowsData = {}; - for (var row = 0; row < rows; row++) { - final rowId = '${row + 1}'; - rowsData[rowId] = {'id': rowId, 'cells': {}}; - - for (var col = 0; col < columns; col++) { - final columnId = '${col + 1}'; - rowsData[rowId]['cells'][columnId] = ''; - } - } - - // Combinar las columnas y filas en una estructura de tabla - final tableData = { - 'columns': columnsData, - 'rows': rowsData, - }; - - return tableData; -} diff --git a/flutter_quill_extensions/lib/src/common/utils/utils.dart b/flutter_quill_extensions/lib/src/common/utils/utils.dart index 7e6b6d8ca..ab13830d7 100644 --- a/flutter_quill_extensions/lib/src/common/utils/utils.dart +++ b/flutter_quill_extensions/lib/src/common/utils/utils.dart @@ -1,16 +1,17 @@ import 'dart:io' show File; import 'package:flutter/foundation.dart' show immutable; +import 'package:gal/gal.dart'; +import 'package:http/http.dart' as http; import '../../editor/image/widgets/image.dart'; -import '../../editor_toolbar_shared/image_saver/s_image_saver.dart'; import 'patterns.dart'; bool isBase64(String str) { return base64RegExp.hasMatch(str); } -bool isHttpBasedUrl(String url) { +bool isHttpUrl(String url) { try { final uri = Uri.parse(url.trim()); return uri.isScheme('HTTP') || uri.isScheme('HTTPS'); @@ -20,13 +21,9 @@ bool isHttpBasedUrl(String url) { } bool isImageBase64(String imageUrl) { - return !isHttpBasedUrl(imageUrl) && isBase64(imageUrl); + return !isHttpUrl(imageUrl) && isBase64(imageUrl); } -@Deprecated( - 'Will be removed in future releases. See https://github.com/singerdmx/flutter-quill/issues/2284' - ' and https://github.com/singerdmx/flutter-quill/issues/2276', -) bool isYouTubeUrl(String videoUrl) { try { final uri = Uri.parse(videoUrl); @@ -51,17 +48,16 @@ class SaveImageResult { Future saveImage({ required String imageUrl, - required ImageSaverService imageSaverService, }) async { final imageFile = File(imageUrl); - final hasPermission = await imageSaverService.hasAccess(); + final hasPermission = await Gal.hasAccess(); if (!hasPermission) { - await imageSaverService.requestAccess(); + await Gal.requestAccess(); } final imageExistsLocally = await imageFile.exists(); if (!imageExistsLocally) { try { - await imageSaverService.saveImageFromNetwork( + await _saveImageFromNetwork( Uri.parse(appendFileExtensionToImageUrl(imageUrl)), ); return const SaveImageResult( @@ -74,17 +70,36 @@ Future saveImage({ method: SaveImageResultMethod.network, ); } + } else { + try { + await _saveLocalImage(Uri.parse(imageUrl)); + return const SaveImageResult( + error: null, + method: SaveImageResultMethod.localStorage, + ); + } catch (e) { + return SaveImageResult( + error: e.toString(), + method: SaveImageResultMethod.localStorage, + ); + } } - try { - await imageSaverService.saveLocalImage(imageUrl); - return const SaveImageResult( - error: null, - method: SaveImageResultMethod.localStorage, - ); - } catch (e) { - return SaveImageResult( - error: e.toString(), - method: SaveImageResultMethod.localStorage, - ); +} + +Future _saveImageFromNetwork(Uri imageUrl) async { + final response = await http.get( + imageUrl, + ); + if (response.statusCode != 200) { + throw Exception('Response to $imageUrl is not successful.'); } + final imageBytes = response.bodyBytes; + await Gal.putImageBytes(imageBytes, + name: imageUrl.pathSegments.isNotEmpty + ? imageUrl.pathSegments.last + : 'image'); +} + +Future _saveLocalImage(Uri imageUrl) async { + await Gal.putImage(imageUrl.toString()); } diff --git a/flutter_quill_extensions/lib/src/editor/formula/formula_embed.dart b/flutter_quill_extensions/lib/src/editor/formula/formula_embed.dart deleted file mode 100644 index baee3c50e..000000000 --- a/flutter_quill_extensions/lib/src/editor/formula/formula_embed.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:flutter_quill/flutter_quill.dart' - show BlockEmbed, Embed, EmbedBuilder, QuillController; - -class QuillEditorFormulaEmbedBuilder extends EmbedBuilder { - const QuillEditorFormulaEmbedBuilder(); - @override - String get key => BlockEmbed.formulaType; - - @override - bool get expanded => false; - - @override - Widget build( - BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, - ) { - throw UnsupportedError( - 'The formula EmbedBuilder is not supported for now.', - ); - // assert(!kIsWeb, 'Please provide formula EmbedBuilder for Web'); - - // final mathController = MathFieldEditingController(); - // return Focus( - // onFocusChange: (hasFocus) { - // if (hasFocus) { - // // If the MathField is tapped, hides the built in keyboard - // SystemChannels.textInput.invokeMethod('TextInput.hide'); - // debugPrint(mathController.currentEditingValue()); - // } - // }, - // child: MathField( - // controller: mathController, - // variables: const ['x', 'y', 'z'], - // onChanged: (value) {}, - // onSubmitted: (value) {}, - // ), - // ); - } -} diff --git a/flutter_quill_extensions/lib/src/editor/image/models/image_configurations.dart b/flutter_quill_extensions/lib/src/editor/image/config/image_config.dart similarity index 82% rename from flutter_quill_extensions/lib/src/editor/image/models/image_configurations.dart rename to flutter_quill_extensions/lib/src/editor/image/config/image_config.dart index 8af3527f3..3b8f1c114 100644 --- a/flutter_quill_extensions/lib/src/editor/image/models/image_configurations.dart +++ b/flutter_quill_extensions/lib/src/editor/image/config/image_config.dart @@ -1,17 +1,17 @@ import 'dart:io' show File; import 'package:flutter/foundation.dart'; -import 'package:flutter_quill/flutter_quill_internal.dart'; +import 'package:flutter_quill/internal.dart'; import '../image_embed_types.dart'; -/// [QuillEditorImageEmbedConfigurations] for desktop, mobile and +/// [QuillEditorImageEmbedConfig] for desktop, mobile and /// other platforms /// excluding web, it's configurations that is needed for the editor /// @immutable -class QuillEditorImageEmbedConfigurations { - const QuillEditorImageEmbedConfigurations({ +class QuillEditorImageEmbedConfig { + const QuillEditorImageEmbedConfig({ ImageEmbedBuilderOnRemovedCallback? onImageRemovedCallback, this.shouldRemoveImageCallback, this.imageProviderBuilder, @@ -36,7 +36,7 @@ class QuillEditorImageEmbedConfigurations { /// ``` /// /// Default value if the passed value is null: - /// [QuillEditorImageEmbedConfigurations.defaultOnImageRemovedCallback] + /// [QuillEditorImageEmbedConfig.defaultOnImageRemovedCallback] /// /// so if you want to do nothing make sure to pass a empty callback /// instead of passing null as value @@ -44,7 +44,7 @@ class QuillEditorImageEmbedConfigurations { ImageEmbedBuilderOnRemovedCallback get onImageRemovedCallback { return _onImageRemovedCallback ?? - QuillEditorImageEmbedConfigurations.defaultOnImageRemovedCallback; + QuillEditorImageEmbedConfig.defaultOnImageRemovedCallback; } /// [shouldRemoveImageCallback] is a callback @@ -73,20 +73,23 @@ class QuillEditorImageEmbedConfigurations { /// final ImageEmbedBuilderWillRemoveCallback? shouldRemoveImageCallback; - /// [imageProviderBuilder] if you want to use custom image provider, please - /// pass a value to this property - /// By default we will use [NetworkImage] provider if the image url/path - /// is using http/https, if not then we will use [FileImage] provider - /// If you ovveride this make sure to handle the case where if the [imageUrl] - /// is in the local storage or it does exists in the system file - /// or use the same way we did it + /// Allows to override the default handling and fallback to the default if `null` was returned. /// /// Example of [imageProviderBuilder] customization: /// ```dart /// imageProviderBuilder: (imageUrl) async { - /// // Example of using cached_network_image package - /// // Don't forgot to check if that image is local or network one - /// return CachedNetworkImageProvider(imageUrl); + /// if (imageUrl.startsWith('assets/')) { + /// // Supports Image assets + /// return AssetImage(imageUrl); + /// } + /// if (imageUrl.startsWith('http')) { + /// // Use https://pub.dev/packages/cached_network_image + /// // for network images to cache them. + /// return CachedNetworkImageProvider(imageUrl); + /// } + /// + /// // Return null to fallback to default handling + /// return null; /// } /// ``` /// @@ -143,14 +146,14 @@ class QuillEditorImageEmbedConfigurations { }; } - QuillEditorImageEmbedConfigurations copyWith({ + QuillEditorImageEmbedConfig copyWith({ ImageEmbedBuilderOnRemovedCallback? onImageRemovedCallback, ImageEmbedBuilderWillRemoveCallback? shouldRemoveImageCallback, ImageEmbedBuilderProviderBuilder? imageProviderBuilder, ImageEmbedBuilderErrorWidgetBuilder? imageErrorWidgetBuilder, bool? forceUseMobileOptionMenuForImageClick, }) { - return QuillEditorImageEmbedConfigurations( + return QuillEditorImageEmbedConfig( onImageRemovedCallback: onImageRemovedCallback ?? _onImageRemovedCallback, shouldRemoveImageCallback: shouldRemoveImageCallback ?? this.shouldRemoveImageCallback, diff --git a/flutter_quill_extensions/lib/src/editor/image/models/image_web_configurations.dart b/flutter_quill_extensions/lib/src/editor/image/config/image_web_config.dart similarity index 66% rename from flutter_quill_extensions/lib/src/editor/image/models/image_web_configurations.dart rename to flutter_quill_extensions/lib/src/editor/image/config/image_web_config.dart index 8facc8a6c..b1b60b060 100644 --- a/flutter_quill_extensions/lib/src/editor/image/models/image_web_configurations.dart +++ b/flutter_quill_extensions/lib/src/editor/image/config/image_web_config.dart @@ -2,8 +2,8 @@ import 'package:flutter/widgets.dart' show BoxConstraints; import 'package:meta/meta.dart' show immutable; @immutable -class QuillEditorWebImageEmbedConfigurations { - const QuillEditorWebImageEmbedConfigurations({ +class QuillEditorWebImageEmbedConfig { + const QuillEditorWebImageEmbedConfig({ this.constraints, }); diff --git a/flutter_quill_extensions/lib/src/editor/image/image_embed.dart b/flutter_quill_extensions/lib/src/editor/image/image_embed.dart index 5e6985541..eb2c49730 100644 --- a/flutter_quill_extensions/lib/src/editor/image/image_embed.dart +++ b/flutter_quill_extensions/lib/src/editor/image/image_embed.dart @@ -1,18 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart' hide OptionalSize; -import 'package:flutter_quill/translations.dart'; +import 'package:flutter_quill/flutter_quill.dart'; import '../../common/utils/element_utils/element_utils.dart'; -import '../../editor_toolbar_shared/shared_configurations.dart'; +import 'config/image_config.dart'; import 'image_menu.dart'; -import 'models/image_configurations.dart'; import 'widgets/image.dart'; class QuillEditorImageEmbedBuilder extends EmbedBuilder { QuillEditorImageEmbedBuilder({ - required this.configurations, + required this.config, }); - final QuillEditorImageEmbedConfigurations configurations; + final QuillEditorImageEmbedConfig config; @override String get key => BlockEmbed.imageType; @@ -23,15 +21,11 @@ class QuillEditorImageEmbedBuilder extends EmbedBuilder { @override Widget build( BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, + EmbedContext embedContext, ) { - final imageSource = standardizeImageUrl(node.value.data); + final imageSource = standardizeImageUrl(embedContext.node.value.data); final ((imageSize), margin, alignment) = getElementAttributes( - node, + embedContext.node, context, ); @@ -41,37 +35,29 @@ class QuillEditorImageEmbedBuilder extends EmbedBuilder { final imageWidget = getImageWidgetByImageSource( context: context, imageSource, - imageProviderBuilder: configurations.imageProviderBuilder, - imageErrorWidgetBuilder: configurations.imageErrorWidgetBuilder, + imageProviderBuilder: config.imageProviderBuilder, + imageErrorWidgetBuilder: config.imageErrorWidgetBuilder, alignment: alignment, height: height, width: width, - assetsPrefix: QuillSharedExtensionsConfigurations.get(context: context) - .assetsPrefix, ); - final imageSaverService = - QuillSharedExtensionsConfigurations.get(context: context) - .imageSaverService; return GestureDetector( onTap: () { - final onImageClicked = configurations.onImageClicked; + final onImageClicked = config.onImageClicked; if (onImageClicked != null) { onImageClicked(imageSource); return; } showDialog( context: context, - builder: (_) => FlutterQuillLocalizationsWidget( - child: ImageOptionsMenu( - controller: controller, - configurations: configurations, - imageSource: imageSource, - imageSize: imageSize, - isReadOnly: readOnly, - imageSaverService: imageSaverService, - imageProvider: imageWidget.image, - ), + builder: (_) => ImageOptionsMenu( + controller: embedContext.controller, + config: config, + imageSource: imageSource, + imageSize: imageSize, + readOnly: embedContext.readOnly, + imageProvider: imageWidget.image, ), ); }, diff --git a/flutter_quill_extensions/lib/src/editor/image/image_embed_types.dart b/flutter_quill_extensions/lib/src/editor/image/image_embed_types.dart index 38fef651a..0ca636929 100644 --- a/flutter_quill_extensions/lib/src/editor/image/image_embed_types.dart +++ b/flutter_quill_extensions/lib/src/editor/image/image_embed_types.dart @@ -4,9 +4,6 @@ import 'package:flutter/widgets.dart' show BuildContext; import 'package:flutter_quill/flutter_quill.dart'; import 'package:meta/meta.dart' show immutable; -import '../../common/extensions/controller_ext.dart'; -import '../../editor_toolbar_shared/image_picker/s_image_picker.dart'; - /// When request picking an image, for example when the image button toolbar /// clicked, it should be null in case the user didn't choose any image or /// any other reasons, and it should be the image file path as string that is @@ -16,7 +13,6 @@ import '../../editor_toolbar_shared/image_picker/s_image_picker.dart'; /// request the source for picking the image, from gallery, link or camera typedef OnRequestPickImage = Future Function( BuildContext context, - ImagePickerService imagePickerService, ); /// A callback will called when inserting a image in the editor @@ -26,14 +22,6 @@ typedef OnImageInsertCallback = Future Function( QuillController controller, ); -OnImageInsertCallback defaultOnImageInsertCallback() { - return (imageUrl, controller) async { - controller - ..skipRequestKeyboard = true - ..insertImageBlock(imageSource: imageUrl); - }; -} - /// When a new image picked this callback will called and you might want to /// do some logic depending on your use case typedef OnImageInsertedCallback = Future Function( @@ -49,22 +37,18 @@ enum InsertImageSource { /// Configurations for dealing with images, on insert a image /// on request picking a image @immutable -class QuillToolbarImageConfigurations { - const QuillToolbarImageConfigurations({ +class QuillToolbarImageConfig { + const QuillToolbarImageConfig({ this.onRequestPickImage, this.onImageInsertedCallback, - OnImageInsertCallback? onImageInsertCallback, - }) : _onImageInsertCallback = onImageInsertCallback; + this.onImageInsertCallback, + }); final OnRequestPickImage? onRequestPickImage; final OnImageInsertedCallback? onImageInsertedCallback; - final OnImageInsertCallback? _onImageInsertCallback; - - OnImageInsertCallback get onImageInsertCallback { - return _onImageInsertCallback ?? defaultOnImageInsertCallback(); - } + final OnImageInsertCallback? onImageInsertCallback; } typedef ImageEmbedBuilderWillRemoveCallback = Future Function( @@ -75,7 +59,7 @@ typedef ImageEmbedBuilderOnRemovedCallback = Future Function( String imageUrl, ); -typedef ImageEmbedBuilderProviderBuilder = ImageProvider Function( +typedef ImageEmbedBuilderProviderBuilder = ImageProvider? Function( BuildContext context, String imageUrl, ); diff --git a/flutter_quill_extensions/lib/src/editor/image/image_menu.dart b/flutter_quill_extensions/lib/src/editor/image/image_menu.dart index 6f64c4e5f..ab7bd9463 100644 --- a/flutter_quill_extensions/lib/src/editor/image/image_menu.dart +++ b/flutter_quill_extensions/lib/src/editor/image/image_menu.dart @@ -6,36 +6,31 @@ import 'package:flutter/foundation.dart' show kIsWeb, Uint8List; import 'package:flutter/material.dart'; import 'package:flutter_quill/flutter_quill.dart' show ImageUrl, QuillController, StyleAttribute, getEmbedNode; -import 'package:flutter_quill/flutter_quill_internal.dart'; -import 'package:flutter_quill/translations.dart'; +import 'package:flutter_quill/internal.dart'; import '../../common/utils/element_utils/element_utils.dart'; import '../../common/utils/string.dart'; import '../../common/utils/utils.dart'; -import '../../editor_toolbar_shared/image_saver/s_image_saver.dart'; -import '../../editor_toolbar_shared/shared_configurations.dart'; -import 'models/image_configurations.dart'; +import 'config/image_config.dart'; import 'widgets/image.dart' show ImageTapWrapper, getImageStyleString; import 'widgets/image_resizer.dart' show ImageResizer; class ImageOptionsMenu extends StatelessWidget { const ImageOptionsMenu({ required this.controller, - required this.configurations, + required this.config, required this.imageSource, required this.imageSize, - required this.isReadOnly, - required this.imageSaverService, + required this.readOnly, required this.imageProvider, super.key, }); final QuillController controller; - final QuillEditorImageEmbedConfigurations configurations; + final QuillEditorImageEmbedConfig config; final String imageSource; final ElementSize imageSize; - final bool isReadOnly; - final ImageSaverService imageSaverService; + final bool readOnly; final ImageProvider imageProvider; @override @@ -46,7 +41,7 @@ class ImageOptionsMenu extends StatelessWidget { child: SimpleDialog( title: Text(context.loc.image), children: [ - if (!isReadOnly) + if (!readOnly) ListTile( title: Text(context.loc.resize), leading: const Icon(Icons.settings_outlined), @@ -56,32 +51,30 @@ class ImageOptionsMenu extends StatelessWidget { context: context, builder: (modalContext) { final screenSize = MediaQuery.sizeOf(modalContext); - return FlutterQuillLocalizationsWidget( - child: ImageResizer( - onImageResize: (width, height) { - final res = getEmbedNode( - controller, - controller.selection.start, + return ImageResizer( + onImageResize: (width, height) { + final res = getEmbedNode( + controller, + controller.selection.start, + ); + + final attr = replaceStyleStringWithSize( + getImageStyleString(controller), + width: width, + height: height, + ); + controller + ..skipRequestKeyboard = true + ..formatText( + res.offset, + 1, + StyleAttribute(attr), ); - - final attr = replaceStyleStringWithSize( - getImageStyleString(controller), - width: width, - height: height, - ); - controller - ..skipRequestKeyboard = true - ..formatText( - res.offset, - 1, - StyleAttribute(attr), - ); - }, - imageWidth: imageSize.width, - imageHeight: imageSize.height, - maxWidth: screenSize.width, - maxHeight: screenSize.height, - ), + }, + imageWidth: imageSize.width, + imageHeight: imageSize.height, + maxWidth: screenSize.width, + maxHeight: screenSize.height, ); }, ); @@ -103,7 +96,7 @@ class ImageOptionsMenu extends StatelessWidget { } }, ), - if (!isReadOnly) + if (!readOnly) ListTile( leading: Icon( Icons.delete_forever_outlined, @@ -114,8 +107,7 @@ class ImageOptionsMenu extends StatelessWidget { Navigator.of(context).pop(); // Call the remove check callback if set - if (await configurations.shouldRemoveImageCallback - ?.call(imageSource) == + if (await config.shouldRemoveImageCallback?.call(imageSource) == false) { return; } @@ -131,7 +123,7 @@ class ImageOptionsMenu extends StatelessWidget { TextSelection.collapsed(offset: offset), ); // Call the post remove callback if set - await configurations.onImageRemovedCallback.call(imageSource); + await config.onImageRemovedCallback.call(imageSource); }, ), if (!kIsWeb) @@ -145,7 +137,6 @@ class ImageOptionsMenu extends StatelessWidget { final saveImageResult = await saveImage( imageUrl: imageSource, - imageSaverService: imageSaverService, ); final imageSavedSuccessfully = saveImageResult.error == null; @@ -184,11 +175,8 @@ class ImageOptionsMenu extends StatelessWidget { context, MaterialPageRoute( builder: (_) => ImageTapWrapper( - assetsPrefix: - QuillSharedExtensionsConfigurations.get(context: context) - .assetsPrefix, imageUrl: imageSource, - configurations: configurations, + config: config, ), ), ), diff --git a/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart b/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart index 6568fdc61..862b532f7 100644 --- a/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart +++ b/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart @@ -8,14 +8,14 @@ import '../../common/utils/dart_ui/dart_ui_fake.dart' as ui; import '../../common/utils/element_utils/element_web_utils.dart'; import '../../common/utils/utils.dart'; -import 'models/image_web_configurations.dart'; +import 'config/image_web_config.dart'; class QuillEditorWebImageEmbedBuilder extends EmbedBuilder { const QuillEditorWebImageEmbedBuilder({ - required this.configurations, + required this.config, }); - final QuillEditorWebImageEmbedConfigurations configurations; + final QuillEditorWebImageEmbedConfig config; @override String get key => BlockEmbed.imageType; @@ -26,17 +26,14 @@ class QuillEditorWebImageEmbedBuilder extends EmbedBuilder { @override Widget build( BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, + EmbedContext embedContext, ) { assert(kIsWeb, 'ImageEmbedBuilderWeb is only for web platform'); - final (height, width, margin, alignment) = getWebElementAttributes(node); + final (height, width, margin, alignment) = + getWebElementAttributes(embedContext.node); - var imageSource = node.value.data.toString(); + var imageSource = embedContext.node.value.data.toString(); // This logic make sure if the image is imageBase64 then // it make sure if the pattern is like @@ -62,8 +59,8 @@ class QuillEditorWebImageEmbedBuilder extends EmbedBuilder { }); return ConstrainedBox( - constraints: configurations.constraints ?? - BoxConstraints.loose(const Size(200, 200)), + constraints: + config.constraints ?? BoxConstraints.loose(const Size(200, 200)), child: HtmlElementView( viewType: imageSource, ), diff --git a/flutter_quill_extensions/lib/src/editor/image/widgets/image.dart b/flutter_quill_extensions/lib/src/editor/image/widgets/image.dart index 59e1ccc0c..a1b0dc0e8 100644 --- a/flutter_quill_extensions/lib/src/editor/image/widgets/image.dart +++ b/flutter_quill_extensions/lib/src/editor/image/widgets/image.dart @@ -7,18 +7,8 @@ import 'package:flutter_quill/flutter_quill.dart'; import 'package:photo_view/photo_view.dart'; import '../../../common/utils/utils.dart'; +import '../config/image_config.dart'; import '../image_embed_types.dart'; -import '../models/image_configurations.dart'; - -const List imageFileExtensions = [ - '.jpeg', - '.png', - '.jpg', - '.gif', - '.webp', - '.tif', - '.heic' -]; String getImageStyleString(QuillController controller) { final String? s = controller @@ -36,25 +26,23 @@ String getImageStyleString(QuillController controller) { ImageProvider getImageProviderByImageSource( String imageSource, { required ImageEmbedBuilderProviderBuilder? imageProviderBuilder, - required String assetsPrefix, required BuildContext context, }) { if (imageProviderBuilder != null) { - return imageProviderBuilder(context, imageSource); + final imageProvider = imageProviderBuilder(context, imageSource); + if (imageProvider != null) { + return imageProvider; + } } if (isImageBase64(imageSource)) { return MemoryImage(base64.decode(imageSource)); } - if (isHttpBasedUrl(imageSource)) { + if (isHttpUrl(imageSource)) { return NetworkImage(imageSource); } - if (imageSource.startsWith(assetsPrefix)) { - return AssetImage(imageSource); - } - // File image if (kIsWeb) { return NetworkImage(imageSource); @@ -67,7 +55,6 @@ Image getImageWidgetByImageSource( required BuildContext context, required ImageEmbedBuilderProviderBuilder? imageProviderBuilder, required ImageErrorWidgetBuilder? imageErrorWidgetBuilder, - required String assetsPrefix, double? width, double? height, AlignmentGeometry alignment = Alignment.center, @@ -77,7 +64,6 @@ Image getImageWidgetByImageSource( context: context, imageSource, imageProviderBuilder: imageProviderBuilder, - assetsPrefix: assetsPrefix, ), width: width, height: height, @@ -93,6 +79,16 @@ String standardizeImageUrl(String url) { return url; } +const List _imageFileExtensions = [ + '.jpeg', + '.png', + '.jpg', + '.gif', + '.webp', + '.tif', + '.heic' +]; + /// This is a bug of Gallery Saver Package. /// It can not save image that's filename does not end with it's file extension /// like below. @@ -100,13 +96,13 @@ String standardizeImageUrl(String url) { /// If imageUrl does not end with it's file extension, /// file extension is added to image url for saving. String appendFileExtensionToImageUrl(String url) { - final endsWithImageFileExtension = imageFileExtensions + final endsWithImageFileExtension = _imageFileExtensions .firstWhere((s) => url.toLowerCase().endsWith(s), orElse: () => ''); if (endsWithImageFileExtension.isNotEmpty) { return url; } - final imageFileExtension = imageFileExtensions + final imageFileExtension = _imageFileExtensions .firstWhere((s) => url.toLowerCase().contains(s), orElse: () => ''); return url + imageFileExtension; @@ -115,14 +111,12 @@ String appendFileExtensionToImageUrl(String url) { class ImageTapWrapper extends StatelessWidget { const ImageTapWrapper({ required this.imageUrl, - required this.configurations, - required this.assetsPrefix, + required this.config, super.key, }); final String imageUrl; - final QuillEditorImageEmbedConfigurations configurations; - final String assetsPrefix; + final QuillEditorImageEmbedConfig config; @override Widget build(BuildContext context) { @@ -137,10 +131,9 @@ class ImageTapWrapper extends StatelessWidget { imageProvider: getImageProviderByImageSource( context: context, imageUrl, - imageProviderBuilder: configurations.imageProviderBuilder, - assetsPrefix: assetsPrefix, + imageProviderBuilder: config.imageProviderBuilder, ), - errorBuilder: configurations.imageErrorWidgetBuilder, + errorBuilder: config.imageErrorWidgetBuilder, loadingBuilder: (context, event) { return Container( color: Colors.black, diff --git a/flutter_quill_extensions/lib/src/editor/image/widgets/image_resizer.dart b/flutter_quill_extensions/lib/src/editor/image/widgets/image_resizer.dart index 0e7f90cf9..a8d2609b0 100644 --- a/flutter_quill_extensions/lib/src/editor/image/widgets/image_resizer.dart +++ b/flutter_quill_extensions/lib/src/editor/image/widgets/image_resizer.dart @@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart' show defaultTargetPlatform; import 'package:flutter/material.dart' show Slider, Card; import 'package:flutter/scheduler.dart' show SchedulerBinding; import 'package:flutter/widgets.dart'; -import 'package:flutter_quill/translations.dart'; +import 'package:flutter_quill/internal.dart'; class ImageResizer extends StatefulWidget { const ImageResizer({ diff --git a/flutter_quill_extensions/lib/src/editor/spell_checker/simple_spell_checker_service.dart b/flutter_quill_extensions/lib/src/editor/spell_checker/simple_spell_checker_service.dart deleted file mode 100644 index c6fbb7807..000000000 --- a/flutter_quill_extensions/lib/src/editor/spell_checker/simple_spell_checker_service.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; - -@Deprecated( - ''' - Spell checker feature has been removed from the package to make it optional and - reduce bundle size. See issue https://github.com/singerdmx/flutter-quill/issues/2142 - for more details. - - Calling this function will not activate the feature. - - This class will be removed in future releases. - ''', -) -class SimpleSpellCheckerService extends SpellCheckerService { - SimpleSpellCheckerService({required super.language}); - - void _featureNoLongerAvailable() => throw UnimplementedError( - ''' - The spell checker feature has been removed from the package and is now optional. - See https://github.com/singerdmx/flutter-quill/issues/2142 for more details. - ''', - ); - @override - void addCustomLanguage({required Object? languageIdentifier}) => - _featureNoLongerAvailable(); - - @override - List? checkSpelling(String text, - {LongPressGestureRecognizer Function(String p1)? - customLongPressRecognizerOnWrongSpan}) { - _featureNoLongerAvailable(); - throw UnimplementedError(); - } - - @override - void dispose({bool onlyPartial = false}) => _featureNoLongerAvailable(); - - @override - bool isServiceActive() { - _featureNoLongerAvailable(); - throw UnimplementedError(); - } - - @override - void setNewLanguageState({required String language}) => - _featureNoLongerAvailable(); - - @override - void toggleChecker() => _featureNoLongerAvailable(); - - @override - void updateCustomLanguageIfExist({required Object? languageIdentifier}) => - _featureNoLongerAvailable(); -} diff --git a/flutter_quill_extensions/lib/src/editor/table/table_cell_embed.dart b/flutter_quill_extensions/lib/src/editor/table/table_cell_embed.dart deleted file mode 100644 index 94ae51b5b..000000000 --- a/flutter_quill_extensions/lib/src/editor/table/table_cell_embed.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:meta/meta.dart'; - -@experimental -@Deprecated( - 'TableCellWidget will no longer used and it will be removed in future releases') -class TableCellWidget extends StatefulWidget { - const TableCellWidget({ - required this.cellId, - required this.cellData, - required this.onUpdate, - required this.onTap, - super.key, - }); - final String cellId; - final String cellData; - final Function(FocusNode node) onTap; - final Function(String data) onUpdate; - - @override - State createState() => _TableCellWidgetState(); -} - -// ignore: deprecated_member_use_from_same_package -class _TableCellWidgetState extends State { - late final TextEditingController controller; - late final FocusNode node; - Timer? _debounce; - @override - void initState() { - controller = TextEditingController(text: widget.cellData); - node = FocusNode(); - super.initState(); - } - - void _onTextChanged() { - if (!_debounce!.isActive) { - widget.onUpdate(controller.text); - return; - } - } - - @override - void dispose() { - controller - ..removeListener(_onTextChanged) - ..dispose(); - node.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Container( - width: 40, - constraints: const BoxConstraints( - minHeight: 50, - ), - padding: const EdgeInsets.only(left: 5, right: 5, top: 5), - child: TextFormField( - controller: controller, - focusNode: node, - keyboardType: TextInputType.multiline, - maxLines: null, - decoration: const InputDecoration.collapsed(hintText: ''), - onTap: () { - widget.onTap.call(node); - }, - onTapAlwaysCalled: true, - onChanged: (value) { - _debounce = Timer( - const Duration(milliseconds: 900), - _onTextChanged, - ); - }, - ), - ); - } -} diff --git a/flutter_quill_extensions/lib/src/editor/table/table_embed.dart b/flutter_quill_extensions/lib/src/editor/table/table_embed.dart deleted file mode 100644 index 3a8cc3b90..000000000 --- a/flutter_quill_extensions/lib/src/editor/table/table_embed.dart +++ /dev/null @@ -1,245 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:flutter_quill/quill_delta.dart'; -import 'package:meta/meta.dart'; -import '../../common/utils/quill_table_utils.dart'; -import 'table_cell_embed.dart'; -import 'table_models.dart'; - -@experimental -@Deprecated( - 'CustomTableEmbed will no longer used and it will be removed in future releases') -class CustomTableEmbed extends CustomBlockEmbed { - const CustomTableEmbed(String value) : super(tableType, value); - - static const String tableType = 'table'; - - static CustomTableEmbed fromDocument(Document document) => - CustomTableEmbed(jsonEncode(document.toDelta().toJson())); - - Document get document => Document.fromJson(jsonDecode(data)); -} - -//Embed builder - -@experimental -class QuillEditorTableEmbedBuilder extends EmbedBuilder { - @override - String get key => 'table'; - - @override - Widget build( - BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, - ) { - final tableData = node.value.data; - // ignore: deprecated_member_use_from_same_package - return TableWidget( - tableData: tableData, - controller: controller, - ); - } -} - -@experimental -@Deprecated( - 'TableWidget will no longer used and it will be removed in future releases') -class TableWidget extends StatefulWidget { - const TableWidget({ - required this.tableData, - required this.controller, - super.key, - }); - final QuillController controller; - final Map tableData; - - @override - State createState() => _TableWidgetState(); -} - -// ignore: deprecated_member_use_from_same_package -class _TableWidgetState extends State { - TableModel _tableModel = TableModel(columns: {}, rows: {}); - String _selectedColumnId = ''; - String _selectedRowId = ''; - - @override - void initState() { - _tableModel = TableModel.fromMap(widget.tableData); - super.initState(); - } - - void _addColumn() { - setState(() { - final id = '${_tableModel.columns.length + 1}'; - final position = _tableModel.columns.length; - _tableModel.columns[id] = ColumnModel(id: id, position: position); - _tableModel.rows.forEach((key, row) { - row.cells[id] = ''; - }); - }); - _updateTable(); - } - - void _addRow() { - setState(() { - final id = '${_tableModel.rows.length + 1}'; - final cells = {}; - _tableModel.columns.forEach((key, column) { - cells[key] = ''; - }); - _tableModel.rows[id] = RowModel(id: id, cells: cells); - }); - _updateTable(); - } - - void _removeColumn(String columnId) { - setState(() { - _tableModel.columns.remove(columnId); - _tableModel.rows.forEach((key, row) { - row.cells.remove(columnId); - }); - if (_selectedRowId == _selectedColumnId) { - _selectedRowId = ''; - } - _selectedColumnId = ''; - }); - _updateTable(); - } - - void _removeRow(String rowId) { - setState(() { - _tableModel.rows.remove(rowId); - _selectedRowId = ''; - }); - _updateTable(); - } - - void _updateCell(String columnId, String rowId, String data) { - setState(() { - _tableModel.rows[rowId]!.cells[columnId] = data; - }); - _updateTable(); - } - - void _updateTable() { - WidgetsBinding.instance.addPostFrameCallback((_) { - final offset = getEmbedNode( - widget.controller, - widget.controller.selection.start, - ).offset; - final delta = Delta()..insert({'table': _tableModel.toMap()}); - widget.controller.replaceText( - offset, - 1, - delta, - TextSelection.collapsed( - offset: offset, - ), - ); - }); - } - - @override - Widget build(BuildContext context) { - return Material( - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Theme.of(context).textTheme.bodyMedium?.color ?? - Colors.black)), - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - IconButton( - icon: const Icon(Icons.more_vert), - onPressed: () async { - final position = renderPosition(context); - await showMenu( - context: context, - position: position, - items: [ - const PopupMenuItem( - value: TableOperation.addColumn, - child: Text('Add column'), - ), - const PopupMenuItem( - value: TableOperation.addRow, - child: Text('Add row'), - ), - const PopupMenuItem( - value: TableOperation.removeColumn, - child: Text('Delete column'), - ), - const PopupMenuItem( - value: TableOperation.removeRow, - child: Text('Delete row'), - ), - ]).then((value) { - if (value != null) { - if (value == TableOperation.addRow) { - _addRow(); - } - if (value == TableOperation.addColumn) { - _addColumn(); - } - if (value == TableOperation.removeColumn) { - _removeColumn(_selectedColumnId); - } - if (value == TableOperation.removeRow) { - _removeRow(_selectedRowId); - } - } - }); - }, - ), - const Divider( - color: Colors.white, - height: 1, - ), - Table( - border: const TableBorder.symmetric( - inside: BorderSide(color: Colors.white)), - children: _buildTableRows(), - ), - ], - ), - ), - ); - } - - List _buildTableRows() { - final rows = []; - - _tableModel.rows.forEach((rowId, rowModel) { - final rowCells = []; - final rowKey = rowId; - rowModel.cells.forEach((key, value) { - if (key != 'id') { - final columnId = key; - final data = value; - // ignore: deprecated_member_use_from_same_package - rowCells.add(TableCellWidget( - cellId: rowKey, - onTap: (node) { - setState(() { - _selectedColumnId = columnId; - _selectedRowId = rowModel.id; - }); - }, - cellData: data, - onUpdate: (data) => _updateCell(columnId, rowKey, data), - )); - } - }); - rows.add(TableRow(children: rowCells)); - }); - return rows; - } -} diff --git a/flutter_quill_extensions/lib/src/editor/table/table_models.dart b/flutter_quill_extensions/lib/src/editor/table/table_models.dart deleted file mode 100644 index 26a231356..000000000 --- a/flutter_quill_extensions/lib/src/editor/table/table_models.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:meta/meta.dart'; - -@experimental -class TableModel { - TableModel({required this.columns, required this.rows}); - - factory TableModel.fromMap(Map json) { - return TableModel( - columns: (json['columns'] as Map).map( - (key, value) => MapEntry( - key, - ColumnModel.fromMap( - value, - ), - ), - ), - rows: (json['rows'] as Map).map( - (key, value) => MapEntry( - key, - RowModel.fromMap( - value, - ), - ), - ), - ); - } - Map columns; - Map rows; - - Map toMap() { - return { - 'columns': columns.map( - (key, value) => MapEntry( - key, - value.toMap(), - ), - ), - 'rows': rows.map( - (key, value) => MapEntry( - key, - value.toMap(), - ), - ), - }; - } -} - -@experimental -class ColumnModel { - ColumnModel({required this.id, required this.position}); - - factory ColumnModel.fromMap(Map json) { - return ColumnModel( - id: json['id'], - position: json['position'], - ); - } - String id; - int position; - - Map toMap() { - return { - 'id': id, - 'position': position, - }; - } -} - -@experimental -class RowModel { - // Key is column ID, value is cell content - - RowModel({required this.id, required this.cells}); - - factory RowModel.fromMap(Map json) { - return RowModel( - id: json['id'], - cells: Map.from(json['cells']), - ); - } - String id; - Map cells; - - Map toMap() { - return { - 'id': id, - 'cells': cells, - }; - } -} diff --git a/flutter_quill_extensions/lib/src/editor/video/config/video_config.dart b/flutter_quill_extensions/lib/src/editor/video/config/video_config.dart new file mode 100644 index 000000000..876efecc2 --- /dev/null +++ b/flutter_quill_extensions/lib/src/editor/video/config/video_config.dart @@ -0,0 +1,46 @@ +import 'package:flutter/widgets.dart' show GlobalKey, Widget; +import 'package:meta/meta.dart' show experimental, immutable; + +@immutable +class QuillEditorVideoEmbedConfig { + const QuillEditorVideoEmbedConfig({ + this.onVideoInit, + this.customVideoBuilder, + }); + + /// [onVideoInit] is a callback function that gets triggered when + /// a video is initialized. + /// You can use this to perform actions or setup configurations related + /// to video embedding. + /// + /// + /// Example usage: + /// ```dart + /// onVideoInit: (videoContainerKey) { + /// // Custom video initialization logic + /// }, + /// // Customize other callback functions as needed + /// ``` + final void Function(GlobalKey videoContainerKey)? onVideoInit; + + /// [customVideoBuilder] is a callback function that receives the + /// video URL and a read-only flag. This allows users to define + /// their own logic for rendering video widgets, enabling support + /// for various video platforms, such as YouTube. + /// + /// Example usage: + /// ```dart + /// customVideoBuilder: (videoUrl, readOnly) { + /// // Return `null` to fallback to defualt logic of QuillEditorVideoEmbedBuilder + /// + /// // Return a custom video widget based on the videoUrl + /// return CustomVideoWidget(videoUrl: videoUrl, readOnly: readOnly); + /// }, + /// ``` + /// + /// It's a quick solution as response to https://github.com/singerdmx/flutter-quill/issues/2284 + /// + /// **Might be removed or changed in future releases.** + @experimental + final Widget? Function(String videoUrl, bool readOnly)? customVideoBuilder; +} diff --git a/flutter_quill_extensions/lib/src/editor/video/config/video_web_config.dart b/flutter_quill_extensions/lib/src/editor/video/config/video_web_config.dart new file mode 100644 index 000000000..0eb6e14f8 --- /dev/null +++ b/flutter_quill_extensions/lib/src/editor/video/config/video_web_config.dart @@ -0,0 +1,6 @@ +import 'package:meta/meta.dart' show immutable; + +@immutable +class QuillEditorWebVideoEmbedConfig { + const QuillEditorWebVideoEmbedConfig(); +} diff --git a/flutter_quill_extensions/lib/src/editor/video/models/video_configurations.dart b/flutter_quill_extensions/lib/src/editor/video/models/video_configurations.dart deleted file mode 100644 index ba1ac23c7..000000000 --- a/flutter_quill_extensions/lib/src/editor/video/models/video_configurations.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:flutter/widgets.dart' show GlobalKey, Widget; -import 'package:meta/meta.dart' show experimental, immutable; - -import 'youtube_video_support_mode.dart'; - -@immutable -class QuillEditorVideoEmbedConfigurations { - const QuillEditorVideoEmbedConfigurations({ - this.onVideoInit, - @Deprecated( - 'Loading youtube videos is no longer built-in feature of flutter_quill_extensions.\n' - 'See https://github.com/singerdmx/flutter-quill/issues/2284.\n' - 'Try to use the experimental `customVideoBuilder` property to implement\n' - 'your own YouTube logic using packages such as ' - 'https://pub.dev/packages/youtube_video_player or https://pub.dev/packages/youtube_player_flutter', - ) - this.youtubeVideoSupportMode = YoutubeVideoSupportMode.disabled, - this.ignoreYouTubeSupport = false, - this.customVideoBuilder, - }); - - /// [onVideoInit] is a callback function that gets triggered when - /// a video is initialized. - /// You can use this to perform actions or setup configurations related - /// to video embedding. - /// - /// - /// Example usage: - /// ```dart - /// onVideoInit: (videoContainerKey) { - /// // Custom video initialization logic - /// }, - /// // Customize other callback functions as needed - /// ``` - final void Function(GlobalKey videoContainerKey)? onVideoInit; - - /// Specifies how YouTube videos should be loaded if the video URL - /// is YouTube video. - @Deprecated( - 'Loading youtube videos is no longer built-in feature of flutter_quill_extensions.\n' - 'See https://github.com/singerdmx/flutter-quill/issues/2284.\n' - 'Try to use the experimental `customVideoBuilder` property to implement\n' - 'your own YouTube logic using packages such as ' - 'https://pub.dev/packages/youtube_video_player or https://pub.dev/packages/youtube_player_flutter', - ) - final YoutubeVideoSupportMode youtubeVideoSupportMode; - - /// Pass `true` to ignore anything related to YouTube which will disable - /// This functionality is without any warnings. - /// - /// Making it `true`, means that the video embed widget will no longer - /// check for the video URL and expect it a valid and a standrad video URL. - /// - /// This property will be removed in future releases once YouTube support is - /// removed. - /// - /// Use [customVideoBuilder] to load youtube videos. - @experimental - @Deprecated( - 'Will be removed in future releases. Exist to allow users to ignore warnings.', - ) - final bool ignoreYouTubeSupport; - - /// [customVideoBuilder] is a callback function that receives the - /// video URL and a read-only flag. This allows users to define - /// their own logic for rendering video widgets, enabling support - /// for various video platforms, such as YouTube. - /// - /// Example usage: - /// ```dart - /// customVideoBuilder: (videoUrl, readOnly) { - /// // Return `null` to fallback to defualt logic of QuillEditorVideoEmbedBuilder - /// - /// // Return a custom video widget based on the videoUrl - /// return CustomVideoWidget(videoUrl: videoUrl, readOnly: readOnly); - /// }, - /// ``` - /// - /// It's a quick solution as response to https://github.com/singerdmx/flutter-quill/issues/2284 - /// - /// **Might be removed or changed in future releases.** - @experimental - final Widget? Function(String videoUrl, bool readOnly)? customVideoBuilder; -} diff --git a/flutter_quill_extensions/lib/src/editor/video/models/video_web_configurations.dart b/flutter_quill_extensions/lib/src/editor/video/models/video_web_configurations.dart deleted file mode 100644 index 084cb1939..000000000 --- a/flutter_quill_extensions/lib/src/editor/video/models/video_web_configurations.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter/widgets.dart' show BoxConstraints; -import 'package:meta/meta.dart' show immutable; - -@immutable -class QuillEditorWebVideoEmbedConfigurations { - const QuillEditorWebVideoEmbedConfigurations({ - this.constraints, - }); - - @Deprecated('This property is no longer used.') - final BoxConstraints? constraints; -} diff --git a/flutter_quill_extensions/lib/src/editor/video/models/youtube_video_support_mode.dart b/flutter_quill_extensions/lib/src/editor/video/models/youtube_video_support_mode.dart deleted file mode 100644 index 0884c6741..000000000 --- a/flutter_quill_extensions/lib/src/editor/video/models/youtube_video_support_mode.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:meta/meta.dart'; - -/// **Will be removed soon in future releases**. -@experimental -@Deprecated( - 'YouTube video support will be removed soon and completely in the next releases.', -) -enum YoutubeVideoSupportMode { - /// **Will be removed soon in future releases**. - /// Disable loading of YouTube videos. - /// **Will be removed soon in future releases**. - @Deprecated('Loading YouTube videos is already disabled by default.') - disabled, - - /// **Will be removed soon in future releases**. - /// - /// Load the video using the official YouTube IFrame API. - /// See [YouTube IFrame API](https://developers.google.com/youtube/iframe_api_reference) for more details. - /// - /// This will use Platform View on native platforms to use WebView - /// The WebView might not be supported on Desktop and will throw an exception - /// - /// See [Flutter InAppWebview Support for Flutter Desktop](https://github.com/pichillilorenzo/flutter_inappwebview/issues/460) - /// - /// **Important**: We had to remove [flutter_inappwebview](https://pub.dev/packages/flutter_inappwebview) - /// and [youtube_player_flutter](https://pub.dev/packages/youtube_player_flutter) - /// as non breaking change since most users are unable to build the project, - /// preventing them from using - /// - /// **Will be removed soon in future releases**. - @Deprecated( - 'This functionality has been removed to fix build failure issues. See https://github.com/singerdmx/flutter-quill/issues/2284 for discussion.', - ) - iframeView, - - /// **Will be removed soon in future releases**. - /// - /// Load the video using a custom video player by fetching the YouTube video URL. - /// Note: This might violate YouTube's terms of service. - /// See [YouTube Terms of Service](https://www.youtube.com/static?template=terms) for more details. - /// - /// **WARNING**: We highly suggest to not use this solution, - /// can cause issues with YouTube Terms of Service and require a extra dependency for all users. - /// YouTube servers can reject requests and respond with `Sign in to confirm you’re not a bot` - /// See related issue: https://github.com/Hexer10/youtube_explode_dart/issues/282 - /// - /// **Will be removed soon in future releases**. - @Deprecated( - 'Can cause issues with YouTube Terms of Service and require a extra dependency for all users - Will be removed soon.\n' - 'YouTube servers can reject requests and respond with "Sign in to confirm you’re not a bot"\n' - 'See related issue https://github.com/Hexer10/youtube_explode_dart/issues/282\n', - ) - customPlayerWithDownloadUrl, -} diff --git a/flutter_quill_extensions/lib/src/editor/video/video_embed.dart b/flutter_quill_extensions/lib/src/editor/video/video_embed.dart index f387febd6..bc55b2344 100644 --- a/flutter_quill_extensions/lib/src/editor/video/video_embed.dart +++ b/flutter_quill_extensions/lib/src/editor/video/video_embed.dart @@ -1,19 +1,16 @@ -import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import 'package:flutter_quill/flutter_quill.dart'; import '../../common/utils/element_utils/element_utils.dart'; -import '../../common/utils/utils.dart'; -import 'models/video_configurations.dart'; +import 'config/video_config.dart'; import 'widgets/video_app.dart'; -import 'widgets/youtube_video_app.dart'; class QuillEditorVideoEmbedBuilder extends EmbedBuilder { const QuillEditorVideoEmbedBuilder({ - required this.configurations, + required this.config, }); - final QuillEditorVideoEmbedConfigurations configurations; + final QuillEditorVideoEmbedConfig config; @override String get key => BlockEmbed.videoType; @@ -24,49 +21,20 @@ class QuillEditorVideoEmbedBuilder extends EmbedBuilder { @override Widget build( BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, + EmbedContext embedContext, ) { - assert(!kIsWeb, 'Please provide video EmbedBuilder for Web'); + final videoUrl = embedContext.node.value.data; - final videoUrl = node.value.data; - - final customVideoBuilder = configurations.customVideoBuilder; + final customVideoBuilder = config.customVideoBuilder; if (customVideoBuilder != null) { - final videoWidget = customVideoBuilder(videoUrl, readOnly); + final videoWidget = customVideoBuilder(videoUrl, embedContext.readOnly); if (videoWidget != null) { return videoWidget; } } - // ignore: deprecated_member_use_from_same_package - if (isYouTubeUrl(videoUrl) && !configurations.ignoreYouTubeSupport) { - assert(() { - debugPrint( - "It seems that you're loading a youtube video URL.\n" - 'Loading YouTube videos is no longer built-in feature as part of flutter_quill_extensions.\n' - 'This message will only appear in development mode. See https://github.com/singerdmx/flutter-quill/issues/2284\n' - 'Consider using the experimental property `QuillEditorVideoEmbedConfigurations.customVideoBuilder` in your configuration.\n' - 'This message will only included in development mode.\n', - ); - return true; - }()); - - /// Will be removed soon in future releases - - // ignore: deprecated_member_use_from_same_package - return YoutubeVideoApp( - videoUrl: videoUrl, - readOnly: readOnly, - // ignore: deprecated_member_use_from_same_package - youtubeVideoSupportMode: configurations.youtubeVideoSupportMode, - ); - } final ((elementSize), margin, alignment) = getElementAttributes( - node, + embedContext.node, context, ); @@ -79,8 +47,8 @@ class QuillEditorVideoEmbedBuilder extends EmbedBuilder { alignment: alignment, child: VideoApp( videoUrl: videoUrl, - readOnly: readOnly, - onVideoInit: configurations.onVideoInit, + readOnly: embedContext.readOnly, + onVideoInit: config.onVideoInit, ), ); } diff --git a/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart b/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart index 0b27755b2..ea104dce9 100644 --- a/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart +++ b/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart @@ -7,15 +7,15 @@ import '../../common/utils/dart_ui/dart_ui_fake.dart' as ui; import '../../common/utils/element_utils/element_web_utils.dart'; import '../../common/utils/utils.dart'; -import 'models/video_web_configurations.dart'; +import 'config/video_web_config.dart'; import 'youtube_video_url.dart'; class QuillEditorWebVideoEmbedBuilder extends EmbedBuilder { const QuillEditorWebVideoEmbedBuilder({ - required this.configurations, + required this.config, }); - final QuillEditorWebVideoEmbedConfigurations configurations; + final QuillEditorWebVideoEmbedConfig config; @override String get key => BlockEmbed.videoType; @@ -26,14 +26,9 @@ class QuillEditorWebVideoEmbedBuilder extends EmbedBuilder { @override Widget build( BuildContext context, - QuillController controller, - Embed node, - bool readOnly, - bool inline, - TextStyle textStyle, + EmbedContext embedContext, ) { - var videoUrl = node.value.data; - // ignore: deprecated_member_use_from_same_package + var videoUrl = embedContext.node.value.data; if (isYouTubeUrl(videoUrl)) { // ignore: deprecated_member_use_from_same_package final youtubeID = convertVideoUrlToId(videoUrl); @@ -42,7 +37,8 @@ class QuillEditorWebVideoEmbedBuilder extends EmbedBuilder { } } - final (height, width, margin, alignment) = getWebElementAttributes(node); + final (height, width, margin, alignment) = + getWebElementAttributes(embedContext.node); ui.PlatformViewRegistry().registerViewFactory( videoUrl, diff --git a/flutter_quill_extensions/lib/src/editor/video/widgets/video_app.dart b/flutter_quill_extensions/lib/src/editor/video/widgets/video_app.dart index bd02df6a4..6e86cb43e 100644 --- a/flutter_quill_extensions/lib/src/editor/video/widgets/video_app.dart +++ b/flutter_quill_extensions/lib/src/editor/video/widgets/video_app.dart @@ -6,7 +6,7 @@ import 'package:flutter_quill/flutter_quill.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:video_player/video_player.dart'; -import '../../../../flutter_quill_extensions.dart'; +import '../../../common/utils/utils.dart'; /// Widget for playing back video /// Refer to https://github.com/flutter/plugins/tree/master/packages/video_player/video_player @@ -14,10 +14,6 @@ class VideoApp extends StatefulWidget { const VideoApp({ required this.videoUrl, required this.readOnly, - @Deprecated( - 'The context is no longer required and will be removed on future releases', - ) - BuildContext? context, super.key, this.onVideoInit, }); @@ -38,7 +34,7 @@ class VideoAppState extends State { void initState() { super.initState(); - _controller = isHttpBasedUrl(widget.videoUrl) + _controller = isHttpUrl(widget.videoUrl) ? VideoPlayerController.networkUrl(Uri.parse(widget.videoUrl)) : VideoPlayerController.file(File(widget.videoUrl)) ..initialize().then((_) { diff --git a/flutter_quill_extensions/lib/src/editor/video/widgets/youtube_video_app.dart b/flutter_quill_extensions/lib/src/editor/video/widgets/youtube_video_app.dart deleted file mode 100644 index 503aea5fd..000000000 --- a/flutter_quill_extensions/lib/src/editor/video/widgets/youtube_video_app.dart +++ /dev/null @@ -1,185 +0,0 @@ -import 'package:flutter/gestures.dart' show TapGestureRecognizer; -import 'package:flutter/material.dart'; -import 'package:flutter_quill/flutter_quill.dart' show DefaultStyles; -import 'package:url_launcher/url_launcher_string.dart'; -import 'package:youtube_explode_dart/youtube_explode_dart.dart'; - -import '../models/youtube_video_support_mode.dart'; -import '../youtube_video_url.dart'; -import 'video_app.dart'; - -/// **Will be removed soon in future releases**. -@Deprecated( - 'Will be removed in future releases. See https://github.com/singerdmx/flutter-quill/issues/2284', -) -class YoutubeVideoApp extends StatefulWidget { - const YoutubeVideoApp({ - required this.videoUrl, - required this.readOnly, - required this.youtubeVideoSupportMode, - super.key, - }); - - final String videoUrl; - final bool readOnly; - final YoutubeVideoSupportMode youtubeVideoSupportMode; - - @override - YoutubeVideoAppState createState() => YoutubeVideoAppState(); -} - -// ignore: deprecated_member_use_from_same_package -class YoutubeVideoAppState extends State { - /// On some platforms such as desktop, Webview is not supported yet - /// as a result the youtube video player package is not supported too - /// this future will be not null and fetch the video url to load it using - /// [VideoApp] - Future? _loadYoutubeVideoByDownloadUrlFuture; - - /// Null if the video URL is not a YouTube video - String? get _videoId { - // ignore: deprecated_member_use_from_same_package - return convertVideoUrlToId(widget.videoUrl); - } - - @override - void initState() { - super.initState(); - final videoId = _videoId; - if (videoId == null) { - return; - } - switch (widget.youtubeVideoSupportMode) { - // ignore: deprecated_member_use_from_same_package - case YoutubeVideoSupportMode.disabled: - break; - // ignore: deprecated_member_use_from_same_package - case YoutubeVideoSupportMode.iframeView: - assert(() { - debugPrint( - 'Youtube Iframe is no longer supported on non-web platforms.\n' - 'See https://github.com/singerdmx/flutter-quill/issues/2284\n' - 'This message will only included in development mode.\n', - ); - return true; - }()); - break; - // ignore: deprecated_member_use_from_same_package - case YoutubeVideoSupportMode.customPlayerWithDownloadUrl: - _loadYoutubeVideoByDownloadUrlFuture = - _loadYoutubeVideoWithVideoPlayerByVideoUrl(); - break; - } - } - - Future _loadYoutubeVideoWithVideoPlayerByVideoUrl() async { - final youtubeExplode = YoutubeExplode(); - final manifest = - await youtubeExplode.videos.streamsClient.getManifest(_videoId); - final streamInfo = manifest.muxed.withHighestBitrate(); - final videoDownloadUri = streamInfo.url; - return videoDownloadUri.toString(); - } - - Widget _clickableVideoLinkText({required DefaultStyles defaultStyles}) { - return RichText( - text: TextSpan( - text: widget.videoUrl, - style: defaultStyles.link, - recognizer: TapGestureRecognizer() - ..onTap = () => launchUrlString(widget.videoUrl), - ), - ); - } - - @override - Widget build(BuildContext context) { - assert(() { - debugPrint( - "WARNING: It seems that you're using YoutubeVideoApp widget from flutter_quill_extensions " - 'which will be removed in future releases and will cause many issues.\n' - 'Use `customVideoBuilder` in the configuration class of `QuillEditorVideoEmbedConfigurations`.\n' - 'This message is only shown in development mode.\n' - 'Refer to https://github.com/singerdmx/flutter-quill/issues/2284 if you need help.', - ); - return true; - }()); - final defaultStyles = DefaultStyles.getInstance(context); - - switch (widget.youtubeVideoSupportMode) { - // ignore: deprecated_member_use_from_same_package - case YoutubeVideoSupportMode.disabled: - // Don't remove this assert, it's required to ensure - // a smoother migration for users, will be only included in development mode - assert(() { - debugPrint( - 'Loading Youtube Videos has been disabled in recent versions of flutter_quill_extensions.\n' - 'See https://github.com/singerdmx/flutter-quill/issues/2284.\n' - 'We highly suggest to use the experimental property `QuillEditorVideoEmbedConfigurations.customVideoBuilder`\n' - 'in your configuration to handle YouTube video support.\n' - 'This message will only included in development mode.\n', - ); - throw UnsupportedError( - 'Loading YouTube videos is no longer supported in flutter_quill_extensions.' - 'Take a look at the debug console for more details.\n' - 'Refer to https://github.com/singerdmx/flutter-quill/issues/2284 if you need help.\n' - 'This error will only happen in development mode, in production will return a clickable video link text.\n', - ); - }()); - return _clickableVideoLinkText(defaultStyles: defaultStyles); - // ignore: deprecated_member_use_from_same_package - case YoutubeVideoSupportMode.iframeView: - if (widget.readOnly) { - return _clickableVideoLinkText(defaultStyles: defaultStyles); - } - - return RichText( - text: TextSpan(text: widget.videoUrl, style: defaultStyles.link), - ); - // ignore: deprecated_member_use_from_same_package - case YoutubeVideoSupportMode.customPlayerWithDownloadUrl: - assert( - _loadYoutubeVideoByDownloadUrlFuture != null, - 'The load youtube video future should not null for "${widget.youtubeVideoSupportMode}" mode', - ); - assert(() { - debugPrint( - 'WARNING: Using the YouTube video download URL can violate their terms of service.\n' - 'This is already documented in customPlayerWithDownloadUrl option.\n' - 'See https://github.com/singerdmx/flutter-quill/issues/2284.\n' - 'We suggest to use the experimental property `QuillEditorVideoEmbedConfigurations.customVideoBuilder`\n' - 'in your configuration to handle YouTube video support.\n' - 'This message will only included in development mode.\n', - ); - debugPrint( - 'WARNING: Using customPlayerWithDownloadUrl might not work anymore ' - 'as YouTube servers can reject requests and respond with "Sign in to confirm you’re not a bot"\n' - 'See https://github.com/Hexer10/youtube_explode_dart/issues/282\n' - 'This message will only included in development mode.\n', - ); - throw UnsupportedError( - 'Loading YouTube videos is no longer supported in flutter_quill_extensions.' - 'Take a look at the debug console for more details.\n' - 'Refer to https://github.com/singerdmx/flutter-quill/issues/2284 if you need help.\n' - 'This error will only happen in development mode, in producation, YouTube servers will respond with "Sign in to confirm you’re not a bot".\n', - ); - }()); - - return FutureBuilder( - future: _loadYoutubeVideoByDownloadUrlFuture, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator.adaptive()); - } - if (snapshot.hasError) { - return _clickableVideoLinkText(defaultStyles: defaultStyles); - } - return VideoApp( - videoUrl: snapshot.requireData, - readOnly: widget.readOnly, - ); - }, - ); - } - } -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_controller_shared/clipboard/super_clipboard_service.dart b/flutter_quill_extensions/lib/src/editor_toolbar_controller_shared/clipboard/super_clipboard_service.dart deleted file mode 100644 index 51466ff61..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_controller_shared/clipboard/super_clipboard_service.dart +++ /dev/null @@ -1,144 +0,0 @@ -import 'dart:async' show Completer; -import 'dart:convert' show utf8; - -import 'package:flutter/foundation.dart'; -import 'package:flutter_quill/flutter_quill_internal.dart' - show ClipboardService; -import 'package:meta/meta.dart' show experimental; - -import 'package:super_clipboard/super_clipboard.dart'; - -/// Implementation using the https://pub.dev/packages/super_clipboard plugin. -@experimental -class SuperClipboardService extends ClipboardService { - /// [Null] if the Clipboard API is not supported on this platform - /// https://pub.dev/packages/super_clipboard#usage - SystemClipboard? _getSuperClipboard() { - return SystemClipboard.instance; - } - - SystemClipboard _getSuperClipboardOrThrow() { - final clipboard = _getSuperClipboard(); - if (clipboard == null) { - // To avoid getting this exception, use _canProvide() - throw UnsupportedError( - 'Clipboard API is not supported on this platform.', - ); - } - return clipboard; - } - - Future _canProvide({required DataFormat format}) async { - final clipboard = _getSuperClipboard(); - if (clipboard == null) { - return false; - } - final reader = await clipboard.read(); - return reader.canProvide(format); - } - - Future _provideFileAsBytes({ - required SimpleFileFormat format, - }) async { - final clipboard = _getSuperClipboardOrThrow(); - final reader = await clipboard.read(); - final completer = Completer(); - - reader.getFile( - format, - (file) async { - final bytes = await file.readAll(); - completer.complete(bytes); - }, - onError: completer.completeError, - ); - final bytes = await completer.future; - return bytes; - } - - Future _provideFileAsString({ - required SimpleFileFormat format, - }) async { - final fileBytes = await _provideFileAsBytes(format: format); - final fileText = utf8.decode(fileBytes); - return fileText; - } - - /// According to super_clipboard docs, will return `null` if the value - /// is not available or the data is virtual (macOS and Windows) - Future _provideSimpleValueFormatAsString({ - required SimpleValueFormat format, - }) async { - final clipboard = _getSuperClipboardOrThrow(); - final reader = await clipboard.read(); - final value = await reader.readValue(format); - return value; - } - - @override - Future getHtmlText() async { - if (!(await _canProvide(format: Formats.htmlText))) { - return null; - } - return _provideSimpleValueFormatAsString(format: Formats.htmlText); - } - - @override - Future getHtmlFile() async { - if (!(await _canProvide(format: Formats.htmlFile))) { - return null; - } - return await _provideFileAsString(format: Formats.htmlFile); - } - - @override - Future getGifFile() async { - if (!(await _canProvide(format: Formats.gif))) { - return null; - } - return await _provideFileAsBytes(format: Formats.gif); - } - - @override - Future getImageFile() async { - final canProvidePngFile = await _canProvide(format: Formats.png); - if (canProvidePngFile) { - return _provideFileAsBytes(format: Formats.png); - } - final canProvideJpegFile = await _canProvide(format: Formats.jpeg); - if (canProvideJpegFile) { - return _provideFileAsBytes(format: Formats.jpeg); - } - return null; - } - - @override - Future getMarkdownFile() async { - // Formats.md is for markdown files - if (!(await _canProvide(format: Formats.md))) { - return null; - } - return await _provideFileAsString(format: Formats.md); - } - - @override - Future copyImage(Uint8List imageBytes) async { - final clipboard = SystemClipboard.instance; - if (clipboard == null) { - return; - } - final item = DataWriterItem()..add(Formats.png(imageBytes)); - await clipboard.write([item]); - } - - @override - Future get hasClipboardContent async { - final clipboard = _getSuperClipboard(); - if (clipboard == null) { - return false; - } - final reader = await clipboard.read(); - final availablePlatformFormats = reader.platformFormats; - return availablePlatformFormats.isNotEmpty; - } -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/image_options.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/image_options.dart deleted file mode 100644 index acecbacf1..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/image_options.dart +++ /dev/null @@ -1,20 +0,0 @@ -/// Specifies the source where the picked image should come from. -enum ImageSource { - /// Opens up the device camera, letting the user to take a new picture. - camera, - - /// Opens the user's photo gallery. - gallery, -} - -enum CameraDevice { - /// Use the rear camera. - /// - /// In most of the cases, it is the default configuration. - rear, - - /// Use the front camera. - /// - /// Supported on all iPhones/iPads and some Android devices. - front, -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/image_picker.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/image_picker.dart deleted file mode 100644 index b79d816ab..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/image_picker.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:cross_file/cross_file.dart' show XFile; - -import 'image_options.dart'; - -export 'package:cross_file/cross_file.dart' show XFile; - -export 'image_options.dart'; - -abstract class ImagePickerInterface { - const ImagePickerInterface(); - Future pickImage({ - required ImageSource source, - double? maxWidth, - double? maxHeight, - int? imageQuality, - CameraDevice preferredCameraDevice = CameraDevice.rear, - bool requestFullMetadata = true, - }); - Future pickMedia({ - double? maxWidth, - double? maxHeight, - int? imageQuality, - bool requestFullMetadata = true, - }); - Future pickVideo({ - required ImageSource source, - CameraDevice preferredCameraDevice = CameraDevice.rear, - Duration? maxDuration, - }); -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/packages/image_picker.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/packages/image_picker.dart deleted file mode 100644 index e009648da..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/packages/image_picker.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:image_picker/image_picker.dart' as package - show ImagePicker, ImageSource, CameraDevice; - -import '../image_picker.dart'; - -class ImagePickerPackageImpl extends ImagePickerInterface { - const ImagePickerPackageImpl(); - package.ImagePicker get _picker { - return package.ImagePicker(); - } - - @override - Future pickImage({ - required ImageSource source, - double? maxWidth, - double? maxHeight, - int? imageQuality, - CameraDevice preferredCameraDevice = CameraDevice.rear, - bool requestFullMetadata = true, - }) { - return _picker.pickImage( - source: source.toImagePickerPackage(), - maxWidth: maxWidth, - maxHeight: maxHeight, - imageQuality: imageQuality, - preferredCameraDevice: preferredCameraDevice.toImagePickerPackage(), - requestFullMetadata: requestFullMetadata, - ); - } - - @override - Future pickMedia({ - double? maxWidth, - double? maxHeight, - int? imageQuality, - bool requestFullMetadata = true, - }) { - return _picker.pickMedia( - maxWidth: maxWidth, - maxHeight: maxHeight, - imageQuality: imageQuality, - requestFullMetadata: requestFullMetadata, - ); - } - - @override - Future pickVideo({ - required ImageSource source, - CameraDevice preferredCameraDevice = CameraDevice.rear, - Duration? maxDuration, - }) { - return _picker.pickVideo( - source: source.toImagePickerPackage(), - preferredCameraDevice: preferredCameraDevice.toImagePickerPackage(), - maxDuration: maxDuration, - ); - } -} - -extension ImageSoureceExt on ImageSource { - package.ImageSource toImagePickerPackage() { - switch (this) { - case ImageSource.camera: - return package.ImageSource.camera; - case ImageSource.gallery: - return package.ImageSource.gallery; - } - } -} - -extension CameraDeviceExt on CameraDevice { - package.CameraDevice toImagePickerPackage() { - switch (this) { - case CameraDevice.rear: - return package.CameraDevice.rear; - case CameraDevice.front: - return package.CameraDevice.front; - } - } -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/s_image_picker.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/s_image_picker.dart deleted file mode 100644 index 23d19e2e3..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_picker/s_image_picker.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'image_picker.dart'; -import 'packages/image_picker.dart'; - -/// A service used for packing images in the extensions package -class ImagePickerService extends ImagePickerInterface { - const ImagePickerService( - this._impl, - ); - - factory ImagePickerService.imagePickerPackage() => const ImagePickerService( - ImagePickerPackageImpl(), - ); - - factory ImagePickerService.defaultImpl() => - ImagePickerService.imagePickerPackage(); - - final ImagePickerInterface _impl; - @override - Future pickImage({ - required ImageSource source, - double? maxWidth, - double? maxHeight, - int? imageQuality, - CameraDevice preferredCameraDevice = CameraDevice.rear, - bool requestFullMetadata = true, - }) => - _impl.pickImage( - source: source, - maxWidth: maxWidth, - maxHeight: maxHeight, - imageQuality: imageQuality, - preferredCameraDevice: preferredCameraDevice, - requestFullMetadata: requestFullMetadata, - ); - - @override - Future pickMedia({ - double? maxWidth, - double? maxHeight, - int? imageQuality, - bool requestFullMetadata = true, - }) => - _impl.pickMedia( - maxWidth: maxWidth, - maxHeight: maxHeight, - imageQuality: imageQuality, - requestFullMetadata: requestFullMetadata, - ); - - @override - Future pickVideo({ - required ImageSource source, - CameraDevice preferredCameraDevice = CameraDevice.rear, - Duration? maxDuration, - }) => - _impl.pickVideo( - source: source, - preferredCameraDevice: preferredCameraDevice, - maxDuration: maxDuration, - ); -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/exceptions.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/exceptions.dart deleted file mode 100644 index 70933e10c..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/exceptions.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:meta/meta.dart' show immutable; - -enum ImageSaverExceptionType { - accessDenied, - notEnoughSpace, - notSupportedFormat, - unexpected, - unknown; -} - -@immutable -class ImageSaverException implements Exception { - const ImageSaverException({ - required this.message, - required this.type, - }); - - final String message; - final ImageSaverExceptionType type; - - @override - String toString() => 'Error while saving image, error type: ${type.name}'; -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/image_saver.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/image_saver.dart deleted file mode 100644 index 2417ae8c6..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/image_saver.dart +++ /dev/null @@ -1,7 +0,0 @@ -abstract class ImageSaverInterface { - const ImageSaverInterface(); - Future saveLocalImage(String imageUrl); - Future saveImageFromNetwork(Uri imageUrl); - Future hasAccess({required bool toAlbum}); - Future requestAccess({required bool toAlbum}); -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/packages/gal.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/packages/gal.dart deleted file mode 100644 index aec93ff44..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/packages/gal.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/widgets.dart' show NetworkImageLoadException; -import 'package:gal/gal.dart' show Gal, GalException, GalExceptionType; -import 'package:http/http.dart' as http; - -import '../exceptions.dart'; -import '../image_saver.dart'; - -class ImageSaverGalImpl extends ImageSaverInterface { - @override - Future saveImageFromNetwork(Uri imageUrl) async { - try { - final response = await http.get( - imageUrl, - ); - if (response.statusCode != 200) { - throw NetworkImageLoadException( - statusCode: response.statusCode, - uri: imageUrl, - ); - } - final imageBytes = response.bodyBytes; - await Gal.putImageBytes(imageBytes); - } on GalException catch (e) { - throw ImageSaverException( - message: e.toString(), - type: e.type.toImageSaverExceptionType(), - ); - } catch (e) { - throw ImageSaverException( - message: e.toString(), - type: ImageSaverExceptionType.unknown, - ); - } - } - - @override - Future saveLocalImage(String imageUrl) async { - try { - await Gal.putImage(imageUrl); - } on GalException catch (e) { - throw ImageSaverException( - message: e.toString(), - type: e.type.toImageSaverExceptionType(), - ); - } catch (e) { - throw ImageSaverException( - message: e.toString(), - type: ImageSaverExceptionType.unknown, - ); - } - } - - @override - Future hasAccess({required bool toAlbum}) { - return Gal.hasAccess(toAlbum: toAlbum); - } - - @override - Future requestAccess({required bool toAlbum}) { - return Gal.requestAccess(toAlbum: toAlbum); - } -} - -extension GalExceptionTypeExt on GalExceptionType { - ImageSaverExceptionType toImageSaverExceptionType() { - switch (this) { - case GalExceptionType.accessDenied: - return ImageSaverExceptionType.accessDenied; - case GalExceptionType.notEnoughSpace: - return ImageSaverExceptionType.notEnoughSpace; - case GalExceptionType.notSupportedFormat: - return ImageSaverExceptionType.notSupportedFormat; - case GalExceptionType.unexpected: - return ImageSaverExceptionType.unexpected; - } - } -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/s_image_saver.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/s_image_saver.dart deleted file mode 100644 index 35b9ee34e..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/image_saver/s_image_saver.dart +++ /dev/null @@ -1,31 +0,0 @@ -// ignore_for_file: public_member_api_docs, sort_constructors_first -import 'image_saver.dart'; -import 'packages/gal.dart' show ImageSaverGalImpl; - -/// A service used for saving images in the extensions package -class ImageSaverService extends ImageSaverInterface { - final ImageSaverInterface _impl; - const ImageSaverService(this._impl); - - factory ImageSaverService.galPackage() => ImageSaverService( - ImageSaverGalImpl(), - ); - - factory ImageSaverService.defaultImpl() => ImageSaverService.galPackage(); - - @override - Future hasAccess({bool toAlbum = false}) => - _impl.hasAccess(toAlbum: toAlbum); - - @override - Future requestAccess({bool toAlbum = false}) => - _impl.requestAccess(toAlbum: toAlbum); - - @override - Future saveImageFromNetwork(Uri imageUrl) => - _impl.saveImageFromNetwork(imageUrl); - - @override - Future saveLocalImage(String imageUrl) => - _impl.saveLocalImage(imageUrl); -} diff --git a/flutter_quill_extensions/lib/src/editor_toolbar_shared/shared_configurations.dart b/flutter_quill_extensions/lib/src/editor_toolbar_shared/shared_configurations.dart deleted file mode 100644 index 4c8fbe49f..000000000 --- a/flutter_quill_extensions/lib/src/editor_toolbar_shared/shared_configurations.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/widgets.dart' show BuildContext; -import 'package:flutter_quill/flutter_quill.dart'; -import 'package:meta/meta.dart' show immutable; - -import 'image_picker/s_image_picker.dart'; -import 'image_saver/s_image_saver.dart'; - -/// Configurations for Flutter Editor Extensions -/// shared between toolbar and editor -@immutable -class QuillSharedExtensionsConfigurations { - const QuillSharedExtensionsConfigurations({ - ImagePickerService? imagePickerService, - ImageSaverService? imageSaverService, - this.assetsPrefix = 'assets', - }) : _imagePickerService = imagePickerService, - _imageSaverService = imageSaverService; - - /// Get the instance from the widget tree in [QuillSharedConfigurations] - /// if it doesn't exists, we will create new one with default options - factory QuillSharedExtensionsConfigurations.get({ - required BuildContext context, - }) { - final value = context.quillSharedConfigurations?.extraConfigurations[key]; - if (value != null) { - if (value is! QuillSharedExtensionsConfigurations) { - throw ArgumentError( - 'The value of key `$key` should be of type ' - '$key', - ); - } - return value; - } - return const QuillSharedExtensionsConfigurations(); - } - - /// The key to be used in the `extraConfigurations` property - /// which can be found in the [QuillSharedConfigurations] - /// - /// which exists in the [QuillEditorConfigurations] - static const String key = 'QuillSharedExtensionsConfigurations'; - - /// Defaults to [ImagePickerService.defaultImpl] - final ImagePickerService? _imagePickerService; - - /// A getter method which returns the [ImagePickerService] that is provided - /// by the developer, if it can't be found then we will use default impl - ImagePickerService get imagePickerService { - return _imagePickerService ?? ImagePickerService.defaultImpl(); - } - - /// Default to [ImageSaverService.defaultImpl] - final ImageSaverService? _imageSaverService; - - /// A getter method which returns the [ImageSaverService] that is provided - /// by the developer, if it can't be found then we will use default impl - ImageSaverService get imageSaverService { - return _imageSaverService ?? ImageSaverService.defaultImpl(); - } - - /// The property [assetsPrefix] should be the start of your assets folder - /// by default it to `assets` and the reason why we need to know it - /// - /// Because in case when you don't define a value for [ImageProviderBuilder] - /// in the [QuillEditorImageEmbedConfigurations] which exists in - /// [FlutterQuillEmbeds.editorBuilders] - /// - /// then the only way of how to know if this is asset image that you added - /// in the `pubspec.yaml` is by asking you the assetsPrefix, how should the - /// start of your asset images usualy looks like?? in most projects it's - /// assets so we will go with that as a default - /// - /// but if you are using different name and you want to use assets images - /// in the [QuillEditor] then it's important to override this - /// - /// if you want a custom solution then please use [imageProviderBuilder] - final String assetsPrefix; -} diff --git a/flutter_quill_extensions/lib/src/flutter_quill_embeds.dart b/flutter_quill_extensions/lib/src/flutter_quill_embeds.dart index cfaa1b7d2..bd46aa762 100644 --- a/flutter_quill_extensions/lib/src/flutter_quill_embeds.dart +++ b/flutter_quill_extensions/lib/src/flutter_quill_embeds.dart @@ -1,148 +1,106 @@ import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter_quill/flutter_quill.dart' as fq; -import 'package:meta/meta.dart' show experimental, immutable; +import 'package:flutter_quill/flutter_quill.dart'; +import 'editor/image/config/image_config.dart'; import 'editor/image/image_embed.dart'; -import 'editor/image/models/image_configurations.dart'; -import 'editor/video/models/video_configurations.dart'; -import 'editor/video/models/video_web_configurations.dart'; +import 'editor/video/config/video_config.dart'; +import 'editor/video/config/video_web_config.dart'; import 'editor/video/video_embed.dart'; import 'editor/video/video_web_embed.dart'; import 'toolbar/camera/camera_button.dart'; -import 'toolbar/camera/models/camera_configurations.dart'; +import 'toolbar/camera/config/camera_config.dart'; +import 'toolbar/image/config/image_config.dart'; import 'toolbar/image/image_button.dart'; -import 'toolbar/image/models/image_configurations.dart'; -import 'toolbar/table/models/table_configurations.dart'; -import 'toolbar/video/models/video_configurations.dart'; +import 'toolbar/video/config/video_config.dart'; import 'toolbar/video/video_button.dart'; -@immutable -class FlutterQuillEmbeds { - const FlutterQuillEmbeds._(); - - /// Returns a list of embed builders for [fq.QuillEditor]. - /// - /// This method provides a collection of embed builders to enhance the - /// functionality - /// of a [fq.QuillEditor]. It offers customization options for - /// handling various types of - /// embedded content, such as images, videos, and formulas. - /// - /// The method returns a list of [fq.EmbedBuilder] objects that can be used with - /// QuillEditor - /// to enable embedded content features like images, videos, and formulas. +abstract final class FlutterQuillEmbeds { + /// Returns a list of embed builders for [QuillEditor] + /// to provide basic support for loading images and videos. /// - /// - /// final quillEditor = QuillEditor( - /// // Other editor configurations - /// embedBuilders: embedBuilders, - /// ); - /// ``` - /// - static List editorBuilders({ - QuillEditorImageEmbedConfigurations? imageEmbedConfigurations = - const QuillEditorImageEmbedConfigurations(), - QuillEditorVideoEmbedConfigurations? videoEmbedConfigurations = - const QuillEditorVideoEmbedConfigurations(), + static List editorBuilders({ + QuillEditorImageEmbedConfig? imageEmbedConfig = + const QuillEditorImageEmbedConfig(), + QuillEditorVideoEmbedConfig? videoEmbedConfig = + const QuillEditorVideoEmbedConfig(), }) { - if (kIsWeb) { - throw UnsupportedError( - 'The editorBuilders() is not for web, please use editorWebBuilders() ' - 'instead', - ); - } return [ - if (imageEmbedConfigurations != null) + if (imageEmbedConfig != null) QuillEditorImageEmbedBuilder( - configurations: imageEmbedConfigurations, + config: imageEmbedConfig, ), - if (videoEmbedConfigurations != null) + if (videoEmbedConfig != null) QuillEditorVideoEmbedBuilder( - configurations: videoEmbedConfigurations, + config: videoEmbedConfig, ), - // We disable the table feature is in experimental phase - // and it does not work as we expect - // https://github.com/singerdmx/flutter-quill/pull/2238#pullrequestreview-2312706901 - // QuillEditorTableEmbedBuilder(), ]; } - /// Returns a list of embed builders specifically designed for web support. - /// - /// [QuillEditorWebImageEmbedBuilder] is the embed builder for handling - /// images on the web. this will use tag of HTML + /// Returns a list of embed builders specifically designed for web support + /// to load images and videos. /// - /// [QuillEditorWebVideoEmbedBuilder] is the embed builder for handling - /// videos iframe on the web. this will use