analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 21.8 kB
Source Map (JSON)
{"version":3,"sources":["../src/components/RichEditor/RichEditorCore.tsx","../src/components/RichEditor/components/extensions.ts"],"sourcesContent":["import { EditorContent, useEditor } from '@tiptap/react';\nimport { createRichEditorExtensions } from './components/extensions';\nimport {\n normalizeLineBreaksInHtml,\n processLatexInHtml,\n} from './components/utils';\nimport 'katex/dist/katex.min.css';\nimport { TextBolderIcon } from '@phosphor-icons/react/dist/csr/TextB';\nimport { TextItalicIcon } from '@phosphor-icons/react/dist/csr/TextItalic';\nimport { TextUnderlineIcon } from '@phosphor-icons/react/dist/csr/TextUnderline';\nimport { TextStrikethroughIcon } from '@phosphor-icons/react/dist/csr/TextStrikethrough';\nimport { TextAlignLeftIcon } from '@phosphor-icons/react/dist/csr/TextAlignLeft';\nimport { TextAlignCenterIcon } from '@phosphor-icons/react/dist/csr/TextAlignCenter';\nimport { TextAlignRightIcon } from '@phosphor-icons/react/dist/csr/TextAlignRight';\nimport { TextAlignJustifyIcon } from '@phosphor-icons/react/dist/csr/TextAlignJustify';\nimport { LinkIcon } from '@phosphor-icons/react/dist/csr/Link';\nimport { ListBulletsIcon } from '@phosphor-icons/react/dist/csr/ListBullets';\nimport { ListNumbersIcon } from '@phosphor-icons/react/dist/csr/ListNumbers';\nimport { QuotesIcon } from '@phosphor-icons/react/dist/csr/Quotes';\nimport { MinusIcon } from '@phosphor-icons/react/dist/csr/Minus';\nimport { CodeIcon } from '@phosphor-icons/react/dist/csr/Code';\nimport { TextHOneIcon } from '@phosphor-icons/react/dist/csr/TextHOne';\nimport { TextHTwoIcon } from '@phosphor-icons/react/dist/csr/TextHTwo';\nimport { TextHThreeIcon } from '@phosphor-icons/react/dist/csr/TextHThree';\nimport { MathOperationsIcon } from '@phosphor-icons/react/dist/csr/MathOperations';\nimport { ImageIcon } from '@phosphor-icons/react/dist/csr/Image';\nimport { useState, useRef, useEffect, ReactNode } from 'react';\nimport { FormulaDialog } from './components/FormulaDialog';\nimport { ImageDialog } from './components/ImageDialog';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\n\ninterface ToolbarBtnProps {\n onClick: () => void;\n active?: boolean;\n title: string;\n children: ReactNode;\n}\n\nconst ToolbarBtn = ({ onClick, active, title, children }: ToolbarBtnProps) => (\n <Button\n type=\"button\"\n onClick={onClick}\n title={title}\n size=\"small\"\n className={`bg-transparent border-transparent h-7 w-7 p-0 flex items-center justify-center rounded hover:bg-background-100 ${\n active ? 'bg-background-200 text-primary-700' : 'text-text-700'\n }`}\n >\n {children}\n </Button>\n);\n\nconst Divider = () => <div className=\"w-px h-5 bg-border-200 mx-0.5\" />;\n\n/**\n * Prepares stored content for the TipTap parser. Line breaks are restored first\n * so that LaTeX spans are injected into already-structured markup.\n */\nconst prepareContent = (content?: string) =>\n processLatexInHtml(normalizeLineBreaksInHtml(content || ''));\n\ninterface RichEditorProps {\n readonly content?: string;\n readonly onChange?: (data: { json: object; html: string }) => void;\n readonly placeholder?: string;\n /**\n * Optional callback to generate LaTeX using AI\n * If provided, the AI generation feature will be enabled in the formula dialog\n * @param description - Natural language description of the formula\n * @returns Promise resolving to the LaTeX string\n */\n readonly onGenerateLatexWithAI?: (description: string) => Promise<string>;\n /**\n * Optional callback to upload an image file and get back its public URL.\n * If provided, the file upload tab is enabled in the image dialog; otherwise\n * images can still be inserted by URL.\n * @param file - The image file selected by the user\n * @returns Promise resolving to the public URL of the uploaded image\n */\n readonly onUploadImage?: (file: File) => Promise<string>;\n}\n\nexport function RichEditor({\n content,\n onChange,\n placeholder = 'Digite aqui...',\n onGenerateLatexWithAI,\n onUploadImage,\n}: RichEditorProps) {\n const [formulaOpen, setFormulaOpen] = useState(false);\n const [imageOpen, setImageOpen] = useState(false);\n const lastContentRef = useRef(content);\n\n const editor = useEditor({\n extensions: createRichEditorExtensions(placeholder),\n content: prepareContent(content),\n // External updates do not reach this callback: the sync effect below calls\n // setContent with `emitUpdate: false`.\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n lastContentRef.current = html;\n onChange?.({\n json: editor.getJSON(),\n html,\n });\n },\n editorProps: {\n attributes: {\n class:\n 'min-h-[120px] outline-none prose prose-sm max-w-none px-4 py-3 focus:outline-none',\n },\n },\n });\n\n // Update editor content when prop changes externally (e.g., from loadQuestion)\n useEffect(() => {\n if (editor && content !== undefined && content !== lastContentRef.current) {\n editor.commands.setContent(prepareContent(content), {\n emitUpdate: false,\n });\n lastContentRef.current = content;\n }\n }, [content, editor]);\n\n const insertFormula = (latex: string) => {\n if (!latex || !editor) return;\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'mathInline',\n attrs: { latex },\n })\n .run();\n setFormulaOpen(false);\n };\n\n const insertImage = (src: string, alt: string) => {\n if (!src || !editor) return;\n editor.chain().focus().setImage({ src, alt }).run();\n setImageOpen(false);\n };\n\n const setLink = () => {\n const url = globalThis.window.prompt('URL do link:');\n if (url === null || !editor) return;\n if (url === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n };\n\n if (!editor) return null;\n\n return (\n <div className=\"border border-border-200 rounded-xl overflow-hidden bg-background-0\">\n {/* Toolbar */}\n <div className=\"flex items-center gap-0.5 border-b border-border-200 bg-background-50 px-2 py-1.5 flex-wrap\">\n {/* Headings */}\n <ToolbarBtn\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n active={editor.isActive('heading', { level: 1 })}\n title=\"Título 1\"\n >\n <TextHOneIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n active={editor.isActive('heading', { level: 2 })}\n title=\"Título 2\"\n >\n <TextHTwoIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n active={editor.isActive('heading', { level: 3 })}\n title=\"Título 3\"\n >\n <TextHThreeIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Text formatting */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={editor.isActive('bold')}\n title=\"Negrito (Ctrl+B)\"\n >\n <TextBolderIcon size={16} weight=\"bold\" />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={editor.isActive('italic')}\n title=\"Itálico (Ctrl+I)\"\n >\n <TextItalicIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive('underline')}\n title=\"Sublinhado (Ctrl+U)\"\n >\n <TextUnderlineIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={editor.isActive('strike')}\n title=\"Tachado\"\n >\n <TextStrikethroughIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={editor.isActive('subscript')}\n title=\"Subscrito\"\n >\n <span className=\"text-xs font-medium\">\n X<sub className=\"text-[8px]\">2</sub>\n </span>\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={editor.isActive('superscript')}\n title=\"Sobrescrito\"\n >\n <span className=\"text-xs font-medium\">\n X<sup className=\"text-[8px]\">2</sup>\n </span>\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleCode().run()}\n active={editor.isActive('code')}\n title=\"Código inline\"\n >\n <CodeIcon size={16} />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Alignment */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n active={editor.isActive({ textAlign: 'left' })}\n title=\"Alinhar à esquerda\"\n >\n <TextAlignLeftIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n active={editor.isActive({ textAlign: 'center' })}\n title=\"Centralizar\"\n >\n <TextAlignCenterIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n active={editor.isActive({ textAlign: 'right' })}\n title=\"Alinhar à direita\"\n >\n <TextAlignRightIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n active={editor.isActive({ textAlign: 'justify' })}\n title=\"Justificar\"\n >\n <TextAlignJustifyIcon size={16} />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Lists */}\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={editor.isActive('bulletList')}\n title=\"Lista com marcadores\"\n >\n <ListBulletsIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={editor.isActive('orderedList')}\n title=\"Lista numerada\"\n >\n <ListNumbersIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={editor.isActive('blockquote')}\n title=\"Citação\"\n >\n <QuotesIcon size={16} />\n </ToolbarBtn>\n <ToolbarBtn\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n active={false}\n title=\"Linha horizontal\"\n >\n <MinusIcon size={16} />\n </ToolbarBtn>\n\n <Divider />\n\n {/* Link */}\n <ToolbarBtn\n onClick={setLink}\n active={editor.isActive('link')}\n title=\"Inserir link\"\n >\n <LinkIcon size={16} />\n </ToolbarBtn>\n\n {/* Image */}\n <ToolbarBtn\n onClick={() => setImageOpen(true)}\n active={editor.isActive('image')}\n title=\"Inserir imagem\"\n >\n <ImageIcon size={16} />\n </ToolbarBtn>\n\n {/* Formula */}\n <Button\n type=\"button\"\n onClick={() => setFormulaOpen(true)}\n title=\"Inserir fórmula LaTeX\"\n size=\"extra-small\"\n variant=\"link\"\n >\n <MathOperationsIcon size={16} />\n LaTeX\n </Button>\n </div>\n\n {/* Editor */}\n <EditorContent editor={editor} />\n\n {/* Dica */}\n <div className=\"border-t border-border-200 px-4 py-2 bg-background-50\">\n <Text size=\"xs\" color=\"text-text-400\">\n Dica: use{' '}\n <code className=\"bg-background-200 px-1 rounded\">$fórmula$</code> para\n inserir LaTeX inline diretamente.\n </Text>\n </div>\n\n <FormulaDialog\n open={formulaOpen}\n onClose={() => setFormulaOpen(false)}\n onInsert={insertFormula}\n onGenerateWithAI={onGenerateLatexWithAI}\n />\n\n <ImageDialog\n open={imageOpen}\n onClose={() => setImageOpen(false)}\n onInsert={insertImage}\n onUploadImage={onUploadImage}\n />\n </div>\n );\n}\n","import StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Color } from '@tiptap/extension-color';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport Highlight from '@tiptap/extension-highlight';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Image from '@tiptap/extension-image';\nimport { MathNode } from './MathNode';\n\n/**\n * Extension list backing the RichEditor.\n *\n * Tiptap validates incoming HTML against the schema these extensions build and\n * silently discards any node it cannot match. Anything the editor must be able\n * to *load* has to be registered here, not only what it can create — omitting\n * Image is what made `<img>` tags disappear from existing content.\n */\nexport function createRichEditorExtensions(placeholder: string) {\n return [\n StarterKit,\n Underline,\n TextStyle,\n Color,\n Highlight.configure({ multicolor: true }),\n Subscript,\n Superscript,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Link.configure({ openOnClick: false }),\n Placeholder.configure({ placeholder }),\n Image.configure({ inline: false, allowBase64: false }),\n MathNode,\n ];\n}\n"],"mappings":"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","names":["editor"]}