@liveblocks/react-tiptap 3.9.2 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/LiveblocksExtension.cjs +4 -4
  2. package/dist/LiveblocksExtension.cjs.map +1 -1
  3. package/dist/LiveblocksExtension.js +4 -4
  4. package/dist/LiveblocksExtension.js.map +1 -1
  5. package/dist/ai/AiExtension.cjs.map +1 -1
  6. package/dist/ai/AiExtension.js.map +1 -1
  7. package/dist/ai/AiToolbar.cjs.map +1 -1
  8. package/dist/ai/AiToolbar.js.map +1 -1
  9. package/dist/comments/AnchoredThreads.cjs +1 -1
  10. package/dist/comments/AnchoredThreads.cjs.map +1 -1
  11. package/dist/comments/AnchoredThreads.js +1 -1
  12. package/dist/comments/AnchoredThreads.js.map +1 -1
  13. package/dist/comments/CommentsExtension.cjs +0 -3
  14. package/dist/comments/CommentsExtension.cjs.map +1 -1
  15. package/dist/comments/CommentsExtension.js +0 -3
  16. package/dist/comments/CommentsExtension.js.map +1 -1
  17. package/dist/comments/FloatingComposer.cjs +7 -3
  18. package/dist/comments/FloatingComposer.cjs.map +1 -1
  19. package/dist/comments/FloatingComposer.js +7 -3
  20. package/dist/comments/FloatingComposer.js.map +1 -1
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +165 -4
  23. package/dist/index.d.ts +165 -4
  24. package/dist/index.js.map +1 -1
  25. package/dist/mentions/GroupMentionNode.cjs.map +1 -1
  26. package/dist/mentions/GroupMentionNode.js.map +1 -1
  27. package/dist/mentions/Mention.cjs +37 -46
  28. package/dist/mentions/Mention.cjs.map +1 -1
  29. package/dist/mentions/Mention.js +36 -45
  30. package/dist/mentions/Mention.js.map +1 -1
  31. package/dist/mentions/MentionNode.cjs.map +1 -1
  32. package/dist/mentions/MentionNode.js.map +1 -1
  33. package/dist/types.cjs.map +1 -1
  34. package/dist/types.js.map +1 -1
  35. package/dist/version-history/HistoryVersionPreview.cjs +1 -0
  36. package/dist/version-history/HistoryVersionPreview.cjs.map +1 -1
  37. package/dist/version-history/HistoryVersionPreview.js +1 -0
  38. package/dist/version-history/HistoryVersionPreview.js.map +1 -1
  39. package/dist/version.cjs +1 -1
  40. package/dist/version.cjs.map +1 -1
  41. package/dist/version.js +1 -1
  42. package/dist/version.js.map +1 -1
  43. package/package.json +14 -14
  44. package/src/styles/index.css +3 -2
  45. package/styles.css +1 -1
  46. 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;
@@ -459,9 +590,39 @@ interface HistoryVersionPreviewProps extends ComponentPropsWithoutRef<"div"> {
459
590
  declare const HistoryVersionPreview: react.ForwardRefExoticComponent<HistoryVersionPreviewProps & react.RefAttributes<HTMLDivElement>>;
460
591
 
461
592
  declare module "@tiptap/core" {
593
+ interface Storage {
594
+ liveblocksAi: AiExtensionStorage;
595
+ liveblocksExtension: LiveblocksExtensionStorage;
596
+ liveblocksComments: CommentsExtensionStorage;
597
+ }
462
598
  interface Commands<ReturnType> {
463
599
  liveblocksComments: CommentsCommands<ReturnType>;
464
600
  liveblocksAi: AiCommands<ReturnType>;
601
+ collaborationCaret: {
602
+ /**
603
+ * Update details of the current user
604
+ * @example editor.commands.updateUser({ name: 'John Doe', color: '#305500' })
605
+ */
606
+ updateUser: (attributes: Record<string, any>) => ReturnType;
607
+ /**
608
+ * Update details of the current user
609
+ *
610
+ * @deprecated The "user" command is deprecated. Please use "updateUser" instead. Read more: https://tiptap.dev/api/extensions/collaboration-caret
611
+ */
612
+ user: (attributes: Record<string, any>) => ReturnType;
613
+ };
614
+ collaboration: {
615
+ /**
616
+ * Undo recent changes
617
+ * @example editor.commands.undo()
618
+ */
619
+ undo: () => ReturnType;
620
+ /**
621
+ * Reapply reverted changes
622
+ * @example editor.commands.redo()
623
+ */
624
+ redo: () => ReturnType;
625
+ };
465
626
  }
466
627
  }
467
628
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { detectDupes } from \"@liveblocks/core\";\n\nimport type { AiCommands, CommentsCommands } from \"./types\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nexport type { AiToolbarProps } from \"./ai/AiToolbar\";\nexport { AiToolbar } from \"./ai/AiToolbar\";\nexport type { AnchoredThreadsProps } from \"./comments/AnchoredThreads\";\nexport { AnchoredThreads } from \"./comments/AnchoredThreads\";\nexport type { FloatingComposerProps } from \"./comments/FloatingComposer\";\nexport { FloatingComposer } from \"./comments/FloatingComposer\";\nexport type { FloatingThreadsProps } from \"./comments/FloatingThreads\";\nexport { FloatingThreads } from \"./comments/FloatingThreads\";\nexport { useLiveblocksExtension } from \"./LiveblocksExtension\";\nexport { useIsEditorReady } from \"./LiveblocksExtension\";\nexport { GroupMentionNode } from \"./mentions/GroupMentionNode\";\nexport { MentionExtension } from \"./mentions/MentionExtension\";\nexport { MentionNode } from \"./mentions/MentionNode\";\nexport type { FloatingToolbarProps } from \"./toolbar/FloatingToolbar\";\nexport { FloatingToolbar } from \"./toolbar/FloatingToolbar\";\nexport type {\n ToolbarBlockSelectorItem,\n ToolbarBlockSelectorProps,\n ToolbarButtonProps,\n ToolbarProps,\n ToolbarSeparatorProps,\n ToolbarToggleProps,\n} from \"./toolbar/Toolbar\";\nexport { Toolbar } from \"./toolbar/Toolbar\";\nexport type {\n AiConfiguration,\n ResolveContextualPromptArgs,\n ResolveContextualPromptResponse,\n} from \"./types\";\nexport type { HistoryVersionPreviewProps } from \"./version-history/HistoryVersionPreview\";\nexport { HistoryVersionPreview } from \"./version-history/HistoryVersionPreview\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n liveblocksComments: CommentsCommands<ReturnType>;\n liveblocksAi: AiCommands<ReturnType>;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAKA,WAAY,CAAA,QAAA,EAAU,aAAa,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { detectDupes } from \"@liveblocks/core\";\n\nimport type {\n AiCommands,\n AiExtensionStorage,\n CommentsCommands,\n CommentsExtensionStorage,\n LiveblocksExtensionStorage,\n} from \"./types\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nexport type { AiToolbarProps } from \"./ai/AiToolbar\";\nexport { AiToolbar } from \"./ai/AiToolbar\";\nexport type { AnchoredThreadsProps } from \"./comments/AnchoredThreads\";\nexport { AnchoredThreads } from \"./comments/AnchoredThreads\";\nexport type { FloatingComposerProps } from \"./comments/FloatingComposer\";\nexport { FloatingComposer } from \"./comments/FloatingComposer\";\nexport type { FloatingThreadsProps } from \"./comments/FloatingThreads\";\nexport { FloatingThreads } from \"./comments/FloatingThreads\";\nexport { useLiveblocksExtension } from \"./LiveblocksExtension\";\nexport { useIsEditorReady } from \"./LiveblocksExtension\";\nexport { GroupMentionNode } from \"./mentions/GroupMentionNode\";\nexport { MentionExtension } from \"./mentions/MentionExtension\";\nexport { MentionNode } from \"./mentions/MentionNode\";\nexport type { FloatingToolbarProps } from \"./toolbar/FloatingToolbar\";\nexport { FloatingToolbar } from \"./toolbar/FloatingToolbar\";\nexport type {\n ToolbarBlockSelectorItem,\n ToolbarBlockSelectorProps,\n ToolbarButtonProps,\n ToolbarProps,\n ToolbarSeparatorProps,\n ToolbarToggleProps,\n} from \"./toolbar/Toolbar\";\nexport { Toolbar } from \"./toolbar/Toolbar\";\nexport type {\n AiConfiguration,\n ResolveContextualPromptArgs,\n ResolveContextualPromptResponse,\n} from \"./types\";\nexport type { HistoryVersionPreviewProps } from \"./version-history/HistoryVersionPreview\";\nexport { HistoryVersionPreview } from \"./version-history/HistoryVersionPreview\";\n\ndeclare module \"@tiptap/core\" {\n interface Storage {\n liveblocksAi: AiExtensionStorage;\n liveblocksExtension: LiveblocksExtensionStorage;\n liveblocksComments: CommentsExtensionStorage;\n }\n\n interface Commands<ReturnType> {\n liveblocksComments: CommentsCommands<ReturnType>;\n liveblocksAi: AiCommands<ReturnType>;\n collaborationCaret: {\n /**\n * Update details of the current user\n * @example editor.commands.updateUser({ name: 'John Doe', color: '#305500' })\n */\n updateUser: (attributes: Record<string, any>) => ReturnType;\n /**\n * Update details of the current user\n *\n * @deprecated The \"user\" command is deprecated. Please use \"updateUser\" instead. Read more: https://tiptap.dev/api/extensions/collaboration-caret\n */\n user: (attributes: Record<string, any>) => ReturnType;\n };\n\n collaboration: {\n /**\n * Undo recent changes\n * @example editor.commands.undo()\n */\n undo: () => ReturnType;\n /**\n * Reapply reverted changes\n * @example editor.commands.redo()\n */\n redo: () => ReturnType;\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAWA,WAAY,CAAA,QAAA,EAAU,aAAa,UAAU,CAAA"}
@@ -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":";;;;;;;AAMa,MAAA,gBAAA,GAAmBA,UAAK,MAAqB,CAAA;AAAA,EACxD,IAAM,EAAAC,mCAAA;AAAA,EACN,KAAO,EAAA,QAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EAEN,QAAU,EAAA,GAAA;AAAA,EACV,SAAY,GAAA;AACV,IAAO,OAAA;AAAA,MACL;AAAA,QACE,GAAK,EAAA,0BAAA;AAAA,OACP;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAkB,EAAA;AAC7B,IAAA,OAAO,CAAC,0BAAA,EAA4BC,oBAAgB,CAAA,cAAc,CAAC,CAAA,CAAA;AAAA,GACrE;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAOC,4BAAsBC,eAAS,EAAA;AAAA,MACpC,oBAAsB,EAAA,MAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAgB,GAAA;AACd,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,QACtD,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,EAAI,EAAA;AAClB,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,WAAW,UAAW,CAAA,EAAA;AAAA;AAAA,WACxB,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,OAAS,EAAA;AAAA,QACP,OAAS,EAAA,KAAA,CAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAY,KAAA;AACtB,UAAM,MAAA,gBAAA,GAAmB,OAAQ,CAAA,YAAA,CAAa,eAAe,CAAA,CAAA;AAE7D,UAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,YAAO,OAAA,KAAA,CAAA,CAAA;AAAA,WACT;AAEA,UAAI,IAAA;AACF,YAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,gBAAgB,CAAA,CAAA;AAE3C,YAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAU,GAAA,KAAA,CAAA,CAAA;AAAA,WACpC,CAAA,MAAA;AACN,YAAO,OAAA,KAAA,CAAA,CAAA;AAAA,WACT;AAAA,SACF;AAAA,QACA,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,OAAW,IAAA,CAAC,MAAM,OAAQ,CAAA,UAAA,CAAW,OAAO,CAAG,EAAA;AAC7D,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,eAAiB,EAAA,IAAA,CAAK,SAAU,CAAA,UAAA,CAAW,OAAO,CAAA;AAAA,WACpD,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,sBAAsB,CAAA;AAAA,QACnE,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,cAAgB,EAAA;AAC9B,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,wBAAwB,UAAW,CAAA,cAAA;AAAA;AAAA,WACrC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EACA,oBAAuB,GAAA;AACrB,IAAO,OAAA;AAAA,MACL,SAAA,EAAW,MACT,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,QAAQ,CAAC,EAAE,EAAI,EAAA,KAAA,EAAY,KAAA;AAC9C,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,QAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,QAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAEA,QAAA,KAAA,CAAM,IAAI,YAAa,CAAA,MAAA,GAAS,GAAG,MAAQ,EAAA,CAAC,MAAM,GAAQ,KAAA;AACxD,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,IAAA,CAAK,IAAM,EAAA;AAChC,YAAY,SAAA,GAAA,IAAA,CAAA;AACZ,YAAA,EAAA,CAAG,UAAW,CAAA,EAAA,EAAI,GAAK,EAAA,GAAA,GAAM,KAAK,QAAQ,CAAA,CAAA;AAAA,WAC5C;AAAA,SACD,CAAA,CAAA;AAED,QAAO,OAAA,SAAA,CAAA;AAAA,OACR,CAAA;AAAA,KACL,CAAA;AAAA,GACF;AACF,CAAC;;;;"}
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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"}
@@ -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,48 +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(
13
- react$1.NodeViewWrapper,
14
- {
15
- className: _private.cn(
16
- "lb-root lb-mention lb-tiptap-mention",
17
- isSelected && "lb-mention-selected"
18
- ),
19
- as: "span",
20
- ref: forwardedRef,
21
- children: [
22
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
23
- /* @__PURE__ */ jsxRuntime.jsx(_private.User, { userId: mention.id })
24
- ]
25
- }
26
- );
27
- }
28
- );
29
- const GroupMention = react.forwardRef(
30
- ({ mention, isSelected }, forwardedRef) => {
31
- return /* @__PURE__ */ jsxRuntime.jsxs(
32
- react$1.NodeViewWrapper,
33
- {
34
- className: _private.cn(
35
- "lb-root lb-mention lb-tiptap-mention",
36
- isSelected && "lb-mention-selected"
37
- ),
38
- as: "span",
39
- ref: forwardedRef,
40
- children: [
41
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
42
- /* @__PURE__ */ jsxRuntime.jsx(_private.Group, { groupId: mention.id })
43
- ]
44
- }
45
- );
46
- }
47
- );
9
+ const UserMention = ({ isSelected, mention }) => {
10
+ return /* @__PURE__ */ jsxRuntime.jsxs(
11
+ react.NodeViewWrapper,
12
+ {
13
+ className: _private.cn(
14
+ "lb-root lb-mention lb-tiptap-mention",
15
+ isSelected && "lb-mention-selected"
16
+ ),
17
+ as: "span",
18
+ children: [
19
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
20
+ /* @__PURE__ */ jsxRuntime.jsx(_private.User, { userId: mention.id })
21
+ ]
22
+ }
23
+ );
24
+ };
25
+ const GroupMention = ({ isSelected, mention }) => {
26
+ return /* @__PURE__ */ jsxRuntime.jsxs(
27
+ react.NodeViewWrapper,
28
+ {
29
+ className: _private.cn(
30
+ "lb-root lb-mention lb-tiptap-mention",
31
+ isSelected && "lb-mention-selected"
32
+ ),
33
+ as: "span",
34
+ children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
36
+ /* @__PURE__ */ jsxRuntime.jsx(_private.Group, { groupId: mention.id })
37
+ ]
38
+ }
39
+ );
40
+ };
48
41
  function deserializeGroupUserIds(userIds) {
49
42
  if (typeof userIds !== "string") {
50
43
  return void 0;
@@ -59,7 +52,7 @@ function deserializeGroupUserIds(userIds) {
59
52
  return void 0;
60
53
  }
61
54
  }
62
- const Mention = react.forwardRef(({ node, selected: isSelected }, forwardedRef) => {
55
+ const Mention = ({ node, selected: isSelected }) => {
63
56
  const attrs = node.attrs;
64
57
  if (node.type.name === types.LIVEBLOCKS_MENTION_TYPE) {
65
58
  const mention = {
@@ -70,8 +63,7 @@ const Mention = react.forwardRef(({ node, selected: isSelected }, forwardedRef)
70
63
  UserMention,
71
64
  {
72
65
  mention,
73
- isSelected,
74
- ref: forwardedRef
66
+ isSelected
75
67
  }
76
68
  );
77
69
  }
@@ -85,13 +77,12 @@ const Mention = react.forwardRef(({ node, selected: isSelected }, forwardedRef)
85
77
  GroupMention,
86
78
  {
87
79
  mention,
88
- isSelected,
89
- ref: forwardedRef
80
+ isSelected
90
81
  }
91
82
  );
92
83
  }
93
84
  return null;
94
- });
85
+ };
95
86
 
96
87
  exports.Mention = Mention;
97
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":"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"}
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,47 +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(
11
- NodeViewWrapper,
12
- {
13
- className: cn(
14
- "lb-root lb-mention lb-tiptap-mention",
15
- isSelected && "lb-mention-selected"
16
- ),
17
- as: "span",
18
- ref: forwardedRef,
19
- children: [
20
- /* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
21
- /* @__PURE__ */ jsx(User, { userId: mention.id })
22
- ]
23
- }
24
- );
25
- }
26
- );
27
- const GroupMention = forwardRef(
28
- ({ mention, isSelected }, forwardedRef) => {
29
- return /* @__PURE__ */ jsxs(
30
- NodeViewWrapper,
31
- {
32
- className: cn(
33
- "lb-root lb-mention lb-tiptap-mention",
34
- isSelected && "lb-mention-selected"
35
- ),
36
- as: "span",
37
- ref: forwardedRef,
38
- children: [
39
- /* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
40
- /* @__PURE__ */ jsx(Group, { groupId: mention.id })
41
- ]
42
- }
43
- );
44
- }
45
- );
7
+ const UserMention = ({ isSelected, mention }) => {
8
+ return /* @__PURE__ */ jsxs(
9
+ NodeViewWrapper,
10
+ {
11
+ className: cn(
12
+ "lb-root lb-mention lb-tiptap-mention",
13
+ isSelected && "lb-mention-selected"
14
+ ),
15
+ as: "span",
16
+ children: [
17
+ /* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
18
+ /* @__PURE__ */ jsx(User, { userId: mention.id })
19
+ ]
20
+ }
21
+ );
22
+ };
23
+ const GroupMention = ({ isSelected, mention }) => {
24
+ return /* @__PURE__ */ jsxs(
25
+ NodeViewWrapper,
26
+ {
27
+ className: cn(
28
+ "lb-root lb-mention lb-tiptap-mention",
29
+ isSelected && "lb-mention-selected"
30
+ ),
31
+ as: "span",
32
+ children: [
33
+ /* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
34
+ /* @__PURE__ */ jsx(Group, { groupId: mention.id })
35
+ ]
36
+ }
37
+ );
38
+ };
46
39
  function deserializeGroupUserIds(userIds) {
47
40
  if (typeof userIds !== "string") {
48
41
  return void 0;
@@ -57,7 +50,7 @@ function deserializeGroupUserIds(userIds) {
57
50
  return void 0;
58
51
  }
59
52
  }
60
- const Mention = forwardRef(({ node, selected: isSelected }, forwardedRef) => {
53
+ const Mention = ({ node, selected: isSelected }) => {
61
54
  const attrs = node.attrs;
62
55
  if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {
63
56
  const mention = {
@@ -68,8 +61,7 @@ const Mention = forwardRef(({ node, selected: isSelected }, forwardedRef) => {
68
61
  UserMention,
69
62
  {
70
63
  mention,
71
- isSelected,
72
- ref: forwardedRef
64
+ isSelected
73
65
  }
74
66
  );
75
67
  }
@@ -83,13 +75,12 @@ const Mention = forwardRef(({ node, selected: isSelected }, forwardedRef) => {
83
75
  GroupMention,
84
76
  {
85
77
  mention,
86
- isSelected,
87
- ref: forwardedRef
78
+ isSelected
88
79
  }
89
80
  );
90
81
  }
91
82
  return null;
92
- });
83
+ };
93
84
 
94
85
  export { Mention };
95
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;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MentionNode.cjs","sources":["../../src/mentions/MentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const MentionNode = Node.create<never, never>({\n name: LIVEBLOCKS_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-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-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 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_MENTION_TYPE","mergeAttributes","ReactNodeViewRenderer","Mention"],"mappings":";;;;;;;AAMa,MAAA,WAAA,GAAcA,UAAK,MAAqB,CAAA;AAAA,EACnD,IAAM,EAAAC,6BAAA;AAAA,EACN,KAAO,EAAA,QAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EAEN,QAAU,EAAA,GAAA;AAAA,EACV,SAAY,GAAA;AACV,IAAO,OAAA;AAAA,MACL;AAAA,QACE,GAAK,EAAA,oBAAA;AAAA,OACP;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAkB,EAAA;AAC7B,IAAA,OAAO,CAAC,oBAAA,EAAsBC,oBAAgB,CAAA,cAAc,CAAC,CAAA,CAAA;AAAA,GAC/D;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAOC,4BAAsBC,eAAS,EAAA;AAAA,MACpC,oBAAsB,EAAA,MAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAgB,GAAA;AACd,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,QACtD,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,EAAI,EAAA;AAClB,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,WAAW,UAAW,CAAA,EAAA;AAAA;AAAA,WACxB,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,sBAAsB,CAAA;AAAA,QACnE,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,cAAgB,EAAA;AAC9B,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,wBAAwB,UAAW,CAAA,cAAA;AAAA;AAAA,WACrC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EACA,oBAAuB,GAAA;AACrB,IAAO,OAAA;AAAA,MACL,SAAA,EAAW,MACT,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,QAAQ,CAAC,EAAE,EAAI,EAAA,KAAA,EAAY,KAAA;AAC9C,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,QAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,QAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAEA,QAAA,KAAA,CAAM,IAAI,YAAa,CAAA,MAAA,GAAS,GAAG,MAAQ,EAAA,CAAC,MAAM,GAAQ,KAAA;AACxD,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,IAAA,CAAK,IAAM,EAAA;AAChC,YAAY,SAAA,GAAA,IAAA,CAAA;AACZ,YAAA,EAAA,CAAG,UAAW,CAAA,EAAA,EAAI,GAAK,EAAA,GAAA,GAAM,KAAK,QAAQ,CAAA,CAAA;AAAA,WAC5C;AAAA,SACD,CAAA,CAAA;AAED,QAAO,OAAA,SAAA,CAAA;AAAA,OACR,CAAA;AAAA,KACL,CAAA;AAAA,GACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"MentionNode.cjs","sources":["../../src/mentions/MentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const MentionNode = Node.create({\n name: LIVEBLOCKS_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-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-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 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_MENTION_TYPE","mergeAttributes","ReactNodeViewRenderer","Mention"],"mappings":";;;;;;;AAMa,MAAA,WAAA,GAAcA,UAAK,MAAO,CAAA;AAAA,EACrC,IAAM,EAAAC,6BAAA;AAAA,EACN,KAAO,EAAA,QAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EAEN,QAAU,EAAA,GAAA;AAAA,EACV,SAAY,GAAA;AACV,IAAO,OAAA;AAAA,MACL;AAAA,QACE,GAAK,EAAA,oBAAA;AAAA,OACP;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAkB,EAAA;AAC7B,IAAA,OAAO,CAAC,oBAAA,EAAsBC,oBAAgB,CAAA,cAAc,CAAC,CAAA,CAAA;AAAA,GAC/D;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAOC,4BAAsBC,eAAS,EAAA;AAAA,MACpC,oBAAsB,EAAA,MAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAgB,GAAA;AACd,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,QACtD,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,EAAI,EAAA;AAClB,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,WAAW,UAAW,CAAA,EAAA;AAAA;AAAA,WACxB,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,sBAAsB,CAAA;AAAA,QACnE,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,cAAgB,EAAA;AAC9B,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,wBAAwB,UAAW,CAAA,cAAA;AAAA;AAAA,WACrC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EACA,oBAAuB,GAAA;AACrB,IAAO,OAAA;AAAA,MACL,SAAA,EAAW,MACT,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,QAAQ,CAAC,EAAE,EAAI,EAAA,KAAA,EAAY,KAAA;AAC9C,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,QAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,QAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAEA,QAAA,KAAA,CAAM,IAAI,YAAa,CAAA,MAAA,GAAS,GAAG,MAAQ,EAAA,CAAC,MAAM,GAAQ,KAAA;AACxD,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,IAAA,CAAK,IAAM,EAAA;AAChC,YAAY,SAAA,GAAA,IAAA,CAAA;AACZ,YAAA,EAAA,CAAG,UAAW,CAAA,EAAA,EAAI,GAAK,EAAA,GAAA,GAAM,KAAK,QAAQ,CAAA,CAAA;AAAA,WAC5C;AAAA,SACD,CAAA,CAAA;AAED,QAAO,OAAA,SAAA,CAAA;AAAA,OACR,CAAA;AAAA,KACL,CAAA;AAAA,GACF;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MentionNode.js","sources":["../../src/mentions/MentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const MentionNode = Node.create<never, never>({\n name: LIVEBLOCKS_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-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-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 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":";;;;;AAMa,MAAA,WAAA,GAAc,KAAK,MAAqB,CAAA;AAAA,EACnD,IAAM,EAAA,uBAAA;AAAA,EACN,KAAO,EAAA,QAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EAEN,QAAU,EAAA,GAAA;AAAA,EACV,SAAY,GAAA;AACV,IAAO,OAAA;AAAA,MACL;AAAA,QACE,GAAK,EAAA,oBAAA;AAAA,OACP;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAkB,EAAA;AAC7B,IAAA,OAAO,CAAC,oBAAA,EAAsB,eAAgB,CAAA,cAAc,CAAC,CAAA,CAAA;AAAA,GAC/D;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAO,sBAAsB,OAAS,EAAA;AAAA,MACpC,oBAAsB,EAAA,MAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAgB,GAAA;AACd,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,QACtD,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,EAAI,EAAA;AAClB,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,WAAW,UAAW,CAAA,EAAA;AAAA;AAAA,WACxB,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,sBAAsB,CAAA;AAAA,QACnE,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,cAAgB,EAAA;AAC9B,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,wBAAwB,UAAW,CAAA,cAAA;AAAA;AAAA,WACrC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EACA,oBAAuB,GAAA;AACrB,IAAO,OAAA;AAAA,MACL,SAAA,EAAW,MACT,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,QAAQ,CAAC,EAAE,EAAI,EAAA,KAAA,EAAY,KAAA;AAC9C,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,QAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,QAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAEA,QAAA,KAAA,CAAM,IAAI,YAAa,CAAA,MAAA,GAAS,GAAG,MAAQ,EAAA,CAAC,MAAM,GAAQ,KAAA;AACxD,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,IAAA,CAAK,IAAM,EAAA;AAChC,YAAY,SAAA,GAAA,IAAA,CAAA;AACZ,YAAA,EAAA,CAAG,UAAW,CAAA,EAAA,EAAI,GAAK,EAAA,GAAA,GAAM,KAAK,QAAQ,CAAA,CAAA;AAAA,WAC5C;AAAA,SACD,CAAA,CAAA;AAED,QAAO,OAAA,SAAA,CAAA;AAAA,OACR,CAAA;AAAA,KACL,CAAA;AAAA,GACF;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"MentionNode.js","sources":["../../src/mentions/MentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const MentionNode = Node.create({\n name: LIVEBLOCKS_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-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-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 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":";;;;;AAMa,MAAA,WAAA,GAAc,KAAK,MAAO,CAAA;AAAA,EACrC,IAAM,EAAA,uBAAA;AAAA,EACN,KAAO,EAAA,QAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EAEN,QAAU,EAAA,GAAA;AAAA,EACV,SAAY,GAAA;AACV,IAAO,OAAA;AAAA,MACL;AAAA,QACE,GAAK,EAAA,oBAAA;AAAA,OACP;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAkB,EAAA;AAC7B,IAAA,OAAO,CAAC,oBAAA,EAAsB,eAAgB,CAAA,cAAc,CAAC,CAAA,CAAA;AAAA,GAC/D;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAO,sBAAsB,OAAS,EAAA;AAAA,MACpC,oBAAsB,EAAA,MAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAgB,GAAA;AACd,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,QACtD,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,EAAI,EAAA;AAClB,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,WAAW,UAAW,CAAA,EAAA;AAAA;AAAA,WACxB,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,sBAAsB,CAAA;AAAA,QACnE,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,cAAgB,EAAA;AAC9B,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,wBAAwB,UAAW,CAAA,cAAA;AAAA;AAAA,WACrC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EACA,oBAAuB,GAAA;AACrB,IAAO,OAAA;AAAA,MACL,SAAA,EAAW,MACT,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,QAAQ,CAAC,EAAE,EAAI,EAAA,KAAA,EAAY,KAAA;AAC9C,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,QAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,QAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAEA,QAAA,KAAA,CAAM,IAAI,YAAa,CAAA,MAAA,GAAS,GAAG,MAAQ,EAAA,CAAC,MAAM,GAAQ,KAAA;AACxD,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,IAAA,CAAK,IAAM,EAAA;AAChC,YAAY,SAAA,GAAA,IAAA,CAAA;AACZ,YAAA,EAAA,CAAG,UAAW,CAAA,EAAA,EAAI,GAAK,EAAA,GAAA,GAAM,KAAK,QAAQ,CAAA,CAAA;AAAA,WAC5C;AAAA,SACD,CAAA,CAAA;AAED,QAAO,OAAA,SAAA,CAAA;AAAA,OACR,CAAA;AAAA,KACL,CAAA;AAAA,GACF;AACF,CAAC;;;;"}