Skip to content

Sync upstream/main (2026-05): 40 commits — IME stability, clipboard fixes, attributed_text perf, super_keyboard 0.4.0#13

Merged
mack-at-pieces merged 42 commits into
mainfrom
chore/align-runtime-version-pins
May 19, 2026
Merged

Sync upstream/main (2026-05): 40 commits — IME stability, clipboard fixes, attributed_text perf, super_keyboard 0.4.0#13
mack-at-pieces merged 42 commits into
mainfrom
chore/align-runtime-version-pins

Conversation

@tsavo-at-pieces

Copy link
Copy Markdown

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 HEAD 13e7538a.

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

Package Before After Type
super_editor 0.3.0-dev.48 0.3.0-dev.51 dev
super_editor_clipboard 0.2.5 0.2.10 patch
super_text_layout 0.1.19 0.1.20 patch
super_keyboard 0.3.1 0.4.0 minor
attributed_text 0.4.5 0.4.7 patch

Consumers in unified_monorepo (pieces-app/super_editor workspace members) get these via the local path: resolution; downstream repos pinning by tag (e.g. via tag_pattern: v{{version}}) will need their pins bumped after this lands.

Upstream Enhancements (by theme)

IME stability — five separate fixes

PR Fix
Flutter-Bounty-Hunters#2962 SuperEditor IME — don't clear selection or unfocus when one SuperEditor is replaced by another for the same role
Flutter-Bounty-Hunters#2965 Fix zombie IME client when switching from one SuperEditor instance to a replacement instance
Flutter-Bounty-Hunters#2970 Samsung — error when backspacing stable tag at start of text (composing region not cleared)
Flutter-Bounty-Hunters#2975 Microsoft SwiftKey — tag deletion error
Flutter-Bounty-Hunters#2979 / Flutter-Bounty-Hunters#2981 Samsung — error when sending deltas after newline; GBoard — removes trailing space in empty paragraph when inserting newline

These five matter because Pieces Copilot uses SuperEditor heavily 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

Editor UX

Chat editor

Flutter SDK forward-compat

attributed_text performance

super_keyboard 0.4.0 (minor bump)

Package consolidation cleanup

API Changes Consumers Should Know About

New / changed APIs

  • SuperText: maxLines and overflow constructor args (defaulting to existing behavior — purely additive).
  • TextComponent: maxLines and overflow props now plumbed through to SuperText.
  • TextInputConnectionDecorator.updateStyle (new — required by Flutter).
  • BlinkController and BlinkTimingMode are now re-exported from super_text_layout package.
  • chat_preview_mode_plugin.dart (new file): ChatPreviewModePlugin for SuperMessage.
  • OrderedListContinuationStrategy (new): plug-in for OrderedListItemConversionReaction.
  • KeyboardSimulator (super_keyboard 0.4.0): API no longer takes a WidgetTester.

Behavioral changes

Removed

  • The packages super_editor_markdown and super_editor_quill no longer exist as separate publishable units. (Their code lives inside super_editor core now and has since 0.3.0-dev.40 / 0.3.0-dev.41.) Any pubspec or Dart import still pointing at them needs to migrate to super_editor.

Conflict Resolutions

Five real content conflicts; rest were upstream-deletes-our-modify in super_editor_markdown/** and super_editor_quill/** (we accepted the deletions).

File Resolution
super_editor/lib/src/default_editor/text.dart Preserved fork PR #1 (no IgnorePointer wrapper around SuperText in TextComponent.build) while adopting upstream's new maxLines / overflow SuperText props and migrating hintText to computeInlineSpan(...). 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 Accepted upstream's two-pattern (empty / non-empty paragraph) list-item conversion logic from Flutter-Bounty-Hunters#2984. Strict improvement over our single-pattern + // ignore: deprecated_member_use.
super_editor/lib/src/default_editor/document_ime/document_delta_editing.dart Removed duplicate document_serialization.dart import (already imported earlier in the same file).
super_editor/pubspec.yaml Adopted upstream super_text_layout: ^0.1.20 and super_keyboard: ^0.4.0.
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.

Plus 35+ modify/delete conflicts in super_editor_markdown/** and super_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

PR Feature Location Verified
#1 No IgnorePointer wrapper on TextComponent.build() super_editor/lib/src/default_editor/text.dart ✓ Re-asserted in conflict resolution
#3 ContentTapExclusion for inline widget taps in SuperReader super_editor/lib/src/infrastructure/content_tap_exclusion.dart (+ touch interactors) ✓ Untouched
#4 scrollingEnabled flag on document widgets super_editor/lib/src/super_reader/, infrastructure/documents/document_scaffold.dart ✓ Untouched
#5 displayLatexAttribution for math content super_editor/lib/src/default_editor/attributions.dart ✓ Untouched
#6 ImageComponent custom imageBuilder + altText + pointer events super_editor/lib/src/default_editor/image.dart ✓ Untouched (upstream did not modify in this gap)

Diffstat

130 files changed, 4319 insertions(+), 7766 deletions(-)

(net deletions because super_editor_markdown/ + super_editor_quill/ directories were removed, ~36 files)

Documentation

FORK_CHANGES.md rewritten:

  • Removed the misleading "~0 commits behind" claim from the Feb 2026 snapshot.
  • Added a verifiable Verifying Drift command block.
  • Added a 2026-05-09 sync entry documenting range, version bumps, and every conflict resolution.
  • Documented each fork PR's exact file location so future syncs can grep + verify in seconds.

Test Plan

  • git status clean post-merge
  • All 5 fork-only customizations grepped and verified
  • Pre-commit hook (dart format + resolution: workspace strip) ran successfully
  • flutter pub get from unified_monorepo root (re-run after this PR lands locally)
  • dart analyze on super_editor, super_editor_clipboard, super_text_layout, super_keyboard, attributed_text
  • Build pieces_for_x against this fork to validate Copilot module compiles (consumers of imageBuilder, displayLatexAttribution, scrollingEnabled)
  • Smoke test on macOS + iOS (focus on IME flows, since 5 fixes there)

Follow-ups (not in this PR)

  1. Bump database_facade and other consumer pubspec pins from super_editor 0.3.0-dev.480.3.0-dev.51 (and the supporting packages) once this lands.
  2. Consider upstream PRs for scrollingEnabled (PR Scroll Enable/Disable Flag #4) and ContentTapExclusion (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.
  3. Establish a 6-week upstream sync cadence — the 3-month gap here produced 5 file-level conflicts; a 6-week cadence would have produced 0–2.

Cross-Repo Context

This branch (chore/align-runtime-version-pins) is part of a wider cross-repo runtime-pin alignment in pieces-app/unified_monorepo (~85 sibling repos on the same branch name). This PR handles only the super_editor slice; vector_search and other repos will get their own PRs from the meta-repo branch.

Made with Cursor

matthew-carroll and others added 30 commits February 16, 2026 12:45
…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)
… 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.
matthew-carroll and others added 11 commits March 27, 2026 14:39
…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.
Copilot AI review requested due to automatic review settings May 9, 2026 18:35

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +172 to +182
/// 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;
}
Comment on lines +300 to +307
/// 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");
}
Comment on lines +42 to +46
/// 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;
Comment on lines +386 to +393
/// 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;

Comment on lines 456 to +463
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);
}
Comment on lines 404 to 412
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)
@tsavo-at-pieces

Copy link
Copy Markdown
Author

Update: layered Flutter 3.35-3.40 compat patch on top of the merge

Pushed an additional commit (73e427c7) on top of the merge to fix a build break against our pinned Flutter SDK.

What changed

Drop upstream's 3-line @override void updateStyle(TextInputStyle style) from super_editor/lib/src/default_editor/document_ime/ime_decoration.dart. Replace with a documented comment block.

Why this is needed

  • Upstream's PR #2950 (commit b422c326) was authored against Flutter master immediately after flutter/flutter#180436 added TextInputConnection.updateStyle(TextInputStyle) and deprecated setStyle(...).
  • Per Flutter's breaking-changes page (last updated 2026-03-03), the change is "Landed in version: TBD / In stable release: Not yet."
  • Our pinned Flutter is 3.35.7. Its text_input.dart declares only setStyle({...}). class TextInputStyle and TextInputConnection.updateStyle(...) don't exist.
  • TextInputConnectionDecorator implements TextInputConnection, so the override fails to compile against any current stable Flutter — the parent doesn't have updateStyle to override, and TextInputStyle is undefined.

Why we can't migrate to updateStyle instead

There's no Dart conditional-imports trick to selectively include an interface override based on the host Flutter version — conditional imports switch entire libraries, not individual class members. The only paths are: (a) drop the override on stable Flutter, (b) wait for the API to ship in stable. Option (a) is what this commit does.

Why this is safe

setStyle(...) immediately above the dropped block is still in the framework and still in the parent interface — it covers the entire surviving public API on stable Flutter. Removing the would-be-override is functionally a no-op (the framework can't call a method that doesn't exist on the parent).

Restore criteria (documented in the code + FORK_CHANGES.md)

  1. Flutter stable ships TextInputStyle + TextInputConnection.updateStyle(...).
  2. This monorepo's pinned Flutter SDK is upgraded to ≥ that release.
  3. Then revert this commit.

Tracked

Added as fork divergence #6 in FORK_CHANGES.md, explicitly marked TEMPORARY. The Pre-Merge Checklist in that file now flags ime_decoration.dart so future syncs catch upstream re-introducing the override.

Diff stat

2 files changed, 50 insertions(+), 3 deletions(-)
  super_editor/lib/src/default_editor/document_ime/ime_decoration.dart
  FORK_CHANGES.md

TL;DR

We want all 40 upstream fixes from the merge + this one tiny compat patch on top to keep the fork buildable on Flutter 3.35.7 until upstream's updateStyle API actually ships in stable.

@tsavo-at-pieces

Copy link
Copy Markdown
Author

Fork Divergence Audit + Flutter 3.35-3.40 Compat Investigation

This is a deeper audit done after the merge + compat patch landed. Two parts:

  1. Part 1 — Fork Divergence Audit (Desktop-First): every fork PR traced to actual call sites in the desktop client + applets, compared against current upstream behavior at 0.3.0-dev.51, with keep/contribute/replace verdicts.
  2. Part 2 — Flutter 3.35-3.40 Compat Investigation: the deeper TextInputStyle issue — fact-checked via Flutter docs + Perplexity, with restoration plan.

Part 1 — Fork Divergence Audit

Headline Verdict

PR Feature Production call sites Desktop-relevance Verdict
#1 No IgnorePointer in TextComponent 11 reader embeds + macOS native menu integration Critical (desktop focus + Ctrl/Cmd-click context menu) KEEP — but document the contract more precisely
#3 ContentTapExclusion + isTapAllowedAtDocumentPosition 1 explicit wrap + auto-applied via AttributedText.placeholders High (URL chips on desktop) KEEP, upstream-contribute candidate #1
#4 scrollingEnabled flag 5 hard scrollEnabled: false sites in Copilot embeds Critical (nested scroll in chat) KEEP, upstream-contribute candidate #2
#5 displayLatexAttribution 6 sites: components, PDF export, markdown round-trip Critical (Copilot math) KEEP — pure attribution constant, zero-cost
#6 ImageComponent imageBuilder w/ altText + no IgnorePointer 1 builder site + load-bearing for PiecesImageComponent hover UX Critical (desktop "Copy URL on hover") KEEP for behavior, contribute API

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 IgnorePointer in TextComponent.build()

What it does

Removes upstream's IgnorePointer wrapper around SuperText inside TextComponent.build() so pointer events propagate to ancestor widgets.

Where it's exercised

  • frontend/pieces_platform_client_sdk/.../pieces_markdown_reader.dart:681-682 wraps SuperReader in a Listener whose onPointerDown: _handlePointerDown runs:
    • _readerFocusNode.requestFocus() on every pointer down (line 567+)
    • Ctrl/Meta + secondary mouse click → _showContextMenu(...) (lines 567-584) — desktop-specific context menu
  • 11 reader embed sites depend on this:
    • frontend/pieces_copilot_module/.../system_message_renderer.dart:319, 494, 584, 1327
    • frontend/pieces_copilot_module/.../copilot_message_summary_content.dart:212
    • frontend/pieces_copilot_module/.../copilot_chat_message_markdown_content.dart:127
    • frontend/pieces_workstream_activity_module/.../workstream_rollup_super_reader_view.dart:49
    • frontend/pieces_workstream_activity_module/.../workstream_editing_copilot_panel.dart:305
    • frontend/pieces_platform_client_sdk/.../copilot_quoted_selection_widget.dart:78
    • frontend/pieces_platform_client_sdk/.../release_note_detail_view.dart:40
    • …plus 1 more

Upstream alternative?

Upstream still wraps SuperText in IgnorePointer at text.dart:1296 (we conflicted on this exact line during the merge and had to re-assert PR #1). Upstream has not introduced a gesturesEnabled toggle or pointer-passthrough mode. No drop-in replacement.

Verdict

KEEP. Risk to track: upstream will keep re-introducing IgnorePointer on every dev release; expect a conflict on this exact line every 1-2 syncs.

Actionable improvement

  • (a) Write a Dart integration test in pieces_flutter_client_sdk that asserts Listener.onPointerDown fires on a paragraph tap — catches future accidental reverts at PR time.
  • (b) Open an upstream issue requesting a pointerEventsBehavior: PointerEventsBehavior opt-in on TextComponent.

PR #3ContentTapExclusion + isTapAllowedAtDocumentPosition

What it does

  1. Marker widget ContentTapExclusion(child: …) so a subtree can opt out of SuperReader tap interception.
  2. Helper isTapAllowedAtDocumentPosition({Document, DocumentPosition?}) that returns false when the position has an inline placeholder. Mouse + iOS + Android touch interactors call this automatically.

Where it's exercised

  • 1 explicit wrap at frontend/pieces_platform_client_sdk/.../inline/inline_url_builder.dart:137 — the URL chip widget wraps its MouseRegion + ClickableText.onTap (line 164 → URLService.launchURL / file-path opener) in ContentTapExclusion(...) so taps on URL chips open the URL instead of placing a caret.
  • Auto-applied via the helper for any AttributedText.placeholders entry; this means all 5 inline builders (inline_url_builder, inline_code_builder, inline_latex_builder, inline_citation_metadata_builder, inline_block) get free tap-exclusion, even though only inline_url_builder wraps explicitly.

Upstream alternative?

Upstream has nothing equivalent. Closest evolution is upstream #2994 (popover toolbar on tablets), but that addresses selection toolbars, not pointer-arena resolution at inline-widget hit-test sites — different problem entirely.

Verdict

KEEP. Strongest candidate for upstream contribution — design is clean (SingleChildRenderObjectWidget marker + interactor predicate), cross-platform (mouse/iOS/Android already wired), and there's an existing 105-line markdown doc at super_editor/lib/super_editor/inline_placeholder_tap_exclusion.md from bb68f4c6.

Actionable improvement

Open an upstream PR. Total diff is ~75 lines of code + 105-line doc — exactly the contribution shape upstream typically accepts.


PR #4scrollingEnabled flag

What it does

Adds scrollingEnabled field to SuperReader, DocumentScaffold, DocumentScrollable, and the read-only mouse/iOS/Android touch interactors. When false, disables user scroll AND auto-scroll on selection-drag.

Where it's exercised

  • frontend/pieces_platform_client_sdk/.../pieces_markdown_reader.dart:39, 119, 711 exposes scrollEnabled and forwards it.
  • 5 hard scrollEnabled: false call sites, all in Copilot:
    • frontend/pieces_copilot_module/.../system_message_renderer.dart:332
    • system_message_renderer.dart:507
    • system_message_renderer.dart:597
    • system_message_renderer.dart:1340
    • frontend/pieces_copilot_module/.../copilot_message_summary_content.dart:214

These are markdown reader embeds inside an outer scrollable (the chat list); without this flag, nested scroll would trap user wheel/trackpad input — a critical desktop UX concern.

Upstream alternative?

Upstream now has SuperMessage (intrinsic-sized, no internal scroll) for chat. Partial replacement is feasible for chat-shaped content (copilot_message_summary_content.dart could plausibly migrate), but not full: the two system_message_renderer.dart sites embed full markdown (images, tables, mermaid, latex) which is more than SuperMessage's chat-message-shaped intrinsic. The scrollingEnabled flag is more general.

Verdict

KEEP, upstream-contribute candidate #2. Pure additive flag — easiest upstream sell.

Actionable improvement

  • Open an upstream PR for scrollingEnabled (low risk to upstream).
  • Separately, evaluate whether the 5 scrollEnabled: false sites should migrate to SuperMessage post-merge for any chat-shaped ones. That's a follow-up refactor in pieces_copilot_module, not a fork concern.

PR #5displayLatexAttribution

What it does

One constant: const displayLatexAttribution = NamedAttribution('display-latex');. 2 lines of code.

Where it's exercised

6 sites, all in pieces_platform_client_sdk:

  • widgets/super_editor/components/feather_latex_component.dart:8, 20 — editable LaTeX block
  • widgets/super_editor/components/display_latex_component_builder.dart:10, 33 — display-mode LaTeX block
  • utils/markdown_to_pdf/markdown_to_pdf_converter_io.dart:476 — LaTeX → PDF
  • widgets/super_editor/infrastructure/document_text_to_markdown.dart:529 — LaTeX → markdown
  • widgets/super_editor/infrastructure/markdown_deserialization_with_language.dart:387 — Markdown → LaTeX node

This is the whole math-rendering pipeline for Copilot.

Upstream alternative?

Upstream has no native LaTeX/math support. We could move this constant outside super_editor (e.g. into pieces_flutter_client_sdk) and remove the fork delta — but it's a NamedAttribution and they live in super_editor/lib/src/default_editor/attributions.dart for discoverability alongside boldAttribution, codeAttribution, etc. Moving it adds zero value and creates inconsistency.

Verdict

KEEP. 2-line, zero-maintenance change. Lowest-priority of all 5 PRs.

Optional cleanup

Move the constant to pieces_flutter_client_sdk so the fork doesn't carry it at all. Cost: ~5 lines refactor in 6 places. Benefit: 1 less fork delta. Probably not worth doing unless we're already touching all 6 files.


PR #6ImageComponent imageBuilder w/ altText + no IgnorePointer wrap

What it does

Three changes to super_editor/lib/src/default_editor/image.dart:

  1. Changes imageBuilder signature from (BuildContext, String imageUrl) (positional, upstream) → (BuildContext, {required String imageUrl, String altText}) (named, fork).
  2. Removes IgnorePointer wrapper around the SelectableBox (line 247 in fork; upstream still has it at line 233).
  3. Adds enableIgnorePointer: selection != null parameter to SelectableBox so the box only ignores pointers when actively selected (so hover works when not selected).

Where it's exercised

Builder consumer at pieces_markdown_reader.dart:721-728:

ImageComponentBuilder(
  imageBuilder: (context, {required String imageUrl, String altText = ''}) {
    return PiecesImageComponent(
      imageUrl: imageUrl,
      altText: altText,
      borderRadius: widget.imageBorderRadius ?? BorderRadius.circular(8),
    );
  },
),

Why pointer-passthrough matters: PiecesImageComponent (components/pieces_image_component.dart:99-105) uses a MouseRegion with onEnter/onExit to track hover state. Line 132 conditionally shows a "Copy URL" button at opacity: _isHovered ? 1.0 : 0.0. That hover state only fires because PR #6 removed IgnorePointer. Reverting this PR would silently break a desktop-only UX feature — no compile error, the button would just never appear.

Upstream alternative?

Upstream now (post our 2026-05 merge):

  • ✅ Has altText field on ImageNode (since long ago).
  • ✅ Has imageBuilder field on ImageComponent — but positional signature (context, imageUrl) only.
  • ❌ Still wraps in IgnorePointer.

Upstream is ~50% there. Two specific deltas remain:

  1. Signature mismatch: their (context, imageUrl) vs our (context, {required imageUrl, altText}).
  2. IgnorePointer: hard blocker for hover UX.

Verdict

KEEP behavior, contribute API. Pointer-passthrough is load-bearing for desktop. Signature mismatch is cosmetic, but the named-param form (with altText as a typed argument) is betterimageBuilder callers shouldn't have to look up the node to get alt text.

Actionable improvement

  • Upstream PR: change imageBuilder signature to (BuildContext, {required String imageUrl, String altText}) — strictly additive.
  • Upstream issue (separate): argue for removing the unconditional IgnorePointer in ImageComponent (or making it opt-in via enableIgnorePointer-style param).

Recommended Action Plan

Bucket A — KEEP as-is (high confidence)

Bucket B — KEEP, contribute upstream

Bucket C — Behavior we'll likely have to keep regardless

Suggested upstream PR sequence

  1. displayLatexAttribution — trivial 2-line PR, builds rapport.
  2. scrollingEnabled flag — additive, isolated.
  3. ContentTapExclusion — bigger but clean, has docs.
  4. ImageComponentBuilder.imageBuilder named-param signature — strictly more useful than current.
  5. Issue (not PR): pointer-passthrough opt-in for TextComponent and ImageComponent.

If upstream merges 1-4, we shrink the permanent fork delta from 5 PRs → 1.5 PRs (the two pointer-passthrough behavioral overrides).


Part 2 — Flutter 3.35-3.40 Compat Investigation (TextInputStyle)

Why this came up

A separate concern surfaced after the merge: super_editor's ime_decoration.dart (post-merge) overrides void updateStyle(TextInputStyle style), but TextInputStyle doesn't exist in our Flutter 3.35.7 SDK — so the file fails to compile. The hypothesis was raised that maybe unset-pub-resolution could route around it by pulling super_editor from a remote source.

Decisive fact-check (Flutter docs + Perplexity)

The local comment originally claimed TextInputStyle was removed in Flutter 3.35+. The opposite is true — it's a future addition, and our Flutter is too old to have it.

Sources verified

  1. Flutter docs · Deprecate TextInputConnection.setStyle (last updated 2026-03-03):

    "TextInputConnection.setStyle is deprecated in favor of TextInputConnection.updateStyleLanded in version: TBD. In stable release: Not yet."

  2. Flutter API docs · TextInputConnection (current stable): lists setStyle(...) only. No updateStyle method, no TextInputStyle class.

  3. Upstream super_editor PR #2950 description (verbatim, Feb 13, 2026):

    "In [Web] Fix IME and selection by syncing more text styles flutter/flutter#180436 a breaking change was introduced… the framework introduced TextInputConnection.updateStyle(TextInputStyle style) and deprecated the old method… This change fixes the breakage by adding an implementation for the new method."

  4. Local Flutter SDK check at /Users/.../flutter-sdk-3.35.5/packages/flutter/lib/src/services/text_input.dart:

    • setStyle({...}) exists at lines 1658, 2429, 2555.
    • updateStyle(TextInputStyle) and class TextInputStyle — do not exist.

The actual situation

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 ❌ NOTextInputStyle 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:

  1. Adds/removes resolution: workspace from workspace member pubspecs.
  2. On unset, injects standalone dependency_overrides for test, test_api, web_socket_channel, analyzer, dart_style, freezed_annotation, material_symbols_iconsnone of which point at super_editor.
  3. Strips/restores dependency_overrides de-duplication and build.yaml envied-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:

  • TextInputConnection has no updateStyle to override.
  • TextInputStyle is 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

  1. Land this PR (already includes both the merge and the compat patch).
  2. File 4 upstream PRs in priority order: displayLatexAttributionscrollingEnabledContentTapExclusionimageBuilder named-param signature.
  3. File 1 upstream issue for pointer-passthrough opt-in (TextComponent + ImageComponent).
  4. Add integration test in pieces_flutter_client_sdk for the Listener.onPointerDown contract on PiecesMarkdownReader, so an accidental future revert of PR feat: remove ignore pointer so gesture detection works #1's IgnorePointer removal is caught at PR time.
  5. When Flutter pin upgrades past TextInputStyle-shipping stable: revert the compat patch (commit 73e427c7).

This is the complete fork hygiene picture as of the 2026-05 sync.

@mack-at-pieces mack-at-pieces merged commit 76609db into main May 19, 2026
14 of 26 checks passed
@mack-at-pieces mack-at-pieces deleted the chore/align-runtime-version-pins branch May 19, 2026 19:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants