@tiptap/extension-emoji 3.27.1 → 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 +50 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +52 -3
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
- package/src/emoji.ts +71 -3
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
|
-
//
|
|
23602
|
-
//
|
|
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;
|