@liveblocks/react-tiptap 2.16.0-toolbars4 → 2.16.0-toolbars5
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.
|
@@ -209,12 +209,12 @@ const FloatingToolbar = Object.assign(
|
|
|
209
209
|
setPointerDown(false);
|
|
210
210
|
};
|
|
211
211
|
editor.view.dom.addEventListener("pointerdown", handlePointerDown2);
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
document.addEventListener("pointercancel", handlePointerUp);
|
|
213
|
+
document.addEventListener("pointerup", handlePointerUp);
|
|
214
214
|
return () => {
|
|
215
215
|
editor.view.dom.removeEventListener("pointerdown", handlePointerDown2);
|
|
216
|
-
|
|
217
|
-
|
|
216
|
+
document.removeEventListener("pointercancel", handlePointerUp);
|
|
217
|
+
document.removeEventListener("pointerup", handlePointerUp);
|
|
218
218
|
};
|
|
219
219
|
}, [editor]);
|
|
220
220
|
_private$1.useLayoutEffect(() => {
|
|
@@ -1 +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 /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical position of the floating toolbar.\n */\n position?: FloatingPosition;\n\n /**\n * The vertical offset of the floating toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The content of the floating toolbar, overriding the default content.\n * Use the `before` and `after` props if you want to keep and extend the default content.\n */\n children?: ToolbarSlot;\n\n /**\n * The content to display at the start of the floating toolbar.\n */\n before?: ToolbarSlot;\n\n /**\n * The content to display at the end of the floating toolbar.\n */\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\n/**\n * A floating toolbar attached to the selection and containing actions and values related to the editor.\n *\n * @example\n * <FloatingToolbar editor={editor} />\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Toolbar.BlockSelector />\n * <Toolbar.Separator />\n * <Toolbar.SectionInline />\n * <Toolbar.Separator />\n * <Toolbar.Button name=\"Custom action\" onClick={() => { ... }} icon={<Icon.QuestionMark />} />\n * </FloatingToolbar>\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 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) {\n return;\n }\n\n const handlePointerDown = () => {\n setPointerDown(true);\n };\n const handlePointerUp = () => {\n setPointerDown(false);\n };\n\n editor.view.dom.addEventListener(\"pointerdown\", handlePointerDown);\n editor.view.dom.addEventListener(\"pointercancel\", handlePointerUp);\n editor.view.dom.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n editor.view.dom.removeEventListener(\"pointerdown\", handlePointerDown);\n editor.view.dom.removeEventListener(\"pointercancel\", handlePointerUp);\n editor.view.dom.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [editor]);\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 /**\n * A component that can be wrapped around elements which are rendered outside of the floating\n * toolbar (e.g. portals) to prevent the toolbar from closing when clicking/focusing within them.\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Popover.Root>\n * <Popover.Trigger asChild>\n * <Toolbar.Button>Open popover</Toolbar.Button>\n * </Popover.Trigger>\n * <Popover.Portal>\n * <FloatingToolbar.External>\n * <Popover.Content>\n * This popover is rendered outside of the floating toolbar, but the toolbar will not close when clicking/focusing within it.\n * </Popover.Content>\n * </FloatingToolbar.External>\n * </Popover.Portal>\n * </Popover.Root>\n * </FloatingToolbar>\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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"}
|
|
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 /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical position of the floating toolbar.\n */\n position?: FloatingPosition;\n\n /**\n * The vertical offset of the floating toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The content of the floating toolbar, overriding the default content.\n * Use the `before` and `after` props if you want to keep and extend the default content.\n */\n children?: ToolbarSlot;\n\n /**\n * The content to display at the start of the floating toolbar.\n */\n before?: ToolbarSlot;\n\n /**\n * The content to display at the end of the floating toolbar.\n */\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\n/**\n * A floating toolbar attached to the selection and containing actions and values related to the editor.\n *\n * @example\n * <FloatingToolbar editor={editor} />\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Toolbar.BlockSelector />\n * <Toolbar.Separator />\n * <Toolbar.SectionInline />\n * <Toolbar.Separator />\n * <Toolbar.Button name=\"Custom action\" onClick={() => { ... }} icon={<Icon.QuestionMark />} />\n * </FloatingToolbar>\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 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) {\n return;\n }\n\n const handlePointerDown = () => {\n setPointerDown(true);\n };\n const handlePointerUp = () => {\n setPointerDown(false);\n };\n\n editor.view.dom.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"pointercancel\", handlePointerUp);\n document.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n editor.view.dom.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"pointercancel\", handlePointerUp);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [editor]);\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 /**\n * A component that can be wrapped around elements which are rendered outside of the floating\n * toolbar (e.g. portals) to prevent the toolbar from closing when clicking/focusing within them.\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Popover.Root>\n * <Popover.Trigger asChild>\n * <Toolbar.Button>Open popover</Toolbar.Button>\n * </Popover.Trigger>\n * <Popover.Portal>\n * <FloatingToolbar.External>\n * <Popover.Content>\n * This popover is rendered outside of the floating toolbar, but the toolbar will not close when clicking/focusing within it.\n * </Popover.Content>\n * </FloatingToolbar.External>\n * </Popover.Portal>\n * </Popover.Root>\n * </FloatingToolbar>\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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"}
|
|
@@ -207,12 +207,12 @@ const FloatingToolbar = Object.assign(
|
|
|
207
207
|
setPointerDown(false);
|
|
208
208
|
};
|
|
209
209
|
editor.view.dom.addEventListener("pointerdown", handlePointerDown2);
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
document.addEventListener("pointercancel", handlePointerUp);
|
|
211
|
+
document.addEventListener("pointerup", handlePointerUp);
|
|
212
212
|
return () => {
|
|
213
213
|
editor.view.dom.removeEventListener("pointerdown", handlePointerDown2);
|
|
214
|
-
|
|
215
|
-
|
|
214
|
+
document.removeEventListener("pointercancel", handlePointerUp);
|
|
215
|
+
document.removeEventListener("pointerup", handlePointerUp);
|
|
216
216
|
};
|
|
217
217
|
}, [editor]);
|
|
218
218
|
useLayoutEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingToolbar.mjs","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 /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical position of the floating toolbar.\n */\n position?: FloatingPosition;\n\n /**\n * The vertical offset of the floating toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The content of the floating toolbar, overriding the default content.\n * Use the `before` and `after` props if you want to keep and extend the default content.\n */\n children?: ToolbarSlot;\n\n /**\n * The content to display at the start of the floating toolbar.\n */\n before?: ToolbarSlot;\n\n /**\n * The content to display at the end of the floating toolbar.\n */\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\n/**\n * A floating toolbar attached to the selection and containing actions and values related to the editor.\n *\n * @example\n * <FloatingToolbar editor={editor} />\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Toolbar.BlockSelector />\n * <Toolbar.Separator />\n * <Toolbar.SectionInline />\n * <Toolbar.Separator />\n * <Toolbar.Button name=\"Custom action\" onClick={() => { ... }} icon={<Icon.QuestionMark />} />\n * </FloatingToolbar>\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 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) {\n return;\n }\n\n const handlePointerDown = () => {\n setPointerDown(true);\n };\n const handlePointerUp = () => {\n setPointerDown(false);\n };\n\n editor.view.dom.addEventListener(\"pointerdown\", handlePointerDown);\n editor.view.dom.addEventListener(\"pointercancel\", handlePointerUp);\n editor.view.dom.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n editor.view.dom.removeEventListener(\"pointerdown\", handlePointerDown);\n editor.view.dom.removeEventListener(\"pointercancel\", handlePointerUp);\n editor.view.dom.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [editor]);\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 /**\n * A component that can be wrapped around elements which are rendered outside of the floating\n * toolbar (e.g. portals) to prevent the toolbar from closing when clicking/focusing within them.\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Popover.Root>\n * <Popover.Trigger asChild>\n * <Toolbar.Button>Open popover</Toolbar.Button>\n * </Popover.Trigger>\n * <Popover.Portal>\n * <FloatingToolbar.External>\n * <Popover.Content>\n * This popover is rendered outside of the floating toolbar, but the toolbar will not close when clicking/focusing within it.\n * </Popover.Content>\n * </FloatingToolbar.External>\n * </Popover.Portal>\n * </Popover.Root>\n * </FloatingToolbar>\n */\n External: FloatingToolbarExternal,\n }\n);\n"],"names":["editor","handleFocus","handleBlur","handlePointerDown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FloatingToolbar.mjs","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 /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical position of the floating toolbar.\n */\n position?: FloatingPosition;\n\n /**\n * The vertical offset of the floating toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The content of the floating toolbar, overriding the default content.\n * Use the `before` and `after` props if you want to keep and extend the default content.\n */\n children?: ToolbarSlot;\n\n /**\n * The content to display at the start of the floating toolbar.\n */\n before?: ToolbarSlot;\n\n /**\n * The content to display at the end of the floating toolbar.\n */\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\n/**\n * A floating toolbar attached to the selection and containing actions and values related to the editor.\n *\n * @example\n * <FloatingToolbar editor={editor} />\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Toolbar.BlockSelector />\n * <Toolbar.Separator />\n * <Toolbar.SectionInline />\n * <Toolbar.Separator />\n * <Toolbar.Button name=\"Custom action\" onClick={() => { ... }} icon={<Icon.QuestionMark />} />\n * </FloatingToolbar>\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 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) {\n return;\n }\n\n const handlePointerDown = () => {\n setPointerDown(true);\n };\n const handlePointerUp = () => {\n setPointerDown(false);\n };\n\n editor.view.dom.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"pointercancel\", handlePointerUp);\n document.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n editor.view.dom.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"pointercancel\", handlePointerUp);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [editor]);\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 /**\n * A component that can be wrapped around elements which are rendered outside of the floating\n * toolbar (e.g. portals) to prevent the toolbar from closing when clicking/focusing within them.\n *\n * @example\n * <FloatingToolbar editor={editor}>\n * <Popover.Root>\n * <Popover.Trigger asChild>\n * <Toolbar.Button>Open popover</Toolbar.Button>\n * </Popover.Trigger>\n * <Popover.Portal>\n * <FloatingToolbar.External>\n * <Popover.Content>\n * This popover is rendered outside of the floating toolbar, but the toolbar will not close when clicking/focusing within it.\n * </Popover.Content>\n * </FloatingToolbar.External>\n * </Popover.Portal>\n * </Popover.Root>\n * </FloatingToolbar>\n */\n External: FloatingToolbarExternal,\n }\n);\n"],"names":["editor","handleFocus","handleBlur","handlePointerDown"],"mappings":"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"}
|
package/dist/version.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const PKG_NAME = "@liveblocks/react-tiptap";
|
|
4
|
-
const PKG_VERSION = typeof "2.16.0-
|
|
4
|
+
const PKG_VERSION = typeof "2.16.0-toolbars5" === "string" && "2.16.0-toolbars5";
|
|
5
5
|
const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
|
|
6
6
|
|
|
7
7
|
exports.PKG_FORMAT = PKG_FORMAT;
|
package/dist/version.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const PKG_NAME = "@liveblocks/react-tiptap";
|
|
2
|
-
const PKG_VERSION = typeof "2.16.0-
|
|
2
|
+
const PKG_VERSION = typeof "2.16.0-toolbars5" === "string" && "2.16.0-toolbars5";
|
|
3
3
|
const PKG_FORMAT = typeof "esm" === "string" && "esm";
|
|
4
4
|
|
|
5
5
|
export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liveblocks/react-tiptap",
|
|
3
|
-
"version": "2.16.0-
|
|
3
|
+
"version": "2.16.0-toolbars5",
|
|
4
4
|
"description": "A tiptap react plugin to enable collaboration, comments, live cursors, and more.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@floating-ui/react-dom": "^2.1.2",
|
|
45
|
-
"@liveblocks/client": "2.16.0-
|
|
46
|
-
"@liveblocks/core": "2.16.0-
|
|
47
|
-
"@liveblocks/react": "2.16.0-
|
|
48
|
-
"@liveblocks/react-ui": "2.16.0-
|
|
49
|
-
"@liveblocks/yjs": "2.16.0-
|
|
45
|
+
"@liveblocks/client": "2.16.0-toolbars5",
|
|
46
|
+
"@liveblocks/core": "2.16.0-toolbars5",
|
|
47
|
+
"@liveblocks/react": "2.16.0-toolbars5",
|
|
48
|
+
"@liveblocks/react-ui": "2.16.0-toolbars5",
|
|
49
|
+
"@liveblocks/yjs": "2.16.0-toolbars5",
|
|
50
50
|
"@radix-ui/react-select": "^2.1.2",
|
|
51
51
|
"@radix-ui/react-toggle": "^1.1.0",
|
|
52
52
|
"@tiptap/core": "^2.7.2",
|