@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.
Files changed (176) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +5 -1
  3. package/dist/index.cjs +268 -233
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/{packages/suggestion/src/suggestion.d.ts → index.d.cts} +46 -11
  6. package/dist/index.d.ts +188 -0
  7. package/dist/index.js +241 -228
  8. package/dist/index.js.map +1 -1
  9. package/package.json +13 -11
  10. package/src/findSuggestionMatch.ts +10 -7
  11. package/src/suggestion.ts +65 -29
  12. package/dist/index.umd.js +0 -246
  13. package/dist/index.umd.js.map +0 -1
  14. package/dist/packages/core/src/CommandManager.d.ts +0 -20
  15. package/dist/packages/core/src/Editor.d.ts +0 -161
  16. package/dist/packages/core/src/EventEmitter.d.ts +0 -11
  17. package/dist/packages/core/src/Extension.d.ts +0 -343
  18. package/dist/packages/core/src/ExtensionManager.d.ts +0 -55
  19. package/dist/packages/core/src/InputRule.d.ts +0 -42
  20. package/dist/packages/core/src/Mark.d.ts +0 -451
  21. package/dist/packages/core/src/Node.d.ts +0 -611
  22. package/dist/packages/core/src/NodePos.d.ts +0 -44
  23. package/dist/packages/core/src/NodeView.d.ts +0 -31
  24. package/dist/packages/core/src/PasteRule.d.ts +0 -50
  25. package/dist/packages/core/src/Tracker.d.ts +0 -11
  26. package/dist/packages/core/src/commands/blur.d.ts +0 -13
  27. package/dist/packages/core/src/commands/clearContent.d.ts +0 -14
  28. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -13
  29. package/dist/packages/core/src/commands/command.d.ts +0 -18
  30. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -13
  31. package/dist/packages/core/src/commands/cut.d.ts +0 -20
  32. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +0 -13
  33. package/dist/packages/core/src/commands/deleteNode.d.ts +0 -15
  34. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -14
  35. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -13
  36. package/dist/packages/core/src/commands/enter.d.ts +0 -13
  37. package/dist/packages/core/src/commands/exitCode.d.ts +0 -13
  38. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -25
  39. package/dist/packages/core/src/commands/first.d.ts +0 -14
  40. package/dist/packages/core/src/commands/focus.d.ts +0 -27
  41. package/dist/packages/core/src/commands/forEach.d.ts +0 -14
  42. package/dist/packages/core/src/commands/index.d.ts +0 -55
  43. package/dist/packages/core/src/commands/insertContent.d.ts +0 -34
  44. package/dist/packages/core/src/commands/insertContentAt.d.ts +0 -47
  45. package/dist/packages/core/src/commands/join.d.ts +0 -41
  46. package/dist/packages/core/src/commands/joinItemBackward.d.ts +0 -13
  47. package/dist/packages/core/src/commands/joinItemForward.d.ts +0 -13
  48. package/dist/packages/core/src/commands/joinTextblockBackward.d.ts +0 -12
  49. package/dist/packages/core/src/commands/joinTextblockForward.d.ts +0 -12
  50. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -14
  51. package/dist/packages/core/src/commands/lift.d.ts +0 -17
  52. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -13
  53. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -15
  54. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -13
  55. package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -16
  56. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -13
  57. package/dist/packages/core/src/commands/selectAll.d.ts +0 -13
  58. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -13
  59. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -13
  60. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -13
  61. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +0 -13
  62. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +0 -13
  63. package/dist/packages/core/src/commands/setContent.d.ts +0 -40
  64. package/dist/packages/core/src/commands/setMark.d.ts +0 -15
  65. package/dist/packages/core/src/commands/setMeta.d.ts +0 -15
  66. package/dist/packages/core/src/commands/setNode.d.ts +0 -16
  67. package/dist/packages/core/src/commands/setNodeSelection.d.ts +0 -14
  68. package/dist/packages/core/src/commands/setTextSelection.d.ts +0 -14
  69. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -15
  70. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -17
  71. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -15
  72. package/dist/packages/core/src/commands/toggleList.d.ts +0 -18
  73. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -30
  74. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -17
  75. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -16
  76. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -13
  77. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -13
  78. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -25
  79. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -24
  80. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -16
  81. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -16
  82. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -5
  83. package/dist/packages/core/src/extensions/commands.d.ts +0 -3
  84. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  85. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  86. package/dist/packages/core/src/extensions/index.d.ts +0 -6
  87. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  88. package/dist/packages/core/src/extensions/tabindex.d.ts +0 -2
  89. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +0 -10
  90. package/dist/packages/core/src/helpers/createChainableState.d.ts +0 -10
  91. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -12
  92. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -15
  93. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +0 -7
  94. package/dist/packages/core/src/helpers/findChildren.d.ts +0 -9
  95. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +0 -10
  96. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -16
  97. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -17
  98. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -8
  99. package/dist/packages/core/src/helpers/generateJSON.d.ts +0 -8
  100. package/dist/packages/core/src/helpers/generateText.d.ts +0 -12
  101. package/dist/packages/core/src/helpers/getAttributes.d.ts +0 -9
  102. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  103. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +0 -11
  104. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +0 -8
  105. package/dist/packages/core/src/helpers/getExtensionField.d.ts +0 -9
  106. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  107. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -3
  108. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  109. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  110. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  111. package/dist/packages/core/src/helpers/getNodeAtPosition.d.ts +0 -11
  112. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -3
  113. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  114. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  115. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -4
  116. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +0 -10
  117. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -8
  118. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -8
  119. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -9
  120. package/dist/packages/core/src/helpers/getText.d.ts +0 -15
  121. package/dist/packages/core/src/helpers/getTextBetween.d.ts +0 -14
  122. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +0 -8
  123. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +0 -8
  124. package/dist/packages/core/src/helpers/index.d.ts +0 -50
  125. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  126. package/dist/packages/core/src/helpers/isActive.d.ts +0 -2
  127. package/dist/packages/core/src/helpers/isAtEndOfNode.d.ts +0 -2
  128. package/dist/packages/core/src/helpers/isAtStartOfNode.d.ts +0 -2
  129. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +0 -2
  130. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  131. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -3
  132. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -3
  133. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  134. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  135. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  136. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +0 -2
  137. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +0 -4
  138. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  139. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  140. package/dist/packages/core/src/index.d.ts +0 -24
  141. package/dist/packages/core/src/inputRules/index.d.ts +0 -5
  142. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -13
  143. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -23
  144. package/dist/packages/core/src/inputRules/textInputRule.d.ts +0 -10
  145. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +0 -15
  146. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +0 -28
  147. package/dist/packages/core/src/pasteRules/index.d.ts +0 -3
  148. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -13
  149. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +0 -13
  150. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +0 -10
  151. package/dist/packages/core/src/style.d.ts +0 -1
  152. package/dist/packages/core/src/types.d.ts +0 -255
  153. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -9
  154. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  155. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -6
  156. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  157. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +0 -1
  158. package/dist/packages/core/src/utilities/findDuplicates.d.ts +0 -1
  159. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  160. package/dist/packages/core/src/utilities/index.d.ts +0 -20
  161. package/dist/packages/core/src/utilities/isAndroid.d.ts +0 -1
  162. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  163. package/dist/packages/core/src/utilities/isFunction.d.ts +0 -1
  164. package/dist/packages/core/src/utilities/isMacOS.d.ts +0 -1
  165. package/dist/packages/core/src/utilities/isNumber.d.ts +0 -1
  166. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  167. package/dist/packages/core/src/utilities/isRegExp.d.ts +0 -1
  168. package/dist/packages/core/src/utilities/isString.d.ts +0 -1
  169. package/dist/packages/core/src/utilities/isiOS.d.ts +0 -1
  170. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -1
  171. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -1
  172. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  173. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -8
  174. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +0 -8
  175. package/dist/packages/suggestion/src/findSuggestionMatch.d.ts +0 -15
  176. package/dist/packages/suggestion/src/index.d.ts +0 -4
@@ -1,9 +1,11 @@
1
- import { escapeForRegEx, Range } from '@tiptap/core'
2
- import { ResolvedPos } from '@tiptap/pm/model'
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
- char, allowSpaces, allowedPrefixes, startOfLine, $position,
21
- } = config
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${escapedChar}|$)`, 'gm')
28
- : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${escapedChar}]*`, 'gm')
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, Plugin, PluginKey } from '@tiptap/pm/state'
3
- import { Decoration, DecorationSet, EditorView } from '@tiptap/pm/view'
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, isActive?: boolean }) => boolean
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 popper.js or tippy.js
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
- // because of `items` can be asynchrounous we’ll search for the current decoration node
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
- const currentDecorationNode = view.dom.querySelector(
233
- `[data-decoration-id="${decorationId}"]`,
234
- )
255
+ const currentDecorationNode = view.dom.querySelector(`[data-decoration-id="${decorationId}"]`)
235
256
 
236
- return currentDecorationNode?.getBoundingClientRect() || null
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 (match && allow({
334
- editor, state, range: match.range, isActive: prev.active,
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: decorationClass,
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
@@ -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
- }