@tiptap/extension-emoji 3.27.0 → 3.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -23598,8 +23598,56 @@ var Emoji = import_core.Node.create({
23598
23598
  new import_state.Plugin({
23599
23599
  key: new import_state.PluginKey("emoji"),
23600
23600
  props: {
23601
- // double click to select emoji doesn’t work by default
23602
- // that’s why we simulate this behavior
23601
+ // Firefox cannot move the cursor past emoji nodes at paragraph
23602
+ // boundaries using arrow keys. We intercept plain (unmodified)
23603
+ // ArrowLeft/ArrowRight and manually resolve the correct position.
23604
+ // Only handles emoji nodes — other inline non-selectable nodes
23605
+ // (mentions, hard breaks) are out of scope for this extension.
23606
+ // See: https://github.com/ProseMirror/prosemirror/issues/1220
23607
+ handleKeyDown: (view, event) => {
23608
+ if (!(0, import_core.isFirefox)()) {
23609
+ return false;
23610
+ }
23611
+ const isLeft = event.key === "ArrowLeft";
23612
+ const isRight = event.key === "ArrowRight";
23613
+ if (!isLeft && !isRight) {
23614
+ return false;
23615
+ }
23616
+ if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) {
23617
+ return false;
23618
+ }
23619
+ const { state } = view;
23620
+ const { selection } = state;
23621
+ if (!selection.empty || !(selection instanceof import_state.TextSelection)) {
23622
+ return false;
23623
+ }
23624
+ const $pos = selection.$from;
23625
+ const emojiType = this.type;
23626
+ if (isLeft) {
23627
+ const nodeBefore = $pos.nodeBefore;
23628
+ if (!nodeBefore || nodeBefore.type !== emojiType) {
23629
+ return false;
23630
+ }
23631
+ const newPos = $pos.pos - nodeBefore.nodeSize;
23632
+ if (newPos >= $pos.start()) {
23633
+ view.dispatch(state.tr.setSelection(import_state.TextSelection.create(state.doc, newPos)));
23634
+ return true;
23635
+ }
23636
+ } else {
23637
+ const nodeAfter = $pos.nodeAfter;
23638
+ if (!nodeAfter || nodeAfter.type !== emojiType) {
23639
+ return false;
23640
+ }
23641
+ const newPos = $pos.pos + nodeAfter.nodeSize;
23642
+ if (newPos <= $pos.end()) {
23643
+ view.dispatch(state.tr.setSelection(import_state.TextSelection.create(state.doc, newPos)));
23644
+ return true;
23645
+ }
23646
+ }
23647
+ return false;
23648
+ },
23649
+ // double click to select emoji doesn't work by default
23650
+ // that's why we simulate this behavior
23603
23651
  handleDoubleClickOn: (view, pos, node) => {
23604
23652
  if (node.type !== this.type) {
23605
23653
  return false;