@ctzhian/tiptap 1.13.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 (83) hide show
  1. package/dist/Editor/demo.js +133 -123
  2. package/dist/Editor/index.js +17 -0
  3. package/dist/EditorToolbar/index.js +11 -9
  4. package/dist/asset/css/index.css +5 -7
  5. package/dist/component/ActionDropdown/index.d.ts +5 -0
  6. package/dist/component/ActionDropdown/index.js +8 -3
  7. package/dist/component/CustomBubbleMenu/index.js +1 -1
  8. package/dist/component/CustomDragHandle/index.js +3 -59
  9. package/dist/component/FloatingPopover/index.d.ts +2 -2
  10. package/dist/component/HoverPopover/index.d.ts +2 -0
  11. package/dist/component/HoverPopover/index.js +22 -3
  12. package/dist/component/Icons/delete-back-2-line-icon.d.ts +6 -0
  13. package/dist/component/Icons/delete-back-2-line-icon.js +13 -0
  14. package/dist/component/Icons/{expand-horizontal-line.js → expand-horizontal-line-icon.js} +1 -1
  15. package/dist/component/Icons/index.d.ts +3 -2
  16. package/dist/component/Icons/index.js +4 -3
  17. package/dist/component/Menu/index.js +5 -1
  18. package/dist/contants/enums.d.ts +9 -0
  19. package/dist/contants/enums.js +61 -1
  20. package/dist/extension/component/Alert/index.js +141 -137
  21. package/dist/extension/component/Flow/Edit.d.ts +1 -1
  22. package/dist/extension/component/Flow/Edit.js +3 -31
  23. package/dist/extension/component/Flow/index.js +20 -19
  24. package/dist/extension/component/Image/index.d.ts +1 -0
  25. package/dist/extension/component/Image/index.js +16 -2
  26. package/dist/extension/component/Link/index.js +1 -1
  27. package/dist/extension/component/TableCellHandleMenu/index.d.ts +9 -0
  28. package/dist/extension/component/TableCellHandleMenu/index.js +500 -0
  29. package/dist/extension/component/TableExtendButton/TableExtendButton.css +30 -0
  30. package/dist/extension/component/TableExtendButton/index.d.ts +23 -0
  31. package/dist/extension/component/TableExtendButton/index.js +201 -0
  32. package/dist/extension/component/TableExtendButton/use-table-extend-row-column.d.ts +15 -0
  33. package/dist/extension/component/TableExtendButton/use-table-extend-row-column.js +87 -0
  34. package/dist/extension/component/TableHandle/TableHandleMenu.css +36 -0
  35. package/dist/extension/component/TableHandle/TableHandleMenu.d.ts +17 -0
  36. package/dist/extension/component/TableHandle/TableHandleMenu.js +685 -0
  37. package/dist/extension/component/TableHandle/index.d.ts +28 -0
  38. package/dist/extension/component/TableHandle/index.js +93 -0
  39. package/dist/extension/component/TableHandle/use-table-handle-positioning.d.ts +40 -0
  40. package/dist/extension/component/TableHandle/use-table-handle-positioning.js +193 -0
  41. package/dist/extension/component/TableHandle/use-table-handle-state.d.ts +22 -0
  42. package/dist/extension/component/TableHandle/use-table-handle-state.js +45 -0
  43. package/dist/extension/component/TableSelectionOverlay/index.d.ts +16 -0
  44. package/dist/extension/component/TableSelectionOverlay/index.js +452 -0
  45. package/dist/extension/component/Video/Insert.js +4 -2
  46. package/dist/extension/component/Video/Readonly.js +4 -11
  47. package/dist/extension/component/Video/index.d.ts +2 -1
  48. package/dist/extension/component/Video/index.js +447 -65
  49. package/dist/extension/extension/ImeComposition.d.ts +2 -0
  50. package/dist/extension/extension/ImeComposition.js +145 -0
  51. package/dist/extension/extension/index.d.ts +1 -0
  52. package/dist/extension/extension/index.js +1 -0
  53. package/dist/extension/index.js +2 -2
  54. package/dist/extension/node/FileHandler.d.ts +1 -1
  55. package/dist/extension/node/Flow/index.d.ts +0 -3
  56. package/dist/extension/node/Flow/index.js +7 -4
  57. package/dist/extension/node/Link/index.js +4 -3
  58. package/dist/extension/node/Table.js +236 -117
  59. package/dist/extension/node/TableHandler/create-image.d.ts +9 -0
  60. package/dist/extension/node/TableHandler/create-image.js +235 -0
  61. package/dist/extension/node/TableHandler/index.d.ts +15 -0
  62. package/dist/extension/node/TableHandler/index.js +33 -0
  63. package/dist/extension/node/TableHandler/plugin.d.ts +49 -0
  64. package/dist/extension/node/TableHandler/plugin.js +1030 -0
  65. package/dist/extension/node/TableOfContents/index.d.ts +5 -3
  66. package/dist/extension/node/TableOfContents/index.js +22 -2
  67. package/dist/extension/node/Video.d.ts +1 -0
  68. package/dist/extension/node/Video.js +38 -6
  69. package/dist/hook/index.js +1 -1
  70. package/dist/index.css +45 -29
  71. package/dist/type/index.d.ts +2 -0
  72. package/dist/util/index.d.ts +9 -0
  73. package/dist/util/index.js +26 -0
  74. package/dist/util/table-utils.d.ts +161 -0
  75. package/dist/util/table-utils.js +605 -0
  76. package/package.json +2 -1
  77. package/dist/extension/component/Table/ContextMenu.d.ts +0 -11
  78. package/dist/extension/component/Table/ContextMenu.js +0 -186
  79. package/dist/extension/component/Table/TableContextMenuPlugin.d.ts +0 -9
  80. package/dist/extension/component/Table/TableContextMenuPlugin.js +0 -336
  81. package/dist/extension/component/Table/index.d.ts +0 -2
  82. package/dist/extension/component/Table/index.js +0 -2
  83. /package/dist/component/Icons/{expand-horizontal-line.d.ts → expand-horizontal-line-icon.d.ts} +0 -0
@@ -0,0 +1,145 @@
1
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
2
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
4
+ import { Extension } from '@tiptap/core';
5
+ import { Plugin, PluginKey } from '@tiptap/pm/state';
6
+
7
+ /**
8
+ * Extension to fix IME (Input Method Editor) composition issues
9
+ *
10
+ * This extension provides basic IME composition support by tracking composition state
11
+ * and preventing keyboard handlers from interrupting IME input.
12
+ *
13
+ * Also fixes Safari-specific issue where composition text is deleted after composition ends.
14
+ * This Safari bug occurs at any input position (not just in tables), so this extension
15
+ * provides a global fix for all editor instances.
16
+ */
17
+ var imeCompositionPluginKey = new PluginKey('imeComposition');
18
+ export var ImeComposition = Extension.create({
19
+ name: 'imeComposition',
20
+ addProseMirrorPlugins: function addProseMirrorPlugins() {
21
+ var ZERO_WIDTH_SPACE = "\u200B";
22
+
23
+ // 检测是否为 Safari 浏览器
24
+ var isSafari = function () {
25
+ if (typeof navigator === 'undefined') return false;
26
+ var ua = navigator.userAgent;
27
+ var isAppleMobile = /iP(ad|hone|od)/.test(ua);
28
+ var isMacSafari = /Safari\//.test(ua) && !/Chrome\//.test(ua);
29
+ return isAppleMobile || isMacSafari;
30
+ }();
31
+
32
+ // 判断是否为文本节点
33
+ var isTextNode = function isTextNode(node) {
34
+ return !!node && node.nodeType === 3;
35
+ };
36
+ return [new Plugin({
37
+ key: imeCompositionPluginKey,
38
+ state: {
39
+ init: function init() {
40
+ return {
41
+ isComposing: false
42
+ };
43
+ },
44
+ apply: function apply(tr, value) {
45
+ // 从 transaction meta 中获取组合状态
46
+ var meta = tr.getMeta(imeCompositionPluginKey);
47
+ if (meta) {
48
+ return {
49
+ isComposing: meta.isComposing
50
+ };
51
+ }
52
+ return value;
53
+ }
54
+ },
55
+ props: {
56
+ handleKeyDown: function handleKeyDown(view, event) {
57
+ var pluginState = imeCompositionPluginKey.getState(view.state);
58
+ // 如果正在输入法组合中,不处理键盘事件
59
+ // 检查 event.isComposing 和插件状态,确保 IME 输入不被键盘处理器打断
60
+ if (event.isComposing || pluginState !== null && pluginState !== void 0 && pluginState.isComposing) {
61
+ return false;
62
+ }
63
+ return false;
64
+ },
65
+ handleDOMEvents: {
66
+ // 监听输入法组合开始事件
67
+ compositionstart: function compositionstart(view, event) {
68
+ var state = view.state,
69
+ dispatch = view.dispatch;
70
+ var tr = state.tr.setMeta(imeCompositionPluginKey, {
71
+ isComposing: true
72
+ }).setMeta('composition', true);
73
+ dispatch(tr);
74
+ return false;
75
+ },
76
+ // 监听输入法组合结束事件
77
+ compositionend: function compositionend(view, event) {
78
+ var state = view.state,
79
+ dispatch = view.dispatch;
80
+ var tr = state.tr.setMeta(imeCompositionPluginKey, {
81
+ isComposing: false
82
+ }).setMeta('composition', false);
83
+ dispatch(tr);
84
+ return false;
85
+ },
86
+ // Safari 特定的修复:处理中文合成结束后触发的删除合成文本行为
87
+ // 这个问题在 Safari 中会在任意输入位置出现,不仅仅是 table
88
+ beforeinput: isSafari ? function (view, event) {
89
+ // 仅处理 Safari 在中文合成结束后触发的删除合成文本行为
90
+ var inputEvent = event;
91
+ if (inputEvent.inputType !== 'deleteCompositionText') {
92
+ return false;
93
+ }
94
+ var selection = window.getSelection();
95
+ if (!selection || selection.rangeCount === 0) return false;
96
+ var range = selection.getRangeAt(0);
97
+ var startContainer = range.startContainer,
98
+ endContainer = range.endContainer,
99
+ startOffset = range.startOffset,
100
+ endOffset = range.endOffset;
101
+
102
+ // 如果选中的是整个文本节点,在节点前插入零宽空格防止被删除
103
+ if (isTextNode(startContainer) && startContainer === endContainer && startOffset === 0 && endOffset === startContainer.length) {
104
+ var _startContainer$paren;
105
+ (_startContainer$paren = startContainer.parentElement) === null || _startContainer$paren === void 0 || _startContainer$paren.insertBefore(document.createTextNode(ZERO_WIDTH_SPACE), startContainer);
106
+ }
107
+ // 让 ProseMirror 照常处理
108
+ return false;
109
+ } : undefined,
110
+ // Safari 特定的修复:清理零宽空格
111
+ input: isSafari ? function (view, event) {
112
+ var inputEvent = event;
113
+ if (inputEvent.inputType !== 'deleteCompositionText') {
114
+ return false;
115
+ }
116
+ var selection = window.getSelection();
117
+ if (!selection || selection.rangeCount === 0) return false;
118
+ var range = selection.getRangeAt(0);
119
+ var node = range.startContainer;
120
+ var parentEl = (node === null || node === void 0 ? void 0 : node.parentElement) || null;
121
+ if (!parentEl) return false;
122
+ var textNodes = Array.from(parentEl.childNodes).filter(isTextNode);
123
+ var _iterator = _createForOfIteratorHelper(textNodes),
124
+ _step;
125
+ try {
126
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
127
+ var textNode = _step.value;
128
+ if (textNode.textContent === ZERO_WIDTH_SPACE) {
129
+ textNode.remove();
130
+ } else if (textNode.textContent && textNode.textContent.includes(ZERO_WIDTH_SPACE)) {
131
+ textNode.textContent = textNode.textContent.split(ZERO_WIDTH_SPACE).join('');
132
+ }
133
+ }
134
+ } catch (err) {
135
+ _iterator.e(err);
136
+ } finally {
137
+ _iterator.f();
138
+ }
139
+ return false;
140
+ } : undefined
141
+ }
142
+ }
143
+ })];
144
+ }
145
+ });
@@ -1,3 +1,4 @@
1
1
  export * from './AiWriting';
2
+ export * from './ImeComposition';
2
3
  export * from './SlashCommands';
3
4
  export * from './StructuredDiff';
@@ -1,3 +1,4 @@
1
1
  export * from "./AiWriting";
2
+ export * from "./ImeComposition";
2
3
  export * from "./SlashCommands";
3
4
  export * from "./StructuredDiff";
@@ -12,7 +12,7 @@ import { CharacterCount, Placeholder } from '@tiptap/extensions';
12
12
  import { Markdown } from '@tiptap/markdown';
13
13
  import StarterKit from '@tiptap/starter-kit';
14
14
  import { PLACEHOLDER } from "../contants/placeholder";
15
- import { AiWritingExtension, SlashCommands, StructuredDiffExtension } from "./extension";
15
+ import { AiWritingExtension, ImeComposition, SlashCommands, StructuredDiffExtension } from "./extension";
16
16
  import { CodeExtension } from "./mark/Code";
17
17
  import { AlertExtension, AudioExtension, BlockAttachmentExtension, BlockLinkExtension, CodeBlockLowlightExtension, CustomBlockMathExtension, CustomHorizontalRule, CustomInlineMathExtension, CustomSubscript, CustomSuperscript, DetailsContentExtension, DetailsExtension, DetailsSummaryExtension, EmojiExtension, FileHandlerExtension, FlowExtension, IframeExtension, ImageExtension, Indent, InlineAttachmentExtension, InlineLinkExtension, InlineUploadProgressExtension, ListExtension, MentionExtension, TableExtension, TableOfContentsExtension, UploadProgressExtension, VerticalAlign, VideoExtension, YamlFormat, YoutubeExtension } from "./node";
18
18
  export var getExtensions = function getExtensions(_ref) {
@@ -30,7 +30,7 @@ export var getExtensions = function getExtensions(_ref) {
30
30
  onAiWritingGetSuggestion = _ref.onAiWritingGetSuggestion,
31
31
  onValidateUrl = _ref.onValidateUrl,
32
32
  _placeholder = _ref.placeholder;
33
- var defaultExtensions = [StarterKit.configure({
33
+ var defaultExtensions = [ImeComposition, StarterKit.configure({
34
34
  link: false,
35
35
  code: false,
36
36
  codeBlock: false,
@@ -1,4 +1,4 @@
1
1
  import { UploadFunction } from "../../type";
2
2
  export declare const FileHandlerExtension: (props: {
3
3
  onUpload?: UploadFunction;
4
- }) => import("@tiptap/core").Extension<Omit<import("@tiptap/extension-file-handler").FileHandlePluginOptions, "editor" | "key">, any>;
4
+ }) => import("@tiptap/core").Extension<Omit<import("@tiptap/extension-file-handler").FileHandlePluginOptions, "key" | "editor">, any>;
@@ -3,9 +3,6 @@ import { Node } from '@tiptap/core';
3
3
  declare module '@tiptap/core' {
4
4
  interface Commands<ReturnType> {
5
5
  flow: {
6
- /**
7
- * Insert a flow diagram
8
- */
9
6
  setFlow: (options: {
10
7
  code?: string;
11
8
  width?: string | number;
@@ -16,6 +16,9 @@ export var FlowExtension = function FlowExtension(props) {
16
16
  draggable: true,
17
17
  addAttributes: function addAttributes() {
18
18
  return {
19
+ class: {
20
+ default: 'flow-wrapper'
21
+ },
19
22
  code: {
20
23
  default: '',
21
24
  parseHTML: function parseHTML(element) {
@@ -29,9 +32,9 @@ export var FlowExtension = function FlowExtension(props) {
29
32
  }
30
33
  },
31
34
  width: {
32
- default: '100%',
35
+ default: null,
33
36
  parseHTML: function parseHTML(element) {
34
- return element.getAttribute('data-width') || '100%';
37
+ return element.getAttribute('data-width') || null;
35
38
  },
36
39
  renderHTML: function renderHTML(attributes) {
37
40
  if (!attributes.width) return {};
@@ -48,7 +51,7 @@ export var FlowExtension = function FlowExtension(props) {
48
51
  getAttrs: function getAttrs(dom) {
49
52
  if (!(dom instanceof HTMLElement)) return false;
50
53
  var code = dom.getAttribute('data-code') || '';
51
- var width = dom.getAttribute('data-width') || '100%';
54
+ var width = dom.getAttribute('data-width') || null;
52
55
  return {
53
56
  code: code,
54
57
  width: width
@@ -84,7 +87,7 @@ export var FlowExtension = function FlowExtension(props) {
84
87
  type: _this.name,
85
88
  attrs: {
86
89
  code: options.code || '',
87
- width: options.width || '100%'
90
+ width: options.width || null
88
91
  }
89
92
  });
90
93
  };
@@ -4,7 +4,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
5
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
6
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- import { getLinkTitle } from "../../../util";
7
+ import { getLinkAttributesWithSelectedText, getLinkTitle } from "../../../util";
8
8
  import { mergeAttributes, Node, nodePasteRule } from '@tiptap/core';
9
9
  import { Plugin, PluginKey } from '@tiptap/pm/state';
10
10
  import { ReactNodeViewRenderer } from '@tiptap/react';
@@ -361,10 +361,11 @@ export var InlineLinkExtension = Node.create({
361
361
  var _this6 = this;
362
362
  return {
363
363
  'Mod-1': function Mod1() {
364
- return _this6.editor.commands.setInlineLink({
364
+ var linkAttributes = getLinkAttributesWithSelectedText(_this6.editor);
365
+ return _this6.editor.commands.setInlineLink(_objectSpread({
365
366
  href: '',
366
367
  type: 'icon'
367
- });
368
+ }, linkAttributes));
368
369
  }
369
370
  };
370
371
  },