Skip to content

fix(drag-handle): support RTL direction for drag ghost image#7629

Open
wbcoder0 wants to merge 3 commits intoueberdosis:mainfrom
wbcoder0:fix/drag-handle-rtl-support
Open

fix(drag-handle): support RTL direction for drag ghost image#7629
wbcoder0 wants to merge 3 commits intoueberdosis:mainfrom
wbcoder0:fix/drag-handle-rtl-support

Conversation

@wbcoder0
Copy link

@wbcoder0 wbcoder0 commented Mar 20, 2026

Changes Overview

Fix drag ghost (setDragImage) for RTL editors and mixed-direction blocks: the temporary wrapper now mirrors the dragged block’s text direction, and the drag hotspot is aligned to the pointer using the wrapper’s bounds (not a fixed corner).

Implementation Approach

  1. Direction on the ghost wrapper
    Resolve the DOM node at the drag range start (view.domAtPos), normalize text nodes to their parentElement, then read getComputedStyle(...).direction (falling back to view.dom). Set wrapper’s dir so the clone matches the block (including RTL page + LTR paragraph cases).

  2. Drag image hotspot
    DataTransfer.setDragImage uses the off-screen wrapper as the image. After cloning and append, measure wrapper.getBoundingClientRect() and set the hotspot x to clientX - wrapperRect.left, clamped to [0, wrapperRect.width], so the ghost tracks the cursor in both LTR and RTL.

Testing Done

  • Manual: drag handle in an RTL-configured editor; mixed Arabic/Latin paragraphs where block direction differs from view.dom.
  • Confirmed ghost text direction and pointer alignment during drag.

Verification Steps

  1. Set editor / root to dir="rtl" (or CSS direction: rtl).
  2. Drag a block via the drag handle; confirm the ghost renders with correct direction and stays under/near the cursor.
  3. Optional: dir="auto" or LTR block inside RTL editor — ghost should follow the block direction.

Additional Notes

  • Supersedes an earlier approach that only toggled dir on the editor root and used offsetWidth as the hotspot, which mis-handled mixed-direction content and mis-aligned the ghost.

@changeset-bot
Copy link

changeset-bot bot commented Mar 20, 2026

🦋 Changeset detected

Latest commit: 36a39af

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 72 packages
Name Type
@tiptap/extension-drag-handle Patch
@tiptap/extension-drag-handle-react Patch
@tiptap/extension-drag-handle-vue-2 Patch
@tiptap/extension-drag-handle-vue-3 Patch
@tiptap/core Patch
@tiptap/extension-audio Patch
@tiptap/extension-blockquote Patch
@tiptap/extension-bold Patch
@tiptap/extension-bubble-menu Patch
@tiptap/extension-bullet-list Patch
@tiptap/extension-code-block-lowlight Patch
@tiptap/extension-code-block Patch
@tiptap/extension-code Patch
@tiptap/extension-collaboration-caret Patch
@tiptap/extension-collaboration Patch
@tiptap/extension-color Patch
@tiptap/extension-details Patch
@tiptap/extension-document Patch
@tiptap/extension-emoji Patch
@tiptap/extension-file-handler Patch
@tiptap/extension-floating-menu Patch
@tiptap/extension-font-family Patch
@tiptap/extension-hard-break Patch
@tiptap/extension-heading Patch
@tiptap/extension-highlight Patch
@tiptap/extension-horizontal-rule Patch
@tiptap/extension-image Patch
@tiptap/extension-invisible-characters Patch
@tiptap/extension-italic Patch
@tiptap/extension-link Patch
@tiptap/extension-list Patch
@tiptap/extension-mathematics Patch
@tiptap/extension-mention Patch
@tiptap/extension-node-range Patch
@tiptap/extension-ordered-list Patch
@tiptap/extension-paragraph Patch
@tiptap/extension-strike Patch
@tiptap/extension-subscript Patch
@tiptap/extension-superscript Patch
@tiptap/extension-table-of-contents Patch
@tiptap/extension-table Patch
@tiptap/extension-text-align Patch
@tiptap/extension-text-style Patch
@tiptap/extension-text Patch
@tiptap/extension-twitch Patch
@tiptap/extension-typography Patch
@tiptap/extension-underline Patch
@tiptap/extension-unique-id Patch
@tiptap/extension-youtube Patch
@tiptap/extensions Patch
@tiptap/html Patch
@tiptap/markdown Patch
@tiptap/pm Patch
@tiptap/react Patch
@tiptap/starter-kit Patch
@tiptap/static-renderer Patch
@tiptap/suggestion Patch
@tiptap/vue-2 Patch
@tiptap/vue-3 Patch
@tiptap/extension-character-count Patch
@tiptap/extension-dropcursor Patch
@tiptap/extension-focus Patch
@tiptap/extension-gapcursor Patch
@tiptap/extension-history Patch
@tiptap/extension-list-item Patch
@tiptap/extension-list-keymap Patch
@tiptap/extension-placeholder Patch
@tiptap/extension-table-cell Patch
@tiptap/extension-table-header Patch
@tiptap/extension-table-row Patch
@tiptap/extension-task-item Patch
@tiptap/extension-task-list Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@netlify
Copy link

netlify bot commented Mar 20, 2026

Deploy Preview for tiptap-embed ready!

Name Link
🔨 Latest commit 36a39af
🔍 Latest deploy log https://app.netlify.com/projects/tiptap-embed/deploys/69bd191da351ca0008021c28
😎 Deploy Preview https://deploy-preview-7629--tiptap-embed.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

wubo added 2 commits March 20, 2026 17:51
- Set wrapper dir from dragged block (domAtPos) for mixed RTL/LTR content
- Use wrapper bounding rect for setDragImage hotspot (pointer-aligned preview)
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.

1 participant