chat_context_menu 4.0.0 copy "chat_context_menu: ^4.0.0" to clipboard
chat_context_menu: ^4.0.0 copied to clipboard

A Flutter package that provides chat context menu with customizable appearance and animations, perfect for chat applications.

4.0.0 #

Breaking Changes ⚠️ #

  • Dependency Migration: Replaced legacy Flutter package imports with material_ui and cupertino_ui following the Flutter 3.47 package decoupling.
  • SDK Constraints: Bumped minimum Flutter SDK requirement to >=3.47.0.

Features & Improvements #

  • Example App: Updated the example application code and import paths to align with the new dependencies.
  • Linter & Analysis: Added build directory exclusions (build/**) in analysis_options.yaml to optimize static analysis performance.

3.3.0 #

  • ChatSelectableText desktop interactions
    • Mouse drag selection — Press the left mouse button and drag to select text. The pan gesture is mouse-only (supportedDevices: {PointerDeviceKind.mouse}), so touch drags still scroll the surrounding list. The selection anchors at the press position (DragStartBehavior.down), highlights live while dragging, and shows handles + menu on release (an empty selection just deactivates).
    • Right-click — Activates selection (respecting selectAllOnActivate, same as long-press) and shows the menu at the pointer. When already active, right-click re-selects the word under the pointer.
    • Double-click / triple-click — Double-click selects the word under the pointer; triple-click selects the whole newline-delimited paragraph. Implemented with a single SerialTapGestureRecognizer (no double-tap delay).
    • Text cursor — The text now shows SystemMouseCursors.text on hover.
  • axis on ChatSelectableText — Same as ChatContextMenuWrapper: Axis.vertical (default, menu above/below the selection — unchanged behavior) or Axis.horizontal (menu beside the selection with a horizontal arrow, preferring the right side and falling back to the press position when neither side fits).
  • Internal — The gesture handling was consolidated into a single RawGestureDetector (serial tap + long press + mouse-only pan) replacing the previous GestureDetector.
  • Tests — Widget coverage for right-click activation, horizontal axis placement, mouse drag selection, double-click word and triple-click paragraph selection.

3.2.0 #

  • ChatContextMenuAnimationStyle — Built-in menu animations, default scaleFade (existing 150ms overlay fade+scale). New cupertinoSheet matches Flutter's Cupertino context-menu sheet (335ms, easeOutBack / easeInBack, linear fade, scale from the arrow). transitionsBuilder still overrides both. Optional transitionDurations / transitionDuration override the style default when non-null.
  • Example — Third tab (Animation) compares the two styles on bubbles, a horizontal menu, and ChatSelectableText.
  • Tests — Widget coverage for both styles, horizontal cupertinoSheet, custom transitionsBuilder not stacking the sheet transition, and duration overrides.

3.1.0 #

  • Nested Navigator / desktop multi-pane support — Fixes broken menu positioning and clipping when the anchor lives inside a nested Navigator (e.g. desktop "sliding window" layouts where each pane hosts its own Navigator wrapped in ClipRect/Transform.translate/clipped Material).
    • useRootNavigator on ChatContextMenuWrapper (default false) — Pushes the menu route onto the root Navigator so the menu and barrier cover the whole window instead of being clipped to a single pane.
    • useRootOverlay on ChatSelectableText (default false) — Inserts selection handles, menu and barrier into the root Overlay for the same reason.
    • Overlay-space coordinates everywhere — The anchor rect and pointer position are now measured in the target Navigator's Overlay coordinate space (localToGlobal(..., ancestor: overlayBox)) instead of raw window coordinates, so menus position correctly regardless of which Navigator the route is pushed onto. Layouts and buildTransitions use the actual overlay size instead of MediaQuery.of(context).size.
    • Clip-aware barrier cutoutclipAnchorRectForHole (renamed from clipAnchorGlobalRectForHole) now walks the render tree from the anchor to the overlay and intersects with every clipping ancestor (RenderAbstractViewport, ClipRect/ClipRRect/ClipOval/ClipPath, Material/PhysicalModel with a non-none clipBehavior), so with excludeAnchorFromBarrier: true the hole never extends past the visible pane bounds.
    • Backward compatible: with a single full-window Navigator (typical mobile apps) the overlay origin equals the window origin, so behavior is unchanged. Internal HoleModalDismissScrim.holeRectGlobal was renamed to holeRectLocal and the intersectHoleOverlayLocal helper was removed (holes are already overlay-local).
  • Tests — Added test/nested_navigator_overlay_test.dart covering a minimal sliding-pane reproduction (ClipRect > OverflowBox > Transform.translate > panes with nested Navigators): menu alignment with/without useRootNavigator, hole-barrier hit-testing across panes, clip-chain clamping, and ChatSelectableText with useRootOverlay.

3.0.1 #

  • Fix ChatSelectableText menu overflow — Menu positioning now measures the full menu shell (menuPadding + content), matching ChatContextMenuWrapper / ChatContextMenuVerticalLayout. Previously only menuBuilder content was measured, so horizontal edge clamping underestimated the rendered width and the menu could extend past the screen edge (e.g. right-aligned chat bubbles).
  • Tests — Added test/chat_selectable_text_test.dart to assert the menu stays within horizontalMargin at the screen edge.

3.0.0 #

  • BREAKING: hideMenu on widgetBuilderContextMenuWidgetBuilder now receives a third hideMenu callback alongside showMenu. Callers must update their widgetBuilder signature; use _ if the callback is not needed. hideMenu closes the menu only when it is already open (no-op otherwise), matching the behavior of menuBuilder's hideMenu.
  • Tests — Added a widget test verifying hideMenu from widgetBuilder when the menu is closed and when it is open.
  • Docs — Updated README / README_ZH examples and customization notes for the new widgetBuilder API.

Migration #

// Before (2.x)
widgetBuilder: (context, showMenu) { ... }

// After (3.0.0)
widgetBuilder: (context, showMenu, hideMenu) { ... }

2.3.0 #

  • Hole barrier and dismiss scrim — When excludeAnchorFromBarrier is true and barrierColor is non-transparent, the modal uses a punched overlay plus an in-route full-screen dismiss layer (HoleModalDismissScrim) so taps on the dimmed area reliably close the menu (fixes hits not reaching the underlying barrier stack entry). Barrier painting remains in HoleModalBarrier (hit-test transparent); dismiss uses the same hole geometry as the visual cutout.
  • barrierAnchorBorderRadius on ChatContextMenuWrapper — Optional BorderRadius for the anchor cutout so the hole can match rounded chat bubbles (RRect painting and hit testing via anchoredHoleShape / intersectHoleOverlayLocal).
  • Anchor rect clipping — Before pushing the route, the anchor global Rect is clipped with clipAnchorGlobalRectForHole: intersect with the innermost RenderAbstractViewport (e.g. ListView viewport) and with MediaQuery size, so very tall list items no longer “punch” the overlay through the input bar or other UI below the scroll viewport.
  • Route offstage gating_useHoleBarrier no longer requires !offstage; the dismiss scrim stays in the page subtree while Offstage still suppresses interaction until the route is onstage.
  • Example: barrierAnchorBorderRadius aligned with bubble decoration (BorderRadius.circular(10) in the chat demo).

2.1.0 #

  • Add ChatSelectableText widget — a fully custom selectable text widget built from the ground up
    • Uses RichText for rendering, TextPainter for selection geometry, OverlayEntry for handles/menu, CompositedTransformFollower for positioning
    • Text selection with draggable handles (base & extent) for adjustable selection range
    • Customizable selection highlight color (selectionColor) and handle color (handleColor)
    • Context menu with arrow indicator, smart positioning with pointer-position fallback for long text
    • selectAllOnActivate property — when true (default), selects all text on activation; when false, selects the tapped word
    • selectAll callback provided in menuBuilder for programmatic select-all from the menu
    • Auto-scroll when dragging handles near viewport edges (autoScrollEdgeExtent, autoScrollSpeed)
    • Haptic feedback on selection activation (enableHapticFeedback)
    • Handle visibility — handles are automatically hidden when scrolled outside the viewport
    • Menu-only animation (text and selection appear immediately, only the menu panel animates)
    • Customizable menu appearance: menuBackgroundColor, menuBorderRadius, menuPadding, menuShadows
    • Customizable arrow: arrowHeight, arrowWidth, spacing, horizontalMargin
    • onSelectionChanged callback provides the currently selected text
    • onMenuClosed callback triggered when the menu is dismissed
    • Custom transitionsBuilder for menu animation

1.7.4 #

  • transitionsBuilder add centerOffset parameter to control the animation origin point

1.7.3 #

  • transitionsBuilder add alignment parameter to control the animation origin point

1.7.2 #

  • Use pointer (finger press) position as anchor when the widget is taller than available space for the context menu

1.7.1 #

  • Fix CurvedAnimation listener leak in route transitions — replaced with animation.drive(CurveTween(...))
  • Fix barrierDismissible parameter being ignored (getter was hardcoded to true)
  • Fix potential crash when widget is disposed while menu is closing (added mounted check)
  • Add dispose to ChatContextMenuWrapperState to clean up active route on widget removal
  • Rename verticalMargin to horizontalMargin in ChatContextMenuHorizontalLayout for correct semantics
  • Fix getInnerPath in both shape classes to properly return inset path
  • Remove unused padding parameter from ChatContextMenuHorizontalShape

1.7.0 #

** Add topPadding parameter

1.6.0 #

** Fix the issue of duplicate calculations in spacing

1.5.6 #

**The constraints parameter has been renamed to menuConstraints ** Added layoutConstraints parameter ** fix bug

1.5.1 #

** Export shape class

1.5.0 #

**Add constraints properties , to set maximum width and height for the context menu ** Add axis properties , to set the direction of the context menu (vertical or horizontal)

1.4.0 #

  • add onClose callback , triggered when the context menu is closed
  • add horizontalMargin properties , Minimum horizontal margin from screen edges

1.3.0 #

  • Add custom shadows attribute
  • Add custom corner mark width and height
  • Add properties for custom display spacing
  • Add custom animation properties

1.2.0 #

  • update requestFocus parameter default false

1.1.0 #

  • Added requestFocus parameter to ChatContextMenuWrapper to control focus behavior. Set it to false to prevent the menu from stealing focus from input fields.

1.0.0 #

  • Initial release of chat_context_menu.
  • Added ChatContextMenuWrapper for easy integration.
  • Supported customizable menu content via menuBuilder.
  • Implemented automatic positioning with arrow indicator.
  • Added customization options for colors and border radius.
9
likes
160
points
438
downloads
screenshot

Documentation

API reference

Publisher

verified publisherjsontodart.cn

Weekly Downloads

A Flutter package that provides chat context menu with customizable appearance and animations, perfect for chat applications.

Repository (GitHub)
View/report issues

Topics

#chat #chat-context-menu #context-menu #chat-selectable-text #menu

License

Apache-2.0 (license)

Dependencies

cupertino_ui, flutter, material_ui

More

Packages that depend on chat_context_menu