@blocknote/core 0.42.3 → 0.44.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.
- package/dist/BlockNoteExtension-BWw0r8Gy.cjs +2 -0
- package/dist/BlockNoteExtension-BWw0r8Gy.cjs.map +1 -0
- package/dist/BlockNoteExtension-C2X7LW-V.js +25 -0
- package/dist/BlockNoteExtension-C2X7LW-V.js.map +1 -0
- package/dist/BlockNoteSchema-B4gm-Qco.cjs +2 -0
- package/dist/BlockNoteSchema-B4gm-Qco.cjs.map +1 -0
- package/dist/BlockNoteSchema-C-l154WP.js +270 -0
- package/dist/BlockNoteSchema-C-l154WP.js.map +1 -0
- package/dist/EventEmitter-CLwfmbqG.cjs +2 -0
- package/dist/EventEmitter-CLwfmbqG.cjs.map +1 -0
- package/dist/EventEmitter-CjSwpTbz.js +27 -0
- package/dist/EventEmitter-CjSwpTbz.js.map +1 -0
- package/dist/ShowSelection-BW37oJ6h.cjs +2 -0
- package/dist/ShowSelection-BW37oJ6h.cjs.map +1 -0
- package/dist/ShowSelection-Dz-NEase.js +43 -0
- package/dist/ShowSelection-Dz-NEase.js.map +1 -0
- package/dist/TrailingNode-B_zPMWxw.js +2098 -0
- package/dist/TrailingNode-B_zPMWxw.js.map +1 -0
- package/dist/TrailingNode-CRHrgOnK.cjs +2 -0
- package/dist/TrailingNode-CRHrgOnK.cjs.map +1 -0
- package/dist/{blockToNode-DIfPWLH8.js → blockToNode-DBNbhwwC.js} +33 -33
- package/dist/blockToNode-DBNbhwwC.js.map +1 -0
- package/dist/blockToNode-w7H99R6p.cjs.map +1 -1
- package/dist/blocknote.cjs +4 -4
- package/dist/blocknote.cjs.map +1 -1
- package/dist/blocknote.js +2496 -5686
- package/dist/blocknote.js.map +1 -1
- package/dist/blocks.cjs +1 -1
- package/dist/blocks.js +71 -70
- package/dist/blocks.js.map +1 -1
- package/dist/comments.cjs +1 -1
- package/dist/comments.cjs.map +1 -1
- package/dist/comments.js +451 -137
- package/dist/comments.js.map +1 -1
- package/dist/defaultBlocks-DLJ4Q1_J.cjs +6 -0
- package/dist/defaultBlocks-DLJ4Q1_J.cjs.map +1 -0
- package/dist/{BlockNoteSchema-Bi-eeHal.js → defaultBlocks-DgA_mtQV.js} +974 -1027
- package/dist/defaultBlocks-DgA_mtQV.js.map +1 -0
- package/dist/extensions.cjs +2 -0
- package/dist/extensions.cjs.map +1 -0
- package/dist/extensions.js +57 -0
- package/dist/extensions.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/webpack-stats.json +1 -1
- package/dist/yjs.js +1 -1
- package/package.json +9 -3
- package/src/api/nodeConversions/blockToNode.ts +1 -1
- package/src/api/nodeConversions/nodeToBlock.ts +1 -1
- package/src/blocks/Code/block.ts +4 -4
- package/src/blocks/Divider/block.ts +2 -2
- package/src/blocks/File/helpers/render/createAddFileButton.ts +7 -5
- package/src/blocks/Heading/block.ts +23 -20
- package/src/blocks/ListItem/BulletListItem/block.ts +2 -2
- package/src/blocks/ListItem/CheckListItem/block.ts +2 -2
- package/src/blocks/ListItem/NumberedListItem/block.ts +3 -3
- package/src/blocks/ListItem/ToggleListItem/block.ts +2 -2
- package/src/blocks/PageBreak/getPageBreakSlashMenuItems.ts +2 -2
- package/src/blocks/Paragraph/block.ts +2 -2
- package/src/blocks/Quote/block.ts +2 -2
- package/src/blocks/Table/block.ts +4 -3
- package/src/blocks/ToggleWrapper/createToggleWrapper.ts +2 -1
- package/src/comments/extension.ts +353 -0
- package/src/comments/index.ts +2 -1
- package/src/comments/types.ts +8 -0
- package/src/{extensions/Comments → comments}/userstore/UserStore.ts +2 -2
- package/src/editor/BlockNoteEditor.test.ts +2 -23
- package/src/editor/BlockNoteEditor.ts +60 -453
- package/src/editor/BlockNoteExtension.test.ts +103 -0
- package/src/editor/BlockNoteExtension.ts +174 -56
- package/src/editor/managers/EventManager.ts +64 -35
- package/src/editor/managers/ExtensionManager/extensions.ts +214 -0
- package/src/editor/managers/ExtensionManager/index.ts +514 -0
- package/src/editor/managers/ExtensionManager/symbol.ts +6 -0
- package/src/editor/managers/SelectionManager.ts +5 -1
- package/src/editor/managers/StateManager.ts +29 -17
- package/src/editor/managers/index.ts +1 -5
- package/src/extensions/BlockChange/{BlockChangePlugin.ts → BlockChange.ts} +27 -29
- package/src/extensions/Collaboration/{ForkYDocPlugin.test.ts → ForkYDoc.test.ts} +6 -5
- package/src/extensions/Collaboration/ForkYDoc.ts +158 -0
- package/src/extensions/Collaboration/YCursorPlugin.ts +183 -0
- package/src/extensions/Collaboration/YSync.ts +16 -0
- package/src/extensions/Collaboration/YUndo.ts +12 -0
- package/src/extensions/Collaboration/schemaMigration/SchemaMigration.ts +59 -0
- package/src/extensions/DropCursor/DropCursor.ts +26 -0
- package/src/extensions/FilePanel/FilePanel.ts +41 -0
- package/src/extensions/FormattingToolbar/FormattingToolbar.ts +119 -0
- package/src/extensions/History/History.ts +11 -0
- package/src/extensions/LinkToolbar/LinkToolbar.ts +121 -0
- package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboard.ts +74 -0
- package/src/extensions/Placeholder/Placeholder.ts +148 -0
- package/src/extensions/PreviousBlockType/{PreviousBlockTypePlugin.ts → PreviousBlockType.ts} +9 -13
- package/src/extensions/ShowSelection/{ShowSelectionPlugin.ts → ShowSelection.ts} +27 -33
- package/src/extensions/SideMenu/{SideMenuPlugin.ts → SideMenu.ts} +63 -83
- package/src/extensions/SuggestionMenu/{SuggestionPlugin.ts → SuggestionMenu.ts} +71 -77
- package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +29 -44
- package/src/extensions/TableHandles/{TableHandlesPlugin.ts → TableHandles.ts} +416 -437
- package/src/extensions/TrailingNode/{TrailingNodeExtension.ts → TrailingNode.ts} +8 -17
- package/src/extensions/index.ts +24 -0
- package/src/extensions/{BackgroundColor → tiptap-extensions/BackgroundColor}/BackgroundColorExtension.ts +1 -1
- package/src/extensions/{KeyboardShortcuts → tiptap-extensions/KeyboardShortcuts}/KeyboardShortcutsExtension.ts +21 -16
- package/src/extensions/{TextColor → tiptap-extensions/TextColor}/TextColorExtension.ts +1 -1
- package/src/extensions/tiptap-extensions/index.ts +31 -0
- package/src/index.ts +1 -13
- package/src/schema/blocks/createSpec.ts +14 -11
- package/src/schema/blocks/internal.ts +2 -2
- package/src/schema/blocks/types.ts +8 -5
- package/src/schema/schema.ts +11 -36
- package/src/util/topo-sort.ts +46 -0
- package/types/src/comments/extension.d.ts +70 -0
- package/types/src/comments/index.d.ts +2 -1
- package/types/src/comments/types.d.ts +8 -0
- package/types/src/{extensions/Comments → comments}/userstore/UserStore.d.ts +2 -2
- package/types/src/editor/BlockNoteEditor.d.ts +34 -105
- package/types/src/editor/BlockNoteExtension.d.ts +87 -22
- package/types/src/editor/managers/EventManager.d.ts +25 -16
- package/types/src/editor/managers/ExtensionManager/extensions.d.ts +8 -0
- package/types/src/editor/managers/ExtensionManager/index.d.ts +83 -0
- package/types/src/editor/managers/ExtensionManager/symbol.d.ts +5 -0
- package/types/src/editor/managers/StateManager.d.ts +1 -12
- package/types/src/editor/managers/index.d.ts +1 -2
- package/types/src/extensions/BlockChange/BlockChange.d.ts +16 -0
- package/types/src/extensions/Collaboration/ForkYDoc.d.ts +34 -0
- package/types/src/extensions/Collaboration/ForkYDoc.test.d.ts +1 -0
- package/types/src/extensions/Collaboration/YCursorPlugin.d.ts +24 -0
- package/types/src/extensions/Collaboration/YSync.d.ts +8 -0
- package/types/src/extensions/Collaboration/YUndo.d.ts +12 -0
- package/types/src/extensions/Collaboration/schemaMigration/SchemaMigration.d.ts +8 -0
- package/types/src/extensions/DropCursor/DropCursor.d.ts +5 -0
- package/types/src/extensions/FilePanel/FilePanel.d.ts +11 -0
- package/types/src/extensions/FormattingToolbar/FormattingToolbar.d.ts +9 -0
- package/types/src/extensions/History/History.d.ts +6 -0
- package/types/src/extensions/LinkToolbar/LinkToolbar.d.ts +24 -0
- package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboard.d.ts +5 -0
- package/types/src/extensions/Placeholder/Placeholder.d.ts +6 -0
- package/types/src/extensions/PreviousBlockType/{PreviousBlockTypePlugin.d.ts → PreviousBlockType.d.ts} +9 -5
- package/types/src/extensions/ShowSelection/ShowSelection.d.ts +21 -0
- package/types/src/extensions/SideMenu/{SideMenuPlugin.d.ts → SideMenu.d.ts} +11 -15
- package/types/src/extensions/SuggestionMenu/SuggestionMenu.d.ts +54 -0
- package/types/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.d.ts +1 -1
- package/types/src/extensions/TableHandles/{TableHandlesPlugin.d.ts → TableHandles.d.ts} +28 -31
- package/types/src/extensions/TrailingNode/TrailingNode.d.ts +8 -0
- package/types/src/extensions/index.d.ts +24 -0
- package/types/src/extensions/{KeyboardShortcuts → tiptap-extensions/KeyboardShortcuts}/KeyboardShortcutsExtension.d.ts +1 -1
- package/types/src/extensions/tiptap-extensions/index.d.ts +11 -0
- package/types/src/index.d.ts +1 -13
- package/types/src/schema/blocks/createSpec.d.ts +4 -4
- package/types/src/schema/blocks/internal.d.ts +2 -2
- package/types/src/schema/blocks/types.d.ts +5 -5
- package/types/src/util/topo-sort.d.ts +8 -0
- package/dist/BlockNoteSchema-Bi-eeHal.js.map +0 -1
- package/dist/BlockNoteSchema-DjDaA2C3.cjs +0 -6
- package/dist/BlockNoteSchema-DjDaA2C3.cjs.map +0 -1
- package/dist/blockToNode-DIfPWLH8.js.map +0 -1
- package/src/comments/models/User.ts +0 -8
- package/src/editor/BlockNoteExtensions.ts +0 -325
- package/src/editor/managers/CollaborationManager.ts +0 -212
- package/src/editor/managers/ExtensionManager.ts +0 -130
- package/src/extensions/Collaboration/CursorPlugin.ts +0 -189
- package/src/extensions/Collaboration/ForkYDocPlugin.ts +0 -192
- package/src/extensions/Collaboration/SyncPlugin.ts +0 -18
- package/src/extensions/Collaboration/UndoPlugin.ts +0 -18
- package/src/extensions/Collaboration/schemaMigration/SchemaMigrationPlugin.ts +0 -59
- package/src/extensions/Comments/CommentsPlugin.ts +0 -392
- package/src/extensions/FilePanel/FilePanelPlugin.ts +0 -206
- package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +0 -363
- package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +0 -380
- package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +0 -75
- package/src/extensions/Placeholder/PlaceholderPlugin.ts +0 -147
- package/types/src/comments/models/User.d.ts +0 -8
- package/types/src/editor/BlockNoteExtensions.d.ts +0 -43
- package/types/src/editor/managers/CollaborationManager.d.ts +0 -115
- package/types/src/editor/managers/ExtensionManager.d.ts +0 -68
- package/types/src/extensions/BlockChange/BlockChangePlugin.d.ts +0 -15
- package/types/src/extensions/Collaboration/CursorPlugin.d.ts +0 -37
- package/types/src/extensions/Collaboration/ForkYDocPlugin.d.ts +0 -41
- package/types/src/extensions/Collaboration/SyncPlugin.d.ts +0 -7
- package/types/src/extensions/Collaboration/UndoPlugin.d.ts +0 -9
- package/types/src/extensions/Collaboration/schemaMigration/SchemaMigrationPlugin.d.ts +0 -7
- package/types/src/extensions/Comments/CommentsPlugin.d.ts +0 -66
- package/types/src/extensions/FilePanel/FilePanelPlugin.d.ts +0 -31
- package/types/src/extensions/FormattingToolbar/FormattingToolbarPlugin.d.ts +0 -41
- package/types/src/extensions/LinkToolbar/LinkToolbarPlugin.d.ts +0 -42
- package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.d.ts +0 -5
- package/types/src/extensions/Placeholder/PlaceholderPlugin.d.ts +0 -6
- package/types/src/extensions/ShowSelection/ShowSelectionPlugin.d.ts +0 -15
- package/types/src/extensions/SuggestionMenu/SuggestionPlugin.d.ts +0 -31
- package/types/src/extensions/TrailingNode/TrailingNodeExtension.d.ts +0 -13
- /package/src/{extensions/Comments/CommentMark.ts → comments/mark.ts} +0 -0
- /package/src/extensions/{HardBreak → tiptap-extensions/HardBreak}/HardBreak.ts +0 -0
- /package/src/extensions/{Suggestions → tiptap-extensions/Suggestions}/SuggestionMarks.ts +0 -0
- /package/src/extensions/{TextAlignment → tiptap-extensions/TextAlignment}/TextAlignmentExtension.ts +0 -0
- /package/src/extensions/{UniqueID → tiptap-extensions/UniqueID}/UniqueID.ts +0 -0
- /package/types/src/{extensions/Comments/CommentMark.d.ts → comments/mark.d.ts} +0 -0
- /package/types/src/{extensions/Collaboration/ForkYDocPlugin.test.d.ts → editor/BlockNoteExtension.test.d.ts} +0 -0
- /package/types/src/extensions/{BackgroundColor → tiptap-extensions/BackgroundColor}/BackgroundColorExtension.d.ts +0 -0
- /package/types/src/extensions/{HardBreak → tiptap-extensions/HardBreak}/HardBreak.d.ts +0 -0
- /package/types/src/extensions/{Suggestions → tiptap-extensions/Suggestions}/SuggestionMarks.d.ts +0 -0
- /package/types/src/extensions/{TextAlignment → tiptap-extensions/TextAlignment}/TextAlignmentExtension.d.ts +0 -0
- /package/types/src/extensions/{TextColor → tiptap-extensions/TextColor}/TextColorExtension.d.ts +0 -0
- /package/types/src/extensions/{UniqueID → tiptap-extensions/UniqueID}/UniqueID.d.ts +0 -0
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
import { isNodeSelection, isTextSelection, posToDOMRect } from "@tiptap/core";
|
|
2
|
-
import {
|
|
3
|
-
EditorState,
|
|
4
|
-
Plugin,
|
|
5
|
-
PluginKey,
|
|
6
|
-
PluginView,
|
|
7
|
-
TextSelection,
|
|
8
|
-
} from "prosemirror-state";
|
|
9
|
-
import { EditorView } from "prosemirror-view";
|
|
10
|
-
|
|
11
|
-
import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
|
|
12
|
-
import { BlockNoteExtension } from "../../editor/BlockNoteExtension.js";
|
|
13
|
-
import { UiElementPosition } from "../../extensions-shared/UiElementPosition.js";
|
|
14
|
-
import {
|
|
15
|
-
BlockSchema,
|
|
16
|
-
InlineContentSchema,
|
|
17
|
-
StyleSchema,
|
|
18
|
-
} from "../../schema/index.js";
|
|
19
|
-
|
|
20
|
-
export type FormattingToolbarState = UiElementPosition;
|
|
21
|
-
|
|
22
|
-
export class FormattingToolbarView implements PluginView {
|
|
23
|
-
public state?: FormattingToolbarState;
|
|
24
|
-
public emitUpdate: () => void;
|
|
25
|
-
|
|
26
|
-
public preventHide = false;
|
|
27
|
-
public preventShow = false;
|
|
28
|
-
|
|
29
|
-
public shouldShow: (props: {
|
|
30
|
-
view: EditorView;
|
|
31
|
-
state: EditorState;
|
|
32
|
-
from: number;
|
|
33
|
-
to: number;
|
|
34
|
-
}) => boolean = ({ view, state, from, to }) => {
|
|
35
|
-
const { doc, selection } = state;
|
|
36
|
-
const { empty } = selection;
|
|
37
|
-
|
|
38
|
-
// Sometime check for `empty` is not enough.
|
|
39
|
-
// Doubleclick an empty paragraph returns a node size of 2.
|
|
40
|
-
// So we check also for an empty text size.
|
|
41
|
-
const isEmptyTextBlock =
|
|
42
|
-
!doc.textBetween(from, to).length && isTextSelection(state.selection);
|
|
43
|
-
|
|
44
|
-
// Don't show toolbar inside code blocks
|
|
45
|
-
if (
|
|
46
|
-
selection.$from.parent.type.spec.code ||
|
|
47
|
-
(isNodeSelection(selection) && selection.node.type.spec.code)
|
|
48
|
-
) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (empty || isEmptyTextBlock) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const focusedElement = document.activeElement;
|
|
57
|
-
if (!this.isElementWithinEditorWrapper(focusedElement) && view.editable) {
|
|
58
|
-
// editable editors must have focus for the toolbar to show
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
return true;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
constructor(
|
|
65
|
-
private readonly editor: BlockNoteEditor<
|
|
66
|
-
BlockSchema,
|
|
67
|
-
InlineContentSchema,
|
|
68
|
-
StyleSchema
|
|
69
|
-
>,
|
|
70
|
-
private readonly pmView: EditorView,
|
|
71
|
-
emitUpdate: (state: FormattingToolbarState) => void,
|
|
72
|
-
) {
|
|
73
|
-
this.emitUpdate = () => {
|
|
74
|
-
if (!this.state) {
|
|
75
|
-
throw new Error(
|
|
76
|
-
"Attempting to update uninitialized formatting toolbar",
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
emitUpdate(this.state);
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
pmView.dom.addEventListener("mousedown", this.viewMousedownHandler);
|
|
84
|
-
pmView.root.addEventListener("mouseup", this.mouseupHandler);
|
|
85
|
-
pmView.dom.addEventListener("dragstart", this.dragHandler);
|
|
86
|
-
pmView.dom.addEventListener("dragover", this.dragHandler);
|
|
87
|
-
pmView.dom.addEventListener("blur", this.blurHandler);
|
|
88
|
-
|
|
89
|
-
// Setting capture=true ensures that any parent container of the editor that
|
|
90
|
-
// gets scrolled will trigger the scroll event. Scroll events do not bubble
|
|
91
|
-
// and so won't propagate to the document by default.
|
|
92
|
-
pmView.root.addEventListener("scroll", this.scrollHandler, true);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
blurHandler = (event: FocusEvent) => {
|
|
96
|
-
if (this.preventHide) {
|
|
97
|
-
this.preventHide = false;
|
|
98
|
-
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const editorWrapper = this.pmView.dom.parentElement!;
|
|
103
|
-
|
|
104
|
-
// Checks if the focus is moving to an element outside the editor. If it is,
|
|
105
|
-
// the toolbar is hidden.
|
|
106
|
-
if (
|
|
107
|
-
// An element is clicked.
|
|
108
|
-
event &&
|
|
109
|
-
event.relatedTarget &&
|
|
110
|
-
// Element is inside the editor.
|
|
111
|
-
(editorWrapper === (event.relatedTarget as Node) ||
|
|
112
|
-
editorWrapper.contains(event.relatedTarget as Node) ||
|
|
113
|
-
(event.relatedTarget as HTMLElement).matches(
|
|
114
|
-
".bn-ui-container, .bn-ui-container *",
|
|
115
|
-
))
|
|
116
|
-
) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (this.state?.show) {
|
|
121
|
-
this.state.show = false;
|
|
122
|
-
this.emitUpdate();
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
isElementWithinEditorWrapper = (element: Node | null) => {
|
|
127
|
-
if (!element) {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
const editorWrapper = this.pmView.dom.parentElement!;
|
|
131
|
-
if (!editorWrapper) {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return editorWrapper.contains(element);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
viewMousedownHandler = (e: MouseEvent) => {
|
|
139
|
-
if (
|
|
140
|
-
!this.isElementWithinEditorWrapper(e.target as Node) ||
|
|
141
|
-
e.button === 0
|
|
142
|
-
) {
|
|
143
|
-
this.preventShow = true;
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
mouseupHandler = () => {
|
|
148
|
-
if (this.preventShow) {
|
|
149
|
-
this.preventShow = false;
|
|
150
|
-
setTimeout(() => this.update(this.pmView));
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
// For dragging the whole editor.
|
|
155
|
-
dragHandler = () => {
|
|
156
|
-
if (this.state?.show) {
|
|
157
|
-
this.state.show = false;
|
|
158
|
-
this.emitUpdate();
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
scrollHandler = () => {
|
|
163
|
-
if (this.state?.show) {
|
|
164
|
-
this.state.referencePos = this.getSelectionBoundingBox();
|
|
165
|
-
this.emitUpdate();
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
update(view: EditorView, oldState?: EditorState) {
|
|
170
|
-
// Delays the update to handle edge case with drag and drop, where the view
|
|
171
|
-
// is blurred asynchronously and happens only after the state update.
|
|
172
|
-
// Wrapping in a setTimeout gives enough time to wait for the blur event to
|
|
173
|
-
// occur before updating the toolbar.
|
|
174
|
-
const { state, composing } = view;
|
|
175
|
-
const { doc, selection } = state;
|
|
176
|
-
const isSame =
|
|
177
|
-
oldState && oldState.doc.eq(doc) && oldState.selection.eq(selection);
|
|
178
|
-
|
|
179
|
-
if (composing || isSame) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// support for CellSelections
|
|
184
|
-
const { ranges } = selection;
|
|
185
|
-
const from = Math.min(...ranges.map((range) => range.$from.pos));
|
|
186
|
-
const to = Math.max(...ranges.map((range) => range.$to.pos));
|
|
187
|
-
|
|
188
|
-
const shouldShow = this.shouldShow({
|
|
189
|
-
view,
|
|
190
|
-
state,
|
|
191
|
-
from,
|
|
192
|
-
to,
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// in jsdom, Range.prototype.getClientRects is not implemented,
|
|
196
|
-
// this would cause `getSelectionBoundingBox` to fail
|
|
197
|
-
// we can just ignore jsdom for now and not show the toolbar
|
|
198
|
-
const jsdom = typeof Range.prototype.getClientRects === "undefined";
|
|
199
|
-
|
|
200
|
-
// Checks if menu should be shown/updated.
|
|
201
|
-
if (!this.preventShow && (shouldShow || this.preventHide) && !jsdom) {
|
|
202
|
-
// Unlike other UI elements, we don't prevent the formatting toolbar from
|
|
203
|
-
// showing when the editor is not editable. This is because some buttons,
|
|
204
|
-
// e.g. the download file button, should still be accessible. Therefore,
|
|
205
|
-
// logic for hiding when the editor is non-editable is handled
|
|
206
|
-
// individually in each button.
|
|
207
|
-
const newReferencePos = this.getSelectionBoundingBox();
|
|
208
|
-
|
|
209
|
-
// Workaround to ensure the correct reference position when rendering
|
|
210
|
-
// React components. Without this, e.g. updating styles on React inline
|
|
211
|
-
// content causes the formatting toolbar to be in the wrong place. We
|
|
212
|
-
// know the component has not yet rendered if the reference position has
|
|
213
|
-
// zero dimensions.
|
|
214
|
-
if (newReferencePos.height === 0 && newReferencePos.width === 0) {
|
|
215
|
-
// Updates the reference position again following the render.
|
|
216
|
-
queueMicrotask(() => {
|
|
217
|
-
const nextState = {
|
|
218
|
-
show: true,
|
|
219
|
-
referencePos: this.getSelectionBoundingBox(),
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
this.state = nextState;
|
|
223
|
-
this.emitUpdate();
|
|
224
|
-
|
|
225
|
-
// For some reason, while the selection doesn't actually change and
|
|
226
|
-
// remains correct, it visually appears to be collapsed. This forces
|
|
227
|
-
// a ProseMirror view update, which fixes the issue.
|
|
228
|
-
view.dispatch(
|
|
229
|
-
view.state.tr.setSelection(
|
|
230
|
-
TextSelection.create(
|
|
231
|
-
view.state.doc,
|
|
232
|
-
view.state.selection.from + 1,
|
|
233
|
-
view.state.selection.to,
|
|
234
|
-
),
|
|
235
|
-
),
|
|
236
|
-
);
|
|
237
|
-
// 2 separate `dispatch` calls are needed, else ProseMirror realizes
|
|
238
|
-
// that the transaction is a no-op and doesn't update the view.
|
|
239
|
-
view.dispatch(
|
|
240
|
-
view.state.tr.setSelection(
|
|
241
|
-
TextSelection.create(
|
|
242
|
-
view.state.doc,
|
|
243
|
-
view.state.selection.from - 1,
|
|
244
|
-
view.state.selection.to,
|
|
245
|
-
),
|
|
246
|
-
),
|
|
247
|
-
);
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
const nextState = {
|
|
254
|
-
show: true,
|
|
255
|
-
referencePos: this.getSelectionBoundingBox(),
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
if (
|
|
259
|
-
nextState.show !== this.state?.show ||
|
|
260
|
-
nextState.referencePos.toJSON() !== this.state?.referencePos.toJSON()
|
|
261
|
-
) {
|
|
262
|
-
this.state = nextState;
|
|
263
|
-
this.emitUpdate();
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Checks if menu should be hidden.
|
|
270
|
-
if (
|
|
271
|
-
this.state?.show &&
|
|
272
|
-
!this.preventHide &&
|
|
273
|
-
(!shouldShow || this.preventShow || !this.editor.isEditable)
|
|
274
|
-
) {
|
|
275
|
-
this.state.show = false;
|
|
276
|
-
this.emitUpdate();
|
|
277
|
-
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
destroy() {
|
|
283
|
-
this.pmView.dom.removeEventListener("mousedown", this.viewMousedownHandler);
|
|
284
|
-
this.pmView.root.removeEventListener("mouseup", this.mouseupHandler);
|
|
285
|
-
this.pmView.dom.removeEventListener("dragstart", this.dragHandler);
|
|
286
|
-
this.pmView.dom.removeEventListener("dragover", this.dragHandler);
|
|
287
|
-
this.pmView.dom.removeEventListener("blur", this.blurHandler);
|
|
288
|
-
|
|
289
|
-
this.pmView.root.removeEventListener("scroll", this.scrollHandler, true);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
closeMenu = () => {
|
|
293
|
-
if (this.state?.show) {
|
|
294
|
-
this.state.show = false;
|
|
295
|
-
this.emitUpdate();
|
|
296
|
-
}
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
getSelectionBoundingBox() {
|
|
300
|
-
const { state } = this.pmView;
|
|
301
|
-
const { selection } = state;
|
|
302
|
-
|
|
303
|
-
// support for CellSelections
|
|
304
|
-
const { ranges } = selection;
|
|
305
|
-
const from = Math.min(...ranges.map((range) => range.$from.pos));
|
|
306
|
-
const to = Math.max(...ranges.map((range) => range.$to.pos));
|
|
307
|
-
|
|
308
|
-
if (isNodeSelection(selection)) {
|
|
309
|
-
const node = this.pmView.nodeDOM(from) as HTMLElement;
|
|
310
|
-
if (node) {
|
|
311
|
-
return node.getBoundingClientRect();
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return posToDOMRect(this.pmView, from, to);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
export const formattingToolbarPluginKey = new PluginKey(
|
|
320
|
-
"FormattingToolbarPlugin",
|
|
321
|
-
);
|
|
322
|
-
|
|
323
|
-
export class FormattingToolbarProsemirrorPlugin extends BlockNoteExtension {
|
|
324
|
-
public static key() {
|
|
325
|
-
return "formattingToolbar";
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
private view: FormattingToolbarView | undefined;
|
|
329
|
-
|
|
330
|
-
constructor(editor: BlockNoteEditor<any, any, any>) {
|
|
331
|
-
super();
|
|
332
|
-
this.addProsemirrorPlugin(
|
|
333
|
-
new Plugin({
|
|
334
|
-
key: formattingToolbarPluginKey,
|
|
335
|
-
view: (editorView) => {
|
|
336
|
-
this.view = new FormattingToolbarView(editor, editorView, (state) => {
|
|
337
|
-
this.emit("update", state);
|
|
338
|
-
});
|
|
339
|
-
return this.view;
|
|
340
|
-
},
|
|
341
|
-
props: {
|
|
342
|
-
handleKeyDown: (_view, event: KeyboardEvent) => {
|
|
343
|
-
if (event.key === "Escape" && this.shown) {
|
|
344
|
-
this.view!.closeMenu();
|
|
345
|
-
return true;
|
|
346
|
-
}
|
|
347
|
-
return false;
|
|
348
|
-
},
|
|
349
|
-
},
|
|
350
|
-
}),
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
public get shown() {
|
|
355
|
-
return this.view?.state?.show || false;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
public onUpdate(callback: (state: FormattingToolbarState) => void) {
|
|
359
|
-
return this.on("update", callback);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
public closeMenu = () => this.view!.closeMenu();
|
|
363
|
-
}
|