rte-react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -0
- package/dist/editor-XH5ZEVLH.css +288 -0
- package/dist/index.d.mts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +604 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +567 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/RichEditor.tsx","../src/hooks/useEditor.ts","../src/extensions/FontSize.ts","../src/components/Toolbar.tsx","../src/components/toolbar/ToolbarButton.tsx","../src/components/toolbar/tools.ts"],"sourcesContent":["import React from 'react';\nimport { EditorContent } from '@tiptap/react';\nimport { RichEditorProps, ToolbarTool } from '../types';\nimport { useEditor } from '../hooks/useEditor';\nimport Toolbar from './Toolbar';\nimport '../styles/editor.css';\n\nconst DEFAULT_TOOLBAR: ToolbarTool[] = [\n 'bold', 'italic', 'underline', 'strikethrough', 'divider',\n 'heading1', 'heading2', 'heading3', 'divider',\n 'bulletList', 'orderedList', 'blockquote', 'codeBlock', 'divider',\n 'link', 'image', 'table', 'divider',\n 'undo', 'redo',\n];\n\nconst RichEditor: React.FC<RichEditorProps> = ({\n value = '',\n onChange,\n toolbar = DEFAULT_TOOLBAR,\n placeholder = 'Start typing...',\n editable = true,\n className,\n style,\n toolbarClassName,\n contentClassName,\n}) => {\n const editor = useEditor({ value, onChange, placeholder, editable, toolbar });\n\n if (!editor) return null;\n\n return (\n <div\n className={['rre-editor', className].filter(Boolean).join(' ')}\n style={style}\n >\n {editable && (\n <Toolbar editor={editor} toolbar={toolbar} className={toolbarClassName} />\n )}\n <EditorContent\n editor={editor}\n className={['rre-content', contentClassName].filter(Boolean).join(' ')}\n />\n </div>\n );\n};\n\nexport default RichEditor;\n","import { useEffect } from 'react';\nimport { useEditor as useTiptapEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Link from '@tiptap/extension-link';\nimport Image from '@tiptap/extension-image';\nimport Table from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport FontSize from '../extensions/FontSize';\nimport { ToolbarTool } from '../types';\n\ninterface UseEditorOptions {\n value?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n editable?: boolean;\n toolbar?: ToolbarTool[];\n}\n\nexport const useEditor = ({\n value = '',\n onChange,\n placeholder = 'Start typing...',\n editable = true,\n}: UseEditorOptions) => {\n const editor = useTiptapEditor({\n extensions: [\n StarterKit,\n Underline,\n TextStyle,\n FontSize,\n Link.configure({ openOnClick: false }),\n Image,\n Table.configure({ resizable: true }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({ placeholder }),\n ],\n content: value,\n editable,\n onUpdate({ editor }) {\n onChange?.(editor.getHTML());\n },\n });\n\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value, false);\n }\n }, [value, editor]);\n\n useEffect(() => {\n if (editor) {\n editor.setEditable(editable ?? true);\n }\n }, [editable, editor]);\n\n return editor;\n};","import { Extension } from '@tiptap/core';\nimport '@tiptap/extension-text-style';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nconst FontSize = Extension.create({\n name: 'fontSize',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) => element.style.fontSize || null,\n renderHTML: (attributes) => {\n if (!attributes.fontSize) return {};\n return { style: `font-size: ${attributes.fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize }).run();\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n\nexport default FontSize;","import React, { useState, useRef, useEffect } from 'react';\nimport { Editor } from '@tiptap/react';\nimport { ToolbarTool } from '../types';\nimport ToolbarButton from './toolbar/ToolbarButton';\nimport { getToolDefinition } from './toolbar/tools';\n\nconst FONT_SIZES = ['12', '14', '16', '18', '20', '24', '28', '32', '36', '48'];\nconst MAX_IMAGE_SIZE = 10 * 1024 * 1024; // 10MB\n\ninterface ToolbarProps {\n editor: Editor;\n toolbar: ToolbarTool[];\n className?: string;\n}\n\ntype PopupType = 'link' | 'table' | null;\n\nconst Toolbar: React.FC<ToolbarProps> = ({ editor, toolbar, className }) => {\n const [popup, setPopup] = useState<PopupType>(null);\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [tableRows, setTableRows] = useState('3');\n const [tableCols, setTableCols] = useState('3');\n const popupRef = useRef<HTMLDivElement>(null);\n const imageInputRef = useRef<HTMLInputElement>(null);\n\n const hasSelection = !editor.state.selection.empty;\n const currentFontSize = editor.getAttributes('textStyle').fontSize?.replace('px', '') || '16';\n\n // Close popup when clicking outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (popupRef.current && !popupRef.current.contains(e.target as Node)) {\n setPopup(null);\n }\n };\n if (popup) document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [popup]);\n\n const handleFontSize = (size: string) => {\n editor.chain().focus().setFontSize(`${size}px`).run();\n };\n\n const handleLinkOpen = () => {\n setLinkUrl(editor.getAttributes('link').href || '');\n setLinkText('');\n setPopup(popup === 'link' ? null : 'link');\n };\n\n const handleLinkSave = () => {\n if (!linkUrl) return;\n if (hasSelection) {\n editor.chain().focus().setLink({ href: linkUrl }).run();\n } else {\n if (!linkText) return;\n editor\n .chain()\n .focus()\n .insertContent(`<a href=\"${linkUrl}\">${linkText}</a>`)\n .run();\n }\n setLinkUrl('');\n setLinkText('');\n setPopup(null);\n };\n\n const handleLinkKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') handleLinkSave();\n if (e.key === 'Escape') setPopup(null);\n };\n\n const handleImageClick = () => {\n imageInputRef.current?.click();\n };\n\n const handleImageChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n if (file.size > MAX_IMAGE_SIZE) {\n alert('Image is too large. Maximum size is 10MB.');\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const base64 = reader.result as string;\n editor.chain().focus().setImage({ src: base64 }).run();\n };\n reader.readAsDataURL(file);\n // Reset input so same file can be picked again\n e.target.value = '';\n };\n\n const handleTableOpen = () => {\n setPopup(popup === 'table' ? null : 'table');\n };\n\n const handleTableInsert = () => {\n const rows = Math.min(10, Math.max(1, parseInt(tableRows) || 3));\n const cols = Math.min(10, Math.max(1, parseInt(tableCols) || 3));\n editor.chain().focus().insertTable({ rows, cols, withHeaderRow: true }).run();\n setPopup(null);\n };\n\n const handleTableKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') handleTableInsert();\n if (e.key === 'Escape') setPopup(null);\n };\n\n const handleTool = (tool: ToolbarTool) => {\n switch (tool) {\n case 'bold': editor.chain().focus().toggleBold().run(); break;\n case 'italic': editor.chain().focus().toggleItalic().run(); break;\n case 'underline': editor.chain().focus().toggleUnderline().run(); break;\n case 'strikethrough': editor.chain().focus().toggleStrike().run(); break;\n case 'heading1': editor.chain().focus().toggleHeading({ level: 1 }).run(); break;\n case 'heading2': editor.chain().focus().toggleHeading({ level: 2 }).run(); break;\n case 'heading3': editor.chain().focus().toggleHeading({ level: 3 }).run(); break;\n case 'heading4': editor.chain().focus().toggleHeading({ level: 4 }).run(); break;\n case 'heading5': editor.chain().focus().toggleHeading({ level: 5 }).run(); break;\n case 'heading6': editor.chain().focus().toggleHeading({ level: 6 }).run(); break;\n case 'bulletList': editor.chain().focus().toggleBulletList().run(); break;\n case 'orderedList': editor.chain().focus().toggleOrderedList().run(); break;\n case 'blockquote': editor.chain().focus().toggleBlockquote().run(); break;\n case 'codeBlock': editor.chain().focus().toggleCodeBlock().run(); break;\n case 'undo': editor.chain().focus().undo().run(); break;\n case 'redo': editor.chain().focus().redo().run(); break;\n }\n };\n\n const isActive = (tool: ToolbarTool): boolean => {\n switch (tool) {\n case 'bold': return editor.isActive('bold');\n case 'italic': return editor.isActive('italic');\n case 'underline': return editor.isActive('underline');\n case 'strikethrough': return editor.isActive('strike');\n case 'heading1': return editor.isActive('heading', { level: 1 });\n case 'heading2': return editor.isActive('heading', { level: 2 });\n case 'heading3': return editor.isActive('heading', { level: 3 });\n case 'heading4': return editor.isActive('heading', { level: 4 });\n case 'heading5': return editor.isActive('heading', { level: 5 });\n case 'heading6': return editor.isActive('heading', { level: 6 });\n case 'bulletList': return editor.isActive('bulletList');\n case 'orderedList': return editor.isActive('orderedList');\n case 'blockquote': return editor.isActive('blockquote');\n case 'codeBlock': return editor.isActive('codeBlock');\n case 'link': return editor.isActive('link');\n default: return false;\n }\n };\n\n const isDisabled = (tool: ToolbarTool): boolean => {\n if (tool === 'undo') return !editor.can().undo();\n if (tool === 'redo') return !editor.can().redo();\n return false;\n };\n\n const renderPopup = (tool: ToolbarTool) => {\n if (tool === 'link' && popup === 'link') {\n return (\n <div className=\"rre-popup\" ref={popupRef}>\n <input\n className=\"rre-popup-input\"\n type=\"url\"\n placeholder=\"https://example.com\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={handleLinkKeyDown}\n autoFocus\n />\n {!hasSelection && (\n <input\n className=\"rre-popup-input\"\n type=\"text\"\n placeholder=\"Display text\"\n value={linkText}\n onChange={(e) => setLinkText(e.target.value)}\n onKeyDown={handleLinkKeyDown}\n />\n )}\n <button\n className=\"rre-popup-btn\"\n onMouseDown={(e) => { e.preventDefault(); handleLinkSave(); }}\n >\n Save\n </button>\n </div>\n );\n }\n\n if (tool === 'table' && popup === 'table') {\n return (\n <div className=\"rre-popup rre-popup--table\" ref={popupRef}>\n <input\n className=\"rre-popup-input rre-popup-input--num\"\n type=\"number\"\n min=\"1\"\n max=\"10\"\n value={tableRows}\n onChange={(e) => setTableRows(e.target.value)}\n onKeyDown={handleTableKeyDown}\n autoFocus\n />\n <span className=\"rre-popup-x\">×</span>\n <input\n className=\"rre-popup-input rre-popup-input--num\"\n type=\"number\"\n min=\"1\"\n max=\"10\"\n value={tableCols}\n onChange={(e) => setTableCols(e.target.value)}\n onKeyDown={handleTableKeyDown}\n />\n <button\n className=\"rre-popup-btn\"\n onMouseDown={(e) => { e.preventDefault(); handleTableInsert(); }}\n >\n Insert\n </button>\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <div className={['rre-toolbar', className].filter(Boolean).join(' ')} role=\"toolbar\">\n {/* Hidden file input for image */}\n <input\n ref={imageInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={handleImageChange}\n />\n\n {toolbar.map((tool, i) => {\n if (tool === 'divider') {\n return <div key={`divider-${i}`} className=\"rre-toolbar-divider\" aria-hidden=\"true\" />;\n }\n\n if (tool === 'fontSize') {\n return (\n <select\n key=\"fontSize\"\n className=\"rre-fontsize-select\"\n value={currentFontSize}\n onChange={(e) => handleFontSize(e.target.value)}\n title=\"Font size\"\n >\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>{size}px</option>\n ))}\n </select>\n );\n }\n\n if (tool === 'link') {\n const def = getToolDefinition(tool);\n if (!def) return null;\n return (\n <div key=\"link\" className=\"rre-toolbar-popup-wrapper\" onMouseDown={(e) => e.stopPropagation()}> \n <ToolbarButton\n onClick={handleLinkOpen}\n isActive={editor.isActive('link') || popup === 'link'}\n title={def.title}\n >\n <span className=\"rre-icon\" dangerouslySetInnerHTML={{ __html: def.icon }} />\n </ToolbarButton>\n {renderPopup('link')}\n </div>\n );\n }\n\n if (tool === 'image') {\n const def = getToolDefinition(tool);\n if (!def) return null;\n return (\n <ToolbarButton\n key=\"image\"\n onClick={handleImageClick}\n title={def.title}\n >\n <span className=\"rre-icon\" dangerouslySetInnerHTML={{ __html: def.icon }} />\n </ToolbarButton>\n );\n }\n\n if (tool === 'table') {\n const def = getToolDefinition(tool);\n if (!def) return null;\n return (\n<div key=\"table\" className=\"rre-toolbar-popup-wrapper\" onMouseDown={(e) => e.stopPropagation()}>\n <ToolbarButton\n onClick={handleTableOpen}\n isActive={popup === 'table'}\n title={def.title}\n >\n <span className=\"rre-icon\" dangerouslySetInnerHTML={{ __html: def.icon }} />\n </ToolbarButton>\n {renderPopup('table')}\n </div>\n );\n }\n\n const def = getToolDefinition(tool);\n if (!def) return null;\n return (\n <ToolbarButton\n key={tool}\n onClick={() => handleTool(tool)}\n isActive={isActive(tool)}\n disabled={isDisabled(tool)}\n title={def.title}\n >\n <span className=\"rre-icon\" dangerouslySetInnerHTML={{ __html: def.icon }} />\n </ToolbarButton>\n );\n })}\n </div>\n );\n};\n\nexport default Toolbar;","import React from 'react';\nimport { ToolbarButtonProps } from '../../types';\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n onClick,\n isActive = false,\n disabled = false,\n title,\n children,\n}) => {\n return (\n <button\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n onClick();\n }}\n disabled={disabled}\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n className={[\n 'rre-toolbar-btn',\n isActive ? 'rre-toolbar-btn--active' : '',\n disabled ? 'rre-toolbar-btn--disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </button>\n );\n};\n\nexport default ToolbarButton;\n","import { ToolDefinition } from '../../types';\n\nexport const toolDefinitions: ToolDefinition[] = [\n { name: 'bold', title: 'Bold', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/></svg>' },\n { name: 'italic', title: 'Italic', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"/><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"/><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"/></svg>' },\n { name: 'underline', title: 'Underline', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\"/><line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"/></svg>' },\n { name: 'strikethrough', title: 'Strikethrough', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 6.5 3.9h.1\"/><path d=\"M21.8 12H2.2\"/><path d=\"M6.7 19.1c2.3.6 4.4 1 6.2.9 2.7 0 5.3-.7 5.3-3.6 0-1.5-1.8-3.3-6.5-3.9H11\"/></svg>' },\n { name: 'heading1', title: 'Heading 1', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"m17 12 3-2v8\"/></svg>' },\n { name: 'heading2', title: 'Heading 2', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1\"/></svg>' },\n { name: 'heading3', title: 'Heading 3', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2\"/><path d=\"M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2\"/></svg>' },\n { name: 'heading4', title: 'Heading 4', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"M17 10v4h4\"/><path d=\"M21 10v8\"/></svg>' },\n { name: 'heading5', title: 'Heading 5', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"M17 10h3\"/><path d=\"M17 14h2a2 2 0 0 1 0 4h-2v-4z\"/><path d=\"M17 10v4\"/></svg>' },\n { name: 'heading6', title: 'Heading 6', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><circle cx=\"19\" cy=\"16\" r=\"2\"/><path d=\"M20 10c-2 2-3 3.5-3 6\"/></svg>' },\n { name: 'bulletList', title: 'Bullet List', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/></svg>' },\n { name: 'orderedList', title: 'Ordered List', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/><path d=\"M4 6h1v4\"/><path d=\"M4 10h2\"/><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\"/></svg>' },\n { name: 'blockquote', title: 'Blockquote', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z\"/><path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\"/></svg>' },\n { name: 'codeBlock', title: 'Code Block', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>' },\n { name: 'link', title: 'Link', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>' },\n { name: 'image', title: 'Image', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>' },\n { name: 'table', title: 'Table', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/></svg>' },\n { name: 'undo', title: 'Undo', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\"/></svg>' },\n { name: 'redo', title: 'Redo', icon: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M21 7v6h-6\"/><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13\"/></svg>' },\n];\n\nexport const getToolDefinition = (name: string): ToolDefinition | undefined =>\n toolDefinitions.find((t) => t.name === name);\n"],"mappings":"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","names":["editor","useEffect","jsx","useEffect","_a","def","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rte-react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A lightweight, fully-typed React rich text editor with a configurable toolbar. Outputs HTML. Works with React 17+.",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./styles": "./dist/styles/editor.css"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"dev": "tsup --watch",
|
|
22
|
+
"test": "jest",
|
|
23
|
+
"prepublishOnly": "npm run build"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"react",
|
|
27
|
+
"rich-text-editor",
|
|
28
|
+
"tiptap",
|
|
29
|
+
"wysiwyg",
|
|
30
|
+
"editor",
|
|
31
|
+
"typescript"
|
|
32
|
+
],
|
|
33
|
+
"author": "",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"react": ">=17",
|
|
37
|
+
"react-dom": ">=17"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@tiptap/core": "^2.4.0",
|
|
41
|
+
"@tiptap/extension-image": "^2.4.0",
|
|
42
|
+
"@tiptap/extension-link": "^2.4.0",
|
|
43
|
+
"@tiptap/extension-placeholder": "^2.4.0",
|
|
44
|
+
"@tiptap/extension-table": "^2.4.0",
|
|
45
|
+
"@tiptap/extension-table-cell": "^2.4.0",
|
|
46
|
+
"@tiptap/extension-table-header": "^2.4.0",
|
|
47
|
+
"@tiptap/extension-table-row": "^2.4.0",
|
|
48
|
+
"@tiptap/extension-text-style": "^2.4.0",
|
|
49
|
+
"@tiptap/extension-underline": "^2.4.0",
|
|
50
|
+
"@tiptap/react": "^2.4.0",
|
|
51
|
+
"@tiptap/starter-kit": "^2.4.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
55
|
+
"@testing-library/react": "^14.0.0",
|
|
56
|
+
"@types/react": "^18.0.0",
|
|
57
|
+
"@types/react-dom": "^18.0.0",
|
|
58
|
+
"jest": "^29.0.0",
|
|
59
|
+
"jest-environment-jsdom": "^29.0.0",
|
|
60
|
+
"ts-jest": "^29.0.0",
|
|
61
|
+
"tsup": "^8.0.0",
|
|
62
|
+
"typescript": "^5.0.0"
|
|
63
|
+
}
|
|
64
|
+
}
|