@liveblocks/react-tiptap 2.16.1-ai2 → 2.16.1-ai3

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.
@@ -45,26 +45,36 @@ function tiptapFloating(editor) {
45
45
  }
46
46
  };
47
47
  }
48
- const AiToolbarDropdownGroup = react.forwardRef(({ children, label, ...props }, forwardedRef) => {
49
- return /* @__PURE__ */ jsxRuntime.jsx(cmdk.Command.Group, {
50
- heading: /* @__PURE__ */ jsxRuntime.jsx("span", {
51
- className: "lb-dropdown-label",
52
- children: label
53
- }),
48
+ function flipToolbar() {
49
+ return {
50
+ name: "flipToolbar",
51
+ fn({ elements, middlewareData, rects }) {
52
+ const shiftOffsetY = middlewareData.shift?.y ?? 0;
53
+ if (Math.abs(shiftOffsetY) >= rects.floating.height) {
54
+ elements.floating.setAttribute("data-liveblocks-ai-toolbar-flip", "");
55
+ } else {
56
+ elements.floating.removeAttribute("data-liveblocks-ai-toolbar-flip");
57
+ }
58
+ return {};
59
+ }
60
+ };
61
+ }
62
+ const AiToolbarDropdownSeparator = react.forwardRef(({ className, ...props }, forwardedRef) => {
63
+ return /* @__PURE__ */ jsxRuntime.jsx(cmdk.Command.Separator, {
64
+ className: classnames.classNames("lb-dropdown-separator", className),
54
65
  ...props,
55
- ref: forwardedRef,
56
- children
66
+ ref: forwardedRef
57
67
  });
58
68
  });
59
- const AiToolbarSuggestionsGroup = react.forwardRef((props, forwardedRef) => {
60
- return /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownGroup, {
69
+ const AiToolbarSuggestionsSeparator = react.forwardRef((props, forwardedRef) => {
70
+ return /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownSeparator, {
61
71
  ref: forwardedRef,
62
72
  ...props
63
73
  });
64
74
  });
65
- const AiToolbarDropdownItem = react.forwardRef(({ children, onSelect, icon, ...props }, forwardedRef) => {
75
+ const AiToolbarDropdownItem = react.forwardRef(({ children, onSelect, icon, className, ...props }, forwardedRef) => {
66
76
  return /* @__PURE__ */ jsxRuntime.jsxs(cmdk.Command.Item, {
67
- className: "lb-dropdown-item",
77
+ className: classnames.classNames("lb-dropdown-item", className),
68
78
  onSelect,
69
79
  ...props,
70
80
  ref: forwardedRef,
@@ -80,6 +90,14 @@ const AiToolbarDropdownItem = react.forwardRef(({ children, onSelect, icon, ...p
80
90
  ]
81
91
  });
82
92
  });
93
+ const AiToolbarSuggestionsLabel = react.forwardRef(({ children, className, ...props }, forwardedRef) => {
94
+ return /* @__PURE__ */ jsxRuntime.jsx("span", {
95
+ ref: forwardedRef,
96
+ className: classnames.classNames("lb-dropdown-label", className),
97
+ ...props,
98
+ children
99
+ });
100
+ });
83
101
  const AiToolbarSuggestion = react.forwardRef(({ prompt: manualPrompt, ...props }, forwardedRef) => {
84
102
  const editor = context.useCurrentEditor("Suggestion", "AiToolbar");
85
103
  const handleSelect = react.useCallback(
@@ -99,62 +117,56 @@ const AiToolbarSuggestion = react.forwardRef(({ prompt: manualPrompt, ...props }
99
117
  function AiToolbarReviewingSuggestions() {
100
118
  const editor = context.useCurrentEditor("ReviewingSuggestions", "AiToolbar");
101
119
  const { state } = useAiToolbarContext();
102
- const { output } = state;
103
- const handleDiscard = react.useCallback(() => {
104
- editor.commands.$closeAiToolbar();
105
- }, [editor]);
106
- const handleAccept = react.useCallback(() => {
107
- editor.commands.$acceptAiToolbarOutput();
108
- }, [editor]);
109
- if (output.type === "insert" || output.type === "modification") {
120
+ const { prompt, output } = state;
121
+ const retry = react.useCallback(() => {
122
+ editor.commands.$startAiToolbarThinking(
123
+ prompt,
124
+ false
125
+ );
126
+ }, [editor, prompt]);
127
+ if (AiExtension.isAiToolbarDiffOutput(output)) {
110
128
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
111
129
  children: [
112
130
  /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
113
131
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {}),
114
- onSelect: handleAccept,
132
+ onSelect: editor.commands.$acceptAiToolbarOutput,
115
133
  children: "Accept"
116
134
  }),
117
135
  /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
118
136
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.UndoIcon, {}),
119
- disabled: true,
137
+ onSelect: retry,
120
138
  children: "Try again"
121
139
  }),
122
140
  /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
123
141
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CrossIcon, {}),
124
- onSelect: handleDiscard,
142
+ onSelect: editor.commands.$closeAiToolbar,
125
143
  children: "Discard"
126
144
  })
127
145
  ]
128
146
  });
129
- } else if (output.type === "other") {
147
+ } else {
130
148
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
131
149
  children: [
132
150
  /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
133
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {}),
134
- disabled: true,
135
- children: "Replace selection"
136
- }),
137
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
138
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {}),
139
- disabled: true,
151
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.ArrowCornerDownRightIcon, {}),
152
+ onSelect: editor.commands.$acceptAiToolbarOutput,
140
153
  children: "Insert below"
141
154
  }),
142
155
  /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
143
156
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.UndoIcon, {}),
144
- disabled: true,
157
+ onSelect: retry,
145
158
  children: "Try again"
146
159
  }),
147
160
  /* @__PURE__ */ jsxRuntime.jsx(AiToolbarDropdownItem, {
148
161
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CrossIcon, {}),
149
- onSelect: handleDiscard,
162
+ onSelect: editor.commands.$closeAiToolbar,
150
163
  children: "Discard"
151
164
  })
152
165
  ]
153
166
  });
154
167
  }
155
- return null;
156
168
  }
157
- function AiToolbarCustomPromptContent({ disabled }) {
169
+ function AiToolbarCustomPromptContent() {
158
170
  const editor = context.useCurrentEditor("CustomPromptContent", "AiToolbar");
159
171
  const aiName = editor.storage.liveblocksAi.name;
160
172
  const textAreaRef = react.useRef(null);
@@ -196,7 +208,8 @@ function AiToolbarCustomPromptContent({ disabled }) {
196
208
  selectedDropdownItem.click();
197
209
  } else if (!isCustomPromptEmpty) {
198
210
  editor.commands.$startAiToolbarThinking(
199
- customPrompt
211
+ customPrompt,
212
+ state.phase === "reviewing"
200
213
  );
201
214
  }
202
215
  }
@@ -215,9 +228,10 @@ function AiToolbarCustomPromptContent({ disabled }) {
215
228
  return;
216
229
  }
217
230
  editor.commands.$startAiToolbarThinking(
218
- customPrompt
231
+ customPrompt,
232
+ state.phase === "reviewing"
219
233
  );
220
- }, [editor, customPrompt, isCustomPromptEmpty]);
234
+ }, [editor, customPrompt, isCustomPromptEmpty, state.phase]);
221
235
  return /* @__PURE__ */ jsxRuntime.jsxs("div", {
222
236
  className: "lb-tiptap-ai-toolbar-content",
223
237
  children: [
@@ -238,8 +252,7 @@ function AiToolbarCustomPromptContent({ disabled }) {
238
252
  placeholder: `Ask ${aiName} anything\u2026`,
239
253
  onKeyDown: handlePromptKeyDown,
240
254
  rows: 1,
241
- autoFocus: true,
242
- disabled
255
+ autoFocus: true
243
256
  })
244
257
  })
245
258
  }),
@@ -253,7 +266,7 @@ function AiToolbarCustomPromptContent({ disabled }) {
253
266
  variant: "primary",
254
267
  "aria-label": `Ask ${aiName}`,
255
268
  icon: /* @__PURE__ */ jsxRuntime.jsx(_private.SendIcon, {}),
256
- disabled: isCustomPromptEmpty || disabled,
269
+ disabled: isCustomPromptEmpty,
257
270
  onClick: handleSendClick
258
271
  })
259
272
  })
@@ -262,7 +275,23 @@ function AiToolbarCustomPromptContent({ disabled }) {
262
275
  });
263
276
  }
264
277
  function AiToolbarAsking() {
265
- return /* @__PURE__ */ jsxRuntime.jsx(AiToolbarCustomPromptContent, {});
278
+ const { state } = useAiToolbarContext();
279
+ const { error } = state;
280
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
281
+ children: [
282
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarCustomPromptContent, {}),
283
+ error ? /* @__PURE__ */ jsxRuntime.jsxs("div", {
284
+ className: "lb-tiptap-ai-toolbar-error",
285
+ children: [
286
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
287
+ className: "lb-icon-container",
288
+ children: /* @__PURE__ */ jsxRuntime.jsx(_private.WarningIcon, {})
289
+ }),
290
+ "There was a problem with your request."
291
+ ]
292
+ }) : null
293
+ ]
294
+ });
266
295
  }
267
296
  function AiToolbarThinking() {
268
297
  const editor = context.useCurrentEditor("AiToolbarThinking", "AiToolbar");
@@ -322,9 +351,7 @@ function AiToolbarReviewing() {
322
351
  children: output.text
323
352
  })
324
353
  }) : null,
325
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarCustomPromptContent, {
326
- disabled: true
327
- })
354
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarCustomPromptContent, {})
328
355
  ]
329
356
  });
330
357
  }
@@ -365,7 +392,12 @@ function AiToolbarContainer({
365
392
  };
366
393
  }, [editor, state.phase]);
367
394
  return /* @__PURE__ */ jsxRuntime.jsxs(AiToolbarContext.Provider, {
368
- value: { state, toolbarRef, dropdownRef, isDropdownHidden },
395
+ value: {
396
+ state,
397
+ toolbarRef,
398
+ dropdownRef,
399
+ isDropdownHidden
400
+ },
369
401
  children: [
370
402
  /* @__PURE__ */ jsxRuntime.jsxs("div", {
371
403
  className: "lb-tiptap-ai-toolbar-container",
@@ -400,40 +432,42 @@ function AiToolbarContainer({
400
432
  }
401
433
  const defaultSuggestions = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
402
434
  children: [
403
- /* @__PURE__ */ jsxRuntime.jsxs(AiToolbarSuggestionsGroup, {
404
- label: "Modify",
405
- children: [
406
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
407
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.EditIcon, {}),
408
- children: "Improve writing"
409
- }),
410
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
411
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {}),
412
- children: "Fix mistakes"
413
- }),
414
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
415
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.ShortenIcon, {}),
416
- children: "Simplify"
417
- }),
418
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
419
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.LengthenIcon, {}),
420
- children: "Add more detail"
421
- })
422
- ]
435
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
436
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.EditIcon, {}),
437
+ prompt: "Improve the quality of the text",
438
+ children: "Improve writing"
423
439
  }),
424
- /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestionsGroup, {
425
- label: "Generate",
426
- children: /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
427
- icon: /* @__PURE__ */ jsxRuntime.jsx(_private.QuestionMarkIcon, {}),
428
- children: "Explain"
429
- })
440
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
441
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.CheckIcon, {}),
442
+ prompt: "Fix spelling & grammar errors in the text",
443
+ children: "Fix mistakes"
444
+ }),
445
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
446
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.ShortenIcon, {}),
447
+ prompt: "Shorten the text, simplifying it",
448
+ children: "Simplify"
449
+ }),
450
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
451
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.LengthenIcon, {}),
452
+ prompt: "Lengthen the text, going into more detail",
453
+ children: "Add more detail"
454
+ }),
455
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestionsSeparator, {}),
456
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
457
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.SparklesTextIcon, {}),
458
+ prompt: "Continue writing from the text's end",
459
+ children: "Continue writing"
460
+ }),
461
+ /* @__PURE__ */ jsxRuntime.jsx(AiToolbarSuggestion, {
462
+ icon: /* @__PURE__ */ jsxRuntime.jsx(_private.QuestionMarkIcon, {}),
463
+ prompt: "Explain what the text is about",
464
+ children: "Explain"
430
465
  })
431
466
  ]
432
467
  });
433
468
  const AiToolbar = Object.assign(
434
469
  react.forwardRef(
435
470
  ({
436
- position = "bottom",
437
471
  offset: sideOffset = 6,
438
472
  editor,
439
473
  className,
@@ -446,18 +480,25 @@ const AiToolbar = Object.assign(
446
480
  return ctx.editor?.storage.liveblocksAi?.state;
447
481
  }
448
482
  }) ?? AiExtension.DEFAULT_STATE;
449
- const selection = state.selection ?? editor?.state.selection;
483
+ const selection = editor?.state.selection;
450
484
  const floatingOptions = react.useMemo(() => {
451
485
  const detectOverflowOptions = {
452
486
  padding: AI_TOOLBAR_COLLISION_PADDING
453
487
  };
454
488
  return {
455
489
  strategy: "fixed",
456
- placement: position,
490
+ placement: "bottom",
457
491
  middleware: [
458
492
  tiptapFloating(editor),
459
493
  reactDom.hide(detectOverflowOptions),
460
- reactDom.offset(sideOffset)
494
+ reactDom.offset(sideOffset),
495
+ reactDom.shift({
496
+ ...detectOverflowOptions,
497
+ mainAxis: false,
498
+ crossAxis: true,
499
+ limiter: reactDom.limitShift()
500
+ }),
501
+ flipToolbar()
461
502
  ],
462
503
  whileElementsMounted: (...args) => {
463
504
  return reactDom.autoUpdate(...args, {
@@ -465,7 +506,7 @@ const AiToolbar = Object.assign(
465
506
  });
466
507
  }
467
508
  };
468
- }, [editor, position, sideOffset]);
509
+ }, [editor, sideOffset]);
469
510
  const isOpen = selection !== void 0 && state.phase !== "closed";
470
511
  const {
471
512
  refs: { setReference, setFloating },
@@ -480,6 +521,28 @@ const AiToolbar = Object.assign(
480
521
  const toolbarRef = react.useRef(null);
481
522
  const mergedRefs = _private.useRefs(forwardedRef, toolbarRef, setFloating);
482
523
  const dropdownRef = react.useRef(null);
524
+ const [selectedDropdownValue, setSelectedDropdownValue] = react.useState("");
525
+ react.useEffect(() => {
526
+ if (state.phase === "closed") {
527
+ setSelectedDropdownValue("");
528
+ }
529
+ }, [state.phase]);
530
+ react.useEffect(() => {
531
+ if (state.phase === "closed") {
532
+ setSelectedDropdownValue("");
533
+ return;
534
+ }
535
+ const selectedDropdownItem = dropdownRef.current?.querySelector(
536
+ "[role='option'][data-selected='true']"
537
+ );
538
+ if (selectedDropdownItem) {
539
+ return;
540
+ }
541
+ const firstDropdownItem = dropdownRef.current?.querySelector("[role='option']");
542
+ setSelectedDropdownValue(
543
+ firstDropdownItem?.dataset.value ?? ""
544
+ );
545
+ }, [state.phase, dropdownRef, setSelectedDropdownValue]);
483
546
  react.useEffect(() => {
484
547
  if (!editor) {
485
548
  return;
@@ -494,14 +557,40 @@ const AiToolbar = Object.assign(
494
557
  }
495
558
  setReference(null);
496
559
  setTimeout(() => {
497
- if (!selection) {
498
- setReference(null);
499
- } else {
500
- const domRange = utils.getDomRangeFromSelection(selection, editor);
560
+ if (state.phase === "reviewing" && AiExtension.isAiToolbarDiffOutput(state.output)) {
561
+ const changes = editor.view.dom.querySelectorAll(
562
+ "ychange[data-liveblocks]"
563
+ );
564
+ setReference({
565
+ getBoundingClientRect: () => {
566
+ const rects = [];
567
+ changes.forEach((change) => {
568
+ rects.push(change.getBoundingClientRect());
569
+ });
570
+ const minX = Math.min(...rects.map((rect) => rect.left));
571
+ const minY = Math.min(...rects.map((rect) => rect.top));
572
+ const maxX = Math.max(...rects.map((rect) => rect.right));
573
+ const maxY = Math.max(...rects.map((rect) => rect.bottom));
574
+ return {
575
+ x: minX,
576
+ y: minY,
577
+ width: maxX - minX,
578
+ height: maxY - minY,
579
+ top: minY,
580
+ left: minX,
581
+ bottom: maxY,
582
+ right: maxX
583
+ };
584
+ }
585
+ });
586
+ } else if (selection) {
587
+ const domRange = utils.getDomRange(editor, selection);
501
588
  setReference(domRange);
589
+ } else {
590
+ setReference(null);
502
591
  }
503
592
  }, 0);
504
- }, [selection, editor, isOpen, setReference]);
593
+ }, [selection, editor, isOpen, setReference, state.phase, state.output]);
505
594
  react.useEffect(() => {
506
595
  if (!editor || !isOpen) {
507
596
  return;
@@ -543,6 +632,8 @@ const AiToolbar = Object.assign(
543
632
  left: 0,
544
633
  transform: isPositioned ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)` : "translate3d(0, -200%, 0)"
545
634
  },
635
+ value: selectedDropdownValue,
636
+ onValueChange: setSelectedDropdownValue,
546
637
  ...props,
547
638
  children: /* @__PURE__ */ jsxRuntime.jsx(AiToolbarContainer, {
548
639
  state,
@@ -560,8 +651,9 @@ const AiToolbar = Object.assign(
560
651
  }
561
652
  ),
562
653
  {
563
- SuggestionsGroup: AiToolbarSuggestionsGroup,
564
- Suggestion: AiToolbarSuggestion
654
+ Suggestion: AiToolbarSuggestion,
655
+ SuggestionsLabel: AiToolbarSuggestionsLabel,
656
+ SuggestionsSeparator: AiToolbarSuggestionsSeparator
565
657
  }
566
658
  );
567
659
 
@@ -1 +1 @@
1
- {"version":3,"file":"AiToolbar.js","sources":["../../src/ai/AiToolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n hide,\n type Middleware,\n offset,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n Button,\n CheckIcon,\n CrossIcon,\n EditIcon,\n LengthenIcon,\n QuestionMarkIcon,\n SendIcon,\n ShortcutTooltip,\n ShortenIcon,\n SparklesIcon,\n TooltipProvider,\n UndoIcon,\n useRefs,\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} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { classNames } from \"../classnames\";\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type {\n AiCommands,\n AiExtensionStorage,\n AiToolbarState,\n ChainedAiCommands,\n FloatingPosition,\n} from \"../types\";\nimport { getDomRangeFromSelection } from \"../utils\";\nimport { DEFAULT_STATE } from \"./AiExtension\";\n\nexport const AI_TOOLBAR_COLLISION_PADDING = 10;\n\nexport interface AiToolbarProps\n extends Omit<ComponentProps<\"div\">, \"value\" | \"defaultValue\"> {\n editor: Editor | null;\n position?: FloatingPosition;\n offset?: number;\n suggestions?: ReactNode | ComponentType<PropsWithChildren>;\n}\n\ninterface AiToolbarDropdownGroupProps extends ComponentProps<\"div\"> {\n label: string;\n}\n\ninterface AiToolbarDropdownItemProps\n extends ComponentProps<typeof Command.Item> {\n icon?: ReactNode;\n}\n\ntype AiToolbarSuggestionsGroupProps = AiToolbarDropdownGroupProps;\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\nconst AiToolbarDropdownGroup = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownGroupProps\n>(({ children, label, ...props }, forwardedRef) => {\n return (\n <Command.Group\n heading={<span className=\"lb-dropdown-label\">{label}</span>}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Command.Group>\n );\n});\n\nconst AiToolbarSuggestionsGroup = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsGroupProps\n>((props, forwardedRef) => {\n return <AiToolbarDropdownGroup ref={forwardedRef} {...props} />;\n});\n\nconst AiToolbarDropdownItem = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownItemProps\n>(({ children, onSelect, icon, ...props }, forwardedRef) => {\n return (\n <Command.Item\n className=\"lb-dropdown-item\"\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 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 as unknown as AiCommands).$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 { output } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n const handleDiscard = useCallback(() => {\n (editor.commands as unknown as AiCommands).$closeAiToolbar();\n }, [editor]);\n\n const handleAccept = useCallback(() => {\n (editor.commands as unknown as AiCommands).$acceptAiToolbarOutput();\n }, [editor]);\n\n if (output.type === \"insert\" || output.type === \"modification\") {\n return (\n <>\n <AiToolbarDropdownItem icon={<CheckIcon />} onSelect={handleAccept}>\n Accept\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<UndoIcon />} disabled>\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<CrossIcon />} onSelect={handleDiscard}>\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n } else if (output.type === \"other\") {\n return (\n <>\n <AiToolbarDropdownItem icon={<CheckIcon />} disabled>\n Replace selection\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<CheckIcon />} disabled>\n Insert below\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<UndoIcon />} disabled>\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<CrossIcon />} onSelect={handleDiscard}>\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n }\n\n return null;\n}\n\nfunction AiToolbarCustomPromptContent({ disabled }: { disabled?: boolean }) {\n const editor = useCurrentEditor(\"CustomPromptContent\", \"AiToolbar\");\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage).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 setTimeout(() => {\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 }, 0);\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 as unknown as AiCommands)._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 as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt\n );\n }\n }\n }\n };\n\n const handleCustomPromptChange = useCallback(\n (customPrompt: string) => {\n (editor.commands as unknown as AiCommands)._updateAiToolbarCustomPrompt(\n customPrompt\n );\n },\n [editor]\n );\n\n const handleSendClick = useCallback(() => {\n if (isCustomPromptEmpty) {\n return;\n }\n\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt\n );\n }, [editor, customPrompt, isCustomPromptEmpty]);\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 disabled={disabled}\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 || disabled}\n onClick={handleSendClick}\n />\n </ShortcutTooltip>\n </div>\n </div>\n );\n}\n\nfunction AiToolbarAsking() {\n return <AiToolbarCustomPromptContent />;\n}\n\nfunction AiToolbarThinking() {\n const editor = useCurrentEditor(\"AiToolbarThinking\", \"AiToolbar\");\n const contentRef = useRef<HTMLDivElement>(null);\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage).name;\n\n const handleCancel = useCallback(() => {\n (editor.commands as unknown as AiCommands).$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=\"Cancel\" shortcut=\"Escape\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"secondary\"\n aria-label=\"Cancel\"\n icon={<UndoIcon />}\n onClick={handleCancel}\n />\n </ShortcutTooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction AiToolbarReviewing() {\n const { state } = useAiToolbarContext();\n const { output } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n return (\n <>\n {output.type === \"other\" ? (\n <div className=\"lb-tiptap-ai-toolbar-output-container\">\n <div className=\"lb-tiptap-ai-toolbar-output\">{output.text}</div>\n </div>\n ) : null}\n {/* TODO: Allow to refine the output with another prompt */}\n <AiToolbarCustomPromptContent disabled />\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 as unknown as AiCommands).$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={{ state, toolbarRef, dropdownRef, isDropdownHidden }}\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 <AiToolbarSuggestionsGroup label=\"Modify\">\n <AiToolbarSuggestion icon={<EditIcon />}>\n Improve writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion icon={<CheckIcon />}>\n Fix mistakes\n </AiToolbarSuggestion>\n <AiToolbarSuggestion icon={<ShortenIcon />}>Simplify</AiToolbarSuggestion>\n <AiToolbarSuggestion icon={<LengthenIcon />}>\n Add more detail\n </AiToolbarSuggestion>\n </AiToolbarSuggestionsGroup>\n <AiToolbarSuggestionsGroup label=\"Generate\">\n <AiToolbarSuggestion icon={<QuestionMarkIcon />}>\n Explain\n </AiToolbarSuggestion>\n </AiToolbarSuggestionsGroup>\n </>\n);\n\nexport const AiToolbar = Object.assign(\n forwardRef<HTMLDivElement, AiToolbarProps>(\n (\n {\n position = \"bottom\",\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 as AiExtensionStorage | undefined\n )?.state;\n },\n }) ?? DEFAULT_STATE;\n const selection = state.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: position,\n middleware: [\n tiptapFloating(editor),\n hide(detectOverflowOptions),\n offset(sideOffset),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [editor, position, 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\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (!selection && state.phase !== \"closed\") {\n (editor.commands as unknown as AiCommands).$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 (!selection) {\n setReference(null);\n } else {\n const domRange = getDomRangeFromSelection(selection, editor);\n setReference(domRange);\n }\n }, 0);\n }, [selection, editor, isOpen, setReference]);\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 as unknown as AiCommands).$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={classNames(\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 {...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 SuggestionsGroup: AiToolbarSuggestionsGroup,\n Suggestion: AiToolbarSuggestion,\n }\n);\n"],"names":["createContext","useContext","forwardRef","jsx","Command","jsxs","useCurrentEditor","useCallback","Fragment","CheckIcon","UndoIcon","CrossIcon","useRef","useMemo","useLayoutEffect","customPrompt","SparklesIcon","ShortcutTooltip","Button","SendIcon","useCommandState","state","useEffect","EditIcon","ShortenIcon","LengthenIcon","QuestionMarkIcon","useEditorState","DEFAULT_STATE","hide","offset","autoUpdate","useFloating","useRefs","getDomRangeFromSelection","createPortal","TooltipProvider","EditorProvider","classNames"],"mappings":"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"}
1
+ {"version":3,"file":"AiToolbar.js","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 CrossIcon,\n EditIcon,\n LengthenIcon,\n QuestionMarkIcon,\n SendIcon,\n ShortcutTooltip,\n ShortenIcon,\n SparklesIcon,\n SparklesTextIcon,\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 { classNames } from \"../classnames\";\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type {\n AiCommands,\n AiExtensionStorage,\n AiToolbarState,\n ChainedAiCommands,\n} from \"../types\";\nimport { getDomRange } from \"../utils\";\nimport { DEFAULT_STATE, isAiToolbarDiffOutput } from \"./AiExtension\";\n\nexport const AI_TOOLBAR_COLLISION_PADDING = 10;\n\nexport interface AiToolbarProps\n extends Omit<ComponentProps<\"div\">, \"value\" | \"defaultValue\" | \"children\"> {\n editor: Editor | null;\n offset?: number;\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={classNames(\"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={classNames(\"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={classNames(\"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 as unknown as AiCommands).$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 { prompt, output } = state as Extract<\n AiToolbarState,\n { phase: \"reviewing\" }\n >;\n\n const retry = useCallback(() => {\n // Retry with the same prompt\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n prompt,\n false\n );\n }, [editor, prompt]);\n\n if (isAiToolbarDiffOutput(output)) {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<CheckIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$acceptAiToolbarOutput\n }\n >\n Accept\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<UndoIcon />} onSelect={retry}>\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands as unknown as AiCommands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n } else {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<ArrowCornerDownRightIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$acceptAiToolbarOutput\n }\n >\n Insert below\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem icon={<UndoIcon />} onSelect={retry}>\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands as unknown as AiCommands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n }\n}\n\nfunction AiToolbarCustomPromptContent() {\n const editor = useCurrentEditor(\"CustomPromptContent\", \"AiToolbar\");\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage).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 setTimeout(() => {\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 }, 0);\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 as unknown as AiCommands)._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 as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt, state.phase === \"reviewing\"\n );\n }\n }\n }\n };\n\n const handleCustomPromptChange = useCallback(\n (customPrompt: string) => {\n (editor.commands as unknown as AiCommands)._updateAiToolbarCustomPrompt(\n customPrompt\n );\n },\n [editor]\n );\n\n const handleSendClick = useCallback(() => {\n if (isCustomPromptEmpty) {\n return;\n }\n\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt, 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 as AiExtensionStorage).name;\n\n const handleCancel = useCallback(() => {\n (editor.commands as unknown as AiCommands).$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=\"Cancel\" shortcut=\"Escape\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"secondary\"\n aria-label=\"Cancel\"\n icon={<UndoIcon />}\n onClick={handleCancel}\n />\n </ShortcutTooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction AiToolbarReviewing() {\n const { state } = useAiToolbarContext();\n const { output } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n return (\n <>\n {output.type === \"other\" ? (\n <div className=\"lb-tiptap-ai-toolbar-output-container\">\n <div className=\"lb-tiptap-ai-toolbar-output\">{output.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 as unknown as AiCommands).$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 as AiExtensionStorage | undefined\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 as unknown as AiCommands).$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 isAiToolbarDiffOutput(state.output)\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 = getDomRange(editor, selection);\n setReference(domRange);\n } else {\n setReference(null);\n }\n }, 0);\n }, [selection, editor, isOpen, setReference, state.phase, state.output]);\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 as unknown as AiCommands).$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={classNames(\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","classNames","jsxs","useCurrentEditor","useCallback","isAiToolbarDiffOutput","Fragment","CheckIcon","UndoIcon","CrossIcon","ArrowCornerDownRightIcon","useRef","useMemo","useLayoutEffect","customPrompt","SparklesIcon","ShortcutTooltip","Button","SendIcon","WarningIcon","useCommandState","state","useEffect","EditIcon","ShortenIcon","LengthenIcon","SparklesTextIcon","QuestionMarkIcon","useEditorState","DEFAULT_STATE","hide","offset","shift","limitShift","autoUpdate","useFloating","useRefs","useState","getDomRange","createPortal","TooltipProvider","EditorProvider"],"mappings":"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"}