@liveblocks/react-lexical 1.12.0-lexical6 → 2.0.0-alpha2
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/classnames.js +8 -0
- package/dist/classnames.js.map +1 -0
- package/dist/classnames.mjs +6 -0
- package/dist/classnames.mjs.map +1 -0
- package/dist/comments/ThreadPanel.js +27 -7
- package/dist/comments/ThreadPanel.js.map +1 -1
- package/dist/comments/ThreadPanel.mjs +28 -8
- package/dist/comments/ThreadPanel.mjs.map +1 -1
- package/dist/comments/comment-plugin-provider.js +18 -106
- package/dist/comments/comment-plugin-provider.js.map +1 -1
- package/dist/comments/comment-plugin-provider.mjs +17 -104
- package/dist/comments/comment-plugin-provider.mjs.map +1 -1
- package/dist/comments/floating-composer.js +226 -15
- package/dist/comments/floating-composer.js.map +1 -1
- package/dist/comments/floating-composer.mjs +224 -15
- package/dist/comments/floating-composer.mjs.map +1 -1
- package/dist/create-dom-range.js +63 -0
- package/dist/create-dom-range.js.map +1 -0
- package/dist/create-dom-range.mjs +61 -0
- package/dist/create-dom-range.mjs.map +1 -0
- package/dist/create-rects-from-dom-range.js +36 -0
- package/dist/create-rects-from-dom-range.js.map +1 -0
- package/dist/create-rects-from-dom-range.mjs +34 -0
- package/dist/create-rects-from-dom-range.mjs.map +1 -0
- package/dist/index.d.mts +96 -44
- package/dist/index.d.ts +96 -44
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -4
- package/dist/index.mjs.map +1 -1
- package/dist/liveblocks-config.js +3 -75
- package/dist/liveblocks-config.js.map +1 -1
- package/dist/liveblocks-config.mjs +4 -56
- package/dist/liveblocks-config.mjs.map +1 -1
- package/dist/liveblocks-plugin-provider.js +12 -29
- package/dist/liveblocks-plugin-provider.js.map +1 -1
- package/dist/liveblocks-plugin-provider.mjs +13 -29
- package/dist/liveblocks-plugin-provider.mjs.map +1 -1
- package/dist/mentions/avatar.js +10 -6
- package/dist/mentions/avatar.js.map +1 -1
- package/dist/mentions/avatar.mjs +10 -6
- package/dist/mentions/avatar.mjs.map +1 -1
- package/dist/mentions/mention-component.js +5 -18
- package/dist/mentions/mention-component.js.map +1 -1
- package/dist/mentions/mention-component.mjs +7 -19
- package/dist/mentions/mention-component.mjs.map +1 -1
- package/dist/mentions/mention-node.js +76 -80
- package/dist/mentions/mention-node.js.map +1 -1
- package/dist/mentions/mention-node.mjs +75 -81
- package/dist/mentions/mention-node.mjs.map +1 -1
- package/dist/mentions/mention-plugin.js +102 -90
- package/dist/mentions/mention-plugin.js.map +1 -1
- package/dist/mentions/mention-plugin.mjs +87 -71
- package/dist/mentions/mention-plugin.mjs.map +1 -1
- package/dist/mentions/suggestions.js +34 -6
- package/dist/mentions/suggestions.js.map +1 -1
- package/dist/mentions/suggestions.mjs +28 -3
- package/dist/mentions/suggestions.mjs.map +1 -1
- package/dist/mentions/user.js +8 -5
- package/dist/mentions/user.js.map +1 -1
- package/dist/mentions/user.mjs +8 -5
- package/dist/mentions/user.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 +13 -13
- package/src/styles/constants.css +1 -0
- package/src/styles/index.css +142 -0
- package/src/styles/utils.css +6 -0
- package/styles.css +1 -1
- package/styles.css.map +1 -1
- package/dist/active-selection.js +0 -143
- package/dist/active-selection.js.map +0 -1
- package/dist/active-selection.mjs +0 -123
- package/dist/active-selection.mjs.map +0 -1
- package/dist/floating-selection-container.js +0 -157
- package/dist/floating-selection-container.js.map +0 -1
- package/dist/floating-selection-container.mjs +0 -155
- package/dist/floating-selection-container.mjs.map +0 -1
package/dist/mentions/avatar.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useUser } from '@liveblocks/react';
|
|
2
2
|
import React__default, { forwardRef } from 'react';
|
|
3
|
+
import { classNames } from '../classnames.mjs';
|
|
3
4
|
|
|
4
5
|
const Avatar = forwardRef(
|
|
5
6
|
function Avatar2(props, forwardedRef) {
|
|
6
|
-
const { userId, ...spanProps } = props;
|
|
7
|
-
const { useUser } = useSharedContextBundle();
|
|
7
|
+
const { userId, className, ...spanProps } = props;
|
|
8
8
|
const { user, isLoading } = useUser(userId);
|
|
9
9
|
const avatar = user ? user.avatar : void 0;
|
|
10
10
|
const name = user ? user.name : void 0;
|
|
@@ -12,7 +12,8 @@ const Avatar = forwardRef(
|
|
|
12
12
|
const initials = name ? getInitials(name) : void 0;
|
|
13
13
|
if (initials) {
|
|
14
14
|
return /* @__PURE__ */ React__default.createElement("span", {
|
|
15
|
-
"aria-hidden": true
|
|
15
|
+
"aria-hidden": true,
|
|
16
|
+
className: "lb-avatar-fallback"
|
|
16
17
|
}, initials);
|
|
17
18
|
}
|
|
18
19
|
if (isLoading)
|
|
@@ -21,16 +22,19 @@ const Avatar = forwardRef(
|
|
|
21
22
|
return null;
|
|
22
23
|
return /* @__PURE__ */ React__default.createElement("span", {
|
|
23
24
|
"aria-label": userId,
|
|
24
|
-
title: userId
|
|
25
|
+
title: userId,
|
|
26
|
+
className: "lb-avatar-fallback"
|
|
25
27
|
}, getInitials(userId));
|
|
26
28
|
}
|
|
27
29
|
return /* @__PURE__ */ React__default.createElement("span", {
|
|
28
30
|
"data-loading": isLoading ? "" : void 0,
|
|
29
31
|
...spanProps,
|
|
32
|
+
className: classNames("lb-avatar", className),
|
|
30
33
|
ref: forwardedRef
|
|
31
34
|
}, avatar && /* @__PURE__ */ React__default.createElement("img", {
|
|
32
35
|
src: avatar,
|
|
33
|
-
alt: name
|
|
36
|
+
alt: name,
|
|
37
|
+
className: "lb-avatar-image"
|
|
34
38
|
}), /* @__PURE__ */ React__default.createElement(Initials, null));
|
|
35
39
|
}
|
|
36
40
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.mjs","sources":["../../src/mentions/avatar.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"avatar.mjs","sources":["../../src/mentions/avatar.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport React, { 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","React","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,uBACGC,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,UAAK,aAAW,EAAA,IAAA;AAAA,UAAC,SAAU,EAAA,oBAAA;AAAA,SAAA,EACzB,QACH,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,aAAA,CAAA,MAAA,EAAA;AAAA,QAAK,YAAY,EAAA,MAAA;AAAA,QAAQ,KAAO,EAAA,MAAA;AAAA,QAAQ,SAAU,EAAA,oBAAA;AAAA,OAChD,EAAA,WAAA,CAAY,MAAM,CACrB,CAAA,CAAA;AAAA,KAEJ;AAEA,IAAA,uBACGA,cAAA,CAAA,aAAA,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,KAAA,EAEJ,0BAAWA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,MAAI,GAAK,EAAA,MAAA;AAAA,MAAQ,GAAK,EAAA,IAAA;AAAA,MAAM,SAAU,EAAA,iBAAA;AAAA,KAAkB,CAAA,kBAEnEA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAS,CACZ,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;;;;"}
|
|
@@ -5,8 +5,7 @@ var lexical = require('lexical');
|
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var index_js = require('use-sync-external-store/shim/index.js');
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
function MentionWrapper({
|
|
8
|
+
function Mention({
|
|
10
9
|
nodeKey,
|
|
11
10
|
children
|
|
12
11
|
}) {
|
|
@@ -21,23 +20,12 @@ function MentionWrapper({
|
|
|
21
20
|
lexical.$setSelection(selection);
|
|
22
21
|
});
|
|
23
22
|
}
|
|
24
|
-
return /* @__PURE__ */ React.createElement(IsSelectedContext.Provider, {
|
|
25
|
-
value: isSelected
|
|
26
|
-
}, /* @__PURE__ */ React.createElement("span", {
|
|
27
|
-
onClick: handleClick
|
|
28
|
-
}, children));
|
|
29
|
-
}
|
|
30
|
-
const Mention = React.forwardRef(function(props, forwardedRef) {
|
|
31
|
-
const isSelected = React.useContext(IsSelectedContext);
|
|
32
|
-
if (isSelected === null) {
|
|
33
|
-
throw new Error("Mention component must be wrapped in MentionWrapper");
|
|
34
|
-
}
|
|
35
23
|
return /* @__PURE__ */ React.createElement("span", {
|
|
24
|
+
onClick: handleClick,
|
|
36
25
|
"data-selected": isSelected ? "" : void 0,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
});
|
|
26
|
+
className: "lb-lexical-mention"
|
|
27
|
+
}, children);
|
|
28
|
+
}
|
|
41
29
|
function $isNodeSelected(key) {
|
|
42
30
|
const node = lexical.$getNodeByKey(key);
|
|
43
31
|
if (node === null)
|
|
@@ -59,5 +47,4 @@ function useIsNodeSelected(key) {
|
|
|
59
47
|
}
|
|
60
48
|
|
|
61
49
|
exports.Mention = Mention;
|
|
62
|
-
exports.MentionWrapper = MentionWrapper;
|
|
63
50
|
//# sourceMappingURL=mention-component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-component.js","sources":["../../src/mentions/mention-component.tsx"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport type { NodeKey } from \"lexical\";\nimport { $createNodeSelection, $getNodeByKey, $setSelection } from \"lexical\";\nimport type {
|
|
1
|
+
{"version":3,"file":"mention-component.js","sources":["../../src/mentions/mention-component.tsx"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport type { NodeKey } from \"lexical\";\nimport { $createNodeSelection, $getNodeByKey, $setSelection } from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport React, { useCallback } from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim/index.js\";\n\nexport function Mention({\n nodeKey,\n children,\n}: {\n nodeKey: NodeKey;\n children: ReactNode;\n}) {\n const [editor] = useLexicalComposerContext();\n const isSelected = useIsNodeSelected(nodeKey);\n\n function handleClick(event: React.MouseEvent) {\n editor.update(() => {\n event.stopPropagation();\n event.preventDefault();\n\n const selection = $createNodeSelection();\n selection.add(nodeKey);\n $setSelection(selection);\n });\n }\n\n return (\n <span\n onClick={handleClick}\n data-selected={isSelected ? \"\" : undefined}\n className=\"lb-lexical-mention\"\n >\n {children}\n </span>\n );\n}\n\nfunction $isNodeSelected(key: NodeKey): boolean {\n const node = $getNodeByKey(key);\n if (node === null) return false;\n return node.isSelected();\n}\n\nfunction useIsNodeSelected(key: NodeKey) {\n const [editor] = useLexicalComposerContext();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return editor.registerUpdateListener(onStoreChange);\n },\n [editor]\n );\n\n const getSnapshot = useCallback(() => {\n return editor.getEditorState().read(() => $isNodeSelected(key));\n }, [editor, key]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"names":["useLexicalComposerContext","$createNodeSelection","$setSelection","$getNodeByKey","useCallback","useSyncExternalStore"],"mappings":";;;;;;;AAOO,SAAS,OAAQ,CAAA;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AACF,CAGG,EAAA;AACD,EAAM,MAAA,CAAC,MAAM,CAAA,GAAIA,gDAA0B,EAAA,CAAA;AAC3C,EAAM,MAAA,UAAA,GAAa,kBAAkB,OAAO,CAAA,CAAA;AAE5C,EAAA,SAAS,YAAY,KAAyB,EAAA;AAC5C,IAAA,MAAA,CAAO,OAAO,MAAM;AAClB,MAAA,KAAA,CAAM,eAAgB,EAAA,CAAA;AACtB,MAAA,KAAA,CAAM,cAAe,EAAA,CAAA;AAErB,MAAA,MAAM,YAAYC,4BAAqB,EAAA,CAAA;AACvC,MAAA,SAAA,CAAU,IAAI,OAAO,CAAA,CAAA;AACrB,MAAAC,qBAAA,CAAc,SAAS,CAAA,CAAA;AAAA,KACxB,CAAA,CAAA;AAAA,GACH;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,IACC,OAAS,EAAA,WAAA;AAAA,IACT,eAAA,EAAe,aAAa,EAAK,GAAA,KAAA,CAAA;AAAA,IACjC,SAAU,EAAA,oBAAA;AAAA,GAAA,EAET,QACH,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,gBAAgB,GAAuB,EAAA;AAC9C,EAAM,MAAA,IAAA,GAAOC,sBAAc,GAAG,CAAA,CAAA;AAC9B,EAAA,IAAI,IAAS,KAAA,IAAA;AAAM,IAAO,OAAA,KAAA,CAAA;AAC1B,EAAA,OAAO,KAAK,UAAW,EAAA,CAAA;AACzB,CAAA;AAEA,SAAS,kBAAkB,GAAc,EAAA;AACvC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAIH,gDAA0B,EAAA,CAAA;AAE3C,EAAA,MAAM,SAAY,GAAAI,iBAAA;AAAA,IAChB,CAAC,aAA8B,KAAA;AAC7B,MAAO,OAAA,MAAA,CAAO,uBAAuB,aAAa,CAAA,CAAA;AAAA,KACpD;AAAA,IACA,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AAEA,EAAM,MAAA,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,OAAO,OAAO,cAAe,EAAA,CAAE,KAAK,MAAM,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAA;AAAA,GAC7D,EAAA,CAAC,MAAQ,EAAA,GAAG,CAAC,CAAA,CAAA;AAEhB,EAAO,OAAAC,6BAAA,CAAqB,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AACjE;;;;"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
2
2
|
import { $createNodeSelection, $setSelection, $getNodeByKey } from 'lexical';
|
|
3
|
-
import React__default, {
|
|
3
|
+
import React__default, { useCallback } from 'react';
|
|
4
4
|
import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
function MentionWrapper({
|
|
6
|
+
function Mention({
|
|
8
7
|
nodeKey,
|
|
9
8
|
children
|
|
10
9
|
}) {
|
|
@@ -19,23 +18,12 @@ function MentionWrapper({
|
|
|
19
18
|
$setSelection(selection);
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
|
-
return /* @__PURE__ */ React__default.createElement(IsSelectedContext.Provider, {
|
|
23
|
-
value: isSelected
|
|
24
|
-
}, /* @__PURE__ */ React__default.createElement("span", {
|
|
25
|
-
onClick: handleClick
|
|
26
|
-
}, children));
|
|
27
|
-
}
|
|
28
|
-
const Mention = forwardRef(function(props, forwardedRef) {
|
|
29
|
-
const isSelected = useContext(IsSelectedContext);
|
|
30
|
-
if (isSelected === null) {
|
|
31
|
-
throw new Error("Mention component must be wrapped in MentionWrapper");
|
|
32
|
-
}
|
|
33
21
|
return /* @__PURE__ */ React__default.createElement("span", {
|
|
22
|
+
onClick: handleClick,
|
|
34
23
|
"data-selected": isSelected ? "" : void 0,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
24
|
+
className: "lb-lexical-mention"
|
|
25
|
+
}, children);
|
|
26
|
+
}
|
|
39
27
|
function $isNodeSelected(key) {
|
|
40
28
|
const node = $getNodeByKey(key);
|
|
41
29
|
if (node === null)
|
|
@@ -56,5 +44,5 @@ function useIsNodeSelected(key) {
|
|
|
56
44
|
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
57
45
|
}
|
|
58
46
|
|
|
59
|
-
export { Mention
|
|
47
|
+
export { Mention };
|
|
60
48
|
//# sourceMappingURL=mention-component.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-component.mjs","sources":["../../src/mentions/mention-component.tsx"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport type { NodeKey } from \"lexical\";\nimport { $createNodeSelection, $getNodeByKey, $setSelection } from \"lexical\";\nimport type {
|
|
1
|
+
{"version":3,"file":"mention-component.mjs","sources":["../../src/mentions/mention-component.tsx"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport type { NodeKey } from \"lexical\";\nimport { $createNodeSelection, $getNodeByKey, $setSelection } from \"lexical\";\nimport type { ReactNode } from \"react\";\nimport React, { useCallback } from \"react\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim/index.js\";\n\nexport function Mention({\n nodeKey,\n children,\n}: {\n nodeKey: NodeKey;\n children: ReactNode;\n}) {\n const [editor] = useLexicalComposerContext();\n const isSelected = useIsNodeSelected(nodeKey);\n\n function handleClick(event: React.MouseEvent) {\n editor.update(() => {\n event.stopPropagation();\n event.preventDefault();\n\n const selection = $createNodeSelection();\n selection.add(nodeKey);\n $setSelection(selection);\n });\n }\n\n return (\n <span\n onClick={handleClick}\n data-selected={isSelected ? \"\" : undefined}\n className=\"lb-lexical-mention\"\n >\n {children}\n </span>\n );\n}\n\nfunction $isNodeSelected(key: NodeKey): boolean {\n const node = $getNodeByKey(key);\n if (node === null) return false;\n return node.isSelected();\n}\n\nfunction useIsNodeSelected(key: NodeKey) {\n const [editor] = useLexicalComposerContext();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return editor.registerUpdateListener(onStoreChange);\n },\n [editor]\n );\n\n const getSnapshot = useCallback(() => {\n return editor.getEditorState().read(() => $isNodeSelected(key));\n }, [editor, key]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"names":["React"],"mappings":";;;;;AAOO,SAAS,OAAQ,CAAA;AAAA,EACtB,OAAA;AAAA,EACA,QAAA;AACF,CAGG,EAAA;AACD,EAAM,MAAA,CAAC,MAAM,CAAA,GAAI,yBAA0B,EAAA,CAAA;AAC3C,EAAM,MAAA,UAAA,GAAa,kBAAkB,OAAO,CAAA,CAAA;AAE5C,EAAA,SAAS,YAAY,KAAyB,EAAA;AAC5C,IAAA,MAAA,CAAO,OAAO,MAAM;AAClB,MAAA,KAAA,CAAM,eAAgB,EAAA,CAAA;AACtB,MAAA,KAAA,CAAM,cAAe,EAAA,CAAA;AAErB,MAAA,MAAM,YAAY,oBAAqB,EAAA,CAAA;AACvC,MAAA,SAAA,CAAU,IAAI,OAAO,CAAA,CAAA;AACrB,MAAA,aAAA,CAAc,SAAS,CAAA,CAAA;AAAA,KACxB,CAAA,CAAA;AAAA,GACH;AAEA,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,IACC,OAAS,EAAA,WAAA;AAAA,IACT,eAAA,EAAe,aAAa,EAAK,GAAA,KAAA,CAAA;AAAA,IACjC,SAAU,EAAA,oBAAA;AAAA,GAAA,EAET,QACH,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,gBAAgB,GAAuB,EAAA;AAC9C,EAAM,MAAA,IAAA,GAAO,cAAc,GAAG,CAAA,CAAA;AAC9B,EAAA,IAAI,IAAS,KAAA,IAAA;AAAM,IAAO,OAAA,KAAA,CAAA;AAC1B,EAAA,OAAO,KAAK,UAAW,EAAA,CAAA;AACzB,CAAA;AAEA,SAAS,kBAAkB,GAAc,EAAA;AACvC,EAAM,MAAA,CAAC,MAAM,CAAA,GAAI,yBAA0B,EAAA,CAAA;AAE3C,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,aAA8B,KAAA;AAC7B,MAAO,OAAA,MAAA,CAAO,uBAAuB,aAAa,CAAA,CAAA;AAAA,KACpD;AAAA,IACA,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AAEA,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,OAAO,OAAO,cAAe,EAAA,CAAE,KAAK,MAAM,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAA;AAAA,GAC7D,EAAA,CAAC,MAAQ,EAAA,GAAG,CAAC,CAAA,CAAA;AAEhB,EAAO,OAAA,oBAAA,CAAqB,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AACjE;;;;"}
|
|
@@ -4,6 +4,7 @@ var lexical = require('lexical');
|
|
|
4
4
|
var nanoid = require('nanoid');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var mentionComponent = require('./mention-component.js');
|
|
7
|
+
var user = require('./user.js');
|
|
7
8
|
|
|
8
9
|
function _interopNamespaceDefault(e) {
|
|
9
10
|
var n = Object.create(null);
|
|
@@ -24,89 +25,84 @@ function _interopNamespaceDefault(e) {
|
|
|
24
25
|
|
|
25
26
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
static getType() {
|
|
35
|
-
return "lb-mention";
|
|
36
|
-
}
|
|
37
|
-
static clone(node) {
|
|
38
|
-
return new MentionNode(node.__id, node.__userId);
|
|
39
|
-
}
|
|
40
|
-
createDOM() {
|
|
41
|
-
const element = document.createElement("span");
|
|
42
|
-
element.style.display = "inline-block";
|
|
43
|
-
return element;
|
|
44
|
-
}
|
|
45
|
-
updateDOM() {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
static importDom() {
|
|
49
|
-
return {
|
|
50
|
-
span: () => ({
|
|
51
|
-
conversion: (element) => {
|
|
52
|
-
const value = atob(
|
|
53
|
-
element.getAttribute("data-lexical-lb-mention")
|
|
54
|
-
);
|
|
55
|
-
const node = $createMentionNode(value);
|
|
56
|
-
return { node };
|
|
57
|
-
},
|
|
58
|
-
priority: 1
|
|
59
|
-
})
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
exportDOM() {
|
|
63
|
-
const element = document.createElement("span");
|
|
64
|
-
const value = this.getTextContent();
|
|
65
|
-
element.setAttribute("data-lexical-lb-mention", btoa(value));
|
|
66
|
-
element.textContent = this.getTextContent();
|
|
67
|
-
return { element };
|
|
68
|
-
}
|
|
69
|
-
static importJSON(serializedNode) {
|
|
70
|
-
const node = $createMentionNode(serializedNode.userId);
|
|
71
|
-
return node;
|
|
72
|
-
}
|
|
73
|
-
exportJSON() {
|
|
74
|
-
return {
|
|
75
|
-
userId: this.__userId,
|
|
76
|
-
type: "lb-mention",
|
|
77
|
-
version: 1
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
getUserId() {
|
|
81
|
-
const self = this.getLatest();
|
|
82
|
-
return self.__userId;
|
|
83
|
-
}
|
|
84
|
-
getId() {
|
|
85
|
-
const self = this.getLatest();
|
|
86
|
-
return self.__id;
|
|
87
|
-
}
|
|
88
|
-
decorate() {
|
|
89
|
-
return /* @__PURE__ */ React__namespace.createElement(mentionComponent.MentionWrapper, {
|
|
90
|
-
nodeKey: this.getKey()
|
|
91
|
-
}, /* @__PURE__ */ React__namespace.createElement(Component, {
|
|
92
|
-
userId: this.__userId
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
28
|
+
const MENTION_CHARACTER = "@";
|
|
29
|
+
class MentionNode extends lexical.DecoratorNode {
|
|
30
|
+
constructor(id, userId, key) {
|
|
31
|
+
super(key);
|
|
32
|
+
this.__id = id;
|
|
33
|
+
this.__userId = userId;
|
|
95
34
|
}
|
|
96
|
-
|
|
97
|
-
return
|
|
35
|
+
static getType() {
|
|
36
|
+
return "lb-mention";
|
|
98
37
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const node = new MentionNode(id, userId);
|
|
102
|
-
return lexical.$applyNodeReplacement(node);
|
|
38
|
+
static clone(node) {
|
|
39
|
+
return new MentionNode(node.__id, node.__userId);
|
|
103
40
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
41
|
+
createDOM() {
|
|
42
|
+
const element = document.createElement("span");
|
|
43
|
+
element.style.display = "inline-block";
|
|
44
|
+
element.style.userSelect = "none";
|
|
45
|
+
return element;
|
|
46
|
+
}
|
|
47
|
+
updateDOM() {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
static importDom() {
|
|
51
|
+
return {
|
|
52
|
+
span: () => ({
|
|
53
|
+
conversion: (element) => {
|
|
54
|
+
const value = atob(element.getAttribute("data-lexical-lb-mention"));
|
|
55
|
+
const node = $createMentionNode(value);
|
|
56
|
+
return { node };
|
|
57
|
+
},
|
|
58
|
+
priority: 1
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
exportDOM() {
|
|
63
|
+
const element = document.createElement("span");
|
|
64
|
+
const value = this.getTextContent();
|
|
65
|
+
element.setAttribute("data-lexical-lb-mention", btoa(value));
|
|
66
|
+
element.textContent = this.getTextContent();
|
|
67
|
+
return { element };
|
|
68
|
+
}
|
|
69
|
+
static importJSON(serializedNode) {
|
|
70
|
+
const node = $createMentionNode(serializedNode.userId);
|
|
71
|
+
return node;
|
|
72
|
+
}
|
|
73
|
+
exportJSON() {
|
|
74
|
+
return {
|
|
75
|
+
userId: this.__userId,
|
|
76
|
+
type: "lb-mention",
|
|
77
|
+
version: 1
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
getUserId() {
|
|
81
|
+
const self = this.getLatest();
|
|
82
|
+
return self.__userId;
|
|
83
|
+
}
|
|
84
|
+
getId() {
|
|
85
|
+
const self = this.getLatest();
|
|
86
|
+
return self.__id;
|
|
87
|
+
}
|
|
88
|
+
decorate() {
|
|
89
|
+
return /* @__PURE__ */ React__namespace.createElement(mentionComponent.Mention, {
|
|
90
|
+
nodeKey: this.getKey()
|
|
91
|
+
}, MENTION_CHARACTER, /* @__PURE__ */ React__namespace.createElement(user.User, {
|
|
92
|
+
userId: this.getUserId()
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function $isMentionNode(node) {
|
|
97
|
+
return node instanceof MentionNode;
|
|
98
|
+
}
|
|
99
|
+
function $createMentionNode(userId) {
|
|
100
|
+
const id = `in_${nanoid.nanoid()}`;
|
|
101
|
+
const node = new MentionNode(id, userId);
|
|
102
|
+
return lexical.$applyNodeReplacement(node);
|
|
109
103
|
}
|
|
110
104
|
|
|
111
|
-
exports
|
|
105
|
+
exports.$createMentionNode = $createMentionNode;
|
|
106
|
+
exports.$isMentionNode = $isMentionNode;
|
|
107
|
+
exports.MentionNode = MentionNode;
|
|
112
108
|
//# sourceMappingURL=mention-node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-node.js","sources":["../../src/mentions/mention-node.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\nimport { nanoid } from \"nanoid\";\nimport type {
|
|
1
|
+
{"version":3,"file":"mention-node.js","sources":["../../src/mentions/mention-node.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\nimport { nanoid } from \"nanoid\";\nimport type { JSX } from \"react\";\nimport * as React from \"react\";\n\nimport { Mention } from \"./mention-component\";\nimport { User } from \"./user\";\n\nconst MENTION_CHARACTER = \"@\";\n\nexport type SerializedMentionNode = Spread<\n {\n userId: string;\n },\n SerializedLexicalNode\n>;\nexport class MentionNode extends DecoratorNode<JSX.Element> {\n __id: string;\n __userId: string;\n\n constructor(id: string, userId: string, key?: NodeKey) {\n super(key);\n this.__id = id;\n this.__userId = userId;\n }\n\n static getType(): string {\n return \"lb-mention\";\n }\n\n static clone(node: MentionNode): MentionNode {\n return new MentionNode(node.__id, node.__userId);\n }\n\n createDOM(): HTMLElement {\n const element = document.createElement(\"span\");\n element.style.display = \"inline-block\";\n element.style.userSelect = \"none\";\n return element;\n }\n\n updateDOM(): boolean {\n return false;\n }\n\n static importDom(): DOMConversionMap<HTMLElement> | null {\n return {\n span: () => ({\n conversion: (element) => {\n const value = atob(element.getAttribute(\"data-lexical-lb-mention\")!);\n const node = $createMentionNode(value);\n return { node };\n },\n priority: 1,\n }),\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement(\"span\");\n const value = this.getTextContent();\n element.setAttribute(\"data-lexical-lb-mention\", btoa(value));\n element.textContent = this.getTextContent();\n return { element };\n }\n\n static importJSON(serializedNode: SerializedMentionNode): MentionNode {\n const node = $createMentionNode(serializedNode.userId);\n return node;\n }\n\n exportJSON(): SerializedMentionNode {\n return {\n userId: this.__userId,\n type: \"lb-mention\",\n version: 1,\n };\n }\n\n getUserId(): string {\n const self = this.getLatest();\n return self.__userId;\n }\n\n getId(): string {\n const self = this.getLatest();\n return self.__id;\n }\n\n decorate(): JSX.Element {\n return (\n <Mention nodeKey={this.getKey()}>\n {MENTION_CHARACTER}\n <User userId={this.getUserId()} />\n </Mention>\n );\n }\n}\n\nexport function $isMentionNode(\n node: LexicalNode | null | undefined\n): node is MentionNode {\n return node instanceof MentionNode;\n}\n\nexport function $createMentionNode(userId: string): MentionNode {\n const id = `in_${nanoid()}`;\n const node = new MentionNode(id, userId);\n return $applyNodeReplacement(node);\n}\n"],"names":["DecoratorNode","React","Mention","User","nanoid","$applyNodeReplacement"],"mappings":"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"}
|
|
@@ -1,91 +1,85 @@
|
|
|
1
1
|
import { DecoratorNode, $applyNodeReplacement } from 'lexical';
|
|
2
2
|
import { nanoid } from 'nanoid';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { Mention } from './mention-component.mjs';
|
|
5
|
+
import { User } from './user.mjs';
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
static getType() {
|
|
14
|
-
return "lb-mention";
|
|
15
|
-
}
|
|
16
|
-
static clone(node) {
|
|
17
|
-
return new MentionNode(node.__id, node.__userId);
|
|
18
|
-
}
|
|
19
|
-
createDOM() {
|
|
20
|
-
const element = document.createElement("span");
|
|
21
|
-
element.style.display = "inline-block";
|
|
22
|
-
return element;
|
|
23
|
-
}
|
|
24
|
-
updateDOM() {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
static importDom() {
|
|
28
|
-
return {
|
|
29
|
-
span: () => ({
|
|
30
|
-
conversion: (element) => {
|
|
31
|
-
const value = atob(
|
|
32
|
-
element.getAttribute("data-lexical-lb-mention")
|
|
33
|
-
);
|
|
34
|
-
const node = $createMentionNode(value);
|
|
35
|
-
return { node };
|
|
36
|
-
},
|
|
37
|
-
priority: 1
|
|
38
|
-
})
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
exportDOM() {
|
|
42
|
-
const element = document.createElement("span");
|
|
43
|
-
const value = this.getTextContent();
|
|
44
|
-
element.setAttribute("data-lexical-lb-mention", btoa(value));
|
|
45
|
-
element.textContent = this.getTextContent();
|
|
46
|
-
return { element };
|
|
47
|
-
}
|
|
48
|
-
static importJSON(serializedNode) {
|
|
49
|
-
const node = $createMentionNode(serializedNode.userId);
|
|
50
|
-
return node;
|
|
51
|
-
}
|
|
52
|
-
exportJSON() {
|
|
53
|
-
return {
|
|
54
|
-
userId: this.__userId,
|
|
55
|
-
type: "lb-mention",
|
|
56
|
-
version: 1
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
getUserId() {
|
|
60
|
-
const self = this.getLatest();
|
|
61
|
-
return self.__userId;
|
|
62
|
-
}
|
|
63
|
-
getId() {
|
|
64
|
-
const self = this.getLatest();
|
|
65
|
-
return self.__id;
|
|
66
|
-
}
|
|
67
|
-
decorate() {
|
|
68
|
-
return /* @__PURE__ */ React.createElement(MentionWrapper, {
|
|
69
|
-
nodeKey: this.getKey()
|
|
70
|
-
}, /* @__PURE__ */ React.createElement(Component, {
|
|
71
|
-
userId: this.__userId
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
7
|
+
const MENTION_CHARACTER = "@";
|
|
8
|
+
class MentionNode extends DecoratorNode {
|
|
9
|
+
constructor(id, userId, key) {
|
|
10
|
+
super(key);
|
|
11
|
+
this.__id = id;
|
|
12
|
+
this.__userId = userId;
|
|
74
13
|
}
|
|
75
|
-
|
|
76
|
-
return
|
|
14
|
+
static getType() {
|
|
15
|
+
return "lb-mention";
|
|
77
16
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const node = new MentionNode(id, userId);
|
|
81
|
-
return $applyNodeReplacement(node);
|
|
17
|
+
static clone(node) {
|
|
18
|
+
return new MentionNode(node.__id, node.__userId);
|
|
82
19
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
20
|
+
createDOM() {
|
|
21
|
+
const element = document.createElement("span");
|
|
22
|
+
element.style.display = "inline-block";
|
|
23
|
+
element.style.userSelect = "none";
|
|
24
|
+
return element;
|
|
25
|
+
}
|
|
26
|
+
updateDOM() {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
static importDom() {
|
|
30
|
+
return {
|
|
31
|
+
span: () => ({
|
|
32
|
+
conversion: (element) => {
|
|
33
|
+
const value = atob(element.getAttribute("data-lexical-lb-mention"));
|
|
34
|
+
const node = $createMentionNode(value);
|
|
35
|
+
return { node };
|
|
36
|
+
},
|
|
37
|
+
priority: 1
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
exportDOM() {
|
|
42
|
+
const element = document.createElement("span");
|
|
43
|
+
const value = this.getTextContent();
|
|
44
|
+
element.setAttribute("data-lexical-lb-mention", btoa(value));
|
|
45
|
+
element.textContent = this.getTextContent();
|
|
46
|
+
return { element };
|
|
47
|
+
}
|
|
48
|
+
static importJSON(serializedNode) {
|
|
49
|
+
const node = $createMentionNode(serializedNode.userId);
|
|
50
|
+
return node;
|
|
51
|
+
}
|
|
52
|
+
exportJSON() {
|
|
53
|
+
return {
|
|
54
|
+
userId: this.__userId,
|
|
55
|
+
type: "lb-mention",
|
|
56
|
+
version: 1
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
getUserId() {
|
|
60
|
+
const self = this.getLatest();
|
|
61
|
+
return self.__userId;
|
|
62
|
+
}
|
|
63
|
+
getId() {
|
|
64
|
+
const self = this.getLatest();
|
|
65
|
+
return self.__id;
|
|
66
|
+
}
|
|
67
|
+
decorate() {
|
|
68
|
+
return /* @__PURE__ */ React.createElement(Mention, {
|
|
69
|
+
nodeKey: this.getKey()
|
|
70
|
+
}, MENTION_CHARACTER, /* @__PURE__ */ React.createElement(User, {
|
|
71
|
+
userId: this.getUserId()
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function $isMentionNode(node) {
|
|
76
|
+
return node instanceof MentionNode;
|
|
77
|
+
}
|
|
78
|
+
function $createMentionNode(userId) {
|
|
79
|
+
const id = `in_${nanoid()}`;
|
|
80
|
+
const node = new MentionNode(id, userId);
|
|
81
|
+
return $applyNodeReplacement(node);
|
|
88
82
|
}
|
|
89
83
|
|
|
90
|
-
export {
|
|
84
|
+
export { $createMentionNode, $isMentionNode, MentionNode };
|
|
91
85
|
//# sourceMappingURL=mention-node.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-node.mjs","sources":["../../src/mentions/mention-node.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\nimport { nanoid } from \"nanoid\";\nimport type {
|
|
1
|
+
{"version":3,"file":"mention-node.mjs","sources":["../../src/mentions/mention-node.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\nimport { nanoid } from \"nanoid\";\nimport type { JSX } from \"react\";\nimport * as React from \"react\";\n\nimport { Mention } from \"./mention-component\";\nimport { User } from \"./user\";\n\nconst MENTION_CHARACTER = \"@\";\n\nexport type SerializedMentionNode = Spread<\n {\n userId: string;\n },\n SerializedLexicalNode\n>;\nexport class MentionNode extends DecoratorNode<JSX.Element> {\n __id: string;\n __userId: string;\n\n constructor(id: string, userId: string, key?: NodeKey) {\n super(key);\n this.__id = id;\n this.__userId = userId;\n }\n\n static getType(): string {\n return \"lb-mention\";\n }\n\n static clone(node: MentionNode): MentionNode {\n return new MentionNode(node.__id, node.__userId);\n }\n\n createDOM(): HTMLElement {\n const element = document.createElement(\"span\");\n element.style.display = \"inline-block\";\n element.style.userSelect = \"none\";\n return element;\n }\n\n updateDOM(): boolean {\n return false;\n }\n\n static importDom(): DOMConversionMap<HTMLElement> | null {\n return {\n span: () => ({\n conversion: (element) => {\n const value = atob(element.getAttribute(\"data-lexical-lb-mention\")!);\n const node = $createMentionNode(value);\n return { node };\n },\n priority: 1,\n }),\n };\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement(\"span\");\n const value = this.getTextContent();\n element.setAttribute(\"data-lexical-lb-mention\", btoa(value));\n element.textContent = this.getTextContent();\n return { element };\n }\n\n static importJSON(serializedNode: SerializedMentionNode): MentionNode {\n const node = $createMentionNode(serializedNode.userId);\n return node;\n }\n\n exportJSON(): SerializedMentionNode {\n return {\n userId: this.__userId,\n type: \"lb-mention\",\n version: 1,\n };\n }\n\n getUserId(): string {\n const self = this.getLatest();\n return self.__userId;\n }\n\n getId(): string {\n const self = this.getLatest();\n return self.__id;\n }\n\n decorate(): JSX.Element {\n return (\n <Mention nodeKey={this.getKey()}>\n {MENTION_CHARACTER}\n <User userId={this.getUserId()} />\n </Mention>\n );\n }\n}\n\nexport function $isMentionNode(\n node: LexicalNode | null | undefined\n): node is MentionNode {\n return node instanceof MentionNode;\n}\n\nexport function $createMentionNode(userId: string): MentionNode {\n const id = `in_${nanoid()}`;\n const node = new MentionNode(id, userId);\n return $applyNodeReplacement(node);\n}\n"],"names":[],"mappings":"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"}
|