@liveblocks/react-tiptap 2.14.0-v2encoding → 2.15.0-debug1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/LiveblocksExtension.js +12 -13
- package/dist/LiveblocksExtension.js.map +1 -1
- package/dist/LiveblocksExtension.mjs +3 -4
- package/dist/LiveblocksExtension.mjs.map +1 -1
- package/dist/comments/AnchoredThreads.js +54 -52
- package/dist/comments/AnchoredThreads.js.map +1 -1
- package/dist/comments/AnchoredThreads.mjs +39 -37
- package/dist/comments/AnchoredThreads.mjs.map +1 -1
- package/dist/comments/FloatingComposer.js +24 -22
- package/dist/comments/FloatingComposer.js.map +1 -1
- package/dist/comments/FloatingComposer.mjs +14 -12
- package/dist/comments/FloatingComposer.mjs.map +1 -1
- package/dist/comments/FloatingThreads.js +23 -21
- package/dist/comments/FloatingThreads.js.map +1 -1
- package/dist/comments/FloatingThreads.mjs +16 -14
- package/dist/comments/FloatingThreads.mjs.map +1 -1
- package/dist/index.d.mts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/mentions/Avatar.js +24 -17
- package/dist/mentions/Avatar.js.map +1 -1
- package/dist/mentions/Avatar.mjs +21 -14
- package/dist/mentions/Avatar.mjs.map +1 -1
- package/dist/mentions/Mention.js +13 -8
- package/dist/mentions/Mention.js.map +1 -1
- package/dist/mentions/Mention.mjs +11 -6
- package/dist/mentions/Mention.mjs.map +1 -1
- package/dist/mentions/MentionsList.js +38 -31
- package/dist/mentions/MentionsList.js.map +1 -1
- package/dist/mentions/MentionsList.mjs +29 -22
- package/dist/mentions/MentionsList.mjs.map +1 -1
- package/dist/version-history/HistoryVersionPreview.js +64 -46
- package/dist/version-history/HistoryVersionPreview.js.map +1 -1
- package/dist/version-history/HistoryVersionPreview.mjs +57 -39
- package/dist/version-history/HistoryVersionPreview.mjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/version.mjs.map +1 -1
- package/package.json +8 -10
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
1
2
|
import { useFloating, flip, offset, hide, shift, limitShift, size, autoUpdate } from '@floating-ui/react-dom';
|
|
2
3
|
import { Thread } from '@liveblocks/react-ui';
|
|
3
4
|
import { useEditorState } from '@tiptap/react';
|
|
4
|
-
import
|
|
5
|
+
import { useState, useEffect, useCallback, useLayoutEffect } from 'react';
|
|
5
6
|
import { createPortal } from 'react-dom';
|
|
6
7
|
import { classNames } from '../classnames.mjs';
|
|
7
8
|
import { THREADS_PLUGIN_KEY } from '../types.mjs';
|
|
@@ -53,18 +54,18 @@ function FloatingThreads({
|
|
|
53
54
|
}, [activeThread, editor]);
|
|
54
55
|
if (!activeThread || !editor || activeThread.resolved)
|
|
55
56
|
return null;
|
|
56
|
-
return /* @__PURE__ */
|
|
57
|
+
return /* @__PURE__ */ jsx(FloatingThreadPortal, {
|
|
57
58
|
thread: activeThread,
|
|
58
59
|
editor,
|
|
59
60
|
container: document.body,
|
|
60
|
-
...props
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
})
|
|
61
|
+
...props,
|
|
62
|
+
children: activeThread && /* @__PURE__ */ jsx(ThreadWrapper, {
|
|
63
|
+
thread: activeThread,
|
|
64
|
+
Thread: Thread$1,
|
|
65
|
+
onEscapeKeydown: handleEscapeKeydown,
|
|
66
|
+
className: "lb-tiptap-floating-threads-thread"
|
|
67
|
+
}, activeThread.id)
|
|
68
|
+
});
|
|
68
69
|
}
|
|
69
70
|
const FLOATING_THREAD_COLLISION_PADDING = 10;
|
|
70
71
|
function FloatingThreadPortal({
|
|
@@ -126,7 +127,7 @@ function FloatingThreadPortal({
|
|
|
126
127
|
}, [editor, updateRef]);
|
|
127
128
|
useLayoutEffect(updateRef, [updateRef]);
|
|
128
129
|
return createPortal(
|
|
129
|
-
/* @__PURE__ */
|
|
130
|
+
/* @__PURE__ */ jsx("div", {
|
|
130
131
|
ref: setFloating,
|
|
131
132
|
...props,
|
|
132
133
|
style: {
|
|
@@ -140,8 +141,9 @@ function FloatingThreadPortal({
|
|
|
140
141
|
className: classNames(
|
|
141
142
|
"lb-root lb-portal lb-elevation lb-tiptap-floating lb-tiptap-floating-threads",
|
|
142
143
|
className
|
|
143
|
-
)
|
|
144
|
-
|
|
144
|
+
),
|
|
145
|
+
children
|
|
146
|
+
}),
|
|
145
147
|
container
|
|
146
148
|
);
|
|
147
149
|
}
|
|
@@ -161,7 +163,7 @@ function ThreadWrapper({
|
|
|
161
163
|
},
|
|
162
164
|
[onEscapeKeydown, onKeyDown]
|
|
163
165
|
);
|
|
164
|
-
return /* @__PURE__ */
|
|
166
|
+
return /* @__PURE__ */ jsx(Thread, {
|
|
165
167
|
thread,
|
|
166
168
|
onKeyDown: handleKeyDown,
|
|
167
169
|
...threadProps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingThreads.mjs","sources":["../../src/comments/FloatingThreads.tsx"],"sourcesContent":["\nimport {\n autoUpdate,\n flip,\n hide,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type { BaseMetadata, DM, ThreadData } from \"@liveblocks/core\";\nimport {\n Thread as DefaultThread,\n type ThreadProps,\n} from \"@liveblocks/react-ui\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport React, {\n type ComponentType,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { classNames } from \"../classnames\";\nimport { THREADS_PLUGIN_KEY } from \"../types\";\n\ntype ThreadPanelComponents = {\n Thread: ComponentType<ThreadProps>;\n};\n\nexport interface FloatingThreadsProps<M extends BaseMetadata = DM>\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * The threads to display.\n */\n threads: ThreadData<M>[];\n\n /**\n * Override the component's components.\n */\n components?: Partial<ThreadPanelComponents>;\n\n /**\n * The tiptap editor\n */\n editor: Editor | null;\n}\n\nexport function FloatingThreads({\n threads,\n components,\n editor,\n ...props\n}: FloatingThreadsProps) {\n\n const Thread = components?.Thread ?? DefaultThread;\n\n const { pluginState } = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx?.editor?.state) return { pluginState: undefined };\n const state = THREADS_PLUGIN_KEY.getState(ctx.editor.state);\n return {\n pluginState: state,\n };\n },\n equalityFn: (prev, next) => {\n if (!prev || !next) return false;\n return prev.pluginState?.selectedThreadPos === next.pluginState?.selectedThreadPos &&\n prev.pluginState?.selectedThreadId === next.pluginState?.selectedThreadId;\n },\n }) ?? { pluginState: undefined };\n\n const [activeThread, setActiveThread] = useState<ThreadData | null>(null);\n\n\n useEffect(() => {\n if (!editor || !pluginState) {\n setActiveThread(null);\n return;\n }\n const { selectedThreadId, selectedThreadPos } = pluginState;\n if (selectedThreadId === null || selectedThreadPos === null) {\n setActiveThread(null);\n return;\n }\n const active = (threads ?? []).find((thread) =>\n selectedThreadId === thread.id\n );\n setActiveThread(active ?? null);\n }, [editor, pluginState, threads]);\n\n const handleEscapeKeydown = useCallback((): boolean => {\n if (!editor || activeThread === null) return false;\n editor.commands.selectThread(null);\n return true;\n }, [activeThread, editor]);\n\n if (!activeThread || !editor || activeThread.resolved) return null;\n\n return (\n <FloatingThreadPortal\n thread={activeThread}\n editor={editor}\n container={document.body}\n {...props}\n >\n {activeThread &&\n <ThreadWrapper\n key={activeThread.id}\n thread={activeThread}\n Thread={Thread}\n onEscapeKeydown={handleEscapeKeydown}\n className=\"lb-tiptap-floating-threads-thread\"\n />\n }\n </FloatingThreadPortal>\n );\n}\n\ninterface FloatingThreadPortalProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n thread: ThreadData;\n editor: Editor;\n container: HTMLElement;\n children: ReactNode;\n}\n\nexport const FLOATING_THREAD_COLLISION_PADDING = 10;\n\nfunction FloatingThreadPortal({\n container,\n editor,\n thread,\n children,\n className,\n style,\n ...props\n}: FloatingThreadPortalProps) {\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n } = useFloating({\n strategy: \"absolute\",\n placement: \"bottom\",\n middleware: [\n flip({ padding: FLOATING_THREAD_COLLISION_PADDING, crossAxis: false }),\n offset(10),\n hide({ padding: FLOATING_THREAD_COLLISION_PADDING }),\n shift({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n limiter: limitShift(),\n }),\n size({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n });\n\n const updateRef = useCallback(() => {\n const el = editor.view.dom.querySelector(`[data-lb-thread-id=\"${thread.id}\"]`);\n if (el) {\n setReference(el);\n }\n }, [setReference, editor, thread.id]);\n\n // Remote cursor updates and other edits can cause the ref to break\n useEffect(() => {\n editor.on(\"transaction\", updateRef)\n return () => {\n editor.off(\"transaction\", updateRef);\n }\n }, [editor, updateRef]);\n\n useLayoutEffect(updateRef, [updateRef]);\n\n return createPortal(\n <div\n ref={setFloating}\n {...props}\n style={{\n ...style,\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,\n minWidth: \"max-content\",\n }}\n className={classNames(\n \"lb-root lb-portal lb-elevation lb-tiptap-floating lb-tiptap-floating-threads\",\n className\n )}\n >\n {children}\n </div>,\n container\n );\n}\n\ninterface ThreadWrapperProps extends ThreadProps {\n thread: ThreadData;\n Thread: ComponentType<ThreadProps>;\n onEscapeKeydown: () => void;\n}\n\nfunction ThreadWrapper({\n thread,\n Thread,\n onEscapeKeydown,\n onKeyDown,\n ...threadProps\n}: ThreadWrapperProps) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n // TODO: Add ability to preventDefault on keydown to override the default behavior, e.g. to show an alert dialog\n if (event.key === \"Escape\") {\n onEscapeKeydown();\n }\n },\n [onEscapeKeydown, onKeyDown]\n );\n\n return <Thread thread={thread} onKeyDown={handleKeyDown} {...threadProps} />;\n}\n\n"],"names":["Thread","DefaultThread"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FloatingThreads.mjs","sources":["../../src/comments/FloatingThreads.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n hide,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type { BaseMetadata, DM, ThreadData } from \"@liveblocks/core\";\nimport {\n Thread as DefaultThread,\n type ThreadProps,\n} from \"@liveblocks/react-ui\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport {\n type ComponentType,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { classNames } from \"../classnames\";\nimport { THREADS_PLUGIN_KEY } from \"../types\";\n\ntype ThreadPanelComponents = {\n Thread: ComponentType<ThreadProps>;\n};\n\nexport interface FloatingThreadsProps<M extends BaseMetadata = DM>\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * The threads to display.\n */\n threads: ThreadData<M>[];\n\n /**\n * Override the component's components.\n */\n components?: Partial<ThreadPanelComponents>;\n\n /**\n * The tiptap editor\n */\n editor: Editor | null;\n}\n\nexport function FloatingThreads({\n threads,\n components,\n editor,\n ...props\n}: FloatingThreadsProps) {\n const Thread = components?.Thread ?? DefaultThread;\n\n const { pluginState } = useEditorState({\n editor,\n selector: (ctx) => {\n if (!ctx?.editor?.state) return { pluginState: undefined };\n const state = THREADS_PLUGIN_KEY.getState(ctx.editor.state);\n return {\n pluginState: state,\n };\n },\n equalityFn: (prev, next) => {\n if (!prev || !next) return false;\n return prev.pluginState?.selectedThreadPos === next.pluginState?.selectedThreadPos &&\n prev.pluginState?.selectedThreadId === next.pluginState?.selectedThreadId;\n },\n }) ?? { pluginState: undefined };\n\n const [activeThread, setActiveThread] = useState<ThreadData | null>(null);\n\n useEffect(() => {\n if (!editor || !pluginState) {\n setActiveThread(null);\n return;\n }\n const { selectedThreadId, selectedThreadPos } = pluginState;\n if (selectedThreadId === null || selectedThreadPos === null) {\n setActiveThread(null);\n return;\n }\n const active = (threads ?? []).find((thread) =>\n selectedThreadId === thread.id\n );\n setActiveThread(active ?? null);\n }, [editor, pluginState, threads]);\n\n const handleEscapeKeydown = useCallback((): boolean => {\n if (!editor || activeThread === null) return false;\n editor.commands.selectThread(null);\n return true;\n }, [activeThread, editor]);\n\n if (!activeThread || !editor || activeThread.resolved) return null;\n\n return (\n <FloatingThreadPortal\n thread={activeThread}\n editor={editor}\n container={document.body}\n {...props}\n >\n {activeThread &&\n <ThreadWrapper\n key={activeThread.id}\n thread={activeThread}\n Thread={Thread}\n onEscapeKeydown={handleEscapeKeydown}\n className=\"lb-tiptap-floating-threads-thread\"\n />\n }\n </FloatingThreadPortal>\n );\n}\n\ninterface FloatingThreadPortalProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n thread: ThreadData;\n editor: Editor;\n container: HTMLElement;\n children: ReactNode;\n}\n\nexport const FLOATING_THREAD_COLLISION_PADDING = 10;\n\nfunction FloatingThreadPortal({\n container,\n editor,\n thread,\n children,\n className,\n style,\n ...props\n}: FloatingThreadPortalProps) {\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n } = useFloating({\n strategy: \"absolute\",\n placement: \"bottom\",\n middleware: [\n flip({ padding: FLOATING_THREAD_COLLISION_PADDING, crossAxis: false }),\n offset(10),\n hide({ padding: FLOATING_THREAD_COLLISION_PADDING }),\n shift({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n limiter: limitShift(),\n }),\n size({\n padding: FLOATING_THREAD_COLLISION_PADDING,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-floating-threads-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n });\n\n const updateRef = useCallback(() => {\n const el = editor.view.dom.querySelector(`[data-lb-thread-id=\"${thread.id}\"]`);\n if (el) {\n setReference(el);\n }\n }, [setReference, editor, thread.id]);\n\n // Remote cursor updates and other edits can cause the ref to break\n useEffect(() => {\n editor.on(\"transaction\", updateRef)\n return () => {\n editor.off(\"transaction\", updateRef);\n };\n }, [editor, updateRef]);\n\n useLayoutEffect(updateRef, [updateRef]);\n\n return createPortal(\n <div\n ref={setFloating}\n {...props}\n style={{\n ...style,\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,\n minWidth: \"max-content\",\n }}\n className={classNames(\n \"lb-root lb-portal lb-elevation lb-tiptap-floating lb-tiptap-floating-threads\",\n className\n )}\n >\n {children}\n </div>,\n container\n );\n}\n\ninterface ThreadWrapperProps extends ThreadProps {\n thread: ThreadData;\n Thread: ComponentType<ThreadProps>;\n onEscapeKeydown: () => void;\n}\n\nfunction ThreadWrapper({\n thread,\n Thread,\n onEscapeKeydown,\n onKeyDown,\n ...threadProps\n}: ThreadWrapperProps) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n // TODO: Add ability to preventDefault on keydown to override the default behavior, e.g. to show an alert dialog\n if (event.key === \"Escape\") {\n onEscapeKeydown();\n }\n },\n [onEscapeKeydown, onKeyDown]\n );\n\n return <Thread thread={thread} onKeyDown={handleKeyDown} {...threadProps} />;\n}\n"],"names":["Thread","DefaultThread"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
1
2
|
import { BaseMetadata, DM, ThreadData, HistoryVersion } from '@liveblocks/core';
|
|
2
3
|
import { ThreadProps, ComposerProps } from '@liveblocks/react-ui';
|
|
3
4
|
import { Editor } from '@tiptap/react';
|
|
4
|
-
import
|
|
5
|
+
import * as react from 'react';
|
|
6
|
+
import { ComponentPropsWithoutRef, ComponentType, HTMLAttributes } from 'react';
|
|
5
7
|
import { BaseMetadata as BaseMetadata$1 } from '@liveblocks/client';
|
|
6
8
|
import { Extension, Content } from '@tiptap/core';
|
|
7
9
|
|
|
@@ -22,11 +24,11 @@ interface AnchoredThreadsProps<M extends BaseMetadata = DM> extends Omit<Compone
|
|
|
22
24
|
*/
|
|
23
25
|
editor: Editor | null;
|
|
24
26
|
}
|
|
25
|
-
declare function AnchoredThreads({ threads, components, className, style, editor, ...props }: AnchoredThreadsProps):
|
|
27
|
+
declare function AnchoredThreads({ threads, components, className, style, editor, ...props }: AnchoredThreadsProps): react_jsx_runtime.JSX.Element | null;
|
|
26
28
|
|
|
27
|
-
declare const FloatingComposer:
|
|
29
|
+
declare const FloatingComposer: react.ForwardRefExoticComponent<Omit<ComposerProps<BaseMetadata$1>, "threadId" | "commentId"> & {
|
|
28
30
|
editor: Editor | null;
|
|
29
|
-
} &
|
|
31
|
+
} & react.RefAttributes<HTMLFormElement>>;
|
|
30
32
|
|
|
31
33
|
declare type ThreadPanelComponents = {
|
|
32
34
|
Thread: ComponentType<ThreadProps>;
|
|
@@ -45,7 +47,7 @@ interface FloatingThreadsProps<M extends BaseMetadata = DM> extends Omit<HTMLAtt
|
|
|
45
47
|
*/
|
|
46
48
|
editor: Editor | null;
|
|
47
49
|
}
|
|
48
|
-
declare function FloatingThreads({ threads, components, editor, ...props }: FloatingThreadsProps):
|
|
50
|
+
declare function FloatingThreads({ threads, components, editor, ...props }: FloatingThreadsProps): react_jsx_runtime.JSX.Element | null;
|
|
49
51
|
|
|
50
52
|
declare type LiveblocksExtensionOptions = {
|
|
51
53
|
field?: string;
|
|
@@ -73,7 +75,7 @@ interface HistoryVersionPreviewProps extends ComponentPropsWithoutRef<"div"> {
|
|
|
73
75
|
* @example
|
|
74
76
|
* <HistoryVersionPreview version={version} />
|
|
75
77
|
*/
|
|
76
|
-
declare const HistoryVersionPreview:
|
|
78
|
+
declare const HistoryVersionPreview: react.ForwardRefExoticComponent<HistoryVersionPreviewProps & react.RefAttributes<HTMLDivElement>>;
|
|
77
79
|
|
|
78
80
|
declare module "@tiptap/core" {
|
|
79
81
|
interface Commands<ReturnType> {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
1
2
|
import { BaseMetadata, DM, ThreadData, HistoryVersion } from '@liveblocks/core';
|
|
2
3
|
import { ThreadProps, ComposerProps } from '@liveblocks/react-ui';
|
|
3
4
|
import { Editor } from '@tiptap/react';
|
|
4
|
-
import
|
|
5
|
+
import * as react from 'react';
|
|
6
|
+
import { ComponentPropsWithoutRef, ComponentType, HTMLAttributes } from 'react';
|
|
5
7
|
import { BaseMetadata as BaseMetadata$1 } from '@liveblocks/client';
|
|
6
8
|
import { Extension, Content } from '@tiptap/core';
|
|
7
9
|
|
|
@@ -22,11 +24,11 @@ interface AnchoredThreadsProps<M extends BaseMetadata = DM> extends Omit<Compone
|
|
|
22
24
|
*/
|
|
23
25
|
editor: Editor | null;
|
|
24
26
|
}
|
|
25
|
-
declare function AnchoredThreads({ threads, components, className, style, editor, ...props }: AnchoredThreadsProps):
|
|
27
|
+
declare function AnchoredThreads({ threads, components, className, style, editor, ...props }: AnchoredThreadsProps): react_jsx_runtime.JSX.Element | null;
|
|
26
28
|
|
|
27
|
-
declare const FloatingComposer:
|
|
29
|
+
declare const FloatingComposer: react.ForwardRefExoticComponent<Omit<ComposerProps<BaseMetadata$1>, "threadId" | "commentId"> & {
|
|
28
30
|
editor: Editor | null;
|
|
29
|
-
} &
|
|
31
|
+
} & react.RefAttributes<HTMLFormElement>>;
|
|
30
32
|
|
|
31
33
|
declare type ThreadPanelComponents = {
|
|
32
34
|
Thread: ComponentType<ThreadProps>;
|
|
@@ -45,7 +47,7 @@ interface FloatingThreadsProps<M extends BaseMetadata = DM> extends Omit<HTMLAtt
|
|
|
45
47
|
*/
|
|
46
48
|
editor: Editor | null;
|
|
47
49
|
}
|
|
48
|
-
declare function FloatingThreads({ threads, components, editor, ...props }: FloatingThreadsProps):
|
|
50
|
+
declare function FloatingThreads({ threads, components, editor, ...props }: FloatingThreadsProps): react_jsx_runtime.JSX.Element | null;
|
|
49
51
|
|
|
50
52
|
declare type LiveblocksExtensionOptions = {
|
|
51
53
|
field?: string;
|
|
@@ -73,7 +75,7 @@ interface HistoryVersionPreviewProps extends ComponentPropsWithoutRef<"div"> {
|
|
|
73
75
|
* @example
|
|
74
76
|
* <HistoryVersionPreview version={version} />
|
|
75
77
|
*/
|
|
76
|
-
declare const HistoryVersionPreview:
|
|
78
|
+
declare const HistoryVersionPreview: react.ForwardRefExoticComponent<HistoryVersionPreviewProps & react.RefAttributes<HTMLDivElement>>;
|
|
77
79
|
|
|
78
80
|
declare module "@tiptap/core" {
|
|
79
81
|
interface Commands<ReturnType> {
|
package/dist/mentions/Avatar.js
CHANGED
|
@@ -1,43 +1,50 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react$1 = require('@liveblocks/react');
|
|
5
|
+
var react = require('react');
|
|
5
6
|
var classnames = require('../classnames.js');
|
|
6
7
|
|
|
7
|
-
const Avatar =
|
|
8
|
+
const Avatar = react.forwardRef(
|
|
8
9
|
function Avatar2(props, forwardedRef) {
|
|
9
10
|
const { userId, className, ...spanProps } = props;
|
|
10
|
-
const { user, isLoading } = react.useUser(userId);
|
|
11
|
+
const { user, isLoading } = react$1.useUser(userId);
|
|
11
12
|
const avatar = user ? user.avatar : void 0;
|
|
12
13
|
const name = user ? user.name : void 0;
|
|
13
14
|
function Initials() {
|
|
14
15
|
const initials = name ? getInitials(name) : void 0;
|
|
15
16
|
if (initials) {
|
|
16
|
-
return /* @__PURE__ */
|
|
17
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
17
18
|
"aria-hidden": true,
|
|
18
|
-
className: "lb-avatar-fallback"
|
|
19
|
-
|
|
19
|
+
className: "lb-avatar-fallback",
|
|
20
|
+
children: initials
|
|
21
|
+
});
|
|
20
22
|
}
|
|
21
23
|
if (isLoading)
|
|
22
24
|
return null;
|
|
23
25
|
if (user === void 0)
|
|
24
26
|
return null;
|
|
25
|
-
return /* @__PURE__ */
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
26
28
|
"aria-label": userId,
|
|
27
29
|
title: userId,
|
|
28
|
-
className: "lb-avatar-fallback"
|
|
29
|
-
|
|
30
|
+
className: "lb-avatar-fallback",
|
|
31
|
+
children: getInitials(userId)
|
|
32
|
+
});
|
|
30
33
|
}
|
|
31
|
-
return /* @__PURE__ */
|
|
34
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("span", {
|
|
32
35
|
"data-loading": isLoading ? "" : void 0,
|
|
33
36
|
...spanProps,
|
|
34
37
|
className: classnames.classNames("lb-avatar", className),
|
|
35
|
-
ref: forwardedRef
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
ref: forwardedRef,
|
|
39
|
+
children: [
|
|
40
|
+
avatar && /* @__PURE__ */ jsxRuntime.jsx("img", {
|
|
41
|
+
src: avatar,
|
|
42
|
+
alt: name,
|
|
43
|
+
className: "lb-avatar-image"
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ jsxRuntime.jsx(Initials, {})
|
|
46
|
+
]
|
|
47
|
+
});
|
|
41
48
|
}
|
|
42
49
|
);
|
|
43
50
|
function getInitials(name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../src/mentions/Avatar.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../src/mentions/Avatar.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { classNames } from \"../classnames\";\n\nexport interface AvatarProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n userId: string;\n}\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n function Avatar(props, forwardedRef) {\n const { userId, className, ...spanProps } = props;\n\n const { user, isLoading } = useUser(userId);\n\n const avatar = user ? user.avatar : undefined;\n\n const name = user ? user.name : undefined;\n\n function Initials() {\n const initials = name ? getInitials(name) : undefined;\n if (initials) {\n return (\n <span aria-hidden className=\"lb-avatar-fallback\">\n {initials}\n </span>\n );\n }\n\n if (isLoading) return null;\n\n if (user === undefined) return null;\n\n return (\n <span aria-label={userId} title={userId} className=\"lb-avatar-fallback\">\n {getInitials(userId)}\n </span>\n );\n }\n\n return (\n <span\n data-loading={isLoading ? \"\" : undefined}\n {...spanProps}\n className={classNames(\"lb-avatar\", className)}\n ref={forwardedRef}\n >\n {avatar && <img src={avatar} alt={name} className=\"lb-avatar-image\" />}\n\n <Initials />\n </span>\n );\n }\n);\n\nfunction getInitials(name: string) {\n return name\n .trim()\n .split(\" \")\n .reduce((initials, name, index, array) => {\n if (index === 0 || index === array.length - 1) {\n initials += name.charAt(0).toLocaleUpperCase();\n }\n\n return initials;\n }, \"\");\n}\n"],"names":["forwardRef","Avatar","useUser","jsx","jsxs","classNames","name"],"mappings":";;;;;;;AAWO,MAAM,MAAS,GAAAA,gBAAA;AAAA,EACpB,SAASC,OAAO,CAAA,KAAA,EAAO,YAAc,EAAA;AACnC,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAc,EAAA,GAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AAE5C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAU,EAAA,GAAIC,gBAAQ,MAAM,CAAA,CAAA;AAE1C,IAAM,MAAA,MAAA,GAAS,IAAO,GAAA,IAAA,CAAK,MAAS,GAAA,KAAA,CAAA,CAAA;AAEpC,IAAM,MAAA,IAAA,GAAO,IAAO,GAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA,CAAA;AAEhC,IAAA,SAAS,QAAW,GAAA;AAClB,MAAA,MAAM,QAAW,GAAA,IAAA,GAAO,WAAY,CAAA,IAAI,CAAI,GAAA,KAAA,CAAA,CAAA;AAC5C,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,uBACGC,cAAA,CAAA,MAAA,EAAA;AAAA,UAAK,aAAW,EAAA,IAAA;AAAA,UAAC,SAAU,EAAA,oBAAA;AAAA,UACzB,QAAA,EAAA,QAAA;AAAA,SACH,CAAA,CAAA;AAAA,OAEJ;AAEA,MAAI,IAAA,SAAA;AAAW,QAAO,OAAA,IAAA,CAAA;AAEtB,MAAA,IAAI,IAAS,KAAA,KAAA,CAAA;AAAW,QAAO,OAAA,IAAA,CAAA;AAE/B,MAAA,uBACGA,cAAA,CAAA,MAAA,EAAA;AAAA,QAAK,YAAY,EAAA,MAAA;AAAA,QAAQ,KAAO,EAAA,MAAA;AAAA,QAAQ,SAAU,EAAA,oBAAA;AAAA,QAChD,sBAAY,MAAM,CAAA;AAAA,OACrB,CAAA,CAAA;AAAA,KAEJ;AAEA,IAAA,uBACGC,eAAA,CAAA,MAAA,EAAA;AAAA,MACC,cAAA,EAAc,YAAY,EAAK,GAAA,KAAA,CAAA;AAAA,MAC9B,GAAG,SAAA;AAAA,MACJ,SAAA,EAAWC,qBAAW,CAAA,WAAA,EAAa,SAAS,CAAA;AAAA,MAC5C,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QAAA,MAAA,oBAAWF,cAAA,CAAA,KAAA,EAAA;AAAA,UAAI,GAAK,EAAA,MAAA;AAAA,UAAQ,GAAK,EAAA,IAAA;AAAA,UAAM,SAAU,EAAA,iBAAA;AAAA,SAAkB,CAAA;AAAA,uCAEnE,QAAS,EAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KACZ,CAAA,CAAA;AAAA,GAEJ;AACF,EAAA;AAEA,SAAS,YAAY,IAAc,EAAA;AACjC,EAAO,OAAA,IAAA,CACJ,IAAK,EAAA,CACL,KAAM,CAAA,GAAG,CACT,CAAA,MAAA,CAAO,CAAC,QAAA,EAAUG,KAAM,EAAA,KAAA,EAAO,KAAU,KAAA;AACxC,IAAA,IAAI,KAAU,KAAA,CAAA,IAAK,KAAU,KAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AAC7C,MAAA,QAAA,IAAYA,KAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,iBAAkB,EAAA,CAAA;AAAA,KAC/C;AAEA,IAAO,OAAA,QAAA,CAAA;AAAA,KACN,EAAE,CAAA,CAAA;AACT;;;;"}
|
package/dist/mentions/Avatar.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
1
2
|
import { useUser } from '@liveblocks/react';
|
|
2
|
-
import
|
|
3
|
+
import { forwardRef } from 'react';
|
|
3
4
|
import { classNames } from '../classnames.mjs';
|
|
4
5
|
|
|
5
6
|
const Avatar = forwardRef(
|
|
@@ -11,31 +12,37 @@ const Avatar = forwardRef(
|
|
|
11
12
|
function Initials() {
|
|
12
13
|
const initials = name ? getInitials(name) : void 0;
|
|
13
14
|
if (initials) {
|
|
14
|
-
return /* @__PURE__ */
|
|
15
|
+
return /* @__PURE__ */ jsx("span", {
|
|
15
16
|
"aria-hidden": true,
|
|
16
|
-
className: "lb-avatar-fallback"
|
|
17
|
-
|
|
17
|
+
className: "lb-avatar-fallback",
|
|
18
|
+
children: initials
|
|
19
|
+
});
|
|
18
20
|
}
|
|
19
21
|
if (isLoading)
|
|
20
22
|
return null;
|
|
21
23
|
if (user === void 0)
|
|
22
24
|
return null;
|
|
23
|
-
return /* @__PURE__ */
|
|
25
|
+
return /* @__PURE__ */ jsx("span", {
|
|
24
26
|
"aria-label": userId,
|
|
25
27
|
title: userId,
|
|
26
|
-
className: "lb-avatar-fallback"
|
|
27
|
-
|
|
28
|
+
className: "lb-avatar-fallback",
|
|
29
|
+
children: getInitials(userId)
|
|
30
|
+
});
|
|
28
31
|
}
|
|
29
|
-
return /* @__PURE__ */
|
|
32
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
30
33
|
"data-loading": isLoading ? "" : void 0,
|
|
31
34
|
...spanProps,
|
|
32
35
|
className: classNames("lb-avatar", className),
|
|
33
|
-
ref: forwardedRef
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
ref: forwardedRef,
|
|
37
|
+
children: [
|
|
38
|
+
avatar && /* @__PURE__ */ jsx("img", {
|
|
39
|
+
src: avatar,
|
|
40
|
+
alt: name,
|
|
41
|
+
className: "lb-avatar-image"
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ jsx(Initials, {})
|
|
44
|
+
]
|
|
45
|
+
});
|
|
39
46
|
}
|
|
40
47
|
);
|
|
41
48
|
function getInitials(name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.mjs","sources":["../../src/mentions/Avatar.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport
|
|
1
|
+
{"version":3,"file":"Avatar.mjs","sources":["../../src/mentions/Avatar.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { classNames } from \"../classnames\";\n\nexport interface AvatarProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n userId: string;\n}\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n function Avatar(props, forwardedRef) {\n const { userId, className, ...spanProps } = props;\n\n const { user, isLoading } = useUser(userId);\n\n const avatar = user ? user.avatar : undefined;\n\n const name = user ? user.name : undefined;\n\n function Initials() {\n const initials = name ? getInitials(name) : undefined;\n if (initials) {\n return (\n <span aria-hidden className=\"lb-avatar-fallback\">\n {initials}\n </span>\n );\n }\n\n if (isLoading) return null;\n\n if (user === undefined) return null;\n\n return (\n <span aria-label={userId} title={userId} className=\"lb-avatar-fallback\">\n {getInitials(userId)}\n </span>\n );\n }\n\n return (\n <span\n data-loading={isLoading ? \"\" : undefined}\n {...spanProps}\n className={classNames(\"lb-avatar\", className)}\n ref={forwardedRef}\n >\n {avatar && <img src={avatar} alt={name} className=\"lb-avatar-image\" />}\n\n <Initials />\n </span>\n );\n }\n);\n\nfunction getInitials(name: string) {\n return name\n .trim()\n .split(\" \")\n .reduce((initials, name, index, array) => {\n if (index === 0 || index === array.length - 1) {\n initials += name.charAt(0).toLocaleUpperCase();\n }\n\n return initials;\n }, \"\");\n}\n"],"names":["Avatar","name"],"mappings":";;;;;AAWO,MAAM,MAAS,GAAA,UAAA;AAAA,EACpB,SAASA,OAAO,CAAA,KAAA,EAAO,YAAc,EAAA;AACnC,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAc,EAAA,GAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AAE5C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAU,EAAA,GAAI,QAAQ,MAAM,CAAA,CAAA;AAE1C,IAAM,MAAA,MAAA,GAAS,IAAO,GAAA,IAAA,CAAK,MAAS,GAAA,KAAA,CAAA,CAAA;AAEpC,IAAM,MAAA,IAAA,GAAO,IAAO,GAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA,CAAA;AAEhC,IAAA,SAAS,QAAW,GAAA;AAClB,MAAA,MAAM,QAAW,GAAA,IAAA,GAAO,WAAY,CAAA,IAAI,CAAI,GAAA,KAAA,CAAA,CAAA;AAC5C,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,UAAK,aAAW,EAAA,IAAA;AAAA,UAAC,SAAU,EAAA,oBAAA;AAAA,UACzB,QAAA,EAAA,QAAA;AAAA,SACH,CAAA,CAAA;AAAA,OAEJ;AAEA,MAAI,IAAA,SAAA;AAAW,QAAO,OAAA,IAAA,CAAA;AAEtB,MAAA,IAAI,IAAS,KAAA,KAAA,CAAA;AAAW,QAAO,OAAA,IAAA,CAAA;AAE/B,MAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,QAAK,YAAY,EAAA,MAAA;AAAA,QAAQ,KAAO,EAAA,MAAA;AAAA,QAAQ,SAAU,EAAA,oBAAA;AAAA,QAChD,sBAAY,MAAM,CAAA;AAAA,OACrB,CAAA,CAAA;AAAA,KAEJ;AAEA,IAAA,uBACG,IAAA,CAAA,MAAA,EAAA;AAAA,MACC,cAAA,EAAc,YAAY,EAAK,GAAA,KAAA,CAAA;AAAA,MAC9B,GAAG,SAAA;AAAA,MACJ,SAAA,EAAW,UAAW,CAAA,WAAA,EAAa,SAAS,CAAA;AAAA,MAC5C,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QAAA,MAAA,oBAAW,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,GAAK,EAAA,MAAA;AAAA,UAAQ,GAAK,EAAA,IAAA;AAAA,UAAM,SAAU,EAAA,iBAAA;AAAA,SAAkB,CAAA;AAAA,4BAEnE,QAAS,EAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KACZ,CAAA,CAAA;AAAA,GAEJ;AACF,EAAA;AAEA,SAAS,YAAY,IAAc,EAAA;AACjC,EAAO,OAAA,IAAA,CACJ,IAAK,EAAA,CACL,KAAM,CAAA,GAAG,CACT,CAAA,MAAA,CAAO,CAAC,QAAA,EAAUC,KAAM,EAAA,KAAA,EAAO,KAAU,KAAA;AACxC,IAAA,IAAI,KAAU,KAAA,CAAA,IAAK,KAAU,KAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AAC7C,MAAA,QAAA,IAAYA,KAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,iBAAkB,EAAA,CAAA;AAAA,KAC/C;AAEA,IAAO,OAAA,QAAA,CAAA;AAAA,KACN,EAAE,CAAA,CAAA;AACT;;;;"}
|
package/dist/mentions/Mention.js
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react$1 = require('@tiptap/react');
|
|
5
|
+
var react = require('react');
|
|
5
6
|
var classnames = require('../classnames.js');
|
|
6
7
|
var MentionsList = require('./MentionsList.js');
|
|
7
8
|
|
|
8
9
|
const MENTION_CHARACTER = "@";
|
|
9
|
-
const Mention =
|
|
10
|
+
const Mention = react.forwardRef(
|
|
10
11
|
(props, forwardedRef) => {
|
|
11
12
|
const id = props.node.attrs.id;
|
|
12
13
|
const classnames$1 = classnames.classNames("lb-root", "lb-tiptap-mention", props.selected ? "lb-mention-selected" : null);
|
|
13
|
-
return /* @__PURE__ */
|
|
14
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(react$1.NodeViewWrapper, {
|
|
14
15
|
className: classnames$1,
|
|
15
16
|
as: "span",
|
|
16
|
-
ref: forwardedRef
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
ref: forwardedRef,
|
|
18
|
+
children: [
|
|
19
|
+
MENTION_CHARACTER,
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx(MentionsList.User, {
|
|
21
|
+
userId: id
|
|
22
|
+
})
|
|
23
|
+
]
|
|
24
|
+
});
|
|
20
25
|
}
|
|
21
26
|
);
|
|
22
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mention.js","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import type { Node } from \"@tiptap/pm/model\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport
|
|
1
|
+
{"version":3,"file":"Mention.js","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import type { Node } from \"@tiptap/pm/model\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport { forwardRef } from \"react\";\n\nimport { classNames } from \"../classnames\";\nimport { User } from \"./MentionsList\";\n\nconst MENTION_CHARACTER = \"@\";\n\nexport const Mention = forwardRef<HTMLSpanElement, { node: Node, selected: boolean }>(\n (props, forwardedRef) => {\n const id = (props.node.attrs as { id: string }).id;\n const classnames = classNames(\"lb-root\", \"lb-tiptap-mention\", props.selected ? \"lb-mention-selected\" : null);\n return (\n <NodeViewWrapper className={classnames} as=\"span\"\n ref={forwardedRef}>\n {MENTION_CHARACTER}\n <User userId={id} />\n </NodeViewWrapper>\n )\n }\n);\n"],"names":["forwardRef","classnames","classNames","jsxs","NodeViewWrapper","jsx","User"],"mappings":";;;;;;;;AAOA,MAAM,iBAAoB,GAAA,GAAA,CAAA;AAEnB,MAAM,OAAU,GAAAA,gBAAA;AAAA,EACrB,CAAC,OAAO,YAAiB,KAAA;AACvB,IAAM,MAAA,EAAA,GAAM,KAAM,CAAA,IAAA,CAAK,KAAyB,CAAA,EAAA,CAAA;AAChD,IAAA,MAAMC,eAAaC,qBAAW,CAAA,SAAA,EAAW,qBAAqB,KAAM,CAAA,QAAA,GAAW,wBAAwB,IAAI,CAAA,CAAA;AAC3G,IAAA,uBACGC,eAAA,CAAAC,uBAAA,EAAA;AAAA,MAAgB,SAAW,EAAAH,YAAA;AAAA,MAAY,EAAG,EAAA,MAAA;AAAA,MACzC,GAAK,EAAA,YAAA;AAAA,MACJ,QAAA,EAAA;AAAA,QAAA,iBAAA;AAAA,wBACAI,cAAA,CAAAC,iBAAA,EAAA;AAAA,UAAK,MAAQ,EAAA,EAAA;AAAA,SAAI,CAAA;AAAA,OAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
1
2
|
import { NodeViewWrapper } from '@tiptap/react';
|
|
2
|
-
import
|
|
3
|
+
import { forwardRef } from 'react';
|
|
3
4
|
import { classNames } from '../classnames.mjs';
|
|
4
5
|
import { User } from './MentionsList.mjs';
|
|
5
6
|
|
|
@@ -8,13 +9,17 @@ const Mention = forwardRef(
|
|
|
8
9
|
(props, forwardedRef) => {
|
|
9
10
|
const id = props.node.attrs.id;
|
|
10
11
|
const classnames = classNames("lb-root", "lb-tiptap-mention", props.selected ? "lb-mention-selected" : null);
|
|
11
|
-
return /* @__PURE__ */
|
|
12
|
+
return /* @__PURE__ */ jsxs(NodeViewWrapper, {
|
|
12
13
|
className: classnames,
|
|
13
14
|
as: "span",
|
|
14
|
-
ref: forwardedRef
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
ref: forwardedRef,
|
|
16
|
+
children: [
|
|
17
|
+
MENTION_CHARACTER,
|
|
18
|
+
/* @__PURE__ */ jsx(User, {
|
|
19
|
+
userId: id
|
|
20
|
+
})
|
|
21
|
+
]
|
|
22
|
+
});
|
|
18
23
|
}
|
|
19
24
|
);
|
|
20
25
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mention.mjs","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import type { Node } from \"@tiptap/pm/model\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport
|
|
1
|
+
{"version":3,"file":"Mention.mjs","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import type { Node } from \"@tiptap/pm/model\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport { forwardRef } from \"react\";\n\nimport { classNames } from \"../classnames\";\nimport { User } from \"./MentionsList\";\n\nconst MENTION_CHARACTER = \"@\";\n\nexport const Mention = forwardRef<HTMLSpanElement, { node: Node, selected: boolean }>(\n (props, forwardedRef) => {\n const id = (props.node.attrs as { id: string }).id;\n const classnames = classNames(\"lb-root\", \"lb-tiptap-mention\", props.selected ? \"lb-mention-selected\" : null);\n return (\n <NodeViewWrapper className={classnames} as=\"span\"\n ref={forwardedRef}>\n {MENTION_CHARACTER}\n <User userId={id} />\n </NodeViewWrapper>\n )\n }\n);\n"],"names":[],"mappings":";;;;;;AAOA,MAAM,iBAAoB,GAAA,GAAA,CAAA;AAEnB,MAAM,OAAU,GAAA,UAAA;AAAA,EACrB,CAAC,OAAO,YAAiB,KAAA;AACvB,IAAM,MAAA,EAAA,GAAM,KAAM,CAAA,IAAA,CAAK,KAAyB,CAAA,EAAA,CAAA;AAChD,IAAA,MAAM,aAAa,UAAW,CAAA,SAAA,EAAW,qBAAqB,KAAM,CAAA,QAAA,GAAW,wBAAwB,IAAI,CAAA,CAAA;AAC3G,IAAA,uBACG,IAAA,CAAA,eAAA,EAAA;AAAA,MAAgB,SAAW,EAAA,UAAA;AAAA,MAAY,EAAG,EAAA,MAAA;AAAA,MACzC,GAAK,EAAA,YAAA;AAAA,MACJ,QAAA,EAAA;AAAA,QAAA,iBAAA;AAAA,wBACA,GAAA,CAAA,IAAA,EAAA;AAAA,UAAK,MAAQ,EAAA,EAAA;AAAA,SAAI,CAAA;AAAA,OAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
|
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
3
4
|
var reactDom = require('@floating-ui/react-dom');
|
|
4
5
|
var core = require('@liveblocks/core');
|
|
5
|
-
var react = require('@liveblocks/react');
|
|
6
|
+
var react$1 = require('@liveblocks/react');
|
|
6
7
|
var _private = require('@liveblocks/react/_private');
|
|
7
8
|
var reactUi = require('@liveblocks/react-ui');
|
|
8
|
-
var
|
|
9
|
+
var react = require('react');
|
|
9
10
|
var Avatar = require('./Avatar.js');
|
|
10
11
|
|
|
11
|
-
const User =
|
|
12
|
+
const User = react.forwardRef(
|
|
12
13
|
function User2(props, forwardedRef) {
|
|
13
14
|
const { userId, className, ...spanProps } = props;
|
|
14
|
-
const { user, isLoading } = react.useUser(userId);
|
|
15
|
+
const { user, isLoading } = react$1.useUser(userId);
|
|
15
16
|
const $ = reactUi.useOverrides();
|
|
16
17
|
const name = user === void 0 || user === null ? $.USER_UNKNOWN : user.name;
|
|
17
|
-
return /* @__PURE__ */
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
18
19
|
className,
|
|
19
20
|
"data-loading": isLoading ? "" : void 0,
|
|
20
21
|
ref: forwardedRef,
|
|
21
|
-
...spanProps
|
|
22
|
-
|
|
22
|
+
...spanProps,
|
|
23
|
+
children: isLoading ? null : name
|
|
24
|
+
});
|
|
23
25
|
}
|
|
24
26
|
);
|
|
25
27
|
const SUGGESTIONS_COLLISION_PADDING = 10;
|
|
26
|
-
const MentionsList =
|
|
27
|
-
const [selectedIndex, setSelectedIndex] =
|
|
28
|
-
const room = react.useRoom();
|
|
28
|
+
const MentionsList = react.forwardRef((props, ref) => {
|
|
29
|
+
const [selectedIndex, setSelectedIndex] = react.useState(0);
|
|
30
|
+
const room = react$1.useRoom();
|
|
29
31
|
const suggestions = _private.useMentionSuggestions(room.id, props.query);
|
|
30
32
|
const { onMouseEnter, onClick } = props;
|
|
31
33
|
const {
|
|
@@ -49,7 +51,7 @@ const MentionsList = React.forwardRef((props, ref) => {
|
|
|
49
51
|
});
|
|
50
52
|
}
|
|
51
53
|
});
|
|
52
|
-
|
|
54
|
+
react.useLayoutEffect(() => {
|
|
53
55
|
setReference({
|
|
54
56
|
getBoundingClientRect: props.clientRect
|
|
55
57
|
});
|
|
@@ -69,8 +71,8 @@ const MentionsList = React.forwardRef((props, ref) => {
|
|
|
69
71
|
const enterHandler = () => {
|
|
70
72
|
selectItem(selectedIndex);
|
|
71
73
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
react.useEffect(() => setSelectedIndex(0), [suggestions]);
|
|
75
|
+
react.useImperativeHandle(ref, () => ({
|
|
74
76
|
onKeyDown: ({ event }) => {
|
|
75
77
|
if (event.key === "ArrowUp") {
|
|
76
78
|
upHandler();
|
|
@@ -102,7 +104,7 @@ const MentionsList = React.forwardRef((props, ref) => {
|
|
|
102
104
|
if (suggestions === void 0 || suggestions.length === 0) {
|
|
103
105
|
return null;
|
|
104
106
|
}
|
|
105
|
-
return /* @__PURE__ */
|
|
107
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
106
108
|
className: "lb-root lb-portal lb-elevation lb-tiptap-suggestions lb-tiptap-mention-suggestions",
|
|
107
109
|
ref: setFloating,
|
|
108
110
|
style: {
|
|
@@ -112,23 +114,28 @@ const MentionsList = React.forwardRef((props, ref) => {
|
|
|
112
114
|
transform: `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`,
|
|
113
115
|
minWidth: "max-content",
|
|
114
116
|
display: props.hide ? "none" : "block"
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
117
|
+
},
|
|
118
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
119
|
+
className: "lb-tiptap-suggestions-list lb-tiptap-mention-suggestions-list",
|
|
120
|
+
children: suggestions.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
121
|
+
className: "lb-tiptap-suggestions-list-item lb-tiptap-mention-suggestion",
|
|
122
|
+
role: "option",
|
|
123
|
+
"data-highlighted": index === selectedIndex || void 0,
|
|
124
|
+
onMouseEnter: handleMouseEnter(index),
|
|
125
|
+
onClick: handleClick(index),
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsxRuntime.jsx(Avatar.Avatar, {
|
|
128
|
+
userId: item,
|
|
129
|
+
className: "lb-tiptap-mention-suggestion-avatar"
|
|
130
|
+
}),
|
|
131
|
+
/* @__PURE__ */ jsxRuntime.jsx(User, {
|
|
132
|
+
userId: item,
|
|
133
|
+
className: "lb-tiptap-mention-suggestion-user"
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
}, index))
|
|
137
|
+
})
|
|
138
|
+
});
|
|
132
139
|
});
|
|
133
140
|
|
|
134
141
|
exports.MentionsList = MentionsList;
|