Sync upstream/main (2026-05): 40 commits — IME stability, clipboard fixes, attributed_text perf, super_keyboard 0.4.0#13
Conversation
…e triggers at one time (Resolves Flutter-Bounty-Hunters#2911) (Flutter-Bounty-Hunters#2912)
…tter-Bounty-Hunters#2926)(Resolves Flutter-Bounty-Hunters#2927)(Resolves Flutter-Bounty-Hunters#2928)(Resolves Flutter-Bounty-Hunters#2929) (Flutter-Bounty-Hunters#2930) - Let apps override paste behavior on a per format basis (Resolves Flutter-Bounty-Hunters#2927) - Ignore <style> and <script> tags when parsing pasted HTML (Resolves Flutter-Bounty-Hunters#2928) - Use standard Super Editor paste parsing for plain text clipboard pasting (Resolves Flutter-Bounty-Hunters#2929) - Handle URL clipboard data type (Resolves Flutter-Bounty-Hunters#2926)
…rEditorIosControlsControllerWithNativePaste (Flutter-Bounty-Hunters#2933)
…to TextInputConnectionDecorator (Flutter-Bounty-Hunters#2950)
…SuperEditor is replaced by another SuperEditor for the same role (Resolves Flutter-Bounty-Hunters#2962) (Flutter-Bounty-Hunters#2963)
…3.38.0 (turns out we don't need it)
…ne SuperEditor instance to a replacement SuperEditor instance (Resolve Flutter-Bounty-Hunters#2965) (Flutter-Bounty-Hunters#2967)
… at start of text, cause is not clearing composing region (Resolves Flutter-Bounty-Hunters#2970) (Flutter-Bounty-Hunters#2971)
…perEditor (Resolves Flutter-Bounty-Hunters#2969) (Flutter-Bounty-Hunters#2973) Co-authored-by: Piotr Moskała <[email protected]>
…ft SwiftKey keyboard (Resolves Flutter-Bounty-Hunters#2975) (Flutter-Bounty-Hunters#2976)
… sends deltas after newline key, fix GBoard removes trailing space in empty paragraph when inserting newline (Resolves Flutter-Bounty-Hunters#2979)(Resolves Flutter-Bounty-Hunters#2981) (Flutter-Bounty-Hunters#2982) * Also introduces `SuperEditorLog` to explicitly report important errors and exceptions.
…efore existing text (Resolves Flutter-Bounty-Hunters#2984) (Flutter-Bounty-Hunters#2985)
…rable for when to continue existing list (Resolves Flutter-Bounty-Hunters#2987) (Flutter-Bounty-Hunters#2988)
…er non-software keyboard situations (Resolves Flutter-Bounty-Hunters#2994) (Flutter-Bounty-Hunters#2996)
…ext v0.4.6, also export BlinkController and BlinkTimingMode from super_text_layout (Flutter-Bounty-Hunters#3011)
Range merged: 068a20d..13e7538 (Feb 16 -- May 7, 2026). Version bumps adopted from upstream: super_editor 0.3.0-dev.48 -> 0.3.0-dev.51 super_editor_clipboard 0.2.5 -> 0.2.10 super_text_layout 0.1.19 -> 0.1.20 super_keyboard 0.3.1 -> 0.4.0 attributed_text 0.4.5 -> 0.4.7 Highlights gained from upstream: - 5 IME stability fixes (Samsung/SwiftKey/GBoard, including the zombie IME client bug when one SuperEditor replaces another). - Clipboard paste fixes (Flutter-Bounty-Hunters#2919, Flutter-Bounty-Hunters#2926-Flutter-Bounty-Hunters#2929, Flutter-Bounty-Hunters#2933, Flutter-Bounty-Hunters#2935): native paste, per-format custom pasting from iOS, Markdown paste, ignore <script>/<style>. - Editor UX: multi-trigger tags, auto-convert list items mid-paragraph (Flutter-Bounty-Hunters#2984), configurable list continuation (Flutter-Bounty-Hunters#2987), popover toolbars on tablets / non-software-keyboard situations (Flutter-Bounty-Hunters#2994). - iOS: backspacing empty text nodes (Flutter-Bounty-Hunters#2989). - Flutter SDK adapt: TextInputConnectionDecorator.updateStyle (Flutter-Bounty-Hunters#2950). - SuperText now supports maxLines + overflow indicator (Flutter-Bounty-Hunters#2922). - attributed_text: rewrote getAttributionSpansInRange for performance (Flutter-Bounty-Hunters#3010), then a regression fix for SuperEditor pattern tags (Flutter-Bounty-Hunters#3013). - super_editor_markdown / super_editor_quill packages deleted upstream (consolidated into super_editor core in dev.40/dev.41); we removed the orphaned directories as part of this merge. Conflict resolutions (5 real conflicts): - super_editor/lib/src/default_editor/text.dart -- preserved fork PR #1 (no IgnorePointer wrapper in TextComponent.build) while adopting upstream's new SuperText maxLines/overflow props and migrating hintText to computeInlineSpan(...). Inline comment added to make the divergence intentional and discoverable. - super_editor/lib/src/default_editor/default_document_editor_reactions.dart -- accepted upstream's two-pattern (empty / non-empty paragraph) list-item conversion logic from Flutter-Bounty-Hunters#2984 (strict improvement over our single-pattern + deprecated_member_use ignore). - super_editor/lib/src/default_editor/document_ime/document_delta_editing.dart -- removed duplicate document_serialization.dart import. - super_editor/pubspec.yaml -- adopted upstream super_text_layout ^0.1.20 and super_keyboard ^0.4.0 dep bumps. - super_editor/example/pubspec.yaml -- kept fork's monorepo-friendly path: deps (instead of upstream's git: URL form), bumped super_keyboard to ^0.4.0 and follow_the_leader to ^0.5.3. Modify/delete conflicts (35+ files): accepted upstream deletions of super_editor_markdown/** and super_editor_quill/**, and kept fork's policy of not tracking */example/pubspec.lock files. All 5 fork-only customizations verified intact post-merge: PR #1 -- no IgnorePointer in TextComponent (text.dart) PR #3 -- ContentTapExclusion in SuperReader gesture pipeline PR #4 -- scrollingEnabled flag on document widgets PR #5 -- displayLatexAttribution in attributions.dart PR #6 -- ImageComponent custom imageBuilder + altText + pointer events Note on resolution: workspace: per the runtime_ci pre-commit hook policy, resolution: workspace lines are intentionally stripped before commit (committed pubspecs must remain publishable to pub.dev). Workspace-mode adds remain as local working-tree edits in dev. FORK_CHANGES.md rewritten: - Replaced stale "~0 commits behind" claim with verifiable drift command. - Added 2026-05-09 sync entry documenting range, version bumps, and every conflict resolution. - Documented each fork PR's location so future syncs can grep + verify.
There was a problem hiding this comment.
Pull request overview
Upstream sync that merges ~3 months of changes from upstream/main into this fork, adopting upstream fixes and API updates (IME stability, clipboard paste improvements, tag-trigger enhancements, chat tooling, and SuperText max-lines/overflow support) while preserving existing fork-only customizations.
Changes:
- Adopt upstream package/version bumps and related API migrations (
super_keyboard 0.4.0,super_text_layout 0.1.20,attributed_text 0.4.7, etc.). - Integrate upstream IME ownership/connection fixes and new logging hooks for IME/document delta behavior.
- Expand editor/chat functionality and tests (preview-mode plugin for chat, toolbar/gesture behavior updates, list-item conversion updates, multi-trigger tag rules).
Reviewed changes
Copilot reviewed 128 out of 130 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| super_text_layout/test_goldens/super_text_test.dart | Adds golden coverage for SuperText.maxLines + overflow. |
| super_text_layout/pubspec.yaml | Bumps version and switches golden_runner dependency to ^0.2.0. |
| super_text_layout/lib/src/super_text.dart | Plumbs maxLines and overflow into SuperText rendering. |
| super_text_layout/example/pubspec.yaml | Minor formatting-only change. |
| super_text_layout/CHANGELOG.md | Documents 0.1.20 feature (maxLines/overflow). |
| super_keyboard/test/keyboard_simulation_test.dart | Migrates off removed tester: parameter for keyboard simulator. |
| super_keyboard/test_goldens/software_keyboard_tools_test.dart | Migrates off removed tester: parameter for keyboard simulator. |
| super_keyboard/pubspec.yaml | Bumps super_keyboard to 0.4.0. |
| super_keyboard/lib/test/keyboard_simulator.dart | Updates simulator API to use TickerProvider/binary messenger binding instead of WidgetTester. |
| super_keyboard/example/pubspec.yaml | Minor formatting-only change. |
| super_keyboard/CHANGELOG.md | Documents breaking change for simulator API in 0.4.0. |
| super_editor/test/super_editor/text_entry/tagging/stable_tags_test.dart | Updates tests for non-const/multi-trigger TagRule API. |
| super_editor/test/super_editor/text_entry/tagging/action_tags_test.dart | Updates tests for non-const/multi-trigger TagRule API. |
| super_editor/test/super_editor/text_entry/super_editor_list_item_conversion_test.dart | Adds tests for list-item prefix conversion in empty/non-empty paragraphs. |
| super_editor/test/super_editor/super_editor_ime_ownership_test.dart | Adds regression test for IME ownership behavior across editor replacement (same role). |
| super_editor/test/super_editor/mobile/super_editor_ios_overlay_controls_test.dart | Expands iOS overlay toolbar tests (software vs hardware keyboard scenarios). |
| super_editor/test/super_editor/mobile/super_editor_android_overlay_controls_test.dart | Expands Android overlay toolbar tests (software vs hardware keyboard scenarios). |
| super_editor/test/chat/super_message/super_message_toolbar_test.dart | Adds tests for SuperMessage toolbar dismissal/select-all behavior. |
| super_editor/test/chat/super_message/super_message_gestures_test.dart | Adds tests for link-tap URL launching in SuperMessage. |
| super_editor/pubspec.yaml | Bumps super_editor version and dependency versions (attributed_text, super_text_layout, super_keyboard, etc.). |
| super_editor/lib/super_text_field.dart | Re-exports blink controller APIs from super_text_layout. |
| super_editor/lib/super_editor.dart | Re-exports blink controller APIs and exports chat preview plugin. |
| super_editor/lib/src/test/super_editor_test/supereditor_test_tools.dart | Updates test scaffolding helpers for keyboard simulator API + adds list test docs. |
| super_editor/lib/src/test/super_editor_test/supereditor_inspector.dart | Adds nullable “maybe find widget” inspector helper. |
| super_editor/lib/src/test/flutter_extensions/test_documents.dart | Adds ordered-list test documents. |
| super_editor/lib/src/default_editor/text.dart | Adds maxLines/overflow plumbing and hint-text span computation changes; preserves fork PR #1 divergence (no IgnorePointer). |
| super_editor/lib/src/default_editor/text_tokenizing/tags.dart | Updates tag detection to support multiple triggers via new TagRule API. |
| super_editor/lib/src/default_editor/text_tokenizing/stable_tags.dart | Updates stable tags for multi-trigger support and composing-tag metadata (trigger). |
| super_editor/lib/src/default_editor/text_tokenizing/pattern_tags.dart | Updates pattern tags for multi-trigger support and adds extra logging. |
| super_editor/lib/src/default_editor/text_tokenizing/action_tags.dart | Updates action tags for multi-trigger support and makes composing tag editable/listenable. |
| super_editor/lib/src/default_editor/tasks.dart | Plumbs maxLines/overflow through task component view model. |
| super_editor/lib/src/default_editor/super_editor.dart | Adds focus-change hook for plugins and introduces editor logging plumbing. |
| super_editor/lib/src/default_editor/paragraph.dart | Plumbs maxLines/overflow through paragraph/hint view models. |
| super_editor/lib/src/default_editor/multi_node_editing.dart | Clears composing region after paste/selection changes; adds ReplaceDocument request/command. |
| super_editor/lib/src/default_editor/list_items.dart | Plumbs maxLines/overflow through list item view models/components and fixes copy semantics. |
| super_editor/lib/src/default_editor/document_ime/supereditor_ime_interactor.dart | Adds IME override client-safety checks and “zombie client” mitigation logic. |
| super_editor/lib/src/default_editor/document_ime/shared_ime.dart | Enhances IME ownership/connection tracking and introduces structured logging callbacks. |
| super_editor/lib/src/default_editor/document_ime/ime_decoration.dart | Adds updateStyle delegation for Flutter API forward-compat. |
| super_editor/lib/src/default_editor/document_ime/document_serialization.dart | Replaces generic exceptions with richer mapping exceptions for IME/document position failures. |
| super_editor/lib/src/default_editor/document_ime/document_ime_interaction_policies.dart | Adjusts IME-open logic when taking ownership and avoids interfering across same-role replacement. |
| super_editor/lib/src/default_editor/document_gestures_touch_ios.dart | Uses isImeConnected signal to govern toolbar behavior and hides controls on focus/IME changes. |
| super_editor/lib/src/default_editor/document_gestures_touch_android.dart | Uses isImeConnected signal to govern toolbar behavior and overlay manager interactions. |
| super_editor/lib/src/default_editor/default_document_editor_reactions.dart | Updates list-item prefix conversion logic (empty vs non-empty paragraph, ordered continuation strategy). |
| super_editor/lib/src/default_editor/common_editor_operations.dart | Clears composing region after upstream deletion commands (IME stability). |
| super_editor/lib/src/default_editor/blockquote.dart | Plumbs maxLines/overflow through blockquote component view model/component. |
| super_editor/lib/src/core/styles.dart | Adds style keys for maxLines and overflow. |
| super_editor/lib/src/chat/super_message.dart | Updates SuperMessage tap-delegate API to support multiple handlers; adds default AI message editor builder. |
| super_editor/lib/src/chat/super_message_mouse_interactor.dart | Updates tap handling to run multiple delegates and compute cursor based on first matching handler. |
| super_editor/lib/src/chat/super_message_ios_touch_interactor.dart | Updates tap handling to run multiple delegates. |
| super_editor/lib/src/chat/super_message_ios_overlays.dart | Dismisses iOS SuperMessage toolbar after copy action. |
| super_editor/lib/src/chat/super_message_android_touch_interactor.dart | Normalizes contentTapHandlers default/typing and runs multiple delegates. |
| super_editor/lib/src/chat/super_message_android_overlays.dart | Dismisses Android SuperMessage toolbar after copy action. |
| super_editor/lib/src/chat/plugins/chat_preview_mode_plugin.dart | New plugin to render a 1-line ellipsized “preview mode” when unfocused (chat use-case). |
| super_editor/example/pubspec.yaml | Updates example deps to super_keyboard ^0.4.0 and follow_the_leader ^0.5.3. |
| super_editor/example_perf/pubspec.yaml | Minor formatting-only change. |
| super_editor/example_chat/pubspec.yaml | Updates example dep to super_keyboard ^0.4.0. |
| super_editor/example_chat/lib/message_page_scaffold_demo/demo_super_editor_message_page.dart | Wires ChatPreviewModePlugin into the chat editor example. |
| super_editor/CHANGELOG.md | Adds entries for dev.49–dev.51 (tags multi-trigger, toolbar dismissal, super_keyboard bump). |
| super_editor_spellcheck/pubspec.yaml | Minor formatting-only change. |
| super_editor_spellcheck/example/pubspec.yaml | Minor formatting-only change. |
| super_editor_quill/test/test_documents.dart | Removed (deprecated package deletion). |
| super_editor_quill/test/parsing/multiline_parsing_test.dart | Removed (deprecated package deletion). |
| super_editor_quill/test/attributed_text.dart | Removed (deprecated package deletion). |
| super_editor_quill/README.md | Removed (deprecated package deletion). |
| super_editor_quill/pubspec.yaml | Removed (deprecated package deletion). |
| super_editor_quill/LICENSE | Removed (deprecated package deletion). |
| super_editor_quill/lib/super_editor_quill.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/super_editor_quill_test.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/testing/quill_delta_comparison.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/serializing/serializing.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/serializing/serializers.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/parsing/parser.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/parsing/inline_formats.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/parsing/block_formats.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/content/multimedia.dart | Removed (deprecated package deletion). |
| super_editor_quill/lib/src/content/formatting.dart | Removed (deprecated package deletion). |
| super_editor_quill/CHANGELOG.md | Removed (deprecated package deletion). |
| super_editor_quill/analysis_options.yaml | Removed (deprecated package deletion). |
| super_editor_quill/.metadata | Removed (deprecated package deletion). |
| super_editor_quill/.gitignore | Removed (deprecated package deletion). |
| super_editor_markdown/test/test_tools.dart | Removed (deprecated package deletion). |
| super_editor_markdown/test/flutter_test_config.dart | Removed (deprecated package deletion). |
| super_editor_markdown/test/custom_parsers/upsell_block.dart | Removed (deprecated package deletion). |
| super_editor_markdown/test/custom_parsers/callout_block.dart | Removed (deprecated package deletion). |
| super_editor_markdown/test/custom_block_serializer_test.dart | Removed (deprecated package deletion). |
| super_editor_markdown/test/custom_block_parser_test.dart | Removed (deprecated package deletion). |
| super_editor_markdown/test/attributed_text_markdown_test.dart | Removed (deprecated package deletion). |
| super_editor_markdown/README.md | Removed (deprecated package deletion). |
| super_editor_markdown/pubspec.yaml | Removed (deprecated package deletion). |
| super_editor_markdown/LICENSE | Removed (deprecated package deletion). |
| super_editor_markdown/lib/super_editor_markdown.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/table.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/super_editor_syntax.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/super_editor_paste_markdown.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/markdown_to_document_parsing.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/markdown_to_attributed_text_parsing.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/markdown_inline_upstream_plugin.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/markdown_inline_parser.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/image_syntax.dart | Removed (deprecated package deletion). |
| super_editor_markdown/lib/src/document_to_markdown_serializer.dart | Removed (deprecated package deletion). |
| super_editor_markdown/CHANGELOG.md | Removed (deprecated package deletion). |
| super_editor_markdown/analysis_options.yaml | Removed (deprecated package deletion). |
| super_editor_markdown/.gitignore | Removed (deprecated package deletion). |
| super_editor_clipboard/test/ios_native_paste_test.dart | Updates TestSuperKeyboard.install(...) invocation for new API. |
| super_editor_clipboard/pubspec.yaml | Bumps version/deps and adds super_native_extensions dev dependency. |
| super_editor_clipboard/lib/src/super_editor_paste.dart | Expands native paste pipeline (custom inserters per format, URL/Markdown support, ignored HTML tags, improved selection handling). |
| super_editor_clipboard/lib/src/editor_paste.dart | Improves HTML→Markdown conversion options and adds explicit pasteMarkdown. |
| super_editor_clipboard/example/pubspec.yaml | Minor formatting-only change. |
| super_editor_clipboard/CHANGELOG.md | Documents paste improvements through 0.2.10. |
| super_clones/quill/pubspec.yaml | Pins super_text_layout to ^0.1.20. |
| super_clones/quill/lib/editor/code_component.dart | Minor formatting and maxLines/overflow plumbing for code component. |
| golden_runner/pubspec.yaml | Minor formatting-only change. |
| FORK_CHANGES.md | Updates fork drift/sync documentation and adds detailed 2026-05 sync notes. |
| attributed_text/test/attributed_text_test.dart | Updates expectation collection type for span queries (ordering-insensitive). |
| attributed_text/pubspec.yaml | Bumps attributed_text to 0.4.7. |
| attributed_text/lib/src/attributed_spans.dart | Reworks attribution span queries for performance. |
| attributed_text/CHANGELOG.md | Documents 0.4.6 perf improvement + 0.4.7 regression fix. |
| .github/workflows/pr_validation.yaml | Removes CI jobs for deleted packages (super_editor_markdown, super_editor_quill). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| /// Same as [findWidgetForComponent], except this method returns `null` when no such | ||
| /// component is found. | ||
| static WidgetType? maybeFindWidgetForComponent<WidgetType>(String nodeId, [Finder? superEditorFinder]) { | ||
| final documentLayout = findDocumentLayout(superEditorFinder); | ||
| final widget = (documentLayout.getComponentByNodeId(nodeId) as State?)?.widget; | ||
| if (widget != null && widget is! WidgetType) { | ||
| throw Exception("Looking for a component's widget. Expected type $WidgetType, but found ${widget.runtimeType}"); | ||
| } | ||
|
|
||
| return widget as WidgetType; | ||
| } |
| /// The [previousOwner] explicitly requested to give up ownership. | ||
| void onOwnershipReleased( | ||
| SuperImeInputId previousOwner, { | ||
| required bool willCloseConnection, | ||
| }) { | ||
| superImeLog.info("Releasing IME ownership from: '$previousOwner'"); | ||
| superImeLog.info(" - SuperIme will close the connection after releasing ownership"); | ||
| } |
| /// We track this so that we know when the client changes, which requires us to | ||
| /// close the current connection and open a new connection. This is because Flutter | ||
| /// registers the IME client when the connection is opened, and it cannot be change | ||
| /// or replaced after that. | ||
| TextInputClient? _attachedClient; |
| /// A log that reports specific errors and exceptional events that occur while | ||
| /// running a [SuperEditor]. | ||
| /// | ||
| /// This log was introduced to create a place to report errors to apps that those | ||
| /// apps might want to send to their own issue tracker to gain visibility into why | ||
| /// issues are happening in their editor. | ||
| final SuperEditorPrintLog? log; | ||
|
|
| DocumentSelection? addedRange; | ||
| if (cancelledText.contains(_tagRule.trigger)) { | ||
| // This cancelled range includes more than just a trigger. Reduce it back | ||
| // down to the trigger. | ||
| final triggerIndex = cancelledText.indexOf(_tagRule.trigger); | ||
| addedRange = node.selectionBetween(triggerIndex, triggerIndex); | ||
| for (final trigger in _tagRule.triggers) { | ||
| if (cancelledText.contains(trigger)) { | ||
| // This cancelled range includes more than just a trigger. Reduce it back | ||
| // down to the trigger. | ||
| final triggerIndex = cancelledText.indexOf(trigger); | ||
| addedRange = node.selectionBetween(triggerIndex, triggerIndex); | ||
| } |
| DocumentSelection? addedRange; | ||
| if (cancelledText.contains(_tagRule.trigger)) { | ||
| // This cancelled range includes more than just a trigger. Reduce it back | ||
| // down to the trigger. | ||
| final triggerIndex = cancelledText.indexOf(_tagRule.trigger); | ||
| addedRange = node.selectionBetween(triggerIndex, triggerIndex); | ||
| for (final trigger in _tagRule.triggers) { | ||
| if (cancelledText.contains(trigger)) { | ||
| // This cancelled range includes more than just a trigger. Reduce it back | ||
| // down to the trigger. | ||
| final triggerIndex = cancelledText.indexOf(trigger); | ||
| addedRange = node.selectionBetween(triggerIndex, triggerIndex); | ||
| } | ||
| } |
…lutter 3.35-3.40 compat) Upstream commit b422c32 (PR Flutter-Bounty-Hunters#2950, Feb 2026) added: @OverRide void updateStyle(TextInputStyle style) => client?.updateStyle(style); to TextInputConnectionDecorator in anticipation of Flutter's "Deprecate TextInputConnection.setStyle" breaking change (flutter/flutter#180436), which adds TextInputConnection.updateStyle( TextInputStyle) and deprecates setStyle(...). Per docs.flutter.dev/release/breaking-changes/deprecate-text-input- connection-set-style (last updated 2026-03-03), the change is "Landed in version: TBD / In stable release: Not yet." Our pinned Flutter is 3.35.7 (`flutter --version`): - flutter-sdk-3.35.5/packages/flutter/lib/src/services/text_input.dart declares only `void setStyle({...})`. There is no `class TextInputStyle` and no `void updateStyle(...)` on TextInputConnection. - TextInputConnectionDecorator implements TextInputConnection, so the override fails to compile: "TextInputStyle isn't a type" + "method updateStyle isn't defined for the type TextInputConnection". There is no Dart conditional-imports trick that can selectively include an interface override based on host SDK version (conditional imports switch libraries, not class members). Fix: drop the override and replace it with a comment block that: - Explains the upstream origin (PR Flutter-Bounty-Hunters#2950, commits 4703643 / b422c32). - Cites the Flutter breaking-change doc. - Documents restore criteria (when Flutter ships TextInputStyle in stable AND we upgrade past that release). This is a no-op functionally on stable Flutter: setStyle(...) above already covers the entire surviving public API; the framework can't call a method that doesn't exist on the parent class. Tracked as fork divergence #6 in FORK_CHANGES.md, marked as TEMPORARY. Will be re-asserted on each upstream sync until either upstream gates this on a Flutter version constraint or we upgrade past the TextInputStyle-shipping stable release. Refs: #13 (parent merge PR)
Update: layered Flutter 3.35-3.40 compat patch on top of the mergePushed an additional commit ( What changedDrop upstream's 3-line Why this is needed
Why we can't migrate to
|
Fork Divergence Audit + Flutter 3.35-3.40 Compat InvestigationThis is a deeper audit done after the merge + compat patch landed. Two parts:
Part 1 — Fork Divergence AuditHeadline Verdict
Bottom line: all 5 are still load-bearing on desktop. Nothing to delete. #3 and #4 are upstream-contribution candidates that would shrink the permanent fork delta from 5 → 3. PR #1 — No
|
| Flutter channel | setStyle |
updateStyle(TextInputStyle) |
super_editor 0.3.0-dev.51 builds? |
|---|---|---|---|
| stable 3.35.x (our pin: 3.35.7) | ✅ exists | ❌ doesn't exist | ❌ NO — TextInputStyle undefined |
| stable 3.41.x (per docs, may have landed) | ✅ deprecated, still works | ✅ exists | ✅ likely yes |
| master / future 3.4x+ | ❌ being removed | ✅ exists | ✅ yes |
Upstream's b422c326 was authored 24 hours after the Flutter master breaking change landed, before stable Flutter caught up. As a result, super_editor 0.3.0-dev.51 has been broken on stable Flutter for ~3 months.
Would unset-pub-resolution route around it?
No. I read automations/pub_resolution.dart (1194 lines). It:
- Adds/removes
resolution: workspacefrom workspace member pubspecs. - On
unset, injects standalonedependency_overridesfortest,test_api,web_socket_channel,analyzer,dart_style,freezed_annotation,material_symbols_icons— none of which point at super_editor. - Strips/restores
dependency_overridesde-duplication andbuild.yamlenvied-path blocks.
It does not switch the source of super_editor from local-path to a git tag. The same physical files in frontend/super_editor/super_editor/ get used either way. Hypothesis disproved.
Resolution: 3-line forward-compat patch (commit 73e427c7)
Drop upstream's 3-line override and replace with a documented comment block that records:
- Upstream commit SHA (
b422c326) - Originating Flutter PR (
flutter/flutter#180436) - Link to the breaking-change doc
- Three restore criteria (Flutter stable ships the API → our pin moves past that release → revert)
Why we can't migrate forward instead
TextInputConnectionDecorator implements TextInputConnection. In Flutter 3.35.7:
TextInputConnectionhas noupdateStyleto override.TextInputStyleis not a defined type.- Dart conditional imports switch entire libraries but cannot synthesize class members based on host SDK version — there's no escape hatch for an interface override that selectively exists.
Why dropping the override is a no-op functionally
setStyle(...) immediately above is still in the framework and still in the parent interface — covers the entire surviving public API on stable Flutter. The framework can't call a method that doesn't exist on the parent.
Tracked
Added as fork divergence #6 in FORK_CHANGES.md, marked TEMPORARY. The Pre-Merge Checklist now flags ime_decoration.dart so future syncs catch upstream re-introducing the override on each merge.
Combined Summary
What the fork delta looks like after this PR + compat patch
| # | Divergence | Type | Permanence |
|---|---|---|---|
| 1 | No IgnorePointer in TextComponent |
Behavioral | Permanent (upstream unlikely to accept) |
| 3 | ContentTapExclusion + helper |
API + behavior | Could shrink to 0 if upstream merges contribution |
| 4 | scrollingEnabled flag |
API (additive) | Could shrink to 0 if upstream merges contribution |
| 5 | displayLatexAttribution |
2-line constant | Permanent, zero-maintenance |
| 6 | ImageComponent imageBuilder named-param + no IgnorePointer |
API + behavior | API could shrink; behavior likely permanent |
| 7 (new, this PR) | Drop updateStyle(TextInputStyle) override |
Temporary compat | Reverts when Flutter pin moves past TextInputStyle-shipping stable |
Permanent fork delta if all upstream contributions land: 1.5 PRs (#1 + behavioral half of #6).
Permanent fork delta if no upstream contributions land: 5 PRs.
Temporary on top: the updateStyle compat patch, until Flutter upgrade.
Combined recommended next steps
- Land this PR (already includes both the merge and the compat patch).
- File 4 upstream PRs in priority order:
displayLatexAttribution→scrollingEnabled→ContentTapExclusion→imageBuildernamed-param signature. - File 1 upstream issue for pointer-passthrough opt-in (
TextComponent+ImageComponent). - Add integration test in
pieces_flutter_client_sdkfor theListener.onPointerDowncontract onPiecesMarkdownReader, so an accidental future revert of PR feat: remove ignore pointer so gesture detection works #1'sIgnorePointerremoval is caught at PR time. - When Flutter pin upgrades past
TextInputStyle-shipping stable: revert the compat patch (commit73e427c7).
This is the complete fork hygiene picture as of the 2026-05 sync.
Summary
Three-month upstream sync. Closes the 40-commit gap that had built up since the 2026-02-07 merge (
de4068f4), bringing the fork to upstream HEAD13e7538a.Drift before this PR: 40 commits behind
upstream/main, 33 commits ahead.Drift after this PR: 0 commits behind, 34 commits ahead (33 fork-only + 1 merge commit).
This is a sync-only PR: it does not introduce any new fork-only customizations. All 5 existing fork features (image component, displayLatex attribution, scrollingEnabled flag, ContentTapExclusion, no-IgnorePointer in TextComponent) are verified intact post-merge.
Version Bumps Adopted from Upstream
super_editor0.3.0-dev.480.3.0-dev.51super_editor_clipboard0.2.50.2.10super_text_layout0.1.190.1.20super_keyboard0.3.10.4.0attributed_text0.4.50.4.7Consumers in
unified_monorepo(pieces-app/super_editorworkspace members) get these via the localpath:resolution; downstream repos pinning by tag (e.g. viatag_pattern: v{{version}}) will need their pins bumped after this lands.Upstream Enhancements (by theme)
IME stability — five separate fixes
These five matter because Pieces Copilot uses
SuperEditorheavily across mobile, and the zombie-IME bug in particular has been a recurring source of "keyboard typing into the wrong editor" reports.Clipboard fixes — five releases
super_clipboardAPI →super_editor_clipboard 0.2.60.2.7SuperEditorIosControlsControllerWithNativePaste→0.2.8(potentially relevant for Copilot's iOS paste flow)<script>and<style>HTML tags →0.2.9Editor UX
SuperTextaddsmaxLines+ overflow indicator support;TextComponentplumbs them through._*InEmptyParagraph/_*InNonEmptyParagraph).OrderedListItemConversionReactionnow takes a configurableOrderedListContinuationStrategy.Chat editor
super_editor/lib/src/chat/plugins/chat_preview_mode_plugin.dartis new).Flutter SDK forward-compat
TextInputConnectionDecorator.updateStyleadded — fixes a Flutter breaking change. Required to compile against the next Flutter SDK bump.attributed_textperformancegetAttributionSpansInRangefor major performance improvement →attributed_text 0.4.6.0.4.7.super_editorupgraded toattributed_text 0.4.6; also exportsBlinkControllerandBlinkTimingModefromsuper_text_layout.super_keyboard 0.4.0(minor bump)WidgetTesterin its API. Mildly breaking for tests that constructedKeyboardSimulatorwith atesterargument — they need to drop it.Package consolidation cleanup
super_editor_markdownandsuper_editor_quillpackages (both consolidated intosuper_editorcore in0.3.0-dev.40/0.3.0-dev.41last fall). We removed our orphaned directories as part of this merge.API Changes Consumers Should Know About
New / changed APIs
SuperText:maxLinesandoverflowconstructor args (defaulting to existing behavior — purely additive).TextComponent:maxLinesandoverflowprops now plumbed through toSuperText.TextInputConnectionDecorator.updateStyle(new — required by Flutter).BlinkControllerandBlinkTimingModeare now re-exported fromsuper_text_layoutpackage.chat_preview_mode_plugin.dart(new file):ChatPreviewModePluginforSuperMessage.OrderedListContinuationStrategy(new): plug-in forOrderedListItemConversionReaction.KeyboardSimulator(super_keyboard 0.4.0): API no longer takes aWidgetTester.Behavioral changes
*/-/1.prefix is typed in front of existing paragraph text, not just at the start of an empty paragraph ([Super Editor][Feature] - List items: support auto-conversion when adding prefix to existing paragraph Flutter-Bounty-Hunters/super_editor#2984). Configurable viaallowConversionOfNonEmptyParagraphs(default:true). If you were relying on the old empty-only behavior, set this tofalse.composingRegiondirectly.Removed
super_editor_markdownandsuper_editor_quillno longer exist as separate publishable units. (Their code lives insidesuper_editorcore now and has since0.3.0-dev.40/0.3.0-dev.41.) Any pubspec or Dart import still pointing at them needs to migrate tosuper_editor.Conflict Resolutions
Five real content conflicts; rest were upstream-deletes-our-modify in
super_editor_markdown/**andsuper_editor_quill/**(we accepted the deletions).super_editor/lib/src/default_editor/text.dartIgnorePointerwrapper aroundSuperTextinTextComponent.build) while adopting upstream's newmaxLines/overflowSuperTextprops and migratinghintTexttocomputeInlineSpan(...). Inline comment added so the divergence is intentional and discoverable on the next sync.super_editor/lib/src/default_editor/default_document_editor_reactions.dart// ignore: deprecated_member_use.super_editor/lib/src/default_editor/document_ime/document_delta_editing.dartdocument_serialization.dartimport (already imported earlier in the same file).super_editor/pubspec.yamlsuper_text_layout: ^0.1.20andsuper_keyboard: ^0.4.0.super_editor/example/pubspec.yamlpath:deps (instead of upstream'sgit:URL form), bumpedsuper_keyboardto^0.4.0andfollow_the_leaderto^0.5.3.Plus 35+ modify/delete conflicts in
super_editor_markdown/**andsuper_editor_quill/**(accepted upstream deletion) and 2 modify/delete in*/example/pubspec.lock(kept fork's policy of not tracking those).Fork-Only Customizations Verified Intact
IgnorePointerwrapper onTextComponent.build()super_editor/lib/src/default_editor/text.dartContentTapExclusionfor inline widget taps inSuperReadersuper_editor/lib/src/infrastructure/content_tap_exclusion.dart(+ touch interactors)scrollingEnabledflag on document widgetssuper_editor/lib/src/super_reader/,infrastructure/documents/document_scaffold.dartdisplayLatexAttributionfor math contentsuper_editor/lib/src/default_editor/attributions.dartImageComponentcustomimageBuilder+altText+ pointer eventssuper_editor/lib/src/default_editor/image.dartDiffstat
(net deletions because
super_editor_markdown/+super_editor_quill/directories were removed, ~36 files)Documentation
FORK_CHANGES.mdrewritten:Test Plan
git statusclean post-mergeresolution: workspacestrip) ran successfullyflutter pub getfromunified_monoreporoot (re-run after this PR lands locally)dart analyzeonsuper_editor,super_editor_clipboard,super_text_layout,super_keyboard,attributed_textpieces_for_xagainst this fork to validate Copilot module compiles (consumers ofimageBuilder,displayLatexAttribution,scrollingEnabled)Follow-ups (not in this PR)
database_facadeand other consumer pubspec pins fromsuper_editor0.3.0-dev.48→0.3.0-dev.51(and the supporting packages) once this lands.scrollingEnabled(PR Scroll Enable/Disable Flag #4) andContentTapExclusion(PR Enable tap exclusion for inline widgets in SuperReader #3) — both are good upstream-contribution candidates and would shrink the permanent fork delta from 5 features to 3.Cross-Repo Context
This branch (
chore/align-runtime-version-pins) is part of a wider cross-repo runtime-pin alignment inpieces-app/unified_monorepo(~85 sibling repos on the same branch name). This PR handles only thesuper_editorslice; vector_search and other repos will get their own PRs from the meta-repo branch.Made with Cursor