@liveblocks/react-tiptap 3.9.1 → 3.9.2-tiptap1

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 (82) hide show
  1. package/dist/LiveblocksExtension.cjs +7 -3
  2. package/dist/LiveblocksExtension.cjs.map +1 -1
  3. package/dist/LiveblocksExtension.js +7 -3
  4. package/dist/LiveblocksExtension.js.map +1 -1
  5. package/dist/ai/AiExtension.cjs +8 -0
  6. package/dist/ai/AiExtension.cjs.map +1 -1
  7. package/dist/ai/AiExtension.js +8 -0
  8. package/dist/ai/AiExtension.js.map +1 -1
  9. package/dist/ai/AiToolbar.cjs +256 -235
  10. package/dist/ai/AiToolbar.cjs.map +1 -1
  11. package/dist/ai/AiToolbar.js +256 -235
  12. package/dist/ai/AiToolbar.js.map +1 -1
  13. package/dist/comments/AnchoredThreads.cjs +63 -50
  14. package/dist/comments/AnchoredThreads.cjs.map +1 -1
  15. package/dist/comments/AnchoredThreads.js +63 -50
  16. package/dist/comments/AnchoredThreads.js.map +1 -1
  17. package/dist/comments/CommentsExtension.cjs +3 -0
  18. package/dist/comments/CommentsExtension.cjs.map +1 -1
  19. package/dist/comments/CommentsExtension.js +3 -0
  20. package/dist/comments/CommentsExtension.js.map +1 -1
  21. package/dist/comments/FloatingComposer.cjs +32 -22
  22. package/dist/comments/FloatingComposer.cjs.map +1 -1
  23. package/dist/comments/FloatingComposer.js +32 -22
  24. package/dist/comments/FloatingComposer.js.map +1 -1
  25. package/dist/comments/FloatingThreads.cjs +39 -33
  26. package/dist/comments/FloatingThreads.cjs.map +1 -1
  27. package/dist/comments/FloatingThreads.js +39 -33
  28. package/dist/comments/FloatingThreads.js.map +1 -1
  29. package/dist/context.cjs +1 -4
  30. package/dist/context.cjs.map +1 -1
  31. package/dist/context.js +1 -4
  32. package/dist/context.js.map +1 -1
  33. package/dist/index.d.cts +135 -4
  34. package/dist/index.d.ts +135 -4
  35. package/dist/mentions/GroupMentionNode.cjs +2 -0
  36. package/dist/mentions/GroupMentionNode.cjs.map +1 -1
  37. package/dist/mentions/GroupMentionNode.js +2 -0
  38. package/dist/mentions/GroupMentionNode.js.map +1 -1
  39. package/dist/mentions/Mention.cjs +35 -42
  40. package/dist/mentions/Mention.cjs.map +1 -1
  41. package/dist/mentions/Mention.js +34 -41
  42. package/dist/mentions/Mention.js.map +1 -1
  43. package/dist/mentions/MentionExtension.cjs +1 -0
  44. package/dist/mentions/MentionExtension.cjs.map +1 -1
  45. package/dist/mentions/MentionExtension.js +1 -0
  46. package/dist/mentions/MentionExtension.js.map +1 -1
  47. package/dist/mentions/MentionNode.cjs +2 -0
  48. package/dist/mentions/MentionNode.cjs.map +1 -1
  49. package/dist/mentions/MentionNode.js +2 -0
  50. package/dist/mentions/MentionNode.js.map +1 -1
  51. package/dist/mentions/MentionsList.cjs +66 -51
  52. package/dist/mentions/MentionsList.cjs.map +1 -1
  53. package/dist/mentions/MentionsList.js +66 -51
  54. package/dist/mentions/MentionsList.js.map +1 -1
  55. package/dist/toolbar/FloatingToolbar.cjs +43 -28
  56. package/dist/toolbar/FloatingToolbar.cjs.map +1 -1
  57. package/dist/toolbar/FloatingToolbar.js +43 -28
  58. package/dist/toolbar/FloatingToolbar.js.map +1 -1
  59. package/dist/toolbar/Toolbar.cjs +191 -153
  60. package/dist/toolbar/Toolbar.cjs.map +1 -1
  61. package/dist/toolbar/Toolbar.js +191 -153
  62. package/dist/toolbar/Toolbar.js.map +1 -1
  63. package/dist/toolbar/shared.cjs +12 -11
  64. package/dist/toolbar/shared.cjs.map +1 -1
  65. package/dist/toolbar/shared.js +12 -11
  66. package/dist/toolbar/shared.js.map +1 -1
  67. package/dist/types.cjs.map +1 -1
  68. package/dist/types.js.map +1 -1
  69. package/dist/utils.cjs.map +1 -1
  70. package/dist/utils.js.map +1 -1
  71. package/dist/version-history/HistoryVersionPreview.cjs +30 -42
  72. package/dist/version-history/HistoryVersionPreview.cjs.map +1 -1
  73. package/dist/version-history/HistoryVersionPreview.js +30 -42
  74. package/dist/version-history/HistoryVersionPreview.js.map +1 -1
  75. package/dist/version.cjs +1 -1
  76. package/dist/version.cjs.map +1 -1
  77. package/dist/version.js +1 -1
  78. package/dist/version.js.map +1 -1
  79. package/package.json +14 -14
  80. package/src/styles/index.css +3 -2
  81. package/styles.css +1 -1
  82. package/styles.css.map +1 -1
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { ContextualPromptContext, ContextualPromptResponse, ThreadData, MentionData, BaseMetadata, DM, HistoryVersion } from '@liveblocks/core';
2
- import { Content, Extension, Node } from '@tiptap/core';
1
+ import { ContextualPromptContext, ContextualPromptResponse, ThreadData, Relax, MentionData, BaseMetadata, DM, HistoryVersion } from '@liveblocks/core';
2
+ import { LiveblocksYjsProvider } from '@liveblocks/yjs';
3
+ import { Content, Range, Extension, Node } from '@tiptap/core';
4
+ import { Doc, PermanentUserData, Snapshot } from 'yjs';
3
5
  import * as react from 'react';
4
6
  import { ComponentProps, ReactNode, ComponentType, PropsWithChildren, ComponentPropsWithoutRef, HTMLAttributes } from 'react';
5
7
  import { Editor } from '@tiptap/react';
@@ -55,6 +57,135 @@ type LiveblocksExtensionOptions = {
55
57
  initialContent?: Content;
56
58
  enablePermanentUserData?: boolean;
57
59
  };
60
+ type LiveblocksExtensionStorage = {
61
+ unsubs: (() => void)[];
62
+ doc: Doc;
63
+ provider: LiveblocksYjsProvider;
64
+ permanentUserData?: PermanentUserData;
65
+ };
66
+ type CommentsExtensionStorage = {
67
+ pendingComment: boolean;
68
+ };
69
+ /**
70
+ * The state of the AI toolbar.
71
+ *
72
+ * ┌────────────────────────────────────────────────────────────────────────────────┐
73
+ * │ │
74
+ * │ ┌──────────────────────────────────────────────┐ │
75
+ * ▼ ▼ │ │
76
+ * ┌───────$closeAiToolbar()───────┐ │ │
77
+ * ▼ ◇ ◇ ◇
78
+ * ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
79
+ * │ CLOSED │ │ ASKING │ │ THINKING │ │ REVIEWING │
80
+ * └───────────────────────┘ └───────────────────────┘ └───────────────────────┘ └───────────────────────┘
81
+ * ▲ ◇ ◇ ▲ ▲ ◇ ▲ ▲ ◇ ▲ ◇ ◇
82
+ * │ │ └───$openAiToolbarAsking()──┘ │ │ └ ─ ─ ─ ─ ─ ─⚠─ ─ ─ ─ ─ ─ ─│─├── ─ ─ ─ ─ ─ ─✓─ ─ ─ ─ ─ ─ ─ ┘ │ │
83
+ * │ │ │ ▼ │ │ │ │
84
+ * │ └─────────────────$startAiToolbarThinking(prompt)──────────────┘ │ │ │
85
+ * │ │ ▲ │ │ │
86
+ * │ │ └──────────────────────────────┼───────────────────────────────┘ │
87
+ * │ │ │ │
88
+ * │ └───$cancelAiToolbarThinking()───┘ │
89
+ * │ │
90
+ * └─────────────────────────────────────$acceptAiToolbarResponse()─────────────────────────────────────┘
91
+ *
92
+ */
93
+ type AiToolbarState = Relax<{
94
+ phase: "closed";
95
+ } | {
96
+ phase: "asking";
97
+ /**
98
+ * The selection stored when opening the AI toolbar.
99
+ */
100
+ initialSelection: Range;
101
+ /**
102
+ * The custom prompt being written in the toolbar.
103
+ */
104
+ customPrompt: string;
105
+ /**
106
+ * A potential error that occurred during the last AI request.
107
+ */
108
+ error?: Error;
109
+ } | {
110
+ phase: "thinking";
111
+ /**
112
+ * The selection stored when opening the AI toolbar.
113
+ */
114
+ initialSelection: Range;
115
+ /**
116
+ * The custom prompt being written in the toolbar.
117
+ */
118
+ customPrompt: string;
119
+ /**
120
+ * An abort controller to cancel the AI request.
121
+ */
122
+ abortController: AbortController;
123
+ /**
124
+ * The prompt sent to the AI.
125
+ */
126
+ prompt: string;
127
+ /**
128
+ * The previous response if this "thinking" phase is a refinement.
129
+ */
130
+ previousResponse?: ContextualPromptResponse;
131
+ } | {
132
+ phase: "reviewing";
133
+ /**
134
+ * The selection stored when opening the AI toolbar.
135
+ */
136
+ initialSelection: Range;
137
+ /**
138
+ * The custom prompt being written in the toolbar.
139
+ */
140
+ customPrompt: string;
141
+ /**
142
+ * The prompt sent to the AI.
143
+ */
144
+ prompt: string;
145
+ /**
146
+ * The response of the AI request.
147
+ */
148
+ response: ContextualPromptResponse;
149
+ }>;
150
+ type AiExtensionStorage = {
151
+ name: string;
152
+ state: AiToolbarState;
153
+ snapshot?: Snapshot;
154
+ };
155
+ declare module "@tiptap/core" {
156
+ interface Storage {
157
+ liveblocksAi: AiExtensionStorage;
158
+ liveblocksExtension: LiveblocksExtensionStorage;
159
+ liveblocksComments: CommentsExtensionStorage;
160
+ }
161
+ interface Commands<ReturnType> {
162
+ collaborationCaret: {
163
+ /**
164
+ * Update details of the current user
165
+ * @example editor.commands.updateUser({ name: 'John Doe', color: '#305500' })
166
+ */
167
+ updateUser: (attributes: Record<string, any>) => ReturnType;
168
+ /**
169
+ * Update details of the current user
170
+ *
171
+ * @deprecated The "user" command is deprecated. Please use "updateUser" instead. Read more: https://tiptap.dev/api/extensions/collaboration-caret
172
+ */
173
+ user: (attributes: Record<string, any>) => ReturnType;
174
+ };
175
+ collaboration: {
176
+ /**
177
+ * Undo recent changes
178
+ * @example editor.commands.undo()
179
+ */
180
+ undo: () => ReturnType;
181
+ /**
182
+ * Reapply reverted changes
183
+ * @example editor.commands.redo()
184
+ */
185
+ redo: () => ReturnType;
186
+ };
187
+ }
188
+ }
58
189
  type FloatingPosition = "top" | "bottom";
59
190
  type CommentsCommands<ReturnType = boolean> = {
60
191
  /**
@@ -192,7 +323,7 @@ declare function FloatingThreads({ threads, components, editor, ...props }: Floa
192
323
  declare function useIsEditorReady(): boolean;
193
324
  declare const useLiveblocksExtension: (opts?: LiveblocksExtensionOptions) => Extension;
194
325
 
195
- declare const GroupMentionNode: Node<never, never>;
326
+ declare const GroupMentionNode: Node<any, any>;
196
327
 
197
328
  type MentionExtensionOptions = {
198
329
  onCreateMention: (mention: TiptapMentionData) => void;
@@ -200,7 +331,7 @@ type MentionExtensionOptions = {
200
331
  };
201
332
  declare const MentionExtension: Extension<MentionExtensionOptions, any>;
202
333
 
203
- declare const MentionNode: Node<never, never>;
334
+ declare const MentionNode: Node<any, any>;
204
335
 
205
336
  interface ToolbarSlotProps {
206
337
  editor: Editor;
@@ -38,6 +38,7 @@ const GroupMentionNode = core.Node.create({
38
38
  }
39
39
  return {
40
40
  "data-id": attributes.id
41
+ // "as" typing because TipTap doesn't have a way to type attributes
41
42
  };
42
43
  }
43
44
  },
@@ -73,6 +74,7 @@ const GroupMentionNode = core.Node.create({
73
74
  }
74
75
  return {
75
76
  "data-notification-id": attributes.notificationId
77
+ // "as" typing because TipTap doesn't have a way to type attributes
76
78
  };
77
79
  }
78
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GroupMentionNode.cjs","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create<never, never>({\n name: LIVEBLOCKS_GROUP_MENTION_TYPE,\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n priority: 101,\n parseHTML() {\n return [\n {\n tag: \"liveblocks-group-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-group-mention\", mergeAttributes(HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Mention, {\n contentDOMElementTag: \"span\",\n });\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n \"data-id\": attributes.id as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n userIds: {\n default: undefined,\n parseHTML: (element) => {\n const userIdsAttribute = element.getAttribute(\"data-user-ids\");\n\n if (!userIdsAttribute) {\n return undefined;\n }\n\n try {\n const userIds = JSON.parse(userIdsAttribute) as string[];\n\n return Array.isArray(userIds) ? userIds : undefined;\n } catch {\n return undefined;\n }\n },\n renderHTML: (attributes) => {\n if (!attributes.userIds || !Array.isArray(attributes.userIds)) {\n return {};\n }\n\n return {\n \"data-user-ids\": JSON.stringify(attributes.userIds),\n };\n },\n },\n notificationId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-notification-id\"),\n renderHTML: (attributes) => {\n if (!attributes.notificationId) {\n return {};\n }\n\n return {\n \"data-notification-id\": attributes.notificationId as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\"\", pos, pos + node.nodeSize);\n }\n });\n\n return isMention;\n }),\n };\n },\n});\n"],"names":["Node","LIVEBLOCKS_GROUP_MENTION_TYPE","mergeAttributes","ReactNodeViewRenderer","Mention"],"mappings":"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"}
1
+ {"version":3,"file":"GroupMentionNode.cjs","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create({\n name: LIVEBLOCKS_GROUP_MENTION_TYPE,\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n priority: 101,\n parseHTML() {\n return [\n {\n tag: \"liveblocks-group-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-group-mention\", mergeAttributes(HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Mention, {\n contentDOMElementTag: \"span\",\n });\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n \"data-id\": attributes.id as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n userIds: {\n default: undefined,\n parseHTML: (element) => {\n const userIdsAttribute = element.getAttribute(\"data-user-ids\");\n\n if (!userIdsAttribute) {\n return undefined;\n }\n\n try {\n const userIds = JSON.parse(userIdsAttribute) as string[];\n\n return Array.isArray(userIds) ? userIds : undefined;\n } catch {\n return undefined;\n }\n },\n renderHTML: (attributes) => {\n if (!attributes.userIds || !Array.isArray(attributes.userIds)) {\n return {};\n }\n\n return {\n \"data-user-ids\": JSON.stringify(attributes.userIds),\n };\n },\n },\n notificationId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-notification-id\"),\n renderHTML: (attributes) => {\n if (!attributes.notificationId) {\n return {};\n }\n\n return {\n \"data-notification-id\": attributes.notificationId as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\"\", pos, pos + node.nodeSize);\n }\n });\n\n return isMention;\n }),\n };\n },\n});\n"],"names":["Node","LIVEBLOCKS_GROUP_MENTION_TYPE","mergeAttributes","ReactNodeViewRenderer","Mention"],"mappings":"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"}
@@ -36,6 +36,7 @@ const GroupMentionNode = Node.create({
36
36
  }
37
37
  return {
38
38
  "data-id": attributes.id
39
+ // "as" typing because TipTap doesn't have a way to type attributes
39
40
  };
40
41
  }
41
42
  },
@@ -71,6 +72,7 @@ const GroupMentionNode = Node.create({
71
72
  }
72
73
  return {
73
74
  "data-notification-id": attributes.notificationId
75
+ // "as" typing because TipTap doesn't have a way to type attributes
74
76
  };
75
77
  }
76
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GroupMentionNode.js","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create<never, never>({\n name: LIVEBLOCKS_GROUP_MENTION_TYPE,\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n priority: 101,\n parseHTML() {\n return [\n {\n tag: \"liveblocks-group-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-group-mention\", mergeAttributes(HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Mention, {\n contentDOMElementTag: \"span\",\n });\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n \"data-id\": attributes.id as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n userIds: {\n default: undefined,\n parseHTML: (element) => {\n const userIdsAttribute = element.getAttribute(\"data-user-ids\");\n\n if (!userIdsAttribute) {\n return undefined;\n }\n\n try {\n const userIds = JSON.parse(userIdsAttribute) as string[];\n\n return Array.isArray(userIds) ? userIds : undefined;\n } catch {\n return undefined;\n }\n },\n renderHTML: (attributes) => {\n if (!attributes.userIds || !Array.isArray(attributes.userIds)) {\n return {};\n }\n\n return {\n \"data-user-ids\": JSON.stringify(attributes.userIds),\n };\n },\n },\n notificationId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-notification-id\"),\n renderHTML: (attributes) => {\n if (!attributes.notificationId) {\n return {};\n }\n\n return {\n \"data-notification-id\": attributes.notificationId as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\"\", pos, pos + node.nodeSize);\n }\n });\n\n return isMention;\n }),\n };\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GroupMentionNode.js","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create({\n name: LIVEBLOCKS_GROUP_MENTION_TYPE,\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n priority: 101,\n parseHTML() {\n return [\n {\n tag: \"liveblocks-group-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-group-mention\", mergeAttributes(HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Mention, {\n contentDOMElementTag: \"span\",\n });\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n \"data-id\": attributes.id as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n userIds: {\n default: undefined,\n parseHTML: (element) => {\n const userIdsAttribute = element.getAttribute(\"data-user-ids\");\n\n if (!userIdsAttribute) {\n return undefined;\n }\n\n try {\n const userIds = JSON.parse(userIdsAttribute) as string[];\n\n return Array.isArray(userIds) ? userIds : undefined;\n } catch {\n return undefined;\n }\n },\n renderHTML: (attributes) => {\n if (!attributes.userIds || !Array.isArray(attributes.userIds)) {\n return {};\n }\n\n return {\n \"data-user-ids\": JSON.stringify(attributes.userIds),\n };\n },\n },\n notificationId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-notification-id\"),\n renderHTML: (attributes) => {\n if (!attributes.notificationId) {\n return {};\n }\n\n return {\n \"data-notification-id\": attributes.notificationId as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\"\", pos, pos + node.nodeSize);\n }\n });\n\n return isMention;\n }),\n };\n },\n});\n"],"names":[],"mappings":"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"}
@@ -3,52 +3,41 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var core = require('@liveblocks/core');
5
5
  var _private = require('@liveblocks/react-ui/_private');
6
- var react$1 = require('@tiptap/react');
7
- var react = require('react');
6
+ var react = require('@tiptap/react');
8
7
  var types = require('../types.cjs');
9
8
 
10
- const UserMention = react.forwardRef(
11
- ({ mention, isSelected }, forwardedRef) => {
12
- return /* @__PURE__ */ jsxRuntime.jsxs(react$1.NodeViewWrapper, {
9
+ const UserMention = ({ isSelected, mention }) => {
10
+ return /* @__PURE__ */ jsxRuntime.jsxs(
11
+ react.NodeViewWrapper,
12
+ {
13
13
  className: _private.cn(
14
14
  "lb-root lb-mention lb-tiptap-mention",
15
15
  isSelected && "lb-mention-selected"
16
16
  ),
17
17
  as: "span",
18
- ref: forwardedRef,
19
18
  children: [
20
- /* @__PURE__ */ jsxRuntime.jsx("span", {
21
- className: "lb-mention-symbol",
22
- children: core.MENTION_CHARACTER
23
- }),
24
- /* @__PURE__ */ jsxRuntime.jsx(_private.User, {
25
- userId: mention.id
26
- })
19
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
20
+ /* @__PURE__ */ jsxRuntime.jsx(_private.User, { userId: mention.id })
27
21
  ]
28
- });
29
- }
30
- );
31
- const GroupMention = react.forwardRef(
32
- ({ mention, isSelected }, forwardedRef) => {
33
- return /* @__PURE__ */ jsxRuntime.jsxs(react$1.NodeViewWrapper, {
22
+ }
23
+ );
24
+ };
25
+ const GroupMention = ({ isSelected, mention }) => {
26
+ return /* @__PURE__ */ jsxRuntime.jsxs(
27
+ react.NodeViewWrapper,
28
+ {
34
29
  className: _private.cn(
35
30
  "lb-root lb-mention lb-tiptap-mention",
36
31
  isSelected && "lb-mention-selected"
37
32
  ),
38
33
  as: "span",
39
- ref: forwardedRef,
40
34
  children: [
41
- /* @__PURE__ */ jsxRuntime.jsx("span", {
42
- className: "lb-mention-symbol",
43
- children: core.MENTION_CHARACTER
44
- }),
45
- /* @__PURE__ */ jsxRuntime.jsx(_private.Group, {
46
- groupId: mention.id
47
- })
35
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
36
+ /* @__PURE__ */ jsxRuntime.jsx(_private.Group, { groupId: mention.id })
48
37
  ]
49
- });
50
- }
51
- );
38
+ }
39
+ );
40
+ };
52
41
  function deserializeGroupUserIds(userIds) {
53
42
  if (typeof userIds !== "string") {
54
43
  return void 0;
@@ -63,18 +52,20 @@ function deserializeGroupUserIds(userIds) {
63
52
  return void 0;
64
53
  }
65
54
  }
66
- const Mention = react.forwardRef(({ node, selected: isSelected }, forwardedRef) => {
55
+ const Mention = ({ node, selected: isSelected }) => {
67
56
  const attrs = node.attrs;
68
57
  if (node.type.name === types.LIVEBLOCKS_MENTION_TYPE) {
69
58
  const mention = {
70
59
  kind: "user",
71
60
  id: attrs.id
72
61
  };
73
- return /* @__PURE__ */ jsxRuntime.jsx(UserMention, {
74
- mention,
75
- isSelected,
76
- ref: forwardedRef
77
- });
62
+ return /* @__PURE__ */ jsxRuntime.jsx(
63
+ UserMention,
64
+ {
65
+ mention,
66
+ isSelected
67
+ }
68
+ );
78
69
  }
79
70
  if (node.type.name === types.LIVEBLOCKS_GROUP_MENTION_TYPE) {
80
71
  const mention = {
@@ -82,14 +73,16 @@ const Mention = react.forwardRef(({ node, selected: isSelected }, forwardedRef)
82
73
  id: attrs.id,
83
74
  userIds: deserializeGroupUserIds(attrs.userIds)
84
75
  };
85
- return /* @__PURE__ */ jsxRuntime.jsx(GroupMention, {
86
- mention,
87
- isSelected,
88
- ref: forwardedRef
89
- });
76
+ return /* @__PURE__ */ jsxRuntime.jsx(
77
+ GroupMention,
78
+ {
79
+ mention,
80
+ isSelected
81
+ }
82
+ );
90
83
  }
91
84
  return null;
92
- });
85
+ };
93
86
 
94
87
  exports.Mention = Mention;
95
88
  //# sourceMappingURL=Mention.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mention.cjs","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport {\n LIVEBLOCKS_GROUP_MENTION_TYPE,\n LIVEBLOCKS_MENTION_TYPE,\n type SerializedTiptapMentionData,\n} from \"../types\";\n\ninterface MentionProps extends ComponentPropsWithoutRef<\"span\"> {\n mention: MentionData;\n isSelected: boolean;\n}\n\nconst UserMention = forwardRef<HTMLSpanElement, MentionProps>(\n ({ mention, isSelected }, forwardedRef) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n ref={forwardedRef}\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <User userId={mention.id} />\n </NodeViewWrapper>\n );\n }\n);\n\nconst GroupMention = forwardRef<HTMLSpanElement, MentionProps>(\n ({ mention, isSelected }, forwardedRef) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n ref={forwardedRef}\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <Group groupId={mention.id} />\n </NodeViewWrapper>\n );\n }\n);\n\nfunction deserializeGroupUserIds(\n userIds: string | undefined\n): string[] | undefined {\n if (typeof userIds !== \"string\") {\n return undefined;\n }\n\n try {\n const parsedUserIds = JSON.parse(userIds) as string[];\n\n if (Array.isArray(parsedUserIds)) {\n return parsedUserIds;\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const Mention = forwardRef<\n HTMLSpanElement,\n { node: Node; selected: boolean }\n>(({ node, selected: isSelected }, forwardedRef) => {\n const attrs = node.attrs as Omit<SerializedTiptapMentionData, \"kind\">;\n\n if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention: UserMentionData = {\n kind: \"user\",\n id: attrs.id,\n };\n\n return (\n <UserMention\n mention={mention}\n isSelected={isSelected}\n ref={forwardedRef}\n />\n );\n }\n\n if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {\n const mention: GroupMentionData = {\n kind: \"group\",\n id: attrs.id,\n userIds: deserializeGroupUserIds(attrs.userIds),\n };\n\n return (\n <GroupMention\n mention={mention}\n isSelected={isSelected}\n ref={forwardedRef}\n />\n );\n }\n\n return null;\n});\n"],"names":["forwardRef","jsxs","NodeViewWrapper","cn","jsx","MENTION_CHARACTER","User","Group","LIVEBLOCKS_MENTION_TYPE","LIVEBLOCKS_GROUP_MENTION_TYPE"],"mappings":";;;;;;;;;AAsBA,MAAM,WAAc,GAAAA,gBAAA;AAAA,EAClB,CAAC,EAAE,OAAS,EAAA,UAAA,IAAc,YAAiB,KAAA;AACzC,IAAA,uBACGC,eAAA,CAAAC,uBAAA,EAAA;AAAA,MACC,SAAW,EAAAC,WAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MACH,GAAK,EAAA,YAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAA,MAAA,EAAA;AAAA,UAAK,SAAU,EAAA,mBAAA;AAAA,UAAqB,QAAA,EAAAC,sBAAA;AAAA,SAAkB,CAAA;AAAA,wBACtDD,cAAA,CAAAE,aAAA,EAAA;AAAA,UAAK,QAAQ,OAAQ,CAAA,EAAA;AAAA,SAAI,CAAA;AAAA,OAAA;AAAA,KAC5B,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA,CAAA;AAEA,MAAM,YAAe,GAAAN,gBAAA;AAAA,EACnB,CAAC,EAAE,OAAS,EAAA,UAAA,IAAc,YAAiB,KAAA;AACzC,IAAA,uBACGC,eAAA,CAAAC,uBAAA,EAAA;AAAA,MACC,SAAW,EAAAC,WAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MACH,GAAK,EAAA,YAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAA,MAAA,EAAA;AAAA,UAAK,SAAU,EAAA,mBAAA;AAAA,UAAqB,QAAA,EAAAC,sBAAA;AAAA,SAAkB,CAAA;AAAA,wBACtDD,cAAA,CAAAG,cAAA,EAAA;AAAA,UAAM,SAAS,OAAQ,CAAA,EAAA;AAAA,SAAI,CAAA;AAAA,OAAA;AAAA,KAC9B,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA,CAAA;AAEA,SAAS,wBACP,OACsB,EAAA;AACtB,EAAI,IAAA,OAAO,YAAY,QAAU,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA;AACF,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAExC,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACP,CAAA,MAAA;AACA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEa,MAAA,OAAA,GAAUP,iBAGrB,CAAC,EAAE,MAAM,QAAU,EAAA,UAAA,IAAc,YAAiB,KAAA;AAClD,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA;AAEnB,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAASQ,6BAAyB,EAAA;AAC9C,IAAA,MAAM,OAA2B,GAAA;AAAA,MAC/B,IAAM,EAAA,MAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,KACZ,CAAA;AAEA,IAAA,uBACGJ,cAAA,CAAA,WAAA,EAAA;AAAA,MACC,OAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAK,EAAA,YAAA;AAAA,KACP,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAASK,mCAA+B,EAAA;AACpD,IAAA,MAAM,OAA4B,GAAA;AAAA,MAChC,IAAM,EAAA,OAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,MACV,OAAA,EAAS,uBAAwB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,KAChD,CAAA;AAEA,IAAA,uBACGL,cAAA,CAAA,YAAA,EAAA;AAAA,MACC,OAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAK,EAAA,YAAA;AAAA,KACP,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAC;;;;"}
1
+ {"version":3,"file":"Mention.cjs","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport { NodeViewWrapper, type ReactNodeViewProps } from \"@tiptap/react\";\n\nimport {\n LIVEBLOCKS_GROUP_MENTION_TYPE,\n LIVEBLOCKS_MENTION_TYPE,\n type SerializedTiptapMentionData,\n} from \"../types\";\n\ninterface MentionProps {\n mention: MentionData;\n isSelected: boolean;\n}\ninterface GroupMentionProps {\n mention: GroupMentionData;\n isSelected: boolean;\n}\n\nconst UserMention = ({ isSelected, mention }: MentionProps) => {\n\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <User userId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nconst GroupMention = ({ isSelected, mention }: GroupMentionProps) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <Group groupId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nfunction deserializeGroupUserIds(\n userIds: string | undefined\n): string[] | undefined {\n if (typeof userIds !== \"string\") {\n return undefined;\n }\n\n try {\n const parsedUserIds = JSON.parse(userIds) as string[];\n\n if (Array.isArray(parsedUserIds)) {\n return parsedUserIds;\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const Mention = ({ node, selected: isSelected }: ReactNodeViewProps<HTMLSpanElement>) => {\n const attrs = node.attrs as Omit<SerializedTiptapMentionData, \"kind\">;\n\n if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention: UserMentionData = {\n kind: \"user\",\n id: attrs.id,\n };\n\n return (\n <UserMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {\n const mention: GroupMentionData = {\n kind: \"group\",\n id: attrs.id,\n userIds: deserializeGroupUserIds(attrs.userIds),\n };\n\n return (\n <GroupMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n\n return null;\n};\n"],"names":["jsxs","NodeViewWrapper","cn","jsx","MENTION_CHARACTER","User","Group","LIVEBLOCKS_MENTION_TYPE","LIVEBLOCKS_GROUP_MENTION_TYPE"],"mappings":";;;;;;;;AAwBA,MAAM,WAAc,GAAA,CAAC,EAAE,UAAA,EAAY,SAA4B,KAAA;AAE7D,EACE,uBAAAA,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAC,WAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAAC,sBAAA,EAAA,CAAA;AAAA,wBACtDD,cAAA,CAAAE,aAAA,EAAA,EAAK,MAAQ,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC5B,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CAAC,EAAE,UAAA,EAAY,SAAiC,KAAA;AACnE,EACE,uBAAAL,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAC,WAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAAC,sBAAA,EAAA,CAAA;AAAA,wBACtDD,cAAA,CAAAG,cAAA,EAAA,EAAM,OAAS,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC9B,CAAA;AAEJ,CAAA,CAAA;AAEA,SAAS,wBACP,OACsB,EAAA;AACtB,EAAI,IAAA,OAAO,YAAY,QAAU,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA;AACF,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAExC,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACD,CAAA,MAAA;AACN,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEO,MAAM,UAAU,CAAC,EAAE,IAAM,EAAA,QAAA,EAAU,YAAsD,KAAA;AAC9F,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA;AAEnB,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAASC,6BAAyB,EAAA;AAC9C,IAAA,MAAM,OAA2B,GAAA;AAAA,MAC/B,IAAM,EAAA,MAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,KACZ,CAAA;AAEA,IACE,uBAAAJ,cAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AACA,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAASK,mCAA+B,EAAA;AACpD,IAAA,MAAM,OAA4B,GAAA;AAAA,MAChC,IAAM,EAAA,OAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,MACV,OAAA,EAAS,uBAAwB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,KAChD,CAAA;AAEA,IACE,uBAAAL,cAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
@@ -2,51 +2,40 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { MENTION_CHARACTER } from '@liveblocks/core';
3
3
  import { cn, User, Group } from '@liveblocks/react-ui/_private';
4
4
  import { NodeViewWrapper } from '@tiptap/react';
5
- import { forwardRef } from 'react';
6
5
  import { LIVEBLOCKS_MENTION_TYPE, LIVEBLOCKS_GROUP_MENTION_TYPE } from '../types.js';
7
6
 
8
- const UserMention = forwardRef(
9
- ({ mention, isSelected }, forwardedRef) => {
10
- return /* @__PURE__ */ jsxs(NodeViewWrapper, {
7
+ const UserMention = ({ isSelected, mention }) => {
8
+ return /* @__PURE__ */ jsxs(
9
+ NodeViewWrapper,
10
+ {
11
11
  className: cn(
12
12
  "lb-root lb-mention lb-tiptap-mention",
13
13
  isSelected && "lb-mention-selected"
14
14
  ),
15
15
  as: "span",
16
- ref: forwardedRef,
17
16
  children: [
18
- /* @__PURE__ */ jsx("span", {
19
- className: "lb-mention-symbol",
20
- children: MENTION_CHARACTER
21
- }),
22
- /* @__PURE__ */ jsx(User, {
23
- userId: mention.id
24
- })
17
+ /* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
18
+ /* @__PURE__ */ jsx(User, { userId: mention.id })
25
19
  ]
26
- });
27
- }
28
- );
29
- const GroupMention = forwardRef(
30
- ({ mention, isSelected }, forwardedRef) => {
31
- return /* @__PURE__ */ jsxs(NodeViewWrapper, {
20
+ }
21
+ );
22
+ };
23
+ const GroupMention = ({ isSelected, mention }) => {
24
+ return /* @__PURE__ */ jsxs(
25
+ NodeViewWrapper,
26
+ {
32
27
  className: cn(
33
28
  "lb-root lb-mention lb-tiptap-mention",
34
29
  isSelected && "lb-mention-selected"
35
30
  ),
36
31
  as: "span",
37
- ref: forwardedRef,
38
32
  children: [
39
- /* @__PURE__ */ jsx("span", {
40
- className: "lb-mention-symbol",
41
- children: MENTION_CHARACTER
42
- }),
43
- /* @__PURE__ */ jsx(Group, {
44
- groupId: mention.id
45
- })
33
+ /* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
34
+ /* @__PURE__ */ jsx(Group, { groupId: mention.id })
46
35
  ]
47
- });
48
- }
49
- );
36
+ }
37
+ );
38
+ };
50
39
  function deserializeGroupUserIds(userIds) {
51
40
  if (typeof userIds !== "string") {
52
41
  return void 0;
@@ -61,18 +50,20 @@ function deserializeGroupUserIds(userIds) {
61
50
  return void 0;
62
51
  }
63
52
  }
64
- const Mention = forwardRef(({ node, selected: isSelected }, forwardedRef) => {
53
+ const Mention = ({ node, selected: isSelected }) => {
65
54
  const attrs = node.attrs;
66
55
  if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {
67
56
  const mention = {
68
57
  kind: "user",
69
58
  id: attrs.id
70
59
  };
71
- return /* @__PURE__ */ jsx(UserMention, {
72
- mention,
73
- isSelected,
74
- ref: forwardedRef
75
- });
60
+ return /* @__PURE__ */ jsx(
61
+ UserMention,
62
+ {
63
+ mention,
64
+ isSelected
65
+ }
66
+ );
76
67
  }
77
68
  if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {
78
69
  const mention = {
@@ -80,14 +71,16 @@ const Mention = forwardRef(({ node, selected: isSelected }, forwardedRef) => {
80
71
  id: attrs.id,
81
72
  userIds: deserializeGroupUserIds(attrs.userIds)
82
73
  };
83
- return /* @__PURE__ */ jsx(GroupMention, {
84
- mention,
85
- isSelected,
86
- ref: forwardedRef
87
- });
74
+ return /* @__PURE__ */ jsx(
75
+ GroupMention,
76
+ {
77
+ mention,
78
+ isSelected
79
+ }
80
+ );
88
81
  }
89
82
  return null;
90
- });
83
+ };
91
84
 
92
85
  export { Mention };
93
86
  //# sourceMappingURL=Mention.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mention.js","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport type { Node } from \"@tiptap/pm/model\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport {\n LIVEBLOCKS_GROUP_MENTION_TYPE,\n LIVEBLOCKS_MENTION_TYPE,\n type SerializedTiptapMentionData,\n} from \"../types\";\n\ninterface MentionProps extends ComponentPropsWithoutRef<\"span\"> {\n mention: MentionData;\n isSelected: boolean;\n}\n\nconst UserMention = forwardRef<HTMLSpanElement, MentionProps>(\n ({ mention, isSelected }, forwardedRef) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n ref={forwardedRef}\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <User userId={mention.id} />\n </NodeViewWrapper>\n );\n }\n);\n\nconst GroupMention = forwardRef<HTMLSpanElement, MentionProps>(\n ({ mention, isSelected }, forwardedRef) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n ref={forwardedRef}\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <Group groupId={mention.id} />\n </NodeViewWrapper>\n );\n }\n);\n\nfunction deserializeGroupUserIds(\n userIds: string | undefined\n): string[] | undefined {\n if (typeof userIds !== \"string\") {\n return undefined;\n }\n\n try {\n const parsedUserIds = JSON.parse(userIds) as string[];\n\n if (Array.isArray(parsedUserIds)) {\n return parsedUserIds;\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const Mention = forwardRef<\n HTMLSpanElement,\n { node: Node; selected: boolean }\n>(({ node, selected: isSelected }, forwardedRef) => {\n const attrs = node.attrs as Omit<SerializedTiptapMentionData, \"kind\">;\n\n if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention: UserMentionData = {\n kind: \"user\",\n id: attrs.id,\n };\n\n return (\n <UserMention\n mention={mention}\n isSelected={isSelected}\n ref={forwardedRef}\n />\n );\n }\n\n if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {\n const mention: GroupMentionData = {\n kind: \"group\",\n id: attrs.id,\n userIds: deserializeGroupUserIds(attrs.userIds),\n };\n\n return (\n <GroupMention\n mention={mention}\n isSelected={isSelected}\n ref={forwardedRef}\n />\n );\n }\n\n return null;\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Mention.js","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport { NodeViewWrapper, type ReactNodeViewProps } from \"@tiptap/react\";\n\nimport {\n LIVEBLOCKS_GROUP_MENTION_TYPE,\n LIVEBLOCKS_MENTION_TYPE,\n type SerializedTiptapMentionData,\n} from \"../types\";\n\ninterface MentionProps {\n mention: MentionData;\n isSelected: boolean;\n}\ninterface GroupMentionProps {\n mention: GroupMentionData;\n isSelected: boolean;\n}\n\nconst UserMention = ({ isSelected, mention }: MentionProps) => {\n\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <User userId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nconst GroupMention = ({ isSelected, mention }: GroupMentionProps) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <Group groupId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nfunction deserializeGroupUserIds(\n userIds: string | undefined\n): string[] | undefined {\n if (typeof userIds !== \"string\") {\n return undefined;\n }\n\n try {\n const parsedUserIds = JSON.parse(userIds) as string[];\n\n if (Array.isArray(parsedUserIds)) {\n return parsedUserIds;\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const Mention = ({ node, selected: isSelected }: ReactNodeViewProps<HTMLSpanElement>) => {\n const attrs = node.attrs as Omit<SerializedTiptapMentionData, \"kind\">;\n\n if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention: UserMentionData = {\n kind: \"user\",\n id: attrs.id,\n };\n\n return (\n <UserMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {\n const mention: GroupMentionData = {\n kind: \"group\",\n id: attrs.id,\n userIds: deserializeGroupUserIds(attrs.userIds),\n };\n\n return (\n <GroupMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n\n return null;\n};\n"],"names":[],"mappings":";;;;;;AAwBA,MAAM,WAAc,GAAA,CAAC,EAAE,UAAA,EAAY,SAA4B,KAAA;AAE7D,EACE,uBAAA,IAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,EAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAA,iBAAA,EAAA,CAAA;AAAA,wBACtD,GAAA,CAAA,IAAA,EAAA,EAAK,MAAQ,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC5B,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CAAC,EAAE,UAAA,EAAY,SAAiC,KAAA;AACnE,EACE,uBAAA,IAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,EAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAA,iBAAA,EAAA,CAAA;AAAA,wBACtD,GAAA,CAAA,KAAA,EAAA,EAAM,OAAS,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC9B,CAAA;AAEJ,CAAA,CAAA;AAEA,SAAS,wBACP,OACsB,EAAA;AACtB,EAAI,IAAA,OAAO,YAAY,QAAU,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA;AACF,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAExC,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACD,CAAA,MAAA;AACN,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEO,MAAM,UAAU,CAAC,EAAE,IAAM,EAAA,QAAA,EAAU,YAAsD,KAAA;AAC9F,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA;AAEnB,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAAS,uBAAyB,EAAA;AAC9C,IAAA,MAAM,OAA2B,GAAA;AAAA,MAC/B,IAAM,EAAA,MAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,KACZ,CAAA;AAEA,IACE,uBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AACA,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAAS,6BAA+B,EAAA;AACpD,IAAA,MAAM,OAA4B,GAAA;AAAA,MAChC,IAAM,EAAA,OAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,MACV,OAAA,EAAS,uBAAwB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,KAChD,CAAA;AAEA,IACE,uBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
@@ -140,6 +140,7 @@ const MentionExtension = core$1.Extension.create({
140
140
  },
141
141
  allowSpaces: true,
142
142
  items: () => [],
143
+ // we'll let the mentions list component do this
143
144
  render: () => {
144
145
  let component;
145
146
  return {