payload-richtext-tiptap 0.0.141 → 0.0.143

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +27 -1
  2. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.d.ts.map +1 -1
  3. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.js +0 -1
  4. package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.js.map +1 -1
  5. package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.d.ts +3 -3
  6. package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.d.ts.map +1 -1
  7. package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.js +47 -41
  8. package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.js.map +1 -1
  9. package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.d.ts +4 -2
  10. package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.d.ts.map +1 -1
  11. package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.js +53 -14
  12. package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.js.map +1 -1
  13. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.d.ts +2 -2
  14. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.d.ts.map +1 -1
  15. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.js +22 -20
  16. package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.js.map +1 -1
  17. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.d.ts.map +1 -1
  18. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.js +2 -4
  19. package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.js.map +1 -1
  20. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.d.ts.map +1 -1
  21. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.js +4 -6
  22. package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.js.map +1 -1
  23. package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.d.ts.map +1 -1
  24. package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.js +3 -5
  25. package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.js.map +1 -1
  26. package/dist/src/mobile.css +1 -1
  27. package/dist/src/styles.css +1 -1
  28. package/dist/tsconfig.tsbuildinfo +1 -1
  29. package/package.json +1 -1
@@ -1,5 +1,4 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useLocale } from '@payloadcms/ui/providers/Locale';
3
2
  import * as Popover from '@radix-ui/react-popover';
4
3
  import i18next from 'i18next';
5
4
  import { ArrowDownWideNarrow, BookText, CheckCheck, ChevronDown, Languages, RefreshCcwDot, StepForward, WrapText } from 'lucide-react';
@@ -54,7 +53,6 @@ const options = [
54
53
  }
55
54
  ];
56
55
  const AISelectorCommands = ({ messages, onSelect, editor })=>{
57
- const { code } = useLocale();
58
56
  const editorSelection = editor?.state?.selection?.content?.()?.content?.toJSON();
59
57
  const sortedLanguages = useMemo(()=>{
60
58
  const editorLanguage = editor.storage?.aiCommand?.language;
@@ -138,7 +136,7 @@ const AISelectorCommands = ({ messages, onSelect, editor })=>{
138
136
  const content = messages ? extractMarkdown(messages) ?? '' : editor.state.doc.textBetween(from, to, ' ');
139
137
  onSelect(content, {
140
138
  option: option.value,
141
- language: editor?.storage?.aiCommand?.language ?? code ?? 'en'
139
+ language: editor?.storage?.aiCommand?.language
142
140
  });
143
141
  },
144
142
  className: " gap-2 px-4 w-full flex justify-start",
@@ -168,7 +166,7 @@ const AISelectorCommands = ({ messages, onSelect, editor })=>{
168
166
  });
169
167
  onSelect(text, {
170
168
  option: 'continue',
171
- language: editor?.storage?.aiCommand?.language ?? code ?? 'en'
169
+ language: editor?.storage?.aiCommand?.language
172
170
  });
173
171
  },
174
172
  value: "continue",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.tsx"],"sourcesContent":["import { useLocale } from '@payloadcms/ui/providers/Locale'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Editor, JSONContent } from '@tiptap/react'\nimport i18next from 'i18next'\nimport {\n ArrowDownWideNarrow,\n BookText,\n CheckCheck,\n ChevronDown,\n Languages,\n RefreshCcwDot,\n StepForward,\n WrapText,\n} from 'lucide-react'\nimport { languages } from '../../../../lib/constants.js'\nimport { getPrevText } from '../../../../lib/utils/index.js'\nimport { DropdownCategoryTitle } from '../../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../../ui/Icon.js'\nimport { Surface } from '../../../ui/Surface.js'\nimport { Toolbar } from '../../../ui/Toolbar.js'\nimport { useMemo } from 'react'\nimport { extractMarkdown } from '../../../../lib/extract.js'\nconst options = [\n // {\n // value: 'translate',\n // label: 'Translate text',\n // icon: WrapText,\n // },\n {\n value: 'improve',\n label: 'Improve writing',\n icon: RefreshCcwDot,\n },\n {\n value: 'fix',\n label: 'Fix grammar',\n icon: CheckCheck,\n },\n {\n value: 'rewrite_with_guidelines',\n label: 'Rewrite per Editorial Guidelines',\n icon: BookText,\n },\n {\n value: 'rewrite',\n label: 'Rewrite into Axios',\n icon: WrapText,\n },\n\n {\n value: 'summarize',\n label: 'Summarize text',\n icon: WrapText,\n },\n {\n value: 'shorter',\n label: 'Make shorter',\n icon: ArrowDownWideNarrow,\n },\n {\n value: 'longer',\n label: 'Make longer',\n icon: WrapText,\n },\n]\n\ninterface AISelectorCommandsProps {\n editor: Editor\n messages?: JSONContent\n onSelect: (\n value: string,\n options: { option: string; language?: string; selection?: JSON },\n ) => void\n}\n\nconst AISelectorCommands = ({ messages, onSelect, editor }: AISelectorCommandsProps) => {\n const { code } = useLocale()\n const editorSelection = editor?.state?.selection?.content?.()?.content?.toJSON()\n const sortedLanguages = useMemo(() => {\n const editorLanguage = editor.storage?.aiCommand?.language\n return languages.sort((a, b) => {\n if (editorLanguage?.includes(a.value)) return -1\n if (editorLanguage?.includes(b.value)) return 1\n return 0\n })\n }, [languages, editor.storage?.aiCommand?.language])\n\n return (\n <>\n <DropdownCategoryTitle>Edit or review selection</DropdownCategoryTitle>\n {editorSelection && (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Toolbar.Button\n className='gap-2 px-4 w-full flex justify-start '\n type='button'\n // active={!!states.currentHighlight}\n tooltip={i18next.t('highlightText') || 'Highlight text'}\n >\n <Icon icon={Languages} className='h-4 w-4 text-blue-500' />\n Translate text\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n <Icon icon={ChevronDown} className='h-4 w-4 text-blue-500' />\n </Toolbar.Button>\n </Popover.Trigger>\n <Popover.Content side='right' align='start' sideOffset={8} asChild>\n <Surface className='flex flex-col min-w-[15rem] p-2 max-h-[20rem] overflow-auto'>\n <DropdownCategoryTitle>Languages</DropdownCategoryTitle>\n\n {sortedLanguages.map((lang) => (\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n onSelect('', {\n option: 'translate',\n language: lang.value,\n selection: editorSelection,\n })\n }}\n className='gap-2 px-4 w-full flex justify-start '\n key={lang.value}\n >\n {lang.label}\n </Toolbar.Button>\n ))}\n </Surface>\n </Popover.Content>\n </Popover.Root>\n )}\n\n {options.map((option) => (\n <Toolbar.Button\n // onSelect={(value) => {\n // const slice = editor.state.selection.content()\n // const text = editor?.storage?.markdown?.serializer.serialize(slice.content)\n // onSelect(text, option.value)\n // }}\n onClick={() => {\n const { from, to, empty } = editor.state.selection\n const editorSelection = editor.state.selection.content().content.toJSON()\n const content = messages\n ? (extractMarkdown(messages) ?? '')\n : editor.state.doc.textBetween(from, to, ' ')\n onSelect(content, {\n option: option.value,\n language: editor?.storage?.aiCommand?.language ?? code ?? 'en',\n })\n }}\n className=' gap-2 px-4 w-full flex justify-start'\n key={option.value}\n value={option.value}\n >\n <option.icon className='h-4 w-4 text-blue-500' />\n {option.label}\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n ))}\n <Toolbar.Divider horizontal />\n <DropdownCategoryTitle>Use AI to do more</DropdownCategoryTitle>\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n const text = messages\n ? (extractMarkdown(messages) ?? '')\n : getPrevText(editor, { chars: 5000 })\n onSelect(text, {\n option: 'continue',\n language: editor?.storage?.aiCommand?.language ?? code ?? 'en',\n })\n }}\n value='continue'\n className='gap-2 px-4 w-full flex justify-start'\n >\n <StepForward className='h-4 w-4 text-blue-500' />\n Continue writing\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n </>\n )\n}\n\nexport default AISelectorCommands\n"],"names":["useLocale","Popover","i18next","ArrowDownWideNarrow","BookText","CheckCheck","ChevronDown","Languages","RefreshCcwDot","StepForward","WrapText","languages","getPrevText","DropdownCategoryTitle","Icon","Surface","Toolbar","useMemo","extractMarkdown","options","value","label","icon","AISelectorCommands","messages","onSelect","editor","code","editorSelection","state","selection","content","toJSON","sortedLanguages","editorLanguage","storage","aiCommand","language","sort","a","b","includes","Root","Trigger","asChild","Button","className","type","tooltip","t","span","Content","side","align","sideOffset","map","lang","onClick","option","from","to","empty","doc","textBetween","Divider","horizontal","text","chars"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../../src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.tsx"],"sourcesContent":["import * as Popover from '@radix-ui/react-popover'\nimport { Editor, JSONContent } from '@tiptap/react'\nimport i18next from 'i18next'\nimport {\n ArrowDownWideNarrow,\n BookText,\n CheckCheck,\n ChevronDown,\n Languages,\n RefreshCcwDot,\n StepForward,\n WrapText,\n} from 'lucide-react'\nimport { languages } from '../../../../lib/constants.js'\nimport { getPrevText } from '../../../../lib/utils/index.js'\nimport { DropdownCategoryTitle } from '../../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../../ui/Icon.js'\nimport { Surface } from '../../../ui/Surface.js'\nimport { Toolbar } from '../../../ui/Toolbar.js'\nimport { useMemo } from 'react'\nimport { extractMarkdown } from '../../../../lib/extract.js'\nconst options = [\n // {\n // value: 'translate',\n // label: 'Translate text',\n // icon: WrapText,\n // },\n {\n value: 'improve',\n label: 'Improve writing',\n icon: RefreshCcwDot,\n },\n {\n value: 'fix',\n label: 'Fix grammar',\n icon: CheckCheck,\n },\n {\n value: 'rewrite_with_guidelines',\n label: 'Rewrite per Editorial Guidelines',\n icon: BookText,\n },\n {\n value: 'rewrite',\n label: 'Rewrite into Axios',\n icon: WrapText,\n },\n\n {\n value: 'summarize',\n label: 'Summarize text',\n icon: WrapText,\n },\n {\n value: 'shorter',\n label: 'Make shorter',\n icon: ArrowDownWideNarrow,\n },\n {\n value: 'longer',\n label: 'Make longer',\n icon: WrapText,\n },\n]\n\ninterface AISelectorCommandsProps {\n editor: Editor\n messages?: JSONContent\n onSelect: (\n value: string,\n options: { option: string; language?: string; selection?: JSON },\n ) => void\n}\n\nconst AISelectorCommands = ({ messages, onSelect, editor }: AISelectorCommandsProps) => {\n const editorSelection = editor?.state?.selection?.content?.()?.content?.toJSON()\n const sortedLanguages = useMemo(() => {\n const editorLanguage = editor.storage?.aiCommand?.language\n return languages.sort((a, b) => {\n if (editorLanguage?.includes(a.value)) return -1\n if (editorLanguage?.includes(b.value)) return 1\n return 0\n })\n }, [languages, editor.storage?.aiCommand?.language])\n\n return (\n <>\n <DropdownCategoryTitle>Edit or review selection</DropdownCategoryTitle>\n {editorSelection && (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Toolbar.Button\n className='gap-2 px-4 w-full flex justify-start '\n type='button'\n // active={!!states.currentHighlight}\n tooltip={i18next.t('highlightText') || 'Highlight text'}\n >\n <Icon icon={Languages} className='h-4 w-4 text-blue-500' />\n Translate text\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n <Icon icon={ChevronDown} className='h-4 w-4 text-blue-500' />\n </Toolbar.Button>\n </Popover.Trigger>\n <Popover.Content side='right' align='start' sideOffset={8} asChild>\n <Surface className='flex flex-col min-w-[15rem] p-2 max-h-[20rem] overflow-auto'>\n <DropdownCategoryTitle>Languages</DropdownCategoryTitle>\n\n {sortedLanguages.map((lang) => (\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n onSelect('', {\n option: 'translate',\n language: lang.value,\n selection: editorSelection,\n })\n }}\n className='gap-2 px-4 w-full flex justify-start '\n key={lang.value}\n >\n {lang.label}\n </Toolbar.Button>\n ))}\n </Surface>\n </Popover.Content>\n </Popover.Root>\n )}\n\n {options.map((option) => (\n <Toolbar.Button\n // onSelect={(value) => {\n // const slice = editor.state.selection.content()\n // const text = editor?.storage?.markdown?.serializer.serialize(slice.content)\n // onSelect(text, option.value)\n // }}\n onClick={() => {\n const { from, to, empty } = editor.state.selection\n const editorSelection = editor.state.selection.content().content.toJSON()\n const content = messages\n ? (extractMarkdown(messages) ?? '')\n : editor.state.doc.textBetween(from, to, ' ')\n onSelect(content, {\n option: option.value,\n language: editor?.storage?.aiCommand?.language,\n })\n }}\n className=' gap-2 px-4 w-full flex justify-start'\n key={option.value}\n value={option.value}\n >\n <option.icon className='h-4 w-4 text-blue-500' />\n {option.label}\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n ))}\n <Toolbar.Divider horizontal />\n <DropdownCategoryTitle>Use AI to do more</DropdownCategoryTitle>\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n const text = messages\n ? (extractMarkdown(messages) ?? '')\n : getPrevText(editor, { chars: 5000 })\n onSelect(text, {\n option: 'continue',\n language: editor?.storage?.aiCommand?.language,\n })\n }}\n value='continue'\n className='gap-2 px-4 w-full flex justify-start'\n >\n <StepForward className='h-4 w-4 text-blue-500' />\n Continue writing\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n </>\n )\n}\n\nexport default AISelectorCommands\n"],"names":["Popover","i18next","ArrowDownWideNarrow","BookText","CheckCheck","ChevronDown","Languages","RefreshCcwDot","StepForward","WrapText","languages","getPrevText","DropdownCategoryTitle","Icon","Surface","Toolbar","useMemo","extractMarkdown","options","value","label","icon","AISelectorCommands","messages","onSelect","editor","editorSelection","state","selection","content","toJSON","sortedLanguages","editorLanguage","storage","aiCommand","language","sort","a","b","includes","Root","Trigger","asChild","Button","className","type","tooltip","t","span","Content","side","align","sideOffset","map","lang","onClick","option","from","to","empty","doc","textBetween","Divider","horizontal","text","chars"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AICommandPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAA;AAKd,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAItC,OAAO,EAAW,KAAK,EAAE,MAAM,wCAAwC,CAAA;AAYvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,KAAK,EAAE,CAAA;CACf,CAAA;AAED,eAAO,MAAM,cAAc,qFAkQ1B,CAAA"}
1
+ {"version":3,"file":"AICommandPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAA;AAId,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAItC,OAAO,EAAW,KAAK,EAAE,MAAM,wCAAwC,CAAA;AAYvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,KAAK,EAAE,CAAA;CACf,CAAA;AAED,eAAO,MAAM,cAAc,qFA6Q1B,CAAA"}
@@ -4,7 +4,6 @@ import { ArrowUpCircle, Sparkles } from 'lucide-react';
4
4
  import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
5
5
  import Markdown from 'react-markdown';
6
6
  import TextareaAutosize from 'react-textarea-autosize';
7
- import { useLocale } from '@payloadcms/ui/providers/Locale';
8
7
  import { experimental_useObject as useObject } from '@ai-sdk/react';
9
8
  import i18next from 'i18next';
10
9
  import { TiptapSchema } from '../../../lib/tiptapSchema.js';
@@ -18,7 +17,6 @@ import { Toolbar } from '../../ui/Toolbar.js';
18
17
  import { useExtractMarkdown } from '../AIEditorPanel/markdown.hook.js';
19
18
  export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange, userPrompt, items, ...restProps }, ref)=>{
20
19
  const [inputValue, setInputValue] = useState(userPrompt ?? '');
21
- const { code } = useLocale();
22
20
  const { view } = editor;
23
21
  const scrollContainer = useRef(null);
24
22
  const activeItem = useRef(null);
@@ -40,7 +38,7 @@ export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange,
40
38
  body: {
41
39
  option: 'zap',
42
40
  command: inputValue,
43
- language: code ?? 'en',
41
+ language: editor?.storage?.aiCommand?.language,
44
42
  selection: object
45
43
  }
46
44
  });
@@ -52,12 +50,12 @@ export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange,
52
50
  body: {
53
51
  option: 'zap',
54
52
  command: inputValue,
55
- language: code ?? 'en'
53
+ language: editor?.storage?.aiCommand?.language
56
54
  }
57
55
  });
58
56
  setInputValue('');
59
57
  }, [
60
- code,
58
+ editor?.storage?.aiCommand?.language,
61
59
  inputValue,
62
60
  object,
63
61
  submit
@@ -241,7 +239,7 @@ export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange,
241
239
  prompt: value,
242
240
  body: {
243
241
  ...options,
244
- source: code
242
+ source: editor?.storage?.aiCommand?.language
245
243
  }
246
244
  });
247
245
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"sourcesContent":["'use client'\nimport { ArrowUpCircle, Sparkles } from 'lucide-react'\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\nimport Markdown from 'react-markdown'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { useLocale } from '@payloadcms/ui/providers/Locale'\nimport { Editor } from '@tiptap/react'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport { Command, Group } from '../../../extensions/AICommand/types.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { DropdownButton } from '../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../ui/Icon.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport { useExtractMarkdown } from '../AIEditorPanel/markdown.hook.js'\n\nexport type AICommandPanelProps = {\n editor: Editor\n userPrompt?: string\n onOpenChange: (value: boolean) => void\n items: Group[]\n}\n\nexport const AICommandPanel = forwardRef(\n ({ editor, onOpenChange, userPrompt, items, ...restProps }: AICommandPanelProps, ref) => {\n const [inputValue, setInputValue] = useState(userPrompt ?? '')\n const { code } = useLocale()\n const { view } = editor\n const scrollContainer = useRef<HTMLDivElement>(null)\n const activeItem = useRef<HTMLButtonElement>(null)\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0)\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0)\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n\n const { markdown } = useExtractMarkdown(object)\n\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: '',\n body: { option: 'zap', command: inputValue, language: code ?? 'en', selection: object },\n })\n setInputValue('')\n return\n }\n\n submit({\n prompt: '',\n body: { option: 'zap', command: inputValue, language: code ?? 'en' },\n })\n setInputValue('')\n }, [code, inputValue, object, submit])\n\n useEffect(() => {\n if (userPrompt) setInputValue(userPrompt)\n }, [userPrompt])\n useEffect(() => {\n if (hasCompletion) {\n editor.storage.aiCommand.completion = object\n }\n }, [object, isLoading])\n\n useEffect(() => {\n setSelectedGroupIndex(0)\n setSelectedCommandIndex(0)\n }, [items])\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const command = items[groupIndex].commands[commandIndex]\n setInputValue(command.action(editor))\n },\n [items, editor],\n )\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === 'ArrowDown') {\n if (!items.length) {\n return false\n }\n\n const commands = items[selectedGroupIndex].commands\n\n let newCommandIndex = selectedCommandIndex + 1\n let newGroupIndex = selectedGroupIndex\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0\n newGroupIndex = selectedGroupIndex + 1\n }\n\n if (items.length - 1 < newGroupIndex) {\n newGroupIndex = 0\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'ArrowUp') {\n if (!items.length) {\n return false\n }\n\n let newCommandIndex = selectedCommandIndex - 1\n let newGroupIndex = selectedGroupIndex\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1\n newCommandIndex = items[newGroupIndex]?.commands.length - 1 || 0\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = items.length - 1\n newCommandIndex = items[newGroupIndex].commands.length - 1\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'Enter') {\n if (!items.length || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex)\n\n return true\n }\n\n return false\n },\n }))\n\n useEffect(() => {\n if (activeItem.current && scrollContainer.current) {\n const offsetTop = activeItem.current.offsetTop\n const offsetHeight = activeItem.current.offsetHeight\n\n scrollContainer.current.scrollTop = offsetTop - offsetHeight\n }\n }, [selectedCommandIndex, selectedGroupIndex])\n\n const createCommandClickHandler = useCallback(\n (groupIndex: number, commandIndex: number) => {\n return () => {\n selectItem(groupIndex, commandIndex)\n }\n },\n [selectItem],\n )\n\n return (\n <>\n <Surface\n className={`p-2 min-w-[20rem] flex flex-col gap-2 w-full ${\n hasCompletion ? '-mt-72' : ''\n }`}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div\n className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'\n style={{\n width: boundigClient?.width,\n }}\n >\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center '>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n style={{ resize: 'none' }}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none outline-none border-0 '\n value={inputValue}\n onChange={(e) => {\n editor.storage.aiCommand.userPrompt = e.target.value\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowUpCircle />\n </Toolbar.Button>\n </div>\n </>\n )}\n </>\n </Surface>\n {!isLoading && (\n <Surface\n ref={scrollContainer}\n className='text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-2'\n >\n <div className='grid grid-cols-1 gap-0.5'>\n {hasCompletion ? (\n <AISelectorCommands\n editor={editor}\n messages={object}\n onSelect={(value, options) => {\n if (options?.option === 'translate') {\n submit({ prompt: value, body: options })\n } else {\n submit({ prompt: value, body: { ...options, source: code } })\n }\n }}\n />\n ) : (\n items.map((group, groupIndex: number) => (\n <React.Fragment key={`${group.title}-wrapper`}>\n <div\n className='text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-4 font-semibold tracking-wider select-none uppercase first:mt-0.5'\n key={`${group.title}`}\n >\n {group.title}\n </div>\n {group.commands.map((command: Command, commandIndex: number) => (\n <DropdownButton\n key={`${command.label}`}\n isActive={\n selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex\n }\n onClick={createCommandClickHandler(groupIndex, commandIndex)}\n >\n <Icon icon={command.icon} className='mr-1' />\n {command.label}\n </DropdownButton>\n ))}\n </React.Fragment>\n ))\n )}\n </div>\n </Surface>\n )}\n </>\n )\n },\n)\n"],"names":["ArrowUpCircle","Sparkles","React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","Markdown","TextareaAutosize","useLocale","experimental_useObject","useObject","i18next","TiptapSchema","AISelectorCommands","CrazySpinner","DropdownButton","Icon","ScrollArea","Surface","Toolbar","useExtractMarkdown","AICommandPanel","editor","onOpenChange","userPrompt","items","restProps","ref","inputValue","setInputValue","code","view","scrollContainer","activeItem","selectedGroupIndex","setSelectedGroupIndex","selectedCommandIndex","setSelectedCommandIndex","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","markdown","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","selection","storage","aiCommand","completion","selectItem","groupIndex","commandIndex","commands","action","onKeyDown","event","key","length","newCommandIndex","newGroupIndex","current","offsetTop","offsetHeight","scrollTop","createCommandClickHandler","className","style","width","div","dir","resize","value","onChange","e","target","placeholder","t","autoFocus","Button","onClick","messages","onSelect","options","source","map","group","Fragment","title","isActive","icon","label"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"sourcesContent":["'use client'\nimport { ArrowUpCircle, Sparkles } from 'lucide-react'\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\nimport Markdown from 'react-markdown'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { Editor } from '@tiptap/react'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport { Command, Group } from '../../../extensions/AICommand/types.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { DropdownButton } from '../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../ui/Icon.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport { useExtractMarkdown } from '../AIEditorPanel/markdown.hook.js'\n\nexport type AICommandPanelProps = {\n editor: Editor\n userPrompt?: string\n onOpenChange: (value: boolean) => void\n items: Group[]\n}\n\nexport const AICommandPanel = forwardRef(\n ({ editor, onOpenChange, userPrompt, items, ...restProps }: AICommandPanelProps, ref) => {\n const [inputValue, setInputValue] = useState(userPrompt ?? '')\n const { view } = editor\n const scrollContainer = useRef<HTMLDivElement>(null)\n const activeItem = useRef<HTMLButtonElement>(null)\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0)\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0)\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n\n const { markdown } = useExtractMarkdown(object)\n\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: '',\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n selection: object,\n },\n })\n setInputValue('')\n return\n }\n\n submit({\n prompt: '',\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n },\n })\n setInputValue('')\n }, [editor?.storage?.aiCommand?.language, inputValue, object, submit])\n\n useEffect(() => {\n if (userPrompt) setInputValue(userPrompt)\n }, [userPrompt])\n useEffect(() => {\n if (hasCompletion) {\n editor.storage.aiCommand.completion = object\n }\n }, [object, isLoading])\n\n useEffect(() => {\n setSelectedGroupIndex(0)\n setSelectedCommandIndex(0)\n }, [items])\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const command = items[groupIndex].commands[commandIndex]\n setInputValue(command.action(editor))\n },\n [items, editor],\n )\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === 'ArrowDown') {\n if (!items.length) {\n return false\n }\n\n const commands = items[selectedGroupIndex].commands\n\n let newCommandIndex = selectedCommandIndex + 1\n let newGroupIndex = selectedGroupIndex\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0\n newGroupIndex = selectedGroupIndex + 1\n }\n\n if (items.length - 1 < newGroupIndex) {\n newGroupIndex = 0\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'ArrowUp') {\n if (!items.length) {\n return false\n }\n\n let newCommandIndex = selectedCommandIndex - 1\n let newGroupIndex = selectedGroupIndex\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1\n newCommandIndex = items[newGroupIndex]?.commands.length - 1 || 0\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = items.length - 1\n newCommandIndex = items[newGroupIndex].commands.length - 1\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'Enter') {\n if (!items.length || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex)\n\n return true\n }\n\n return false\n },\n }))\n\n useEffect(() => {\n if (activeItem.current && scrollContainer.current) {\n const offsetTop = activeItem.current.offsetTop\n const offsetHeight = activeItem.current.offsetHeight\n\n scrollContainer.current.scrollTop = offsetTop - offsetHeight\n }\n }, [selectedCommandIndex, selectedGroupIndex])\n\n const createCommandClickHandler = useCallback(\n (groupIndex: number, commandIndex: number) => {\n return () => {\n selectItem(groupIndex, commandIndex)\n }\n },\n [selectItem],\n )\n\n return (\n <>\n <Surface\n className={`p-2 min-w-[20rem] flex flex-col gap-2 w-full ${\n hasCompletion ? '-mt-72' : ''\n }`}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div\n className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'\n style={{\n width: boundigClient?.width,\n }}\n >\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center '>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n style={{ resize: 'none' }}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none outline-none border-0 '\n value={inputValue}\n onChange={(e) => {\n editor.storage.aiCommand.userPrompt = e.target.value\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowUpCircle />\n </Toolbar.Button>\n </div>\n </>\n )}\n </>\n </Surface>\n {!isLoading && (\n <Surface\n ref={scrollContainer}\n className='text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-2'\n >\n <div className='grid grid-cols-1 gap-0.5'>\n {hasCompletion ? (\n <AISelectorCommands\n editor={editor}\n messages={object}\n onSelect={(value, options) => {\n if (options?.option === 'translate') {\n submit({ prompt: value, body: options })\n } else {\n submit({\n prompt: value,\n body: { ...options, source: editor?.storage?.aiCommand?.language },\n })\n }\n }}\n />\n ) : (\n items.map((group, groupIndex: number) => (\n <React.Fragment key={`${group.title}-wrapper`}>\n <div\n className='text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-4 font-semibold tracking-wider select-none uppercase first:mt-0.5'\n key={`${group.title}`}\n >\n {group.title}\n </div>\n {group.commands.map((command: Command, commandIndex: number) => (\n <DropdownButton\n key={`${command.label}`}\n isActive={\n selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex\n }\n onClick={createCommandClickHandler(groupIndex, commandIndex)}\n >\n <Icon icon={command.icon} className='mr-1' />\n {command.label}\n </DropdownButton>\n ))}\n </React.Fragment>\n ))\n )}\n </div>\n </Surface>\n )}\n </>\n )\n },\n)\n"],"names":["ArrowUpCircle","Sparkles","React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","Markdown","TextareaAutosize","experimental_useObject","useObject","i18next","TiptapSchema","AISelectorCommands","CrazySpinner","DropdownButton","Icon","ScrollArea","Surface","Toolbar","useExtractMarkdown","AICommandPanel","editor","onOpenChange","userPrompt","items","restProps","ref","inputValue","setInputValue","view","scrollContainer","activeItem","selectedGroupIndex","setSelectedGroupIndex","selectedCommandIndex","setSelectedCommandIndex","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","markdown","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","storage","aiCommand","selection","completion","selectItem","groupIndex","commandIndex","commands","action","onKeyDown","event","key","length","newCommandIndex","newGroupIndex","current","offsetTop","offsetHeight","scrollTop","createCommandClickHandler","className","style","width","div","dir","resize","value","onChange","e","target","placeholder","t","autoFocus","Button","onClick","messages","onSelect","options","source","map","group","Fragment","title","isActive","icon","label"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AIEditorPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAmBtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACvC,CAAA;AAED,eAAO,MAAM,aAAa,6BAA8B,kBAAkB,gCA8GzE,CAAA"}
1
+ {"version":3,"file":"AIEditorPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAmBtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACvC,CAAA;AAED,eAAO,MAAM,aAAa,6BAA8B,kBAAkB,gCAqHzE,CAAA"}
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useLocale } from '@payloadcms/ui/providers/Locale';
4
3
  import { ArrowRight, Sparkles } from 'lucide-react';
5
4
  import { useCallback, useRef, useState } from 'react';
6
5
  import TextareaAutosize from 'react-textarea-autosize';
@@ -18,7 +17,6 @@ import { ScrollArea } from '../../ui/scroll-area.js';
18
17
  import { useExtractMarkdown } from './markdown.hook.js';
19
18
  export const AIEditorPanel = ({ editor, onOpenChange })=>{
20
19
  const [inputValue, setInputValue] = useState('');
21
- const { code } = useLocale();
22
20
  const { view } = editor;
23
21
  const editorNode = view.dom;
24
22
  const boundigClient = editorNode.getBoundingClientRect();
@@ -35,7 +33,7 @@ export const AIEditorPanel = ({ editor, onOpenChange })=>{
35
33
  body: {
36
34
  option: 'zap',
37
35
  command: inputValue,
38
- language: code ?? 'en'
36
+ language: editor?.storage?.aiCommand?.language
39
37
  }
40
38
  });
41
39
  setInputValue('');
@@ -49,12 +47,12 @@ export const AIEditorPanel = ({ editor, onOpenChange })=>{
49
47
  body: {
50
48
  option: 'zap',
51
49
  command: inputValue,
52
- language: code ?? 'en'
50
+ language: editor?.storage?.aiCommand?.language
53
51
  }
54
52
  });
55
53
  setInputValue('');
56
54
  }, [
57
- code,
55
+ editor?.storage?.aiCommand?.language,
58
56
  inputValue,
59
57
  object,
60
58
  submit
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"sourcesContent":["'use client'\n\nimport { useLocale } from '@payloadcms/ui/providers/Locale'\nimport { Editor } from '@tiptap/react'\nimport { ArrowRight, Sparkles } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport Markdown from 'react-markdown'\nimport { extractMarkdown } from '../../../lib/extract.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AICompletionCommands from '../../menus/TextMenu/components/ai-completion-command.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { useExtractMarkdown } from './markdown.hook.js'\n\nexport type AIEditorPanelProps = {\n editor: Editor\n onOpenChange: (value: boolean) => void\n}\n\nexport const AIEditorPanel = ({ editor, onOpenChange }: AIEditorPanelProps) => {\n const [inputValue, setInputValue] = useState('')\n const { code } = useLocale()\n const { view } = editor\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: object,\n body: { option: 'zap', command: inputValue, language: code ?? 'en' },\n })\n setInputValue('')\n return\n }\n const text = getPrevText(editor, { chars: 5000 })\n\n submit({\n prompt: text,\n body: { option: 'zap', command: inputValue, language: code ?? 'en' },\n })\n setInputValue('')\n }, [code, inputValue, object, submit])\n\n const { markdown } = useExtractMarkdown(object)\n return (\n <Surface\n className={`p-2 min-w-[20rem] `}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea>\n <div className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </div>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center'>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none'\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowRight />\n </Toolbar.Button>\n </div>\n {hasCompletion ? (\n <AICompletionCommands\n editor={editor}\n onDiscard={() => {\n editor?.chain()?.focus()?.run()\n onOpenChange(false)\n }}\n completion={object}\n />\n ) : (\n <AISelectorCommands\n messages={object}\n editor={editor}\n onSelect={(value, options) => {\n submit({ prompt: value, body: options as any })\n }}\n />\n )}\n </>\n )}\n </>\n </Surface>\n )\n}\n"],"names":["useLocale","ArrowRight","Sparkles","useCallback","useRef","useState","TextareaAutosize","experimental_useObject","useObject","i18next","Markdown","TiptapSchema","getPrevText","AICompletionCommands","AISelectorCommands","Surface","Toolbar","CrazySpinner","ScrollArea","useExtractMarkdown","AIEditorPanel","editor","onOpenChange","inputValue","setInputValue","code","view","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","text","chars","markdown","className","style","width","div","dir","ref","value","onChange","e","target","placeholder","t","autoFocus","onKeyDown","key","Button","onClick","onDiscard","chain","focus","run","completion","messages","onSelect","options"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"sourcesContent":["'use client'\n\nimport { Editor } from '@tiptap/react'\nimport { ArrowRight, Sparkles } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport Markdown from 'react-markdown'\nimport { extractMarkdown } from '../../../lib/extract.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AICompletionCommands from '../../menus/TextMenu/components/ai-completion-command.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { useExtractMarkdown } from './markdown.hook.js'\n\nexport type AIEditorPanelProps = {\n editor: Editor\n onOpenChange: (value: boolean) => void\n}\n\nexport const AIEditorPanel = ({ editor, onOpenChange }: AIEditorPanelProps) => {\n const [inputValue, setInputValue] = useState('')\n const { view } = editor\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: object,\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n },\n })\n setInputValue('')\n return\n }\n const text = getPrevText(editor, { chars: 5000 })\n\n submit({\n prompt: text,\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n },\n })\n setInputValue('')\n }, [editor?.storage?.aiCommand?.language, inputValue, object, submit])\n\n const { markdown } = useExtractMarkdown(object)\n return (\n <Surface\n className={`p-2 min-w-[20rem] `}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea>\n <div className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </div>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center'>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none'\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowRight />\n </Toolbar.Button>\n </div>\n {hasCompletion ? (\n <AICompletionCommands\n editor={editor}\n onDiscard={() => {\n editor?.chain()?.focus()?.run()\n onOpenChange(false)\n }}\n completion={object}\n />\n ) : (\n <AISelectorCommands\n messages={object}\n editor={editor}\n onSelect={(value, options) => {\n submit({ prompt: value, body: options as any })\n }}\n />\n )}\n </>\n )}\n </>\n </Surface>\n )\n}\n"],"names":["ArrowRight","Sparkles","useCallback","useRef","useState","TextareaAutosize","experimental_useObject","useObject","i18next","Markdown","TiptapSchema","getPrevText","AICompletionCommands","AISelectorCommands","Surface","Toolbar","CrazySpinner","ScrollArea","useExtractMarkdown","AIEditorPanel","editor","onOpenChange","inputValue","setInputValue","view","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","storage","aiCommand","text","chars","markdown","className","style","width","div","dir","ref","value","onChange","e","target","placeholder","t","autoFocus","onKeyDown","key","Button","onClick","onDiscard","chain","focus","run","completion","messages","onSelect","options"],"mappings":"AAAA;;AAGA,SAASA,UAAU,EAAEC,QAAQ,QAAQ,eAAc;AACnD,SAASC,WAAW,EAAaC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAChE,OAAOC,sBAAsB,0BAAyB;AAEtD,SAASC,0BAA0BC,SAAS,QAAQ,gBAAe;AACnE,OAAOC,aAAa,UAAS;AAC7B,OAAOC,cAAc,iBAAgB;AAErC,SAASC,YAAY,QAAQ,+BAA8B;AAC3D,SAASC,WAAW,QAAQ,8BAA6B;AACzD,OAAOC,0BAA0B,2DAA0D;AAC3F,OAAOC,wBAAwB,0DAAyD;AACxF,SAASC,OAAO,QAAQ,sBAAqB;AAC7C,SAASC,OAAO,QAAQ,sBAAqB;AAC7C,OAAOC,kBAAkB,4BAA2B;AACpD,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,kBAAkB,QAAQ,qBAAoB;AAOvD,OAAO,MAAMC,gBAAgB,CAAC,EAAEC,MAAM,EAAEC,YAAY,EAAsB;IACxE,MAAM,CAACC,YAAYC,cAAc,GAAGnB,SAAS;IAC7C,MAAM,EAAEoB,IAAI,EAAE,GAAGJ;IAEjB,MAAMK,aAAaD,KAAKE,GAAG;IAC3B,MAAMC,gBAAgBF,WAAWG,qBAAqB;IACtD,MAAMC,WAAW1B,OAA4B;IAE7C,MAAM,EAAE2B,MAAM,EAAEC,MAAM,EAAEC,SAAS,EAAE,GAAGzB,UAAU;QAC9C0B,KAAK;QACLC,QAAQxB;IACV;IACA,MAAMyB,gBAAgBC,QAAQN;IAE9B,MAAMO,cAAcnC,YAAY;QAC9B,IAAI4B,QAAQ;YACVC,OAAO;gBACLO,QAAQR;gBACRS,MAAM;oBACJC,QAAQ;oBACRC,SAASnB;oBACToB,UAAUtB,QAAQuB,SAASC,WAAWF;gBACxC;YACF;YACAnB,cAAc;YACd;QACF;QACA,MAAMsB,OAAOlC,YAAYS,QAAQ;YAAE0B,OAAO;QAAK;QAE/Cf,OAAO;YACLO,QAAQO;YACRN,MAAM;gBACJC,QAAQ;gBACRC,SAASnB;gBACToB,UAAUtB,QAAQuB,SAASC,WAAWF;YACxC;QACF;QACAnB,cAAc;IAChB,GAAG;QAACH,QAAQuB,SAASC,WAAWF;QAAUpB;QAAYQ;QAAQC;KAAO;IAErE,MAAM,EAAEgB,QAAQ,EAAE,GAAG7B,mBAAmBY;IACxC,qBACE,KAAChB;QACCkC,WAAW,CAAC,kBAAkB,CAAC;QAC/BC,OAAO;YACLC,OAAOvB,eAAeuB;QACxB;kBAEA,cAAA;;gBACGH,0BACC,KAACI;oBAAIH,WAAU;8BACb,cAAA,KAAC/B;kCACC,cAAA,KAACkC;4BAAIH,WAAU;4BAA0BI,KAAK5C,QAAQ4C,GAAG;sCACvD,cAAA,KAAC3C;0CAAUsC;;;;;gBAMlBf,2BACC,MAACmB;oBAAIH,WAAU;;sCACb,KAAC/C;4BAAS+C,WAAU;;wBAA4B;sCAEhD,KAACG;4BAAIH,WAAU;sCACb,cAAA,KAAChC;;;;gBAKN,CAACgB,2BACA;;sCACE,MAACmB;4BAAIH,WAAU;;8CACb,KAAC/C;oCAAS+C,WAAU;;8CACpB,KAAC3C;oCACCgD,KAAKxB;oCACLmB,WAAU;oCACVM,OAAOhC;oCACPiC,UAAU,CAACC;wCACTjC,cAAciC,EAAEC,MAAM,CAACH,KAAK;oCAC9B;oCACAI,aACEvB,gBACI3B,QAAQmD,CAAC,CAAC,wBAAwB,mCAClCnD,QAAQmD,CAAC,CAAC,uBAAuB;oCAEvCC,SAAS;oCACTC,WAAW,CAACL;wCACV,IAAIA,EAAEM,GAAG,KAAK,SAASzB;oCACzB;;8CAEF,KAACtB,QAAQgD,MAAM;oCAACC,SAAS3B;8CACvB,cAAA,KAACrC;;;;wBAGJmC,8BACC,KAACvB;4BACCQ,QAAQA;4BACR6C,WAAW;gCACT7C,QAAQ8C,SAASC,SAASC;gCAC1B/C,aAAa;4BACf;4BACAgD,YAAYvC;2CAGd,KAACjB;4BACCyD,UAAUxC;4BACVV,QAAQA;4BACRmD,UAAU,CAACjB,OAAOkB;gCAChBzC,OAAO;oCAAEO,QAAQgB;oCAAOf,MAAMiC;gCAAe;4BAC/C;;;;;;;AAQhB,EAAC"}