@tiptap/core 2.1.0-rc.9 → 2.1.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 (258) hide show
  1. package/dist/index.cjs +384 -99
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +373 -98
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.umd.js +384 -99
  6. package/dist/index.umd.js.map +1 -1
  7. package/dist/packages/core/src/CommandManager.d.ts +2 -2
  8. package/dist/packages/core/src/Editor.d.ts +4 -4
  9. package/dist/packages/core/src/Extension.d.ts +7 -7
  10. package/dist/packages/core/src/ExtensionManager.d.ts +2 -2
  11. package/dist/packages/core/src/InputRule.d.ts +2 -2
  12. package/dist/packages/core/src/Mark.d.ts +6 -6
  13. package/dist/packages/core/src/Node.d.ts +5 -5
  14. package/dist/packages/core/src/NodeView.d.ts +3 -3
  15. package/dist/packages/core/src/PasteRule.d.ts +2 -2
  16. package/dist/packages/core/src/commands/blur.d.ts +1 -1
  17. package/dist/packages/core/src/commands/clearContent.d.ts +1 -1
  18. package/dist/packages/core/src/commands/clearNodes.d.ts +1 -1
  19. package/dist/packages/core/src/commands/command.d.ts +1 -1
  20. package/dist/packages/core/src/commands/createParagraphNear.d.ts +1 -1
  21. package/dist/packages/core/src/commands/cut.d.ts +15 -0
  22. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +1 -1
  23. package/dist/packages/core/src/commands/deleteNode.d.ts +1 -1
  24. package/dist/packages/core/src/commands/deleteRange.d.ts +1 -1
  25. package/dist/packages/core/src/commands/deleteSelection.d.ts +1 -1
  26. package/dist/packages/core/src/commands/enter.d.ts +1 -1
  27. package/dist/packages/core/src/commands/exitCode.d.ts +1 -1
  28. package/dist/packages/core/src/commands/extendMarkRange.d.ts +1 -1
  29. package/dist/packages/core/src/commands/first.d.ts +1 -1
  30. package/dist/packages/core/src/commands/focus.d.ts +1 -1
  31. package/dist/packages/core/src/commands/forEach.d.ts +1 -1
  32. package/dist/packages/core/src/commands/index.d.ts +53 -50
  33. package/dist/packages/core/src/commands/insertContent.d.ts +1 -1
  34. package/dist/packages/core/src/commands/insertContentAt.d.ts +1 -1
  35. package/dist/packages/core/src/commands/join.d.ts +1 -1
  36. package/dist/packages/core/src/commands/joinItemBackward.d.ts +12 -0
  37. package/dist/packages/core/src/commands/joinItemForward.d.ts +12 -0
  38. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +1 -1
  39. package/dist/packages/core/src/commands/lift.d.ts +1 -1
  40. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +1 -1
  41. package/dist/packages/core/src/commands/liftListItem.d.ts +1 -1
  42. package/dist/packages/core/src/commands/newlineInCode.d.ts +1 -1
  43. package/dist/packages/core/src/commands/resetAttributes.d.ts +1 -1
  44. package/dist/packages/core/src/commands/scrollIntoView.d.ts +1 -1
  45. package/dist/packages/core/src/commands/selectAll.d.ts +1 -1
  46. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +1 -1
  47. package/dist/packages/core/src/commands/selectNodeForward.d.ts +1 -1
  48. package/dist/packages/core/src/commands/selectParentNode.d.ts +1 -1
  49. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +1 -1
  50. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +1 -1
  51. package/dist/packages/core/src/commands/setContent.d.ts +1 -1
  52. package/dist/packages/core/src/commands/setMark.d.ts +1 -1
  53. package/dist/packages/core/src/commands/setMeta.d.ts +1 -1
  54. package/dist/packages/core/src/commands/setNode.d.ts +1 -1
  55. package/dist/packages/core/src/commands/setNodeSelection.d.ts +1 -1
  56. package/dist/packages/core/src/commands/setTextSelection.d.ts +1 -1
  57. package/dist/packages/core/src/commands/sinkListItem.d.ts +1 -1
  58. package/dist/packages/core/src/commands/splitBlock.d.ts +1 -1
  59. package/dist/packages/core/src/commands/splitListItem.d.ts +1 -1
  60. package/dist/packages/core/src/commands/toggleList.d.ts +1 -1
  61. package/dist/packages/core/src/commands/toggleMark.d.ts +1 -1
  62. package/dist/packages/core/src/commands/toggleNode.d.ts +1 -1
  63. package/dist/packages/core/src/commands/toggleWrap.d.ts +1 -1
  64. package/dist/packages/core/src/commands/undoInputRule.d.ts +1 -1
  65. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +1 -1
  66. package/dist/packages/core/src/commands/unsetMark.d.ts +1 -1
  67. package/dist/packages/core/src/commands/updateAttributes.d.ts +1 -1
  68. package/dist/packages/core/src/commands/wrapIn.d.ts +1 -1
  69. package/dist/packages/core/src/commands/wrapInList.d.ts +1 -1
  70. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  71. package/dist/packages/core/src/extensions/commands.d.ts +2 -2
  72. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  73. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  74. package/dist/packages/core/src/extensions/index.d.ts +6 -6
  75. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  76. package/dist/packages/core/src/extensions/tabindex.d.ts +1 -1
  77. package/dist/packages/core/src/helpers/createDocument.d.ts +1 -1
  78. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +1 -1
  79. package/dist/packages/core/src/helpers/findChildren.d.ts +1 -1
  80. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +1 -1
  81. package/dist/packages/core/src/helpers/findParentNode.d.ts +1 -1
  82. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +1 -1
  83. package/dist/packages/core/src/helpers/generateHTML.d.ts +1 -1
  84. package/dist/packages/core/src/helpers/generateJSON.d.ts +1 -1
  85. package/dist/packages/core/src/helpers/generateText.d.ts +1 -1
  86. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +1 -1
  87. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +1 -1
  88. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +1 -1
  89. package/dist/packages/core/src/helpers/getExtensionField.d.ts +1 -1
  90. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  91. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +1 -1
  93. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  94. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +2 -2
  95. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +1 -1
  96. package/dist/packages/core/src/helpers/getText.d.ts +1 -1
  97. package/dist/packages/core/src/helpers/getTextBetween.d.ts +1 -1
  98. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +1 -1
  99. package/dist/packages/core/src/helpers/index.d.ts +51 -50
  100. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  101. package/dist/packages/core/src/helpers/isAtEndOfNode.d.ts +1 -1
  102. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +1 -1
  103. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  104. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +1 -1
  105. package/dist/packages/core/src/helpers/splitExtensions.d.ts +4 -4
  106. package/dist/packages/core/src/index.d.ts +15 -15
  107. package/dist/packages/core/src/inputRules/index.d.ts +5 -5
  108. package/dist/packages/core/src/inputRules/markInputRule.d.ts +2 -2
  109. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +22 -2
  110. package/dist/packages/core/src/inputRules/textInputRule.d.ts +1 -1
  111. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +2 -2
  112. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +3 -3
  113. package/dist/packages/core/src/pasteRules/index.d.ts +3 -3
  114. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +2 -2
  115. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +2 -2
  116. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +1 -1
  117. package/dist/packages/core/src/types.d.ts +5 -5
  118. package/dist/packages/core/src/utilities/callOrReturn.d.ts +1 -1
  119. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  120. package/dist/packages/core/src/utilities/index.d.ts +20 -20
  121. package/dist/packages/core/src/utilities/isAndroid.d.ts +1 -0
  122. package/dist/packages/extension-list-keymap/src/listHelpers/findListItemPos.d.ts +6 -0
  123. package/dist/packages/extension-list-keymap/src/listHelpers/getNextListDepth.d.ts +2 -0
  124. package/dist/packages/extension-list-keymap/src/listHelpers/handleBackspace.d.ts +2 -0
  125. package/dist/packages/extension-list-keymap/src/listHelpers/handleDelete.d.ts +2 -0
  126. package/dist/packages/extension-list-keymap/src/listHelpers/hasListBefore.d.ts +2 -0
  127. package/dist/packages/extension-list-keymap/src/listHelpers/hasListItemAfter.d.ts +2 -0
  128. package/dist/packages/extension-list-keymap/src/listHelpers/hasListItemBefore.d.ts +2 -0
  129. package/dist/packages/extension-list-keymap/src/listHelpers/index.d.ts +10 -0
  130. package/dist/packages/extension-list-keymap/src/listHelpers/listItemHasSubList.d.ts +3 -0
  131. package/dist/packages/extension-list-keymap/src/listHelpers/nextListIsDeeper.d.ts +2 -0
  132. package/dist/packages/extension-list-keymap/src/listHelpers/nextListIsHigher.d.ts +2 -0
  133. package/package.json +2 -2
  134. package/src/CommandManager.ts +4 -8
  135. package/src/Editor.ts +16 -16
  136. package/src/Extension.ts +10 -10
  137. package/src/ExtensionManager.ts +15 -15
  138. package/src/InputRule.ts +6 -6
  139. package/src/Mark.ts +9 -9
  140. package/src/Node.ts +8 -8
  141. package/src/NodeView.ts +8 -6
  142. package/src/PasteRule.ts +6 -6
  143. package/src/commands/blur.ts +1 -1
  144. package/src/commands/clearContent.ts +1 -1
  145. package/src/commands/clearNodes.ts +1 -1
  146. package/src/commands/command.ts +1 -1
  147. package/src/commands/createParagraphNear.ts +1 -1
  148. package/src/commands/cut.ts +29 -0
  149. package/src/commands/deleteCurrentNode.ts +1 -1
  150. package/src/commands/deleteNode.ts +2 -2
  151. package/src/commands/deleteRange.ts +1 -1
  152. package/src/commands/deleteSelection.ts +1 -1
  153. package/src/commands/enter.ts +1 -1
  154. package/src/commands/exitCode.ts +1 -1
  155. package/src/commands/extendMarkRange.ts +3 -3
  156. package/src/commands/first.ts +1 -1
  157. package/src/commands/focus.ts +4 -4
  158. package/src/commands/forEach.ts +1 -1
  159. package/src/commands/index.ts +53 -50
  160. package/src/commands/insertContent.ts +1 -1
  161. package/src/commands/insertContentAt.ts +4 -4
  162. package/src/commands/join.ts +1 -1
  163. package/src/commands/joinItemBackward.ts +36 -0
  164. package/src/commands/joinItemForward.ts +38 -0
  165. package/src/commands/keyboardShortcut.ts +3 -3
  166. package/src/commands/lift.ts +3 -3
  167. package/src/commands/liftEmptyBlock.ts +1 -1
  168. package/src/commands/liftListItem.ts +2 -2
  169. package/src/commands/newlineInCode.ts +1 -1
  170. package/src/commands/resetAttributes.ts +5 -5
  171. package/src/commands/scrollIntoView.ts +1 -1
  172. package/src/commands/selectAll.ts +1 -1
  173. package/src/commands/selectNodeBackward.ts +1 -1
  174. package/src/commands/selectNodeForward.ts +1 -1
  175. package/src/commands/selectParentNode.ts +1 -1
  176. package/src/commands/selectTextblockEnd.ts +1 -1
  177. package/src/commands/selectTextblockStart.ts +1 -1
  178. package/src/commands/setContent.ts +2 -2
  179. package/src/commands/setMark.ts +4 -4
  180. package/src/commands/setMeta.ts +1 -1
  181. package/src/commands/setNode.ts +2 -2
  182. package/src/commands/setNodeSelection.ts +2 -2
  183. package/src/commands/setTextSelection.ts +2 -2
  184. package/src/commands/sinkListItem.ts +2 -2
  185. package/src/commands/splitBlock.ts +3 -3
  186. package/src/commands/splitListItem.ts +3 -3
  187. package/src/commands/toggleList.ts +4 -4
  188. package/src/commands/toggleMark.ts +3 -3
  189. package/src/commands/toggleNode.ts +3 -3
  190. package/src/commands/toggleWrap.ts +3 -3
  191. package/src/commands/undoInputRule.ts +1 -1
  192. package/src/commands/unsetAllMarks.ts +1 -1
  193. package/src/commands/unsetMark.ts +3 -3
  194. package/src/commands/updateAttributes.ts +4 -4
  195. package/src/commands/wrapIn.ts +2 -2
  196. package/src/commands/wrapInList.ts +2 -2
  197. package/src/extensions/clipboardTextSerializer.ts +3 -3
  198. package/src/extensions/commands.ts +3 -3
  199. package/src/extensions/editable.ts +1 -1
  200. package/src/extensions/focusEvents.ts +1 -1
  201. package/src/extensions/index.ts +6 -6
  202. package/src/extensions/keymap.ts +7 -5
  203. package/src/extensions/tabindex.ts +1 -1
  204. package/src/helpers/createDocument.ts +2 -2
  205. package/src/helpers/createNodeFromContent.ts +2 -2
  206. package/src/helpers/findChildren.ts +1 -1
  207. package/src/helpers/findChildrenInRange.ts +1 -1
  208. package/src/helpers/findParentNode.ts +2 -2
  209. package/src/helpers/findParentNodeClosestToPos.ts +1 -1
  210. package/src/helpers/generateHTML.ts +3 -3
  211. package/src/helpers/generateJSON.ts +3 -3
  212. package/src/helpers/generateText.ts +4 -4
  213. package/src/helpers/getAttributes.ts +3 -3
  214. package/src/helpers/getAttributesFromExtensions.ts +4 -4
  215. package/src/helpers/getChangedRanges.ts +2 -2
  216. package/src/helpers/getDebugJSON.ts +1 -1
  217. package/src/helpers/getExtensionField.ts +1 -1
  218. package/src/helpers/getMarkAttributes.ts +1 -1
  219. package/src/helpers/getMarkRange.ts +2 -2
  220. package/src/helpers/getMarksBetween.ts +2 -2
  221. package/src/helpers/getNodeAttributes.ts +1 -1
  222. package/src/helpers/getRenderedAttributes.ts +2 -2
  223. package/src/helpers/getSchema.ts +4 -4
  224. package/src/helpers/getSchemaByResolvedExtensions.ts +9 -9
  225. package/src/helpers/getSplittedAttributes.ts +1 -1
  226. package/src/helpers/getText.ts +2 -2
  227. package/src/helpers/getTextBetween.ts +1 -1
  228. package/src/helpers/getTextSerializersFromSchema.ts +1 -1
  229. package/src/helpers/index.ts +51 -50
  230. package/src/helpers/injectExtensionAttributesToParseRule.ts +2 -2
  231. package/src/helpers/isActive.ts +3 -3
  232. package/src/helpers/isAtEndOfNode.ts +20 -2
  233. package/src/helpers/isExtensionRulesEnabled.ts +1 -1
  234. package/src/helpers/isList.ts +5 -5
  235. package/src/helpers/isMarkActive.ts +3 -3
  236. package/src/helpers/isNodeActive.ts +3 -3
  237. package/src/helpers/posToDOMRect.ts +1 -1
  238. package/src/helpers/resolveFocusPosition.ts +2 -2
  239. package/src/helpers/splitExtensions.ts +4 -4
  240. package/src/index.ts +15 -15
  241. package/src/inputRules/index.ts +5 -5
  242. package/src/inputRules/markInputRule.ts +5 -6
  243. package/src/inputRules/nodeInputRule.ts +60 -6
  244. package/src/inputRules/textInputRule.ts +1 -1
  245. package/src/inputRules/textblockTypeInputRule.ts +3 -3
  246. package/src/inputRules/wrappingInputRule.ts +4 -4
  247. package/src/pasteRules/index.ts +3 -3
  248. package/src/pasteRules/markPasteRule.ts +4 -4
  249. package/src/pasteRules/nodePasteRule.ts +3 -3
  250. package/src/pasteRules/textPasteRule.ts +1 -1
  251. package/src/types.ts +5 -5
  252. package/src/utilities/callOrReturn.ts +2 -2
  253. package/src/utilities/createStyleTag.ts +3 -3
  254. package/src/utilities/index.ts +20 -20
  255. package/src/utilities/isAndroid.ts +3 -0
  256. package/src/utilities/mergeAttributes.ts +8 -1
  257. package/src/utilities/mergeDeep.ts +1 -1
  258. package/src/utilities/objectIncludes.ts +1 -1
package/dist/index.cjs CHANGED
@@ -121,9 +121,6 @@ class CommandManager {
121
121
  buildProps(tr, shouldDispatch = true) {
122
122
  const { rawCommands, editor, state } = this;
123
123
  const { view } = editor;
124
- if (state.storedMarks) {
125
- tr.setStoredMarks(state.storedMarks);
126
- }
127
124
  const props = {
128
125
  tr,
129
126
  editor,
@@ -133,7 +130,7 @@ class CommandManager {
133
130
  transaction: tr,
134
131
  }),
135
132
  dispatch: shouldDispatch ? () => undefined : undefined,
136
- chain: () => this.createChain(tr),
133
+ chain: () => this.createChain(tr, shouldDispatch),
137
134
  can: () => this.createCan(tr),
138
135
  get commands() {
139
136
  return Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {
@@ -309,7 +306,10 @@ function mergeAttributes(...objects) {
309
306
  return;
310
307
  }
311
308
  if (key === 'class') {
312
- mergedAttributes[key] = [mergedAttributes[key], value].join(' ');
309
+ const valueClasses = value.split(' ');
310
+ const existingClasses = mergedAttributes[key].split(' ');
311
+ const insertClasses = valueClasses.filter(valueClass => !existingClasses.includes(valueClass));
312
+ mergedAttributes[key] = [...existingClasses, ...insertClasses].join(' ');
313
313
  }
314
314
  else if (key === 'style') {
315
315
  mergedAttributes[key] = [mergedAttributes[key], value].join('; ');
@@ -1312,6 +1312,16 @@ const createParagraphNear = () => ({ state, dispatch }) => {
1312
1312
  return commands$1.createParagraphNear(state, dispatch);
1313
1313
  };
1314
1314
 
1315
+ const cut = (originRange, targetPos) => ({ editor, tr }) => {
1316
+ const { state: state$1 } = editor;
1317
+ const contentSlice = state$1.doc.slice(originRange.from, originRange.to);
1318
+ tr.deleteRange(originRange.from, originRange.to);
1319
+ const newPos = tr.mapping.map(targetPos);
1320
+ tr.insert(newPos, contentSlice.content);
1321
+ tr.setSelection(new state.TextSelection(tr.doc.resolve(newPos - 1)));
1322
+ return true;
1323
+ };
1324
+
1315
1325
  const deleteCurrentNode = () => ({ tr, dispatch }) => {
1316
1326
  const { selection } = tr;
1317
1327
  const currentNode = selection.$anchor.node();
@@ -1641,7 +1651,7 @@ const insertContentAt = (position, value, options) => ({ tr, dispatch, editor })
1641
1651
  if (content.toString() === '<>') {
1642
1652
  return true;
1643
1653
  }
1644
- let { from, to } = typeof position === 'number' ? { from: position, to: position } : position;
1654
+ let { from, to } = typeof position === 'number' ? { from: position, to: position } : { from: position.from, to: position.to };
1645
1655
  let isOnlyTextContent = true;
1646
1656
  let isOnlyBlockContent = true;
1647
1657
  const nodes = isFragment(content) ? content : [content];
@@ -1703,6 +1713,40 @@ const joinForward = () => ({ state, dispatch }) => {
1703
1713
  return commands$1.joinForward(state, dispatch);
1704
1714
  };
1705
1715
 
1716
+ const joinItemBackward = () => ({ tr, state, dispatch, }) => {
1717
+ try {
1718
+ const point = transform.joinPoint(state.doc, state.selection.$from.pos, -1);
1719
+ if (point === null || point === undefined) {
1720
+ return false;
1721
+ }
1722
+ tr.join(point, 2);
1723
+ if (dispatch) {
1724
+ dispatch(tr);
1725
+ }
1726
+ return true;
1727
+ }
1728
+ catch {
1729
+ return false;
1730
+ }
1731
+ };
1732
+
1733
+ const joinItemForward = () => ({ state, dispatch, tr, }) => {
1734
+ try {
1735
+ const point = transform.joinPoint(state.doc, state.selection.$from.pos, +1);
1736
+ if (point === null || point === undefined) {
1737
+ return false;
1738
+ }
1739
+ tr.join(point, 2);
1740
+ if (dispatch) {
1741
+ dispatch(tr);
1742
+ }
1743
+ return true;
1744
+ }
1745
+ catch (e) {
1746
+ return false;
1747
+ }
1748
+ };
1749
+
1706
1750
  function isMacOS() {
1707
1751
  return typeof navigator !== 'undefined'
1708
1752
  ? /Mac/.test(navigator.platform)
@@ -1949,6 +1993,283 @@ const setContent = (content, emitUpdate = false, parseOptions = {}) => ({ tr, ed
1949
1993
  return true;
1950
1994
  };
1951
1995
 
1996
+ function getMarkAttributes(state, typeOrName) {
1997
+ const type = getMarkType(typeOrName, state.schema);
1998
+ const { from, to, empty } = state.selection;
1999
+ const marks = [];
2000
+ if (empty) {
2001
+ if (state.storedMarks) {
2002
+ marks.push(...state.storedMarks);
2003
+ }
2004
+ marks.push(...state.selection.$head.marks());
2005
+ }
2006
+ else {
2007
+ state.doc.nodesBetween(from, to, node => {
2008
+ marks.push(...node.marks);
2009
+ });
2010
+ }
2011
+ const mark = marks.find(markItem => markItem.type.name === type.name);
2012
+ if (!mark) {
2013
+ return {};
2014
+ }
2015
+ return { ...mark.attrs };
2016
+ }
2017
+
2018
+ const findListItemPos = (typeOrName, state) => {
2019
+ const { $from } = state.selection;
2020
+ const nodeType = getNodeType(typeOrName, state.schema);
2021
+ let currentNode = null;
2022
+ let currentDepth = $from.depth;
2023
+ let currentPos = $from.pos;
2024
+ let targetDepth = null;
2025
+ while (currentDepth > 0 && targetDepth === null) {
2026
+ currentNode = $from.node(currentDepth);
2027
+ if (currentNode.type === nodeType) {
2028
+ targetDepth = currentDepth;
2029
+ }
2030
+ else {
2031
+ currentDepth -= 1;
2032
+ currentPos -= 1;
2033
+ }
2034
+ }
2035
+ if (targetDepth === null) {
2036
+ return null;
2037
+ }
2038
+ return { $pos: state.doc.resolve(currentPos), depth: targetDepth };
2039
+ };
2040
+
2041
+ /**
2042
+ * Finds the first node of a given type or name in the current selection.
2043
+ * @param state The editor state.
2044
+ * @param typeOrName The node type or name.
2045
+ * @param pos The position to start searching from.
2046
+ * @param maxDepth The maximum depth to search.
2047
+ * @returns The node and the depth as an array.
2048
+ */
2049
+ const getNodeAtPosition = (state, typeOrName, pos, maxDepth = 20) => {
2050
+ const $pos = state.doc.resolve(pos);
2051
+ let currentDepth = maxDepth;
2052
+ let node = null;
2053
+ while (currentDepth > 0 && node === null) {
2054
+ const currentNode = $pos.node(currentDepth);
2055
+ if ((currentNode === null || currentNode === void 0 ? void 0 : currentNode.type.name) === typeOrName) {
2056
+ node = currentNode;
2057
+ }
2058
+ else {
2059
+ currentDepth -= 1;
2060
+ }
2061
+ }
2062
+ return [node, currentDepth];
2063
+ };
2064
+
2065
+ const getNextListDepth = (typeOrName, state) => {
2066
+ const listItemPos = findListItemPos(typeOrName, state);
2067
+ if (!listItemPos) {
2068
+ return false;
2069
+ }
2070
+ const [, depth] = getNodeAtPosition(state, typeOrName, listItemPos.$pos.pos + 4);
2071
+ return depth;
2072
+ };
2073
+
2074
+ const isAtStartOfNode = (state) => {
2075
+ const { $from, $to } = state.selection;
2076
+ if ($from.parentOffset > 0 || $from.pos !== $to.pos) {
2077
+ return false;
2078
+ }
2079
+ return true;
2080
+ };
2081
+
2082
+ const hasListBefore = (editorState, name, parentListTypes) => {
2083
+ const { $anchor } = editorState.selection;
2084
+ const previousNodePos = Math.max(0, $anchor.pos - 2);
2085
+ const previousNode = editorState.doc.resolve(previousNodePos).node();
2086
+ if (!previousNode || !parentListTypes.includes(previousNode.type.name)) {
2087
+ return false;
2088
+ }
2089
+ return true;
2090
+ };
2091
+
2092
+ const hasListItemBefore = (typeOrName, state) => {
2093
+ var _a;
2094
+ const { $anchor } = state.selection;
2095
+ const $targetPos = state.doc.resolve($anchor.pos - 2);
2096
+ if ($targetPos.index() === 0) {
2097
+ return false;
2098
+ }
2099
+ if (((_a = $targetPos.nodeBefore) === null || _a === void 0 ? void 0 : _a.type.name) !== typeOrName) {
2100
+ return false;
2101
+ }
2102
+ return true;
2103
+ };
2104
+
2105
+ const listItemHasSubList = (typeOrName, state, node) => {
2106
+ if (!node) {
2107
+ return false;
2108
+ }
2109
+ const nodeType = getNodeType(typeOrName, state.schema);
2110
+ let hasSubList = false;
2111
+ node.descendants(child => {
2112
+ if (child.type === nodeType) {
2113
+ hasSubList = true;
2114
+ }
2115
+ });
2116
+ return hasSubList;
2117
+ };
2118
+
2119
+ const handleBackspace = (editor, name, parentListTypes) => {
2120
+ // this is required to still handle the undo handling
2121
+ if (editor.commands.undoInputRule()) {
2122
+ return true;
2123
+ }
2124
+ // if the current item is NOT inside a list item &
2125
+ // the previous item is a list (orderedList or bulletList)
2126
+ // move the cursor into the list and delete the current item
2127
+ if (!isNodeActive(editor.state, name) && hasListBefore(editor.state, name, parentListTypes)) {
2128
+ const { $anchor } = editor.state.selection;
2129
+ const $listPos = editor.state.doc.resolve($anchor.before() - 1);
2130
+ const listDescendants = [];
2131
+ $listPos.node().descendants((node, pos) => {
2132
+ if (node.type.name === name) {
2133
+ listDescendants.push({ node, pos });
2134
+ }
2135
+ });
2136
+ const lastItem = listDescendants.at(-1);
2137
+ if (!lastItem) {
2138
+ return false;
2139
+ }
2140
+ const $lastItemPos = editor.state.doc.resolve($listPos.start() + lastItem.pos + 1);
2141
+ return editor.chain().cut({ from: $anchor.start() - 1, to: $anchor.end() + 1 }, $lastItemPos.end()).joinForward().run();
2142
+ }
2143
+ // if the cursor is not inside the current node type
2144
+ // do nothing and proceed
2145
+ if (!isNodeActive(editor.state, name)) {
2146
+ return false;
2147
+ }
2148
+ // if the cursor is not at the start of a node
2149
+ // do nothing and proceed
2150
+ if (!isAtStartOfNode(editor.state)) {
2151
+ return false;
2152
+ }
2153
+ const listItemPos = findListItemPos(name, editor.state);
2154
+ if (!listItemPos) {
2155
+ return false;
2156
+ }
2157
+ const $prev = editor.state.doc.resolve(listItemPos.$pos.pos - 2);
2158
+ const prevNode = $prev.node(listItemPos.depth);
2159
+ const previousListItemHasSubList = listItemHasSubList(name, editor.state, prevNode);
2160
+ // if the previous item is a list item and doesn't have a sublist, join the list items
2161
+ if (hasListItemBefore(name, editor.state) && !previousListItemHasSubList) {
2162
+ return editor.commands.joinItemBackward();
2163
+ }
2164
+ // otherwise in the end, a backspace should
2165
+ // always just lift the list item if
2166
+ // joining / merging is not possible
2167
+ return editor.chain().liftListItem(name).run();
2168
+ };
2169
+
2170
+ function findParentNodeClosestToPos($pos, predicate) {
2171
+ for (let i = $pos.depth; i > 0; i -= 1) {
2172
+ const node = $pos.node(i);
2173
+ if (predicate(node)) {
2174
+ return {
2175
+ pos: i > 0 ? $pos.before(i) : 0,
2176
+ start: $pos.start(i),
2177
+ depth: i,
2178
+ node,
2179
+ };
2180
+ }
2181
+ }
2182
+ }
2183
+
2184
+ function findParentNode(predicate) {
2185
+ return (selection) => findParentNodeClosestToPos(selection.$from, predicate);
2186
+ }
2187
+
2188
+ const isAtEndOfNode = (state, nodeType) => {
2189
+ const { $from, $to, $anchor } = state.selection;
2190
+ if (nodeType) {
2191
+ const parentNode = findParentNode(node => node.type.name === nodeType)(state.selection);
2192
+ if (!parentNode) {
2193
+ return false;
2194
+ }
2195
+ const $parentPos = state.doc.resolve(parentNode.pos + 1);
2196
+ if ($anchor.pos + 1 === $parentPos.end()) {
2197
+ return true;
2198
+ }
2199
+ return false;
2200
+ }
2201
+ if ($to.parentOffset < $to.parent.nodeSize - 2 || $from.pos !== $to.pos) {
2202
+ return false;
2203
+ }
2204
+ return true;
2205
+ };
2206
+
2207
+ const nextListIsDeeper = (typeOrName, state) => {
2208
+ const listDepth = getNextListDepth(typeOrName, state);
2209
+ const listItemPos = findListItemPos(typeOrName, state);
2210
+ if (!listItemPos || !listDepth) {
2211
+ return false;
2212
+ }
2213
+ if (listDepth > listItemPos.depth) {
2214
+ return true;
2215
+ }
2216
+ return false;
2217
+ };
2218
+
2219
+ const nextListIsHigher = (typeOrName, state) => {
2220
+ const listDepth = getNextListDepth(typeOrName, state);
2221
+ const listItemPos = findListItemPos(typeOrName, state);
2222
+ if (!listItemPos || !listDepth) {
2223
+ return false;
2224
+ }
2225
+ if (listDepth < listItemPos.depth) {
2226
+ return true;
2227
+ }
2228
+ return false;
2229
+ };
2230
+
2231
+ const handleDelete = (editor, name) => {
2232
+ // if the cursor is not inside the current node type
2233
+ // do nothing and proceed
2234
+ if (!isNodeActive(editor.state, name)) {
2235
+ return false;
2236
+ }
2237
+ // if the cursor is not at the end of a node
2238
+ // do nothing and proceed
2239
+ if (!isAtEndOfNode(editor.state, name)) {
2240
+ return false;
2241
+ }
2242
+ // check if the next node is a list with a deeper depth
2243
+ if (nextListIsDeeper(name, editor.state)) {
2244
+ return editor
2245
+ .chain()
2246
+ .focus(editor.state.selection.from + 4)
2247
+ .lift(name)
2248
+ .joinBackward()
2249
+ .run();
2250
+ }
2251
+ if (nextListIsHigher(name, editor.state)) {
2252
+ return editor.chain()
2253
+ .joinForward()
2254
+ .joinBackward()
2255
+ .run();
2256
+ }
2257
+ return editor.commands.joinItemForward();
2258
+ };
2259
+
2260
+ const hasListItemAfter = (typeOrName, state) => {
2261
+ var _a;
2262
+ const { $anchor } = state.selection;
2263
+ const $targetPos = state.doc.resolve($anchor.pos - $anchor.parentOffset - 2);
2264
+ if ($targetPos.index() === $targetPos.parent.childCount - 1) {
2265
+ return false;
2266
+ }
2267
+ if (((_a = $targetPos.nodeAfter) === null || _a === void 0 ? void 0 : _a.type.name) !== typeOrName) {
2268
+ return false;
2269
+ }
2270
+ return true;
2271
+ };
2272
+
1952
2273
  /**
1953
2274
  * Returns a new `Transform` based on all steps of the passed transactions.
1954
2275
  */
@@ -2010,24 +2331,6 @@ function findChildrenInRange(node, range, predicate) {
2010
2331
  return nodesWithPos;
2011
2332
  }
2012
2333
 
2013
- function findParentNodeClosestToPos($pos, predicate) {
2014
- for (let i = $pos.depth; i > 0; i -= 1) {
2015
- const node = $pos.node(i);
2016
- if (predicate(node)) {
2017
- return {
2018
- pos: i > 0 ? $pos.before(i) : 0,
2019
- start: $pos.start(i),
2020
- depth: i,
2021
- node,
2022
- };
2023
- }
2024
- }
2025
- }
2026
-
2027
- function findParentNode(predicate) {
2028
- return (selection) => findParentNodeClosestToPos(selection.$from, predicate);
2029
- }
2030
-
2031
2334
  function getHTMLFromFragment(fragment, schema) {
2032
2335
  const documentFragment = model.DOMSerializer.fromSchema(schema).serializeFragment(fragment);
2033
2336
  const temporaryDocument = document.implementation.createHTMLDocument();
@@ -2074,28 +2377,6 @@ function generateText(doc, extensions, options) {
2074
2377
  });
2075
2378
  }
2076
2379
 
2077
- function getMarkAttributes(state, typeOrName) {
2078
- const type = getMarkType(typeOrName, state.schema);
2079
- const { from, to, empty } = state.selection;
2080
- const marks = [];
2081
- if (empty) {
2082
- if (state.storedMarks) {
2083
- marks.push(...state.storedMarks);
2084
- }
2085
- marks.push(...state.selection.$head.marks());
2086
- }
2087
- else {
2088
- state.doc.nodesBetween(from, to, node => {
2089
- marks.push(...node.marks);
2090
- });
2091
- }
2092
- const mark = marks.find(markItem => markItem.type.name === type.name);
2093
- if (!mark) {
2094
- return {};
2095
- }
2096
- return { ...mark.attrs };
2097
- }
2098
-
2099
2380
  function getNodeAttributes(state, typeOrName) {
2100
2381
  const type = getNodeType(typeOrName, state.schema);
2101
2382
  const { from, to } = state.selection;
@@ -2267,30 +2548,6 @@ function getMarksBetween(from, to, doc) {
2267
2548
  return marks;
2268
2549
  }
2269
2550
 
2270
- /**
2271
- * Finds the first node of a given type or name in the current selection.
2272
- * @param state The editor state.
2273
- * @param typeOrName The node type or name.
2274
- * @param pos The position to start searching from.
2275
- * @param maxDepth The maximum depth to search.
2276
- * @returns The node and the depth as an array.
2277
- */
2278
- const getNodeAtPosition = (state, typeOrName, pos, maxDepth = 20) => {
2279
- const $pos = state.doc.resolve(pos);
2280
- let currentDepth = maxDepth;
2281
- let node = null;
2282
- while (currentDepth > 0 && node === null) {
2283
- const currentNode = $pos.node(currentDepth);
2284
- if ((currentNode === null || currentNode === void 0 ? void 0 : currentNode.type.name) === typeOrName) {
2285
- node = currentNode;
2286
- }
2287
- else {
2288
- currentDepth -= 1;
2289
- }
2290
- }
2291
- return [node, currentDepth];
2292
- };
2293
-
2294
2551
  function getSplittedAttributes(extensionAttributes, typeName, attributes) {
2295
2552
  return Object.fromEntries(Object
2296
2553
  .entries(attributes)
@@ -2381,22 +2638,6 @@ function isActive(state, name, attributes = {}) {
2381
2638
  return false;
2382
2639
  }
2383
2640
 
2384
- const istAtEndOfNode = (state) => {
2385
- const { $from, $to } = state.selection;
2386
- if ($to.parentOffset < $to.parent.nodeSize - 2 || $from.pos !== $to.pos) {
2387
- return false;
2388
- }
2389
- return true;
2390
- };
2391
-
2392
- const isAtStartOfNode = (state) => {
2393
- const { $from, $to } = state.selection;
2394
- if ($from.parentOffset > 0 || $from.pos !== $to.pos) {
2395
- return false;
2396
- }
2397
- return true;
2398
- };
2399
-
2400
2641
  function isList(name, extensions) {
2401
2642
  const { nodeExtensions } = splitExtensions(extensions);
2402
2643
  const extension = nodeExtensions.find(item => item.name === name);
@@ -3004,6 +3245,7 @@ var commands = /*#__PURE__*/Object.freeze({
3004
3245
  clearNodes: clearNodes,
3005
3246
  command: command,
3006
3247
  createParagraphNear: createParagraphNear,
3248
+ cut: cut,
3007
3249
  deleteCurrentNode: deleteCurrentNode,
3008
3250
  deleteNode: deleteNode,
3009
3251
  deleteRange: deleteRange,
@@ -3020,6 +3262,8 @@ var commands = /*#__PURE__*/Object.freeze({
3020
3262
  joinDown: joinDown,
3021
3263
  joinBackward: joinBackward,
3022
3264
  joinForward: joinForward,
3265
+ joinItemBackward: joinItemBackward,
3266
+ joinItemForward: joinItemForward,
3023
3267
  keyboardShortcut: keyboardShortcut,
3024
3268
  lift: lift,
3025
3269
  liftEmptyBlock: liftEmptyBlock,
@@ -3321,8 +3565,8 @@ img.ProseMirror-separator {
3321
3565
  opacity: 0
3322
3566
  }`;
3323
3567
 
3324
- function createStyleTag(style, nonce) {
3325
- const tiptapStyleTag = document.querySelector('style[data-tiptap-style]');
3568
+ function createStyleTag(style, nonce, suffix) {
3569
+ const tiptapStyleTag = document.querySelector(`style[data-tiptap-style${suffix ? `-${suffix}` : ''}]`);
3326
3570
  if (tiptapStyleTag !== null) {
3327
3571
  return tiptapStyleTag;
3328
3572
  }
@@ -3330,7 +3574,7 @@ function createStyleTag(style, nonce) {
3330
3574
  if (nonce) {
3331
3575
  styleNode.setAttribute('nonce', nonce);
3332
3576
  }
3333
- styleNode.setAttribute('data-tiptap-style', '');
3577
+ styleNode.setAttribute(`data-tiptap-style${suffix ? `-${suffix}` : ''}`, '');
3334
3578
  styleNode.innerHTML = style;
3335
3579
  document.getElementsByTagName('head')[0].appendChild(styleNode);
3336
3580
  return styleNode;
@@ -3707,7 +3951,6 @@ function markInputRule(config) {
3707
3951
  const { tr } = state;
3708
3952
  const captureGroup = match[match.length - 1];
3709
3953
  const fullMatch = match[0];
3710
- let markEnd = range.to;
3711
3954
  if (captureGroup) {
3712
3955
  const startSpaces = fullMatch.search(/\S/);
3713
3956
  const textStart = range.from + fullMatch.indexOf(captureGroup);
@@ -3728,7 +3971,7 @@ function markInputRule(config) {
3728
3971
  if (textStart > range.from) {
3729
3972
  tr.delete(range.from + startSpaces, textStart);
3730
3973
  }
3731
- markEnd = range.from + startSpaces + captureGroup.length;
3974
+ const markEnd = range.from + startSpaces + captureGroup.length;
3732
3975
  tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));
3733
3976
  tr.removeStoredMark(config.type);
3734
3977
  }
@@ -3743,11 +3986,14 @@ function markInputRule(config) {
3743
3986
  function nodeInputRule(config) {
3744
3987
  return new InputRule({
3745
3988
  find: config.find,
3746
- handler: ({ state, range, match }) => {
3989
+ handler: ({ state: state$1, range, match }) => {
3990
+ var _a;
3747
3991
  const attributes = callOrReturn(config.getAttributes, undefined, match) || {};
3748
- const { tr } = state;
3749
- const start = range.from;
3992
+ const { tr } = state$1;
3993
+ const start = config.blockReplace ? range.from - 1 : range.from;
3750
3994
  let end = range.to;
3995
+ const newNode = config.type.create(attributes);
3996
+ const { $to } = tr.selection;
3751
3997
  if (match[1]) {
3752
3998
  const offset = match[0].lastIndexOf(match[1]);
3753
3999
  let matchStart = start + offset;
@@ -3761,10 +4007,34 @@ function nodeInputRule(config) {
3761
4007
  const lastChar = match[0][match[0].length - 1];
3762
4008
  tr.insertText(lastChar, start + match[0].length - 1);
3763
4009
  // insert node from input rule
3764
- tr.replaceWith(matchStart, end, config.type.create(attributes));
4010
+ tr.replaceWith(matchStart, end, newNode);
3765
4011
  }
3766
4012
  else if (match[0]) {
3767
- tr.replaceWith(start, end, config.type.create(attributes));
4013
+ tr.replaceWith(start, end, newNode);
4014
+ }
4015
+ if (config.blockReplace && config.addExtraNewline) {
4016
+ const posAfter = $to.end();
4017
+ if ($to.nodeAfter) {
4018
+ console.log($to.node().type.name);
4019
+ if ($to.nodeAfter.isTextblock) {
4020
+ tr.setSelection(state.TextSelection.create(tr.doc, $to.pos + 1));
4021
+ }
4022
+ else if ($to.nodeAfter.isBlock) {
4023
+ tr.setSelection(state.NodeSelection.create(tr.doc, $to.pos));
4024
+ }
4025
+ else {
4026
+ tr.setSelection(state.TextSelection.create(tr.doc, $to.pos));
4027
+ }
4028
+ }
4029
+ else {
4030
+ // add node after horizontal rule if it’s the end of the document
4031
+ const node = (_a = $to.parent.type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.create();
4032
+ if (node) {
4033
+ tr.insert(posAfter, node);
4034
+ tr.setSelection(state.TextSelection.create(tr.doc, posAfter + 1));
4035
+ }
4036
+ }
4037
+ tr.scrollIntoView();
3768
4038
  }
3769
4039
  },
3770
4040
  });
@@ -4016,6 +4286,10 @@ class Node {
4016
4286
  }
4017
4287
  }
4018
4288
 
4289
+ function isAndroid() {
4290
+ return navigator.platform === 'Android' || /android/i.test(navigator.userAgent);
4291
+ }
4292
+
4019
4293
  class NodeView {
4020
4294
  constructor(component, props, options) {
4021
4295
  this.isDragging = false;
@@ -4156,13 +4430,14 @@ class NodeView {
4156
4430
  if (mutation.type === 'selection') {
4157
4431
  return false;
4158
4432
  }
4159
- // try to prevent a bug on iOS that will break node views on enter
4433
+ // try to prevent a bug on iOS and Android that will break node views on enter
4160
4434
  // this is because ProseMirror can’t preventDispatch on enter
4161
4435
  // this will lead to a re-render of the node view on enter
4162
4436
  // see: https://github.com/ueberdosis/tiptap/issues/1214
4437
+ // see: https://github.com/ueberdosis/tiptap/issues/2534
4163
4438
  if (this.dom.contains(mutation.target)
4164
4439
  && mutation.type === 'childList'
4165
- && isiOS()
4440
+ && (isiOS() || isAndroid())
4166
4441
  && this.editor.isFocused) {
4167
4442
  const changedNodes = [
4168
4443
  ...Array.from(mutation.addedNodes),
@@ -4349,6 +4624,7 @@ exports.extensions = extensions;
4349
4624
  exports.findChildren = findChildren;
4350
4625
  exports.findChildrenInRange = findChildrenInRange;
4351
4626
  exports.findDuplicates = findDuplicates;
4627
+ exports.findListItemPos = findListItemPos;
4352
4628
  exports.findParentNode = findParentNode;
4353
4629
  exports.findParentNodeClosestToPos = findParentNodeClosestToPos;
4354
4630
  exports.fromString = fromString;
@@ -4365,6 +4641,7 @@ exports.getMarkAttributes = getMarkAttributes;
4365
4641
  exports.getMarkRange = getMarkRange;
4366
4642
  exports.getMarkType = getMarkType;
4367
4643
  exports.getMarksBetween = getMarksBetween;
4644
+ exports.getNextListDepth = getNextListDepth;
4368
4645
  exports.getNodeAtPosition = getNodeAtPosition;
4369
4646
  exports.getNodeAttributes = getNodeAttributes;
4370
4647
  exports.getNodeType = getNodeType;
@@ -4378,9 +4655,15 @@ exports.getText = getText;
4378
4655
  exports.getTextBetween = getTextBetween;
4379
4656
  exports.getTextContentFromNodes = getTextContentFromNodes;
4380
4657
  exports.getTextSerializersFromSchema = getTextSerializersFromSchema;
4658
+ exports.handleBackspace = handleBackspace;
4659
+ exports.handleDelete = handleDelete;
4660
+ exports.hasListBefore = hasListBefore;
4661
+ exports.hasListItemAfter = hasListItemAfter;
4662
+ exports.hasListItemBefore = hasListItemBefore;
4381
4663
  exports.injectExtensionAttributesToParseRule = injectExtensionAttributesToParseRule;
4382
4664
  exports.inputRulesPlugin = inputRulesPlugin;
4383
4665
  exports.isActive = isActive;
4666
+ exports.isAtEndOfNode = isAtEndOfNode;
4384
4667
  exports.isAtStartOfNode = isAtStartOfNode;
4385
4668
  exports.isEmptyObject = isEmptyObject;
4386
4669
  exports.isExtensionRulesEnabled = isExtensionRulesEnabled;
@@ -4397,12 +4680,14 @@ exports.isRegExp = isRegExp;
4397
4680
  exports.isString = isString;
4398
4681
  exports.isTextSelection = isTextSelection;
4399
4682
  exports.isiOS = isiOS;
4400
- exports.istAtEndOfNode = istAtEndOfNode;
4683
+ exports.listItemHasSubList = listItemHasSubList;
4401
4684
  exports.markInputRule = markInputRule;
4402
4685
  exports.markPasteRule = markPasteRule;
4403
4686
  exports.mergeAttributes = mergeAttributes;
4404
4687
  exports.mergeDeep = mergeDeep;
4405
4688
  exports.minMax = minMax;
4689
+ exports.nextListIsDeeper = nextListIsDeeper;
4690
+ exports.nextListIsHigher = nextListIsHigher;
4406
4691
  exports.nodeInputRule = nodeInputRule;
4407
4692
  exports.nodePasteRule = nodePasteRule;
4408
4693
  exports.objectIncludes = objectIncludes;