@tiptap/suggestion 3.0.0 → 3.0.1
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/LICENSE.md +21 -0
- package/README.md +5 -1
- package/dist/index.cjs +268 -233
- package/dist/index.cjs.map +1 -1
- package/dist/{packages/suggestion/src/suggestion.d.ts → index.d.cts} +46 -11
- package/dist/index.d.ts +188 -0
- package/dist/index.js +241 -228
- package/dist/index.js.map +1 -1
- package/package.json +13 -11
- package/src/findSuggestionMatch.ts +10 -7
- package/src/suggestion.ts +65 -29
- package/dist/index.umd.js +0 -246
- package/dist/index.umd.js.map +0 -1
- package/dist/packages/core/src/CommandManager.d.ts +0 -20
- package/dist/packages/core/src/Editor.d.ts +0 -161
- package/dist/packages/core/src/EventEmitter.d.ts +0 -11
- package/dist/packages/core/src/Extension.d.ts +0 -343
- package/dist/packages/core/src/ExtensionManager.d.ts +0 -55
- package/dist/packages/core/src/InputRule.d.ts +0 -42
- package/dist/packages/core/src/Mark.d.ts +0 -451
- package/dist/packages/core/src/Node.d.ts +0 -611
- package/dist/packages/core/src/NodePos.d.ts +0 -44
- package/dist/packages/core/src/NodeView.d.ts +0 -31
- package/dist/packages/core/src/PasteRule.d.ts +0 -50
- package/dist/packages/core/src/Tracker.d.ts +0 -11
- package/dist/packages/core/src/commands/blur.d.ts +0 -13
- package/dist/packages/core/src/commands/clearContent.d.ts +0 -14
- package/dist/packages/core/src/commands/clearNodes.d.ts +0 -13
- package/dist/packages/core/src/commands/command.d.ts +0 -18
- package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -13
- package/dist/packages/core/src/commands/cut.d.ts +0 -20
- package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +0 -13
- package/dist/packages/core/src/commands/deleteNode.d.ts +0 -15
- package/dist/packages/core/src/commands/deleteRange.d.ts +0 -14
- package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -13
- package/dist/packages/core/src/commands/enter.d.ts +0 -13
- package/dist/packages/core/src/commands/exitCode.d.ts +0 -13
- package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -25
- package/dist/packages/core/src/commands/first.d.ts +0 -14
- package/dist/packages/core/src/commands/focus.d.ts +0 -27
- package/dist/packages/core/src/commands/forEach.d.ts +0 -14
- package/dist/packages/core/src/commands/index.d.ts +0 -55
- package/dist/packages/core/src/commands/insertContent.d.ts +0 -34
- package/dist/packages/core/src/commands/insertContentAt.d.ts +0 -47
- package/dist/packages/core/src/commands/join.d.ts +0 -41
- package/dist/packages/core/src/commands/joinItemBackward.d.ts +0 -13
- package/dist/packages/core/src/commands/joinItemForward.d.ts +0 -13
- package/dist/packages/core/src/commands/joinTextblockBackward.d.ts +0 -12
- package/dist/packages/core/src/commands/joinTextblockForward.d.ts +0 -12
- package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -14
- package/dist/packages/core/src/commands/lift.d.ts +0 -17
- package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -13
- package/dist/packages/core/src/commands/liftListItem.d.ts +0 -15
- package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -13
- package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -16
- package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -13
- package/dist/packages/core/src/commands/selectAll.d.ts +0 -13
- package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -13
- package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -13
- package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -13
- package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +0 -13
- package/dist/packages/core/src/commands/selectTextblockStart.d.ts +0 -13
- package/dist/packages/core/src/commands/setContent.d.ts +0 -40
- package/dist/packages/core/src/commands/setMark.d.ts +0 -15
- package/dist/packages/core/src/commands/setMeta.d.ts +0 -15
- package/dist/packages/core/src/commands/setNode.d.ts +0 -16
- package/dist/packages/core/src/commands/setNodeSelection.d.ts +0 -14
- package/dist/packages/core/src/commands/setTextSelection.d.ts +0 -14
- package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -15
- package/dist/packages/core/src/commands/splitBlock.d.ts +0 -17
- package/dist/packages/core/src/commands/splitListItem.d.ts +0 -15
- package/dist/packages/core/src/commands/toggleList.d.ts +0 -18
- package/dist/packages/core/src/commands/toggleMark.d.ts +0 -30
- package/dist/packages/core/src/commands/toggleNode.d.ts +0 -17
- package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -16
- package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -13
- package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -13
- package/dist/packages/core/src/commands/unsetMark.d.ts +0 -25
- package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -24
- package/dist/packages/core/src/commands/wrapIn.d.ts +0 -16
- package/dist/packages/core/src/commands/wrapInList.d.ts +0 -16
- package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -5
- package/dist/packages/core/src/extensions/commands.d.ts +0 -3
- package/dist/packages/core/src/extensions/editable.d.ts +0 -2
- package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
- package/dist/packages/core/src/extensions/index.d.ts +0 -6
- package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
- package/dist/packages/core/src/extensions/tabindex.d.ts +0 -2
- package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +0 -10
- package/dist/packages/core/src/helpers/createChainableState.d.ts +0 -10
- package/dist/packages/core/src/helpers/createDocument.d.ts +0 -12
- package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -15
- package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +0 -7
- package/dist/packages/core/src/helpers/findChildren.d.ts +0 -9
- package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +0 -10
- package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -16
- package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -17
- package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -8
- package/dist/packages/core/src/helpers/generateJSON.d.ts +0 -8
- package/dist/packages/core/src/helpers/generateText.d.ts +0 -12
- package/dist/packages/core/src/helpers/getAttributes.d.ts +0 -9
- package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
- package/dist/packages/core/src/helpers/getChangedRanges.d.ts +0 -11
- package/dist/packages/core/src/helpers/getDebugJSON.d.ts +0 -8
- package/dist/packages/core/src/helpers/getExtensionField.d.ts +0 -9
- package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
- package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -3
- package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
- package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
- package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
- package/dist/packages/core/src/helpers/getNodeAtPosition.d.ts +0 -11
- package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -3
- package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
- package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
- package/dist/packages/core/src/helpers/getSchema.d.ts +0 -4
- package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +0 -10
- package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -8
- package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -8
- package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -9
- package/dist/packages/core/src/helpers/getText.d.ts +0 -15
- package/dist/packages/core/src/helpers/getTextBetween.d.ts +0 -14
- package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +0 -8
- package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +0 -8
- package/dist/packages/core/src/helpers/index.d.ts +0 -50
- package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
- package/dist/packages/core/src/helpers/isActive.d.ts +0 -2
- package/dist/packages/core/src/helpers/isAtEndOfNode.d.ts +0 -2
- package/dist/packages/core/src/helpers/isAtStartOfNode.d.ts +0 -2
- package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +0 -2
- package/dist/packages/core/src/helpers/isList.d.ts +0 -2
- package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -3
- package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -3
- package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
- package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
- package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
- package/dist/packages/core/src/helpers/posToDOMRect.d.ts +0 -2
- package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +0 -4
- package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
- package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
- package/dist/packages/core/src/index.d.ts +0 -24
- package/dist/packages/core/src/inputRules/index.d.ts +0 -5
- package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -13
- package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -23
- package/dist/packages/core/src/inputRules/textInputRule.d.ts +0 -10
- package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +0 -15
- package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +0 -28
- package/dist/packages/core/src/pasteRules/index.d.ts +0 -3
- package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -13
- package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +0 -13
- package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +0 -10
- package/dist/packages/core/src/style.d.ts +0 -1
- package/dist/packages/core/src/types.d.ts +0 -255
- package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -9
- package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
- package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -6
- package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
- package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +0 -1
- package/dist/packages/core/src/utilities/findDuplicates.d.ts +0 -1
- package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
- package/dist/packages/core/src/utilities/index.d.ts +0 -20
- package/dist/packages/core/src/utilities/isAndroid.d.ts +0 -1
- package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
- package/dist/packages/core/src/utilities/isFunction.d.ts +0 -1
- package/dist/packages/core/src/utilities/isMacOS.d.ts +0 -1
- package/dist/packages/core/src/utilities/isNumber.d.ts +0 -1
- package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
- package/dist/packages/core/src/utilities/isRegExp.d.ts +0 -1
- package/dist/packages/core/src/utilities/isString.d.ts +0 -1
- package/dist/packages/core/src/utilities/isiOS.d.ts +0 -1
- package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -1
- package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -1
- package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
- package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -8
- package/dist/packages/core/src/utilities/removeDuplicates.d.ts +0 -8
- package/dist/packages/suggestion/src/findSuggestionMatch.d.ts +0 -15
- package/dist/packages/suggestion/src/index.d.ts +0 -4
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Range } from '@tiptap/core'
|
|
2
|
+
import { escapeForRegEx } from '@tiptap/core'
|
|
3
|
+
import type { ResolvedPos } from '@tiptap/pm/model'
|
|
3
4
|
|
|
4
5
|
export interface Trigger {
|
|
5
6
|
char: string
|
|
6
7
|
allowSpaces: boolean
|
|
8
|
+
allowToIncludeChar: boolean
|
|
7
9
|
allowedPrefixes: string[] | null
|
|
8
10
|
startOfLine: boolean
|
|
9
11
|
$position: ResolvedPos
|
|
@@ -16,16 +18,17 @@ export type SuggestionMatch = {
|
|
|
16
18
|
} | null
|
|
17
19
|
|
|
18
20
|
export function findSuggestionMatch(config: Trigger): SuggestionMatch {
|
|
19
|
-
const {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const { char, allowSpaces: allowSpacesOption, allowToIncludeChar, allowedPrefixes, startOfLine, $position } = config
|
|
22
|
+
|
|
23
|
+
const allowSpaces = allowSpacesOption && !allowToIncludeChar
|
|
22
24
|
|
|
23
25
|
const escapedChar = escapeForRegEx(char)
|
|
24
26
|
const suffix = new RegExp(`\\s${escapedChar}$`)
|
|
25
27
|
const prefix = startOfLine ? '^' : ''
|
|
28
|
+
const finalEscapedChar = allowToIncludeChar ? '' : escapedChar
|
|
26
29
|
const regexp = allowSpaces
|
|
27
|
-
? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${
|
|
28
|
-
: new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${
|
|
30
|
+
? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${finalEscapedChar}|$)`, 'gm')
|
|
31
|
+
: new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${finalEscapedChar}]*`, 'gm')
|
|
29
32
|
|
|
30
33
|
const text = $position.nodeBefore?.isText && $position.nodeBefore.text
|
|
31
34
|
|
package/src/suggestion.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Editor, Range } from '@tiptap/core'
|
|
2
|
-
import { EditorState
|
|
3
|
-
import {
|
|
1
|
+
import type { Editor, Range } from '@tiptap/core'
|
|
2
|
+
import type { EditorState } from '@tiptap/pm/state'
|
|
3
|
+
import { Plugin, PluginKey } from '@tiptap/pm/state'
|
|
4
|
+
import type { EditorView } from '@tiptap/pm/view'
|
|
5
|
+
import { Decoration, DecorationSet } from '@tiptap/pm/view'
|
|
4
6
|
|
|
5
7
|
import { findSuggestionMatch as defaultFindSuggestionMatch } from './findSuggestionMatch.js'
|
|
6
8
|
|
|
@@ -26,12 +28,18 @@ export interface SuggestionOptions<I = any, TSelected = any> {
|
|
|
26
28
|
char?: string
|
|
27
29
|
|
|
28
30
|
/**
|
|
29
|
-
* Allow spaces in the suggestion query.
|
|
31
|
+
* Allow spaces in the suggestion query. Not compatible with `allowToIncludeChar`. Will be disabled if `allowToIncludeChar` is set to `true`.
|
|
30
32
|
* @default false
|
|
31
33
|
* @example true
|
|
32
|
-
|
|
34
|
+
*/
|
|
33
35
|
allowSpaces?: boolean
|
|
34
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Allow the character to be included in the suggestion query. Not compatible with `allowSpaces`.
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
allowToIncludeChar?: boolean
|
|
42
|
+
|
|
35
43
|
/**
|
|
36
44
|
* Allow prefixes in the suggestion query.
|
|
37
45
|
* @default [' ']
|
|
@@ -60,6 +68,20 @@ export interface SuggestionOptions<I = any, TSelected = any> {
|
|
|
60
68
|
*/
|
|
61
69
|
decorationClass?: string
|
|
62
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Creates a decoration with the provided content.
|
|
73
|
+
* @param decorationContent - The content to display in the decoration
|
|
74
|
+
* @default "" - Creates an empty decoration if no content provided
|
|
75
|
+
*/
|
|
76
|
+
decorationContent?: string
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The class name of the decoration node when it is empty.
|
|
80
|
+
* @default 'is-empty'
|
|
81
|
+
* @example 'is-empty'
|
|
82
|
+
*/
|
|
83
|
+
decorationEmptyClass?: string
|
|
84
|
+
|
|
63
85
|
/**
|
|
64
86
|
* A function that is called when a suggestion is selected.
|
|
65
87
|
* @param props The props object.
|
|
@@ -86,12 +108,12 @@ export interface SuggestionOptions<I = any, TSelected = any> {
|
|
|
86
108
|
* @returns An object with render functions.
|
|
87
109
|
*/
|
|
88
110
|
render?: () => {
|
|
89
|
-
onBeforeStart?: (props: SuggestionProps<I, TSelected>) => void
|
|
90
|
-
onStart?: (props: SuggestionProps<I, TSelected>) => void
|
|
91
|
-
onBeforeUpdate?: (props: SuggestionProps<I, TSelected>) => void
|
|
92
|
-
onUpdate?: (props: SuggestionProps<I, TSelected>) => void
|
|
93
|
-
onExit?: (props: SuggestionProps<I, TSelected>) => void
|
|
94
|
-
onKeyDown?: (props: SuggestionKeyDownProps) => boolean
|
|
111
|
+
onBeforeStart?: (props: SuggestionProps<I, TSelected>) => void
|
|
112
|
+
onStart?: (props: SuggestionProps<I, TSelected>) => void
|
|
113
|
+
onBeforeUpdate?: (props: SuggestionProps<I, TSelected>) => void
|
|
114
|
+
onUpdate?: (props: SuggestionProps<I, TSelected>) => void
|
|
115
|
+
onExit?: (props: SuggestionProps<I, TSelected>) => void
|
|
116
|
+
onKeyDown?: (props: SuggestionKeyDownProps) => boolean
|
|
95
117
|
}
|
|
96
118
|
|
|
97
119
|
/**
|
|
@@ -99,7 +121,7 @@ export interface SuggestionOptions<I = any, TSelected = any> {
|
|
|
99
121
|
* @param props The props object.
|
|
100
122
|
* @returns {boolean}
|
|
101
123
|
*/
|
|
102
|
-
allow?: (props: { editor: Editor; state: EditorState; range: Range
|
|
124
|
+
allow?: (props: { editor: Editor; state: EditorState; range: Range; isActive?: boolean }) => boolean
|
|
103
125
|
findSuggestionMatch?: typeof defaultFindSuggestionMatch
|
|
104
126
|
}
|
|
105
127
|
|
|
@@ -167,10 +189,13 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
167
189
|
editor,
|
|
168
190
|
char = '@',
|
|
169
191
|
allowSpaces = false,
|
|
192
|
+
allowToIncludeChar = false,
|
|
170
193
|
allowedPrefixes = [' '],
|
|
171
194
|
startOfLine = false,
|
|
172
195
|
decorationTag = 'span',
|
|
173
196
|
decorationClass = 'suggestion',
|
|
197
|
+
decorationContent = '',
|
|
198
|
+
decorationEmptyClass = 'is-empty',
|
|
174
199
|
command = () => null,
|
|
175
200
|
items = () => [],
|
|
176
201
|
render = () => ({}),
|
|
@@ -195,9 +220,9 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
195
220
|
const stopped = prev.active && !next.active
|
|
196
221
|
const changed = !started && !stopped && prev.query !== next.query
|
|
197
222
|
|
|
198
|
-
const handleStart = started
|
|
223
|
+
const handleStart = started || (moved && changed)
|
|
199
224
|
const handleChange = changed || moved
|
|
200
|
-
const handleExit = stopped
|
|
225
|
+
const handleExit = stopped || (moved && changed)
|
|
201
226
|
|
|
202
227
|
// Cancel when suggestion isn't active
|
|
203
228
|
if (!handleStart && !handleChange && !handleExit) {
|
|
@@ -205,9 +230,7 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
205
230
|
}
|
|
206
231
|
|
|
207
232
|
const state = handleExit && !handleStart ? prev : next
|
|
208
|
-
const decorationNode = view.dom.querySelector(
|
|
209
|
-
`[data-decoration-id="${state.decorationId}"]`,
|
|
210
|
-
)
|
|
233
|
+
const decorationNode = view.dom.querySelector(`[data-decoration-id="${state.decorationId}"]`)
|
|
211
234
|
|
|
212
235
|
props = {
|
|
213
236
|
editor,
|
|
@@ -223,18 +246,16 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
223
246
|
})
|
|
224
247
|
},
|
|
225
248
|
decorationNode,
|
|
226
|
-
// virtual node for
|
|
249
|
+
// virtual node for positioning
|
|
227
250
|
// this can be used for building popups without a DOM node
|
|
228
251
|
clientRect: decorationNode
|
|
229
252
|
? () => {
|
|
230
|
-
|
|
253
|
+
// because of `items` can be asynchrounous we’ll search for the current decoration node
|
|
231
254
|
const { decorationId } = this.key?.getState(editor.state) // eslint-disable-line
|
|
232
|
-
|
|
233
|
-
`[data-decoration-id="${decorationId}"]`,
|
|
234
|
-
)
|
|
255
|
+
const currentDecorationNode = view.dom.querySelector(`[data-decoration-id="${decorationId}"]`)
|
|
235
256
|
|
|
236
|
-
|
|
237
|
-
|
|
257
|
+
return currentDecorationNode?.getBoundingClientRect() || null
|
|
258
|
+
}
|
|
238
259
|
: null,
|
|
239
260
|
}
|
|
240
261
|
|
|
@@ -323,6 +344,7 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
323
344
|
const match = findSuggestionMatch({
|
|
324
345
|
char,
|
|
325
346
|
allowSpaces,
|
|
347
|
+
allowToIncludeChar,
|
|
326
348
|
allowedPrefixes,
|
|
327
349
|
startOfLine,
|
|
328
350
|
$position: selection.$from,
|
|
@@ -330,9 +352,15 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
330
352
|
const decorationId = `id_${Math.floor(Math.random() * 0xffffffff)}`
|
|
331
353
|
|
|
332
354
|
// If we found a match, update the current state to show it
|
|
333
|
-
if (
|
|
334
|
-
|
|
335
|
-
|
|
355
|
+
if (
|
|
356
|
+
match &&
|
|
357
|
+
allow({
|
|
358
|
+
editor,
|
|
359
|
+
state,
|
|
360
|
+
range: match.range,
|
|
361
|
+
isActive: prev.active,
|
|
362
|
+
})
|
|
363
|
+
) {
|
|
336
364
|
next.active = true
|
|
337
365
|
next.decorationId = prev.decorationId ? prev.decorationId : decorationId
|
|
338
366
|
next.range = match.range
|
|
@@ -371,17 +399,25 @@ export function Suggestion<I = any, TSelected = any>({
|
|
|
371
399
|
|
|
372
400
|
// Setup decorator on the currently active suggestion.
|
|
373
401
|
decorations(state) {
|
|
374
|
-
const { active, range, decorationId } = plugin.getState(state)
|
|
402
|
+
const { active, range, decorationId, query } = plugin.getState(state)
|
|
375
403
|
|
|
376
404
|
if (!active) {
|
|
377
405
|
return null
|
|
378
406
|
}
|
|
379
407
|
|
|
408
|
+
const isEmpty = !query?.length
|
|
409
|
+
const classNames = [decorationClass]
|
|
410
|
+
|
|
411
|
+
if (isEmpty) {
|
|
412
|
+
classNames.push(decorationEmptyClass)
|
|
413
|
+
}
|
|
414
|
+
|
|
380
415
|
return DecorationSet.create(state.doc, [
|
|
381
416
|
Decoration.inline(range.from, range.to, {
|
|
382
417
|
nodeName: decorationTag,
|
|
383
|
-
class:
|
|
418
|
+
class: classNames.join(' '),
|
|
384
419
|
'data-decoration-id': decorationId,
|
|
420
|
+
'data-decoration-content': decorationContent,
|
|
385
421
|
}),
|
|
386
422
|
])
|
|
387
423
|
},
|
package/dist/index.umd.js
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tiptap/pm/state'), require('@tiptap/pm/view'), require('@tiptap/core')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', '@tiptap/pm/state', '@tiptap/pm/view', '@tiptap/core'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@tiptap/suggestion"] = {}, global.state, global.view, global.core));
|
|
5
|
-
})(this, (function (exports, state, view, core) { 'use strict';
|
|
6
|
-
|
|
7
|
-
function findSuggestionMatch(config) {
|
|
8
|
-
var _a;
|
|
9
|
-
const { char, allowSpaces, allowedPrefixes, startOfLine, $position, } = config;
|
|
10
|
-
const escapedChar = core.escapeForRegEx(char);
|
|
11
|
-
const suffix = new RegExp(`\\s${escapedChar}$`);
|
|
12
|
-
const prefix = startOfLine ? '^' : '';
|
|
13
|
-
const regexp = allowSpaces
|
|
14
|
-
? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${escapedChar}|$)`, 'gm')
|
|
15
|
-
: new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${escapedChar}]*`, 'gm');
|
|
16
|
-
const text = ((_a = $position.nodeBefore) === null || _a === void 0 ? void 0 : _a.isText) && $position.nodeBefore.text;
|
|
17
|
-
if (!text) {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
const textFrom = $position.pos - text.length;
|
|
21
|
-
const match = Array.from(text.matchAll(regexp)).pop();
|
|
22
|
-
if (!match || match.input === undefined || match.index === undefined) {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
// JavaScript doesn't have lookbehinds. This hacks a check that first character
|
|
26
|
-
// is a space or the start of the line
|
|
27
|
-
const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index);
|
|
28
|
-
const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes === null || allowedPrefixes === void 0 ? void 0 : allowedPrefixes.join('')}\0]?$`).test(matchPrefix);
|
|
29
|
-
if (allowedPrefixes !== null && !matchPrefixIsAllowed) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
// The absolute position of the match in the document
|
|
33
|
-
const from = textFrom + match.index;
|
|
34
|
-
let to = from + match[0].length;
|
|
35
|
-
// Edge case handling; if spaces are allowed and we're directly in between
|
|
36
|
-
// two triggers
|
|
37
|
-
if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {
|
|
38
|
-
match[0] += ' ';
|
|
39
|
-
to += 1;
|
|
40
|
-
}
|
|
41
|
-
// If the $position is located within the matched substring, return that range
|
|
42
|
-
if (from < $position.pos && to >= $position.pos) {
|
|
43
|
-
return {
|
|
44
|
-
range: {
|
|
45
|
-
from,
|
|
46
|
-
to,
|
|
47
|
-
},
|
|
48
|
-
query: match[0].slice(char.length),
|
|
49
|
-
text: match[0],
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const SuggestionPluginKey = new state.PluginKey('suggestion');
|
|
56
|
-
/**
|
|
57
|
-
* This utility allows you to create suggestions.
|
|
58
|
-
* @see https://tiptap.dev/api/utilities/suggestion
|
|
59
|
-
*/
|
|
60
|
-
function Suggestion({ pluginKey = SuggestionPluginKey, editor, char = '@', allowSpaces = false, allowedPrefixes = [' '], startOfLine = false, decorationTag = 'span', decorationClass = 'suggestion', command = () => null, items = () => [], render = () => ({}), allow = () => true, findSuggestionMatch: findSuggestionMatch$1 = findSuggestionMatch, }) {
|
|
61
|
-
let props;
|
|
62
|
-
const renderer = render === null || render === void 0 ? void 0 : render();
|
|
63
|
-
const plugin = new state.Plugin({
|
|
64
|
-
key: pluginKey,
|
|
65
|
-
view() {
|
|
66
|
-
return {
|
|
67
|
-
update: async (view, prevState) => {
|
|
68
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
69
|
-
const prev = (_a = this.key) === null || _a === void 0 ? void 0 : _a.getState(prevState);
|
|
70
|
-
const next = (_b = this.key) === null || _b === void 0 ? void 0 : _b.getState(view.state);
|
|
71
|
-
// See how the state changed
|
|
72
|
-
const moved = prev.active && next.active && prev.range.from !== next.range.from;
|
|
73
|
-
const started = !prev.active && next.active;
|
|
74
|
-
const stopped = prev.active && !next.active;
|
|
75
|
-
const changed = !started && !stopped && prev.query !== next.query;
|
|
76
|
-
const handleStart = started;
|
|
77
|
-
const handleChange = changed || moved;
|
|
78
|
-
const handleExit = stopped;
|
|
79
|
-
// Cancel when suggestion isn't active
|
|
80
|
-
if (!handleStart && !handleChange && !handleExit) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
const state = handleExit && !handleStart ? prev : next;
|
|
84
|
-
const decorationNode = view.dom.querySelector(`[data-decoration-id="${state.decorationId}"]`);
|
|
85
|
-
props = {
|
|
86
|
-
editor,
|
|
87
|
-
range: state.range,
|
|
88
|
-
query: state.query,
|
|
89
|
-
text: state.text,
|
|
90
|
-
items: [],
|
|
91
|
-
command: commandProps => {
|
|
92
|
-
return command({
|
|
93
|
-
editor,
|
|
94
|
-
range: state.range,
|
|
95
|
-
props: commandProps,
|
|
96
|
-
});
|
|
97
|
-
},
|
|
98
|
-
decorationNode,
|
|
99
|
-
// virtual node for popper.js or tippy.js
|
|
100
|
-
// this can be used for building popups without a DOM node
|
|
101
|
-
clientRect: decorationNode
|
|
102
|
-
? () => {
|
|
103
|
-
var _a;
|
|
104
|
-
// because of `items` can be asynchrounous we’ll search for the current decoration node
|
|
105
|
-
const { decorationId } = (_a = this.key) === null || _a === void 0 ? void 0 : _a.getState(editor.state); // eslint-disable-line
|
|
106
|
-
const currentDecorationNode = view.dom.querySelector(`[data-decoration-id="${decorationId}"]`);
|
|
107
|
-
return (currentDecorationNode === null || currentDecorationNode === void 0 ? void 0 : currentDecorationNode.getBoundingClientRect()) || null;
|
|
108
|
-
}
|
|
109
|
-
: null,
|
|
110
|
-
};
|
|
111
|
-
if (handleStart) {
|
|
112
|
-
(_c = renderer === null || renderer === void 0 ? void 0 : renderer.onBeforeStart) === null || _c === void 0 ? void 0 : _c.call(renderer, props);
|
|
113
|
-
}
|
|
114
|
-
if (handleChange) {
|
|
115
|
-
(_d = renderer === null || renderer === void 0 ? void 0 : renderer.onBeforeUpdate) === null || _d === void 0 ? void 0 : _d.call(renderer, props);
|
|
116
|
-
}
|
|
117
|
-
if (handleChange || handleStart) {
|
|
118
|
-
props.items = await items({
|
|
119
|
-
editor,
|
|
120
|
-
query: state.query,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
if (handleExit) {
|
|
124
|
-
(_e = renderer === null || renderer === void 0 ? void 0 : renderer.onExit) === null || _e === void 0 ? void 0 : _e.call(renderer, props);
|
|
125
|
-
}
|
|
126
|
-
if (handleChange) {
|
|
127
|
-
(_f = renderer === null || renderer === void 0 ? void 0 : renderer.onUpdate) === null || _f === void 0 ? void 0 : _f.call(renderer, props);
|
|
128
|
-
}
|
|
129
|
-
if (handleStart) {
|
|
130
|
-
(_g = renderer === null || renderer === void 0 ? void 0 : renderer.onStart) === null || _g === void 0 ? void 0 : _g.call(renderer, props);
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
destroy: () => {
|
|
134
|
-
var _a;
|
|
135
|
-
if (!props) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
(_a = renderer === null || renderer === void 0 ? void 0 : renderer.onExit) === null || _a === void 0 ? void 0 : _a.call(renderer, props);
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
},
|
|
142
|
-
state: {
|
|
143
|
-
// Initialize the plugin's internal state.
|
|
144
|
-
init() {
|
|
145
|
-
const state = {
|
|
146
|
-
active: false,
|
|
147
|
-
range: {
|
|
148
|
-
from: 0,
|
|
149
|
-
to: 0,
|
|
150
|
-
},
|
|
151
|
-
query: null,
|
|
152
|
-
text: null,
|
|
153
|
-
composing: false,
|
|
154
|
-
};
|
|
155
|
-
return state;
|
|
156
|
-
},
|
|
157
|
-
// Apply changes to the plugin state from a view transaction.
|
|
158
|
-
apply(transaction, prev, _oldState, state) {
|
|
159
|
-
const { isEditable } = editor;
|
|
160
|
-
const { composing } = editor.view;
|
|
161
|
-
const { selection } = transaction;
|
|
162
|
-
const { empty, from } = selection;
|
|
163
|
-
const next = { ...prev };
|
|
164
|
-
next.composing = composing;
|
|
165
|
-
// We can only be suggesting if the view is editable, and:
|
|
166
|
-
// * there is no selection, or
|
|
167
|
-
// * a composition is active (see: https://github.com/ueberdosis/tiptap/issues/1449)
|
|
168
|
-
if (isEditable && (empty || editor.view.composing)) {
|
|
169
|
-
// Reset active state if we just left the previous suggestion range
|
|
170
|
-
if ((from < prev.range.from || from > prev.range.to) && !composing && !prev.composing) {
|
|
171
|
-
next.active = false;
|
|
172
|
-
}
|
|
173
|
-
// Try to match against where our cursor currently is
|
|
174
|
-
const match = findSuggestionMatch$1({
|
|
175
|
-
char,
|
|
176
|
-
allowSpaces,
|
|
177
|
-
allowedPrefixes,
|
|
178
|
-
startOfLine,
|
|
179
|
-
$position: selection.$from,
|
|
180
|
-
});
|
|
181
|
-
const decorationId = `id_${Math.floor(Math.random() * 0xffffffff)}`;
|
|
182
|
-
// If we found a match, update the current state to show it
|
|
183
|
-
if (match && allow({
|
|
184
|
-
editor, state, range: match.range, isActive: prev.active,
|
|
185
|
-
})) {
|
|
186
|
-
next.active = true;
|
|
187
|
-
next.decorationId = prev.decorationId ? prev.decorationId : decorationId;
|
|
188
|
-
next.range = match.range;
|
|
189
|
-
next.query = match.query;
|
|
190
|
-
next.text = match.text;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
next.active = false;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
next.active = false;
|
|
198
|
-
}
|
|
199
|
-
// Make sure to empty the range if suggestion is inactive
|
|
200
|
-
if (!next.active) {
|
|
201
|
-
next.decorationId = null;
|
|
202
|
-
next.range = { from: 0, to: 0 };
|
|
203
|
-
next.query = null;
|
|
204
|
-
next.text = null;
|
|
205
|
-
}
|
|
206
|
-
return next;
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
props: {
|
|
210
|
-
// Call the keydown hook if suggestion is active.
|
|
211
|
-
handleKeyDown(view, event) {
|
|
212
|
-
var _a;
|
|
213
|
-
const { active, range } = plugin.getState(view.state);
|
|
214
|
-
if (!active) {
|
|
215
|
-
return false;
|
|
216
|
-
}
|
|
217
|
-
return ((_a = renderer === null || renderer === void 0 ? void 0 : renderer.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(renderer, { view, event, range })) || false;
|
|
218
|
-
},
|
|
219
|
-
// Setup decorator on the currently active suggestion.
|
|
220
|
-
decorations(state) {
|
|
221
|
-
const { active, range, decorationId } = plugin.getState(state);
|
|
222
|
-
if (!active) {
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
return view.DecorationSet.create(state.doc, [
|
|
226
|
-
view.Decoration.inline(range.from, range.to, {
|
|
227
|
-
nodeName: decorationTag,
|
|
228
|
-
class: decorationClass,
|
|
229
|
-
'data-decoration-id': decorationId,
|
|
230
|
-
}),
|
|
231
|
-
]);
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
return plugin;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
exports.Suggestion = Suggestion;
|
|
239
|
-
exports.SuggestionPluginKey = SuggestionPluginKey;
|
|
240
|
-
exports.default = Suggestion;
|
|
241
|
-
exports.findSuggestionMatch = findSuggestionMatch;
|
|
242
|
-
|
|
243
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
244
|
-
|
|
245
|
-
}));
|
|
246
|
-
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/findSuggestionMatch.ts","../src/suggestion.ts"],"sourcesContent":["import { escapeForRegEx, Range } from '@tiptap/core'\nimport { ResolvedPos } from '@tiptap/pm/model'\n\nexport interface Trigger {\n char: string\n allowSpaces: boolean\n allowedPrefixes: string[] | null\n startOfLine: boolean\n $position: ResolvedPos\n}\n\nexport type SuggestionMatch = {\n range: Range\n query: string\n text: string\n} | null\n\nexport function findSuggestionMatch(config: Trigger): SuggestionMatch {\n const {\n char, allowSpaces, allowedPrefixes, startOfLine, $position,\n } = config\n\n const escapedChar = escapeForRegEx(char)\n const suffix = new RegExp(`\\\\s${escapedChar}$`)\n const prefix = startOfLine ? '^' : ''\n const regexp = allowSpaces\n ? new RegExp(`${prefix}${escapedChar}.*?(?=\\\\s${escapedChar}|$)`, 'gm')\n : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\\\s${escapedChar}]*`, 'gm')\n\n const text = $position.nodeBefore?.isText && $position.nodeBefore.text\n\n if (!text) {\n return null\n }\n\n const textFrom = $position.pos - text.length\n const match = Array.from(text.matchAll(regexp)).pop()\n\n if (!match || match.input === undefined || match.index === undefined) {\n return null\n }\n\n // JavaScript doesn't have lookbehinds. This hacks a check that first character\n // is a space or the start of the line\n const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index)\n const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes?.join('')}\\0]?$`).test(matchPrefix)\n\n if (allowedPrefixes !== null && !matchPrefixIsAllowed) {\n return null\n }\n\n // The absolute position of the match in the document\n const from = textFrom + match.index\n let to = from + match[0].length\n\n // Edge case handling; if spaces are allowed and we're directly in between\n // two triggers\n if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {\n match[0] += ' '\n to += 1\n }\n\n // If the $position is located within the matched substring, return that range\n if (from < $position.pos && to >= $position.pos) {\n return {\n range: {\n from,\n to,\n },\n query: match[0].slice(char.length),\n text: match[0],\n }\n }\n\n return null\n}\n","import { Editor, Range } from '@tiptap/core'\nimport { EditorState, Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet, EditorView } from '@tiptap/pm/view'\n\nimport { findSuggestionMatch as defaultFindSuggestionMatch } from './findSuggestionMatch.js'\n\nexport interface SuggestionOptions<I = any, TSelected = any> {\n /**\n * The plugin key for the suggestion plugin.\n * @default 'suggestion'\n * @example 'mention'\n */\n pluginKey?: PluginKey\n\n /**\n * The editor instance.\n * @default null\n */\n editor: Editor\n\n /**\n * The character that triggers the suggestion.\n * @default '@'\n * @example '#'\n */\n char?: string\n\n /**\n * Allow spaces in the suggestion query.\n * @default false\n * @example true\n */\n allowSpaces?: boolean\n\n /**\n * Allow prefixes in the suggestion query.\n * @default [' ']\n * @example [' ', '@']\n */\n allowedPrefixes?: string[] | null\n\n /**\n * Only match suggestions at the start of the line.\n * @default false\n * @example true\n */\n startOfLine?: boolean\n\n /**\n * The tag name of the decoration node.\n * @default 'span'\n * @example 'div'\n */\n decorationTag?: string\n\n /**\n * The class name of the decoration node.\n * @default 'suggestion'\n * @example 'mention'\n */\n decorationClass?: string\n\n /**\n * A function that is called when a suggestion is selected.\n * @param props The props object.\n * @param props.editor The editor instance.\n * @param props.range The range of the suggestion.\n * @param props.props The props of the selected suggestion.\n * @returns void\n * @example ({ editor, range, props }) => { props.command(props.props) }\n */\n command?: (props: { editor: Editor; range: Range; props: TSelected }) => void\n\n /**\n * A function that returns the suggestion items in form of an array.\n * @param props The props object.\n * @param props.editor The editor instance.\n * @param props.query The current suggestion query.\n * @returns An array of suggestion items.\n * @example ({ editor, query }) => [{ id: 1, label: 'John Doe' }]\n */\n items?: (props: { query: string; editor: Editor }) => I[] | Promise<I[]>\n\n /**\n * The render function for the suggestion.\n * @returns An object with render functions.\n */\n render?: () => {\n onBeforeStart?: (props: SuggestionProps<I, TSelected>) => void;\n onStart?: (props: SuggestionProps<I, TSelected>) => void;\n onBeforeUpdate?: (props: SuggestionProps<I, TSelected>) => void;\n onUpdate?: (props: SuggestionProps<I, TSelected>) => void;\n onExit?: (props: SuggestionProps<I, TSelected>) => void;\n onKeyDown?: (props: SuggestionKeyDownProps) => boolean;\n }\n\n /**\n * A function that returns a boolean to indicate if the suggestion should be active.\n * @param props The props object.\n * @returns {boolean}\n */\n allow?: (props: { editor: Editor; state: EditorState; range: Range, isActive?: boolean }) => boolean\n findSuggestionMatch?: typeof defaultFindSuggestionMatch\n}\n\nexport interface SuggestionProps<I = any, TSelected = any> {\n /**\n * The editor instance.\n */\n editor: Editor\n\n /**\n * The range of the suggestion.\n */\n range: Range\n\n /**\n * The current suggestion query.\n */\n query: string\n\n /**\n * The current suggestion text.\n */\n text: string\n\n /**\n * The suggestion items array.\n */\n items: I[]\n\n /**\n * A function that is called when a suggestion is selected.\n * @param props The props object.\n * @returns void\n */\n command: (props: TSelected) => void\n\n /**\n * The decoration node HTML element\n * @default null\n */\n decorationNode: Element | null\n\n /**\n * The function that returns the client rect\n * @default null\n * @example () => new DOMRect(0, 0, 0, 0)\n */\n clientRect?: (() => DOMRect | null) | null\n}\n\nexport interface SuggestionKeyDownProps {\n view: EditorView\n event: KeyboardEvent\n range: Range\n}\n\nexport const SuggestionPluginKey = new PluginKey('suggestion')\n\n/**\n * This utility allows you to create suggestions.\n * @see https://tiptap.dev/api/utilities/suggestion\n */\nexport function Suggestion<I = any, TSelected = any>({\n pluginKey = SuggestionPluginKey,\n editor,\n char = '@',\n allowSpaces = false,\n allowedPrefixes = [' '],\n startOfLine = false,\n decorationTag = 'span',\n decorationClass = 'suggestion',\n command = () => null,\n items = () => [],\n render = () => ({}),\n allow = () => true,\n findSuggestionMatch = defaultFindSuggestionMatch,\n}: SuggestionOptions<I, TSelected>) {\n let props: SuggestionProps<I, TSelected> | undefined\n const renderer = render?.()\n\n const plugin: Plugin<any> = new Plugin({\n key: pluginKey,\n\n view() {\n return {\n update: async (view, prevState) => {\n const prev = this.key?.getState(prevState)\n const next = this.key?.getState(view.state)\n\n // See how the state changed\n const moved = prev.active && next.active && prev.range.from !== next.range.from\n const started = !prev.active && next.active\n const stopped = prev.active && !next.active\n const changed = !started && !stopped && prev.query !== next.query\n\n const handleStart = started\n const handleChange = changed || moved\n const handleExit = stopped\n\n // Cancel when suggestion isn't active\n if (!handleStart && !handleChange && !handleExit) {\n return\n }\n\n const state = handleExit && !handleStart ? prev : next\n const decorationNode = view.dom.querySelector(\n `[data-decoration-id=\"${state.decorationId}\"]`,\n )\n\n props = {\n editor,\n range: state.range,\n query: state.query,\n text: state.text,\n items: [],\n command: commandProps => {\n return command({\n editor,\n range: state.range,\n props: commandProps,\n })\n },\n decorationNode,\n // virtual node for popper.js or tippy.js\n // this can be used for building popups without a DOM node\n clientRect: decorationNode\n ? () => {\n // because of `items` can be asynchrounous we’ll search for the current decoration node\n const { decorationId } = this.key?.getState(editor.state) // eslint-disable-line\n const currentDecorationNode = view.dom.querySelector(\n `[data-decoration-id=\"${decorationId}\"]`,\n )\n\n return currentDecorationNode?.getBoundingClientRect() || null\n }\n : null,\n }\n\n if (handleStart) {\n renderer?.onBeforeStart?.(props)\n }\n\n if (handleChange) {\n renderer?.onBeforeUpdate?.(props)\n }\n\n if (handleChange || handleStart) {\n props.items = await items({\n editor,\n query: state.query,\n })\n }\n\n if (handleExit) {\n renderer?.onExit?.(props)\n }\n\n if (handleChange) {\n renderer?.onUpdate?.(props)\n }\n\n if (handleStart) {\n renderer?.onStart?.(props)\n }\n },\n\n destroy: () => {\n if (!props) {\n return\n }\n\n renderer?.onExit?.(props)\n },\n }\n },\n\n state: {\n // Initialize the plugin's internal state.\n init() {\n const state: {\n active: boolean\n range: Range\n query: null | string\n text: null | string\n composing: boolean\n decorationId?: string | null\n } = {\n active: false,\n range: {\n from: 0,\n to: 0,\n },\n query: null,\n text: null,\n composing: false,\n }\n\n return state\n },\n\n // Apply changes to the plugin state from a view transaction.\n apply(transaction, prev, _oldState, state) {\n const { isEditable } = editor\n const { composing } = editor.view\n const { selection } = transaction\n const { empty, from } = selection\n const next = { ...prev }\n\n next.composing = composing\n\n // We can only be suggesting if the view is editable, and:\n // * there is no selection, or\n // * a composition is active (see: https://github.com/ueberdosis/tiptap/issues/1449)\n if (isEditable && (empty || editor.view.composing)) {\n // Reset active state if we just left the previous suggestion range\n if ((from < prev.range.from || from > prev.range.to) && !composing && !prev.composing) {\n next.active = false\n }\n\n // Try to match against where our cursor currently is\n const match = findSuggestionMatch({\n char,\n allowSpaces,\n allowedPrefixes,\n startOfLine,\n $position: selection.$from,\n })\n const decorationId = `id_${Math.floor(Math.random() * 0xffffffff)}`\n\n // If we found a match, update the current state to show it\n if (match && allow({\n editor, state, range: match.range, isActive: prev.active,\n })) {\n next.active = true\n next.decorationId = prev.decorationId ? prev.decorationId : decorationId\n next.range = match.range\n next.query = match.query\n next.text = match.text\n } else {\n next.active = false\n }\n } else {\n next.active = false\n }\n\n // Make sure to empty the range if suggestion is inactive\n if (!next.active) {\n next.decorationId = null\n next.range = { from: 0, to: 0 }\n next.query = null\n next.text = null\n }\n\n return next\n },\n },\n\n props: {\n // Call the keydown hook if suggestion is active.\n handleKeyDown(view, event) {\n const { active, range } = plugin.getState(view.state)\n\n if (!active) {\n return false\n }\n\n return renderer?.onKeyDown?.({ view, event, range }) || false\n },\n\n // Setup decorator on the currently active suggestion.\n decorations(state) {\n const { active, range, decorationId } = plugin.getState(state)\n\n if (!active) {\n return null\n }\n\n return DecorationSet.create(state.doc, [\n Decoration.inline(range.from, range.to, {\n nodeName: decorationTag,\n class: decorationClass,\n 'data-decoration-id': decorationId,\n }),\n ])\n },\n },\n })\n\n return plugin\n}\n"],"names":["escapeForRegEx","PluginKey","findSuggestionMatch","defaultFindSuggestionMatch","Plugin","DecorationSet","Decoration"],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { EditorState, Transaction } from '@tiptap/pm/state';
|
|
2
|
-
import { Editor } from './Editor.js';
|
|
3
|
-
import { AnyCommands, CanCommands, ChainedCommands, CommandProps, SingleCommands } from './types.js';
|
|
4
|
-
export declare class CommandManager {
|
|
5
|
-
editor: Editor;
|
|
6
|
-
rawCommands: AnyCommands;
|
|
7
|
-
customState?: EditorState;
|
|
8
|
-
constructor(props: {
|
|
9
|
-
editor: Editor;
|
|
10
|
-
state?: EditorState;
|
|
11
|
-
});
|
|
12
|
-
get hasCustomState(): boolean;
|
|
13
|
-
get state(): EditorState;
|
|
14
|
-
get commands(): SingleCommands;
|
|
15
|
-
get chain(): () => ChainedCommands;
|
|
16
|
-
get can(): () => CanCommands;
|
|
17
|
-
createChain(startTr?: Transaction, shouldDispatch?: boolean): ChainedCommands;
|
|
18
|
-
createCan(startTr?: Transaction): CanCommands;
|
|
19
|
-
buildProps(tr: Transaction, shouldDispatch?: boolean): CommandProps;
|
|
20
|
-
}
|