@liveblocks/react-tiptap 3.14.0-pre5 → 3.14.0-pre6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/AiToolbar.cjs +33 -41
- package/dist/ai/AiToolbar.cjs.map +1 -1
- package/dist/ai/AiToolbar.js +34 -42
- package/dist/ai/AiToolbar.js.map +1 -1
- package/dist/comments/FloatingComposer.cjs +26 -29
- package/dist/comments/FloatingComposer.cjs.map +1 -1
- package/dist/comments/FloatingComposer.js +26 -29
- package/dist/comments/FloatingComposer.js.map +1 -1
- package/dist/comments/FloatingThreads.cjs +28 -42
- package/dist/comments/FloatingThreads.cjs.map +1 -1
- package/dist/comments/FloatingThreads.js +29 -43
- package/dist/comments/FloatingThreads.js.map +1 -1
- package/dist/toolbar/FloatingToolbar.cjs +35 -39
- package/dist/toolbar/FloatingToolbar.cjs.map +1 -1
- package/dist/toolbar/FloatingToolbar.js +36 -40
- package/dist/toolbar/FloatingToolbar.js.map +1 -1
- package/dist/toolbar/Toolbar.cjs +2 -1
- package/dist/toolbar/Toolbar.cjs.map +1 -1
- package/dist/toolbar/Toolbar.js +3 -2
- package/dist/toolbar/Toolbar.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -6
package/dist/ai/AiToolbar.cjs
CHANGED
|
@@ -7,7 +7,6 @@ var _private = require('@liveblocks/react-ui/_private');
|
|
|
7
7
|
var react$1 = require('@tiptap/react');
|
|
8
8
|
var cmdk = require('cmdk');
|
|
9
9
|
var react = require('react');
|
|
10
|
-
var reactDom$1 = require('react-dom');
|
|
11
10
|
var context = require('../context.cjs');
|
|
12
11
|
var utils = require('../utils.cjs');
|
|
13
12
|
var AiExtension = require('./AiExtension.cjs');
|
|
@@ -101,9 +100,7 @@ const AiToolbarSuggestion = react.forwardRef(({ prompt: manualPrompt, ...props }
|
|
|
101
100
|
const editor = context.useCurrentEditor("Suggestion", "AiToolbar");
|
|
102
101
|
const handleSelect = react.useCallback(
|
|
103
102
|
(prompt) => {
|
|
104
|
-
editor.commands.$startAiToolbarThinking(
|
|
105
|
-
manualPrompt ?? prompt
|
|
106
|
-
);
|
|
103
|
+
editor.commands.$startAiToolbarThinking(manualPrompt ?? prompt);
|
|
107
104
|
},
|
|
108
105
|
[editor, manualPrompt]
|
|
109
106
|
);
|
|
@@ -228,9 +225,7 @@ function AiToolbarCustomPromptContent() {
|
|
|
228
225
|
};
|
|
229
226
|
const handleCustomPromptChange = react.useCallback(
|
|
230
227
|
(customPrompt2) => {
|
|
231
|
-
editor.commands._updateAiToolbarCustomPrompt(
|
|
232
|
-
customPrompt2
|
|
233
|
-
);
|
|
228
|
+
editor.commands._updateAiToolbarCustomPrompt(customPrompt2);
|
|
234
229
|
},
|
|
235
230
|
[editor]
|
|
236
231
|
);
|
|
@@ -620,40 +615,37 @@ const AiToolbar = Object.assign(
|
|
|
620
615
|
if (!editor || !isOpen) {
|
|
621
616
|
return null;
|
|
622
617
|
}
|
|
623
|
-
return
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
) }) }),
|
|
655
|
-
document.body
|
|
656
|
-
);
|
|
618
|
+
return /* @__PURE__ */ jsxRuntime.jsx(_private.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(context.EditorProvider, { editor, children: /* @__PURE__ */ jsxRuntime.jsx(_private.Portal, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
619
|
+
cmdk.Command,
|
|
620
|
+
{
|
|
621
|
+
role: "toolbar",
|
|
622
|
+
label: "AI toolbar",
|
|
623
|
+
"aria-orientation": "horizontal",
|
|
624
|
+
className: _private.cn(
|
|
625
|
+
"lb-root lb-portal lb-tiptap-ai-toolbar-portal",
|
|
626
|
+
className
|
|
627
|
+
),
|
|
628
|
+
ref: mergedRefs,
|
|
629
|
+
style: {
|
|
630
|
+
position: strategy,
|
|
631
|
+
top: 0,
|
|
632
|
+
left: 0,
|
|
633
|
+
transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)"
|
|
634
|
+
},
|
|
635
|
+
value: selectedDropdownValue,
|
|
636
|
+
onValueChange: setSelectedDropdownValue,
|
|
637
|
+
...props,
|
|
638
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
639
|
+
AiToolbarContainer,
|
|
640
|
+
{
|
|
641
|
+
state,
|
|
642
|
+
dropdownRef,
|
|
643
|
+
toolbarRef,
|
|
644
|
+
children: typeof Suggestions === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Suggestions, { children: defaultSuggestions }) : Suggestions
|
|
645
|
+
}
|
|
646
|
+
)
|
|
647
|
+
}
|
|
648
|
+
) }) }) });
|
|
657
649
|
}
|
|
658
650
|
),
|
|
659
651
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiToolbar.cjs","sources":["../../src/ai/AiToolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n hide,\n limitShift,\n type Middleware,\n offset,\n shift,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n ArrowCornerDownRightIcon,\n Button,\n CheckIcon,\n cn,\n CrossIcon,\n EditIcon,\n LengthenIcon,\n QuestionMarkIcon,\n SendIcon,\n ShortcutTooltip,\n ShortenIcon,\n SparklesIcon,\n SparklesTextIcon,\n StopIcon,\n TooltipProvider,\n UndoIcon,\n useRefs,\n WarningIcon,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport { Command, useCommandState } from \"cmdk\";\nimport type {\n ComponentProps,\n ComponentType,\n KeyboardEvent as ReactKeyboardEvent,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type {\n AiToolbarState,\n ChainedAiCommands,\n} from \"../types\";\nimport { getDomRangeFromSelection } from \"../utils\";\nimport { DEFAULT_STATE, isContextualPromptDiffResponse } from \"./AiExtension\";\n\nexport const AI_TOOLBAR_COLLISION_PADDING = 10;\n\nexport interface AiToolbarProps\n extends Omit<ComponentProps<\"div\">, \"value\" | \"defaultValue\" | \"children\"> {\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical offset of the AI toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The prompt suggestions to display below the AI toolbar.\n */\n suggestions?: ReactNode | ComponentType<PropsWithChildren>;\n}\n\ntype AiToolbarDropdownSeparatorProps = ComponentProps<\"div\">;\n\ninterface AiToolbarDropdownItemProps\n extends ComponentProps<typeof Command.Item> {\n icon?: ReactNode;\n}\n\ntype AiToolbarSuggestionsSeparatorProps = AiToolbarDropdownSeparatorProps;\n\ntype AiToolbarSuggestionsLabelProps = ComponentProps<\"span\">;\n\ninterface AiToolbarSuggestionProps extends ComponentProps<\"div\"> {\n prompt?: string;\n icon?: ReactNode;\n}\n\ninterface AiToolbarContext {\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n isDropdownHidden: boolean;\n}\n\nconst AiToolbarContext = createContext<AiToolbarContext | null>(null);\n\nfunction useAiToolbarContext() {\n const context = useContext(AiToolbarContext);\n\n if (!context) {\n throw new Error(\"useAiToolbarContext must be used within an AiToolbar\");\n }\n\n return context;\n}\n\n/**\n * A custom Floating UI middleware to position/scale the toolbar:\n * - Vertically: relative to the reference (e.g. selection)\n * - Horizontally: relative to the editor\n * - Width: relative to the editor\n */\nfunction tiptapFloating(editor: Editor | null): Middleware {\n return {\n name: \"tiptap\",\n options: editor,\n fn({ elements }) {\n if (!editor) {\n return {};\n }\n\n const editorRect = editor.view.dom.getBoundingClientRect();\n\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-width\",\n `${editorRect.width}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-height\",\n `${editorRect.height}px`\n );\n\n return {\n x: editorRect.x,\n };\n },\n };\n}\n\n/**\n * A custom Floating UI middleware to flip the toolbar/dropdown when shifted more than 100%.\n */\nfunction flipToolbar(): Middleware {\n return {\n name: \"flipToolbar\",\n fn({ elements, middlewareData, rects }) {\n const shiftOffsetY = middlewareData.shift?.y ?? 0;\n\n if (Math.abs(shiftOffsetY) >= rects.floating.height) {\n elements.floating.setAttribute(\"data-liveblocks-ai-toolbar-flip\", \"\");\n } else {\n elements.floating.removeAttribute(\"data-liveblocks-ai-toolbar-flip\");\n }\n\n return {};\n },\n };\n}\n\nconst AiToolbarDropdownSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownSeparatorProps\n>(({ className, ...props }, forwardedRef) => {\n return (\n <Command.Separator\n className={cn(\"lb-dropdown-separator\", className)}\n {...props}\n ref={forwardedRef}\n />\n );\n});\n\nconst AiToolbarSuggestionsSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsSeparatorProps\n>((props, forwardedRef) => {\n return <AiToolbarDropdownSeparator ref={forwardedRef} {...props} />;\n});\n\nconst AiToolbarDropdownItem = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownItemProps\n>(({ children, onSelect, icon, className, ...props }, forwardedRef) => {\n return (\n <Command.Item\n className={cn(\"lb-dropdown-item\", className)}\n onSelect={onSelect}\n {...props}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? (\n <span className=\"lb-dropdown-item-label\">{children}</span>\n ) : null}\n </Command.Item>\n );\n});\n\nconst AiToolbarSuggestionsLabel = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsLabelProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <span\n ref={forwardedRef}\n className={cn(\"lb-dropdown-label\", className)}\n {...props}\n >\n {children}\n </span>\n );\n});\n\nconst AiToolbarSuggestion = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionProps\n>(({ prompt: manualPrompt, ...props }, forwardedRef) => {\n const editor = useCurrentEditor(\"Suggestion\", \"AiToolbar\");\n\n const handleSelect = useCallback(\n (prompt: string) => {\n (editor.commands).$startAiToolbarThinking(\n manualPrompt ?? prompt\n );\n },\n [editor, manualPrompt]\n );\n\n return (\n <AiToolbarDropdownItem\n {...props}\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n});\n\nfunction AiToolbarReviewingSuggestions() {\n const editor = useCurrentEditor(\"ReviewingSuggestions\", \"AiToolbar\");\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n if (isContextualPromptDiffResponse(response)) {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<CheckIcon />}\n onSelect={\n (editor.commands).$acceptAiToolbarResponse\n }\n >\n Accept\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={\n (editor.commands).$startAiToolbarThinking\n }\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n } else {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<ArrowCornerDownRightIcon />}\n onSelect={\n (editor.commands).$acceptAiToolbarResponse\n }\n >\n Insert below\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={\n (editor.commands).$startAiToolbarThinking\n }\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n }\n}\n\nfunction AiToolbarCustomPromptContent() {\n const editor = useCurrentEditor(\"CustomPromptContent\", \"AiToolbar\");\n // Eslint doesn't seem to like Tiptap's Type declaration strategy\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const aiName = editor.storage.liveblocksAi.name;\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n const { state, dropdownRef, isDropdownHidden } = useAiToolbarContext();\n const { customPrompt } = state as Exclude<\n AiToolbarState,\n { phase: \"closed\" }\n >;\n const isCustomPromptEmpty = useMemo(\n () => customPrompt.trim() === \"\",\n [customPrompt]\n );\n\n useLayoutEffect(\n () => {\n requestAnimationFrame(() => {\n const textArea = textAreaRef.current;\n\n if (!textArea) {\n return;\n }\n\n textArea.focus();\n textArea.setSelectionRange(\n textArea.value.length,\n textArea.value.length\n );\n });\n },\n [] // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handlePromptKeyDown = (\n event: ReactKeyboardEvent<HTMLTextAreaElement>\n ) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.shiftKey) {\n // If the shift key is pressed, add a new line\n (editor.commands)._updateAiToolbarCustomPrompt(\n (customPrompt) => customPrompt + \"\\n\"\n );\n } else {\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n ) as HTMLElement | null;\n\n if (!isDropdownHidden && selectedDropdownItem) {\n // If there's a selected dropdown item, select it\n selectedDropdownItem.click();\n } else if (!isCustomPromptEmpty) {\n // Otherwise, submit the custom prompt\n (editor.commands).$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }\n }\n }\n };\n\n const handleCustomPromptChange = useCallback(\n (customPrompt: string) => {\n (editor.commands)._updateAiToolbarCustomPrompt(\n customPrompt\n );\n },\n [editor]\n );\n\n const handleSendClick = useCallback(() => {\n if (isCustomPromptEmpty) {\n return;\n }\n\n (editor.commands).$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }, [editor, customPrompt, isCustomPromptEmpty, state.phase]);\n\n return (\n <div className=\"lb-tiptap-ai-toolbar-content\">\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div\n className=\"lb-tiptap-ai-toolbar-custom-prompt-container\"\n data-value={customPrompt}\n >\n <Command.Input\n value={customPrompt}\n onValueChange={handleCustomPromptChange}\n asChild\n >\n <textarea\n ref={textAreaRef}\n className=\"lb-tiptap-ai-toolbar-custom-prompt\"\n placeholder={`Ask ${aiName} anything…`}\n onKeyDown={handlePromptKeyDown}\n rows={1}\n autoFocus\n />\n </Command.Input>\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content={`Ask ${aiName}`} shortcut=\"Enter\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"primary\"\n aria-label={`Ask ${aiName}`}\n icon={<SendIcon />}\n disabled={isCustomPromptEmpty}\n onClick={handleSendClick}\n />\n </ShortcutTooltip>\n </div>\n </div>\n );\n}\n\nfunction AiToolbarAsking() {\n const { state } = useAiToolbarContext();\n const { error } = state as Exclude<AiToolbarState, { phase: \"closed\" }>;\n\n return (\n <>\n <AiToolbarCustomPromptContent />\n {error ? (\n <div className=\"lb-tiptap-ai-toolbar-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n There was a problem with your request.\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AiToolbarThinking() {\n const editor = useCurrentEditor(\"AiToolbarThinking\", \"AiToolbar\");\n const contentRef = useRef<HTMLDivElement>(null);\n const aiName = (editor.storage.liveblocksAi).name;\n\n const handleAbort = useCallback(() => {\n (editor.commands).$cancelAiToolbarThinking();\n }, [editor]);\n\n // Focus the toolbar content and clear the current window selection while thinking\n useLayoutEffect(() => {\n contentRef.current?.focus();\n window.getSelection()?.removeAllRanges();\n }, []);\n\n return (\n <>\n <div\n className=\"lb-tiptap-ai-toolbar-content\"\n tabIndex={0}\n ref={contentRef}\n >\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div className=\"lb-tiptap-ai-toolbar-thinking\">\n {aiName} is thinking…\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content=\"Abort response\" shortcut=\"Escape\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"secondary\"\n aria-label=\"Abort response\"\n icon={<StopIcon />}\n onClick={handleAbort}\n />\n </ShortcutTooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction AiToolbarReviewing() {\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n return (\n <>\n {response.type === \"other\" ? (\n <div className=\"lb-tiptap-ai-toolbar-response-container\">\n <div className=\"lb-tiptap-ai-toolbar-response\">{response.text}</div>\n </div>\n ) : null}\n <AiToolbarCustomPromptContent />\n </>\n );\n}\n\nfunction AiToolbarContainer({\n state,\n toolbarRef,\n dropdownRef,\n children,\n}: PropsWithChildren<{\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n}>) {\n const editor = useCurrentEditor(\"AiToolbarContainer\", \"AiToolbar\");\n const customPrompt = state.customPrompt;\n const isCustomPromptMultiline = useMemo(\n () => customPrompt?.includes(\"\\n\"),\n [customPrompt]\n );\n const hasDropdownItems = useCommandState(\n (state) => state.filtered.count > 0\n ) as boolean;\n const isDropdownHidden = isCustomPromptMultiline || !hasDropdownItems;\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (state.phase === \"thinking\") {\n (editor.commands).$cancelAiToolbarThinking();\n } else {\n (editor.chain() as ChainedAiCommands).$closeAiToolbar().focus().run();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, state.phase]);\n\n return (\n <AiToolbarContext.Provider\n value={{\n state,\n toolbarRef,\n dropdownRef,\n isDropdownHidden,\n }}\n >\n <div className=\"lb-tiptap-ai-toolbar-container\">\n <div className=\"lb-elevation lb-tiptap-ai-toolbar\">\n {state.phase === \"asking\" ? (\n <AiToolbarAsking />\n ) : state.phase === \"thinking\" ? (\n <AiToolbarThinking />\n ) : state.phase === \"reviewing\" ? (\n <AiToolbarReviewing />\n ) : null}\n </div>\n <div\n className=\"lb-tiptap-ai-toolbar-halo\"\n data-active={state.phase === \"thinking\" ? \"\" : undefined}\n aria-hidden\n >\n <div className=\"lb-tiptap-ai-toolbar-halo-horizontal\" />\n <div className=\"lb-tiptap-ai-toolbar-halo-vertical\" />\n </div>\n </div>\n {state.phase === \"asking\" || state.phase === \"reviewing\" ? (\n <Command.List\n className=\"lb-elevation lb-dropdown lb-tiptap-ai-toolbar-dropdown\"\n data-hidden={isDropdownHidden ? \"\" : undefined}\n ref={dropdownRef}\n >\n {state.phase === \"reviewing\" ? (\n <AiToolbarReviewingSuggestions />\n ) : (\n children\n )}\n </Command.List>\n ) : null}\n </AiToolbarContext.Provider>\n );\n}\n\nconst defaultSuggestions = (\n <>\n <AiToolbarSuggestion\n icon={<EditIcon />}\n prompt=\"Improve the quality of the text\"\n >\n Improve writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<CheckIcon />}\n prompt=\"Fix spelling & grammar errors in the text\"\n >\n Fix mistakes\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<ShortenIcon />}\n prompt=\"Shorten the text, simplifying it\"\n >\n Simplify\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<LengthenIcon />}\n prompt=\"Lengthen the text, going into more detail\"\n >\n Add more detail\n </AiToolbarSuggestion>\n <AiToolbarSuggestionsSeparator />\n <AiToolbarSuggestion\n icon={<SparklesTextIcon />}\n prompt=\"Continue writing from the text's end\"\n >\n Continue writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<QuestionMarkIcon />}\n prompt=\"Explain what the text is about\"\n >\n Explain\n </AiToolbarSuggestion>\n </>\n);\n\n/**\n * @beta\n *\n * A floating AI toolbar attached to the editor.\n */\nexport const AiToolbar = Object.assign(\n forwardRef<HTMLDivElement, AiToolbarProps>(\n (\n {\n offset: sideOffset = 6,\n editor,\n className,\n suggestions: Suggestions = defaultSuggestions,\n ...props\n },\n forwardedRef\n ) => {\n const state =\n useEditorState({\n editor,\n selector: (ctx) => {\n return (\n ctx.editor?.storage.liveblocksAi\n )?.state;\n },\n }) ?? DEFAULT_STATE;\n const selection = editor?.state.selection;\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: AI_TOOLBAR_COLLISION_PADDING,\n };\n\n return {\n strategy: \"fixed\",\n placement: \"bottom\",\n middleware: [\n tiptapFloating(editor),\n hide(detectOverflowOptions),\n offset(sideOffset),\n shift({\n ...detectOverflowOptions,\n mainAxis: false,\n crossAxis: true,\n limiter: limitShift(),\n }),\n flipToolbar(),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [editor, sideOffset]);\n const isOpen = selection !== undefined && state.phase !== \"closed\";\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n isPositioned,\n } = useFloating({\n ...floatingOptions,\n open: isOpen,\n });\n const toolbarRef = useRef<HTMLDivElement>(null);\n const mergedRefs = useRefs(forwardedRef, toolbarRef, setFloating);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [selectedDropdownValue, setSelectedDropdownValue] = useState(\"\");\n\n // Reset the selected dropdown value when the toolbar is closed\n useEffect(() => {\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n }\n }, [state.phase]);\n\n useEffect(() => {\n // Reset the selected dropdown value when the dropdown is closed\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n\n return;\n }\n\n // Otherwise, make sure a dropdown item is selected when moving between phases\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n );\n\n if (selectedDropdownItem) {\n return;\n }\n\n const firstDropdownItem =\n dropdownRef.current?.querySelector(\"[role='option']\");\n\n setSelectedDropdownValue(\n (firstDropdownItem as HTMLElement | null)?.dataset.value ?? \"\"\n );\n }, [state.phase, dropdownRef, setSelectedDropdownValue]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (!selection && state.phase !== \"closed\") {\n (editor.commands).$closeAiToolbar();\n }\n }, [state.phase, editor, selection]);\n\n useLayoutEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n setReference(null);\n\n setTimeout(() => {\n if (\n state.phase === \"reviewing\" &&\n isContextualPromptDiffResponse(state.response)\n ) {\n const changes = editor.view.dom.querySelectorAll(\n \"ychange[data-liveblocks]\"\n );\n\n // When diffs are displayed, we manually calculate bounds around all the\n // rendered changes instead of using the selection\n setReference({\n getBoundingClientRect: () => {\n const rects: DOMRect[] = [];\n\n changes.forEach((change) => {\n rects.push(change.getBoundingClientRect());\n });\n\n const minX = Math.min(...rects.map((rect) => rect.left));\n const minY = Math.min(...rects.map((rect) => rect.top));\n const maxX = Math.max(...rects.map((rect) => rect.right));\n const maxY = Math.max(...rects.map((rect) => rect.bottom));\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n top: minY,\n left: minX,\n bottom: maxY,\n right: maxX,\n };\n },\n });\n } else if (selection) {\n const domRange = getDomRangeFromSelection(editor, selection);\n setReference(domRange);\n } else {\n setReference(null);\n }\n }, 0);\n }, [\n selection,\n editor,\n isOpen,\n setReference,\n state.phase,\n state.response,\n ]);\n\n // Close the toolbar when clicking anywhere outside of it\n useEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n const handleOutsideEvent = (event: MouseEvent) => {\n if (!toolbarRef.current) {\n return;\n }\n\n if (\n event.target &&\n !toolbarRef.current.contains(event.target as Node) &&\n (dropdownRef.current\n ? !dropdownRef.current.contains(event.target as Node)\n : true)\n ) {\n (editor.commands).$closeAiToolbar();\n }\n };\n\n setTimeout(() => {\n document.addEventListener(\"pointerdown\", handleOutsideEvent);\n }, 0);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handleOutsideEvent);\n };\n }, [editor, isOpen]);\n\n if (!editor || !isOpen) {\n return null;\n }\n\n return createPortal(\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <Command\n role=\"toolbar\"\n label=\"AI toolbar\"\n aria-orientation=\"horizontal\"\n className={cn(\n \"lb-root lb-portal lb-tiptap-ai-toolbar-portal\",\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 }}\n value={selectedDropdownValue}\n onValueChange={setSelectedDropdownValue}\n {...props}\n >\n <AiToolbarContainer\n state={state}\n dropdownRef={dropdownRef}\n toolbarRef={toolbarRef}\n >\n {typeof Suggestions === \"function\" ? (\n <Suggestions children={defaultSuggestions} />\n ) : (\n Suggestions\n )}\n </AiToolbarContainer>\n </Command>\n </EditorProvider>\n </TooltipProvider>,\n document.body\n );\n }\n ),\n {\n /**\n * @beta\n *\n * A prompt suggestion displayed in the AI toolbar.\n */\n Suggestion: AiToolbarSuggestion,\n\n /**\n * @beta\n *\n * A label to describe a group of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsLabel: AiToolbarSuggestionsLabel,\n\n /**\n * @beta\n *\n * A separator between groups of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsSeparator: AiToolbarSuggestionsSeparator,\n }\n);\n"],"names":["createContext","useContext","forwardRef","jsx","Command","cn","jsxs","useCurrentEditor","useCallback","isContextualPromptDiffResponse","Fragment","CheckIcon","UndoIcon","CrossIcon","ArrowCornerDownRightIcon","useRef","useMemo","useLayoutEffect","customPrompt","SparklesIcon","ShortcutTooltip","Button","SendIcon","WarningIcon","StopIcon","useCommandState","state","useEffect","EditIcon","ShortenIcon","LengthenIcon","SparklesTextIcon","QuestionMarkIcon","useEditorState","DEFAULT_STATE","hide","offset","shift","limitShift","autoUpdate","useFloating","useRefs","useState","getDomRangeFromSelection","createPortal","TooltipProvider","EditorProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiToolbar.cjs","sources":["../../src/ai/AiToolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n hide,\n limitShift,\n type Middleware,\n offset,\n shift,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n ArrowCornerDownRightIcon,\n Button,\n CheckIcon,\n cn,\n CrossIcon,\n EditIcon,\n LengthenIcon,\n Portal,\n QuestionMarkIcon,\n SendIcon,\n ShortcutTooltip,\n ShortenIcon,\n SparklesIcon,\n SparklesTextIcon,\n StopIcon,\n TooltipProvider,\n UndoIcon,\n useRefs,\n WarningIcon,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport { Command, useCommandState } from \"cmdk\";\nimport type {\n ComponentProps,\n ComponentType,\n KeyboardEvent as ReactKeyboardEvent,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type { AiToolbarState, ChainedAiCommands } from \"../types\";\nimport { getDomRangeFromSelection } from \"../utils\";\nimport { DEFAULT_STATE, isContextualPromptDiffResponse } from \"./AiExtension\";\n\nexport const AI_TOOLBAR_COLLISION_PADDING = 10;\n\nexport interface AiToolbarProps\n extends Omit<ComponentProps<\"div\">, \"value\" | \"defaultValue\" | \"children\"> {\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical offset of the AI toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The prompt suggestions to display below the AI toolbar.\n */\n suggestions?: ReactNode | ComponentType<PropsWithChildren>;\n}\n\ntype AiToolbarDropdownSeparatorProps = ComponentProps<\"div\">;\n\ninterface AiToolbarDropdownItemProps\n extends ComponentProps<typeof Command.Item> {\n icon?: ReactNode;\n}\n\ntype AiToolbarSuggestionsSeparatorProps = AiToolbarDropdownSeparatorProps;\n\ntype AiToolbarSuggestionsLabelProps = ComponentProps<\"span\">;\n\ninterface AiToolbarSuggestionProps extends ComponentProps<\"div\"> {\n prompt?: string;\n icon?: ReactNode;\n}\n\ninterface AiToolbarContext {\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n isDropdownHidden: boolean;\n}\n\nconst AiToolbarContext = createContext<AiToolbarContext | null>(null);\n\nfunction useAiToolbarContext() {\n const context = useContext(AiToolbarContext);\n\n if (!context) {\n throw new Error(\"useAiToolbarContext must be used within an AiToolbar\");\n }\n\n return context;\n}\n\n/**\n * A custom Floating UI middleware to position/scale the toolbar:\n * - Vertically: relative to the reference (e.g. selection)\n * - Horizontally: relative to the editor\n * - Width: relative to the editor\n */\nfunction tiptapFloating(editor: Editor | null): Middleware {\n return {\n name: \"tiptap\",\n options: editor,\n fn({ elements }) {\n if (!editor) {\n return {};\n }\n\n const editorRect = editor.view.dom.getBoundingClientRect();\n\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-width\",\n `${editorRect.width}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-height\",\n `${editorRect.height}px`\n );\n\n return {\n x: editorRect.x,\n };\n },\n };\n}\n\n/**\n * A custom Floating UI middleware to flip the toolbar/dropdown when shifted more than 100%.\n */\nfunction flipToolbar(): Middleware {\n return {\n name: \"flipToolbar\",\n fn({ elements, middlewareData, rects }) {\n const shiftOffsetY = middlewareData.shift?.y ?? 0;\n\n if (Math.abs(shiftOffsetY) >= rects.floating.height) {\n elements.floating.setAttribute(\"data-liveblocks-ai-toolbar-flip\", \"\");\n } else {\n elements.floating.removeAttribute(\"data-liveblocks-ai-toolbar-flip\");\n }\n\n return {};\n },\n };\n}\n\nconst AiToolbarDropdownSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownSeparatorProps\n>(({ className, ...props }, forwardedRef) => {\n return (\n <Command.Separator\n className={cn(\"lb-dropdown-separator\", className)}\n {...props}\n ref={forwardedRef}\n />\n );\n});\n\nconst AiToolbarSuggestionsSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsSeparatorProps\n>((props, forwardedRef) => {\n return <AiToolbarDropdownSeparator ref={forwardedRef} {...props} />;\n});\n\nconst AiToolbarDropdownItem = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownItemProps\n>(({ children, onSelect, icon, className, ...props }, forwardedRef) => {\n return (\n <Command.Item\n className={cn(\"lb-dropdown-item\", className)}\n onSelect={onSelect}\n {...props}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? (\n <span className=\"lb-dropdown-item-label\">{children}</span>\n ) : null}\n </Command.Item>\n );\n});\n\nconst AiToolbarSuggestionsLabel = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsLabelProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <span\n ref={forwardedRef}\n className={cn(\"lb-dropdown-label\", className)}\n {...props}\n >\n {children}\n </span>\n );\n});\n\nconst AiToolbarSuggestion = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionProps\n>(({ prompt: manualPrompt, ...props }, forwardedRef) => {\n const editor = useCurrentEditor(\"Suggestion\", \"AiToolbar\");\n\n const handleSelect = useCallback(\n (prompt: string) => {\n editor.commands.$startAiToolbarThinking(manualPrompt ?? prompt);\n },\n [editor, manualPrompt]\n );\n\n return (\n <AiToolbarDropdownItem\n {...props}\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n});\n\nfunction AiToolbarReviewingSuggestions() {\n const editor = useCurrentEditor(\"ReviewingSuggestions\", \"AiToolbar\");\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n if (isContextualPromptDiffResponse(response)) {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<CheckIcon />}\n onSelect={editor.commands.$acceptAiToolbarResponse}\n >\n Accept\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={editor.commands.$startAiToolbarThinking}\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={editor.commands.$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n } else {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<ArrowCornerDownRightIcon />}\n onSelect={editor.commands.$acceptAiToolbarResponse}\n >\n Insert below\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={editor.commands.$startAiToolbarThinking}\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={editor.commands.$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n }\n}\n\nfunction AiToolbarCustomPromptContent() {\n const editor = useCurrentEditor(\"CustomPromptContent\", \"AiToolbar\");\n // Eslint doesn't seem to like Tiptap's Type declaration strategy\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const aiName = editor.storage.liveblocksAi.name;\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n const { state, dropdownRef, isDropdownHidden } = useAiToolbarContext();\n const { customPrompt } = state as Exclude<\n AiToolbarState,\n { phase: \"closed\" }\n >;\n const isCustomPromptEmpty = useMemo(\n () => customPrompt.trim() === \"\",\n [customPrompt]\n );\n\n useLayoutEffect(\n () => {\n requestAnimationFrame(() => {\n const textArea = textAreaRef.current;\n\n if (!textArea) {\n return;\n }\n\n textArea.focus();\n textArea.setSelectionRange(\n textArea.value.length,\n textArea.value.length\n );\n });\n },\n [] // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handlePromptKeyDown = (\n event: ReactKeyboardEvent<HTMLTextAreaElement>\n ) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.shiftKey) {\n // If the shift key is pressed, add a new line\n editor.commands._updateAiToolbarCustomPrompt(\n (customPrompt) => customPrompt + \"\\n\"\n );\n } else {\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n ) as HTMLElement | null;\n\n if (!isDropdownHidden && selectedDropdownItem) {\n // If there's a selected dropdown item, select it\n selectedDropdownItem.click();\n } else if (!isCustomPromptEmpty) {\n // Otherwise, submit the custom prompt\n editor.commands.$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }\n }\n }\n };\n\n const handleCustomPromptChange = useCallback(\n (customPrompt: string) => {\n editor.commands._updateAiToolbarCustomPrompt(customPrompt);\n },\n [editor]\n );\n\n const handleSendClick = useCallback(() => {\n if (isCustomPromptEmpty) {\n return;\n }\n\n editor.commands.$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }, [editor, customPrompt, isCustomPromptEmpty, state.phase]);\n\n return (\n <div className=\"lb-tiptap-ai-toolbar-content\">\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div\n className=\"lb-tiptap-ai-toolbar-custom-prompt-container\"\n data-value={customPrompt}\n >\n <Command.Input\n value={customPrompt}\n onValueChange={handleCustomPromptChange}\n asChild\n >\n <textarea\n ref={textAreaRef}\n className=\"lb-tiptap-ai-toolbar-custom-prompt\"\n placeholder={`Ask ${aiName} anything…`}\n onKeyDown={handlePromptKeyDown}\n rows={1}\n autoFocus\n />\n </Command.Input>\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content={`Ask ${aiName}`} shortcut=\"Enter\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"primary\"\n aria-label={`Ask ${aiName}`}\n icon={<SendIcon />}\n disabled={isCustomPromptEmpty}\n onClick={handleSendClick}\n />\n </ShortcutTooltip>\n </div>\n </div>\n );\n}\n\nfunction AiToolbarAsking() {\n const { state } = useAiToolbarContext();\n const { error } = state as Exclude<AiToolbarState, { phase: \"closed\" }>;\n\n return (\n <>\n <AiToolbarCustomPromptContent />\n {error ? (\n <div className=\"lb-tiptap-ai-toolbar-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n There was a problem with your request.\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AiToolbarThinking() {\n const editor = useCurrentEditor(\"AiToolbarThinking\", \"AiToolbar\");\n const contentRef = useRef<HTMLDivElement>(null);\n const aiName = editor.storage.liveblocksAi.name;\n\n const handleAbort = useCallback(() => {\n editor.commands.$cancelAiToolbarThinking();\n }, [editor]);\n\n // Focus the toolbar content and clear the current window selection while thinking\n useLayoutEffect(() => {\n contentRef.current?.focus();\n window.getSelection()?.removeAllRanges();\n }, []);\n\n return (\n <>\n <div\n className=\"lb-tiptap-ai-toolbar-content\"\n tabIndex={0}\n ref={contentRef}\n >\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div className=\"lb-tiptap-ai-toolbar-thinking\">\n {aiName} is thinking…\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content=\"Abort response\" shortcut=\"Escape\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"secondary\"\n aria-label=\"Abort response\"\n icon={<StopIcon />}\n onClick={handleAbort}\n />\n </ShortcutTooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction AiToolbarReviewing() {\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n return (\n <>\n {response.type === \"other\" ? (\n <div className=\"lb-tiptap-ai-toolbar-response-container\">\n <div className=\"lb-tiptap-ai-toolbar-response\">{response.text}</div>\n </div>\n ) : null}\n <AiToolbarCustomPromptContent />\n </>\n );\n}\n\nfunction AiToolbarContainer({\n state,\n toolbarRef,\n dropdownRef,\n children,\n}: PropsWithChildren<{\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n}>) {\n const editor = useCurrentEditor(\"AiToolbarContainer\", \"AiToolbar\");\n const customPrompt = state.customPrompt;\n const isCustomPromptMultiline = useMemo(\n () => customPrompt?.includes(\"\\n\"),\n [customPrompt]\n );\n const hasDropdownItems = useCommandState(\n (state) => state.filtered.count > 0\n ) as boolean;\n const isDropdownHidden = isCustomPromptMultiline || !hasDropdownItems;\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (state.phase === \"thinking\") {\n editor.commands.$cancelAiToolbarThinking();\n } else {\n (editor.chain() as ChainedAiCommands).$closeAiToolbar().focus().run();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, state.phase]);\n\n return (\n <AiToolbarContext.Provider\n value={{\n state,\n toolbarRef,\n dropdownRef,\n isDropdownHidden,\n }}\n >\n <div className=\"lb-tiptap-ai-toolbar-container\">\n <div className=\"lb-elevation lb-tiptap-ai-toolbar\">\n {state.phase === \"asking\" ? (\n <AiToolbarAsking />\n ) : state.phase === \"thinking\" ? (\n <AiToolbarThinking />\n ) : state.phase === \"reviewing\" ? (\n <AiToolbarReviewing />\n ) : null}\n </div>\n <div\n className=\"lb-tiptap-ai-toolbar-halo\"\n data-active={state.phase === \"thinking\" ? \"\" : undefined}\n aria-hidden\n >\n <div className=\"lb-tiptap-ai-toolbar-halo-horizontal\" />\n <div className=\"lb-tiptap-ai-toolbar-halo-vertical\" />\n </div>\n </div>\n {state.phase === \"asking\" || state.phase === \"reviewing\" ? (\n <Command.List\n className=\"lb-elevation lb-dropdown lb-tiptap-ai-toolbar-dropdown\"\n data-hidden={isDropdownHidden ? \"\" : undefined}\n ref={dropdownRef}\n >\n {state.phase === \"reviewing\" ? (\n <AiToolbarReviewingSuggestions />\n ) : (\n children\n )}\n </Command.List>\n ) : null}\n </AiToolbarContext.Provider>\n );\n}\n\nconst defaultSuggestions = (\n <>\n <AiToolbarSuggestion\n icon={<EditIcon />}\n prompt=\"Improve the quality of the text\"\n >\n Improve writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<CheckIcon />}\n prompt=\"Fix spelling & grammar errors in the text\"\n >\n Fix mistakes\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<ShortenIcon />}\n prompt=\"Shorten the text, simplifying it\"\n >\n Simplify\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<LengthenIcon />}\n prompt=\"Lengthen the text, going into more detail\"\n >\n Add more detail\n </AiToolbarSuggestion>\n <AiToolbarSuggestionsSeparator />\n <AiToolbarSuggestion\n icon={<SparklesTextIcon />}\n prompt=\"Continue writing from the text's end\"\n >\n Continue writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<QuestionMarkIcon />}\n prompt=\"Explain what the text is about\"\n >\n Explain\n </AiToolbarSuggestion>\n </>\n);\n\n/**\n * @beta\n *\n * A floating AI toolbar attached to the editor.\n */\nexport const AiToolbar = Object.assign(\n forwardRef<HTMLDivElement, AiToolbarProps>(\n (\n {\n offset: sideOffset = 6,\n editor,\n className,\n suggestions: Suggestions = defaultSuggestions,\n ...props\n },\n forwardedRef\n ) => {\n const state =\n useEditorState({\n editor,\n selector: (ctx) => {\n return ctx.editor?.storage.liveblocksAi?.state;\n },\n }) ?? DEFAULT_STATE;\n const selection = editor?.state.selection;\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: AI_TOOLBAR_COLLISION_PADDING,\n };\n\n return {\n strategy: \"fixed\",\n placement: \"bottom\",\n middleware: [\n tiptapFloating(editor),\n hide(detectOverflowOptions),\n offset(sideOffset),\n shift({\n ...detectOverflowOptions,\n mainAxis: false,\n crossAxis: true,\n limiter: limitShift(),\n }),\n flipToolbar(),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [editor, sideOffset]);\n const isOpen = selection !== undefined && state.phase !== \"closed\";\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n isPositioned,\n } = useFloating({\n ...floatingOptions,\n open: isOpen,\n });\n const toolbarRef = useRef<HTMLDivElement>(null);\n const mergedRefs = useRefs(forwardedRef, toolbarRef, setFloating);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [selectedDropdownValue, setSelectedDropdownValue] = useState(\"\");\n\n // Reset the selected dropdown value when the toolbar is closed\n useEffect(() => {\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n }\n }, [state.phase]);\n\n useEffect(() => {\n // Reset the selected dropdown value when the dropdown is closed\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n\n return;\n }\n\n // Otherwise, make sure a dropdown item is selected when moving between phases\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n );\n\n if (selectedDropdownItem) {\n return;\n }\n\n const firstDropdownItem =\n dropdownRef.current?.querySelector(\"[role='option']\");\n\n setSelectedDropdownValue(\n (firstDropdownItem as HTMLElement | null)?.dataset.value ?? \"\"\n );\n }, [state.phase, dropdownRef, setSelectedDropdownValue]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (!selection && state.phase !== \"closed\") {\n editor.commands.$closeAiToolbar();\n }\n }, [state.phase, editor, selection]);\n\n useLayoutEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n setReference(null);\n\n setTimeout(() => {\n if (\n state.phase === \"reviewing\" &&\n isContextualPromptDiffResponse(state.response)\n ) {\n const changes = editor.view.dom.querySelectorAll(\n \"ychange[data-liveblocks]\"\n );\n\n // When diffs are displayed, we manually calculate bounds around all the\n // rendered changes instead of using the selection\n setReference({\n getBoundingClientRect: () => {\n const rects: DOMRect[] = [];\n\n changes.forEach((change) => {\n rects.push(change.getBoundingClientRect());\n });\n\n const minX = Math.min(...rects.map((rect) => rect.left));\n const minY = Math.min(...rects.map((rect) => rect.top));\n const maxX = Math.max(...rects.map((rect) => rect.right));\n const maxY = Math.max(...rects.map((rect) => rect.bottom));\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n top: minY,\n left: minX,\n bottom: maxY,\n right: maxX,\n };\n },\n });\n } else if (selection) {\n const domRange = getDomRangeFromSelection(editor, selection);\n setReference(domRange);\n } else {\n setReference(null);\n }\n }, 0);\n }, [\n selection,\n editor,\n isOpen,\n setReference,\n state.phase,\n state.response,\n ]);\n\n // Close the toolbar when clicking anywhere outside of it\n useEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n const handleOutsideEvent = (event: MouseEvent) => {\n if (!toolbarRef.current) {\n return;\n }\n\n if (\n event.target &&\n !toolbarRef.current.contains(event.target as Node) &&\n (dropdownRef.current\n ? !dropdownRef.current.contains(event.target as Node)\n : true)\n ) {\n editor.commands.$closeAiToolbar();\n }\n };\n\n setTimeout(() => {\n document.addEventListener(\"pointerdown\", handleOutsideEvent);\n }, 0);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handleOutsideEvent);\n };\n }, [editor, isOpen]);\n\n if (!editor || !isOpen) {\n return null;\n }\n\n return (\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <Portal asChild>\n <Command\n role=\"toolbar\"\n label=\"AI toolbar\"\n aria-orientation=\"horizontal\"\n className={cn(\n \"lb-root lb-portal lb-tiptap-ai-toolbar-portal\",\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 }}\n value={selectedDropdownValue}\n onValueChange={setSelectedDropdownValue}\n {...props}\n >\n <AiToolbarContainer\n state={state}\n dropdownRef={dropdownRef}\n toolbarRef={toolbarRef}\n >\n {typeof Suggestions === \"function\" ? (\n <Suggestions children={defaultSuggestions} />\n ) : (\n Suggestions\n )}\n </AiToolbarContainer>\n </Command>\n </Portal>\n </EditorProvider>\n </TooltipProvider>\n );\n }\n ),\n {\n /**\n * @beta\n *\n * A prompt suggestion displayed in the AI toolbar.\n */\n Suggestion: AiToolbarSuggestion,\n\n /**\n * @beta\n *\n * A label to describe a group of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsLabel: AiToolbarSuggestionsLabel,\n\n /**\n * @beta\n *\n * A separator between groups of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsSeparator: AiToolbarSuggestionsSeparator,\n }\n);\n"],"names":["createContext","useContext","forwardRef","jsx","Command","cn","jsxs","useCurrentEditor","useCallback","isContextualPromptDiffResponse","Fragment","CheckIcon","UndoIcon","CrossIcon","ArrowCornerDownRightIcon","useRef","useMemo","useLayoutEffect","customPrompt","SparklesIcon","ShortcutTooltip","Button","SendIcon","WarningIcon","StopIcon","useCommandState","state","useEffect","EditIcon","ShortenIcon","LengthenIcon","SparklesTextIcon","QuestionMarkIcon","useEditorState","DEFAULT_STATE","hide","offset","shift","limitShift","autoUpdate","useFloating","useRefs","useState","getDomRangeFromSelection","TooltipProvider","EditorProvider","Portal"],"mappings":"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"}
|
package/dist/ai/AiToolbar.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { hide, offset, shift, limitShift, autoUpdate, useFloating } from '@floating-ui/react-dom';
|
|
3
3
|
import { useLayoutEffect } from '@liveblocks/react/_private';
|
|
4
|
-
import { cn, CheckIcon, UndoIcon, CrossIcon, ArrowCornerDownRightIcon, SparklesIcon, ShortcutTooltip, Button, SendIcon, WarningIcon, StopIcon, EditIcon, ShortenIcon, LengthenIcon, SparklesTextIcon, QuestionMarkIcon, useRefs, TooltipProvider } from '@liveblocks/react-ui/_private';
|
|
4
|
+
import { cn, CheckIcon, UndoIcon, CrossIcon, ArrowCornerDownRightIcon, SparklesIcon, ShortcutTooltip, Button, SendIcon, WarningIcon, StopIcon, EditIcon, ShortenIcon, LengthenIcon, SparklesTextIcon, QuestionMarkIcon, useRefs, TooltipProvider, Portal } from '@liveblocks/react-ui/_private';
|
|
5
5
|
import { useEditorState } from '@tiptap/react';
|
|
6
6
|
import { Command, useCommandState } from 'cmdk';
|
|
7
7
|
import { createContext, useContext, forwardRef, useCallback, useRef, useMemo, useEffect, useState } from 'react';
|
|
8
|
-
import { createPortal } from 'react-dom';
|
|
9
8
|
import { useCurrentEditor, EditorProvider } from '../context.js';
|
|
10
9
|
import { getDomRangeFromSelection } from '../utils.js';
|
|
11
10
|
import { isContextualPromptDiffResponse, DEFAULT_STATE } from './AiExtension.js';
|
|
@@ -99,9 +98,7 @@ const AiToolbarSuggestion = forwardRef(({ prompt: manualPrompt, ...props }, forw
|
|
|
99
98
|
const editor = useCurrentEditor("Suggestion", "AiToolbar");
|
|
100
99
|
const handleSelect = useCallback(
|
|
101
100
|
(prompt) => {
|
|
102
|
-
editor.commands.$startAiToolbarThinking(
|
|
103
|
-
manualPrompt ?? prompt
|
|
104
|
-
);
|
|
101
|
+
editor.commands.$startAiToolbarThinking(manualPrompt ?? prompt);
|
|
105
102
|
},
|
|
106
103
|
[editor, manualPrompt]
|
|
107
104
|
);
|
|
@@ -226,9 +223,7 @@ function AiToolbarCustomPromptContent() {
|
|
|
226
223
|
};
|
|
227
224
|
const handleCustomPromptChange = useCallback(
|
|
228
225
|
(customPrompt2) => {
|
|
229
|
-
editor.commands._updateAiToolbarCustomPrompt(
|
|
230
|
-
customPrompt2
|
|
231
|
-
);
|
|
226
|
+
editor.commands._updateAiToolbarCustomPrompt(customPrompt2);
|
|
232
227
|
},
|
|
233
228
|
[editor]
|
|
234
229
|
);
|
|
@@ -618,40 +613,37 @@ const AiToolbar = Object.assign(
|
|
|
618
613
|
if (!editor || !isOpen) {
|
|
619
614
|
return null;
|
|
620
615
|
}
|
|
621
|
-
return
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
) }) }),
|
|
653
|
-
document.body
|
|
654
|
-
);
|
|
616
|
+
return /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(EditorProvider, { editor, children: /* @__PURE__ */ jsx(Portal, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
617
|
+
Command,
|
|
618
|
+
{
|
|
619
|
+
role: "toolbar",
|
|
620
|
+
label: "AI toolbar",
|
|
621
|
+
"aria-orientation": "horizontal",
|
|
622
|
+
className: cn(
|
|
623
|
+
"lb-root lb-portal lb-tiptap-ai-toolbar-portal",
|
|
624
|
+
className
|
|
625
|
+
),
|
|
626
|
+
ref: mergedRefs,
|
|
627
|
+
style: {
|
|
628
|
+
position: strategy,
|
|
629
|
+
top: 0,
|
|
630
|
+
left: 0,
|
|
631
|
+
transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)"
|
|
632
|
+
},
|
|
633
|
+
value: selectedDropdownValue,
|
|
634
|
+
onValueChange: setSelectedDropdownValue,
|
|
635
|
+
...props,
|
|
636
|
+
children: /* @__PURE__ */ jsx(
|
|
637
|
+
AiToolbarContainer,
|
|
638
|
+
{
|
|
639
|
+
state,
|
|
640
|
+
dropdownRef,
|
|
641
|
+
toolbarRef,
|
|
642
|
+
children: typeof Suggestions === "function" ? /* @__PURE__ */ jsx(Suggestions, { children: defaultSuggestions }) : Suggestions
|
|
643
|
+
}
|
|
644
|
+
)
|
|
645
|
+
}
|
|
646
|
+
) }) }) });
|
|
655
647
|
}
|
|
656
648
|
),
|
|
657
649
|
{
|