@liveblocks/react-lexical 2.18.3 → 2.18.4-uns2

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 (135) hide show
  1. package/dist/{classnames.mjs → classnames.cjs} +4 -2
  2. package/dist/{classnames.mjs.map → classnames.cjs.map} +1 -1
  3. package/dist/classnames.js +1 -3
  4. package/dist/classnames.js.map +1 -1
  5. package/dist/comments/{anchored-threads.mjs → anchored-threads.cjs} +44 -41
  6. package/dist/comments/{anchored-threads.mjs.map → anchored-threads.cjs.map} +1 -1
  7. package/dist/comments/anchored-threads.js +40 -43
  8. package/dist/comments/anchored-threads.js.map +1 -1
  9. package/dist/comments/{comment-plugin-provider.mjs → comment-plugin-provider.cjs} +62 -55
  10. package/dist/comments/{comment-plugin-provider.mjs.map → comment-plugin-provider.cjs.map} +1 -1
  11. package/dist/comments/comment-plugin-provider.js +54 -61
  12. package/dist/comments/comment-plugin-provider.js.map +1 -1
  13. package/dist/comments/{floating-composer.mjs → floating-composer.cjs} +68 -64
  14. package/dist/comments/{floating-composer.mjs.map → floating-composer.cjs.map} +1 -1
  15. package/dist/comments/floating-composer.js +63 -67
  16. package/dist/comments/floating-composer.js.map +1 -1
  17. package/dist/comments/{floating-threads.mjs → floating-threads.cjs} +51 -48
  18. package/dist/comments/{floating-threads.mjs.map → floating-threads.cjs.map} +1 -1
  19. package/dist/comments/floating-threads.js +47 -50
  20. package/dist/comments/floating-threads.js.map +1 -1
  21. package/dist/comments/get-thread-mark-ids.cjs +23 -0
  22. package/dist/comments/{get-thread-mark-ids.mjs.map → get-thread-mark-ids.cjs.map} +1 -1
  23. package/dist/comments/get-thread-mark-ids.js +6 -8
  24. package/dist/comments/get-thread-mark-ids.js.map +1 -1
  25. package/dist/comments/{thread-mark-node.mjs → thread-mark-node.cjs} +10 -6
  26. package/dist/comments/{thread-mark-node.mjs.map → thread-mark-node.cjs.map} +1 -1
  27. package/dist/comments/thread-mark-node.js +5 -9
  28. package/dist/comments/thread-mark-node.js.map +1 -1
  29. package/dist/comments/{unwrap-thread-mark-node.mjs → unwrap-thread-mark-node.cjs} +4 -2
  30. package/dist/comments/unwrap-thread-mark-node.cjs.map +1 -0
  31. package/dist/comments/unwrap-thread-mark-node.js +1 -3
  32. package/dist/comments/unwrap-thread-mark-node.js.map +1 -1
  33. package/dist/comments/{wrap-selection-in-thread-mark-node.mjs → wrap-selection-in-thread-mark-node.cjs} +12 -10
  34. package/dist/comments/{wrap-selection-in-thread-mark-node.mjs.map → wrap-selection-in-thread-mark-node.cjs.map} +1 -1
  35. package/dist/comments/wrap-selection-in-thread-mark-node.js +9 -11
  36. package/dist/comments/wrap-selection-in-thread-mark-node.js.map +1 -1
  37. package/dist/{create-dom-range.mjs → create-dom-range.cjs} +7 -5
  38. package/dist/{create-dom-range.mjs.map → create-dom-range.cjs.map} +1 -1
  39. package/dist/create-dom-range.js +4 -6
  40. package/dist/create-dom-range.js.map +1 -1
  41. package/dist/{create-rects-from-dom-range.mjs → create-rects-from-dom-range.cjs} +4 -2
  42. package/dist/{create-rects-from-dom-range.mjs.map → create-rects-from-dom-range.cjs.map} +1 -1
  43. package/dist/create-rects-from-dom-range.js +1 -3
  44. package/dist/create-rects-from-dom-range.js.map +1 -1
  45. package/dist/index.cjs +33 -0
  46. package/dist/{index.mjs.map → index.cjs.map} +1 -1
  47. package/dist/index.js +14 -31
  48. package/dist/index.js.map +1 -1
  49. package/dist/{is-block-node-active.mjs → is-block-node-active.cjs} +12 -10
  50. package/dist/{is-block-node-active.mjs.map → is-block-node-active.cjs.map} +1 -1
  51. package/dist/is-block-node-active.js +9 -11
  52. package/dist/is-block-node-active.js.map +1 -1
  53. package/dist/is-command-registered.cjs +11 -0
  54. package/dist/{is-command-registered.mjs.map → is-command-registered.cjs.map} +1 -1
  55. package/dist/is-command-registered.js +3 -5
  56. package/dist/is-command-registered.js.map +1 -1
  57. package/dist/is-text-format-active.cjs +16 -0
  58. package/dist/{is-text-format-active.mjs.map → is-text-format-active.cjs.map} +1 -1
  59. package/dist/is-text-format-active.js +4 -6
  60. package/dist/is-text-format-active.js.map +1 -1
  61. package/dist/liveblocks-config.cjs +17 -0
  62. package/dist/{liveblocks-config.mjs.map → liveblocks-config.cjs.map} +1 -1
  63. package/dist/liveblocks-config.js +4 -6
  64. package/dist/liveblocks-config.js.map +1 -1
  65. package/dist/liveblocks-plugin-provider.cjs +151 -0
  66. package/dist/liveblocks-plugin-provider.cjs.map +1 -0
  67. package/dist/liveblocks-plugin-provider.js +43 -47
  68. package/dist/liveblocks-plugin-provider.js.map +1 -1
  69. package/dist/mentions/{avatar.mjs → avatar.cjs} +16 -14
  70. package/dist/mentions/avatar.cjs.map +1 -0
  71. package/dist/mentions/avatar.js +13 -15
  72. package/dist/mentions/avatar.js.map +1 -1
  73. package/dist/mentions/mention-component.cjs +51 -0
  74. package/dist/mentions/{mention-component.mjs.map → mention-component.cjs.map} +1 -1
  75. package/dist/mentions/mention-component.js +14 -16
  76. package/dist/mentions/mention-component.js.map +1 -1
  77. package/dist/mentions/{mention-node.mjs → mention-node.cjs} +16 -12
  78. package/dist/mentions/{mention-node.mjs.map → mention-node.cjs.map} +1 -1
  79. package/dist/mentions/mention-node.js +11 -15
  80. package/dist/mentions/mention-node.js.map +1 -1
  81. package/dist/mentions/{mention-plugin.mjs → mention-plugin.cjs} +81 -78
  82. package/dist/mentions/{mention-plugin.mjs.map → mention-plugin.cjs.map} +1 -1
  83. package/dist/mentions/mention-plugin.js +77 -80
  84. package/dist/mentions/mention-plugin.js.map +1 -1
  85. package/dist/mentions/{suggestions.mjs → suggestions.cjs} +43 -37
  86. package/dist/mentions/{suggestions.mjs.map → suggestions.cjs.map} +1 -1
  87. package/dist/mentions/suggestions.js +36 -42
  88. package/dist/mentions/suggestions.js.map +1 -1
  89. package/dist/mentions/user.cjs +26 -0
  90. package/dist/mentions/{user.mjs.map → user.cjs.map} +1 -1
  91. package/dist/mentions/user.js +11 -13
  92. package/dist/mentions/user.js.map +1 -1
  93. package/dist/toolbar/{floating-toolbar.mjs → floating-toolbar.cjs} +73 -70
  94. package/dist/toolbar/{floating-toolbar.mjs.map → floating-toolbar.cjs.map} +1 -1
  95. package/dist/toolbar/floating-toolbar.js +69 -72
  96. package/dist/toolbar/floating-toolbar.js.map +1 -1
  97. package/dist/toolbar/shared.cjs +36 -0
  98. package/dist/toolbar/{shared.mjs.map → shared.cjs.map} +1 -1
  99. package/dist/toolbar/shared.js +12 -15
  100. package/dist/toolbar/shared.js.map +1 -1
  101. package/dist/toolbar/toolbar.cjs +433 -0
  102. package/dist/toolbar/{toolbar.mjs.map → toolbar.cjs.map} +1 -1
  103. package/dist/toolbar/toolbar.js +131 -156
  104. package/dist/toolbar/toolbar.js.map +1 -1
  105. package/dist/use-root-element.cjs +21 -0
  106. package/dist/use-root-element.cjs.map +1 -0
  107. package/dist/use-root-element.js +7 -9
  108. package/dist/use-root-element.js.map +1 -1
  109. package/dist/version-history/{history-version-preview.mjs → history-version-preview.cjs} +52 -50
  110. package/dist/version-history/{history-version-preview.mjs.map → history-version-preview.cjs.map} +1 -1
  111. package/dist/version-history/history-version-preview.js +49 -51
  112. package/dist/version-history/history-version-preview.js.map +1 -1
  113. package/dist/version.cjs +10 -0
  114. package/dist/{version.mjs.map → version.cjs.map} +1 -1
  115. package/dist/version.js +3 -7
  116. package/dist/version.js.map +1 -1
  117. package/package.json +18 -17
  118. package/styles.css.d.cts +1 -0
  119. package/dist/comments/get-thread-mark-ids.mjs +0 -21
  120. package/dist/comments/unwrap-thread-mark-node.mjs.map +0 -1
  121. package/dist/index.mjs +0 -16
  122. package/dist/is-command-registered.mjs +0 -9
  123. package/dist/is-text-format-active.mjs +0 -14
  124. package/dist/liveblocks-config.mjs +0 -15
  125. package/dist/liveblocks-plugin-provider.mjs +0 -147
  126. package/dist/liveblocks-plugin-provider.mjs.map +0 -1
  127. package/dist/mentions/avatar.mjs.map +0 -1
  128. package/dist/mentions/mention-component.mjs +0 -49
  129. package/dist/mentions/user.mjs +0 -24
  130. package/dist/toolbar/shared.mjs +0 -33
  131. package/dist/toolbar/toolbar.mjs +0 -408
  132. package/dist/use-root-element.mjs +0 -19
  133. package/dist/use-root-element.mjs.map +0 -1
  134. package/dist/version.mjs +0 -6
  135. /package/dist/{index.d.mts → index.d.cts} +0 -0
@@ -1 +0,0 @@
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;;;;"}
@@ -1,49 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
3
- import { $createNodeSelection, $setSelection, $getNodeByKey } from 'lexical';
4
- import { useCallback, useSyncExternalStore } from 'react';
5
-
6
- function Mention({
7
- nodeKey,
8
- children
9
- }) {
10
- const [editor] = useLexicalComposerContext();
11
- const isSelected = useIsNodeSelected(nodeKey);
12
- function handleClick(event) {
13
- editor.update(() => {
14
- event.stopPropagation();
15
- event.preventDefault();
16
- const selection = $createNodeSelection();
17
- selection.add(nodeKey);
18
- $setSelection(selection);
19
- });
20
- }
21
- return /* @__PURE__ */ jsx("span", {
22
- onClick: handleClick,
23
- "data-selected": isSelected ? "" : void 0,
24
- className: "lb-root lb-lexical-mention",
25
- children
26
- });
27
- }
28
- function $isNodeSelected(key) {
29
- const node = $getNodeByKey(key);
30
- if (node === null)
31
- return false;
32
- return node.isSelected();
33
- }
34
- function useIsNodeSelected(key) {
35
- const [editor] = useLexicalComposerContext();
36
- const subscribe = useCallback(
37
- (onStoreChange) => {
38
- return editor.registerUpdateListener(onStoreChange);
39
- },
40
- [editor]
41
- );
42
- const getSnapshot = useCallback(() => {
43
- return editor.getEditorState().read(() => $isNodeSelected(key));
44
- }, [editor, key]);
45
- return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
46
- }
47
-
48
- export { Mention };
49
- //# sourceMappingURL=mention-component.mjs.map
@@ -1,24 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { useUser } from '@liveblocks/react';
3
- import { useOverrides } from '@liveblocks/react-ui';
4
- import { forwardRef } from 'react';
5
- import { classNames } from '../classnames.mjs';
6
-
7
- const User = forwardRef(
8
- function User2(props, forwardedRef) {
9
- const { userId, className, ...spanProps } = props;
10
- const { user, isLoading } = useUser(userId);
11
- const $ = useOverrides();
12
- const name = user === void 0 || user === null ? $.USER_UNKNOWN : user.name;
13
- return /* @__PURE__ */ jsx("span", {
14
- "data-loading": isLoading ? "" : void 0,
15
- ...spanProps,
16
- ref: forwardedRef,
17
- className: classNames("lb-name lb-user", className),
18
- children: isLoading ? null : name
19
- });
20
- }
21
- );
22
-
23
- export { User };
24
- //# sourceMappingURL=user.mjs.map
@@ -1,33 +0,0 @@
1
- import { jsx, Fragment } from 'react/jsx-runtime';
2
- import { useLayoutEffect } from '@liveblocks/react/_private';
3
- import { createContext, forwardRef, useId, useContext, Children } from 'react';
4
-
5
- const FloatingToolbarContext = createContext(null);
6
- const FloatingToolbarExternal = forwardRef(({ children, style, ...props }, forwardedRef) => {
7
- const id = useId();
8
- const externalId = `liveblocks-floating-toolbar-external-${id}`;
9
- const floatingToolbarContext = useContext(FloatingToolbarContext);
10
- const registerExternal = floatingToolbarContext?.registerExternal;
11
- useLayoutEffect(() => {
12
- if (!registerExternal) {
13
- return;
14
- }
15
- return registerExternal(externalId);
16
- }, [registerExternal, externalId]);
17
- if (!floatingToolbarContext || Children.count(children) === 0) {
18
- return /* @__PURE__ */ jsx(Fragment, {
19
- children
20
- });
21
- }
22
- return /* @__PURE__ */ jsx("div", {
23
- ref: forwardedRef,
24
- style: { display: "contents", ...style },
25
- "data-liveblocks-floating-toolbar-external": id,
26
- ...props,
27
- id: externalId,
28
- children
29
- });
30
- });
31
-
32
- export { FloatingToolbarContext, FloatingToolbarExternal };
33
- //# sourceMappingURL=shared.mjs.map
@@ -1,408 +0,0 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
3
- import { $isHeadingNode, $createHeadingNode, $createQuoteNode } from '@lexical/rich-text';
4
- import { $setBlocksType } from '@lexical/selection';
5
- import { mergeRegister } from '@lexical/utils';
6
- import { ShortcutTooltip, Button, UndoIcon, RedoIcon, BoldIcon, ItalicIcon, UnderlineIcon, StrikethroughIcon, CodeIcon, CommentIcon, TextIcon, H1Icon, H2Icon, H3Icon, BlockquoteIcon, SelectButton, CheckIcon, TooltipProvider } from '@liveblocks/react-ui/_private';
7
- import * as SelectPrimitive from '@radix-ui/react-select';
8
- import * as TogglePrimitive from '@radix-ui/react-toggle';
9
- import { CAN_UNDO_COMMAND, COMMAND_PRIORITY_CRITICAL, CAN_REDO_COMMAND, UNDO_COMMAND, REDO_COMMAND, FORMAT_TEXT_COMMAND, createCommand, $getSelection, $createParagraphNode, COMMAND_PRIORITY_LOW } from 'lexical';
10
- import { forwardRef, useContext, useCallback, useState, useEffect, useMemo } from 'react';
11
- import { classNames } from '../classnames.mjs';
12
- import { OPEN_FLOATING_COMPOSER_COMMAND } from '../comments/floating-composer.mjs';
13
- import { isBlockNodeActive } from '../is-block-node-active.mjs';
14
- import { useIsCommandRegistered } from '../is-command-registered.mjs';
15
- import { isTextFormatActive } from '../is-text-format-active.mjs';
16
- import { FloatingToolbarContext, FloatingToolbarExternal } from './shared.mjs';
17
-
18
- const BLOCK_SELECT_SIDE_OFFSET = 10;
19
- const FLOATING_ELEMENT_COLLISION_PADDING = 10;
20
- function applyToolbarSlot(slot, props) {
21
- if (typeof slot === "function") {
22
- const Component = slot;
23
- return /* @__PURE__ */ jsx(Component, {
24
- ...props
25
- });
26
- }
27
- return slot;
28
- }
29
- const ToolbarButton = forwardRef(
30
- ({ icon, children, name, shortcut, onKeyDown, ...props }, forwardedRef) => {
31
- const floatingToolbarContext = useContext(FloatingToolbarContext);
32
- const closeFloatingToolbar = floatingToolbarContext?.close;
33
- const handleKeyDown = useCallback(
34
- (event) => {
35
- onKeyDown?.(event);
36
- if (!event.isDefaultPrevented() && closeFloatingToolbar && event.key === "Escape") {
37
- closeFloatingToolbar();
38
- event.preventDefault();
39
- event.stopPropagation();
40
- }
41
- },
42
- [onKeyDown, closeFloatingToolbar]
43
- );
44
- return /* @__PURE__ */ jsx(ShortcutTooltip, {
45
- content: name,
46
- shortcut,
47
- children: /* @__PURE__ */ jsx(Button, {
48
- type: "button",
49
- variant: "toolbar",
50
- ref: forwardedRef,
51
- icon,
52
- "aria-label": !children ? name : void 0,
53
- ...props,
54
- onKeyDown: handleKeyDown,
55
- children: !children && !icon ? name : children
56
- })
57
- });
58
- }
59
- );
60
- const ToolbarToggle = forwardRef(
61
- ({ active, ...props }, forwardedRef) => {
62
- return /* @__PURE__ */ jsx(TogglePrimitive.Root, {
63
- asChild: true,
64
- pressed: active,
65
- children: /* @__PURE__ */ jsx(ToolbarButton, {
66
- ref: forwardedRef,
67
- ...props
68
- })
69
- });
70
- }
71
- );
72
- const ToolbarSeparator = forwardRef(
73
- ({ className, ...props }, forwardedRef) => {
74
- return /* @__PURE__ */ jsx("div", {
75
- ref: forwardedRef,
76
- role: "separator",
77
- "aria-orientation": "vertical",
78
- className: classNames("lb-lexical-toolbar-separator", className),
79
- ...props
80
- });
81
- }
82
- );
83
- function ToolbarSectionHistory() {
84
- const [editor] = useLexicalComposerContext();
85
- const [canUndo, setCanUndo] = useState(false);
86
- const [canRedo, setCanRedo] = useState(false);
87
- useEffect(() => {
88
- const unregister = mergeRegister(
89
- editor.registerCommand(
90
- CAN_UNDO_COMMAND,
91
- (payload) => {
92
- setCanUndo(payload);
93
- return false;
94
- },
95
- COMMAND_PRIORITY_CRITICAL
96
- ),
97
- editor.registerCommand(
98
- CAN_REDO_COMMAND,
99
- (payload) => {
100
- setCanRedo(payload);
101
- return false;
102
- },
103
- COMMAND_PRIORITY_CRITICAL
104
- )
105
- );
106
- return unregister;
107
- }, [editor]);
108
- return /* @__PURE__ */ jsxs(Fragment, {
109
- children: [
110
- /* @__PURE__ */ jsx(ToolbarButton, {
111
- name: "Undo",
112
- icon: /* @__PURE__ */ jsx(UndoIcon, {}),
113
- shortcut: "Mod-Z",
114
- onClick: () => editor.dispatchCommand(UNDO_COMMAND, void 0),
115
- disabled: !canUndo
116
- }),
117
- /* @__PURE__ */ jsx(ToolbarButton, {
118
- name: "Redo",
119
- icon: /* @__PURE__ */ jsx(RedoIcon, {}),
120
- shortcut: "Mod-Shift-Z",
121
- onClick: () => editor.dispatchCommand(REDO_COMMAND, void 0),
122
- disabled: !canRedo
123
- })
124
- ]
125
- });
126
- }
127
- function ToolbarSectionInline() {
128
- const [editor] = useLexicalComposerContext();
129
- const supportsTextFormat = useIsCommandRegistered(FORMAT_TEXT_COMMAND);
130
- return supportsTextFormat ? /* @__PURE__ */ jsxs(Fragment, {
131
- children: [
132
- /* @__PURE__ */ jsx(ToolbarToggle, {
133
- name: "Bold",
134
- icon: /* @__PURE__ */ jsx(BoldIcon, {}),
135
- shortcut: "Mod-B",
136
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, "bold"),
137
- active: isTextFormatActive(editor, "bold")
138
- }),
139
- /* @__PURE__ */ jsx(ToolbarToggle, {
140
- name: "Italic",
141
- icon: /* @__PURE__ */ jsx(ItalicIcon, {}),
142
- shortcut: "Mod-I",
143
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, "italic"),
144
- active: isTextFormatActive(editor, "italic")
145
- }),
146
- /* @__PURE__ */ jsx(ToolbarToggle, {
147
- name: "Underline",
148
- icon: /* @__PURE__ */ jsx(UnderlineIcon, {}),
149
- shortcut: "Mod-U",
150
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, "underline"),
151
- active: isTextFormatActive(editor, "underline")
152
- }),
153
- /* @__PURE__ */ jsx(ToolbarToggle, {
154
- name: "Strikethrough",
155
- icon: /* @__PURE__ */ jsx(StrikethroughIcon, {}),
156
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, "strikethrough"),
157
- active: isTextFormatActive(editor, "strikethrough")
158
- }),
159
- /* @__PURE__ */ jsx(ToolbarToggle, {
160
- name: "Inline code",
161
- icon: /* @__PURE__ */ jsx(CodeIcon, {}),
162
- onClick: () => editor.dispatchCommand(FORMAT_TEXT_COMMAND, "code"),
163
- active: isTextFormatActive(editor, "code")
164
- })
165
- ]
166
- }) : null;
167
- }
168
- function ToolbarSectionCollaboration() {
169
- const [editor] = useLexicalComposerContext();
170
- const supportsThread = useIsCommandRegistered(OPEN_FLOATING_COMPOSER_COMMAND);
171
- return /* @__PURE__ */ jsx(Fragment, {
172
- children: supportsThread ? /* @__PURE__ */ jsx(ToolbarButton, {
173
- name: "Add a comment",
174
- icon: /* @__PURE__ */ jsx(CommentIcon, {}),
175
- onClick: () => editor.dispatchCommand(OPEN_FLOATING_COMPOSER_COMMAND, void 0),
176
- children: "Comment"
177
- }) : null
178
- });
179
- }
180
- function DefaultToolbarContent() {
181
- const supportsTextFormat = useIsCommandRegistered(FORMAT_TEXT_COMMAND);
182
- const supportsThread = useIsCommandRegistered(OPEN_FLOATING_COMPOSER_COMMAND);
183
- return /* @__PURE__ */ jsxs(Fragment, {
184
- children: [
185
- /* @__PURE__ */ jsx(ToolbarSectionHistory, {}),
186
- supportsTextFormat ? /* @__PURE__ */ jsxs(Fragment, {
187
- children: [
188
- /* @__PURE__ */ jsx(ToolbarSeparator, {}),
189
- /* @__PURE__ */ jsx(ToolbarBlockSelector, {}),
190
- /* @__PURE__ */ jsx(ToolbarSectionInline, {})
191
- ]
192
- }) : null,
193
- supportsThread ? /* @__PURE__ */ jsxs(Fragment, {
194
- children: [
195
- /* @__PURE__ */ jsx(ToolbarSeparator, {}),
196
- /* @__PURE__ */ jsx(ToolbarSectionCollaboration, {})
197
- ]
198
- }) : null
199
- ]
200
- });
201
- }
202
- const INITIAL_COMMANDS_REGISTERED_COMMAND = createCommand(
203
- "INITIAL_COMMANDS_REGISTERED_COMMAND"
204
- );
205
- function useRerender() {
206
- const [, setRerender] = useState(false);
207
- return useCallback(() => {
208
- setRerender((toggle) => !toggle);
209
- }, [setRerender]);
210
- }
211
- function createDefaultBlockSelectorItems() {
212
- const items = [
213
- {
214
- name: "Text",
215
- icon: /* @__PURE__ */ jsx(TextIcon, {}),
216
- isActive: "default",
217
- setActive: () => $setBlocksType($getSelection(), () => $createParagraphNode())
218
- },
219
- {
220
- name: "Heading 1",
221
- icon: /* @__PURE__ */ jsx(H1Icon, {}),
222
- isActive: (editor) => {
223
- return isBlockNodeActive(
224
- editor,
225
- (node) => $isHeadingNode(node) ? node.getTag() === "h1" : false
226
- );
227
- },
228
- setActive: () => $setBlocksType($getSelection(), () => $createHeadingNode("h1"))
229
- },
230
- {
231
- name: "Heading 2",
232
- icon: /* @__PURE__ */ jsx(H2Icon, {}),
233
- isActive: (editor) => isBlockNodeActive(
234
- editor,
235
- (node) => $isHeadingNode(node) ? node.getTag() === "h2" : false
236
- ),
237
- setActive: () => $setBlocksType($getSelection(), () => $createHeadingNode("h2"))
238
- },
239
- {
240
- name: "Heading 3",
241
- icon: /* @__PURE__ */ jsx(H3Icon, {}),
242
- isActive: (editor) => isBlockNodeActive(
243
- editor,
244
- (node) => $isHeadingNode(node) ? node.getTag() === "h3" : false
245
- ),
246
- setActive: () => $setBlocksType($getSelection(), () => $createHeadingNode("h3"))
247
- },
248
- {
249
- name: "Blockquote",
250
- icon: /* @__PURE__ */ jsx(BlockquoteIcon, {}),
251
- isActive: (editor) => isBlockNodeActive(editor, (node) => node.getType() === "quote"),
252
- setActive: () => $setBlocksType($getSelection(), () => $createQuoteNode())
253
- }
254
- ];
255
- return items.filter(Boolean);
256
- }
257
- const ToolbarBlockSelector = forwardRef(({ items, onKeyDown, ...props }, forwardedRef) => {
258
- const floatingToolbarContext = useContext(FloatingToolbarContext);
259
- const closeFloatingToolbar = floatingToolbarContext?.close;
260
- const [editor] = useLexicalComposerContext();
261
- const resolvedItems = useMemo(() => {
262
- if (Array.isArray(items)) {
263
- return items;
264
- }
265
- const defaultItems = createDefaultBlockSelectorItems();
266
- return items ? items(defaultItems) : defaultItems;
267
- }, [items]);
268
- let defaultItem;
269
- let activeItem = resolvedItems.find((item) => {
270
- if (item.isActive === "default") {
271
- defaultItem = item;
272
- return false;
273
- }
274
- return item.isActive(editor);
275
- });
276
- if (!activeItem) {
277
- activeItem = defaultItem;
278
- }
279
- const handleItemChange = (name) => {
280
- const item = resolvedItems.find((item2) => item2.name === name);
281
- if (item) {
282
- editor.update(() => item.setActive(editor));
283
- floatingToolbarContext?.close();
284
- }
285
- };
286
- const handleKeyDown = useCallback(
287
- (event) => {
288
- onKeyDown?.(event);
289
- if (!event.isDefaultPrevented() && closeFloatingToolbar && event.key === "Escape") {
290
- closeFloatingToolbar();
291
- event.preventDefault();
292
- event.stopPropagation();
293
- }
294
- },
295
- [onKeyDown, closeFloatingToolbar]
296
- );
297
- return /* @__PURE__ */ jsxs(SelectPrimitive.Root, {
298
- value: activeItem?.name,
299
- onValueChange: handleItemChange,
300
- children: [
301
- /* @__PURE__ */ jsx(ShortcutTooltip, {
302
- content: "Turn into\u2026",
303
- children: /* @__PURE__ */ jsx(SelectPrimitive.Trigger, {
304
- asChild: true,
305
- ...props,
306
- ref: forwardedRef,
307
- onKeyDown: handleKeyDown,
308
- disabled: resolvedItems.length === 0,
309
- children: /* @__PURE__ */ jsx(SelectButton, {
310
- variant: "toolbar",
311
- children: activeItem?.name ?? "Turn into\u2026"
312
- })
313
- })
314
- }),
315
- /* @__PURE__ */ jsx(SelectPrimitive.Portal, {
316
- children: /* @__PURE__ */ jsx(FloatingToolbarExternal, {
317
- children: /* @__PURE__ */ jsx(SelectPrimitive.Content, {
318
- position: "popper",
319
- sideOffset: BLOCK_SELECT_SIDE_OFFSET,
320
- collisionPadding: FLOATING_ELEMENT_COLLISION_PADDING,
321
- className: "lb-root lb-portal lb-elevation lb-dropdown lb-select-dropdown lb-lexical-block-selector-dropdown",
322
- children: resolvedItems.map((item) => /* @__PURE__ */ jsxs(SelectPrimitive.Item, {
323
- value: item.name,
324
- className: "lb-dropdown-item",
325
- "data-name": item.name,
326
- children: [
327
- item.icon ? /* @__PURE__ */ jsx("span", {
328
- className: "lb-dropdown-item-icon lb-icon-container",
329
- children: item.icon
330
- }) : null,
331
- /* @__PURE__ */ jsx("span", {
332
- className: "lb-dropdown-item-label",
333
- children: item.label ?? item.name
334
- }),
335
- item.name === activeItem?.name ? /* @__PURE__ */ jsx("span", {
336
- className: "lb-dropdown-item-accessory lb-icon-container",
337
- children: /* @__PURE__ */ jsx(CheckIcon, {})
338
- }) : null
339
- ]
340
- }, item.name))
341
- })
342
- })
343
- })
344
- ]
345
- });
346
- });
347
- const Toolbar = Object.assign(
348
- forwardRef(
349
- ({ before, after, children = DefaultToolbarContent, className, ...props }, forwardedRef) => {
350
- const [editor] = useLexicalComposerContext();
351
- const [commandsRegistered, setCommandsRegistered] = useState(false);
352
- const rerender = useRerender();
353
- const slotProps = { editor };
354
- useEffect(() => {
355
- if (commandsRegistered) {
356
- return;
357
- }
358
- const unregister = editor.registerCommand(
359
- INITIAL_COMMANDS_REGISTERED_COMMAND,
360
- () => {
361
- setCommandsRegistered(true);
362
- return true;
363
- },
364
- COMMAND_PRIORITY_LOW
365
- );
366
- editor.dispatchCommand(INITIAL_COMMANDS_REGISTERED_COMMAND, void 0);
367
- return unregister;
368
- }, [editor, commandsRegistered]);
369
- useEffect(() => {
370
- const unregister = editor.registerUpdateListener(({ tags }) => {
371
- return editor.getEditorState().read(() => {
372
- if (tags.has("collaboration"))
373
- return;
374
- rerender();
375
- });
376
- });
377
- return unregister;
378
- }, [editor, rerender]);
379
- return /* @__PURE__ */ jsx(TooltipProvider, {
380
- children: /* @__PURE__ */ jsxs("div", {
381
- ref: forwardedRef,
382
- role: "toolbar",
383
- "aria-label": "Toolbar",
384
- "aria-orientation": "horizontal",
385
- className: classNames("lb-root lb-lexical-toolbar", className),
386
- ...props,
387
- children: [
388
- applyToolbarSlot(before, slotProps),
389
- applyToolbarSlot(children, slotProps),
390
- applyToolbarSlot(after, slotProps)
391
- ]
392
- })
393
- });
394
- }
395
- ),
396
- {
397
- Button: ToolbarButton,
398
- Toggle: ToolbarToggle,
399
- BlockSelector: ToolbarBlockSelector,
400
- Separator: ToolbarSeparator,
401
- SectionHistory: ToolbarSectionHistory,
402
- SectionInline: ToolbarSectionInline,
403
- SectionCollaboration: ToolbarSectionCollaboration
404
- }
405
- );
406
-
407
- export { BLOCK_SELECT_SIDE_OFFSET, FLOATING_ELEMENT_COLLISION_PADDING, Toolbar, applyToolbarSlot };
408
- //# sourceMappingURL=toolbar.mjs.map
@@ -1,19 +0,0 @@
1
- import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
2
- import { useCallback, useSyncExternalStore } from 'react';
3
-
4
- function useRootElement() {
5
- const [editor] = useLexicalComposerContext();
6
- const subscribe = useCallback(
7
- (onStoreChange) => {
8
- return editor.registerRootListener(onStoreChange);
9
- },
10
- [editor]
11
- );
12
- const getSnapshot = useCallback(() => {
13
- return editor.getRootElement();
14
- }, [editor]);
15
- return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
16
- }
17
-
18
- export { useRootElement };
19
- //# sourceMappingURL=use-root-element.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-root-element.mjs","sources":["../src/use-root-element.ts"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useCallback, useSyncExternalStore } from \"react\";\n\nexport function useRootElement(): HTMLElement | null {\n const [editor] = useLexicalComposerContext();\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n return editor.registerRootListener(onStoreChange);\n },\n [editor]\n );\n\n const getSnapshot = useCallback(() => {\n return editor.getRootElement();\n }, [editor]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,cAAqC,GAAA;AACnD,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,qBAAqB,aAAa,CAAA,CAAA;AAAA,KAClD;AAAA,IACA,CAAC,MAAM,CAAA;AAAA,GACT,CAAA;AAEA,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,OAAO,OAAO,cAAe,EAAA,CAAA;AAAA,GAC/B,EAAG,CAAC,MAAM,CAAC,CAAA,CAAA;AAEX,EAAO,OAAA,oBAAA,CAAqB,SAAW,EAAA,WAAA,EAAa,WAAW,CAAA,CAAA;AACjE;;;;"}
package/dist/version.mjs DELETED
@@ -1,6 +0,0 @@
1
- const PKG_NAME = "@liveblocks/react-lexical";
2
- const PKG_VERSION = typeof "2.18.3" === "string" && "2.18.3";
3
- const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
-
5
- export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
6
- //# sourceMappingURL=version.mjs.map
File without changes