@portabletext/editor 1.36.6 → 1.38.0

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.
Files changed (119) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +84 -49
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +1 -1
  4. package/lib/_chunks-cjs/editor-provider.cjs +919 -526
  5. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  6. package/lib/_chunks-cjs/{util.block-offsets-to-selection.cjs → parse-blocks.cjs} +36 -21
  7. package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -0
  8. package/lib/_chunks-cjs/selector.get-text-before.cjs +2 -2
  9. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  10. package/lib/_chunks-cjs/{selector.is-active-style.cjs → selector.is-overlapping-selection.cjs} +144 -3
  11. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -0
  12. package/lib/_chunks-cjs/util.slice-blocks.cjs +12 -0
  13. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  14. package/lib/_chunks-es/behavior.core.js +84 -49
  15. package/lib/_chunks-es/behavior.core.js.map +1 -1
  16. package/lib/_chunks-es/behavior.markdown.js +1 -1
  17. package/lib/_chunks-es/editor-provider.js +911 -517
  18. package/lib/_chunks-es/editor-provider.js.map +1 -1
  19. package/lib/_chunks-es/{util.block-offsets-to-selection.js → parse-blocks.js} +37 -22
  20. package/lib/_chunks-es/parse-blocks.js.map +1 -0
  21. package/lib/_chunks-es/selector.get-text-before.js +1 -2
  22. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  23. package/lib/_chunks-es/{selector.is-active-style.js → selector.is-overlapping-selection.js} +146 -5
  24. package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -0
  25. package/lib/_chunks-es/util.slice-blocks.js +12 -0
  26. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  27. package/lib/behaviors/index.d.cts +10535 -4689
  28. package/lib/behaviors/index.d.ts +10535 -4689
  29. package/lib/index.cjs +582 -209
  30. package/lib/index.cjs.map +1 -1
  31. package/lib/index.d.cts +5297 -1178
  32. package/lib/index.d.ts +5297 -1178
  33. package/lib/index.js +591 -213
  34. package/lib/index.js.map +1 -1
  35. package/lib/plugins/index.cjs +2 -2
  36. package/lib/plugins/index.cjs.map +1 -1
  37. package/lib/plugins/index.d.cts +5297 -1178
  38. package/lib/plugins/index.d.ts +5297 -1178
  39. package/lib/plugins/index.js +2 -2
  40. package/lib/selectors/index.cjs +21 -103
  41. package/lib/selectors/index.cjs.map +1 -1
  42. package/lib/selectors/index.d.cts +5313 -1178
  43. package/lib/selectors/index.d.ts +5313 -1178
  44. package/lib/selectors/index.js +13 -96
  45. package/lib/selectors/index.js.map +1 -1
  46. package/lib/utils/index.cjs +4 -4
  47. package/lib/utils/index.cjs.map +1 -1
  48. package/lib/utils/index.d.cts +5297 -1178
  49. package/lib/utils/index.d.ts +5297 -1178
  50. package/lib/utils/index.js +3 -4
  51. package/lib/utils/index.js.map +1 -1
  52. package/package.json +15 -14
  53. package/src/behavior-actions/behavior.action.blur.ts +8 -0
  54. package/src/behavior-actions/behavior.action.decorator.add.ts +2 -1
  55. package/src/behavior-actions/behavior.action.delete.backward.ts +7 -0
  56. package/src/behavior-actions/behavior.action.delete.block.ts +24 -0
  57. package/src/behavior-actions/behavior.action.delete.forward.ts +7 -0
  58. package/src/behavior-actions/behavior.action.delete.text.ts +2 -1
  59. package/src/behavior-actions/behavior.action.delete.ts +1 -3
  60. package/src/behavior-actions/behavior.action.deserialization.failure.ts +9 -0
  61. package/src/behavior-actions/behavior.action.deserialization.success.ts +16 -0
  62. package/src/behavior-actions/behavior.action.effect.ts +7 -0
  63. package/src/behavior-actions/behavior.action.focus.ts +8 -0
  64. package/src/behavior-actions/behavior.action.insert-blocks.ts +118 -74
  65. package/src/behavior-actions/behavior.action.insert-break.ts +1 -0
  66. package/src/behavior-actions/{behavior.action.insert-block-object.ts → behavior.action.insert.block-object.ts} +9 -14
  67. package/src/behavior-actions/behavior.action.insert.block.ts +247 -2
  68. package/src/behavior-actions/behavior.action.insert.text-block.ts +33 -0
  69. package/src/behavior-actions/behavior.action.insert.text.ts +7 -0
  70. package/src/behavior-actions/behavior.action.move.block-down.ts +48 -0
  71. package/src/behavior-actions/behavior.action.move.block-up.ts +53 -0
  72. package/src/behavior-actions/behavior.action.move.block.ts +16 -0
  73. package/src/behavior-actions/behavior.action.noop.ts +5 -0
  74. package/src/behavior-actions/behavior.action.select.next-block.ts +44 -0
  75. package/src/behavior-actions/behavior.action.select.previous-block.ts +48 -0
  76. package/src/behavior-actions/behavior.action.select.ts +15 -0
  77. package/src/behavior-actions/behavior.action.serialization.failure.ts +9 -0
  78. package/src/behavior-actions/behavior.action.serialization.success.ts +14 -0
  79. package/src/behavior-actions/behavior.actions.ts +54 -212
  80. package/src/behaviors/behavior.core.block-objects.ts +35 -6
  81. package/src/behaviors/behavior.core.insert-break.ts +1 -0
  82. package/src/behaviors/behavior.core.ts +2 -0
  83. package/src/behaviors/behavior.default.ts +241 -33
  84. package/src/behaviors/behavior.types.ts +138 -20
  85. package/src/converters/converter.portable-text.ts +5 -2
  86. package/src/converters/converter.text-html.serialize.test.ts +4 -4
  87. package/src/converters/converter.text-html.ts +5 -2
  88. package/src/converters/converter.text-plain.test.ts +6 -6
  89. package/src/converters/converter.text-plain.ts +5 -2
  90. package/src/converters/converter.types.ts +3 -3
  91. package/src/editor/Editable.tsx +403 -48
  92. package/src/editor/components/Element.tsx +133 -18
  93. package/src/editor/components/use-draggable.ts +34 -102
  94. package/src/editor/editor-machine.ts +66 -10
  95. package/src/editor/editor-selector.ts +2 -0
  96. package/src/editor/editor-snapshot.ts +17 -0
  97. package/src/editor/plugins/create-with-event-listeners.ts +6 -40
  98. package/src/internal-utils/create-test-snapshot.ts +2 -0
  99. package/src/internal-utils/event-position.ts +210 -0
  100. package/src/internal-utils/slate-utils.ts +56 -0
  101. package/src/internal-utils/weakMaps.ts +1 -15
  102. package/src/selectors/index.ts +2 -0
  103. package/src/selectors/selector.get-focus-inline-object.ts +21 -0
  104. package/src/selectors/selector.is-overlapping-selection.test.ts +171 -0
  105. package/src/selectors/selector.is-overlapping-selection.ts +108 -4
  106. package/src/selectors/selector.is-point-after-selection.ts +3 -1
  107. package/src/selectors/selector.is-point-before-selection.ts +3 -1
  108. package/src/selectors/selector.is-selecting-entire-blocks.ts +34 -0
  109. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +0 -1
  110. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +0 -1
  111. package/lib/_chunks-cjs/util.reverse-selection.cjs +0 -14
  112. package/lib/_chunks-cjs/util.reverse-selection.cjs.map +0 -1
  113. package/lib/_chunks-es/selector.is-active-style.js.map +0 -1
  114. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +0 -1
  115. package/lib/_chunks-es/util.reverse-selection.js +0 -15
  116. package/lib/_chunks-es/util.reverse-selection.js.map +0 -1
  117. package/src/behavior-actions/behavior.action-utils.insert-block.ts +0 -61
  118. package/src/editor/__tests__/handleClick.test.tsx +0 -277
  119. package/src/editor/components/use-droppable.ts +0 -135
package/lib/index.cjs CHANGED
@@ -1,10 +1,116 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var editorProvider = require("./_chunks-cjs/editor-provider.cjs"), jsxRuntime = require("react/jsx-runtime"), react = require("@xstate/react"), isEqual = require("lodash/isEqual.js"), noop = require("lodash/noop.js"), React = require("react"), slate = require("slate"), slateReact = require("slate-react"), reactCompilerRuntime = require("react-compiler-runtime"), uniq = require("lodash/uniq.js"), behavior_core = require("./_chunks-cjs/behavior.core.cjs"), useEffectEvent = require("use-effect-event");
3
+ var editorProvider = require("./_chunks-cjs/editor-provider.cjs"), jsxRuntime = require("react/jsx-runtime"), react = require("@xstate/react"), isEqual = require("lodash/isEqual.js"), noop = require("lodash/noop.js"), React = require("react"), slate = require("slate"), slateReact = require("slate-react"), slateDom = require("slate-dom"), util_sliceBlocks = require("./_chunks-cjs/util.slice-blocks.cjs"), selector_isAtTheStartOfBlock = require("./_chunks-cjs/selector.is-at-the-start-of-block.cjs"), parseBlocks = require("./_chunks-cjs/parse-blocks.cjs"), selector_isOverlappingSelection = require("./_chunks-cjs/selector.is-overlapping-selection.cjs"), behavior_core = require("./_chunks-cjs/behavior.core.cjs"), reactCompilerRuntime = require("react-compiler-runtime"), uniq = require("lodash/uniq.js"), useEffectEvent = require("use-effect-event");
4
4
  function _interopDefaultCompat(e) {
5
5
  return e && typeof e == "object" && "default" in e ? e : { default: e };
6
6
  }
7
7
  var isEqual__default = /* @__PURE__ */ _interopDefaultCompat(isEqual), noop__default = /* @__PURE__ */ _interopDefaultCompat(noop), uniq__default = /* @__PURE__ */ _interopDefaultCompat(uniq);
8
+ function getEventPosition({
9
+ snapshot,
10
+ slateEditor,
11
+ event
12
+ }) {
13
+ if (!slateDom.DOMEditor.hasTarget(slateEditor, event.target))
14
+ return;
15
+ const node = slateDom.DOMEditor.toSlateNode(slateEditor, event.target);
16
+ if (isClipboardEvent(event)) {
17
+ const selection2 = snapshot.context.selection;
18
+ return selection2 ? {
19
+ block: "end",
20
+ isEditor: slate.Editor.isEditor(node),
21
+ selection: selection2
22
+ } : void 0;
23
+ }
24
+ const block = getEventPositionBlock({
25
+ slateEditor,
26
+ event
27
+ }), selection = getEventPositionSelection({
28
+ snapshot,
29
+ slateEditor,
30
+ event
31
+ });
32
+ if (!(!block || !selection))
33
+ return {
34
+ block,
35
+ isEditor: slate.Editor.isEditor(node),
36
+ selection
37
+ };
38
+ }
39
+ function getEventPositionBlock({
40
+ slateEditor,
41
+ event
42
+ }) {
43
+ if (!slateReact.ReactEditor.hasTarget(slateEditor, event.target))
44
+ return;
45
+ const node = slateReact.ReactEditor.toSlateNode(slateEditor, event.target), elementRect = slateReact.ReactEditor.toDOMNode(slateEditor, node).getBoundingClientRect(), top = elementRect.top, height = elementRect.height;
46
+ return Math.abs(top - event.pageY) < height / 2 ? "start" : "end";
47
+ }
48
+ function getEventPositionSelection({
49
+ snapshot,
50
+ slateEditor,
51
+ event
52
+ }) {
53
+ const range = getSlateRangeFromEvent(slateEditor, event), selection = range ? editorProvider.toPortableTextRange(snapshot.context.value, range, snapshot.context.schema) : null;
54
+ if (!selection)
55
+ return selection;
56
+ const collapsedSelection = selector_isAtTheStartOfBlock.isSelectionCollapsed({
57
+ ...snapshot,
58
+ context: {
59
+ ...snapshot.context,
60
+ selection
61
+ }
62
+ }), focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock({
63
+ ...snapshot,
64
+ context: {
65
+ ...snapshot.context,
66
+ selection
67
+ }
68
+ }), focusSpan = selector_isAtTheStartOfBlock.getFocusSpan({
69
+ ...snapshot,
70
+ context: {
71
+ ...snapshot.context,
72
+ selection
73
+ }
74
+ });
75
+ if (event.type === "dragstart" && collapsedSelection && focusTextBlock && focusSpan) {
76
+ const blockStartPoint = util_sliceBlocks.getBlockStartPoint(focusTextBlock), blockEndPoint = util_sliceBlocks.getBlockEndPoint(focusTextBlock);
77
+ return {
78
+ anchor: blockStartPoint,
79
+ focus: blockEndPoint
80
+ };
81
+ }
82
+ return selection;
83
+ }
84
+ function getSlateRangeFromEvent(editor, event) {
85
+ if (!event.target || !slateDom.isDOMNode(event.target))
86
+ return;
87
+ const window2 = slateDom.DOMEditor.getWindow(editor);
88
+ let domRange;
89
+ if (window2.document.caretPositionFromPoint !== void 0) {
90
+ const position = window2.document.caretPositionFromPoint(event.clientX, event.clientY);
91
+ position && (domRange = window2.document.createRange(), domRange.setStart(position.offsetNode, position.offset), domRange.setEnd(position.offsetNode, position.offset));
92
+ } else if (window2.document.caretRangeFromPoint !== void 0)
93
+ domRange = window2.document.caretRangeFromPoint(event.clientX, event.clientY) ?? void 0;
94
+ else {
95
+ console.warn("Neither caretPositionFromPoint nor caretRangeFromPoint is supported");
96
+ return;
97
+ }
98
+ if (!domRange)
99
+ return;
100
+ let range;
101
+ try {
102
+ range = slateDom.DOMEditor.toSlateRange(editor, domRange, {
103
+ exactMatch: !1,
104
+ // It can still throw even with this option set to true
105
+ suppressThrow: !1
106
+ });
107
+ } catch {
108
+ }
109
+ return range;
110
+ }
111
+ function isClipboardEvent(event) {
112
+ return event.type === "copy" || event.type === "cut" || event.type === "paste";
113
+ }
8
114
  function normalizePoint(point, value) {
9
115
  if (!point || !value)
10
116
  return null;
@@ -92,146 +198,69 @@ function DropIndicator() {
92
198
  zIndex: 5
93
199
  } }), $[0] = t0) : t0 = $[0], t0;
94
200
  }
95
- const debug$4 = editorProvider.debugWithName("useDraggable");
96
201
  function useDraggable(props) {
97
- const $ = reactCompilerRuntime.c(20), editor = slateReact.useSlateStatic(), dragGhostRef = React.useRef(void 0), [blockElement, setBlockElement] = React.useState(null);
202
+ const $ = reactCompilerRuntime.c(15), editorActor = React.useContext(editorProvider.EditorActorContext), editor = slateReact.useSlateStatic(), [blockElement, setBlockElement] = React.useState(null);
98
203
  let t0, t1;
99
204
  $[0] !== editor || $[1] !== props.blockRef || $[2] !== props.element ? (t0 = () => setBlockElement(props.blockRef ? props.blockRef.current : slateReact.ReactEditor.toDOMNode(editor, props.element)), t1 = [editor, props.element, props.blockRef], $[0] = editor, $[1] = props.blockRef, $[2] = props.element, $[3] = t0, $[4] = t1) : (t0 = $[3], t1 = $[4]), React.useEffect(t0, t1);
100
205
  let t2;
101
- $[5] !== editor || $[6] !== props.element ? (t2 = (event) => {
102
- const targetBlock = editorProvider.IS_DRAGGING_ELEMENT_TARGET.get(editor);
103
- if (targetBlock) {
104
- editorProvider.IS_DRAGGING.set(editor, !1), event.preventDefault(), event.stopPropagation(), editorProvider.IS_DRAGGING_ELEMENT_TARGET.delete(editor), dragGhostRef.current && (debug$4("Removing drag ghost"), document.body.removeChild(dragGhostRef.current));
105
- const dragPosition = editorProvider.IS_DRAGGING_BLOCK_TARGET_POSITION.get(editor);
106
- editorProvider.IS_DRAGGING_BLOCK_TARGET_POSITION.delete(editor);
107
- let targetPath = slateReact.ReactEditor.findPath(editor, targetBlock);
108
- const myPath = slateReact.ReactEditor.findPath(editor, props.element), isBefore = slate.Path.isBefore(myPath, targetPath);
109
- if (dragPosition === "bottom" && !isBefore) {
110
- if (targetPath[0] >= editor.children.length - 1) {
111
- debug$4("target is already at the bottom, not moving");
112
- return;
113
- }
114
- const originalPath = targetPath;
115
- targetPath = slate.Path.next(targetPath), debug$4(`Adjusting targetPath from ${JSON.stringify(originalPath)} to ${JSON.stringify(targetPath)}`);
116
- }
117
- if (dragPosition === "top" && isBefore && targetPath[0] !== editor.children.length - 1) {
118
- const originalPath_0 = targetPath;
119
- targetPath = slate.Path.previous(targetPath), debug$4(`Adjusting targetPath from ${JSON.stringify(originalPath_0)} to ${JSON.stringify(targetPath)}`);
120
- }
121
- if (slate.Path.equals(targetPath, myPath)) {
122
- event.preventDefault(), debug$4("targetPath and myPath is the same, not moving");
123
- return;
124
- }
125
- debug$4(`Moving element ${props.element._key} from path ${JSON.stringify(myPath)} to ${JSON.stringify(targetPath)} (${dragPosition})`), slate.Transforms.moveNodes(editor, {
126
- at: myPath,
127
- to: targetPath
128
- }), editor.onChange();
129
- return;
130
- }
131
- debug$4("No target element, not doing anything");
132
- }, $[5] = editor, $[6] = props.element, $[7] = t2) : t2 = $[7];
206
+ $[5] !== editorActor ? (t2 = () => {
207
+ editorActor.send({
208
+ type: "dragend"
209
+ });
210
+ }, $[5] = editorActor, $[6] = t2) : t2 = $[6];
133
211
  const handleDragEnd = t2;
134
212
  let t3;
135
- $[8] !== editor || $[9] !== props.element ? (t3 = (event_0) => {
136
- editorProvider.IS_DRAGGING.set(editor, !0), editorProvider.IS_DRAGGING_BLOCK_ELEMENT.set(editor, props.element), event_0.stopPropagation();
137
- const target = event_0.target;
138
- target instanceof HTMLElement && (target.style.opacity = "1");
139
- }, $[8] = editor, $[9] = props.element, $[10] = t3) : t3 = $[10];
140
- const handleDrag = t3;
141
- let t4;
142
- $[11] !== blockElement || $[12] !== editor || $[13] !== handleDrag ? (t4 = (event_1) => {
143
- if (debug$4("Drag start"), editorProvider.IS_DRAGGING.set(editor, !0), event_1.dataTransfer && (event_1.dataTransfer.setData("application/portable-text", "something"), event_1.dataTransfer.effectAllowed = "move"), blockElement && blockElement instanceof HTMLElement) {
213
+ $[7] !== blockElement || $[8] !== editor || $[9] !== editorActor ? (t3 = (event) => {
214
+ const position = getEventPosition({
215
+ snapshot: editorProvider.getEditorSnapshot({
216
+ editorActorSnapshot: editorActor.getSnapshot(),
217
+ slateEditorInstance: editor
218
+ }),
219
+ slateEditor: editor,
220
+ event: event.nativeEvent
221
+ });
222
+ if (!position) {
223
+ console.error("Could not find position for dragstart event");
224
+ return;
225
+ }
226
+ if (blockElement && blockElement instanceof HTMLElement) {
144
227
  let dragGhost = blockElement.cloneNode(!0);
145
228
  const customGhost = dragGhost.querySelector("[data-pt-drag-ghost-element]");
146
229
  if (customGhost && (dragGhost = customGhost), dragGhost.setAttribute("data-dragged", ""), document.body) {
147
- dragGhostRef.current = dragGhost, dragGhost.style.position = "absolute", dragGhost.style.left = "-99999px", dragGhost.style.boxSizing = "border-box", document.body.appendChild(dragGhost);
148
- const rect = blockElement.getBoundingClientRect(), x = event_1.clientX - rect.left, y = event_1.clientY - rect.top;
149
- dragGhost.style.width = `${rect.width}px`, dragGhost.style.height = `${rect.height}px`, event_1.dataTransfer.setDragImage(dragGhost, x, y);
230
+ dragGhost.style.position = "absolute", dragGhost.style.left = "-99999px", dragGhost.style.boxSizing = "border-box", document.body.appendChild(dragGhost);
231
+ const rect = blockElement.getBoundingClientRect(), x = event.clientX - rect.left, y = event.clientY - rect.top;
232
+ dragGhost.style.width = `${rect.width}px`, dragGhost.style.height = `${rect.height}px`, event.dataTransfer.setDragImage(dragGhost, x, y), editorActor.send({
233
+ type: "dragstart",
234
+ origin: position,
235
+ ghost: dragGhost
236
+ });
237
+ return;
150
238
  }
239
+ editorActor.send({
240
+ type: "dragstart",
241
+ origin: position
242
+ });
151
243
  }
152
- handleDrag(event_1);
153
- }, $[11] = blockElement, $[12] = editor, $[13] = handleDrag, $[14] = t4) : t4 = $[14];
154
- const handleDragStart = t4;
244
+ }, $[7] = blockElement, $[8] = editor, $[9] = editorActor, $[10] = t3) : t3 = $[10];
245
+ const handleDragStart = t3;
155
246
  if (props.readOnly) {
156
- let t52;
157
- return $[15] === Symbol.for("react.memo_cache_sentinel") ? (t52 = {
247
+ let t42;
248
+ return $[11] === Symbol.for("react.memo_cache_sentinel") ? (t42 = {
158
249
  draggableProps: {
159
250
  draggable: !1,
160
251
  onDragStart: void 0,
161
- onDrag: void 0,
162
252
  onDragEnd: void 0
163
253
  }
164
- }, $[15] = t52) : t52 = $[15], t52;
254
+ }, $[11] = t42) : t42 = $[11], t42;
165
255
  }
166
- let t5;
167
- return $[16] !== handleDrag || $[17] !== handleDragEnd || $[18] !== handleDragStart ? (t5 = {
256
+ let t4;
257
+ return $[12] !== handleDragEnd || $[13] !== handleDragStart ? (t4 = {
168
258
  draggableProps: {
169
259
  draggable: !0,
170
260
  onDragStart: handleDragStart,
171
- onDrag: handleDrag,
172
261
  onDragEnd: handleDragEnd
173
262
  }
174
- }, $[16] = handleDrag, $[17] = handleDragEnd, $[18] = handleDragStart, $[19] = t5) : t5 = $[19], t5;
175
- }
176
- const debug$3 = editorProvider.debugWithName("useDroppable");
177
- function useDroppable(props) {
178
- const $ = reactCompilerRuntime.c(27), editor = slateReact.useSlateStatic(), [isDragOver, setIsDragOver] = React.useState(!1), [blockElement, setBlockElement] = React.useState(null);
179
- let t0, t1;
180
- $[0] !== editor || $[1] !== props.blockRef || $[2] !== props.element ? (t0 = () => setBlockElement(props.blockRef ? props.blockRef.current : slateReact.ReactEditor.toDOMNode(editor, props.element)), t1 = [editor, props.element, props.blockRef], $[0] = editor, $[1] = props.blockRef, $[2] = props.element, $[3] = t0, $[4] = t1) : (t0 = $[3], t1 = $[4]), React.useEffect(t0, t1);
181
- let t2;
182
- $[5] !== blockElement || $[6] !== editor || $[7] !== props.element ? (t2 = (event) => {
183
- const isMyDragOver = editorProvider.IS_DRAGGING_BLOCK_ELEMENT.get(editor);
184
- if (!isMyDragOver || !blockElement)
185
- return;
186
- event.preventDefault(), event.dataTransfer.dropEffect = "move", editorProvider.IS_DRAGGING_ELEMENT_TARGET.set(editor, props.element);
187
- const elementRect = blockElement.getBoundingClientRect(), offset = elementRect.top, height = elementRect.height, Y = event.pageY, loc = Math.abs(offset - Y);
188
- if (props.element === editor.children[0] || (loc < height / 2 ? editorProvider.IS_DRAGGING_BLOCK_TARGET_POSITION.set(editor, "top") : editorProvider.IS_DRAGGING_BLOCK_TARGET_POSITION.set(editor, "bottom")), isMyDragOver === props.element) {
189
- event.dataTransfer.dropEffect = "none";
190
- return;
191
- }
192
- setIsDragOver(!0);
193
- }, $[5] = blockElement, $[6] = editor, $[7] = props.element, $[8] = t2) : t2 = $[8];
194
- const handleDragOver = t2;
195
- let t3;
196
- $[9] === Symbol.for("react.memo_cache_sentinel") ? (t3 = () => {
197
- setIsDragOver(!1);
198
- }, $[9] = t3) : t3 = $[9];
199
- const handleDragLeave = t3;
200
- let t4;
201
- $[10] !== editor || $[11] !== props.element ? (t4 = (event_0) => {
202
- editorProvider.IS_DRAGGING_BLOCK_ELEMENT.get(editor) && (debug$3("On drop (prevented)", props.element), event_0.preventDefault(), event_0.stopPropagation(), setIsDragOver(!1));
203
- }, $[10] = editor, $[11] = props.element, $[12] = t4) : t4 = $[12];
204
- const handleDrop = t4;
205
- let t5;
206
- $[13] !== editor || $[14] !== isDragOver ? (t5 = isDragOver && editor.children[0] === editorProvider.IS_DRAGGING_ELEMENT_TARGET.get(editor), $[13] = editor, $[14] = isDragOver, $[15] = t5) : t5 = $[15];
207
- const isDraggingOverFirstBlock = t5;
208
- let t6;
209
- $[16] !== editor || $[17] !== isDragOver ? (t6 = isDragOver && editor.children[editor.children.length - 1] === editorProvider.IS_DRAGGING_ELEMENT_TARGET.get(editor), $[16] = editor, $[17] = isDragOver, $[18] = t6) : t6 = $[18];
210
- const isDraggingOverLastBlock = t6, dragPosition = editorProvider.IS_DRAGGING_BLOCK_TARGET_POSITION.get(editor), isDraggingOverTop = isDraggingOverFirstBlock || isDragOver && !isDraggingOverFirstBlock && !isDraggingOverLastBlock && dragPosition === "top", isDraggingOverBottom = isDraggingOverLastBlock || isDragOver && !isDraggingOverFirstBlock && !isDraggingOverLastBlock && dragPosition === "bottom";
211
- if (props.readOnly) {
212
- let t72;
213
- return $[19] === Symbol.for("react.memo_cache_sentinel") ? (t72 = {
214
- droppableProps: {
215
- onDragOver: void 0,
216
- onDragLeave: void 0,
217
- onDrop: void 0
218
- },
219
- isDraggingOverTop: !1,
220
- isDraggingOverBottom: !1
221
- }, $[19] = t72) : t72 = $[19], t72;
222
- }
223
- let t7;
224
- $[20] !== handleDragOver || $[21] !== handleDrop ? (t7 = {
225
- onDragOver: handleDragOver,
226
- onDragLeave: handleDragLeave,
227
- onDrop: handleDrop
228
- }, $[20] = handleDragOver, $[21] = handleDrop, $[22] = t7) : t7 = $[22];
229
- let t8;
230
- return $[23] !== isDraggingOverBottom || $[24] !== isDraggingOverTop || $[25] !== t7 ? (t8 = {
231
- droppableProps: t7,
232
- isDraggingOverTop,
233
- isDraggingOverBottom
234
- }, $[23] = isDraggingOverBottom, $[24] = isDraggingOverTop, $[25] = t7, $[26] = t8) : t8 = $[26], t8;
263
+ }, $[12] = handleDragEnd, $[13] = handleDragStart, $[14] = t4) : t4 = $[14], t4;
235
264
  }
236
265
  editorProvider.debugWithName("components:Element");
237
266
  const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
@@ -248,15 +277,86 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
248
277
  renderStyle,
249
278
  spellCheck
250
279
  }) => {
251
- const editor = slateReact.useSlateStatic(), selected = slateReact.useSelected(), blockRef = React.useRef(null), inlineBlockObjectRef = React.useRef(null), focused = selected && editor.selection && slate.Range.isCollapsed(editor.selection) || !1, droppable = useDroppable({
280
+ const editorActor = React.useContext(editorProvider.EditorActorContext), slateEditor = slateReact.useSlateStatic(), selected = slateReact.useSelected(), blockRef = React.useRef(null), inlineBlockObjectRef = React.useRef(null), focused = selected && slateEditor.selection && slate.Range.isCollapsed(slateEditor.selection) || !1, [dragPositionBlock, setDragPositionBlock] = React.useState(), draggable = useDraggable({
252
281
  element,
253
- blockRef,
254
- readOnly
255
- }), draggable = useDraggable({
256
- element,
257
- blockRef,
258
- readOnly
259
- }), value = React.useMemo(() => editorProvider.fromSlateValue([element], schemaTypes.block.name, editorProvider.KEY_TO_VALUE_ELEMENT.get(editor))[0], [editor, element, schemaTypes.block.name]);
282
+ readOnly,
283
+ blockRef
284
+ });
285
+ React.useEffect(() => {
286
+ const behavior = behavior_core.defineBehavior({
287
+ on: "drag.dragover",
288
+ guard: ({
289
+ snapshot,
290
+ event
291
+ }) => {
292
+ const dropFocusBlock = selector_isAtTheStartOfBlock.getFocusBlock({
293
+ ...snapshot,
294
+ context: {
295
+ ...snapshot.context,
296
+ selection: event.position.selection
297
+ }
298
+ });
299
+ if (!dropFocusBlock || dropFocusBlock.node._key !== element._key)
300
+ return !1;
301
+ const dragOrigin = snapshot.beta.internalDrag?.origin;
302
+ return !dragOrigin || selector_isAtTheStartOfBlock.getSelectedBlocks({
303
+ ...snapshot,
304
+ context: {
305
+ ...snapshot.context,
306
+ selection: dragOrigin.selection
307
+ }
308
+ }).some((draggedBlock) => draggedBlock.node._key === element._key) ? !1 : selector_isOverlappingSelection.isSelectingEntireBlocks({
309
+ ...snapshot,
310
+ context: {
311
+ ...snapshot.context,
312
+ selection: dragOrigin.selection
313
+ }
314
+ });
315
+ },
316
+ actions: [({
317
+ event: event_0
318
+ }) => [{
319
+ type: "effect",
320
+ effect: () => {
321
+ setDragPositionBlock(event_0.position.block);
322
+ }
323
+ }, {
324
+ type: "noop"
325
+ }]]
326
+ });
327
+ return editorActor.send({
328
+ type: "add behavior",
329
+ behavior
330
+ }), () => {
331
+ editorActor.send({
332
+ type: "remove behavior",
333
+ behavior
334
+ });
335
+ };
336
+ }, [editorActor, element._key]), React.useEffect(() => {
337
+ const behavior_0 = behavior_core.defineBehavior({
338
+ on: "drag.*",
339
+ guard: ({
340
+ event: event_1
341
+ }) => event_1.type !== "drag.dragover",
342
+ actions: [() => [{
343
+ type: "effect",
344
+ effect: () => {
345
+ setDragPositionBlock(void 0);
346
+ }
347
+ }]]
348
+ });
349
+ return editorActor.send({
350
+ type: "add behavior",
351
+ behavior: behavior_0
352
+ }), () => {
353
+ editorActor.send({
354
+ type: "remove behavior",
355
+ behavior: behavior_0
356
+ });
357
+ };
358
+ }, [editorActor]);
359
+ const value = React.useMemo(() => editorProvider.fromSlateValue([element], schemaTypes.block.name, editorProvider.KEY_TO_VALUE_ELEMENT.get(slateEditor))[0], [slateEditor, element, schemaTypes.block.name]);
260
360
  let renderedBlock = children, className;
261
361
  const blockPath = React.useMemo(() => [{
262
362
  _key: element._key
@@ -265,8 +365,8 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
265
365
  throw new Error("Expected element to have a _type property");
266
366
  if (typeof element._key != "string")
267
367
  throw new Error("Expected element to have a _key property");
268
- if (editor.isInline(element)) {
269
- const path = slateReact.ReactEditor.findPath(editor, element), [block] = slate.Editor.node(editor, path, {
368
+ if (slateEditor.isInline(element)) {
369
+ const path = slateReact.ReactEditor.findPath(slateEditor, element), [block] = slate.Editor.node(slateEditor, path, {
270
370
  depth: 1
271
371
  }), schemaType = schemaTypes.inlineObjects.find((_type) => _type.name === element._type);
272
372
  if (!schemaType)
@@ -314,7 +414,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
314
414
  editorElementRef: blockRef
315
415
  }));
316
416
  let level;
317
- if (isListItem && (typeof element.level == "number" && (level = element.level), className += ` pt-list-item pt-list-item-${element.listItem} pt-list-item-level-${level || 1}`), editor.isListBlock(value) && isListItem && element.listItem) {
417
+ if (isListItem && (typeof element.level == "number" && (level = element.level), className += ` pt-list-item pt-list-item-${element.listItem} pt-list-item-level-${level || 1}`), slateEditor.isListBlock(value) && isListItem && element.listItem) {
318
418
  const listType = schemaTypes.lists.find((item_0) => item_0.value === element.listItem);
319
419
  renderListItem && listType && (renderedBlock = renderListItem({
320
420
  block: value,
@@ -345,17 +445,17 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
345
445
  return console.warn("Property 'type' is deprecated, use 'schemaType' instead."), schemaTypes.block;
346
446
  }
347
447
  }), propsOrDefaultRendered = renderBlock ? renderBlock(renderProps) : children;
348
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...attributes, className, spellCheck, ...droppable.droppableProps, children: [
349
- droppable.isDraggingOverTop ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null,
448
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...attributes, className, spellCheck, children: [
449
+ dragPositionBlock === "start" ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null,
350
450
  /* @__PURE__ */ jsxRuntime.jsx("div", { ref: blockRef, children: propsOrDefaultRendered }),
351
- droppable.isDraggingOverBottom ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null
451
+ dragPositionBlock === "end" ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null
352
452
  ] }, element._key);
353
453
  }
354
454
  const schemaType_0 = schemaTypes.blockObjects.find((_type_0) => _type_0.name === element._type);
355
455
  if (!schemaType_0)
356
456
  throw new Error(`Could not find schema type for block element of _type ${element._type}`);
357
457
  className = "pt-block pt-object-block";
358
- const block_0 = editorProvider.fromSlateValue([element], schemaTypes.block.name, editorProvider.KEY_TO_VALUE_ELEMENT.get(editor))[0];
458
+ const block_0 = editorProvider.fromSlateValue([element], schemaTypes.block.name, editorProvider.KEY_TO_VALUE_ELEMENT.get(slateEditor))[0];
359
459
  let renderedBlockFromProps;
360
460
  if (renderBlock) {
361
461
  const _props = Object.defineProperty({
@@ -374,11 +474,11 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
374
474
  });
375
475
  renderedBlockFromProps = renderBlock(_props);
376
476
  }
377
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...attributes, className, ...droppable.droppableProps, ...draggable.draggableProps, children: [
378
- droppable.isDraggingOverTop ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null,
477
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...attributes, className, ...draggable.draggableProps, children: [
478
+ dragPositionBlock === "start" ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null,
379
479
  children,
380
480
  /* @__PURE__ */ jsxRuntime.jsx("div", { ref: blockRef, contentEditable: !1, children: renderedBlockFromProps || /* @__PURE__ */ jsxRuntime.jsx(DefaultBlockObject, { value }) }),
381
- droppable.isDraggingOverBottom ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null
481
+ dragPositionBlock === "end" ? /* @__PURE__ */ jsxRuntime.jsx(DropIndicator, {}) : null
382
482
  ] }, element._key);
383
483
  };
384
484
  Element.displayName = "Element";
@@ -576,7 +676,15 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
576
676
  onBeforeInput,
577
677
  onPaste,
578
678
  onCopy,
679
+ onCut,
579
680
  onClick,
681
+ onDragStart,
682
+ onDrag,
683
+ onDragEnd,
684
+ onDragEnter,
685
+ onDragOver,
686
+ onDrop,
687
+ onDragLeave,
580
688
  rangeDecorations,
581
689
  renderAnnotation,
582
690
  renderBlock,
@@ -688,47 +796,151 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
688
796
  return () => teardown();
689
797
  }, [editorActor, slateEditor, syncRangeDecorations]);
690
798
  const handleCopy = React.useCallback((event) => {
691
- onCopy ? onCopy(event) !== void 0 && event.preventDefault() : event.nativeEvent.clipboardData && editorActor.send({
692
- type: "behavior event",
693
- behaviorEvent: {
694
- type: "copy",
695
- data: event.nativeEvent.clipboardData
696
- },
697
- editor: slateEditor,
698
- nativeEvent: event
699
- });
700
- }, [onCopy, editorActor, slateEditor]), handlePaste = React.useCallback((event_0) => {
799
+ if (onCopy)
800
+ onCopy(event) !== void 0 && event.preventDefault();
801
+ else if (event.nativeEvent.clipboardData) {
802
+ event.stopPropagation(), event.preventDefault();
803
+ const position = getEventPosition({
804
+ snapshot: editorProvider.getEditorSnapshot({
805
+ editorActorSnapshot: editorActor.getSnapshot(),
806
+ slateEditorInstance: slateEditor
807
+ }),
808
+ slateEditor,
809
+ event: event.nativeEvent
810
+ });
811
+ if (!position) {
812
+ console.warn("Could not find position for copy event");
813
+ return;
814
+ }
815
+ editorActor.send({
816
+ type: "behavior event",
817
+ behaviorEvent: {
818
+ type: "copy",
819
+ data: event.nativeEvent.clipboardData,
820
+ position
821
+ },
822
+ editor: slateEditor,
823
+ nativeEvent: event
824
+ });
825
+ }
826
+ }, [onCopy, editorActor, slateEditor]), handleCut = React.useCallback((event_0) => {
827
+ if (onCut)
828
+ onCut(event_0) !== void 0 && event_0.preventDefault();
829
+ else if (event_0.nativeEvent.clipboardData) {
830
+ event_0.stopPropagation(), event_0.preventDefault();
831
+ const position_0 = getEventPosition({
832
+ snapshot: editorProvider.getEditorSnapshot({
833
+ editorActorSnapshot: editorActor.getSnapshot(),
834
+ slateEditorInstance: slateEditor
835
+ }),
836
+ slateEditor,
837
+ event: event_0.nativeEvent
838
+ });
839
+ if (!position_0) {
840
+ console.warn("Could not find position for cut event");
841
+ return;
842
+ }
843
+ editorActor.send({
844
+ type: "behavior event",
845
+ behaviorEvent: {
846
+ type: "cut",
847
+ dataTransfer: event_0.nativeEvent.clipboardData,
848
+ position: position_0
849
+ },
850
+ editor: slateEditor,
851
+ nativeEvent: event_0
852
+ });
853
+ }
854
+ }, [onCut, editorActor, slateEditor]), handlePaste = React.useCallback((event_1) => {
701
855
  const value_0 = editorProvider.PortableTextEditor.getValue(portableTextEditor), path = editorProvider.toPortableTextRange(value_0, slateEditor.selection, schemaTypes)?.focus.path || [], onPasteResult = onPaste?.({
702
- event: event_0,
856
+ event: event_1,
703
857
  value: value_0,
704
858
  path,
705
859
  schemaTypes
706
860
  });
707
- onPasteResult || !slateEditor.selection ? (event_0.preventDefault(), editorActor.send({
708
- type: "notify.loading"
709
- }), Promise.resolve(onPasteResult).then((result_0) => {
710
- debug("Custom paste function from client resolved", result_0), !result_0 || !result_0.insert ? (debug("No result from custom paste handler, pasting normally"), slateEditor.insertData(event_0.clipboardData)) : result_0.insert ? slateEditor.insertFragment(editorProvider.toSlateValue(result_0.insert, {
711
- schemaTypes
712
- })) : console.warn("Your onPaste function returned something unexpected:", result_0);
713
- }).catch((error) => (console.error(error), error)).finally(() => {
861
+ if (onPasteResult || !slateEditor.selection)
862
+ event_1.preventDefault(), editorActor.send({
863
+ type: "notify.loading"
864
+ }), Promise.resolve(onPasteResult).then((result_1) => {
865
+ if (debug("Custom paste function from client resolved", result_1), !result_1 || !result_1.insert) {
866
+ debug("No result from custom paste handler, pasting normally");
867
+ const position_1 = getEventPosition({
868
+ snapshot: editorProvider.getEditorSnapshot({
869
+ editorActorSnapshot: editorActor.getSnapshot(),
870
+ slateEditorInstance: slateEditor
871
+ }),
872
+ slateEditor,
873
+ event: event_1.nativeEvent
874
+ });
875
+ if (!position_1) {
876
+ console.warn("Could not find position for paste event");
877
+ return;
878
+ }
879
+ editorActor.send({
880
+ type: "behavior event",
881
+ behaviorEvent: {
882
+ type: "paste",
883
+ data: event_1.clipboardData,
884
+ position: position_1
885
+ },
886
+ editor: slateEditor,
887
+ nativeEvent: event_1
888
+ });
889
+ } else result_1.insert ? editorActor.send({
890
+ type: "behavior event",
891
+ behaviorEvent: {
892
+ type: "insert.blocks",
893
+ blocks: parseBlocks.parseBlocks({
894
+ context: {
895
+ keyGenerator: editorActor.getSnapshot().context.keyGenerator,
896
+ schema: editorActor.getSnapshot().context.schema
897
+ },
898
+ blocks: result_1.insert,
899
+ options: {
900
+ refreshKeys: !0
901
+ }
902
+ }),
903
+ placement: "auto"
904
+ },
905
+ editor: slateEditor
906
+ }) : console.warn("Your onPaste function returned something unexpected:", result_1);
907
+ }).catch((error) => (console.warn(error), error)).finally(() => {
908
+ editorActor.send({
909
+ type: "notify.done loading"
910
+ });
911
+ });
912
+ else if (event_1.nativeEvent.clipboardData) {
913
+ event_1.preventDefault(), event_1.stopPropagation();
914
+ const position_2 = getEventPosition({
915
+ snapshot: editorProvider.getEditorSnapshot({
916
+ editorActorSnapshot: editorActor.getSnapshot(),
917
+ slateEditorInstance: slateEditor
918
+ }),
919
+ slateEditor,
920
+ event: event_1.nativeEvent
921
+ });
922
+ if (!position_2) {
923
+ console.warn("Could not find position for paste event");
924
+ return;
925
+ }
714
926
  editorActor.send({
715
- type: "notify.done loading"
927
+ type: "behavior event",
928
+ behaviorEvent: {
929
+ type: "paste",
930
+ data: event_1.nativeEvent.clipboardData,
931
+ position: position_2
932
+ },
933
+ editor: slateEditor,
934
+ nativeEvent: event_1
716
935
  });
717
- })) : event_0.nativeEvent.clipboardData && editorActor.send({
718
- type: "behavior event",
719
- behaviorEvent: {
720
- type: "paste",
721
- data: event_0.nativeEvent.clipboardData
722
- },
723
- editor: slateEditor,
724
- nativeEvent: event_0
725
- }), debug("No result from custom paste handler, pasting normally");
726
- }, [editorActor, onPaste, portableTextEditor, schemaTypes, slateEditor]), handleOnFocus = React.useCallback((event_1) => {
727
- if (onFocus && onFocus(event_1), !event_1.isDefaultPrevented()) {
936
+ }
937
+ debug("No result from custom paste handler, pasting normally");
938
+ }, [editorActor, onPaste, portableTextEditor, schemaTypes, slateEditor]), handleOnFocus = React.useCallback((event_2) => {
939
+ if (onFocus && onFocus(event_2), !event_2.isDefaultPrevented()) {
728
940
  const selection = editorProvider.PortableTextEditor.getSelection(portableTextEditor);
729
941
  selection === null && (slate.Transforms.select(slateEditor, slate.Editor.start(slateEditor, [])), slateEditor.onChange()), editorActor.send({
730
942
  type: "notify.focused",
731
- event: event_1
943
+ event: event_2
732
944
  });
733
945
  const newSelection = editorProvider.PortableTextEditor.getSelection(portableTextEditor);
734
946
  selection === newSelection && editorActor.send({
@@ -736,19 +948,37 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
736
948
  selection
737
949
  });
738
950
  }
739
- }, [editorActor, onFocus, portableTextEditor, slateEditor]), handleClick = React.useCallback((event_2) => {
740
- onClick && onClick(event_2);
741
- const focusBlockPath = slateEditor.selection ? slateEditor.selection.focus.path.slice(0, 1) : void 0, focusBlock = focusBlockPath ? slate.Node.descendant(slateEditor, focusBlockPath) : void 0, [_, lastNodePath] = slate.Node.last(slateEditor, []), lastBlockPath = lastNodePath.slice(0, 1), lastNodeFocused = focusBlockPath ? slate.Path.equals(lastBlockPath, focusBlockPath) : !1, lastBlockIsVoid = focusBlock ? !slateEditor.isTextBlock(focusBlock) : !1;
742
- slateEditor.selection && slate.Range.isCollapsed(slateEditor.selection) && lastNodeFocused && lastBlockIsVoid && (slate.Transforms.insertNodes(slateEditor, slateEditor.pteCreateTextBlock({
743
- decorators: []
744
- })), slateEditor.onChange());
745
- }, [onClick, slateEditor]), handleOnBlur = React.useCallback((event_3) => {
746
- onBlur && onBlur(event_3), event_3.isPropagationStopped() || editorActor.send({
951
+ }, [editorActor, onFocus, portableTextEditor, slateEditor]), handleClick = React.useCallback((event_3) => {
952
+ if (onClick && onClick(event_3), event_3.isDefaultPrevented() || event_3.isPropagationStopped())
953
+ return;
954
+ const position_3 = getEventPosition({
955
+ snapshot: editorProvider.getEditorSnapshot({
956
+ editorActorSnapshot: editorActor.getSnapshot(),
957
+ slateEditorInstance: slateEditor
958
+ }),
959
+ slateEditor,
960
+ event: event_3.nativeEvent
961
+ });
962
+ if (!position_3) {
963
+ console.warn("Could not find EventPosition for MouseEvent");
964
+ return;
965
+ }
966
+ editorActor.send({
967
+ type: "behavior event",
968
+ behaviorEvent: {
969
+ type: "mouse.click",
970
+ position: position_3
971
+ },
972
+ editor: slateEditor,
973
+ nativeEvent: event_3
974
+ });
975
+ }, [onClick, editorActor, slateEditor]), handleOnBlur = React.useCallback((event_4) => {
976
+ onBlur && onBlur(event_4), event_4.isPropagationStopped() || editorActor.send({
747
977
  type: "notify.blurred",
748
- event: event_3
978
+ event: event_4
749
979
  });
750
- }, [editorActor, onBlur]), handleOnBeforeInput = React.useCallback((event_4) => {
751
- onBeforeInput && onBeforeInput(event_4);
980
+ }, [editorActor, onBlur]), handleOnBeforeInput = React.useCallback((event_5) => {
981
+ onBeforeInput && onBeforeInput(event_5);
752
982
  }, [onBeforeInput]), validateSelection = React.useCallback(() => {
753
983
  if (!slateEditor.selection)
754
984
  return;
@@ -782,39 +1012,39 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
782
1012
  };
783
1013
  }
784
1014
  }, [validateSelection, editableElement]);
785
- const handleKeyDown = React.useCallback((event_5) => {
786
- props.onKeyDown && props.onKeyDown(event_5), event_5.isDefaultPrevented() || slateEditor.pteWithHotKeys(event_5), event_5.isDefaultPrevented() || editorActor.send({
1015
+ const handleKeyDown = React.useCallback((event_6) => {
1016
+ props.onKeyDown && props.onKeyDown(event_6), event_6.isDefaultPrevented() || slateEditor.pteWithHotKeys(event_6), event_6.isDefaultPrevented() || editorActor.send({
787
1017
  type: "behavior event",
788
1018
  behaviorEvent: {
789
1019
  type: "key.down",
790
1020
  keyboardEvent: {
791
- key: event_5.key,
792
- code: event_5.code,
793
- altKey: event_5.altKey,
794
- ctrlKey: event_5.ctrlKey,
795
- metaKey: event_5.metaKey,
796
- shiftKey: event_5.shiftKey
1021
+ key: event_6.key,
1022
+ code: event_6.code,
1023
+ altKey: event_6.altKey,
1024
+ ctrlKey: event_6.ctrlKey,
1025
+ metaKey: event_6.metaKey,
1026
+ shiftKey: event_6.shiftKey
797
1027
  }
798
1028
  },
799
1029
  editor: slateEditor,
800
- nativeEvent: event_5
1030
+ nativeEvent: event_6
801
1031
  });
802
- }, [props, editorActor, slateEditor]), handleKeyUp = React.useCallback((event_6) => {
803
- props.onKeyUp && props.onKeyUp(event_6), event_6.isDefaultPrevented() || editorActor.send({
1032
+ }, [props, editorActor, slateEditor]), handleKeyUp = React.useCallback((event_7) => {
1033
+ props.onKeyUp && props.onKeyUp(event_7), event_7.isDefaultPrevented() || editorActor.send({
804
1034
  type: "behavior event",
805
1035
  behaviorEvent: {
806
1036
  type: "key.up",
807
1037
  keyboardEvent: {
808
- key: event_6.key,
809
- code: event_6.code,
810
- altKey: event_6.altKey,
811
- ctrlKey: event_6.ctrlKey,
812
- metaKey: event_6.metaKey,
813
- shiftKey: event_6.shiftKey
1038
+ key: event_7.key,
1039
+ code: event_7.code,
1040
+ altKey: event_7.altKey,
1041
+ ctrlKey: event_7.ctrlKey,
1042
+ metaKey: event_7.metaKey,
1043
+ shiftKey: event_7.shiftKey
814
1044
  }
815
1045
  },
816
1046
  editor: slateEditor,
817
- nativeEvent: event_6
1047
+ nativeEvent: event_7
818
1048
  });
819
1049
  }, [props, editorActor, slateEditor]), scrollSelectionIntoViewToSlate = React.useMemo(() => {
820
1050
  if (scrollSelectionIntoView !== void 0)
@@ -836,7 +1066,7 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
836
1066
  }];
837
1067
  if (path_0.length === 0)
838
1068
  return [];
839
- const result_1 = rangeDecorationState.filter((item) => slate.Range.isCollapsed(item) ? path_0.length !== 2 ? !1 : slate.Path.equals(item.focus.path, path_0) && slate.Path.equals(item.anchor.path, path_0) : slate.Range.intersection(item, {
1069
+ const result_2 = rangeDecorationState.filter((item) => slate.Range.isCollapsed(item) ? path_0.length !== 2 ? !1 : slate.Path.equals(item.focus.path, path_0) && slate.Path.equals(item.anchor.path, path_0) : slate.Range.intersection(item, {
840
1070
  anchor: {
841
1071
  path: path_0,
842
1072
  offset: 0
@@ -846,24 +1076,164 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
846
1076
  offset: 0
847
1077
  }
848
1078
  }) || slate.Range.includes(item, path_0));
849
- return result_1.length > 0 ? result_1 : [];
1079
+ return result_2.length > 0 ? result_2 : [];
850
1080
  }, [slateEditor, schemaTypes, rangeDecorationState]);
851
- return React.useEffect(() => {
1081
+ React.useEffect(() => {
852
1082
  ref.current = slateReact.ReactEditor.toDOMNode(slateEditor, slateEditor), setEditableElement(ref.current);
853
1083
  }, [slateEditor, ref]), React.useEffect(() => {
854
- const window_0 = slateReact.ReactEditor.getWindow(slateEditor), onDragEnd = () => {
1084
+ const window_0 = slateReact.ReactEditor.getWindow(slateEditor), onDragEnd_0 = () => {
855
1085
  editorActor.send({
856
1086
  type: "dragend"
857
1087
  });
858
- }, onDrop = () => {
1088
+ }, onDrop_0 = () => {
859
1089
  editorActor.send({
860
1090
  type: "drop"
861
1091
  });
862
1092
  };
863
- return window_0.document.addEventListener("dragend", onDragEnd), window_0.document.addEventListener("drop", onDrop), () => {
864
- window_0.document.removeEventListener("dragend", onDragEnd), window_0.document.removeEventListener("drop", onDrop);
1093
+ return window_0.document.addEventListener("dragend", onDragEnd_0), window_0.document.addEventListener("drop", onDrop_0), () => {
1094
+ window_0.document.removeEventListener("dragend", onDragEnd_0), window_0.document.removeEventListener("drop", onDrop_0);
865
1095
  };
866
- }, [slateEditor, editorActor]), portableTextEditor ? hasInvalidValue ? null : /* @__PURE__ */ jsxRuntime.jsx(
1096
+ }, [slateEditor, editorActor]);
1097
+ const handleDragStart = React.useCallback((event_8) => {
1098
+ if (onDragStart?.(event_8), !event_8.isDefaultPrevented() && !event_8.isPropagationStopped()) {
1099
+ const position_4 = getEventPosition({
1100
+ snapshot: editorProvider.getEditorSnapshot({
1101
+ editorActorSnapshot: editorActor.getSnapshot(),
1102
+ slateEditorInstance: slateEditor
1103
+ }),
1104
+ slateEditor,
1105
+ event: event_8.nativeEvent
1106
+ });
1107
+ if (!position_4) {
1108
+ console.warn("Could not find position for dragstart event");
1109
+ return;
1110
+ }
1111
+ if (slateReact.ReactEditor.hasTarget(slateEditor, event_8.target)) {
1112
+ const node = slateReact.ReactEditor.toSlateNode(slateEditor, event_8.target), path_1 = slateReact.ReactEditor.findPath(slateEditor, node);
1113
+ if (slate.Element.isElement(node) && slate.Editor.isVoid(slateEditor, node) || slate.Editor.void(slateEditor, {
1114
+ at: path_1,
1115
+ voids: !0
1116
+ })) {
1117
+ const range = slate.Editor.range(slateEditor, path_1);
1118
+ slate.Transforms.select(slateEditor, range);
1119
+ }
1120
+ }
1121
+ editorActor.send({
1122
+ type: "dragstart",
1123
+ origin: position_4
1124
+ }), editorActor.send({
1125
+ type: "behavior event",
1126
+ behaviorEvent: {
1127
+ type: "drag.dragstart",
1128
+ dataTransfer: event_8.dataTransfer,
1129
+ position: position_4
1130
+ },
1131
+ editor: slateEditor
1132
+ }), event_8.stopPropagation();
1133
+ }
1134
+ }, [onDragStart, editorActor, slateEditor]), handleDrag = React.useCallback((event_9) => {
1135
+ onDrag?.(event_9), !event_9.isDefaultPrevented() && !event_9.isPropagationStopped() && (editorActor.send({
1136
+ type: "behavior event",
1137
+ behaviorEvent: {
1138
+ type: "drag.drag",
1139
+ dataTransfer: event_9.dataTransfer
1140
+ },
1141
+ editor: slateEditor
1142
+ }), event_9.stopPropagation());
1143
+ }, [onDrag, editorActor, slateEditor]), handleDragEnd = React.useCallback((event_10) => {
1144
+ onDragEnd?.(event_10), !event_10.isDefaultPrevented() && !event_10.isPropagationStopped() && (editorActor.send({
1145
+ type: "behavior event",
1146
+ behaviorEvent: {
1147
+ type: "drag.dragend",
1148
+ dataTransfer: event_10.dataTransfer
1149
+ },
1150
+ editor: slateEditor
1151
+ }), event_10.stopPropagation());
1152
+ }, [onDragEnd, editorActor, slateEditor]), handleDragEnter = React.useCallback((event_11) => {
1153
+ if (onDragEnter?.(event_11), !event_11.isDefaultPrevented() && !event_11.isPropagationStopped()) {
1154
+ const position_5 = getEventPosition({
1155
+ snapshot: editorProvider.getEditorSnapshot({
1156
+ editorActorSnapshot: editorActor.getSnapshot(),
1157
+ slateEditorInstance: slateEditor
1158
+ }),
1159
+ slateEditor,
1160
+ event: event_11.nativeEvent
1161
+ });
1162
+ if (!position_5) {
1163
+ console.warn("Could not find position for dragenter event");
1164
+ return;
1165
+ }
1166
+ editorActor.send({
1167
+ type: "behavior event",
1168
+ behaviorEvent: {
1169
+ type: "drag.dragenter",
1170
+ dataTransfer: event_11.dataTransfer,
1171
+ position: position_5
1172
+ },
1173
+ editor: slateEditor
1174
+ }), event_11.stopPropagation();
1175
+ }
1176
+ }, [onDragEnter, editorActor, slateEditor]), handleDragOver = React.useCallback((event_12) => {
1177
+ if (onDragOver?.(event_12), !event_12.isDefaultPrevented() && !event_12.isPropagationStopped()) {
1178
+ const position_6 = getEventPosition({
1179
+ snapshot: editorProvider.getEditorSnapshot({
1180
+ editorActorSnapshot: editorActor.getSnapshot(),
1181
+ slateEditorInstance: slateEditor
1182
+ }),
1183
+ slateEditor,
1184
+ event: event_12.nativeEvent
1185
+ });
1186
+ if (!position_6) {
1187
+ console.warn("Could not find position for dragover event");
1188
+ return;
1189
+ }
1190
+ editorActor.send({
1191
+ type: "behavior event",
1192
+ behaviorEvent: {
1193
+ type: "drag.dragover",
1194
+ dataTransfer: event_12.dataTransfer,
1195
+ position: position_6
1196
+ },
1197
+ editor: slateEditor,
1198
+ nativeEvent: event_12
1199
+ }), event_12.stopPropagation();
1200
+ }
1201
+ }, [onDragOver, editorActor, slateEditor]), handleDrop = React.useCallback((event_13) => {
1202
+ if (onDrop?.(event_13), !event_13.isDefaultPrevented() && !event_13.isPropagationStopped()) {
1203
+ const position_7 = getEventPosition({
1204
+ snapshot: editorProvider.getEditorSnapshot({
1205
+ editorActorSnapshot: editorActor.getSnapshot(),
1206
+ slateEditorInstance: slateEditor
1207
+ }),
1208
+ slateEditor,
1209
+ event: event_13.nativeEvent
1210
+ });
1211
+ if (!position_7) {
1212
+ console.warn("Could not find position for drop event");
1213
+ return;
1214
+ }
1215
+ const range_0 = slateReact.ReactEditor.findEventRange(slateEditor, event_13);
1216
+ slateEditor.select(range_0), editorActor.send({
1217
+ type: "behavior event",
1218
+ behaviorEvent: {
1219
+ type: "drag.drop",
1220
+ dataTransfer: event_13.dataTransfer,
1221
+ position: position_7
1222
+ },
1223
+ editor: slateEditor
1224
+ }), event_13.preventDefault();
1225
+ }
1226
+ }, [onDrop, editorActor, slateEditor]), handleDragLeave = React.useCallback((event_14) => {
1227
+ onDragLeave?.(event_14), !event_14.isDefaultPrevented() && !event_14.isPropagationStopped() && editorActor.send({
1228
+ type: "behavior event",
1229
+ behaviorEvent: {
1230
+ type: "drag.dragleave",
1231
+ dataTransfer: event_14.dataTransfer
1232
+ },
1233
+ editor: slateEditor
1234
+ });
1235
+ }, [onDragLeave, editorActor, slateEditor]);
1236
+ return portableTextEditor ? hasInvalidValue ? null : /* @__PURE__ */ jsxRuntime.jsx(
867
1237
  slateReact.Editable,
868
1238
  {
869
1239
  ...restProps,
@@ -872,13 +1242,16 @@ const debug = editorProvider.debugWithName("component:Editable"), PLACEHOLDER_ST
872
1242
  decorate,
873
1243
  onBlur: handleOnBlur,
874
1244
  onCopy: handleCopy,
1245
+ onCut: handleCut,
875
1246
  onClick: handleClick,
876
1247
  onDOMBeforeInput: handleOnBeforeInput,
877
- onDragStart: (event_7) => {
878
- props.onDragStart?.(event_7), !event_7.isDefaultPrevented() && !event_7.isPropagationStopped() && editorActor.send({
879
- type: "dragstart"
880
- });
881
- },
1248
+ onDragStart: handleDragStart,
1249
+ onDrag: handleDrag,
1250
+ onDragEnd: handleDragEnd,
1251
+ onDragEnter: handleDragEnter,
1252
+ onDragOver: handleDragOver,
1253
+ onDrop: handleDrop,
1254
+ onDragLeave: handleDragLeave,
882
1255
  onFocus: handleOnFocus,
883
1256
  onKeyDown: handleKeyDown,
884
1257
  onKeyUp: handleKeyUp,