@liveblocks/react-lexical 2.16.0-toolbars1 → 2.16.0-toolbars3

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.
@@ -11,7 +11,7 @@ var classnames = require('../classnames.js');
11
11
  var floatingComposer = require('../comments/floating-composer.js');
12
12
  var createDomRange = require('../create-dom-range.js');
13
13
  var isCommandRegistered = require('../is-command-registered.js');
14
- var floatingToolbarContext = require('./floating-toolbar-context.js');
14
+ var shared = require('./shared.js');
15
15
  var toolbar = require('./toolbar.js');
16
16
 
17
17
  const FLOATING_TOOLBAR_COLLISION_PADDING = 10;
@@ -36,246 +36,274 @@ function DefaultFloatingToolbarContent() {
36
36
  ]
37
37
  });
38
38
  }
39
- const FloatingToolbar = react.forwardRef(
40
- ({
41
- children = DefaultFloatingToolbarContent,
42
- before,
43
- after,
44
- position = "top",
45
- offset: sideOffset = 6,
46
- onPointerDown,
47
- onFocus,
48
- onBlur,
49
- className,
50
- ...props
51
- }, forwardedRef) => {
52
- const toolbarRef = react.useRef(null);
53
- const [isPointerDown, setPointerDown] = react.useState(false);
54
- const [editor] = LexicalComposerContext.useLexicalComposerContext();
55
- const [isFocused, setFocused] = react.useState(false);
56
- const [isManuallyClosed, setManuallyClosed] = react.useState(false);
57
- const isEditable = editor.isEditable();
58
- const [hasSelectionRange, setHasSelectionRange] = react.useState(false);
59
- const isOpen = isFocused && !isPointerDown && hasSelectionRange && !isManuallyClosed;
60
- const [delayedIsOpen, setDelayedIsOpen] = react.useState(isOpen);
61
- const delayedIsOpenTimeoutRef = react.useRef();
62
- react.useEffect(() => {
63
- setManuallyClosed(false);
64
- }, [isFocused, hasSelectionRange, editor]);
65
- react.useEffect(() => {
66
- const root = editor.getRootElement();
67
- if (!root) {
68
- return;
69
- }
70
- const handleFocus2 = () => {
71
- setFocused(true);
72
- };
73
- const handleBlur2 = (event) => {
74
- if (event.relatedTarget && toolbarRef.current?.contains(event.relatedTarget)) {
75
- return;
76
- }
77
- if (event.relatedTarget === editor.getRootElement()) {
39
+ const FloatingToolbar = Object.assign(
40
+ react.forwardRef(
41
+ ({
42
+ children = DefaultFloatingToolbarContent,
43
+ before,
44
+ after,
45
+ position = "top",
46
+ offset: sideOffset = 6,
47
+ onPointerDown,
48
+ onFocus,
49
+ onBlur,
50
+ className,
51
+ ...props
52
+ }, forwardedRef) => {
53
+ const toolbarRef = react.useRef(null);
54
+ const externalIds = _private.useInitial(() => /* @__PURE__ */ new Set());
55
+ const [isPointerDown, setPointerDown] = react.useState(false);
56
+ const [editor] = LexicalComposerContext.useLexicalComposerContext();
57
+ const [isFocused, setFocused] = react.useState(false);
58
+ const [isManuallyClosed, setManuallyClosed] = react.useState(false);
59
+ const [hasSelectionRange, setHasSelectionRange] = react.useState(false);
60
+ const isOpen = isFocused && !isPointerDown && hasSelectionRange && !isManuallyClosed;
61
+ const [delayedIsOpen, setDelayedIsOpen] = react.useState(isOpen);
62
+ const delayedIsOpenTimeoutRef = react.useRef();
63
+ react.useEffect(() => {
64
+ setManuallyClosed(false);
65
+ }, [isFocused, hasSelectionRange, editor]);
66
+ react.useEffect(() => {
67
+ const root = editor.getRootElement();
68
+ if (!root) {
78
69
  return;
79
70
  }
80
- setFocused(false);
81
- };
82
- root.addEventListener("focus", handleFocus2);
83
- root.addEventListener("blur", handleBlur2);
84
- return () => {
85
- root.removeEventListener("focus", handleFocus2);
86
- root.removeEventListener("blur", handleBlur2);
87
- };
88
- }, [editor]);
89
- const handleFocus = react.useCallback(
90
- (event) => {
91
- onFocus?.(event);
92
- if (!event.isDefaultPrevented()) {
71
+ const handleFocus2 = () => {
93
72
  setFocused(true);
94
- }
95
- },
96
- [onFocus]
97
- );
98
- const handleBlur = react.useCallback(
99
- (event) => {
100
- onBlur?.(event);
101
- if (!event.isDefaultPrevented()) {
73
+ };
74
+ const handleBlur2 = (event) => {
102
75
  if (event.relatedTarget && toolbarRef.current?.contains(event.relatedTarget)) {
103
76
  return;
104
77
  }
105
- if (event.relatedTarget === editor?.getRootElement()) {
78
+ if (event.relatedTarget === editor.getRootElement()) {
106
79
  return;
107
80
  }
81
+ for (const externalId of externalIds) {
82
+ if (document.getElementById(externalId)?.contains(event.relatedTarget)) {
83
+ return;
84
+ }
85
+ }
108
86
  setFocused(false);
87
+ };
88
+ root.addEventListener("focus", handleFocus2);
89
+ root.addEventListener("blur", handleBlur2);
90
+ return () => {
91
+ root.removeEventListener("focus", handleFocus2);
92
+ root.removeEventListener("blur", handleBlur2);
93
+ };
94
+ }, [editor, externalIds]);
95
+ const handleFocus = react.useCallback(
96
+ (event) => {
97
+ onFocus?.(event);
98
+ if (!event.isDefaultPrevented()) {
99
+ setFocused(true);
100
+ }
101
+ },
102
+ [onFocus]
103
+ );
104
+ const handleBlur = react.useCallback(
105
+ (event) => {
106
+ onBlur?.(event);
107
+ if (!event.isDefaultPrevented()) {
108
+ if (event.relatedTarget && toolbarRef.current?.contains(event.relatedTarget)) {
109
+ return;
110
+ }
111
+ if (event.relatedTarget === editor?.getRootElement()) {
112
+ return;
113
+ }
114
+ for (const externalId of externalIds) {
115
+ if (document.getElementById(externalId)?.contains(event.relatedTarget)) {
116
+ return;
117
+ }
118
+ }
119
+ setFocused(false);
120
+ }
121
+ },
122
+ [onBlur, editor, externalIds]
123
+ );
124
+ react.useEffect(() => {
125
+ if (isOpen) {
126
+ delayedIsOpenTimeoutRef.current = window.setTimeout(() => {
127
+ setDelayedIsOpen(true);
128
+ }, FLOATING_TOOLBAR_OPEN_DELAY);
129
+ } else {
130
+ setDelayedIsOpen(false);
109
131
  }
110
- },
111
- [onBlur, editor]
112
- );
113
- react.useEffect(() => {
114
- if (isOpen) {
115
- delayedIsOpenTimeoutRef.current = window.setTimeout(() => {
116
- setDelayedIsOpen(true);
117
- }, FLOATING_TOOLBAR_OPEN_DELAY);
118
- } else {
119
- setDelayedIsOpen(false);
120
- }
121
- return () => {
122
- window.clearTimeout(delayedIsOpenTimeoutRef.current);
123
- };
124
- }, [isOpen]);
125
- const floatingOptions = react.useMemo(() => {
126
- const detectOverflowOptions = {
127
- padding: FLOATING_TOOLBAR_COLLISION_PADDING
128
- };
129
- return {
130
- strategy: "fixed",
131
- placement: position,
132
- middleware: [
133
- reactDom.inline(detectOverflowOptions),
134
- reactDom.flip({ ...detectOverflowOptions, crossAxis: false }),
135
- reactDom.hide(detectOverflowOptions),
136
- reactDom.shift({
137
- ...detectOverflowOptions,
138
- limiter: reactDom.limitShift()
139
- }),
140
- reactDom.offset(sideOffset),
141
- reactDom.size(detectOverflowOptions)
142
- ],
143
- whileElementsMounted: (...args) => {
144
- return reactDom.autoUpdate(...args, {
145
- animationFrame: true
146
- });
147
- }
148
- };
149
- }, [position, sideOffset]);
150
- const {
151
- refs: { setReference, setFloating },
152
- strategy,
153
- x,
154
- y,
155
- isPositioned
156
- } = reactDom.useFloating({
157
- ...floatingOptions,
158
- open: delayedIsOpen
159
- });
160
- const mergedRefs = _private.useRefs(forwardedRef, toolbarRef, setFloating);
161
- const handlePointerDown = react.useCallback(
162
- (event) => {
163
- onPointerDown?.(event);
164
- event.stopPropagation();
165
- if (event.target === toolbarRef.current) {
166
- event.preventDefault();
167
- }
168
- },
169
- [onPointerDown]
170
- );
171
- react.useEffect(() => {
172
- if (!editor || !isEditable) {
173
- return;
174
- }
175
- const handlePointerDown2 = () => {
176
- setPointerDown(true);
177
- };
178
- const handlePointerUp = () => {
179
- setPointerDown(false);
180
- };
181
- document.addEventListener("pointerdown", handlePointerDown2);
182
- document.addEventListener("pointercancel", handlePointerUp);
183
- document.addEventListener("pointerup", handlePointerUp);
184
- return () => {
185
- document.removeEventListener("pointerdown", handlePointerDown2);
186
- document.removeEventListener("pointercancel", handlePointerUp);
187
- document.removeEventListener("pointerup", handlePointerUp);
188
- };
189
- }, [editor, isEditable]);
190
- react.useEffect(() => {
191
- const unregister = editor.registerUpdateListener(({ tags }) => {
192
- return editor.getEditorState().read(() => {
193
- if (tags.has("collaboration"))
194
- return;
195
- setManuallyClosed(false);
196
- const selection = lexical.$getSelection();
197
- if (!lexical.$isRangeSelection(selection) || selection.isCollapsed()) {
198
- setHasSelectionRange(false);
199
- setReference(null);
200
- return;
132
+ return () => {
133
+ window.clearTimeout(delayedIsOpenTimeoutRef.current);
134
+ };
135
+ }, [isOpen]);
136
+ const floatingOptions = react.useMemo(() => {
137
+ const detectOverflowOptions = {
138
+ padding: FLOATING_TOOLBAR_COLLISION_PADDING
139
+ };
140
+ return {
141
+ strategy: "fixed",
142
+ placement: position,
143
+ middleware: [
144
+ reactDom.inline(detectOverflowOptions),
145
+ reactDom.flip({ ...detectOverflowOptions, crossAxis: false }),
146
+ reactDom.hide(detectOverflowOptions),
147
+ reactDom.shift({
148
+ ...detectOverflowOptions,
149
+ limiter: reactDom.limitShift()
150
+ }),
151
+ reactDom.offset(sideOffset),
152
+ reactDom.size(detectOverflowOptions)
153
+ ],
154
+ whileElementsMounted: (...args) => {
155
+ return reactDom.autoUpdate(...args, {
156
+ animationFrame: true
157
+ });
201
158
  }
202
- const { anchor, focus } = selection;
203
- const range = createDomRange.createDOMRange(
204
- editor,
205
- anchor.getNode(),
206
- anchor.offset,
207
- focus.getNode(),
208
- focus.offset
209
- );
210
- setHasSelectionRange(true);
211
- setReference(range);
212
- });
159
+ };
160
+ }, [position, sideOffset]);
161
+ const {
162
+ refs: { setReference, setFloating },
163
+ strategy,
164
+ x,
165
+ y,
166
+ isPositioned
167
+ } = reactDom.useFloating({
168
+ ...floatingOptions,
169
+ open: delayedIsOpen
213
170
  });
214
- return unregister;
215
- }, [editor, setReference]);
216
- react.useEffect(() => {
217
- const root = editor.getRootElement();
218
- if (!root || !delayedIsOpen) {
219
- return;
220
- }
221
- const handleKeyDown = (event) => {
222
- if (event.target !== root && event.defaultPrevented) {
171
+ const mergedRefs = _private.useRefs(forwardedRef, toolbarRef, setFloating);
172
+ const handlePointerDown = react.useCallback(
173
+ (event) => {
174
+ onPointerDown?.(event);
175
+ event.stopPropagation();
176
+ if (event.target === toolbarRef.current) {
177
+ event.preventDefault();
178
+ }
179
+ },
180
+ [onPointerDown]
181
+ );
182
+ react.useEffect(() => {
183
+ if (!editor) {
223
184
  return;
224
185
  }
225
- if (event.key === "Escape") {
226
- event.preventDefault();
227
- event.stopPropagation();
228
- editor.focus();
229
- setManuallyClosed(true);
186
+ const handlePointerDown2 = () => {
187
+ setPointerDown(true);
188
+ };
189
+ const handlePointerUp = () => {
190
+ setPointerDown(false);
191
+ };
192
+ const root = editor.getRootElement();
193
+ if (!root) {
194
+ return;
230
195
  }
231
- };
232
- root.addEventListener("keydown", handleKeyDown);
233
- return () => {
234
- root.removeEventListener("keydown", handleKeyDown);
235
- };
236
- }, [editor, delayedIsOpen]);
237
- const close = react.useCallback(() => {
238
- editor.focus();
239
- setManuallyClosed(true);
240
- }, [editor, setManuallyClosed]);
241
- if (!delayedIsOpen) {
242
- return null;
243
- }
244
- const slotProps = { editor };
245
- return reactDom$1.createPortal(
246
- /* @__PURE__ */ jsxRuntime.jsx(_private.TooltipProvider, {
247
- children: /* @__PURE__ */ jsxRuntime.jsx(floatingToolbarContext.FloatingToolbarContext.Provider, {
248
- value: { close },
249
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
250
- role: "toolbar",
251
- "aria-label": "Floating toolbar",
252
- "aria-orientation": "horizontal",
253
- className: classnames.classNames(
254
- "lb-root lb-portal lb-elevation lb-lexical-floating-toolbar lb-lexical-toolbar",
255
- className
256
- ),
257
- ref: mergedRefs,
258
- style: {
259
- position: strategy,
260
- top: 0,
261
- left: 0,
262
- transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)",
263
- minWidth: "max-content"
264
- },
265
- onPointerDown: handlePointerDown,
266
- onFocus: handleFocus,
267
- onBlur: handleBlur,
268
- ...props,
269
- children: [
270
- toolbar.applyToolbarSlot(before, slotProps),
271
- toolbar.applyToolbarSlot(children, slotProps),
272
- toolbar.applyToolbarSlot(after, slotProps)
273
- ]
196
+ root.addEventListener("pointerdown", handlePointerDown2);
197
+ root.addEventListener("pointercancel", handlePointerUp);
198
+ root.addEventListener("pointerup", handlePointerUp);
199
+ return () => {
200
+ root.removeEventListener("pointerdown", handlePointerDown2);
201
+ root.removeEventListener("pointercancel", handlePointerUp);
202
+ root.removeEventListener("pointerup", handlePointerUp);
203
+ };
204
+ }, [editor]);
205
+ react.useEffect(() => {
206
+ const unregister = editor.registerUpdateListener(({ tags }) => {
207
+ return editor.getEditorState().read(() => {
208
+ if (tags.has("collaboration"))
209
+ return;
210
+ setManuallyClosed(false);
211
+ const selection = lexical.$getSelection();
212
+ if (!lexical.$isRangeSelection(selection) || selection.isCollapsed()) {
213
+ setHasSelectionRange(false);
214
+ setReference(null);
215
+ return;
216
+ }
217
+ const { anchor, focus } = selection;
218
+ const range = createDomRange.createDOMRange(
219
+ editor,
220
+ anchor.getNode(),
221
+ anchor.offset,
222
+ focus.getNode(),
223
+ focus.offset
224
+ );
225
+ setHasSelectionRange(true);
226
+ setReference(range);
227
+ });
228
+ });
229
+ return unregister;
230
+ }, [editor, setReference]);
231
+ react.useEffect(() => {
232
+ const root = editor.getRootElement();
233
+ if (!root || !delayedIsOpen) {
234
+ return;
235
+ }
236
+ const handleKeyDown = (event) => {
237
+ if (event.target !== root && event.defaultPrevented) {
238
+ return;
239
+ }
240
+ if (event.key === "Escape") {
241
+ event.preventDefault();
242
+ event.stopPropagation();
243
+ editor.focus();
244
+ setManuallyClosed(true);
245
+ }
246
+ };
247
+ root.addEventListener("keydown", handleKeyDown);
248
+ return () => {
249
+ root.removeEventListener("keydown", handleKeyDown);
250
+ };
251
+ }, [editor, delayedIsOpen]);
252
+ const close = react.useCallback(() => {
253
+ editor.focus();
254
+ setManuallyClosed(true);
255
+ }, [editor, setManuallyClosed]);
256
+ const registerExternal = react.useCallback(
257
+ (id) => {
258
+ externalIds.add(id);
259
+ return () => {
260
+ externalIds.delete(id);
261
+ };
262
+ },
263
+ [externalIds]
264
+ );
265
+ if (!delayedIsOpen) {
266
+ return null;
267
+ }
268
+ const slotProps = { editor };
269
+ return reactDom$1.createPortal(
270
+ /* @__PURE__ */ jsxRuntime.jsx(_private.TooltipProvider, {
271
+ children: /* @__PURE__ */ jsxRuntime.jsx(shared.FloatingToolbarContext.Provider, {
272
+ value: { close, registerExternal },
273
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
274
+ role: "toolbar",
275
+ "aria-label": "Floating toolbar",
276
+ "aria-orientation": "horizontal",
277
+ className: classnames.classNames(
278
+ "lb-root lb-portal lb-elevation lb-lexical-floating-toolbar lb-lexical-toolbar",
279
+ className
280
+ ),
281
+ ref: mergedRefs,
282
+ style: {
283
+ position: strategy,
284
+ top: 0,
285
+ left: 0,
286
+ transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)",
287
+ minWidth: "max-content"
288
+ },
289
+ onPointerDown: handlePointerDown,
290
+ onFocus: handleFocus,
291
+ onBlur: handleBlur,
292
+ ...props,
293
+ children: [
294
+ toolbar.applyToolbarSlot(before, slotProps),
295
+ toolbar.applyToolbarSlot(children, slotProps),
296
+ toolbar.applyToolbarSlot(after, slotProps)
297
+ ]
298
+ })
274
299
  })
275
- })
276
- }),
277
- document.body
278
- );
300
+ }),
301
+ document.body
302
+ );
303
+ }
304
+ ),
305
+ {
306
+ External: shared.FloatingToolbarExternal
279
307
  }
280
308
  );
281
309
 
@@ -1 +1 @@
1
- {"version":3,"file":"floating-toolbar.js","sources":["../../src/toolbar/floating-toolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { TooltipProvider, useRefs } from \"@liveblocks/react-ui/_private\";\nimport { $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND } from \"lexical\";\nimport type {\n ComponentProps,\n FocusEvent as ReactFocusEvent,\n PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { classNames } from \"../classnames\";\nimport { OPEN_FLOATING_COMPOSER_COMMAND } from \"../comments/floating-composer\";\nimport { createDOMRange } from \"../create-dom-range\";\nimport { useIsCommandRegistered } from \"../is-command-registered\";\nimport type { FloatingPosition } from \"../types\";\nimport { FloatingToolbarContext } from \"./floating-toolbar-context\";\nimport {\n applyToolbarSlot,\n Toolbar,\n type ToolbarSlot,\n type ToolbarSlotProps,\n} from \"./toolbar\";\n\nexport interface FloatingToolbarProps\n extends Omit<ComponentProps<\"div\">, \"children\"> {\n position?: FloatingPosition;\n offset?: number;\n children?: ToolbarSlot;\n before?: ToolbarSlot;\n after?: ToolbarSlot;\n}\n\nexport const FLOATING_TOOLBAR_COLLISION_PADDING = 10;\nconst FLOATING_TOOLBAR_OPEN_DELAY = 50;\n\nfunction DefaultFloatingToolbarContent() {\n const supportsTextFormat = useIsCommandRegistered(FORMAT_TEXT_COMMAND);\n const supportsThread = useIsCommandRegistered(OPEN_FLOATING_COMPOSER_COMMAND);\n\n return (\n <>\n {supportsTextFormat ? (\n <>\n <Toolbar.BlockSelector />\n <Toolbar.SectionInline />\n </>\n ) : null}\n {supportsThread ? (\n <>\n <Toolbar.Separator />\n <Toolbar.SectionCollaboration />\n </>\n ) : null}\n </>\n );\n}\n\nexport const FloatingToolbar = forwardRef<HTMLDivElement, FloatingToolbarProps>(\n (\n {\n children = DefaultFloatingToolbarContent,\n before,\n after,\n position = \"top\",\n offset: sideOffset = 6,\n onPointerDown,\n onFocus,\n onBlur,\n className,\n ...props\n },\n forwardedRef\n ) => {\n const toolbarRef = useRef<HTMLDivElement>(null);\n const [isPointerDown, setPointerDown] = useState(false);\n const [editor] = useLexicalComposerContext();\n const [isFocused, setFocused] = useState(false);\n const [isManuallyClosed, setManuallyClosed] = useState(false);\n const isEditable = editor.isEditable();\n const [hasSelectionRange, setHasSelectionRange] = useState(false);\n\n const isOpen =\n isFocused && !isPointerDown && hasSelectionRange && !isManuallyClosed;\n const [delayedIsOpen, setDelayedIsOpen] = useState(isOpen);\n const delayedIsOpenTimeoutRef = useRef<number>();\n\n // Reset the manually closed state when there's another change\n useEffect(() => {\n setManuallyClosed(false);\n }, [isFocused, hasSelectionRange, editor]);\n\n // Don't close when the focus moves from the editor to the toolbar\n useEffect(() => {\n const root = editor.getRootElement();\n\n if (!root) {\n return;\n }\n\n const handleFocus = () => {\n setFocused(true);\n };\n\n const handleBlur = (event: FocusEvent) => {\n if (\n event.relatedTarget &&\n toolbarRef.current?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n\n if (event.relatedTarget === editor.getRootElement()) {\n return;\n }\n\n setFocused(false);\n };\n\n root.addEventListener(\"focus\", handleFocus);\n root.addEventListener(\"blur\", handleBlur);\n\n return () => {\n root.removeEventListener(\"focus\", handleFocus);\n root.removeEventListener(\"blur\", handleBlur);\n };\n }, [editor]);\n\n const handleFocus = useCallback(\n (event: ReactFocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(true);\n }\n },\n [onFocus]\n );\n\n // Close the toolbar when the it loses focus to something else than the editor\n const handleBlur = useCallback(\n (event: ReactFocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n\n if (!event.isDefaultPrevented()) {\n if (\n event.relatedTarget &&\n toolbarRef.current?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n\n if (event.relatedTarget === editor?.getRootElement()) {\n return;\n }\n\n setFocused(false);\n }\n },\n [onBlur, editor]\n );\n\n // Delay the opening of the toolbar to avoid flickering issues\n useEffect(() => {\n if (isOpen) {\n delayedIsOpenTimeoutRef.current = window.setTimeout(() => {\n setDelayedIsOpen(true);\n }, FLOATING_TOOLBAR_OPEN_DELAY);\n } else {\n setDelayedIsOpen(false);\n }\n\n return () => {\n window.clearTimeout(delayedIsOpenTimeoutRef.current);\n };\n }, [isOpen]);\n\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_TOOLBAR_COLLISION_PADDING,\n };\n\n return {\n strategy: \"fixed\",\n placement: position,\n middleware: [\n inline(detectOverflowOptions),\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n offset(sideOffset),\n size(detectOverflowOptions),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [position, sideOffset]);\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n isPositioned,\n } = useFloating({\n ...floatingOptions,\n open: delayedIsOpen,\n });\n const mergedRefs = useRefs(forwardedRef, toolbarRef, setFloating);\n\n const handlePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n event.stopPropagation();\n\n // Prevent the toolbar from closing when clicking on the toolbar itself\n if (event.target === toolbarRef.current) {\n event.preventDefault();\n }\n },\n [onPointerDown]\n );\n\n useEffect(() => {\n if (!editor || !isEditable) {\n return;\n }\n\n const handlePointerDown = () => {\n setPointerDown(true);\n };\n const handlePointerUp = () => {\n setPointerDown(false);\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"pointercancel\", handlePointerUp);\n document.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"pointercancel\", handlePointerUp);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [editor, isEditable]);\n\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 setManuallyClosed(false);\n\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || selection.isCollapsed()) {\n setHasSelectionRange(false);\n setReference(null);\n return;\n }\n\n const { anchor, focus } = selection;\n\n const range = createDOMRange(\n editor,\n anchor.getNode(),\n anchor.offset,\n focus.getNode(),\n focus.offset\n );\n\n setHasSelectionRange(true);\n setReference(range);\n });\n });\n\n return unregister;\n }, [editor, setReference]);\n\n useEffect(() => {\n const root = editor.getRootElement();\n\n if (!root || !delayedIsOpen) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.target !== root && event.defaultPrevented) {\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n editor.focus();\n setManuallyClosed(true);\n }\n };\n\n root.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n root.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, delayedIsOpen]);\n\n const close = useCallback(() => {\n editor.focus();\n setManuallyClosed(true);\n }, [editor, setManuallyClosed]);\n\n if (!delayedIsOpen) {\n return null;\n }\n\n const slotProps: ToolbarSlotProps = { editor };\n\n return createPortal(\n <TooltipProvider>\n <FloatingToolbarContext.Provider value={{ close }}>\n <div\n role=\"toolbar\"\n aria-label=\"Floating toolbar\"\n aria-orientation=\"horizontal\"\n className={classNames(\n \"lb-root lb-portal lb-elevation lb-lexical-floating-toolbar lb-lexical-toolbar\",\n className\n )}\n ref={mergedRefs}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n minWidth: \"max-content\",\n }}\n onPointerDown={handlePointerDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {applyToolbarSlot(before, slotProps)}\n {applyToolbarSlot(children, slotProps)}\n {applyToolbarSlot(after, slotProps)}\n </div>\n </FloatingToolbarContext.Provider>\n </TooltipProvider>,\n document.body\n );\n }\n);\n"],"names":["useIsCommandRegistered","FORMAT_TEXT_COMMAND","OPEN_FLOATING_COMPOSER_COMMAND","jsxs","Fragment","jsx","Toolbar","forwardRef","useRef","useState","useLexicalComposerContext","useEffect","handleFocus","handleBlur","useCallback","useMemo","inline","flip","hide","shift","limitShift","offset","size","autoUpdate","useFloating","useRefs","handlePointerDown","$getSelection","$isRangeSelection","createDOMRange","createPortal","TooltipProvider","FloatingToolbarContext","classNames","applyToolbarSlot"],"mappings":"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"}
1
+ {"version":3,"file":"floating-toolbar.js","sources":["../../src/toolbar/floating-toolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n TooltipProvider,\n useInitial,\n useRefs,\n} from \"@liveblocks/react-ui/_private\";\nimport { $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND } from \"lexical\";\nimport type {\n ComponentProps,\n FocusEvent as ReactFocusEvent,\n PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { classNames } from \"../classnames\";\nimport { OPEN_FLOATING_COMPOSER_COMMAND } from \"../comments/floating-composer\";\nimport { createDOMRange } from \"../create-dom-range\";\nimport { useIsCommandRegistered } from \"../is-command-registered\";\nimport type { FloatingPosition } from \"../types\";\nimport { FloatingToolbarContext, FloatingToolbarExternal } from \"./shared\";\nimport {\n applyToolbarSlot,\n Toolbar,\n type ToolbarSlot,\n type ToolbarSlotProps,\n} from \"./toolbar\";\n\nexport interface FloatingToolbarProps\n extends Omit<ComponentProps<\"div\">, \"children\"> {\n position?: FloatingPosition;\n offset?: number;\n children?: ToolbarSlot;\n before?: ToolbarSlot;\n after?: ToolbarSlot;\n}\n\nexport const FLOATING_TOOLBAR_COLLISION_PADDING = 10;\nconst FLOATING_TOOLBAR_OPEN_DELAY = 50;\n\nfunction DefaultFloatingToolbarContent() {\n const supportsTextFormat = useIsCommandRegistered(FORMAT_TEXT_COMMAND);\n const supportsThread = useIsCommandRegistered(OPEN_FLOATING_COMPOSER_COMMAND);\n\n return (\n <>\n {supportsTextFormat ? (\n <>\n <Toolbar.BlockSelector />\n <Toolbar.SectionInline />\n </>\n ) : null}\n {supportsThread ? (\n <>\n <Toolbar.Separator />\n <Toolbar.SectionCollaboration />\n </>\n ) : null}\n </>\n );\n}\n\nexport const FloatingToolbar = Object.assign(\n forwardRef<HTMLDivElement, FloatingToolbarProps>(\n (\n {\n children = DefaultFloatingToolbarContent,\n before,\n after,\n position = \"top\",\n offset: sideOffset = 6,\n onPointerDown,\n onFocus,\n onBlur,\n className,\n ...props\n },\n forwardedRef\n ) => {\n const toolbarRef = useRef<HTMLDivElement>(null);\n const externalIds = useInitial<Set<string>>(() => new Set());\n const [isPointerDown, setPointerDown] = useState(false);\n const [editor] = useLexicalComposerContext();\n const [isFocused, setFocused] = useState(false);\n const [isManuallyClosed, setManuallyClosed] = useState(false);\n const [hasSelectionRange, setHasSelectionRange] = useState(false);\n\n const isOpen =\n isFocused && !isPointerDown && hasSelectionRange && !isManuallyClosed;\n const [delayedIsOpen, setDelayedIsOpen] = useState(isOpen);\n const delayedIsOpenTimeoutRef = useRef<number>();\n\n // Reset the manually closed state when there's another change\n useEffect(() => {\n setManuallyClosed(false);\n }, [isFocused, hasSelectionRange, editor]);\n\n // Don't close when the focus moves from the editor to the toolbar\n useEffect(() => {\n const root = editor.getRootElement();\n\n if (!root) {\n return;\n }\n\n const handleFocus = () => {\n setFocused(true);\n };\n\n const handleBlur = (event: FocusEvent) => {\n if (\n event.relatedTarget &&\n toolbarRef.current?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n\n if (event.relatedTarget === editor.getRootElement()) {\n return;\n }\n\n for (const externalId of externalIds) {\n if (\n document\n .getElementById(externalId)\n ?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n }\n\n setFocused(false);\n };\n\n root.addEventListener(\"focus\", handleFocus);\n root.addEventListener(\"blur\", handleBlur);\n\n return () => {\n root.removeEventListener(\"focus\", handleFocus);\n root.removeEventListener(\"blur\", handleBlur);\n };\n }, [editor, externalIds]);\n\n const handleFocus = useCallback(\n (event: ReactFocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(true);\n }\n },\n [onFocus]\n );\n\n // Close the toolbar when the it loses focus to something else than the editor\n const handleBlur = useCallback(\n (event: ReactFocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n\n if (!event.isDefaultPrevented()) {\n if (\n event.relatedTarget &&\n toolbarRef.current?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n\n if (event.relatedTarget === editor?.getRootElement()) {\n return;\n }\n\n for (const externalId of externalIds) {\n if (\n document\n .getElementById(externalId)\n ?.contains(event.relatedTarget as Node)\n ) {\n return;\n }\n }\n\n setFocused(false);\n }\n },\n [onBlur, editor, externalIds]\n );\n\n // Delay the opening of the toolbar to avoid flickering issues\n useEffect(() => {\n if (isOpen) {\n delayedIsOpenTimeoutRef.current = window.setTimeout(() => {\n setDelayedIsOpen(true);\n }, FLOATING_TOOLBAR_OPEN_DELAY);\n } else {\n setDelayedIsOpen(false);\n }\n\n return () => {\n window.clearTimeout(delayedIsOpenTimeoutRef.current);\n };\n }, [isOpen]);\n\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_TOOLBAR_COLLISION_PADDING,\n };\n\n return {\n strategy: \"fixed\",\n placement: position,\n middleware: [\n inline(detectOverflowOptions),\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n offset(sideOffset),\n size(detectOverflowOptions),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [position, sideOffset]);\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n isPositioned,\n } = useFloating({\n ...floatingOptions,\n open: delayedIsOpen,\n });\n const mergedRefs = useRefs(forwardedRef, toolbarRef, setFloating);\n\n const handlePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n event.stopPropagation();\n\n // Prevent the toolbar from closing when clicking on the toolbar itself\n if (event.target === toolbarRef.current) {\n event.preventDefault();\n }\n },\n [onPointerDown]\n );\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const handlePointerDown = () => {\n setPointerDown(true);\n };\n const handlePointerUp = () => {\n setPointerDown(false);\n };\n\n const root = editor.getRootElement();\n\n if (!root) {\n return;\n }\n\n root.addEventListener(\"pointerdown\", handlePointerDown);\n root.addEventListener(\"pointercancel\", handlePointerUp);\n root.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n root.removeEventListener(\"pointerdown\", handlePointerDown);\n root.removeEventListener(\"pointercancel\", handlePointerUp);\n root.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [editor]);\n\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 setManuallyClosed(false);\n\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || selection.isCollapsed()) {\n setHasSelectionRange(false);\n setReference(null);\n return;\n }\n\n const { anchor, focus } = selection;\n\n const range = createDOMRange(\n editor,\n anchor.getNode(),\n anchor.offset,\n focus.getNode(),\n focus.offset\n );\n\n setHasSelectionRange(true);\n setReference(range);\n });\n });\n\n return unregister;\n }, [editor, setReference]);\n\n useEffect(() => {\n const root = editor.getRootElement();\n\n if (!root || !delayedIsOpen) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.target !== root && event.defaultPrevented) {\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n editor.focus();\n setManuallyClosed(true);\n }\n };\n\n root.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n root.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, delayedIsOpen]);\n\n const close = useCallback(() => {\n editor.focus();\n setManuallyClosed(true);\n }, [editor, setManuallyClosed]);\n\n const registerExternal = useCallback(\n (id: string) => {\n externalIds.add(id);\n\n return () => {\n externalIds.delete(id);\n };\n },\n [externalIds]\n );\n\n if (!delayedIsOpen) {\n return null;\n }\n\n const slotProps: ToolbarSlotProps = { editor };\n\n return createPortal(\n <TooltipProvider>\n <FloatingToolbarContext.Provider value={{ close, registerExternal }}>\n <div\n role=\"toolbar\"\n aria-label=\"Floating toolbar\"\n aria-orientation=\"horizontal\"\n className={classNames(\n \"lb-root lb-portal lb-elevation lb-lexical-floating-toolbar lb-lexical-toolbar\",\n className\n )}\n ref={mergedRefs}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n minWidth: \"max-content\",\n }}\n onPointerDown={handlePointerDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {applyToolbarSlot(before, slotProps)}\n {applyToolbarSlot(children, slotProps)}\n {applyToolbarSlot(after, slotProps)}\n </div>\n </FloatingToolbarContext.Provider>\n </TooltipProvider>,\n document.body\n );\n }\n ),\n {\n External: FloatingToolbarExternal,\n }\n);\n"],"names":["useIsCommandRegistered","FORMAT_TEXT_COMMAND","OPEN_FLOATING_COMPOSER_COMMAND","jsxs","Fragment","jsx","Toolbar","forwardRef","useRef","useInitial","useState","useLexicalComposerContext","useEffect","handleFocus","handleBlur","useCallback","useMemo","inline","flip","hide","shift","limitShift","offset","size","autoUpdate","useFloating","useRefs","handlePointerDown","$getSelection","$isRangeSelection","createDOMRange","createPortal","TooltipProvider","FloatingToolbarContext","classNames","applyToolbarSlot","FloatingToolbarExternal"],"mappings":"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"}