@liveblocks/react-lexical 1.12.0-lexical4 → 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.
Files changed (85) hide show
  1. package/dist/classnames.js +8 -0
  2. package/dist/classnames.js.map +1 -0
  3. package/dist/classnames.mjs +6 -0
  4. package/dist/classnames.mjs.map +1 -0
  5. package/dist/comments/ThreadPanel.js +27 -7
  6. package/dist/comments/ThreadPanel.js.map +1 -1
  7. package/dist/comments/ThreadPanel.mjs +28 -8
  8. package/dist/comments/ThreadPanel.mjs.map +1 -1
  9. package/dist/comments/comment-plugin-provider.js +18 -106
  10. package/dist/comments/comment-plugin-provider.js.map +1 -1
  11. package/dist/comments/comment-plugin-provider.mjs +17 -104
  12. package/dist/comments/comment-plugin-provider.mjs.map +1 -1
  13. package/dist/comments/floating-composer.js +226 -15
  14. package/dist/comments/floating-composer.js.map +1 -1
  15. package/dist/comments/floating-composer.mjs +224 -15
  16. package/dist/comments/floating-composer.mjs.map +1 -1
  17. package/dist/comments/thread-mark-node.js +1 -16
  18. package/dist/comments/thread-mark-node.js.map +1 -1
  19. package/dist/comments/thread-mark-node.mjs +1 -16
  20. package/dist/comments/thread-mark-node.mjs.map +1 -1
  21. package/dist/create-dom-range.js +63 -0
  22. package/dist/create-dom-range.js.map +1 -0
  23. package/dist/create-dom-range.mjs +61 -0
  24. package/dist/create-dom-range.mjs.map +1 -0
  25. package/dist/create-rects-from-dom-range.js +36 -0
  26. package/dist/create-rects-from-dom-range.js.map +1 -0
  27. package/dist/create-rects-from-dom-range.mjs +34 -0
  28. package/dist/create-rects-from-dom-range.mjs.map +1 -0
  29. package/dist/index.d.mts +113 -0
  30. package/dist/index.d.ts +96 -44
  31. package/dist/index.js +9 -6
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +5 -4
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/liveblocks-config.js +3 -75
  36. package/dist/liveblocks-config.js.map +1 -1
  37. package/dist/liveblocks-config.mjs +4 -56
  38. package/dist/liveblocks-config.mjs.map +1 -1
  39. package/dist/liveblocks-plugin-provider.js +12 -29
  40. package/dist/liveblocks-plugin-provider.js.map +1 -1
  41. package/dist/liveblocks-plugin-provider.mjs +13 -29
  42. package/dist/liveblocks-plugin-provider.mjs.map +1 -1
  43. package/dist/mentions/avatar.js +11 -7
  44. package/dist/mentions/avatar.js.map +1 -1
  45. package/dist/mentions/avatar.mjs +11 -7
  46. package/dist/mentions/avatar.mjs.map +1 -1
  47. package/dist/mentions/mention-component.js +5 -18
  48. package/dist/mentions/mention-component.js.map +1 -1
  49. package/dist/mentions/mention-component.mjs +7 -19
  50. package/dist/mentions/mention-component.mjs.map +1 -1
  51. package/dist/mentions/mention-node.js +77 -74
  52. package/dist/mentions/mention-node.js.map +1 -1
  53. package/dist/mentions/mention-node.mjs +76 -75
  54. package/dist/mentions/mention-node.mjs.map +1 -1
  55. package/dist/mentions/mention-plugin.js +130 -91
  56. package/dist/mentions/mention-plugin.js.map +1 -1
  57. package/dist/mentions/mention-plugin.mjs +119 -76
  58. package/dist/mentions/mention-plugin.mjs.map +1 -1
  59. package/dist/mentions/suggestions.js +34 -6
  60. package/dist/mentions/suggestions.js.map +1 -1
  61. package/dist/mentions/suggestions.mjs +28 -3
  62. package/dist/mentions/suggestions.mjs.map +1 -1
  63. package/dist/mentions/user.js +9 -6
  64. package/dist/mentions/user.js.map +1 -1
  65. package/dist/mentions/user.mjs +9 -6
  66. package/dist/mentions/user.mjs.map +1 -1
  67. package/dist/version.js +1 -1
  68. package/dist/version.js.map +1 -1
  69. package/dist/version.mjs +1 -1
  70. package/dist/version.mjs.map +1 -1
  71. package/package.json +23 -15
  72. package/src/styles/constants.css +1 -0
  73. package/src/styles/index.css +154 -0
  74. package/src/styles/utils.css +6 -0
  75. package/styles.css +1 -0
  76. package/styles.css.d.ts +1 -0
  77. package/styles.css.map +1 -0
  78. package/dist/active-selection.js +0 -143
  79. package/dist/active-selection.js.map +0 -1
  80. package/dist/active-selection.mjs +0 -123
  81. package/dist/active-selection.mjs.map +0 -1
  82. package/dist/floating-selection-container.js +0 -157
  83. package/dist/floating-selection-container.js.map +0 -1
  84. package/dist/floating-selection-container.mjs +0 -155
  85. package/dist/floating-selection-container.mjs.map +0 -1
@@ -1,21 +1,24 @@
1
1
  'use strict';
2
2
 
3
3
  var react = require('@liveblocks/react');
4
+ var reactUi = require('@liveblocks/react-ui');
4
5
  var React = require('react');
6
+ var classnames = require('../classnames.js');
5
7
 
6
8
  const User = React.forwardRef(
7
9
  function User2(props, forwardedRef) {
8
- const { userId, ...spanProps } = props;
9
- const { useUser } = react.useSharedContextBundle();
10
- const { user, isLoading } = useUser(userId);
11
- const name = user === void 0 ? "Anonymous" : user.name;
10
+ const { userId, className, ...spanProps } = props;
11
+ const { user, isLoading } = react.useUser(userId);
12
+ const $ = reactUi.useOverrides();
13
+ const name = user === void 0 || user === null ? $.USER_UNKNOWN : user.name;
12
14
  return /* @__PURE__ */ React.createElement("span", {
13
15
  "data-loading": isLoading ? "" : void 0,
14
16
  ...spanProps,
15
- ref: forwardedRef
17
+ ref: forwardedRef,
18
+ className: classnames.classNames("lb-name lb-user", className)
16
19
  }, isLoading ? null : name);
17
20
  }
18
21
  );
19
22
 
20
- module.exports = User;
23
+ exports.User = User;
21
24
  //# sourceMappingURL=user.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sources":["../../src/mentions/user.tsx"],"sourcesContent":["import { useSharedContextBundle } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport React, { forwardRef } from \"react\";\n\nexport interface UserProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n userId: string;\n}\n\nconst User = forwardRef<HTMLSpanElement, UserProps>(\n function User(props, forwardedRef) {\n const { userId, ...spanProps } = props;\n const { useUser } = useSharedContextBundle();\n\n const { user, isLoading } = useUser(userId);\n\n const name = user === undefined ? \"Anonymous\" : user.name;\n\n return (\n <span\n data-loading={isLoading ? \"\" : undefined}\n {...spanProps}\n ref={forwardedRef}\n >\n {isLoading ? null : name}\n </span>\n );\n }\n);\n\nexport default User;\n"],"names":["forwardRef","User","useSharedContextBundle"],"mappings":";;;;;AASA,MAAM,IAAO,GAAAA,gBAAA;AAAA,EACX,SAASC,KAAK,CAAA,KAAA,EAAO,YAAc,EAAA;AACjC,IAAM,MAAA,EAAE,MAAW,EAAA,GAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AACjC,IAAM,MAAA,EAAE,OAAQ,EAAA,GAAIC,4BAAuB,EAAA,CAAA;AAE3C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAU,EAAA,GAAI,QAAQ,MAAM,CAAA,CAAA;AAE1C,IAAA,MAAM,IAAO,GAAA,IAAA,KAAS,KAAY,CAAA,GAAA,WAAA,GAAc,IAAK,CAAA,IAAA,CAAA;AAErD,IAAA,uBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,MACC,cAAA,EAAc,YAAY,EAAK,GAAA,KAAA,CAAA;AAAA,MAC9B,GAAG,SAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,KAEJ,EAAA,SAAA,GAAY,OAAO,IACtB,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"user.js","sources":["../../src/mentions/user.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport { useOverrides } from \"@liveblocks/react-ui\";\nimport type { HTMLAttributes } from \"react\";\nimport React, { forwardRef } from \"react\";\n\nimport { classNames } from \"../classnames\";\n\nexport interface UserProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n userId: string;\n}\n\nexport const User = forwardRef<HTMLSpanElement, UserProps>(\n function User(props, forwardedRef) {\n const { userId, className, ...spanProps } = props;\n\n const { user, isLoading } = useUser(userId);\n const $ = useOverrides();\n\n const name =\n user === undefined || user === null ? $.USER_UNKNOWN : user.name;\n\n return (\n <span\n data-loading={isLoading ? \"\" : undefined}\n {...spanProps}\n ref={forwardedRef}\n className={classNames(\"lb-name lb-user\", className)}\n >\n {isLoading ? null : name}\n </span>\n );\n }\n);\n"],"names":["forwardRef","User","useUser","useOverrides","classNames"],"mappings":";;;;;;;AAYO,MAAM,IAAO,GAAAA,gBAAA;AAAA,EAClB,SAASC,KAAK,CAAA,KAAA,EAAO,YAAc,EAAA;AACjC,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAc,EAAA,GAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AAE5C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAU,EAAA,GAAIC,cAAQ,MAAM,CAAA,CAAA;AAC1C,IAAA,MAAM,IAAIC,oBAAa,EAAA,CAAA;AAEvB,IAAA,MAAM,OACJ,IAAS,KAAA,KAAA,CAAA,IAAa,SAAS,IAAO,GAAA,CAAA,CAAE,eAAe,IAAK,CAAA,IAAA,CAAA;AAE9D,IAAA,uBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,MACC,cAAA,EAAc,YAAY,EAAK,GAAA,KAAA,CAAA;AAAA,MAC9B,GAAG,SAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,MACL,SAAA,EAAWC,qBAAW,CAAA,iBAAA,EAAmB,SAAS,CAAA;AAAA,KAEjD,EAAA,SAAA,GAAY,OAAO,IACtB,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,19 +1,22 @@
1
- import { useSharedContextBundle } from '@liveblocks/react';
1
+ import { useUser } from '@liveblocks/react';
2
+ import { useOverrides } from '@liveblocks/react-ui';
2
3
  import React__default, { forwardRef } from 'react';
4
+ import { classNames } from '../classnames.mjs';
3
5
 
4
6
  const User = forwardRef(
5
7
  function User2(props, forwardedRef) {
6
- const { userId, ...spanProps } = props;
7
- const { useUser } = useSharedContextBundle();
8
+ const { userId, className, ...spanProps } = props;
8
9
  const { user, isLoading } = useUser(userId);
9
- const name = user === void 0 ? "Anonymous" : user.name;
10
+ const $ = useOverrides();
11
+ const name = user === void 0 || user === null ? $.USER_UNKNOWN : user.name;
10
12
  return /* @__PURE__ */ React__default.createElement("span", {
11
13
  "data-loading": isLoading ? "" : void 0,
12
14
  ...spanProps,
13
- ref: forwardedRef
15
+ ref: forwardedRef,
16
+ className: classNames("lb-name lb-user", className)
14
17
  }, isLoading ? null : name);
15
18
  }
16
19
  );
17
20
 
18
- export { User as default };
21
+ export { User };
19
22
  //# sourceMappingURL=user.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.mjs","sources":["../../src/mentions/user.tsx"],"sourcesContent":["import { useSharedContextBundle } from \"@liveblocks/react\";\nimport type { HTMLAttributes } from \"react\";\nimport React, { forwardRef } from \"react\";\n\nexport interface UserProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n userId: string;\n}\n\nconst User = forwardRef<HTMLSpanElement, UserProps>(\n function User(props, forwardedRef) {\n const { userId, ...spanProps } = props;\n const { useUser } = useSharedContextBundle();\n\n const { user, isLoading } = useUser(userId);\n\n const name = user === undefined ? \"Anonymous\" : user.name;\n\n return (\n <span\n data-loading={isLoading ? \"\" : undefined}\n {...spanProps}\n ref={forwardedRef}\n >\n {isLoading ? null : name}\n </span>\n );\n }\n);\n\nexport default User;\n"],"names":["User","React"],"mappings":";;;AASA,MAAM,IAAO,GAAA,UAAA;AAAA,EACX,SAASA,KAAK,CAAA,KAAA,EAAO,YAAc,EAAA;AACjC,IAAM,MAAA,EAAE,MAAW,EAAA,GAAA,SAAA,EAAc,GAAA,KAAA,CAAA;AACjC,IAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,sBAAuB,EAAA,CAAA;AAE3C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAU,EAAA,GAAI,QAAQ,MAAM,CAAA,CAAA;AAE1C,IAAA,MAAM,IAAO,GAAA,IAAA,KAAS,KAAY,CAAA,GAAA,WAAA,GAAc,IAAK,CAAA,IAAA,CAAA;AAErD,IAAA,uBACGC,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,MACC,cAAA,EAAc,YAAY,EAAK,GAAA,KAAA,CAAA;AAAA,MAC9B,GAAG,SAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,KAEJ,EAAA,SAAA,GAAY,OAAO,IACtB,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"user.mjs","sources":["../../src/mentions/user.tsx"],"sourcesContent":["import { useUser } from \"@liveblocks/react\";\nimport { useOverrides } from \"@liveblocks/react-ui\";\nimport type { HTMLAttributes } from \"react\";\nimport React, { forwardRef } from \"react\";\n\nimport { classNames } from \"../classnames\";\n\nexport interface UserProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n userId: string;\n}\n\nexport const User = forwardRef<HTMLSpanElement, UserProps>(\n function User(props, forwardedRef) {\n const { userId, className, ...spanProps } = props;\n\n const { user, isLoading } = useUser(userId);\n const $ = useOverrides();\n\n const name =\n user === undefined || user === null ? $.USER_UNKNOWN : user.name;\n\n return (\n <span\n data-loading={isLoading ? \"\" : undefined}\n {...spanProps}\n ref={forwardedRef}\n className={classNames(\"lb-name lb-user\", className)}\n >\n {isLoading ? null : name}\n </span>\n );\n }\n);\n"],"names":["User","React"],"mappings":";;;;;AAYO,MAAM,IAAO,GAAA,UAAA;AAAA,EAClB,SAASA,KAAK,CAAA,KAAA,EAAO,YAAc,EAAA;AACjC,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;AAC1C,IAAA,MAAM,IAAI,YAAa,EAAA,CAAA;AAEvB,IAAA,MAAM,OACJ,IAAS,KAAA,KAAA,CAAA,IAAa,SAAS,IAAO,GAAA,CAAA,CAAE,eAAe,IAAK,CAAA,IAAA,CAAA;AAE9D,IAAA,uBACGC,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,MACC,cAAA,EAAc,YAAY,EAAK,GAAA,KAAA,CAAA;AAAA,MAC9B,GAAG,SAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,MACL,SAAA,EAAW,UAAW,CAAA,iBAAA,EAAmB,SAAS,CAAA;AAAA,KAEjD,EAAA,SAAA,GAAY,OAAO,IACtB,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/react-lexical";
4
- const PKG_VERSION = typeof "1.12.0-lexical4" === "string" && "1.12.0-lexical4";
4
+ const PKG_VERSION = typeof "2.0.0-alpha2" === "string" && "2.0.0-alpha2";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"],"names":[],"mappings":";;AAGO,MAAM,QAAW,GAAA,4BAAA;AACX,MAAA,WAAA,GAAc,OAAO,iBAAA,KAAgB,QAAY,IAAA,kBAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAgB,QAAY,IAAA;;;;;;"}
1
+ {"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"],"names":[],"mappings":";;AAGO,MAAM,QAAW,GAAA,4BAAA;AACX,MAAA,WAAA,GAAc,OAAO,cAAA,KAAgB,QAAY,IAAA,eAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAgB,QAAY,IAAA;;;;;;"}
package/dist/version.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/react-lexical";
2
- const PKG_VERSION = typeof "1.12.0-lexical4" === "string" && "1.12.0-lexical4";
2
+ const PKG_VERSION = typeof "2.0.0-alpha2" === "string" && "2.0.0-alpha2";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
@@ -1 +1 @@
1
- {"version":3,"file":"version.mjs","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"],"names":[],"mappings":"AAGO,MAAM,QAAW,GAAA,4BAAA;AACX,MAAA,WAAA,GAAc,OAAO,iBAAA,KAAgB,QAAY,IAAA,kBAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAgB,QAAY,IAAA;;;;"}
1
+ {"version":3,"file":"version.mjs","sources":["../src/version.ts"],"sourcesContent":["declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/react-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"],"names":[],"mappings":"AAGO,MAAM,QAAW,GAAA,4BAAA;AACX,MAAA,WAAA,GAAc,OAAO,cAAA,KAAgB,QAAY,IAAA,eAAA;AACjD,MAAA,UAAA,GAAa,OAAO,KAAA,KAAgB,QAAY,IAAA;;;;"}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@liveblocks/react-lexical",
3
- "version": "1.12.0-lexical4",
3
+ "version": "2.0.0-alpha2",
4
4
  "description": "A lexical react plugin to enable collaboration, comments, live cursors, and more.",
5
5
  "license": "Apache-2.0",
6
+ "type": "commonjs",
6
7
  "main": "./dist/index.js",
7
8
  "types": "./dist/index.d.ts",
8
9
  "exports": {
@@ -17,39 +18,47 @@
17
18
  "default": "./dist/index.js"
18
19
  }
19
20
  },
20
- "./styles.css": "./styles.css"
21
+ "./styles.css": {
22
+ "types": "./styles.css.d.ts",
23
+ "default": "./styles.css"
24
+ }
21
25
  },
22
26
  "files": [
23
27
  "dist/**",
28
+ "**/*.css",
29
+ "**/*.css.d.ts",
30
+ "**/*.css.map",
24
31
  "README.md"
25
32
  ],
26
33
  "scripts": {
27
34
  "dev": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript --watch",
28
35
  "build": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript",
29
- "start": "npm run dev",
30
36
  "format": "eslint --fix src/; stylelint --fix src/styles/; prettier --write src/",
31
37
  "lint": "eslint src/; stylelint src/styles/",
38
+ "lint:package": "publint --strict && attw --pack",
39
+ "start": "npm run dev",
32
40
  "test": "jest --silent --verbose --color=always",
33
41
  "test:watch": "jest --silent --verbose --color=always --watch"
34
42
  },
35
43
  "dependencies": {
36
- "@liveblocks/client": "1.12.0-lexical4",
37
- "@liveblocks/core": "1.12.0-lexical4",
38
- "@liveblocks/react": "1.12.0-lexical4",
39
- "@liveblocks/react-comments": "1.12.0-lexical4",
40
- "@liveblocks/yjs": "1.12.0-lexical4",
44
+ "@floating-ui/react-dom": "^2.1.0",
45
+ "@liveblocks/client": "2.0.0-alpha2",
46
+ "@liveblocks/core": "2.0.0-alpha2",
47
+ "@liveblocks/react": "2.0.0-alpha2",
48
+ "@liveblocks/react-ui": "2.0.0-alpha2",
49
+ "@liveblocks/yjs": "2.0.0-alpha2",
50
+ "nanoid": "^3",
41
51
  "use-sync-external-store": "^1.2.2",
42
52
  "yjs": "^13.6.14"
43
53
  },
44
54
  "peerDependencies": {
45
- "@lexical/react": "^0.10.0",
46
- "@lexical/selection": "^0.14.3",
47
- "@lexical/utils": "^0.14.3",
48
- "lexical": "^0.10.0",
49
- "react": "^16.14.0 || ^17 || ^18"
55
+ "@lexical/react": "^0.16.0",
56
+ "@lexical/utils": "^0.16.0",
57
+ "lexical": "^0.16.0",
58
+ "react": "^16.14.0 || ^17 || ^18",
59
+ "react-dom": "^16.14.0 || ^17 || ^18"
50
60
  },
51
61
  "devDependencies": {
52
- "@lexical/react": "^0.14.2",
53
62
  "@liveblocks/eslint-config": "*",
54
63
  "@liveblocks/jest-config": "*",
55
64
  "@rollup/plugin-node-resolve": "^15.2.3",
@@ -59,7 +68,6 @@
59
68
  "@types/use-sync-external-store": "^0.0.6",
60
69
  "eslint-plugin-react": "^7.33.2",
61
70
  "eslint-plugin-react-hooks": "^4.6.0",
62
- "lexical": "^0.14.2",
63
71
  "msw": "^0.27.1",
64
72
  "rollup": "^3.28.0",
65
73
  "rollup-plugin-dts": "^5.3.1",
@@ -0,0 +1 @@
1
+ $lb-elevation-list-padding: 4px;
@@ -0,0 +1,154 @@
1
+ @import "./utils";
2
+ @import "./constants";
3
+
4
+ .lb-lexical-threads-empty {
5
+ display: flex;
6
+ justify-content: center;
7
+ align-items: center;
8
+ block-size: max-content;
9
+ color: rgb(55 53 47 / 50%);
10
+ }
11
+
12
+ .lb-lexical-threads {
13
+ display: flex;
14
+ flex-direction: column;
15
+ }
16
+
17
+ /*************************************
18
+ * Suggestions *
19
+ *************************************/
20
+
21
+ .lb-lexical-suggestions-list {
22
+ margin: 0;
23
+ padding: 0;
24
+ list-style: none;
25
+ }
26
+
27
+ /*************************************
28
+ * Mention suggestions *
29
+ *************************************/
30
+
31
+ .lb-lexical-mention-suggestions {
32
+ --lb-lexical-mention-suggestion-avatar-size: 1.25rem;
33
+ }
34
+
35
+ .lb-lexical-mention-suggestion {
36
+ padding: calc(0.375 * var(--lb-spacing)) calc(0.625 * var(--lb-spacing));
37
+ }
38
+
39
+ .lb-lexical-mention-suggestion-avatar {
40
+ inline-size: var(--lb-lexical-mention-suggestion-avatar-size);
41
+ margin-inline-start: calc(-0.125 * var(--lb-spacing));
42
+ margin-inline-end: calc(0.5 * var(--lb-spacing));
43
+ margin-block: calc(0.125 * var(--lb-spacing));
44
+ background: var(--lb-foreground-subtle);
45
+ color: var(--lb-foreground-moderate);
46
+ }
47
+
48
+ /*************************************
49
+ * Elevation lists *
50
+ *************************************/
51
+
52
+ .lb-lexical-suggestions {
53
+ padding: $lb-elevation-list-padding;
54
+ animation-duration: var(--lb-transition-duration);
55
+ animation-timing-function: var(--lb-transition-easing);
56
+ will-change: transform, opacity;
57
+ }
58
+
59
+ .lb-lexical-suggestions-list-item {
60
+ display: flex;
61
+ align-items: center;
62
+ padding: calc(0.25 * var(--lb-spacing)) calc(0.5 * var(--lb-spacing));
63
+ border-radius: calc(var(--lb-radius) - 0.75 * $lb-elevation-list-padding);
64
+ color: var(--lb-foreground-secondary);
65
+ outline: none;
66
+ font-size: 0.875rem;
67
+ cursor: pointer;
68
+ user-select: none;
69
+ transition-property: background, color, opacity;
70
+ scroll-margin-block: $lb-elevation-list-padding;
71
+ }
72
+
73
+ :is(.lb-lexical-suggestions-list-item) {
74
+ &:where([data-highlighted], [data-selected]) {
75
+ background: var(--lb-foreground-subtle);
76
+ transition-duration: calc(var(--lb-transition-duration) / 2);
77
+ }
78
+
79
+ &:where(:disabled, [data-disabled]) {
80
+ opacity: 0.5;
81
+ cursor: not-allowed;
82
+ }
83
+ }
84
+
85
+ /*************************************
86
+ * Floating animations *
87
+ *************************************/
88
+
89
+ :is(.lb-lexical-suggestions) {
90
+ &:where([data-side="top"]) {
91
+ animation-name: lb-animation-slide-up;
92
+ }
93
+
94
+ &:where([data-side="bottom"]) {
95
+ animation-name: lb-animation-slide-down;
96
+ }
97
+
98
+ &:where([data-state="closed"]) {
99
+ animation-name: lb-animation-disappear;
100
+ }
101
+ }
102
+
103
+ @media (prefers-reduced-motion) {
104
+ .lb-lexical-suggestions:where(:not([data-state="closed"])) {
105
+ animation-name: lb-animation-appear;
106
+ }
107
+ }
108
+
109
+ /*************************************
110
+ * Mention *
111
+ *************************************/
112
+
113
+ .lb-lexical-mention {
114
+ padding: 0.1em 0.3em;
115
+ border-radius: calc(0.675 * var(--lb-radius));
116
+ background: var(--lb-accent-subtle);
117
+ color: var(--lb-accent);
118
+ box-decoration-break: clone;
119
+ font-weight: 500;
120
+
121
+ @include invisible-selection;
122
+
123
+ &:where([data-selected]) {
124
+ background: var(--lb-accent);
125
+ color: var(--lb-accent-foreground);
126
+ }
127
+ }
128
+
129
+ /*************************************
130
+ * Active selection *
131
+ *************************************/
132
+
133
+ .lb-lexical-active-selection {
134
+ background-color: var(--lb-selection);
135
+ }
136
+
137
+ /*************************************
138
+ * Thread Mark *
139
+ *************************************/
140
+
141
+ .lb-thread-mark {
142
+ color: var(--lb-foreground);
143
+ outline: none;
144
+ font-weight: 500;
145
+ transition-property: color, text-decoration-color;
146
+ text-decoration-line: underline;
147
+ text-decoration-color: var(--lb-foreground-moderate);
148
+ text-underline-offset: 2px;
149
+
150
+ &:where([data-state="active"]) {
151
+ color: var(--lb-accent);
152
+ text-decoration-color: var(--lb-accent-moderate);
153
+ }
154
+ }
@@ -0,0 +1,6 @@
1
+ @mixin invisible-selection {
2
+ &::selection,
3
+ *::selection {
4
+ background: transparent;
5
+ }
6
+ }
package/styles.css ADDED
@@ -0,0 +1 @@
1
+ .lb-lexical-threads-empty{color:#37352f80;justify-content:center;align-items:center;block-size:max-content;display:flex}.lb-lexical-threads{flex-direction:column;display:flex}.lb-lexical-suggestions-list{margin:0;padding:0;list-style:none}.lb-lexical-mention-suggestions{--lb-lexical-mention-suggestion-avatar-size:1.25rem}.lb-lexical-mention-suggestion{padding:calc(.375*var(--lb-spacing))calc(.625*var(--lb-spacing))}.lb-lexical-mention-suggestion-avatar{inline-size:var(--lb-lexical-mention-suggestion-avatar-size);margin-inline-start:calc(-.125*var(--lb-spacing));margin-inline-end:calc(.5*var(--lb-spacing));margin-block:calc(.125*var(--lb-spacing));background:var(--lb-foreground-subtle);color:var(--lb-foreground-moderate)}.lb-lexical-suggestions{animation-duration:var(--lb-transition-duration);animation-timing-function:var(--lb-transition-easing);will-change:transform,opacity;padding:4px}.lb-lexical-suggestions-list-item{padding:calc(.25*var(--lb-spacing))calc(.5*var(--lb-spacing));border-radius:calc(var(--lb-radius) - .75*4px);color:var(--lb-foreground-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;outline:none;align-items:center;scroll-margin-block:4px;font-size:.875rem;transition-property:background,color,opacity;display:flex}.lb-lexical-suggestions-list-item:where([data-highlighted],[data-selected]){background:var(--lb-foreground-subtle);transition-duration:calc(var(--lb-transition-duration)/2)}.lb-lexical-suggestions-list-item:where(:disabled,[data-disabled]){opacity:.5;cursor:not-allowed}.lb-lexical-suggestions:where([data-side=top]){animation-name:lb-animation-slide-up}.lb-lexical-suggestions:where([data-side=bottom]){animation-name:lb-animation-slide-down}.lb-lexical-suggestions:where([data-state=closed]){animation-name:lb-animation-disappear}.lb-lexical-mention{border-radius:calc(.675*var(--lb-radius));background:var(--lb-accent-subtle);color:var(--lb-accent);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.1em .3em;font-weight:500}.lb-lexical-mention::selection{background:0 0}.lb-lexical-mention ::selection{background:0 0}.lb-lexical-mention:where([data-selected]){background:var(--lb-accent);color:var(--lb-accent-foreground)}.lb-lexical-active-selection{background-color:var(--lb-selection)}.lb-thread-mark{color:var(--lb-foreground);text-decoration-line:underline;-webkit-text-decoration-color:var(--lb-foreground-moderate);text-decoration-color:var(--lb-foreground-moderate);text-underline-offset:2px;outline:none;font-weight:500;transition-property:color,text-decoration-color}.lb-thread-mark:where([data-state=active]){color:var(--lb-accent);-webkit-text-decoration-color:var(--lb-accent-moderate);text-decoration-color:var(--lb-accent-moderate)}@media (prefers-reduced-motion){.lb-lexical-suggestions:where(:not([data-state=closed])){animation-name:lb-animation-appear}}
@@ -0,0 +1 @@
1
+ declare module "@liveblocks/react-lexical/styles.css";
package/styles.css.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["src/styles/src/styles/index.css","src/styles/src/styles/utils.css"],"names":[],"mappings":"AAGA,0BAAA,eAAA,CAAA,sBAAA,CAAA,kBAAA,CAAA,sBAAA,CAAA,YAAA,CAQA,oBAAA,qBAAA,CAAA,YAAA,CASA,6BAAA,QAAA,CAAA,SAAA,CAAA,eAAA,CAUA,gCAAA,mDAAA,CAIA,+BAAA,gEAAA,CAIA,sCAAA,4DAAA,CAAA,iDAAA,CAAA,4CAAA,CAAA,yCAAA,CAAA,sCAAA,CAAA,mCAAA,CAaA,wBAAA,gDAAA,CAAA,qDAAA,CAAA,6BAAA,CAAA,WAAA,CAOA,kCAAA,6DAAA,CAAA,8CAAA,CAAA,oCAAA,CAAA,cAAA,CAAA,wBAAA,CAAA,gBAAA,CAAA,YAAA,CAAA,kBAAA,CAAA,uBAAA,CAAA,iBAAA,CAAA,4CAAA,CAAA,YAAA,CAeE,4EAAA,sCAAA,CAAA,yDAAA,CAKA,mEAAA,UAAA,CAAA,kBAAA,CAWA,+CAAA,oCAAA,CAIA,kDAAA,sCAAA,CAIA,mDAAA,qCAAA,CAeF,oBAAA,yCAAA,CAAA,kCAAA,CAAA,sBAAA,CAAA,kCAAA,CAAA,0BAAA,CAAA,iBAAA,CAAA,eAAA,CC/GE,+BAAA,cAAA,CAAA,gCAAA,cAAA,CDyHA,2CAAA,2BAAA,CAAA,iCAAA,CAUF,6BAAA,oCAAA,CAQA,gBAAA,0BAAA,CAAA,8BAAA,CAAA,2DAAA,CAAA,mDAAA,CAAA,yBAAA,CAAA,YAAA,CAAA,eAAA,CAAA,+CAAA,CASE,2CAAA,sBAAA,CAAA,uDAAA,CAAA,+CAAA,CA/CF,gCACE,yDAAA,kCAAA,CAAA","file":"styles.css","sourcesContent":["@import \"./utils\";\n@import \"./constants\";\n\n.lb-lexical-threads-empty {\n display: flex;\n justify-content: center;\n align-items: center;\n block-size: max-content;\n color: rgb(55 53 47 / 50%);\n}\n\n.lb-lexical-threads {\n display: flex;\n flex-direction: column;\n}\n\n/*************************************\n * Suggestions *\n *************************************/\n\n.lb-lexical-suggestions-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n/*************************************\n * Mention suggestions *\n *************************************/\n\n.lb-lexical-mention-suggestions {\n --lb-lexical-mention-suggestion-avatar-size: 1.25rem;\n}\n\n.lb-lexical-mention-suggestion {\n padding: calc(0.375 * var(--lb-spacing)) calc(0.625 * var(--lb-spacing));\n}\n\n.lb-lexical-mention-suggestion-avatar {\n inline-size: var(--lb-lexical-mention-suggestion-avatar-size);\n margin-inline-start: calc(-0.125 * var(--lb-spacing));\n margin-inline-end: calc(0.5 * var(--lb-spacing));\n margin-block: calc(0.125 * var(--lb-spacing));\n background: var(--lb-foreground-subtle);\n color: var(--lb-foreground-moderate);\n}\n\n/*************************************\n * Elevation lists *\n *************************************/\n\n.lb-lexical-suggestions {\n padding: $lb-elevation-list-padding;\n animation-duration: var(--lb-transition-duration);\n animation-timing-function: var(--lb-transition-easing);\n will-change: transform, opacity;\n}\n\n.lb-lexical-suggestions-list-item {\n display: flex;\n align-items: center;\n padding: calc(0.25 * var(--lb-spacing)) calc(0.5 * var(--lb-spacing));\n border-radius: calc(var(--lb-radius) - 0.75 * $lb-elevation-list-padding);\n color: var(--lb-foreground-secondary);\n outline: none;\n font-size: 0.875rem;\n cursor: pointer;\n user-select: none;\n transition-property: background, color, opacity;\n scroll-margin-block: $lb-elevation-list-padding;\n}\n\n:is(.lb-lexical-suggestions-list-item) {\n &:where([data-highlighted], [data-selected]) {\n background: var(--lb-foreground-subtle);\n transition-duration: calc(var(--lb-transition-duration) / 2);\n }\n\n &:where(:disabled, [data-disabled]) {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n/*************************************\n * Floating animations *\n *************************************/\n\n:is(.lb-lexical-suggestions) {\n &:where([data-side=\"top\"]) {\n animation-name: lb-animation-slide-up;\n }\n\n &:where([data-side=\"bottom\"]) {\n animation-name: lb-animation-slide-down;\n }\n\n &:where([data-state=\"closed\"]) {\n animation-name: lb-animation-disappear;\n }\n}\n\n@media (prefers-reduced-motion) {\n .lb-lexical-suggestions:where(:not([data-state=\"closed\"])) {\n animation-name: lb-animation-appear;\n }\n}\n\n/*************************************\n * Mention *\n *************************************/\n\n.lb-lexical-mention {\n padding: 0.1em 0.3em;\n border-radius: calc(0.675 * var(--lb-radius));\n background: var(--lb-accent-subtle);\n color: var(--lb-accent);\n box-decoration-break: clone;\n font-weight: 500;\n\n @include invisible-selection;\n\n &:where([data-selected]) {\n background: var(--lb-accent);\n color: var(--lb-accent-foreground);\n }\n}\n\n/*************************************\n * Active selection *\n *************************************/\n\n.lb-lexical-active-selection {\n background-color: var(--lb-selection);\n}\n\n/*************************************\n * Thread Mark *\n *************************************/\n\n.lb-thread-mark {\n color: var(--lb-foreground);\n outline: none;\n font-weight: 500;\n transition-property: color, text-decoration-color;\n text-decoration-line: underline;\n text-decoration-color: var(--lb-foreground-moderate);\n text-underline-offset: 2px;\n\n &:where([data-state=\"active\"]) {\n color: var(--lb-accent);\n text-decoration-color: var(--lb-accent-moderate);\n }\n}\n","@mixin invisible-selection {\n &::selection,\n *::selection {\n background: transparent;\n }\n}\n"]}
@@ -1,143 +0,0 @@
1
- 'use strict';
2
-
3
- var LexicalComposerContext = require('@lexical/react/LexicalComposerContext');
4
- var selection = require('@lexical/selection');
5
- var lexical = require('lexical');
6
- var React = require('react');
7
- var reactDom = require('react-dom');
8
- var index_js = require('use-sync-external-store/shim/index.js');
9
-
10
- function _interopNamespaceDefault(e) {
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n.default = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
28
-
29
- function ActiveSelection({ styles }) {
30
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
31
- const selection = useSelection();
32
- if (selection === null)
33
- return null;
34
- const info = editor.getEditorState().read(() => {
35
- return {
36
- anchor: {
37
- node: selection.anchor.getNode(),
38
- offset: selection.anchor.offset
39
- },
40
- focus: {
41
- node: selection.focus.getNode(),
42
- offset: selection.focus.offset
43
- }
44
- };
45
- });
46
- const root = editor.getRootElement();
47
- if (root === null)
48
- return null;
49
- const rootContainer = root.parentElement;
50
- if (rootContainer === null)
51
- return null;
52
- return reactDom.createPortal(
53
- /* @__PURE__ */ React__namespace.createElement(SelectionRects, {
54
- selection: info,
55
- styles
56
- }),
57
- rootContainer
58
- );
59
- }
60
- function SelectionRects({
61
- selection: selection$1,
62
- styles = {}
63
- }) {
64
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
65
- const divRef = React.useRef(null);
66
- React.useLayoutEffect(() => {
67
- const container = divRef.current;
68
- if (container === null)
69
- return;
70
- function drawSelectionRects() {
71
- if (container === null)
72
- return;
73
- while (container.firstChild) {
74
- container.removeChild(container.firstChild);
75
- }
76
- const range = selection.createDOMRange(
77
- editor,
78
- selection$1.anchor.node,
79
- selection$1.anchor.offset,
80
- selection$1.focus.node,
81
- selection$1.focus.offset
82
- );
83
- if (range === null)
84
- return;
85
- const rects = selection.createRectsFromDOMRange(editor, range);
86
- for (const rect of rects) {
87
- const div = document.createElement("div");
88
- Object.assign(div.style, {
89
- backgroundColor: "rgba(255, 212, 0, 0.14)",
90
- ...styles,
91
- position: "absolute",
92
- top: `${rect.top - container.getBoundingClientRect().top}px`,
93
- left: `${rect.left - container.getBoundingClientRect().left}px`,
94
- width: `${rect.width}px`,
95
- height: `${rect.height}px`,
96
- pointerEvents: "none"
97
- });
98
- container.appendChild(div);
99
- }
100
- }
101
- const observer = new ResizeObserver(drawSelectionRects);
102
- observer.observe(container);
103
- const unsubscribeFromUpdates = editor.registerUpdateListener(drawSelectionRects);
104
- return () => {
105
- observer.disconnect();
106
- unsubscribeFromUpdates();
107
- };
108
- }, [selection$1, editor, styles]);
109
- return /* @__PURE__ */ React__namespace.createElement("div", {
110
- ref: divRef,
111
- style: {
112
- position: "absolute",
113
- top: 0,
114
- left: 0,
115
- width: "100%",
116
- height: "100%",
117
- pointerEvents: "none"
118
- }
119
- });
120
- }
121
- function useSelection() {
122
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
123
- const subscribe = React.useCallback(
124
- (onStoreChange) => {
125
- return editor.registerUpdateListener(onStoreChange);
126
- },
127
- [editor]
128
- );
129
- const getSnapshot = React.useCallback(() => {
130
- return editor.getEditorState().read(() => {
131
- const selection = lexical.$getSelection();
132
- if (!lexical.$isRangeSelection(selection))
133
- return null;
134
- if (selection.isCollapsed())
135
- return null;
136
- return selection;
137
- });
138
- }, [editor]);
139
- return index_js.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
140
- }
141
-
142
- exports.ActiveSelection = ActiveSelection;
143
- //# sourceMappingURL=active-selection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"active-selection.js","sources":["../src/active-selection.tsx"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { createDOMRange, createRectsFromDOMRange } from \"@lexical/selection\";\nimport type { LexicalNode, RangeSelection } from \"lexical\";\nimport { $getSelection, $isRangeSelection } from \"lexical\";\nimport * as React from \"react\";\nimport { useCallback, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim/index.js\";\n\ninterface ActiveSelectionProps {\n styles?: Partial<CSSStyleDeclaration>;\n}\n\nexport function ActiveSelection({ styles }: ActiveSelectionProps) {\n const [editor] = useLexicalComposerContext();\n const selection = useSelection();\n if (selection === null) return null;\n\n const info = editor.getEditorState().read(() => {\n return {\n anchor: {\n node: selection.anchor.getNode(),\n offset: selection.anchor.offset,\n },\n focus: {\n node: selection.focus.getNode(),\n offset: selection.focus.offset,\n },\n };\n });\n\n const root = editor.getRootElement();\n if (root === null) return null;\n\n const rootContainer = root.parentElement;\n if (rootContainer === null) return null;\n\n return createPortal(\n <SelectionRects selection={info} styles={styles} />,\n rootContainer\n );\n}\n\nfunction SelectionRects({\n selection,\n styles = {},\n}: {\n selection: SelectionInfo;\n styles?: Partial<CSSStyleDeclaration>;\n}) {\n const [editor] = useLexicalComposerContext();\n\n const divRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = divRef.current;\n if (container === null) return;\n\n function drawSelectionRects() {\n if (container === null) return;\n\n // Remove all existing children of the container\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n\n const range = createDOMRange(\n editor,\n selection.anchor.node,\n selection.anchor.offset,\n selection.focus.node,\n selection.focus.offset\n );\n\n if (range === null) return;\n const rects = createRectsFromDOMRange(editor, range);\n\n for (const rect of rects) {\n const div = document.createElement(\"div\");\n\n Object.assign(div.style, {\n backgroundColor: \"rgba(255, 212, 0, 0.14)\",\n ...styles,\n position: \"absolute\",\n top: `${rect.top - container.getBoundingClientRect().top}px`,\n left: `${rect.left - container.getBoundingClientRect().left}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n pointerEvents: \"none\",\n });\n\n container.appendChild(div);\n }\n }\n\n // Observe resizes of the container element to redraw the selection\n const observer = new ResizeObserver(drawSelectionRects);\n\n observer.observe(container);\n\n // Listen to updates in the editor to redraw the selection\n const unsubscribeFromUpdates =\n editor.registerUpdateListener(drawSelectionRects);\n\n return () => {\n observer.disconnect();\n unsubscribeFromUpdates();\n };\n }, [selection, editor, styles]);\n\n return (\n <div\n ref={divRef}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n }}\n />\n );\n}\n\ntype SelectionInfo = {\n anchor: {\n node: LexicalNode;\n offset: number;\n };\n focus: {\n node: LexicalNode;\n offset: number;\n };\n};\n\nfunction useSelection(): RangeSelection | null {\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(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return null;\n\n if (selection.isCollapsed()) return null;\n\n return selection;\n });\n }, [editor]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"names":["useLexicalComposerContext","createPortal","React","selection","useRef","useLayoutEffect","createDOMRange","createRectsFromDOMRange","useCallback","$getSelection","$isRangeSelection","useSyncExternalStore"],"mappings":"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"}