@liveblocks/react-lexical 2.15.1 → 2.16.0-toolbars1

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 (67) hide show
  1. package/dist/comments/anchored-threads.js +3 -2
  2. package/dist/comments/anchored-threads.js.map +1 -1
  3. package/dist/comments/anchored-threads.mjs +2 -1
  4. package/dist/comments/anchored-threads.mjs.map +1 -1
  5. package/dist/comments/comment-plugin-provider.js +2 -2
  6. package/dist/comments/comment-plugin-provider.js.map +1 -1
  7. package/dist/comments/comment-plugin-provider.mjs +2 -2
  8. package/dist/comments/comment-plugin-provider.mjs.map +1 -1
  9. package/dist/comments/floating-composer.js +7 -4
  10. package/dist/comments/floating-composer.js.map +1 -1
  11. package/dist/comments/floating-composer.mjs +6 -3
  12. package/dist/comments/floating-composer.mjs.map +1 -1
  13. package/dist/comments/floating-threads.js +2 -1
  14. package/dist/comments/floating-threads.js.map +1 -1
  15. package/dist/comments/floating-threads.mjs +2 -1
  16. package/dist/comments/floating-threads.mjs.map +1 -1
  17. package/dist/get-selected-block-element.js +26 -0
  18. package/dist/get-selected-block-element.js.map +1 -0
  19. package/dist/get-selected-block-element.mjs +24 -0
  20. package/dist/get-selected-block-element.mjs.map +1 -0
  21. package/dist/index.d.mts +61 -12
  22. package/dist/index.d.ts +61 -12
  23. package/dist/index.js +4 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +2 -0
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/is-command-registered.js +11 -0
  28. package/dist/is-command-registered.js.map +1 -0
  29. package/dist/is-command-registered.mjs +9 -0
  30. package/dist/is-command-registered.mjs.map +1 -0
  31. package/dist/is-text-format-active.js +16 -0
  32. package/dist/is-text-format-active.js.map +1 -0
  33. package/dist/is-text-format-active.mjs +14 -0
  34. package/dist/is-text-format-active.mjs.map +1 -0
  35. package/dist/liveblocks-plugin-provider.js +1 -1
  36. package/dist/liveblocks-plugin-provider.js.map +1 -1
  37. package/dist/liveblocks-plugin-provider.mjs +2 -2
  38. package/dist/liveblocks-plugin-provider.mjs.map +1 -1
  39. package/dist/mentions/mention-plugin.js +1 -1
  40. package/dist/mentions/mention-plugin.js.map +1 -1
  41. package/dist/mentions/mention-plugin.mjs +2 -2
  42. package/dist/mentions/mention-plugin.mjs.map +1 -1
  43. package/dist/toolbar/floating-toolbar-context.js +8 -0
  44. package/dist/toolbar/floating-toolbar-context.js.map +1 -0
  45. package/dist/toolbar/floating-toolbar-context.mjs +6 -0
  46. package/dist/toolbar/floating-toolbar-context.mjs.map +1 -0
  47. package/dist/toolbar/floating-toolbar.js +284 -0
  48. package/dist/toolbar/floating-toolbar.js.map +1 -0
  49. package/dist/toolbar/floating-toolbar.mjs +281 -0
  50. package/dist/toolbar/floating-toolbar.mjs.map +1 -0
  51. package/dist/toolbar/toolbar.js +406 -0
  52. package/dist/toolbar/toolbar.js.map +1 -0
  53. package/dist/toolbar/toolbar.mjs +381 -0
  54. package/dist/toolbar/toolbar.mjs.map +1 -0
  55. package/dist/version-history/history-version-preview.js +3 -10
  56. package/dist/version-history/history-version-preview.js.map +1 -1
  57. package/dist/version-history/history-version-preview.mjs +3 -10
  58. package/dist/version-history/history-version-preview.mjs.map +1 -1
  59. package/dist/version.js +1 -1
  60. package/dist/version.js.map +1 -1
  61. package/dist/version.mjs +1 -1
  62. package/dist/version.mjs.map +1 -1
  63. package/package.json +12 -8
  64. package/src/styles/constants.css +1 -1
  65. package/src/styles/index.css +44 -6
  66. package/styles.css +1 -1
  67. package/styles.css.map +1 -1
@@ -0,0 +1,406 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var LexicalComposerContext = require('@lexical/react/LexicalComposerContext');
5
+ var richText = require('@lexical/rich-text');
6
+ var selection = require('@lexical/selection');
7
+ var utils = require('@lexical/utils');
8
+ var _private = require('@liveblocks/react-ui/_private');
9
+ var SelectPrimitive = require('@radix-ui/react-select');
10
+ var TogglePrimitive = require('@radix-ui/react-toggle');
11
+ var lexical = require('lexical');
12
+ var react = require('react');
13
+ var classnames = require('../classnames.js');
14
+ var floatingComposer = require('../comments/floating-composer.js');
15
+ var getSelectedBlockElement = require('../get-selected-block-element.js');
16
+ var isCommandRegistered = require('../is-command-registered.js');
17
+ var isTextFormatActive = require('../is-text-format-active.js');
18
+ var floatingToolbarContext = require('./floating-toolbar-context.js');
19
+
20
+ function _interopNamespaceDefault(e) {
21
+ var n = Object.create(null);
22
+ if (e) {
23
+ Object.keys(e).forEach(function (k) {
24
+ if (k !== 'default') {
25
+ var d = Object.getOwnPropertyDescriptor(e, k);
26
+ Object.defineProperty(n, k, d.get ? d : {
27
+ enumerable: true,
28
+ get: function () { return e[k]; }
29
+ });
30
+ }
31
+ });
32
+ }
33
+ n.default = e;
34
+ return Object.freeze(n);
35
+ }
36
+
37
+ var SelectPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SelectPrimitive);
38
+ var TogglePrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(TogglePrimitive);
39
+
40
+ const BLOCK_SELECT_SIDE_OFFSET = 10;
41
+ const FLOATING_ELEMENT_COLLISION_PADDING = 10;
42
+ function applyToolbarSlot(slot, props) {
43
+ if (typeof slot === "function") {
44
+ const Component = slot;
45
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, {
46
+ ...props
47
+ });
48
+ }
49
+ return slot;
50
+ }
51
+ const ToolbarButton = react.forwardRef(
52
+ ({ icon, children, name, shortcut, ...props }, forwardedRef) => {
53
+ return /* @__PURE__ */ jsxRuntime.jsx(_private.ShortcutTooltip, {
54
+ content: name,
55
+ shortcut,
56
+ children: /* @__PURE__ */ jsxRuntime.jsx(_private.Button, {
57
+ type: "button",
58
+ variant: "toolbar",
59
+ ref: forwardedRef,
60
+ icon,
61
+ ...props,
62
+ children
63
+ })
64
+ });
65
+ }
66
+ );
67
+ const ToolbarToggle = react.forwardRef(
68
+ ({ active, ...props }, forwardedRef) => {
69
+ return /* @__PURE__ */ jsxRuntime.jsx(TogglePrimitive__namespace.Root, {
70
+ asChild: true,
71
+ pressed: active,
72
+ children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, {
73
+ ref: forwardedRef,
74
+ ...props
75
+ })
76
+ });
77
+ }
78
+ );
79
+ const ToolbarSeparator = react.forwardRef(
80
+ ({ className, ...props }, forwardedRef) => {
81
+ return /* @__PURE__ */ jsxRuntime.jsx("div", {
82
+ ref: forwardedRef,
83
+ role: "separator",
84
+ "aria-orientation": "vertical",
85
+ className: classnames.classNames("lb-lexical-toolbar-separator", className),
86
+ ...props
87
+ });
88
+ }
89
+ );
90
+ function ToolbarSectionHistory() {
91
+ const [editor] = LexicalComposerContext.useLexicalComposerContext();
92
+ const [canUndo, setCanUndo] = react.useState(false);
93
+ const [canRedo, setCanRedo] = react.useState(false);
94
+ react.useEffect(() => {
95
+ const unregister = utils.mergeRegister(
96
+ editor.registerCommand(
97
+ lexical.CAN_UNDO_COMMAND,
98
+ (payload) => {
99
+ setCanUndo(payload);
100
+ return false;
101
+ },
102
+ lexical.COMMAND_PRIORITY_CRITICAL
103
+ ),
104
+ editor.registerCommand(
105
+ lexical.CAN_REDO_COMMAND,
106
+ (payload) => {
107
+ setCanRedo(payload);
108
+ return false;
109
+ },
110
+ lexical.COMMAND_PRIORITY_CRITICAL
111
+ )
112
+ );
113
+ return unregister;
114
+ }, [editor]);
115
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
116
+ children: [
117
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, {
118
+ name: "Undo",
119
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.UndoIcon, {}),
120
+ shortcut: "Mod-Z",
121
+ onClick: () => editor.dispatchCommand(lexical.UNDO_COMMAND, void 0),
122
+ disabled: !canUndo
123
+ }),
124
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, {
125
+ name: "Redo",
126
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.RedoIcon, {}),
127
+ shortcut: "Mod-Shift-Z",
128
+ onClick: () => editor.dispatchCommand(lexical.REDO_COMMAND, void 0),
129
+ disabled: !canRedo
130
+ })
131
+ ]
132
+ });
133
+ }
134
+ function ToolbarSectionInline() {
135
+ const [editor] = LexicalComposerContext.useLexicalComposerContext();
136
+ const supportsTextFormat = isCommandRegistered.useIsCommandRegistered(lexical.FORMAT_TEXT_COMMAND);
137
+ return supportsTextFormat ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
138
+ children: [
139
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarToggle, {
140
+ name: "Bold",
141
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.BoldIcon, {}),
142
+ shortcut: "Mod-B",
143
+ onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "bold"),
144
+ active: isTextFormatActive.isTextFormatActive(editor, "bold")
145
+ }),
146
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarToggle, {
147
+ name: "Italic",
148
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.ItalicIcon, {}),
149
+ shortcut: "Mod-I",
150
+ onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "italic"),
151
+ active: isTextFormatActive.isTextFormatActive(editor, "italic")
152
+ }),
153
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarToggle, {
154
+ name: "Underline",
155
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.UnderlineIcon, {}),
156
+ shortcut: "Mod-U",
157
+ onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "underline"),
158
+ active: isTextFormatActive.isTextFormatActive(editor, "underline")
159
+ }),
160
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarToggle, {
161
+ name: "Strikethrough",
162
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.StrikethroughIcon, {}),
163
+ onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "strikethrough"),
164
+ active: isTextFormatActive.isTextFormatActive(editor, "strikethrough")
165
+ }),
166
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarToggle, {
167
+ name: "Inline code",
168
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CodeIcon, {}),
169
+ onClick: () => editor.dispatchCommand(lexical.FORMAT_TEXT_COMMAND, "code"),
170
+ active: isTextFormatActive.isTextFormatActive(editor, "code")
171
+ })
172
+ ]
173
+ }) : null;
174
+ }
175
+ function ToolbarSectionCollaboration() {
176
+ const [editor] = LexicalComposerContext.useLexicalComposerContext();
177
+ const supportsThread = isCommandRegistered.useIsCommandRegistered(floatingComposer.OPEN_FLOATING_COMPOSER_COMMAND);
178
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {
179
+ children: supportsThread ? /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, {
180
+ name: "Add a comment",
181
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CommentIcon, {}),
182
+ onClick: () => editor.dispatchCommand(floatingComposer.OPEN_FLOATING_COMPOSER_COMMAND, void 0),
183
+ children: "Comment"
184
+ }) : null
185
+ });
186
+ }
187
+ function DefaultToolbarContent() {
188
+ const supportsTextFormat = isCommandRegistered.useIsCommandRegistered(lexical.FORMAT_TEXT_COMMAND);
189
+ const supportsThread = isCommandRegistered.useIsCommandRegistered(floatingComposer.OPEN_FLOATING_COMPOSER_COMMAND);
190
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
191
+ children: [
192
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarSectionHistory, {}),
193
+ supportsTextFormat ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
194
+ children: [
195
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarSeparator, {}),
196
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarBlockSelector, {}),
197
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarSectionInline, {})
198
+ ]
199
+ }) : null,
200
+ supportsThread ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
201
+ children: [
202
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarSeparator, {}),
203
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarSectionCollaboration, {})
204
+ ]
205
+ }) : null
206
+ ]
207
+ });
208
+ }
209
+ const INITIAL_COMMANDS_REGISTERED_COMMAND = lexical.createCommand(
210
+ "INITIAL_COMMANDS_REGISTERED_COMMAND"
211
+ );
212
+ function useRerender() {
213
+ const [, setRerender] = react.useState(false);
214
+ return react.useCallback(() => {
215
+ setRerender((toggle) => !toggle);
216
+ }, [setRerender]);
217
+ }
218
+ function createDefaultBlockSelectorItems() {
219
+ const items = [
220
+ {
221
+ name: "Heading 1",
222
+ isActive: (selectedBlock) => {
223
+ if (richText.$isHeadingNode(selectedBlock)) {
224
+ const tag = selectedBlock.getTag();
225
+ return tag === "h1";
226
+ } else {
227
+ return false;
228
+ }
229
+ },
230
+ setActive: () => selection.$setBlocksType(lexical.$getSelection(), () => richText.$createHeadingNode("h1"))
231
+ },
232
+ {
233
+ name: "Heading 2",
234
+ isActive: (selectedBlock) => {
235
+ if (richText.$isHeadingNode(selectedBlock)) {
236
+ const tag = selectedBlock.getTag();
237
+ return tag === "h2";
238
+ } else {
239
+ return false;
240
+ }
241
+ },
242
+ setActive: () => selection.$setBlocksType(lexical.$getSelection(), () => richText.$createHeadingNode("h2"))
243
+ },
244
+ {
245
+ name: "Heading 3",
246
+ isActive: (selectedBlock) => {
247
+ if (richText.$isHeadingNode(selectedBlock)) {
248
+ const tag = selectedBlock.getTag();
249
+ return tag === "h3";
250
+ } else {
251
+ return false;
252
+ }
253
+ },
254
+ setActive: () => selection.$setBlocksType(lexical.$getSelection(), () => richText.$createHeadingNode("h3"))
255
+ },
256
+ {
257
+ name: "Blockquote",
258
+ isActive: (selectedBlock) => selectedBlock?.getType() === "quote",
259
+ setActive: () => selection.$setBlocksType(lexical.$getSelection(), () => richText.$createQuoteNode())
260
+ }
261
+ ];
262
+ return items.filter(Boolean);
263
+ }
264
+ const blockSelectorTextItem = {
265
+ name: "Text",
266
+ isActive: () => false,
267
+ setActive: () => selection.$setBlocksType(lexical.$getSelection(), () => lexical.$createParagraphNode())
268
+ };
269
+ const ToolbarBlockSelector = react.forwardRef(({ items, ...props }, forwardedRef) => {
270
+ const floatingToolbarContext$1 = react.useContext(floatingToolbarContext.FloatingToolbarContext);
271
+ const [editor] = LexicalComposerContext.useLexicalComposerContext();
272
+ const selectedBlockElement = getSelectedBlockElement.getSelectedBlockElement(editor);
273
+ const resolvedItems = react.useMemo(() => {
274
+ const resolvedItems2 = items ?? createDefaultBlockSelectorItems();
275
+ return [blockSelectorTextItem, ...resolvedItems2];
276
+ }, [items]);
277
+ const activeItem = react.useMemo(
278
+ () => resolvedItems.find(
279
+ (item) => item.isActive(selectedBlockElement, editor)
280
+ ) ?? blockSelectorTextItem,
281
+ [selectedBlockElement, editor, resolvedItems]
282
+ );
283
+ const handleItemChange = (name) => {
284
+ const item = resolvedItems.find((item2) => item2.name === name);
285
+ if (item) {
286
+ editor.update(() => item.setActive(editor));
287
+ floatingToolbarContext$1?.close();
288
+ }
289
+ };
290
+ return /* @__PURE__ */ jsxRuntime.jsxs(SelectPrimitive__namespace.Root, {
291
+ value: activeItem.name,
292
+ onValueChange: handleItemChange,
293
+ children: [
294
+ /* @__PURE__ */ jsxRuntime.jsx(_private.ShortcutTooltip, {
295
+ content: "Turn into\u2026",
296
+ children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Trigger, {
297
+ asChild: true,
298
+ ...props,
299
+ ref: forwardedRef,
300
+ children: /* @__PURE__ */ jsxRuntime.jsxs(_private.Button, {
301
+ type: "button",
302
+ variant: "toolbar",
303
+ children: [
304
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Value, {
305
+ children: activeItem.name
306
+ }),
307
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, {
308
+ className: "lb-dropdown-chevron",
309
+ children: /* @__PURE__ */ jsxRuntime.jsx(_private.ChevronDownIcon, {})
310
+ })
311
+ ]
312
+ })
313
+ })
314
+ }),
315
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, {
316
+ children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Content, {
317
+ position: "popper",
318
+ sideOffset: BLOCK_SELECT_SIDE_OFFSET,
319
+ collisionPadding: FLOATING_ELEMENT_COLLISION_PADDING,
320
+ className: "lb-root lb-portal lb-elevation lb-dropdown",
321
+ children: resolvedItems.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(SelectPrimitive__namespace.Item, {
322
+ value: item.name,
323
+ className: "lb-dropdown-item",
324
+ children: [
325
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
326
+ className: "lb-dropdown-item-label",
327
+ children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, {
328
+ children: item.name
329
+ })
330
+ }),
331
+ item.name === activeItem.name ? /* @__PURE__ */ jsxRuntime.jsx("span", {
332
+ className: "lb-dropdown-item-accessory lb-icon-container",
333
+ children: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {})
334
+ }) : null
335
+ ]
336
+ }, item.name))
337
+ })
338
+ })
339
+ ]
340
+ });
341
+ });
342
+ const Toolbar = Object.assign(
343
+ react.forwardRef(
344
+ ({ before, after, children = DefaultToolbarContent, className, ...props }, forwardedRef) => {
345
+ const [editor] = LexicalComposerContext.useLexicalComposerContext();
346
+ const [commandsRegistered, setCommandsRegistered] = react.useState(false);
347
+ const rerender = useRerender();
348
+ const slotProps = { editor };
349
+ react.useEffect(() => {
350
+ if (commandsRegistered) {
351
+ return;
352
+ }
353
+ const unregister = editor.registerCommand(
354
+ INITIAL_COMMANDS_REGISTERED_COMMAND,
355
+ () => {
356
+ setCommandsRegistered(true);
357
+ return true;
358
+ },
359
+ lexical.COMMAND_PRIORITY_LOW
360
+ );
361
+ editor.dispatchCommand(INITIAL_COMMANDS_REGISTERED_COMMAND, void 0);
362
+ return unregister;
363
+ }, [editor, commandsRegistered]);
364
+ react.useEffect(() => {
365
+ const unregister = editor.registerUpdateListener(({ tags }) => {
366
+ return editor.getEditorState().read(() => {
367
+ if (tags.has("collaboration"))
368
+ return;
369
+ rerender();
370
+ });
371
+ });
372
+ return unregister;
373
+ }, [editor, rerender]);
374
+ return /* @__PURE__ */ jsxRuntime.jsx(_private.TooltipProvider, {
375
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
376
+ ref: forwardedRef,
377
+ role: "toolbar",
378
+ "aria-label": "Toolbar",
379
+ "aria-orientation": "horizontal",
380
+ className: classnames.classNames("lb-root lb-lexical-toolbar", className),
381
+ ...props,
382
+ children: [
383
+ applyToolbarSlot(before, slotProps),
384
+ applyToolbarSlot(children, slotProps),
385
+ applyToolbarSlot(after, slotProps)
386
+ ]
387
+ })
388
+ });
389
+ }
390
+ ),
391
+ {
392
+ Button: ToolbarButton,
393
+ Toggle: ToolbarToggle,
394
+ Separator: ToolbarSeparator,
395
+ SectionHistory: ToolbarSectionHistory,
396
+ SectionInline: ToolbarSectionInline,
397
+ SectionCollaboration: ToolbarSectionCollaboration,
398
+ BlockSelector: ToolbarBlockSelector
399
+ }
400
+ );
401
+
402
+ exports.BLOCK_SELECT_SIDE_OFFSET = BLOCK_SELECT_SIDE_OFFSET;
403
+ exports.FLOATING_ELEMENT_COLLISION_PADDING = FLOATING_ELEMENT_COLLISION_PADDING;
404
+ exports.Toolbar = Toolbar;
405
+ exports.applyToolbarSlot = applyToolbarSlot;
406
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","sources":["../../src/toolbar/toolbar.tsx"],"sourcesContent":["import { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $createHeadingNode,\n $createQuoteNode,\n $isHeadingNode,\n} from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport {\n BoldIcon,\n Button,\n CheckIcon,\n ChevronDownIcon,\n CodeIcon,\n CommentIcon,\n ItalicIcon,\n RedoIcon,\n ShortcutTooltip,\n StrikethroughIcon,\n TooltipProvider,\n UnderlineIcon,\n UndoIcon,\n} from \"@liveblocks/react-ui/_private\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport {\n $createParagraphNode,\n $getSelection,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n createCommand,\n FORMAT_TEXT_COMMAND,\n type LexicalCommand,\n type LexicalEditor,\n type LexicalNode,\n REDO_COMMAND,\n UNDO_COMMAND,\n} from \"lexical\";\nimport type { ComponentProps, ComponentType, ReactNode } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { classNames } from \"../classnames\";\nimport { OPEN_FLOATING_COMPOSER_COMMAND } from \"../comments/floating-composer\";\nimport { getSelectedBlockElement } from \"../get-selected-block-element\";\nimport { useIsCommandRegistered } from \"../is-command-registered\";\nimport { isTextFormatActive } from \"../is-text-format-active\";\nimport { FloatingToolbarContext } from \"./floating-toolbar-context\";\n\nexport const BLOCK_SELECT_SIDE_OFFSET = 10;\nexport const FLOATING_ELEMENT_COLLISION_PADDING = 10;\n\nexport interface ToolbarSlotProps {\n editor: LexicalEditor;\n}\n\nexport type ToolbarSlot = ReactNode | ComponentType<ToolbarSlotProps>;\n\nexport interface ToolbarProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n children?: ToolbarSlot;\n before?: ToolbarSlot;\n after?: ToolbarSlot;\n}\n\ninterface ToolbarButtonProps extends ComponentProps<\"button\"> {\n icon?: ReactNode;\n name: string;\n shortcut?: string;\n}\n\ninterface ToolbarToggleProps extends ToolbarButtonProps {\n active: boolean;\n}\n\ntype ToolbarSeparatorProps = ComponentProps<\"div\">;\n\ninterface ToolbarBlockSelectorItem {\n name: string;\n isActive: (\n selectedBlockElement: LexicalNode | null,\n editor: LexicalEditor\n ) => boolean;\n setActive: (editor: LexicalEditor) => void;\n}\n\ninterface ToolbarBlockSelectorProps extends ComponentProps<\"button\"> {\n items?: ToolbarBlockSelectorItem[];\n}\n\nexport function applyToolbarSlot(\n slot: ToolbarSlot,\n props: ToolbarSlotProps\n): ReactNode {\n if (typeof slot === \"function\") {\n const Component = slot;\n\n return <Component {...props} />;\n }\n\n return slot;\n}\n\nconst ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n ({ icon, children, name, shortcut, ...props }, forwardedRef) => {\n return (\n <ShortcutTooltip content={name} shortcut={shortcut}>\n <Button\n type=\"button\"\n variant=\"toolbar\"\n ref={forwardedRef}\n icon={icon}\n {...props}\n >\n {children}\n </Button>\n </ShortcutTooltip>\n );\n }\n);\n\nconst ToolbarToggle = forwardRef<HTMLButtonElement, ToolbarToggleProps>(\n ({ active, ...props }, forwardedRef) => {\n return (\n <TogglePrimitive.Root asChild pressed={active}>\n <ToolbarButton ref={forwardedRef} {...props} />\n </TogglePrimitive.Root>\n );\n }\n);\n\nconst ToolbarSeparator = forwardRef<HTMLDivElement, ToolbarSeparatorProps>(\n ({ className, ...props }, forwardedRef) => {\n return (\n <div\n ref={forwardedRef}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={classNames(\"lb-lexical-toolbar-separator\", className)}\n {...props}\n />\n );\n }\n);\n\nfunction ToolbarSectionHistory() {\n const [editor] = useLexicalComposerContext();\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n useEffect(() => {\n const unregister = mergeRegister(\n editor.registerCommand<boolean>(\n CAN_UNDO_COMMAND,\n (payload) => {\n setCanUndo(payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand<boolean>(\n CAN_REDO_COMMAND,\n (payload) => {\n setCanRedo(payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n )\n );\n\n return unregister;\n }, [editor]);\n\n return (\n <>\n <ToolbarButton\n name=\"Undo\"\n icon={<UndoIcon />}\n shortcut=\"Mod-Z\"\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\n disabled={!canUndo}\n />\n <ToolbarButton\n name=\"Redo\"\n icon={<RedoIcon />}\n shortcut=\"Mod-Shift-Z\"\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\n disabled={!canRedo}\n />\n </>\n );\n}\n\nfunction ToolbarSectionInline() {\n const [editor] = useLexicalComposerContext();\n const supportsTextFormat = useIsCommandRegistered(FORMAT_TEXT_COMMAND);\n\n return supportsTextFormat ? (\n <>\n <ToolbarToggle\n name=\"Bold\"\n icon={<BoldIcon />}\n shortcut=\"Mod-B\"\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\n active={isTextFormatActive(editor, \"bold\")}\n />\n\n <ToolbarToggle\n name=\"Italic\"\n icon={<ItalicIcon />}\n shortcut=\"Mod-I\"\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")}\n active={isTextFormatActive(editor, \"italic\")}\n />\n <ToolbarToggle\n name=\"Underline\"\n icon={<UnderlineIcon />}\n shortcut=\"Mod-U\"\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")}\n active={isTextFormatActive(editor, \"underline\")}\n />\n <ToolbarToggle\n name=\"Strikethrough\"\n icon={<StrikethroughIcon />}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\n }\n active={isTextFormatActive(editor, \"strikethrough\")}\n />\n <ToolbarToggle\n name=\"Inline code\"\n icon={<CodeIcon />}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\n active={isTextFormatActive(editor, \"code\")}\n />\n </>\n ) : null;\n}\n\nfunction ToolbarSectionCollaboration() {\n const [editor] = useLexicalComposerContext();\n const supportsThread = useIsCommandRegistered(OPEN_FLOATING_COMPOSER_COMMAND);\n\n return (\n <>\n {supportsThread ? (\n <ToolbarButton\n name=\"Add a comment\"\n icon={<CommentIcon />}\n onClick={() =>\n editor.dispatchCommand(OPEN_FLOATING_COMPOSER_COMMAND, undefined)\n }\n >\n Comment\n </ToolbarButton>\n ) : null}\n </>\n );\n}\n\nfunction DefaultToolbarContent() {\n const supportsTextFormat = useIsCommandRegistered(FORMAT_TEXT_COMMAND);\n const supportsThread = useIsCommandRegistered(OPEN_FLOATING_COMPOSER_COMMAND);\n\n return (\n <>\n <ToolbarSectionHistory />\n {supportsTextFormat ? (\n <>\n <ToolbarSeparator />\n <ToolbarBlockSelector />\n <ToolbarSectionInline />\n </>\n ) : null}\n {supportsThread ? (\n <>\n <ToolbarSeparator />\n <ToolbarSectionCollaboration />\n </>\n ) : null}\n </>\n );\n}\n\nconst INITIAL_COMMANDS_REGISTERED_COMMAND: LexicalCommand<void> = createCommand(\n \"INITIAL_COMMANDS_REGISTERED_COMMAND\"\n);\n\n// Re-renders its surrounding component.\nfunction useRerender() {\n const [, setRerender] = useState(false);\n\n return useCallback(() => {\n setRerender((toggle) => !toggle);\n }, [setRerender]);\n}\n\nfunction createDefaultBlockSelectorItems(): ToolbarBlockSelectorItem[] {\n const items: (ToolbarBlockSelectorItem | null)[] = [\n {\n name: \"Heading 1\",\n isActive: (selectedBlock) => {\n if ($isHeadingNode(selectedBlock)) {\n const tag = selectedBlock.getTag();\n\n return tag === \"h1\";\n } else {\n return false;\n }\n },\n setActive: () =>\n $setBlocksType($getSelection(), () => $createHeadingNode(\"h1\")),\n },\n {\n name: \"Heading 2\",\n isActive: (selectedBlock) => {\n if ($isHeadingNode(selectedBlock)) {\n const tag = selectedBlock.getTag();\n\n return tag === \"h2\";\n } else {\n return false;\n }\n },\n setActive: () =>\n $setBlocksType($getSelection(), () => $createHeadingNode(\"h2\")),\n },\n {\n name: \"Heading 3\",\n isActive: (selectedBlock) => {\n if ($isHeadingNode(selectedBlock)) {\n const tag = selectedBlock.getTag();\n\n return tag === \"h3\";\n } else {\n return false;\n }\n },\n setActive: () =>\n $setBlocksType($getSelection(), () => $createHeadingNode(\"h3\")),\n },\n {\n name: \"Blockquote\",\n isActive: (selectedBlock) => selectedBlock?.getType() === \"quote\",\n setActive: () =>\n $setBlocksType($getSelection(), () => $createQuoteNode()),\n },\n ];\n\n return items.filter(Boolean) as ToolbarBlockSelectorItem[];\n}\n\nconst blockSelectorTextItem: ToolbarBlockSelectorItem = {\n name: \"Text\",\n isActive: () => false,\n setActive: () =>\n $setBlocksType($getSelection(), () => $createParagraphNode()),\n};\n\nconst ToolbarBlockSelector = forwardRef<\n HTMLButtonElement,\n ToolbarBlockSelectorProps\n>(({ items, ...props }, forwardedRef) => {\n const floatingToolbarContext = useContext(FloatingToolbarContext);\n const [editor] = useLexicalComposerContext();\n const selectedBlockElement = getSelectedBlockElement(editor);\n const resolvedItems = useMemo(() => {\n const resolvedItems = items ?? createDefaultBlockSelectorItems();\n return [blockSelectorTextItem, ...resolvedItems];\n }, [items]);\n\n const activeItem = useMemo(\n () =>\n resolvedItems.find((item) =>\n item.isActive(selectedBlockElement, editor)\n ) ?? blockSelectorTextItem,\n [selectedBlockElement, editor, resolvedItems]\n );\n\n const handleItemChange = (name: string) => {\n const item = resolvedItems.find((item) => item.name === name);\n\n if (item) {\n editor.update(() => item.setActive(editor));\n\n // If present in a floating toolbar, close it on change\n floatingToolbarContext?.close();\n }\n };\n\n return (\n <SelectPrimitive.Root\n value={activeItem.name}\n onValueChange={handleItemChange}\n >\n <ShortcutTooltip content=\"Turn into…\">\n <SelectPrimitive.Trigger asChild {...props} ref={forwardedRef}>\n <Button type=\"button\" variant=\"toolbar\">\n <SelectPrimitive.Value>{activeItem.name}</SelectPrimitive.Value>\n <SelectPrimitive.Icon className=\"lb-dropdown-chevron\">\n <ChevronDownIcon />\n </SelectPrimitive.Icon>\n </Button>\n </SelectPrimitive.Trigger>\n </ShortcutTooltip>\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n position=\"popper\"\n sideOffset={BLOCK_SELECT_SIDE_OFFSET}\n collisionPadding={FLOATING_ELEMENT_COLLISION_PADDING}\n className=\"lb-root lb-portal lb-elevation lb-dropdown\"\n >\n {resolvedItems.map((item) => (\n <SelectPrimitive.Item\n key={item.name}\n value={item.name}\n className=\"lb-dropdown-item\"\n >\n <span className=\"lb-dropdown-item-label\">\n <SelectPrimitive.ItemText>{item.name}</SelectPrimitive.ItemText>\n </span>\n {item.name === activeItem.name ? (\n <span className=\"lb-dropdown-item-accessory lb-icon-container\">\n <CheckIcon />\n </span>\n ) : null}\n </SelectPrimitive.Item>\n ))}\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n );\n});\n\nexport const Toolbar = Object.assign(\n forwardRef<HTMLDivElement, ToolbarProps>(\n (\n { before, after, children = DefaultToolbarContent, className, ...props },\n forwardedRef\n ) => {\n const [editor] = useLexicalComposerContext();\n const [commandsRegistered, setCommandsRegistered] = useState(false);\n const rerender = useRerender();\n\n const slotProps: ToolbarSlotProps = { editor };\n\n // Ensures that `useIsCommandRegistered` returns correct values initially.\n // It registers a low-priority one-time command to re-render once all initial commands are registered.\n useEffect(() => {\n if (commandsRegistered) {\n return;\n }\n\n const unregister = editor.registerCommand(\n INITIAL_COMMANDS_REGISTERED_COMMAND,\n () => {\n setCommandsRegistered(true);\n return true;\n },\n COMMAND_PRIORITY_LOW\n );\n\n editor.dispatchCommand(INITIAL_COMMANDS_REGISTERED_COMMAND, undefined);\n\n return unregister;\n }, [editor, commandsRegistered]);\n\n // Re-render when the selection changes to ensure components like toggles are updated.\n useEffect(() => {\n const unregister = editor.registerUpdateListener(({ tags }) => {\n return editor.getEditorState().read(() => {\n // Ignore selection updates related to collaboration\n if (tags.has(\"collaboration\")) return;\n\n rerender();\n });\n });\n\n return unregister;\n }, [editor, rerender]);\n\n return (\n <TooltipProvider>\n <div\n ref={forwardedRef}\n role=\"toolbar\"\n aria-label=\"Toolbar\"\n aria-orientation=\"horizontal\"\n className={classNames(\"lb-root lb-lexical-toolbar\", className)}\n {...props}\n >\n {applyToolbarSlot(before, slotProps)}\n {applyToolbarSlot(children, slotProps)}\n {applyToolbarSlot(after, slotProps)}\n </div>\n </TooltipProvider>\n );\n }\n ),\n {\n Button: ToolbarButton,\n Toggle: ToolbarToggle,\n Separator: ToolbarSeparator,\n SectionHistory: ToolbarSectionHistory,\n SectionInline: ToolbarSectionInline,\n SectionCollaboration: ToolbarSectionCollaboration,\n BlockSelector: ToolbarBlockSelector,\n }\n);\n"],"names":["jsx","forwardRef","ShortcutTooltip","Button","TogglePrimitive","classNames","useLexicalComposerContext","useState","useEffect","mergeRegister","CAN_UNDO_COMMAND","COMMAND_PRIORITY_CRITICAL","CAN_REDO_COMMAND","jsxs","Fragment","UndoIcon","UNDO_COMMAND","RedoIcon","REDO_COMMAND","useIsCommandRegistered","FORMAT_TEXT_COMMAND","BoldIcon","isTextFormatActive","ItalicIcon","UnderlineIcon","StrikethroughIcon","CodeIcon","OPEN_FLOATING_COMPOSER_COMMAND","CommentIcon","createCommand","useCallback","$isHeadingNode","$setBlocksType","$getSelection","$createHeadingNode","$createQuoteNode","$createParagraphNode","floatingToolbarContext","useContext","FloatingToolbarContext","getSelectedBlockElement","useMemo","resolvedItems","item","SelectPrimitive","ChevronDownIcon","CheckIcon","COMMAND_PRIORITY_LOW","TooltipProvider"],"mappings":"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"}