@tiptap/vue-3 3.0.0 → 3.0.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.
Files changed (206) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +5 -1
  3. package/dist/index.cjs +577 -455
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +228 -0
  6. package/dist/index.d.ts +228 -0
  7. package/dist/index.js +541 -443
  8. package/dist/index.js.map +1 -1
  9. package/dist/menus/index.cjs +693 -0
  10. package/dist/menus/index.cjs.map +1 -0
  11. package/dist/menus/index.d.cts +279 -0
  12. package/dist/menus/index.d.ts +279 -0
  13. package/dist/menus/index.js +685 -0
  14. package/dist/menus/index.js.map +1 -0
  15. package/package.json +28 -17
  16. package/src/Editor.ts +23 -17
  17. package/src/EditorContent.ts +14 -44
  18. package/src/VueMarkViewRenderer.ts +130 -0
  19. package/src/VueNodeViewRenderer.ts +99 -36
  20. package/src/VueRenderer.ts +27 -18
  21. package/src/index.ts +1 -2
  22. package/src/menus/BubbleMenu.ts +78 -0
  23. package/src/menus/FloatingMenu.ts +68 -0
  24. package/src/menus/index.ts +2 -0
  25. package/src/useEditor.ts +7 -1
  26. package/dist/index.umd.js +0 -495
  27. package/dist/index.umd.js.map +0 -1
  28. package/dist/packages/core/src/CommandManager.d.ts +0 -20
  29. package/dist/packages/core/src/Editor.d.ts +0 -161
  30. package/dist/packages/core/src/EventEmitter.d.ts +0 -11
  31. package/dist/packages/core/src/Extension.d.ts +0 -343
  32. package/dist/packages/core/src/ExtensionManager.d.ts +0 -55
  33. package/dist/packages/core/src/InputRule.d.ts +0 -42
  34. package/dist/packages/core/src/Mark.d.ts +0 -451
  35. package/dist/packages/core/src/Node.d.ts +0 -611
  36. package/dist/packages/core/src/NodePos.d.ts +0 -44
  37. package/dist/packages/core/src/NodeView.d.ts +0 -31
  38. package/dist/packages/core/src/PasteRule.d.ts +0 -50
  39. package/dist/packages/core/src/Tracker.d.ts +0 -11
  40. package/dist/packages/core/src/commands/blur.d.ts +0 -13
  41. package/dist/packages/core/src/commands/clearContent.d.ts +0 -14
  42. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -13
  43. package/dist/packages/core/src/commands/command.d.ts +0 -18
  44. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -13
  45. package/dist/packages/core/src/commands/cut.d.ts +0 -20
  46. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +0 -13
  47. package/dist/packages/core/src/commands/deleteNode.d.ts +0 -15
  48. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -14
  49. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -13
  50. package/dist/packages/core/src/commands/enter.d.ts +0 -13
  51. package/dist/packages/core/src/commands/exitCode.d.ts +0 -13
  52. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -25
  53. package/dist/packages/core/src/commands/first.d.ts +0 -14
  54. package/dist/packages/core/src/commands/focus.d.ts +0 -27
  55. package/dist/packages/core/src/commands/forEach.d.ts +0 -14
  56. package/dist/packages/core/src/commands/index.d.ts +0 -55
  57. package/dist/packages/core/src/commands/insertContent.d.ts +0 -34
  58. package/dist/packages/core/src/commands/insertContentAt.d.ts +0 -47
  59. package/dist/packages/core/src/commands/join.d.ts +0 -41
  60. package/dist/packages/core/src/commands/joinItemBackward.d.ts +0 -13
  61. package/dist/packages/core/src/commands/joinItemForward.d.ts +0 -13
  62. package/dist/packages/core/src/commands/joinTextblockBackward.d.ts +0 -12
  63. package/dist/packages/core/src/commands/joinTextblockForward.d.ts +0 -12
  64. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -14
  65. package/dist/packages/core/src/commands/lift.d.ts +0 -17
  66. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -13
  67. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -15
  68. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -13
  69. package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -16
  70. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -13
  71. package/dist/packages/core/src/commands/selectAll.d.ts +0 -13
  72. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -13
  73. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -13
  74. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -13
  75. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +0 -13
  76. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +0 -13
  77. package/dist/packages/core/src/commands/setContent.d.ts +0 -40
  78. package/dist/packages/core/src/commands/setMark.d.ts +0 -15
  79. package/dist/packages/core/src/commands/setMeta.d.ts +0 -15
  80. package/dist/packages/core/src/commands/setNode.d.ts +0 -16
  81. package/dist/packages/core/src/commands/setNodeSelection.d.ts +0 -14
  82. package/dist/packages/core/src/commands/setTextSelection.d.ts +0 -14
  83. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -15
  84. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -17
  85. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -15
  86. package/dist/packages/core/src/commands/toggleList.d.ts +0 -18
  87. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -30
  88. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -17
  89. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -16
  90. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -13
  91. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -13
  92. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -25
  93. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -24
  94. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -16
  95. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -16
  96. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -5
  97. package/dist/packages/core/src/extensions/commands.d.ts +0 -3
  98. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  99. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  100. package/dist/packages/core/src/extensions/index.d.ts +0 -6
  101. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  102. package/dist/packages/core/src/extensions/tabindex.d.ts +0 -2
  103. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +0 -10
  104. package/dist/packages/core/src/helpers/createChainableState.d.ts +0 -10
  105. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -12
  106. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -15
  107. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +0 -7
  108. package/dist/packages/core/src/helpers/findChildren.d.ts +0 -9
  109. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +0 -10
  110. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -16
  111. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -17
  112. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -8
  113. package/dist/packages/core/src/helpers/generateJSON.d.ts +0 -8
  114. package/dist/packages/core/src/helpers/generateText.d.ts +0 -12
  115. package/dist/packages/core/src/helpers/getAttributes.d.ts +0 -9
  116. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  117. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +0 -11
  118. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +0 -8
  119. package/dist/packages/core/src/helpers/getExtensionField.d.ts +0 -9
  120. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  121. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -3
  122. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  123. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  124. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  125. package/dist/packages/core/src/helpers/getNodeAtPosition.d.ts +0 -11
  126. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -3
  127. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  128. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  129. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -4
  130. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +0 -10
  131. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -8
  132. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -8
  133. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -9
  134. package/dist/packages/core/src/helpers/getText.d.ts +0 -15
  135. package/dist/packages/core/src/helpers/getTextBetween.d.ts +0 -14
  136. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +0 -8
  137. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +0 -8
  138. package/dist/packages/core/src/helpers/index.d.ts +0 -50
  139. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  140. package/dist/packages/core/src/helpers/isActive.d.ts +0 -2
  141. package/dist/packages/core/src/helpers/isAtEndOfNode.d.ts +0 -2
  142. package/dist/packages/core/src/helpers/isAtStartOfNode.d.ts +0 -2
  143. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +0 -2
  144. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  145. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -3
  146. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -3
  147. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  148. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  149. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  150. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +0 -2
  151. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +0 -4
  152. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  153. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  154. package/dist/packages/core/src/index.d.ts +0 -24
  155. package/dist/packages/core/src/inputRules/index.d.ts +0 -5
  156. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -13
  157. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -23
  158. package/dist/packages/core/src/inputRules/textInputRule.d.ts +0 -10
  159. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +0 -15
  160. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +0 -28
  161. package/dist/packages/core/src/pasteRules/index.d.ts +0 -3
  162. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -13
  163. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +0 -13
  164. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +0 -10
  165. package/dist/packages/core/src/style.d.ts +0 -1
  166. package/dist/packages/core/src/types.d.ts +0 -255
  167. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -9
  168. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  169. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -6
  170. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  171. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +0 -1
  172. package/dist/packages/core/src/utilities/findDuplicates.d.ts +0 -1
  173. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  174. package/dist/packages/core/src/utilities/index.d.ts +0 -20
  175. package/dist/packages/core/src/utilities/isAndroid.d.ts +0 -1
  176. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  177. package/dist/packages/core/src/utilities/isFunction.d.ts +0 -1
  178. package/dist/packages/core/src/utilities/isMacOS.d.ts +0 -1
  179. package/dist/packages/core/src/utilities/isNumber.d.ts +0 -1
  180. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  181. package/dist/packages/core/src/utilities/isRegExp.d.ts +0 -1
  182. package/dist/packages/core/src/utilities/isString.d.ts +0 -1
  183. package/dist/packages/core/src/utilities/isiOS.d.ts +0 -1
  184. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -1
  185. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -1
  186. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  187. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -8
  188. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +0 -8
  189. package/dist/packages/extension-bubble-menu/src/bubble-menu-plugin.d.ts +0 -76
  190. package/dist/packages/extension-bubble-menu/src/bubble-menu.d.ts +0 -15
  191. package/dist/packages/extension-bubble-menu/src/index.d.ts +0 -4
  192. package/dist/packages/extension-floating-menu/src/floating-menu-plugin.d.ts +0 -66
  193. package/dist/packages/extension-floating-menu/src/floating-menu.d.ts +0 -15
  194. package/dist/packages/extension-floating-menu/src/index.d.ts +0 -4
  195. package/dist/packages/vue-3/src/BubbleMenu.d.ts +0 -59
  196. package/dist/packages/vue-3/src/Editor.d.ts +0 -23
  197. package/dist/packages/vue-3/src/EditorContent.d.ts +0 -17
  198. package/dist/packages/vue-3/src/FloatingMenu.d.ts +0 -48
  199. package/dist/packages/vue-3/src/NodeViewContent.d.ts +0 -13
  200. package/dist/packages/vue-3/src/NodeViewWrapper.d.ts +0 -13
  201. package/dist/packages/vue-3/src/VueNodeViewRenderer.d.ts +0 -48
  202. package/dist/packages/vue-3/src/VueRenderer.d.ts +0 -36
  203. package/dist/packages/vue-3/src/index.d.ts +0 -10
  204. package/dist/packages/vue-3/src/useEditor.d.ts +0 -3
  205. package/src/BubbleMenu.ts +0 -71
  206. package/src/FloatingMenu.ts +0 -66
@@ -0,0 +1,685 @@
1
+ // ../extension-bubble-menu/dist/index.js
2
+ import { Extension } from "@tiptap/core";
3
+ import {
4
+ arrow,
5
+ autoPlacement,
6
+ computePosition,
7
+ flip,
8
+ hide,
9
+ inline,
10
+ offset,
11
+ shift,
12
+ size
13
+ } from "@floating-ui/dom";
14
+ import { isTextSelection, posToDOMRect } from "@tiptap/core";
15
+ import { Plugin, PluginKey } from "@tiptap/pm/state";
16
+ import { CellSelection } from "@tiptap/pm/tables";
17
+ function combineDOMRects(rect1, rect2) {
18
+ const top = Math.min(rect1.top, rect2.top);
19
+ const bottom = Math.max(rect1.bottom, rect2.bottom);
20
+ const left = Math.min(rect1.left, rect2.left);
21
+ const right = Math.max(rect1.right, rect2.right);
22
+ const width = right - left;
23
+ const height = bottom - top;
24
+ const x = left;
25
+ const y = top;
26
+ return new DOMRect(x, y, width, height);
27
+ }
28
+ var BubbleMenuView = class {
29
+ constructor({
30
+ editor,
31
+ element,
32
+ view,
33
+ updateDelay = 250,
34
+ resizeDelay = 60,
35
+ shouldShow,
36
+ options
37
+ }) {
38
+ this.preventHide = false;
39
+ this.isVisible = false;
40
+ this.floatingUIOptions = {
41
+ strategy: "absolute",
42
+ placement: "top",
43
+ offset: 8,
44
+ flip: {},
45
+ shift: {},
46
+ arrow: false,
47
+ size: false,
48
+ autoPlacement: false,
49
+ hide: false,
50
+ inline: false,
51
+ onShow: void 0,
52
+ onHide: void 0,
53
+ onUpdate: void 0,
54
+ onDestroy: void 0
55
+ };
56
+ this.shouldShow = ({ view: view2, state, from, to }) => {
57
+ const { doc, selection } = state;
58
+ const { empty } = selection;
59
+ const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(state.selection);
60
+ const isChildOfMenu = this.element.contains(document.activeElement);
61
+ const hasEditorFocus = view2.hasFocus() || isChildOfMenu;
62
+ if (!hasEditorFocus || empty || isEmptyTextBlock || !this.editor.isEditable) {
63
+ return false;
64
+ }
65
+ return true;
66
+ };
67
+ this.mousedownHandler = () => {
68
+ this.preventHide = true;
69
+ };
70
+ this.dragstartHandler = () => {
71
+ this.hide();
72
+ };
73
+ this.resizeHandler = () => {
74
+ if (this.resizeDebounceTimer) {
75
+ clearTimeout(this.resizeDebounceTimer);
76
+ }
77
+ this.resizeDebounceTimer = window.setTimeout(() => {
78
+ this.updatePosition();
79
+ }, this.resizeDelay);
80
+ };
81
+ this.focusHandler = () => {
82
+ setTimeout(() => this.update(this.editor.view));
83
+ };
84
+ this.blurHandler = ({ event }) => {
85
+ var _a;
86
+ if (this.preventHide) {
87
+ this.preventHide = false;
88
+ return;
89
+ }
90
+ if ((event == null ? void 0 : event.relatedTarget) && ((_a = this.element.parentNode) == null ? void 0 : _a.contains(event.relatedTarget))) {
91
+ return;
92
+ }
93
+ if ((event == null ? void 0 : event.relatedTarget) === this.editor.view.dom) {
94
+ return;
95
+ }
96
+ this.hide();
97
+ };
98
+ this.handleDebouncedUpdate = (view2, oldState) => {
99
+ const selectionChanged = !(oldState == null ? void 0 : oldState.selection.eq(view2.state.selection));
100
+ const docChanged = !(oldState == null ? void 0 : oldState.doc.eq(view2.state.doc));
101
+ if (!selectionChanged && !docChanged) {
102
+ return;
103
+ }
104
+ if (this.updateDebounceTimer) {
105
+ clearTimeout(this.updateDebounceTimer);
106
+ }
107
+ this.updateDebounceTimer = window.setTimeout(() => {
108
+ this.updateHandler(view2, selectionChanged, docChanged, oldState);
109
+ }, this.updateDelay);
110
+ };
111
+ this.updateHandler = (view2, selectionChanged, docChanged, oldState) => {
112
+ const { composing } = view2;
113
+ const isSame = !selectionChanged && !docChanged;
114
+ if (composing || isSame) {
115
+ return;
116
+ }
117
+ const shouldShow2 = this.getShouldShow(oldState);
118
+ if (!shouldShow2) {
119
+ this.hide();
120
+ return;
121
+ }
122
+ this.updatePosition();
123
+ this.show();
124
+ };
125
+ this.editor = editor;
126
+ this.element = element;
127
+ this.view = view;
128
+ this.updateDelay = updateDelay;
129
+ this.resizeDelay = resizeDelay;
130
+ this.floatingUIOptions = {
131
+ ...this.floatingUIOptions,
132
+ ...options
133
+ };
134
+ this.element.tabIndex = 0;
135
+ if (shouldShow) {
136
+ this.shouldShow = shouldShow;
137
+ }
138
+ this.element.addEventListener("mousedown", this.mousedownHandler, { capture: true });
139
+ this.view.dom.addEventListener("dragstart", this.dragstartHandler);
140
+ this.editor.on("focus", this.focusHandler);
141
+ this.editor.on("blur", this.blurHandler);
142
+ window.addEventListener("resize", this.resizeHandler);
143
+ this.update(view, view.state);
144
+ if (this.getShouldShow()) {
145
+ this.show();
146
+ }
147
+ }
148
+ get middlewares() {
149
+ const middlewares = [];
150
+ if (this.floatingUIOptions.flip) {
151
+ middlewares.push(flip(typeof this.floatingUIOptions.flip !== "boolean" ? this.floatingUIOptions.flip : void 0));
152
+ }
153
+ if (this.floatingUIOptions.shift) {
154
+ middlewares.push(
155
+ shift(typeof this.floatingUIOptions.shift !== "boolean" ? this.floatingUIOptions.shift : void 0)
156
+ );
157
+ }
158
+ if (this.floatingUIOptions.offset) {
159
+ middlewares.push(
160
+ offset(typeof this.floatingUIOptions.offset !== "boolean" ? this.floatingUIOptions.offset : void 0)
161
+ );
162
+ }
163
+ if (this.floatingUIOptions.arrow) {
164
+ middlewares.push(arrow(this.floatingUIOptions.arrow));
165
+ }
166
+ if (this.floatingUIOptions.size) {
167
+ middlewares.push(size(typeof this.floatingUIOptions.size !== "boolean" ? this.floatingUIOptions.size : void 0));
168
+ }
169
+ if (this.floatingUIOptions.autoPlacement) {
170
+ middlewares.push(
171
+ autoPlacement(
172
+ typeof this.floatingUIOptions.autoPlacement !== "boolean" ? this.floatingUIOptions.autoPlacement : void 0
173
+ )
174
+ );
175
+ }
176
+ if (this.floatingUIOptions.hide) {
177
+ middlewares.push(hide(typeof this.floatingUIOptions.hide !== "boolean" ? this.floatingUIOptions.hide : void 0));
178
+ }
179
+ if (this.floatingUIOptions.inline) {
180
+ middlewares.push(
181
+ inline(typeof this.floatingUIOptions.inline !== "boolean" ? this.floatingUIOptions.inline : void 0)
182
+ );
183
+ }
184
+ return middlewares;
185
+ }
186
+ updatePosition() {
187
+ const { selection } = this.editor.state;
188
+ let virtualElement = {
189
+ getBoundingClientRect: () => posToDOMRect(this.view, selection.from, selection.to)
190
+ };
191
+ if (selection instanceof CellSelection) {
192
+ const { $anchorCell, $headCell } = selection;
193
+ const from = $anchorCell ? $anchorCell.pos : $headCell.pos;
194
+ const to = $headCell ? $headCell.pos : $anchorCell.pos;
195
+ const fromDOM = this.view.nodeDOM(from);
196
+ const toDOM = this.view.nodeDOM(to);
197
+ if (!fromDOM || !toDOM) {
198
+ return;
199
+ }
200
+ const clientRect = fromDOM === toDOM ? fromDOM.getBoundingClientRect() : combineDOMRects(
201
+ fromDOM.getBoundingClientRect(),
202
+ toDOM.getBoundingClientRect()
203
+ );
204
+ virtualElement = {
205
+ getBoundingClientRect: () => clientRect
206
+ };
207
+ }
208
+ computePosition(virtualElement, this.element, {
209
+ placement: this.floatingUIOptions.placement,
210
+ strategy: this.floatingUIOptions.strategy,
211
+ middleware: this.middlewares
212
+ }).then(({ x, y, strategy }) => {
213
+ this.element.style.width = "max-content";
214
+ this.element.style.position = strategy;
215
+ this.element.style.left = `${x}px`;
216
+ this.element.style.top = `${y}px`;
217
+ if (this.isVisible && this.floatingUIOptions.onUpdate) {
218
+ this.floatingUIOptions.onUpdate();
219
+ }
220
+ });
221
+ }
222
+ update(view, oldState) {
223
+ const { state } = view;
224
+ const hasValidSelection = state.selection.from !== state.selection.to;
225
+ if (this.updateDelay > 0 && hasValidSelection) {
226
+ this.handleDebouncedUpdate(view, oldState);
227
+ return;
228
+ }
229
+ const selectionChanged = !(oldState == null ? void 0 : oldState.selection.eq(view.state.selection));
230
+ const docChanged = !(oldState == null ? void 0 : oldState.doc.eq(view.state.doc));
231
+ this.updateHandler(view, selectionChanged, docChanged, oldState);
232
+ }
233
+ getShouldShow(oldState) {
234
+ var _a;
235
+ const { state } = this.view;
236
+ const { selection } = state;
237
+ const { ranges } = selection;
238
+ const from = Math.min(...ranges.map((range) => range.$from.pos));
239
+ const to = Math.max(...ranges.map((range) => range.$to.pos));
240
+ const shouldShow = (_a = this.shouldShow) == null ? void 0 : _a.call(this, {
241
+ editor: this.editor,
242
+ element: this.element,
243
+ view: this.view,
244
+ state,
245
+ oldState,
246
+ from,
247
+ to
248
+ });
249
+ return shouldShow;
250
+ }
251
+ show() {
252
+ var _a;
253
+ if (this.isVisible) {
254
+ return;
255
+ }
256
+ this.element.style.visibility = "visible";
257
+ this.element.style.opacity = "1";
258
+ (_a = this.view.dom.parentElement) == null ? void 0 : _a.appendChild(this.element);
259
+ if (this.floatingUIOptions.onShow) {
260
+ this.floatingUIOptions.onShow();
261
+ }
262
+ this.isVisible = true;
263
+ }
264
+ hide() {
265
+ if (!this.isVisible) {
266
+ return;
267
+ }
268
+ this.element.style.visibility = "hidden";
269
+ this.element.style.opacity = "0";
270
+ this.element.remove();
271
+ if (this.floatingUIOptions.onHide) {
272
+ this.floatingUIOptions.onHide();
273
+ }
274
+ this.isVisible = false;
275
+ }
276
+ destroy() {
277
+ this.hide();
278
+ this.element.removeEventListener("mousedown", this.mousedownHandler, { capture: true });
279
+ this.view.dom.removeEventListener("dragstart", this.dragstartHandler);
280
+ window.removeEventListener("resize", this.resizeHandler);
281
+ this.editor.off("focus", this.focusHandler);
282
+ this.editor.off("blur", this.blurHandler);
283
+ if (this.floatingUIOptions.onDestroy) {
284
+ this.floatingUIOptions.onDestroy();
285
+ }
286
+ }
287
+ };
288
+ var BubbleMenuPlugin = (options) => {
289
+ return new Plugin({
290
+ key: typeof options.pluginKey === "string" ? new PluginKey(options.pluginKey) : options.pluginKey,
291
+ view: (view) => new BubbleMenuView({ view, ...options })
292
+ });
293
+ };
294
+ var BubbleMenu = Extension.create({
295
+ name: "bubbleMenu",
296
+ addOptions() {
297
+ return {
298
+ element: null,
299
+ pluginKey: "bubbleMenu",
300
+ updateDelay: void 0,
301
+ shouldShow: null
302
+ };
303
+ },
304
+ addProseMirrorPlugins() {
305
+ if (!this.options.element) {
306
+ return [];
307
+ }
308
+ return [
309
+ BubbleMenuPlugin({
310
+ pluginKey: this.options.pluginKey,
311
+ editor: this.editor,
312
+ element: this.options.element,
313
+ updateDelay: this.options.updateDelay,
314
+ options: this.options.options,
315
+ shouldShow: this.options.shouldShow
316
+ })
317
+ ];
318
+ }
319
+ });
320
+
321
+ // src/menus/BubbleMenu.ts
322
+ import { defineComponent, h, onBeforeUnmount, onMounted, ref, Teleport } from "vue";
323
+ var BubbleMenu2 = defineComponent({
324
+ name: "BubbleMenu",
325
+ props: {
326
+ pluginKey: {
327
+ type: [String, Object],
328
+ default: "bubbleMenu"
329
+ },
330
+ editor: {
331
+ type: Object,
332
+ required: true
333
+ },
334
+ updateDelay: {
335
+ type: Number,
336
+ default: void 0
337
+ },
338
+ resizeDelay: {
339
+ type: Number,
340
+ default: void 0
341
+ },
342
+ options: {
343
+ type: Object,
344
+ default: () => ({})
345
+ },
346
+ shouldShow: {
347
+ type: Function,
348
+ default: null
349
+ }
350
+ },
351
+ setup(props, { slots }) {
352
+ const root = ref(null);
353
+ onMounted(() => {
354
+ const { editor, options, pluginKey, resizeDelay, shouldShow, updateDelay } = props;
355
+ if (!root.value) {
356
+ return;
357
+ }
358
+ root.value.style.visibility = "hidden";
359
+ root.value.style.position = "absolute";
360
+ root.value.remove();
361
+ editor.registerPlugin(
362
+ BubbleMenuPlugin({
363
+ editor,
364
+ element: root.value,
365
+ options,
366
+ pluginKey,
367
+ resizeDelay,
368
+ shouldShow,
369
+ updateDelay
370
+ })
371
+ );
372
+ });
373
+ onBeforeUnmount(() => {
374
+ const { pluginKey, editor } = props;
375
+ editor.unregisterPlugin(pluginKey);
376
+ });
377
+ return () => {
378
+ var _a;
379
+ return h(Teleport, { to: "body" }, h("div", { ref: root }, (_a = slots.default) == null ? void 0 : _a.call(slots)));
380
+ };
381
+ }
382
+ });
383
+
384
+ // ../extension-floating-menu/dist/index.js
385
+ import { Extension as Extension2 } from "@tiptap/core";
386
+ import {
387
+ arrow as arrow2,
388
+ autoPlacement as autoPlacement2,
389
+ computePosition as computePosition2,
390
+ flip as flip2,
391
+ hide as hide2,
392
+ inline as inline2,
393
+ offset as offset2,
394
+ shift as shift2,
395
+ size as size2
396
+ } from "@floating-ui/dom";
397
+ import { getText, getTextSerializersFromSchema, posToDOMRect as posToDOMRect2 } from "@tiptap/core";
398
+ import { Plugin as Plugin2, PluginKey as PluginKey2 } from "@tiptap/pm/state";
399
+ var FloatingMenuView = class {
400
+ constructor({ editor, element, view, options, shouldShow }) {
401
+ this.preventHide = false;
402
+ this.isVisible = false;
403
+ this.shouldShow = ({ view: view2, state }) => {
404
+ const { selection } = state;
405
+ const { $anchor, empty } = selection;
406
+ const isRootDepth = $anchor.depth === 1;
407
+ const isEmptyTextBlock = $anchor.parent.isTextblock && !$anchor.parent.type.spec.code && !$anchor.parent.textContent && $anchor.parent.childCount === 0 && !this.getTextContent($anchor.parent);
408
+ if (!view2.hasFocus() || !empty || !isRootDepth || !isEmptyTextBlock || !this.editor.isEditable) {
409
+ return false;
410
+ }
411
+ return true;
412
+ };
413
+ this.floatingUIOptions = {
414
+ strategy: "absolute",
415
+ placement: "right",
416
+ offset: 8,
417
+ flip: {},
418
+ shift: {},
419
+ arrow: false,
420
+ size: false,
421
+ autoPlacement: false,
422
+ hide: false,
423
+ inline: false
424
+ };
425
+ this.updateHandler = (view2, selectionChanged, docChanged, oldState) => {
426
+ const { composing } = view2;
427
+ const isSame = !selectionChanged && !docChanged;
428
+ if (composing || isSame) {
429
+ return;
430
+ }
431
+ const shouldShow2 = this.getShouldShow(oldState);
432
+ if (!shouldShow2) {
433
+ this.hide();
434
+ return;
435
+ }
436
+ this.updatePosition();
437
+ this.show();
438
+ };
439
+ this.mousedownHandler = () => {
440
+ this.preventHide = true;
441
+ };
442
+ this.focusHandler = () => {
443
+ setTimeout(() => this.update(this.editor.view));
444
+ };
445
+ this.blurHandler = ({ event }) => {
446
+ var _a;
447
+ if (this.preventHide) {
448
+ this.preventHide = false;
449
+ return;
450
+ }
451
+ if ((event == null ? void 0 : event.relatedTarget) && ((_a = this.element.parentNode) == null ? void 0 : _a.contains(event.relatedTarget))) {
452
+ return;
453
+ }
454
+ if ((event == null ? void 0 : event.relatedTarget) === this.editor.view.dom) {
455
+ return;
456
+ }
457
+ this.hide();
458
+ };
459
+ this.editor = editor;
460
+ this.element = element;
461
+ this.view = view;
462
+ this.floatingUIOptions = {
463
+ ...this.floatingUIOptions,
464
+ ...options
465
+ };
466
+ this.element.tabIndex = 0;
467
+ if (shouldShow) {
468
+ this.shouldShow = shouldShow;
469
+ }
470
+ this.element.addEventListener("mousedown", this.mousedownHandler, { capture: true });
471
+ this.editor.on("focus", this.focusHandler);
472
+ this.editor.on("blur", this.blurHandler);
473
+ this.update(view, view.state);
474
+ if (this.getShouldShow()) {
475
+ this.show();
476
+ }
477
+ }
478
+ getTextContent(node) {
479
+ return getText(node, { textSerializers: getTextSerializersFromSchema(this.editor.schema) });
480
+ }
481
+ get middlewares() {
482
+ const middlewares = [];
483
+ if (this.floatingUIOptions.flip) {
484
+ middlewares.push(flip2(typeof this.floatingUIOptions.flip !== "boolean" ? this.floatingUIOptions.flip : void 0));
485
+ }
486
+ if (this.floatingUIOptions.shift) {
487
+ middlewares.push(
488
+ shift2(typeof this.floatingUIOptions.shift !== "boolean" ? this.floatingUIOptions.shift : void 0)
489
+ );
490
+ }
491
+ if (this.floatingUIOptions.offset) {
492
+ middlewares.push(
493
+ offset2(typeof this.floatingUIOptions.offset !== "boolean" ? this.floatingUIOptions.offset : void 0)
494
+ );
495
+ }
496
+ if (this.floatingUIOptions.arrow) {
497
+ middlewares.push(arrow2(this.floatingUIOptions.arrow));
498
+ }
499
+ if (this.floatingUIOptions.size) {
500
+ middlewares.push(size2(typeof this.floatingUIOptions.size !== "boolean" ? this.floatingUIOptions.size : void 0));
501
+ }
502
+ if (this.floatingUIOptions.autoPlacement) {
503
+ middlewares.push(
504
+ autoPlacement2(
505
+ typeof this.floatingUIOptions.autoPlacement !== "boolean" ? this.floatingUIOptions.autoPlacement : void 0
506
+ )
507
+ );
508
+ }
509
+ if (this.floatingUIOptions.hide) {
510
+ middlewares.push(hide2(typeof this.floatingUIOptions.hide !== "boolean" ? this.floatingUIOptions.hide : void 0));
511
+ }
512
+ if (this.floatingUIOptions.inline) {
513
+ middlewares.push(
514
+ inline2(typeof this.floatingUIOptions.inline !== "boolean" ? this.floatingUIOptions.inline : void 0)
515
+ );
516
+ }
517
+ return middlewares;
518
+ }
519
+ getShouldShow(oldState) {
520
+ var _a;
521
+ const { state } = this.view;
522
+ const { selection } = state;
523
+ const { ranges } = selection;
524
+ const from = Math.min(...ranges.map((range) => range.$from.pos));
525
+ const to = Math.max(...ranges.map((range) => range.$to.pos));
526
+ const shouldShow = (_a = this.shouldShow) == null ? void 0 : _a.call(this, {
527
+ editor: this.editor,
528
+ view: this.view,
529
+ state,
530
+ oldState,
531
+ from,
532
+ to
533
+ });
534
+ return shouldShow;
535
+ }
536
+ updatePosition() {
537
+ const { selection } = this.editor.state;
538
+ const virtualElement = {
539
+ getBoundingClientRect: () => posToDOMRect2(this.view, selection.from, selection.to)
540
+ };
541
+ computePosition2(virtualElement, this.element, {
542
+ placement: this.floatingUIOptions.placement,
543
+ strategy: this.floatingUIOptions.strategy,
544
+ middleware: this.middlewares
545
+ }).then(({ x, y, strategy }) => {
546
+ this.element.style.width = "max-content";
547
+ this.element.style.position = strategy;
548
+ this.element.style.left = `${x}px`;
549
+ this.element.style.top = `${y}px`;
550
+ if (this.isVisible && this.floatingUIOptions.onUpdate) {
551
+ this.floatingUIOptions.onUpdate();
552
+ }
553
+ });
554
+ }
555
+ update(view, oldState) {
556
+ const selectionChanged = !(oldState == null ? void 0 : oldState.selection.eq(view.state.selection));
557
+ const docChanged = !(oldState == null ? void 0 : oldState.doc.eq(view.state.doc));
558
+ this.updateHandler(view, selectionChanged, docChanged, oldState);
559
+ }
560
+ show() {
561
+ var _a;
562
+ if (this.isVisible) {
563
+ return;
564
+ }
565
+ this.element.style.visibility = "visible";
566
+ this.element.style.opacity = "1";
567
+ (_a = this.view.dom.parentElement) == null ? void 0 : _a.appendChild(this.element);
568
+ if (this.floatingUIOptions.onShow) {
569
+ this.floatingUIOptions.onShow();
570
+ }
571
+ this.isVisible = true;
572
+ }
573
+ hide() {
574
+ if (!this.isVisible) {
575
+ return;
576
+ }
577
+ this.element.style.visibility = "hidden";
578
+ this.element.style.opacity = "0";
579
+ this.element.remove();
580
+ if (this.floatingUIOptions.onHide) {
581
+ this.floatingUIOptions.onHide();
582
+ }
583
+ this.isVisible = false;
584
+ }
585
+ destroy() {
586
+ this.hide();
587
+ this.element.removeEventListener("mousedown", this.mousedownHandler, { capture: true });
588
+ this.editor.off("focus", this.focusHandler);
589
+ this.editor.off("blur", this.blurHandler);
590
+ if (this.floatingUIOptions.onDestroy) {
591
+ this.floatingUIOptions.onDestroy();
592
+ }
593
+ }
594
+ };
595
+ var FloatingMenuPlugin = (options) => {
596
+ return new Plugin2({
597
+ key: typeof options.pluginKey === "string" ? new PluginKey2(options.pluginKey) : options.pluginKey,
598
+ view: (view) => new FloatingMenuView({ view, ...options })
599
+ });
600
+ };
601
+ var FloatingMenu = Extension2.create({
602
+ name: "floatingMenu",
603
+ addOptions() {
604
+ return {
605
+ element: null,
606
+ options: {},
607
+ pluginKey: "floatingMenu",
608
+ shouldShow: null
609
+ };
610
+ },
611
+ addProseMirrorPlugins() {
612
+ if (!this.options.element) {
613
+ return [];
614
+ }
615
+ return [
616
+ FloatingMenuPlugin({
617
+ pluginKey: this.options.pluginKey,
618
+ editor: this.editor,
619
+ element: this.options.element,
620
+ options: this.options.options,
621
+ shouldShow: this.options.shouldShow
622
+ })
623
+ ];
624
+ }
625
+ });
626
+
627
+ // src/menus/FloatingMenu.ts
628
+ import { defineComponent as defineComponent2, h as h2, onBeforeUnmount as onBeforeUnmount2, onMounted as onMounted2, ref as ref2, Teleport as Teleport2 } from "vue";
629
+ var FloatingMenu2 = defineComponent2({
630
+ name: "FloatingMenu",
631
+ props: {
632
+ pluginKey: {
633
+ // TODO: TypeScript breaks :(
634
+ // type: [String, Object as PropType<Exclude<FloatingMenuPluginProps['pluginKey'], string>>],
635
+ type: null,
636
+ default: "floatingMenu"
637
+ },
638
+ editor: {
639
+ type: Object,
640
+ required: true
641
+ },
642
+ options: {
643
+ type: Object,
644
+ default: () => ({})
645
+ },
646
+ shouldShow: {
647
+ type: Function,
648
+ default: null
649
+ }
650
+ },
651
+ setup(props, { slots }) {
652
+ const root = ref2(null);
653
+ onMounted2(() => {
654
+ const { pluginKey, editor, options, shouldShow } = props;
655
+ if (!root.value) {
656
+ return;
657
+ }
658
+ root.value.style.visibility = "hidden";
659
+ root.value.style.position = "absolute";
660
+ root.value.remove();
661
+ editor.registerPlugin(
662
+ FloatingMenuPlugin({
663
+ pluginKey,
664
+ editor,
665
+ element: root.value,
666
+ options,
667
+ shouldShow
668
+ })
669
+ );
670
+ });
671
+ onBeforeUnmount2(() => {
672
+ const { pluginKey, editor } = props;
673
+ editor.unregisterPlugin(pluginKey);
674
+ });
675
+ return () => {
676
+ var _a;
677
+ return h2(Teleport2, { to: "body" }, h2("div", { ref: root }, (_a = slots.default) == null ? void 0 : _a.call(slots)));
678
+ };
679
+ }
680
+ });
681
+ export {
682
+ BubbleMenu2 as BubbleMenu,
683
+ FloatingMenu2 as FloatingMenu
684
+ };
685
+ //# sourceMappingURL=index.js.map