@liveblocks/react-lexical 2.15.2 → 2.16.0-toolbars2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/comments/floating-composer.js +4 -2
- package/dist/comments/floating-composer.js.map +1 -1
- package/dist/comments/floating-composer.mjs +4 -2
- package/dist/comments/floating-composer.mjs.map +1 -1
- package/dist/get-selected-block-element.js +26 -0
- package/dist/get-selected-block-element.js.map +1 -0
- package/dist/get-selected-block-element.mjs +24 -0
- package/dist/get-selected-block-element.mjs.map +1 -0
- package/dist/index.d.mts +63 -12
- package/dist/index.d.ts +63 -12
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/is-command-registered.js +11 -0
- package/dist/is-command-registered.js.map +1 -0
- package/dist/is-command-registered.mjs +9 -0
- package/dist/is-command-registered.mjs.map +1 -0
- package/dist/is-text-format-active.js +16 -0
- package/dist/is-text-format-active.js.map +1 -0
- package/dist/is-text-format-active.mjs +14 -0
- package/dist/is-text-format-active.mjs.map +1 -0
- package/dist/toolbar/floating-toolbar.js +309 -0
- package/dist/toolbar/floating-toolbar.js.map +1 -0
- package/dist/toolbar/floating-toolbar.mjs +306 -0
- package/dist/toolbar/floating-toolbar.mjs.map +1 -0
- package/dist/toolbar/shared.js +39 -0
- package/dist/toolbar/shared.js.map +1 -0
- package/dist/toolbar/shared.mjs +36 -0
- package/dist/toolbar/shared.mjs.map +1 -0
- package/dist/toolbar/toolbar.js +408 -0
- package/dist/toolbar/toolbar.js.map +1 -0
- package/dist/toolbar/toolbar.mjs +383 -0
- package/dist/toolbar/toolbar.mjs.map +1 -0
- package/dist/version-history/history-version-preview.js +3 -10
- package/dist/version-history/history-version-preview.js.map +1 -1
- package/dist/version-history/history-version-preview.mjs +3 -10
- package/dist/version-history/history-version-preview.mjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/version.mjs.map +1 -1
- package/package.json +12 -8
- package/src/styles/constants.css +1 -1
- package/src/styles/index.css +44 -6
- package/styles.css +1 -1
- package/styles.css.map +1 -1
|
@@ -0,0 +1,408 @@
|
|
|
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 shared = require('./shared.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 = react.useContext(shared.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?.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(shared.FloatingToolbarExternal, {
|
|
317
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.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",
|
|
322
|
+
children: resolvedItems.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(SelectPrimitive__namespace.Item, {
|
|
323
|
+
value: item.name,
|
|
324
|
+
className: "lb-dropdown-item",
|
|
325
|
+
children: [
|
|
326
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
327
|
+
className: "lb-dropdown-item-label",
|
|
328
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, {
|
|
329
|
+
children: item.name
|
|
330
|
+
})
|
|
331
|
+
}),
|
|
332
|
+
item.name === activeItem.name ? /* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
333
|
+
className: "lb-dropdown-item-accessory lb-icon-container",
|
|
334
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {})
|
|
335
|
+
}) : null
|
|
336
|
+
]
|
|
337
|
+
}, item.name))
|
|
338
|
+
})
|
|
339
|
+
})
|
|
340
|
+
})
|
|
341
|
+
]
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
const Toolbar = Object.assign(
|
|
345
|
+
react.forwardRef(
|
|
346
|
+
({ before, after, children = DefaultToolbarContent, className, ...props }, forwardedRef) => {
|
|
347
|
+
const [editor] = LexicalComposerContext.useLexicalComposerContext();
|
|
348
|
+
const [commandsRegistered, setCommandsRegistered] = react.useState(false);
|
|
349
|
+
const rerender = useRerender();
|
|
350
|
+
const slotProps = { editor };
|
|
351
|
+
react.useEffect(() => {
|
|
352
|
+
if (commandsRegistered) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const unregister = editor.registerCommand(
|
|
356
|
+
INITIAL_COMMANDS_REGISTERED_COMMAND,
|
|
357
|
+
() => {
|
|
358
|
+
setCommandsRegistered(true);
|
|
359
|
+
return true;
|
|
360
|
+
},
|
|
361
|
+
lexical.COMMAND_PRIORITY_LOW
|
|
362
|
+
);
|
|
363
|
+
editor.dispatchCommand(INITIAL_COMMANDS_REGISTERED_COMMAND, void 0);
|
|
364
|
+
return unregister;
|
|
365
|
+
}, [editor, commandsRegistered]);
|
|
366
|
+
react.useEffect(() => {
|
|
367
|
+
const unregister = editor.registerUpdateListener(({ tags }) => {
|
|
368
|
+
return editor.getEditorState().read(() => {
|
|
369
|
+
if (tags.has("collaboration"))
|
|
370
|
+
return;
|
|
371
|
+
rerender();
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
return unregister;
|
|
375
|
+
}, [editor, rerender]);
|
|
376
|
+
return /* @__PURE__ */ jsxRuntime.jsx(_private.TooltipProvider, {
|
|
377
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
378
|
+
ref: forwardedRef,
|
|
379
|
+
role: "toolbar",
|
|
380
|
+
"aria-label": "Toolbar",
|
|
381
|
+
"aria-orientation": "horizontal",
|
|
382
|
+
className: classnames.classNames("lb-root lb-lexical-toolbar", className),
|
|
383
|
+
...props,
|
|
384
|
+
children: [
|
|
385
|
+
applyToolbarSlot(before, slotProps),
|
|
386
|
+
applyToolbarSlot(children, slotProps),
|
|
387
|
+
applyToolbarSlot(after, slotProps)
|
|
388
|
+
]
|
|
389
|
+
})
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
),
|
|
393
|
+
{
|
|
394
|
+
Button: ToolbarButton,
|
|
395
|
+
Toggle: ToolbarToggle,
|
|
396
|
+
Separator: ToolbarSeparator,
|
|
397
|
+
SectionHistory: ToolbarSectionHistory,
|
|
398
|
+
SectionInline: ToolbarSectionInline,
|
|
399
|
+
SectionCollaboration: ToolbarSectionCollaboration,
|
|
400
|
+
BlockSelector: ToolbarBlockSelector
|
|
401
|
+
}
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
exports.BLOCK_SELECT_SIDE_OFFSET = BLOCK_SELECT_SIDE_OFFSET;
|
|
405
|
+
exports.FLOATING_ELEMENT_COLLISION_PADDING = FLOATING_ELEMENT_COLLISION_PADDING;
|
|
406
|
+
exports.Toolbar = Toolbar;
|
|
407
|
+
exports.applyToolbarSlot = applyToolbarSlot;
|
|
408
|
+
//# 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, FloatingToolbarExternal } from \"./shared\";\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 <FloatingToolbarExternal>\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>\n {item.name}\n </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 </FloatingToolbarExternal>\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","useContext","FloatingToolbarContext","getSelectedBlockElement","useMemo","resolvedItems","item","SelectPrimitive","ChevronDownIcon","FloatingToolbarExternal","CheckIcon","COMMAND_PRIORITY_LOW","TooltipProvider"],"mappings":"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"}
|