@liveblocks/react-tiptap 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.
Files changed (54) hide show
  1. package/dist/LiveblocksExtension.js.map +1 -1
  2. package/dist/LiveblocksExtension.mjs.map +1 -1
  3. package/dist/comments/CommentsExtension.js +6 -2
  4. package/dist/comments/CommentsExtension.js.map +1 -1
  5. package/dist/comments/CommentsExtension.mjs +7 -3
  6. package/dist/comments/CommentsExtension.mjs.map +1 -1
  7. package/dist/comments/FloatingComposer.js +27 -30
  8. package/dist/comments/FloatingComposer.js.map +1 -1
  9. package/dist/comments/FloatingComposer.mjs +29 -32
  10. package/dist/comments/FloatingComposer.mjs.map +1 -1
  11. package/dist/context.js +24 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/context.mjs +21 -0
  14. package/dist/context.mjs.map +1 -0
  15. package/dist/index.d.mts +67 -13
  16. package/dist/index.d.ts +67 -13
  17. package/dist/index.js +4 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/index.mjs +2 -0
  20. package/dist/index.mjs.map +1 -1
  21. package/dist/toolbar/FloatingToolbar.js +326 -0
  22. package/dist/toolbar/FloatingToolbar.js.map +1 -0
  23. package/dist/toolbar/FloatingToolbar.mjs +323 -0
  24. package/dist/toolbar/FloatingToolbar.mjs.map +1 -0
  25. package/dist/toolbar/Toolbar.js +354 -0
  26. package/dist/toolbar/Toolbar.js.map +1 -0
  27. package/dist/toolbar/Toolbar.mjs +329 -0
  28. package/dist/toolbar/Toolbar.mjs.map +1 -0
  29. package/dist/toolbar/shared.js +39 -0
  30. package/dist/toolbar/shared.js.map +1 -0
  31. package/dist/toolbar/shared.mjs +36 -0
  32. package/dist/toolbar/shared.mjs.map +1 -0
  33. package/dist/types.js +7 -3
  34. package/dist/types.js.map +1 -1
  35. package/dist/types.mjs +6 -3
  36. package/dist/types.mjs.map +1 -1
  37. package/dist/utils.js +17 -0
  38. package/dist/utils.js.map +1 -1
  39. package/dist/utils.mjs +16 -1
  40. package/dist/utils.mjs.map +1 -1
  41. package/dist/version-history/HistoryVersionPreview.js +79 -79
  42. package/dist/version-history/HistoryVersionPreview.js.map +1 -1
  43. package/dist/version-history/HistoryVersionPreview.mjs +79 -79
  44. package/dist/version-history/HistoryVersionPreview.mjs.map +1 -1
  45. package/dist/version.js +1 -1
  46. package/dist/version.js.map +1 -1
  47. package/dist/version.mjs +1 -1
  48. package/dist/version.mjs.map +1 -1
  49. package/package.json +11 -8
  50. package/src/styles/constants.css +2 -1
  51. package/src/styles/index.css +58 -6
  52. package/src/styles/utils.css +11 -0
  53. package/styles.css +1 -1
  54. package/styles.css.map +1 -1
@@ -0,0 +1,326 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var reactDom = require('@floating-ui/react-dom');
5
+ var _private$1 = require('@liveblocks/react/_private');
6
+ var _private = require('@liveblocks/react-ui/_private');
7
+ var react$1 = require('@tiptap/react');
8
+ var react = require('react');
9
+ var reactDom$1 = require('react-dom');
10
+ var classnames = require('../classnames.js');
11
+ var context = require('../context.js');
12
+ var shared = require('./shared.js');
13
+ var Toolbar = require('./Toolbar.js');
14
+
15
+ const FLOATING_TOOLBAR_COLLISION_PADDING = 10;
16
+ const FLOATING_TOOLBAR_OPEN_DELAY = 50;
17
+ function DefaultFloatingToolbarContent({ editor }) {
18
+ const supportsThread = "addPendingComment" in editor.commands;
19
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
20
+ children: [
21
+ /* @__PURE__ */ jsxRuntime.jsx(Toolbar.Toolbar.BlockSelector, {}),
22
+ /* @__PURE__ */ jsxRuntime.jsx(Toolbar.Toolbar.SectionInline, {}),
23
+ supportsThread ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
24
+ children: [
25
+ /* @__PURE__ */ jsxRuntime.jsx(Toolbar.Toolbar.Separator, {}),
26
+ /* @__PURE__ */ jsxRuntime.jsx(Toolbar.Toolbar.SectionCollaboration, {})
27
+ ]
28
+ }) : null
29
+ ]
30
+ });
31
+ }
32
+ const FloatingToolbar = Object.assign(
33
+ react.forwardRef(
34
+ ({
35
+ children = DefaultFloatingToolbarContent,
36
+ before,
37
+ after,
38
+ position = "top",
39
+ offset: sideOffset = 6,
40
+ editor,
41
+ onPointerDown,
42
+ onFocus,
43
+ onBlur,
44
+ className,
45
+ ...props
46
+ }, forwardedRef) => {
47
+ const toolbarRef = react.useRef(null);
48
+ const externalIds = _private.useInitial(() => /* @__PURE__ */ new Set());
49
+ const [isPointerDown, setPointerDown] = react.useState(false);
50
+ const [isFocused, setFocused] = react.useState(false);
51
+ const [isManuallyClosed, setManuallyClosed] = react.useState(false);
52
+ const isEditable = react$1.useEditorState({
53
+ editor,
54
+ equalityFn: Object.is,
55
+ selector: (ctx) => ctx.editor?.isEditable ?? false
56
+ }) ?? false;
57
+ const hasSelectionRange = react$1.useEditorState({
58
+ editor,
59
+ equalityFn: Object.is,
60
+ selector: (ctx) => {
61
+ const editor2 = ctx.editor;
62
+ if (!editor2) {
63
+ return false;
64
+ }
65
+ const { doc, selection } = editor2.state;
66
+ const { empty, ranges } = selection;
67
+ const from = Math.min(...ranges.map((range) => range.$from.pos));
68
+ const to = Math.max(...ranges.map((range) => range.$to.pos));
69
+ if (empty) {
70
+ return false;
71
+ }
72
+ return react$1.isTextSelection(selection) && doc.textBetween(from, to).length > 0;
73
+ }
74
+ }) ?? false;
75
+ const isOpen = isFocused && !isPointerDown && hasSelectionRange && !isManuallyClosed;
76
+ const [delayedIsOpen, setDelayedIsOpen] = react.useState(isOpen);
77
+ const delayedIsOpenTimeoutRef = react.useRef();
78
+ react.useEffect(() => {
79
+ if (!editor) {
80
+ return;
81
+ }
82
+ setManuallyClosed(false);
83
+ const handleSelectionChange = () => {
84
+ setManuallyClosed(false);
85
+ };
86
+ editor.on("selectionUpdate", handleSelectionChange);
87
+ return () => {
88
+ editor.off("selectionUpdate", handleSelectionChange);
89
+ };
90
+ }, [isFocused, hasSelectionRange, editor]);
91
+ react.useEffect(() => {
92
+ if (!editor) {
93
+ return;
94
+ }
95
+ const handleFocus2 = () => {
96
+ setFocused(true);
97
+ };
98
+ const handleBlur2 = (event) => {
99
+ if (event.relatedTarget && toolbarRef.current?.contains(event.relatedTarget)) {
100
+ return;
101
+ }
102
+ if (event.relatedTarget === editor.view.dom) {
103
+ return;
104
+ }
105
+ for (const externalId of externalIds) {
106
+ if (document.getElementById(externalId)?.contains(event.relatedTarget)) {
107
+ return;
108
+ }
109
+ }
110
+ setFocused(false);
111
+ };
112
+ editor.view.dom.addEventListener("focus", handleFocus2);
113
+ editor.view.dom.addEventListener("blur", handleBlur2);
114
+ return () => {
115
+ editor.view.dom.removeEventListener("focus", handleFocus2);
116
+ editor.view.dom.removeEventListener("blur", handleBlur2);
117
+ };
118
+ }, [editor, externalIds]);
119
+ const handleFocus = react.useCallback(
120
+ (event) => {
121
+ onFocus?.(event);
122
+ if (!event.isDefaultPrevented()) {
123
+ setFocused(true);
124
+ }
125
+ },
126
+ [onFocus]
127
+ );
128
+ const handleBlur = react.useCallback(
129
+ (event) => {
130
+ onBlur?.(event);
131
+ if (!event.isDefaultPrevented()) {
132
+ if (event.relatedTarget && toolbarRef.current?.contains(event.relatedTarget)) {
133
+ return;
134
+ }
135
+ if (event.relatedTarget === editor?.view.dom) {
136
+ return;
137
+ }
138
+ for (const externalId of externalIds) {
139
+ if (document.getElementById(externalId)?.contains(event.relatedTarget)) {
140
+ return;
141
+ }
142
+ }
143
+ setFocused(false);
144
+ }
145
+ },
146
+ [onBlur, editor, externalIds]
147
+ );
148
+ react.useEffect(() => {
149
+ if (isOpen) {
150
+ delayedIsOpenTimeoutRef.current = window.setTimeout(() => {
151
+ setDelayedIsOpen(true);
152
+ }, FLOATING_TOOLBAR_OPEN_DELAY);
153
+ } else {
154
+ setDelayedIsOpen(false);
155
+ }
156
+ return () => {
157
+ window.clearTimeout(delayedIsOpenTimeoutRef.current);
158
+ };
159
+ }, [isOpen]);
160
+ const floatingOptions = react.useMemo(() => {
161
+ const detectOverflowOptions = {
162
+ padding: FLOATING_TOOLBAR_COLLISION_PADDING
163
+ };
164
+ return {
165
+ strategy: "fixed",
166
+ placement: position,
167
+ middleware: [
168
+ reactDom.inline(detectOverflowOptions),
169
+ reactDom.flip({ ...detectOverflowOptions, crossAxis: false }),
170
+ reactDom.hide(detectOverflowOptions),
171
+ reactDom.shift({
172
+ ...detectOverflowOptions,
173
+ limiter: reactDom.limitShift()
174
+ }),
175
+ reactDom.offset(sideOffset),
176
+ reactDom.size(detectOverflowOptions)
177
+ ],
178
+ whileElementsMounted: (...args) => {
179
+ return reactDom.autoUpdate(...args, {
180
+ animationFrame: true
181
+ });
182
+ }
183
+ };
184
+ }, [position, sideOffset]);
185
+ const {
186
+ refs: { setReference, setFloating },
187
+ strategy,
188
+ x,
189
+ y,
190
+ isPositioned
191
+ } = reactDom.useFloating({
192
+ ...floatingOptions,
193
+ open: delayedIsOpen
194
+ });
195
+ const mergedRefs = _private.useRefs(forwardedRef, toolbarRef, setFloating);
196
+ const handlePointerDown = react.useCallback(
197
+ (event) => {
198
+ onPointerDown?.(event);
199
+ event.stopPropagation();
200
+ if (event.target === toolbarRef.current) {
201
+ event.preventDefault();
202
+ }
203
+ },
204
+ [onPointerDown]
205
+ );
206
+ react.useEffect(() => {
207
+ if (!editor || !isEditable) {
208
+ return;
209
+ }
210
+ const handlePointerDown2 = () => {
211
+ setPointerDown(true);
212
+ };
213
+ const handlePointerUp = () => {
214
+ setPointerDown(false);
215
+ };
216
+ document.addEventListener("pointerdown", handlePointerDown2);
217
+ document.addEventListener("pointercancel", handlePointerUp);
218
+ document.addEventListener("pointerup", handlePointerUp);
219
+ return () => {
220
+ document.removeEventListener("pointerdown", handlePointerDown2);
221
+ document.removeEventListener("pointercancel", handlePointerUp);
222
+ document.removeEventListener("pointerup", handlePointerUp);
223
+ };
224
+ }, [editor, isEditable]);
225
+ _private$1.useLayoutEffect(() => {
226
+ if (!editor || !delayedIsOpen) {
227
+ return;
228
+ }
229
+ const updateSelectionReference = () => {
230
+ const domSelection = window.getSelection();
231
+ if (editor.state.selection.empty || !domSelection || !domSelection.rangeCount) {
232
+ setReference(null);
233
+ } else {
234
+ const domRange = domSelection.getRangeAt(0);
235
+ setReference(domRange);
236
+ }
237
+ };
238
+ editor.on("transaction", updateSelectionReference);
239
+ updateSelectionReference();
240
+ return () => {
241
+ editor.off("transaction", updateSelectionReference);
242
+ };
243
+ }, [editor, delayedIsOpen, setReference]);
244
+ react.useEffect(() => {
245
+ if (!editor || !delayedIsOpen) {
246
+ return;
247
+ }
248
+ const handleKeyDown = (event) => {
249
+ if (event.target !== editor.view.dom && event.defaultPrevented) {
250
+ return;
251
+ }
252
+ if (event.key === "Escape") {
253
+ event.preventDefault();
254
+ event.stopPropagation();
255
+ editor.commands.focus();
256
+ setManuallyClosed(true);
257
+ }
258
+ };
259
+ editor.view.dom.addEventListener("keydown", handleKeyDown);
260
+ return () => {
261
+ editor.view.dom.removeEventListener("keydown", handleKeyDown);
262
+ };
263
+ }, [editor, delayedIsOpen]);
264
+ const close = react.useCallback(() => {
265
+ setManuallyClosed(true);
266
+ }, [setManuallyClosed]);
267
+ const registerExternal = react.useCallback(
268
+ (id) => {
269
+ externalIds.add(id);
270
+ return () => {
271
+ externalIds.delete(id);
272
+ };
273
+ },
274
+ [externalIds]
275
+ );
276
+ if (!editor || !delayedIsOpen) {
277
+ return null;
278
+ }
279
+ const slotProps = { editor };
280
+ return reactDom$1.createPortal(
281
+ /* @__PURE__ */ jsxRuntime.jsx(_private.TooltipProvider, {
282
+ children: /* @__PURE__ */ jsxRuntime.jsx(context.EditorProvider, {
283
+ editor,
284
+ children: /* @__PURE__ */ jsxRuntime.jsx(shared.FloatingToolbarContext.Provider, {
285
+ value: { close, registerExternal },
286
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
287
+ role: "toolbar",
288
+ "aria-label": "Floating toolbar",
289
+ "aria-orientation": "horizontal",
290
+ className: classnames.classNames(
291
+ "lb-root lb-portal lb-elevation lb-tiptap-floating-toolbar lb-tiptap-toolbar",
292
+ className
293
+ ),
294
+ ref: mergedRefs,
295
+ style: {
296
+ position: strategy,
297
+ top: 0,
298
+ left: 0,
299
+ transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)",
300
+ minWidth: "max-content"
301
+ },
302
+ onPointerDown: handlePointerDown,
303
+ onFocus: handleFocus,
304
+ onBlur: handleBlur,
305
+ ...props,
306
+ children: [
307
+ Toolbar.applyToolbarSlot(before, slotProps),
308
+ Toolbar.applyToolbarSlot(children, slotProps),
309
+ Toolbar.applyToolbarSlot(after, slotProps)
310
+ ]
311
+ })
312
+ })
313
+ })
314
+ }),
315
+ document.body
316
+ );
317
+ }
318
+ ),
319
+ {
320
+ External: shared.FloatingToolbarExternal
321
+ }
322
+ );
323
+
324
+ exports.FLOATING_TOOLBAR_COLLISION_PADDING = FLOATING_TOOLBAR_COLLISION_PADDING;
325
+ exports.FloatingToolbar = FloatingToolbar;
326
+ //# sourceMappingURL=FloatingToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingToolbar.js","sources":["../../src/toolbar/FloatingToolbar.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 { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n TooltipProvider,\n useInitial,\n useRefs,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, isTextSelection, useEditorState } from \"@tiptap/react\";\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 { EditorProvider } from \"../context\";\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 editor: Editor | null;\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({ editor }: ToolbarSlotProps) {\n const supportsThread = \"addPendingComment\" in editor.commands;\n\n return (\n <>\n <Toolbar.BlockSelector />\n <Toolbar.SectionInline />\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 editor,\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 [isFocused, setFocused] = useState(false);\n const [isManuallyClosed, setManuallyClosed] = useState(false);\n const isEditable =\n useEditorState({\n editor,\n equalityFn: Object.is,\n selector: (ctx) => ctx.editor?.isEditable ?? false,\n }) ?? false;\n const hasSelectionRange =\n useEditorState({\n editor,\n equalityFn: Object.is,\n selector: (ctx) => {\n const editor = ctx.editor;\n\n if (!editor) {\n return false;\n }\n\n const { doc, selection } = editor.state;\n const { empty, ranges } = selection;\n const from = Math.min(...ranges.map((range) => range.$from.pos));\n const to = Math.max(...ranges.map((range) => range.$to.pos));\n\n if (empty) {\n return false;\n }\n\n return (\n isTextSelection(selection) && doc.textBetween(from, to).length > 0\n );\n },\n }) ?? 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 if (!editor) {\n return;\n }\n\n setManuallyClosed(false);\n\n const handleSelectionChange = () => {\n setManuallyClosed(false);\n };\n\n editor.on(\"selectionUpdate\", handleSelectionChange);\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionChange);\n };\n }, [isFocused, hasSelectionRange, editor]);\n\n // Don't close when the focus moves from the editor to the toolbar\n useEffect(() => {\n if (!editor) {\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.view.dom) {\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 editor.view.dom.addEventListener(\"focus\", handleFocus);\n editor.view.dom.addEventListener(\"blur\", handleBlur);\n\n return () => {\n editor.view.dom.removeEventListener(\"focus\", handleFocus);\n editor.view.dom.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?.view.dom) {\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 || !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 useLayoutEffect(() => {\n if (!editor || !delayedIsOpen) {\n return;\n }\n\n const updateSelectionReference = () => {\n const domSelection = window.getSelection();\n\n if (\n editor.state.selection.empty ||\n !domSelection ||\n !domSelection.rangeCount\n ) {\n setReference(null);\n } else {\n const domRange = domSelection.getRangeAt(0);\n\n setReference(domRange);\n }\n };\n\n editor.on(\"transaction\", updateSelectionReference);\n updateSelectionReference();\n\n return () => {\n editor.off(\"transaction\", updateSelectionReference);\n };\n }, [editor, delayedIsOpen, setReference]);\n\n useEffect(() => {\n if (!editor || !delayedIsOpen) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.target !== editor.view.dom && event.defaultPrevented) {\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n editor.commands.focus();\n setManuallyClosed(true);\n }\n };\n\n editor.view.dom.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n editor.view.dom.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, delayedIsOpen]);\n\n const close = useCallback(() => {\n setManuallyClosed(true);\n }, [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 (!editor || !delayedIsOpen) {\n return null;\n }\n\n const slotProps: ToolbarSlotProps = { editor };\n\n return createPortal(\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <FloatingToolbarContext.Provider\n value={{ close, registerExternal }}\n >\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-tiptap-floating-toolbar lb-tiptap-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 </EditorProvider>\n </TooltipProvider>,\n document.body\n );\n }\n ),\n {\n External: FloatingToolbarExternal,\n }\n);\n"],"names":["jsxs","Fragment","jsx","Toolbar","forwardRef","useRef","useInitial","useState","useEditorState","editor","isTextSelection","useEffect","handleFocus","handleBlur","useCallback","useMemo","inline","flip","hide","shift","limitShift","offset","size","autoUpdate","useFloating","useRefs","handlePointerDown","useLayoutEffect","createPortal","TooltipProvider","EditorProvider","FloatingToolbarContext","classNames","applyToolbarSlot","FloatingToolbarExternal"],"mappings":"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"}