tiptap-editor-custom-stg 1.0.13 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,6 +1,12 @@
1
1
  import React from 'react';
2
- import * as _tiptap_extension_table_row from '@tiptap/extension-table-row';
2
+ import * as _tiptap_extension_table from '@tiptap/extension-table';
3
+ import * as _tiptap_extensions from '@tiptap/extensions';
4
+ import * as _tiptap_extension_text_align from '@tiptap/extension-text-align';
5
+ import * as _tiptap_extension_text_style from '@tiptap/extension-text-style';
6
+ import * as _tiptap_extension_image from '@tiptap/extension-image';
3
7
  import * as _tiptap_extension_underline from '@tiptap/extension-underline';
8
+ import * as _tiptap_extension_link from '@tiptap/extension-link';
9
+ import * as _tiptap_starter_kit from '@tiptap/starter-kit';
4
10
  import * as _tiptap_core from '@tiptap/core';
5
11
  import { Extension } from '@tiptap/core';
6
12
 
@@ -31,7 +37,7 @@ interface TiptapEditorProps {
31
37
 
32
38
  declare const TiptapEditor: React.FC<TiptapEditorProps>;
33
39
 
34
- declare const createTiptapExtensions: (placeholder?: string) => (_tiptap_core.Extension<any, any> | _tiptap_core.Mark<_tiptap_extension_underline.UnderlineOptions, any> | _tiptap_core.Node<_tiptap_extension_table_row.TableRowOptions, any>)[];
40
+ declare const createTiptapExtensions: (placeholder?: string) => (_tiptap_core.Extension<any, any> | _tiptap_core.Extension<_tiptap_starter_kit.StarterKitOptions, any> | _tiptap_core.Mark<_tiptap_extension_link.LinkOptions, any> | _tiptap_core.Mark<_tiptap_extension_underline.UnderlineOptions, any> | _tiptap_core.Node<_tiptap_extension_image.ImageOptions, any> | _tiptap_core.Mark<_tiptap_extension_text_style.TextStyleOptions, any> | _tiptap_core.Extension<_tiptap_extension_text_style.FontFamilyOptions, any> | _tiptap_core.Extension<_tiptap_extension_text_align.TextAlignOptions, any> | _tiptap_core.Extension<_tiptap_extensions.PlaceholderOptions, any> | _tiptap_core.Node<_tiptap_extension_table.TableOptions, any> | _tiptap_core.Node<_tiptap_extension_table.TableRowOptions, any>)[];
35
41
 
36
42
  declare module '@tiptap/core' {
37
43
  interface Commands<ReturnType> {
package/dist/index.d.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  import React from 'react';
2
- import * as _tiptap_extension_table_row from '@tiptap/extension-table-row';
2
+ import * as _tiptap_extension_table from '@tiptap/extension-table';
3
+ import * as _tiptap_extensions from '@tiptap/extensions';
4
+ import * as _tiptap_extension_text_align from '@tiptap/extension-text-align';
5
+ import * as _tiptap_extension_text_style from '@tiptap/extension-text-style';
6
+ import * as _tiptap_extension_image from '@tiptap/extension-image';
3
7
  import * as _tiptap_extension_underline from '@tiptap/extension-underline';
8
+ import * as _tiptap_extension_link from '@tiptap/extension-link';
9
+ import * as _tiptap_starter_kit from '@tiptap/starter-kit';
4
10
  import * as _tiptap_core from '@tiptap/core';
5
11
  import { Extension } from '@tiptap/core';
6
12
 
@@ -31,7 +37,7 @@ interface TiptapEditorProps {
31
37
 
32
38
  declare const TiptapEditor: React.FC<TiptapEditorProps>;
33
39
 
34
- declare const createTiptapExtensions: (placeholder?: string) => (_tiptap_core.Extension<any, any> | _tiptap_core.Mark<_tiptap_extension_underline.UnderlineOptions, any> | _tiptap_core.Node<_tiptap_extension_table_row.TableRowOptions, any>)[];
40
+ declare const createTiptapExtensions: (placeholder?: string) => (_tiptap_core.Extension<any, any> | _tiptap_core.Extension<_tiptap_starter_kit.StarterKitOptions, any> | _tiptap_core.Mark<_tiptap_extension_link.LinkOptions, any> | _tiptap_core.Mark<_tiptap_extension_underline.UnderlineOptions, any> | _tiptap_core.Node<_tiptap_extension_image.ImageOptions, any> | _tiptap_core.Mark<_tiptap_extension_text_style.TextStyleOptions, any> | _tiptap_core.Extension<_tiptap_extension_text_style.FontFamilyOptions, any> | _tiptap_core.Extension<_tiptap_extension_text_align.TextAlignOptions, any> | _tiptap_core.Extension<_tiptap_extensions.PlaceholderOptions, any> | _tiptap_core.Node<_tiptap_extension_table.TableOptions, any> | _tiptap_core.Node<_tiptap_extension_table.TableRowOptions, any>)[];
35
41
 
36
42
  declare module '@tiptap/core' {
37
43
  interface Commands<ReturnType> {
package/dist/index.js CHANGED
@@ -1111,7 +1111,7 @@ var TiptapEditor = ({
1111
1111
  if (!initializedRef.current) {
1112
1112
  initializedRef.current = true;
1113
1113
  if (content && content !== editor.getHTML()) {
1114
- editor.commands.setContent(content || "", false);
1114
+ editor.commands.setContent(content || "", { emitUpdate: false });
1115
1115
  lastEmittedContentRef.current = content;
1116
1116
  }
1117
1117
  return;
@@ -1126,7 +1126,7 @@ var TiptapEditor = ({
1126
1126
  return;
1127
1127
  }
1128
1128
  if (content !== editor.getHTML()) {
1129
- editor.commands.setContent(content || "", false);
1129
+ editor.commands.setContent(content || "", { emitUpdate: false });
1130
1130
  lastEmittedContentRef.current = content || "";
1131
1131
  }
1132
1132
  }, [content, editor]);
@@ -1137,7 +1137,7 @@ var TiptapEditor = ({
1137
1137
  (0, import_react2.useEffect)(() => {
1138
1138
  if (!editor || !onRegisterReset) return;
1139
1139
  const handleReset = (newContent) => {
1140
- editor.commands.setContent(newContent || "", false);
1140
+ editor.commands.setContent(newContent || "", { emitUpdate: false });
1141
1141
  };
1142
1142
  const unregister = onRegisterReset(handleReset);
1143
1143
  return () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/TiptapEditor.tsx","../src/extensions.ts","../src/fontSize.ts","../src/backgroundColor.ts","../src/utils.ts","../src/constants.ts","../src/ToolbarGroups.tsx","../src/Icons.tsx"],"sourcesContent":["// Main component\nexport { default as TiptapEditor } from './TiptapEditor';\n\n// Types\nexport type { TiptapEditorProps } from './types';\n\n// Extensions (for advanced users who want to customize)\nexport { createTiptapExtensions } from './extensions';\nexport { FontSize } from './fontSize';\nexport { BackgroundColor } from './backgroundColor';\n\n// Constants (for consumers who want to extend)\nexport { TIPTAP_COLORS, FONT_FAMILIES, FONT_SIZES, IMAGE_MIME_TYPES } from './constants';\n","import React, { useRef, useCallback, useEffect } from 'react';\nimport { useEditor, EditorContent, type Editor } from '@tiptap/react';\n\nimport { TiptapEditorProps, ToolbarGroup } from './types';\nimport { createTiptapExtensions } from './extensions';\nimport { uploadFileToCOS } from './utils';\nimport { IMAGE_MIME_TYPES } from './constants';\nimport {\n HistoryGroup,\n HeadingGroup,\n FontSizeGroup,\n FontGroup,\n TextColorGroup,\n HighlightGroup,\n ListGroup,\n InlineGroup,\n LinkGroup,\n // FormatGroup,\n AlignmentGroup,\n TableGroup,\n InsertGroup,\n} from './ToolbarGroups';\n\nconst MEANINGFUL_NODE_SELECTOR = 'img, table, a[href], iframe, video, audio, object, embed, hr';\n\nconst normalizeInvisibleText = (text: string) =>\n text\n .replace(/\\u00a0/g, ' ')\n .replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n .trim();\n\nconst isEmptyRichTextHtml = (html: string): boolean => {\n const raw = (html || '').trim();\n if (!raw) return true;\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n const text = raw\n .replace(/<br\\s*\\/?>/gi, '')\n .replace(/<\\/?[^>]+>/g, '')\n .replace(/&nbsp;/gi, ' ');\n return normalizeInvisibleText(text) === '';\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(raw, 'text/html');\n const text = normalizeInvisibleText(doc.body.textContent || '');\n if (text) return false;\n\n return !doc.body.querySelector(MEANINGFUL_NODE_SELECTOR);\n};\n\nconst getNormalizedEditorHtml = (editor: Editor): string => {\n const html = editor.getHTML();\n return isEmptyRichTextHtml(html) ? '' : html;\n};\n\nconst TiptapEditor: React.FC<TiptapEditorProps> = ({\n elementId,\n content,\n editMode,\n docNum,\n receiveData,\n receiveStatus,\n onUploadFile,\n onAlert,\n onLoadingChange,\n onRegisterReset,\n placeholder = 'Enter content here...',\n toolbarConfig,\n customValidationFn\n}) => {\n // Use provided functions or fallback to defaults\n const alertFn = onAlert || ((msg: string) => window.alert(msg));\n const loadingChangeFn = onLoadingChange || (() => {});\n const isReadOnly = !editMode;\n const containerRef = useRef<HTMLDivElement>(null);\n const imageInputRef = useRef<HTMLInputElement>(null);\n const attachInputRef = useRef<HTMLInputElement>(null);\n const [showHighlightMenu, setShowHighlightMenu] = React.useState(false);\n const [showTextColorMenu, setShowTextColorMenu] = React.useState(false);\n const [showFontMenu, setShowFontMenu] = React.useState(false);\n const [showFontSizeMenu, setShowFontSizeMenu] = React.useState(false);\n const [showHeadingMenu, setShowHeadingMenu] = React.useState(false);\n const [showLinkMenu, setShowLinkMenu] = React.useState(false);\n const [showTableMenu, setShowTableMenu] = React.useState(false);\n const [tableHoverSize, setTableHoverSize] = React.useState({ rows: 0, cols: 0 });\n const [linkUrl, setLinkUrl] = React.useState('');\n\n // Track whether the editor content has been initialised (uncontrolled after init)\n const initializedRef = useRef(false);\n // Track the last HTML emitted to prevent state update loops from resetting the cursor\n const lastEmittedContentRef = useRef(content || '');\n // Timestamp of the last local update to ignore immediate 'echo' props from parent\n const lastUpdateTimestampRef = useRef(0);\n // Track the number of active uploads to prevent onUpdate from prematurely clearing loading\n const activeUploadsRef = useRef(0);\n\n const closeAllMenus = React.useCallback(() => {\n setShowHighlightMenu(false);\n setShowTextColorMenu(false);\n setShowFontMenu(false);\n setShowFontSizeMenu(false);\n setShowHeadingMenu(false);\n setShowLinkMenu(false);\n setShowTableMenu(false);\n }, []);\n\n // Handle clicking outside the editor to close menus\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n closeAllMenus();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [closeAllMenus]);\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: createTiptapExtensions(placeholder),\n content: content || '',\n editable: editMode,\n onFocus: () => {\n closeAllMenus();\n },\n onSelectionUpdate: () => {\n closeAllMenus();\n },\n editorProps: {\n // Handle clipboard paste - support pasting images (e.g. screenshots)\n handlePaste: (view, event) => {\n if (!editMode) return false;\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n\n // Check for image files in clipboard (screenshot paste)\n const items = Array.from(clipboardData.items);\n const imageItems = items.filter((item) => item.kind === 'file' && IMAGE_MIME_TYPES.includes(item.type));\n\n if (imageItems.length > 0) {\n event.preventDefault();\n\n if (!onUploadFile) {\n alertFn('Upload function not provided');\n return true;\n }\n\n // Mark batch upload as active to prevent onUpdate from clearing loading\n activeUploadsRef.current += 1;\n // Start global loading\n loadingChangeFn(true);\n\n Promise.all(\n imageItems.map((item) => {\n const file = item.getAsFile();\n if (!file) return Promise.resolve();\n\n // Upload pasted image with global event suppressed\n return uploadFileToCOS(\n file,\n docNum,\n onUploadFile,\n receiveStatus,\n elementId,\n loadingChangeFn,\n true\n )\n .then((url) => {\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({ src: url, alt: file.name })\n )\n );\n })\n .catch((err: Error) => {\n alertFn(err.message || 'Image upload failed');\n });\n })\n ).finally(() => {\n activeUploadsRef.current -= 1;\n // End global loading\n loadingChangeFn(false);\n // Now that all uploads are done, push the final content to the parent\n if (activeUploadsRef.current === 0) {\n if (editor) {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n });\n return true;\n }\n return false;\n },\n },\n onUpdate: ({ editor }) => {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n lastUpdateTimestampRef.current = Date.now();\n // Skip receiveData during active uploads to prevent parent from clearing loading state\n if (activeUploadsRef.current === 0) {\n receiveData && receiveData(elementId, html);\n }\n },\n });\n\n // Sync external content changes into editor (read-only mode or form reset)\n useEffect(() => {\n if (!editor) return;\n\n if (!initializedRef.current) {\n // First initialisation - set content without emitting an update event\n initializedRef.current = true;\n if (content && content !== editor.getHTML()) {\n editor.commands.setContent(content || '', false);\n lastEmittedContentRef.current = content;\n }\n return;\n }\n\n // Subsequent external updates:\n // 1. If we just did a local update, ignore the incoming 'echo' for 150ms\n if (Date.now() - lastUpdateTimestampRef.current < 150) {\n return;\n }\n\n // 2. IMPORTANT: If the editor is currently focused, do NOT overwrite its content.\n // The local user is the source of truth. Content syncing from external props\n // should only happen when the editor is idle/blurred (e.g. form reset, external load).\n if (editor.isFocused) {\n return;\n }\n\n // Abort if the incoming content is just the echo of what we just emitted!\n if (content === lastEmittedContentRef.current) {\n return;\n }\n\n // Only update if it's genuinely a new external change\n if (content !== editor.getHTML()) {\n editor.commands.setContent(content || '', false);\n lastEmittedContentRef.current = content || '';\n }\n }, [content, editor]);\n\n // Sync editMode changes\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(editMode);\n }, [editMode, editor]);\n\n // Register reset callback with parent (if provided)\n useEffect(() => {\n if (!editor || !onRegisterReset) return;\n const handleReset = (newContent: string) => {\n editor.commands.setContent(newContent || '', false);\n };\n const unregister = onRegisterReset(handleReset);\n return () => {\n unregister && unregister();\n };\n }, [editor, onRegisterReset]);\n\n // ---- Image upload handler ----\n const handleImageFileChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0 || !editor) return;\n // Reset input so the same file can be selected again\n e.target.value = '';\n\n if (!onUploadFile) {\n alertFn('Upload function not provided');\n return;\n }\n // validate files\n if (customValidationFn) {\n const validateResult = await customValidationFn(files);\n if (!validateResult) {\n return;\n }\n }\n\n // Mark batch upload as active to prevent onUpdate from clearing loading\n activeUploadsRef.current += 1;\n // Start global loading\n loadingChangeFn(true);\n try {\n const uploadResults = await Promise.all(\n files.map(async (file) => {\n const url = await uploadFileToCOS(\n file,\n docNum,\n onUploadFile,\n receiveStatus,\n elementId,\n loadingChangeFn,\n true\n );\n return { url, name: file.name };\n })\n );\n editor.chain().focus().run(); // focus\n const imagesHtml = uploadResults.map(res => \n `<img src=\"${res.url}\" alt=\"${res.name}\" />`\n ).join('<br/>');\n editor.chain().insertContent(imagesHtml).run();\n } catch (err: any) {\n alertFn(err.message || 'Image upload failed');\n } finally {\n activeUploadsRef.current -= 1;\n // End global loading\n loadingChangeFn(false);\n // Now that all uploads are done, push the final content to the parent\n if (activeUploadsRef.current === 0) {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]\n );\n\n // ---- Attachment (non-image file) upload handler ----\n const handleAttachFileChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0 || !editor) return;\n // Reset input so the same file can be selected again\n e.target.value = '';\n\n if (!onUploadFile) {\n alertFn('Upload function not provided');\n return;\n }\n // validate files\n if (customValidationFn) {\n const validateResult = await customValidationFn(files);\n if (!validateResult) {\n return;\n }\n }\n\n // Mark batch upload as active to prevent onUpdate from clearing loading\n activeUploadsRef.current += 1;\n // Start global loading\n loadingChangeFn(true);\n try {\n const uploadResults = await await Promise.all(\n files.map(async (file) => {\n const url = await uploadFileToCOS(\n file,\n docNum,\n onUploadFile,\n receiveStatus,\n elementId,\n loadingChangeFn,\n true\n );\n return { url, name: file.name };\n })\n );\n // Insert a hyperlink styled as an attachment with a marker attribute for CSS styling\n const attachmentsHtml = uploadResults.map(res => \n `<a href=\"${res.url}\" target=\"_blank\" rel=\"noopener noreferrer\" data-attachment=\"true\">${res.name}</a>`\n ).join('<br/>');\n editor.chain().focus().insertContent(attachmentsHtml).run();\n } catch (err: any) {\n alertFn(err.message || 'Attachment upload failed');\n } finally {\n activeUploadsRef.current -= 1;\n // End global loading\n loadingChangeFn(false);\n // Now that all uploads are done, push the final content to the parent\n if (activeUploadsRef.current === 0) {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]\n );\n\n // ---- Link set/unset handler ----\n const handleLinkClick = useCallback(() => {\n if (!editor || isReadOnly) return;\n const nextState = !showLinkMenu;\n closeAllMenus();\n\n if (nextState) {\n // Find existing link href if active\n const previousUrl = editor.getAttributes('link').href;\n setLinkUrl(previousUrl || '');\n }\n\n setShowLinkMenu(nextState);\n }, [editor, isReadOnly, showLinkMenu, closeAllMenus]);\n\n const submitLink = useCallback(() => {\n if (!editor) return;\n if (linkUrl === null || linkUrl.trim() === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n } else {\n const formattedUrl = /^https?:\\/\\//.test(linkUrl) ? linkUrl : `https://${linkUrl}`;\n const { from, to } = editor.state.selection;\n const hasSelection = from !== to;\n \n if (hasSelection) {\n // If text is selected, apply link to selection\n editor.chain().focus().extendMarkRange('link').setLink({ href: formattedUrl }).run();\n } else {\n // If no text is selected, insert the link URL as text with link\n editor.chain().focus().insertContent(`<a href=\"${formattedUrl}\">${linkUrl}</a>`).run();\n }\n }\n setShowLinkMenu(false);\n }, [editor, linkUrl]);\n\n if (!editor) return null;\n\n // ---- Render Helpers for Readability ----\n const getHiddenInputs = () => (\n <>\n <input\n ref={imageInputRef}\n type='file'\n accept='image/*'\n multiple\n className='tiptap-hidden-input'\n onChange={handleImageFileChange}\n />\n <input\n ref={attachInputRef}\n type='file'\n accept='*/*'\n multiple\n className='tiptap-hidden-input'\n onChange={handleAttachFileChange}\n />\n </>\n );\n\n // Default toolbar groups if none specified\n const defaultGroups: ToolbarGroup[] = [\n 'history',\n 'heading',\n 'font',\n 'fontSize',\n 'textColor',\n 'highlight',\n 'list',\n 'alignment',\n 'table',\n 'inline',\n 'link',\n 'insert',\n ];\n\n // Get configured groups or use defaults\n const toolbarGroups = toolbarConfig?.groups || defaultGroups;\n\n // Determine if dividers should be shown\n const showDividers = toolbarConfig?.showDividers !== undefined ? toolbarConfig.showDividers : true;\n\n const getToolbar = () => {\n // Create a map of toolbar components for easy lookup\n const toolbarComponents: Record<ToolbarGroup, JSX.Element> = {\n history: (<HistoryGroup editor={editor} isReadOnly={isReadOnly} />),\n heading: (<HeadingGroup \n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showHeadingMenu}\n onToggle={() => {\n const nextState = !showHeadingMenu;\n closeAllMenus();\n setShowHeadingMenu(nextState);\n }}\n onClose={() => setShowHeadingMenu(false)}\n />),\n font: (\n <FontGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showFontMenu}\n onToggle={() => {\n const nextState = !showFontMenu;\n closeAllMenus();\n setShowFontMenu(nextState);\n }}\n onClose={() => setShowFontMenu(false)}\n />\n ),\n fontSize: (\n <FontSizeGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showFontSizeMenu}\n onToggle={() => {\n const nextState = !showFontSizeMenu;\n closeAllMenus();\n setShowFontSizeMenu(nextState);\n }}\n onClose={() => setShowFontSizeMenu(false)}\n />\n ),\n textColor: (\n <TextColorGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showTextColorMenu}\n onToggle={() => {\n const nextState = !showTextColorMenu;\n closeAllMenus();\n setShowTextColorMenu(nextState);\n }}\n onClose={() => setShowTextColorMenu(false)}\n />\n ),\n highlight: (\n <HighlightGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showHighlightMenu}\n onToggle={() => {\n const nextState = !showHighlightMenu;\n closeAllMenus();\n setShowHighlightMenu(nextState);\n }}\n onClose={() => setShowHighlightMenu(false)}\n />\n ),\n list: <ListGroup editor={editor} isReadOnly={isReadOnly} />,\n alignment: <AlignmentGroup editor={editor} isReadOnly={isReadOnly} />,\n table: (\n <TableGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showTableMenu}\n onToggle={() => !isReadOnly && setShowTableMenu(!showTableMenu)}\n onClose={() => setShowTableMenu(false)}\n tableHoverSize={tableHoverSize}\n onGridHover={(rows, cols) => setTableHoverSize({ rows, cols })}\n />\n ),\n inline: <InlineGroup editor={editor} isReadOnly={isReadOnly} />,\n link: (\n <LinkGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showLinkMenu}\n onToggle={handleLinkClick}\n onClose={() => setShowLinkMenu(false)}\n linkUrl={linkUrl}\n onLinkUrlChange={setLinkUrl}\n onSubmit={submitLink}\n />\n ),\n insert: (\n <InsertGroup\n editor={editor}\n isReadOnly={isReadOnly}\n onImageClick={() => !isReadOnly && imageInputRef.current?.click()}\n onAttachClick={() => !isReadOnly && attachInputRef.current?.click()}\n />\n ),\n };\n\n // Build toolbar items based on configured groups\n const toolbarItems = toolbarGroups\n .map((group, index) => {\n const component = toolbarComponents[group];\n if (!component) return null;\n\n // Add divider if needed (except before the first item)\n const divider = showDividers && index > 0 ? <span className='toolbar-divider' /> : null;\n\n return (\n <React.Fragment key={group}>\n {divider}\n {component}\n </React.Fragment>\n );\n })\n .filter(Boolean); // Remove any null items\n\n return (\n <div\n className={`tiptap-toolbar${isReadOnly ? ' toolbar-disabled' : ''}`}\n role='toolbar'\n aria-label='Editor toolbar'\n >\n {toolbarItems}\n </div>\n );\n };\n\n return (\n <div id={elementId} className={`tiptap-editor-wrapper${isReadOnly ? ' read-only' : ''}`} ref={containerRef}>\n {getHiddenInputs()}\n {getToolbar()}\n {/* Editor content area */}\n <div onMouseDown={closeAllMenus}>\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n};\n\nexport default TiptapEditor;\n","import StarterKit from '@tiptap/starter-kit';\nimport Image from '@tiptap/extension-image';\nimport Link from '@tiptap/extension-link';\nimport Underline from '@tiptap/extension-underline';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport FontFamily from '@tiptap/extension-font-family';\nimport { Color } from '@tiptap/extension-color';\nimport Superscript from '@tiptap/extension-superscript';\nimport Subscript from '@tiptap/extension-subscript';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { Table } from '@tiptap/extension-table';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport TableHeader from '@tiptap/extension-table-header';\nimport { TableCell } from '@tiptap/extension-table-cell';\nimport { FontSize } from './fontSize';\nimport { BackgroundColor } from './backgroundColor';\n\nexport const createTiptapExtensions = (placeholder = 'Enter content here...') => [\n StarterKit.configure({\n heading: { levels: [1, 2, 3, 4, 5, 6] },\n }),\n Link.configure({\n openOnClick: false,\n autolink: true,\n HTMLAttributes: { rel: 'noopener noreferrer' },\n }),\n Underline,\n Image.configure({ inline: false, allowBase64: true }),\n TextStyle,\n FontSize,\n BackgroundColor,\n FontFamily,\n Color,\n Superscript,\n Subscript,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Placeholder.configure({ placeholder }),\n Table.configure({\n resizable: true,\n HTMLAttributes: {\n class: 'tiptap-table',\n },\n }),\n TableRow,\n TableHeader,\n TableCell,\n];\n","import { Extension } from '@tiptap/core';\nimport '@tiptap/extension-text-style';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fontSize: {\n /**\n * Set the font size\n */\n setFontSize: (size: string) => ReturnType;\n /**\n * Unset the font size\n */\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const 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.replace(/['\"]+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize) =>\n ({ chain }) => {\n // Map keyword sizes to actual CSS values for compatibility\n const mapping: Record<string, string> = {\n 'tiny': '0.7em',\n 'small': '0.85em',\n 'big': '1.4em',\n 'huge': '1.8em',\n };\n \n const value = mapping[fontSize] || fontSize;\n return chain().setMark('textStyle', { fontSize: value }).run();\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","import { Extension } from '@tiptap/core';\nimport '@tiptap/extension-text-style';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n backgroundColor: {\n /**\n * Set the background color\n */\n setBackgroundColor: (color: string) => ReturnType;\n /**\n * Unset the background color\n */\n unsetBackgroundColor: () => ReturnType;\n };\n }\n}\n\nexport const BackgroundColor = Extension.create({\n name: 'backgroundColor',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n backgroundColor: {\n default: null,\n parseHTML: (element) => element.style.backgroundColor.replace(/['\"]+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setBackgroundColor:\n (backgroundColor) =>\n ({ chain }) => {\n return chain().setMark('textStyle', { backgroundColor }).run();\n },\n unsetBackgroundColor:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { backgroundColor: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","/**\n * Upload a file and return the public URL.\n * Notifies the parent component of upload status changes.\n */\nexport async function uploadFileToCOS(\n file: File,\n docNum: string,\n onUploadFile: (file: File, docNum: string) => Promise<string>,\n receiveStatus?: (id: string, uploading: boolean) => void,\n elementId?: string,\n onLoadingChange?: (isLoading: boolean) => void,\n suppressStatusChange: boolean = false\n): Promise<string> {\n // Notify parent that upload has started\n receiveStatus && elementId && receiveStatus(elementId, true);\n if (!suppressStatusChange) onLoadingChange?.(true);\n\n try {\n const url = await onUploadFile(file, docNum);\n if (!url) throw new Error('Upload failed: no URL returned');\n return url;\n } finally {\n // Notify parent that upload has finished (success or failure)\n if (!suppressStatusChange) onLoadingChange?.(false);\n receiveStatus && elementId && receiveStatus(elementId, false);\n }\n}\n","// Tiptap Editor Constants and Configuration\n\nexport const TIPTAP_COLORS = [\n '#000000', '#4d4d4d', '#999999', '#e6e6e6', '#ffffff',\n '#e64d3d', '#eb9120', '#f3da35', '#7ed822', '#00d924',\n '#1abc9c', '#32dada', '#3498db', '#2980b9', '#a290e4'\n];\n\nexport const FONT_FAMILIES = [\n { label: 'Default', value: '' },\n { label: 'Arial', value: 'Arial' },\n { label: 'Courier New', value: 'Courier New' },\n { label: 'Georgia', value: 'Georgia' },\n { label: 'Lucida Sans Unicode', value: 'Lucida Sans Unicode' },\n { label: 'Tahoma', value: 'Tahoma' },\n { label: 'Times New Roman', value: 'Times New Roman' },\n { label: 'Trebuchet MS', value: 'Trebuchet MS' },\n { label: 'Verdana', value: 'Verdana' },\n];\n\nexport const FONT_SIZES = [\n { label: 'Tiny', value: 'tiny' },\n { label: 'Small', value: 'small' },\n { label: 'Default', value: '' },\n { label: 'Big', value: 'big' },\n { label: 'Huge', value: 'huge' },\n];\n\nexport const IMAGE_MIME_TYPES = [\n 'image/png', \n 'image/jpeg', \n 'image/jpg', \n 'image/gif', \n 'image/webp', \n 'image/bmp'\n];\n","import React from 'react';\nimport { Editor } from '@tiptap/react';\nimport {\n UndoIcon,\n RedoIcon,\n BulletListIcon,\n OrderedListIcon,\n BlockquoteIcon,\n BoldIcon,\n ItalicIcon,\n StrikeIcon,\n UnderlineIcon,\n CodeIcon,\n HighlightIcon,\n LinkIcon,\n ImageIcon,\n AlignLeftIcon,\n AlignCenterIcon,\n AlignRightIcon,\n TableIcon,\n AddRowBeforeIcon,\n AddRowAfterIcon,\n DeleteRowIcon,\n AddColBeforeIcon,\n AddColAfterIcon,\n DeleteColIcon,\n MergeCellsIcon,\n SplitCellIcon,\n DeleteTableIcon,\n ClearIcon,\n SubmitIcon,\n AttachIcon,\n SuperscriptIcon,\n SubscriptIcon,\n HeadingIcon,\n FontSizeIcon,\n FontFamilyIcon,\n TextColorIcon,\n EraserIcon\n} from './Icons';\nimport { FONT_FAMILIES, FONT_SIZES, TIPTAP_COLORS } from './constants';\n\ninterface GroupProps {\n editor: Editor;\n isReadOnly: boolean;\n}\n\ninterface DropdownGroupProps extends GroupProps {\n showMenu: boolean;\n onToggle: () => void;\n onClose: () => void;\n}\n\nexport const HistoryGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly || !editor.can().undo()}\n aria-label=\"Undo\"\n >\n <UndoIcon />\n </button>\n <button\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly || !editor.can().redo()}\n aria-label=\"Redo\"\n >\n <RedoIcon />\n </button>\n </>\n);\n\nexport const HeadingGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Heading\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Heading selection\"\n >\n <HeadingIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-heading-menu\">\n <button\n className={`heading-option ${!editor.isActive('heading') ? 'is-active' : ''}`}\n onClick={() => {\n editor.chain().focus().setParagraph().run();\n onClose();\n }}\n >\n Paragraph\n </button>\n {[1, 2, 3, 4, 5, 6].map((level) => (\n <button\n key={level}\n className={`heading-option h${level} ${editor.isActive('heading', { level }) ? 'is-active' : ''}`}\n onClick={() => {\n editor.chain().focus().toggleHeading({ level: level as any }).run();\n onClose();\n }}\n >\n Heading {level}\n </button>\n ))}\n </div>\n )}\n </div>\n);\n\nexport const FontGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Font family\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Font family selection\"\n >\n <FontFamilyIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-font-menu\">\n {FONT_FAMILIES.map((font) => {\n const isActive = editor.getAttributes('textStyle').fontFamily === font.value;\n return (\n <button\n key={font.label}\n className={`font-option ${isActive ? 'is-active' : ''}`}\n style={{ fontFamily: font.value || 'inherit' }}\n onClick={() => {\n if (font.value) {\n editor.chain().focus().setFontFamily(font.value).run();\n } else {\n editor.chain().focus().unsetFontFamily().run();\n }\n onClose();\n }}\n >\n {font.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n);\n\nexport const FontSizeGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Font size\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Font size selection\"\n >\n <FontSizeIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-font-menu\">\n {FONT_SIZES.map((size) => {\n const currentSize = editor.getAttributes('textStyle').fontSize;\n const mapping: Record<string, string> = {\n 'tiny': '0.7em',\n 'small': '0.85em',\n 'big': '1.4em',\n 'huge': '1.8em',\n };\n const targetValue = mapping[size.value] || size.value || null;\n const isActive = (!currentSize && !size.value) || currentSize === targetValue;\n\n return (\n <button\n key={size.label}\n className={`font-option ${isActive ? 'is-active' : ''}`}\n onClick={() => {\n if (size.value) {\n editor.chain().focus().setFontSize(size.value).run();\n } else {\n editor.chain().focus().unsetFontSize().run();\n }\n onClose();\n }}\n >\n {size.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n);\n\nexport const TextColorGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Text color\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Text color picker\"\n >\n <TextColorIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-color-picker\">\n <button\n className=\"color-remove-btn\"\n onClick={() => {\n editor.chain().focus().unsetColor().run();\n onClose();\n }}\n >\n <EraserIcon /> Remove color\n </button>\n <div className=\"color-grid\">\n {TIPTAP_COLORS.map((color) => (\n <button\n key={color}\n className={`color-swatch ${editor.isActive('textStyle', { color }) ? 'is-active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => {\n editor.chain().focus().setColor(color).run();\n onClose();\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\nexport const HighlightGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Highlight\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Background color picker\"\n >\n <HighlightIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-color-picker\">\n <button\n className=\"color-remove-btn\"\n onClick={() => {\n editor.chain().focus().unsetBackgroundColor().run();\n onClose();\n }}\n >\n <EraserIcon /> Remove color\n </button>\n <div className=\"color-grid\">\n {TIPTAP_COLORS.map((color) => (\n <button\n key={color}\n className={`color-swatch ${editor.isActive('textStyle', { backgroundColor: color }) ? 'is-active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => {\n editor.chain().focus().setBackgroundColor(color).run();\n onClose();\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\nexport const ListGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Bulleted list\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('bulletList') ? 'is-active' : ''}\n aria-label=\"Bulleted list\"\n >\n <BulletListIcon />\n </button>\n <button\n title=\"Ordered list\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('orderedList') ? 'is-active' : ''}\n aria-label=\"Ordered list\"\n >\n <OrderedListIcon />\n </button>\n <button\n title=\"Blockquote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('blockquote') ? 'is-active' : ''}\n aria-label=\"Blockquote\"\n >\n <BlockquoteIcon />\n </button>\n </>\n);\n\nexport const InlineGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('bold') ? 'is-active' : ''}\n aria-label=\"Bold\"\n >\n <BoldIcon />\n </button>\n <button\n title=\"Italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('italic') ? 'is-active' : ''}\n aria-label=\"Italic\"\n >\n <ItalicIcon />\n </button>\n <button\n title=\"Strikethrough\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('strike') ? 'is-active' : ''}\n aria-label=\"Strikethrough\"\n >\n <StrikeIcon />\n </button>\n <button\n title=\"Underline\"\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('underline') ? 'is-active' : ''}\n aria-label=\"Underline\"\n >\n <UnderlineIcon />\n </button>\n <button\n title=\"Code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('code') ? 'is-active' : ''}\n aria-label=\"Inline code\"\n >\n <CodeIcon />\n </button>\n </>\n);\n\ntype LinkMenuPlacement = 'center' | 'start' | 'end';\n\nconst getLinkMenuPlacement = (triggerEl: HTMLDivElement | null): LinkMenuPlacement => {\n if (!triggerEl || typeof document === 'undefined') return 'center';\n\n const boundaryEl = triggerEl.closest('.tiptap-editor-wrapper') as HTMLElement | null;\n const boundaryRect = boundaryEl?.getBoundingClientRect() || document.documentElement.getBoundingClientRect();\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuWidth = 300;\n const edgePadding = 8;\n const centeredLeft = triggerRect.left + triggerRect.width / 2 - menuWidth / 2;\n const centeredRight = centeredLeft + menuWidth;\n\n if (centeredLeft < boundaryRect.left + edgePadding) return 'start';\n if (centeredRight > boundaryRect.right - edgePadding) return 'end';\n return 'center';\n};\n\nexport const LinkGroup: React.FC<DropdownGroupProps & {\n linkUrl: string;\n onLinkUrlChange: (url: string) => void;\n onSubmit: () => void;\n}> = ({ editor, isReadOnly, showMenu, onToggle, onClose, linkUrl, onLinkUrlChange, onSubmit }) => {\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const [menuPlacement, setMenuPlacement] = React.useState<LinkMenuPlacement>('center');\n\n React.useEffect(() => {\n if (!showMenu || isReadOnly) return;\n\n const updatePlacement = () => {\n setMenuPlacement(getLinkMenuPlacement(triggerRef.current));\n };\n\n updatePlacement();\n window.addEventListener('resize', updatePlacement);\n return () => window.removeEventListener('resize', updatePlacement);\n }, [showMenu, isReadOnly]);\n\n return (\n <div ref={triggerRef} style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Insert link\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('link') ? 'is-active' : ''}\n aria-label=\"Insert link\"\n >\n <LinkIcon />\n </button>\n {showMenu && !isReadOnly && (\n <div className={`tiptap-link-menu align-${menuPlacement}`}>\n <input\n type=\"url\"\n placeholder=\"Paste a link...\"\n value={linkUrl}\n onChange={(e) => onLinkUrlChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSubmit();\n if (e.key === 'Escape') onClose();\n }}\n autoFocus\n />\n <button onClick={onSubmit} title=\"Apply\" className=\"link-submit-btn\">\n <SubmitIcon />\n </button>\n <button\n onClick={() => {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n onClose();\n }}\n title=\"Unlink\"\n className=\"link-clear-btn\"\n >\n <ClearIcon />\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport const FormatGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Superscript\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('superscript') ? 'is-active' : ''}\n aria-label=\"Superscript\"\n >\n <SuperscriptIcon />\n </button>\n <button\n title=\"Subscript\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('subscript') ? 'is-active' : ''}\n aria-label=\"Subscript\"\n >\n <SubscriptIcon />\n </button>\n </>\n);\n\nexport const AlignmentGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Align left\"\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive({ textAlign: 'left' }) ? 'is-active' : ''}\n aria-label=\"Align left\"\n >\n <AlignLeftIcon />\n </button>\n <button\n title=\"Align center\"\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive({ textAlign: 'center' }) ? 'is-active' : ''}\n aria-label=\"Align center\"\n >\n <AlignCenterIcon />\n </button>\n <button\n title=\"Align right\"\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive({ textAlign: 'right' }) ? 'is-active' : ''}\n aria-label=\"Align right\"\n >\n <AlignRightIcon />\n </button>\n </>\n);\n\nexport const TableGroup: React.FC<DropdownGroupProps & {\n tableHoverSize: { rows: number; cols: number };\n onGridHover: (rows: number, cols: number) => void;\n}> = ({ editor, isReadOnly, showMenu, onToggle, onClose, tableHoverSize, onGridHover }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Table\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${editor.isActive('table') ? 'is-active' : ''}`}\n aria-label=\"Table options\"\n >\n <TableIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-table-menu\">\n {!editor.isActive('table') ? (\n <div\n className=\"table-grid-picker-wrapper\"\n onMouseLeave={() => onGridHover(0, 0)}\n >\n <div className=\"table-grid-picker\">\n {[...Array(10)].map((_, r) => (\n <div key={r} className=\"grid-row\">\n {[...Array(10)].map((_, c) => (\n <div\n key={c}\n className={`grid-cell ${(r + 1 <= tableHoverSize.rows && c + 1 <= tableHoverSize.cols) ? 'is-active' : ''}`}\n onMouseEnter={() => onGridHover(r + 1, c + 1)}\n onClick={() => {\n editor.chain().focus().insertTable({ rows: r + 1, cols: c + 1, withHeaderRow: true }).run();\n onClose();\n onGridHover(0, 0);\n }}\n />\n ))}\n </div>\n ))}\n </div>\n <div className=\"table-grid-label\">\n {tableHoverSize.rows > 0 ? `${tableHoverSize.rows} x ${tableHoverSize.cols}` : 'Square Grid'}\n </div>\n </div>\n ) : (\n <div className=\"table-menu-grid\">\n <button onClick={() => editor.chain().focus().addColumnBefore().run()} title=\"Add column before\"><AddColBeforeIcon /></button>\n <button onClick={() => editor.chain().focus().addColumnAfter().run()} title=\"Add column after\"><AddColAfterIcon /></button>\n <button onClick={() => editor.chain().focus().deleteColumn().run()} title=\"Delete column\"><DeleteColIcon /></button>\n\n <button onClick={() => editor.chain().focus().addRowBefore().run()} title=\"Add row before\"><AddRowBeforeIcon /></button>\n <button onClick={() => editor.chain().focus().addRowAfter().run()} title=\"Add row after\"><AddRowAfterIcon /></button>\n <button onClick={() => editor.chain().focus().deleteRow().run()} title=\"Delete row\"><DeleteRowIcon /></button>\n\n <button onClick={() => editor.chain().focus().mergeCells().run()} title=\"Merge cells\"><MergeCellsIcon /></button>\n <button onClick={() => editor.chain().focus().splitCell().run()} title=\"Split cell\"><SplitCellIcon /></button>\n\n <button onClick={() => {\n editor.chain().focus().deleteTable().run();\n onClose();\n }} className=\"danger\" title=\"Delete table\"><DeleteTableIcon /></button>\n </div>\n )}\n </div>\n )}\n </div>\n);\n\nexport const InsertGroup: React.FC<GroupProps & {\n onImageClick: () => void;\n onAttachClick: () => void;\n}> = ({ isReadOnly, onImageClick, onAttachClick }) => (\n <>\n <button\n title=\"Insert image\"\n onClick={onImageClick}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n aria-label=\"Insert image\"\n >\n <ImageIcon />\n </button>\n <button\n title=\"Attach file\"\n onClick={onAttachClick}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n aria-label=\"Attach file\"\n >\n <AttachIcon />\n </button>\n </>\n);\n","import React from 'react';\n\n/* ---- Official Tiptap (Lucide) SVG icons ---- */\n\nconst LucideSvg = ({ children }: { children: React.ReactNode }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n {children}\n </svg>\n);\n\nexport const UndoIcon = () => <LucideSvg><path d=\"M3 7v6h6\" /><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\" /></LucideSvg>;\nexport const RedoIcon = () => <LucideSvg><path d=\"M21 7v6h-6\" /><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\" /></LucideSvg>;\nexport const BulletListIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const OrderedListIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const BlockquoteIcon = () => <LucideSvg><path d=\"M17 6H3\" /><path d=\"M21 12H8\" /><path d=\"M21 18H8\" /><path d=\"M3 12v6\" /></LucideSvg>;\nexport const BoldIcon = () => <LucideSvg><path d=\"M14 12a4 4 0 0 0 0-8H6v8\" /><path d=\"M15 20a4 4 0 0 0 0-8H6v8Z\" /></LucideSvg>;\nexport const ItalicIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const StrikeIcon = () => <LucideSvg><path d=\"M16 4H9a3 3 0 0 0-2.83 4\" /><path d=\"M14 12a4 4 0 0 1 0 8H6\" /><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" /></LucideSvg>;\nexport const UnderlineIcon = () => <LucideSvg><path d=\"M6 4v6a6 6 0 0 0 12 0V4\" /><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" /></LucideSvg>;\nexport const CodeIcon = () => <LucideSvg><polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" /></LucideSvg>;\nexport const HighlightIcon = () => <LucideSvg><path d=\"m9 11-6 6v3h9l3-3\" /><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\" /></LucideSvg>;\nexport const LinkIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const ImageIcon = () => <LucideSvg><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" /><circle cx=\"9\" cy=\"9\" r=\"2\" /><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" /></LucideSvg>;\nexport const AlignLeftIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\" /><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\" /></LucideSvg>;\nexport const AlignCenterIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"21\" y1=\"12\" x2=\"3\" y2=\"12\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" /><line x1=\"17\" y1=\"12\" x2=\"7\" y2=\"12\" /></LucideSvg>;\nexport const AlignRightIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" /><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" /></LucideSvg>;\nexport const AlignJustifyIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"21\" y1=\"12\" x2=\"3\" y2=\"12\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /></LucideSvg>;\nexport const TableIcon = () => <LucideSvg><path d=\"M3 3h18v18H3z\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /><path d=\"M15 3v18\" /></LucideSvg>;\nexport const AddRowBeforeIcon = () => <LucideSvg><path d=\"M3 13v5a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /><path d=\"M3 9h18\" /><path d=\"M12 2v8\" /><path d=\"m9 5 3-3 3 3\" /></LucideSvg>;\nexport const AddRowAfterIcon = () => <LucideSvg><path d=\"M3 11V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5\" /><path d=\"M3 15h18\" /><path d=\"M12 22v-8\" /><path d=\"m9 19 3 3 3-3\" /></LucideSvg>;\nexport const DeleteRowIcon = () => <LucideSvg><path d=\"M3 11V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5\" /><path d=\"M3 15h18\" /><line x1=\"18\" y1=\"20\" x2=\"12\" y2=\"20\" /></LucideSvg>;\nexport const AddColBeforeIcon = () => <LucideSvg><path d=\"M13 3h5a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-5\" /><path d=\"M9 3v18\" /><path d=\"M2 12h8\" /><path d=\"m5 9-3 3 3 3\" /></LucideSvg>;\nexport const AddColAfterIcon = () => <LucideSvg><path d=\"M11 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\" /><path d=\"M15 3v18\" /><path d=\"M22 12h-8\" /><path d=\"m19 9 3 3-3 3\" /></LucideSvg>;\nexport const DeleteColIcon = () => <LucideSvg><path d=\"M11 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\" /><path d=\"M15 3v18\" /><line x1=\"20\" y1=\"18\" x2=\"20\" y2=\"12\" /></LucideSvg>;\nexport const MergeCellsIcon = () => <LucideSvg><path d=\"M15 3v18\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /></LucideSvg>;\nexport const SplitCellIcon = () => <LucideSvg><path d=\"M3 3h18v18H3z\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /><path d=\"M15 3v18\" /></LucideSvg>;\nexport const DeleteTableIcon = () => <LucideSvg><path d=\"M3 3h18v18H3z\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /><path d=\"M15 3v18\" /><line x1=\"18\" y1=\"18\" x2=\"12\" y2=\"12\" /></LucideSvg>;\nexport const ClearIcon = () => <LucideSvg><path d=\"M18 6L6 18\" /><path d=\"M6 6l12 12\" /></LucideSvg>;\nexport const SubmitIcon = () => <LucideSvg><polyline points=\"20 6 9 17 4 12\" /></LucideSvg>;\nexport const AttachIcon = () => <LucideSvg><path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.82-2.82l8.49-8.48\" /></LucideSvg>;\n\nexport const SuperscriptIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"4\" y=\"17\" fontSize=\"16\" fontWeight=\"500\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'Georgia, serif', fontStyle: 'italic' }}>X</text>\n <text x=\"13\" y=\"11\" fontSize=\"10\" fontWeight=\"600\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'sans-serif' }}>2</text>\n </svg>\n);\n\nexport const SubscriptIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"4\" y=\"14\" fontSize=\"16\" fontWeight=\"500\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'Georgia, serif', fontStyle: 'italic' }}>X</text>\n <text x=\"13\" y=\"19\" fontSize=\"10\" fontWeight=\"600\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'sans-serif' }}>2</text>\n </svg>\n);\n\nexport const HeadingIcon = () => (\n <LucideSvg>\n <path d=\"M6 12h12\" />\n <path d=\"M6 20V4\" />\n <path d=\"M18 20V4\" />\n </LucideSvg>\n);\n\nexport const FontSizeIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m3 7 5-5 5 5\" />\n <path d=\"M8 2v10\" />\n <path d=\"m21 17-5 5-5-5\" />\n <path d=\"M16 12v10\" />\n <path d=\"M3 13h18\" />\n </svg>\n);\n\nexport const FontFamilyIcon = () => (\n <LucideSvg>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\n </LucideSvg>\n);\n\nexport const TextColorIcon = () => (\n <LucideSvg>\n <path d=\"M4 20h16\" />\n <path d=\"m6 16 6-12 6 12\" />\n <path d=\"M8 12h8\" />\n </LucideSvg>\n);\n\nexport const EraserIcon = () => (\n <LucideSvg>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.9-9.9c1-1 2.5-1 3.4 0l4.4 4.4c1 1 1 2.5 0 3.4L10.8 21z\" />\n <path d=\"m22 21h-8\" />\n <path d=\"m5 11 9 9\" />\n </LucideSvg>\n);\n"],"mappings":"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","names":["import_react","import_extension_text_style","import_core","import_extension_text_style","StarterKit","Link","Underline","Image","FontFamily","Superscript","Subscript","TextAlign","Placeholder","TableHeader","import_jsx_runtime","React","_","import_jsx_runtime","text","React","editor"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/TiptapEditor.tsx","../src/extensions.ts","../src/fontSize.ts","../src/backgroundColor.ts","../src/utils.ts","../src/constants.ts","../src/ToolbarGroups.tsx","../src/Icons.tsx"],"sourcesContent":["// Main component\nexport { default as TiptapEditor } from './TiptapEditor';\n\n// Types\nexport type { TiptapEditorProps } from './types';\n\n// Extensions (for advanced users who want to customize)\nexport { createTiptapExtensions } from './extensions';\nexport { FontSize } from './fontSize';\nexport { BackgroundColor } from './backgroundColor';\n\n// Constants (for consumers who want to extend)\nexport { TIPTAP_COLORS, FONT_FAMILIES, FONT_SIZES, IMAGE_MIME_TYPES } from './constants';\n","import React, { useRef, useCallback, useEffect } from 'react';\nimport { useEditor, EditorContent, type Editor } from '@tiptap/react';\n\nimport { TiptapEditorProps, ToolbarGroup } from './types';\nimport { createTiptapExtensions } from './extensions';\nimport { uploadFileToCOS } from './utils';\nimport { IMAGE_MIME_TYPES } from './constants';\nimport {\n HistoryGroup,\n HeadingGroup,\n FontSizeGroup,\n FontGroup,\n TextColorGroup,\n HighlightGroup,\n ListGroup,\n InlineGroup,\n LinkGroup,\n // FormatGroup,\n AlignmentGroup,\n TableGroup,\n InsertGroup,\n} from './ToolbarGroups';\n\nconst MEANINGFUL_NODE_SELECTOR = 'img, table, a[href], iframe, video, audio, object, embed, hr';\n\nconst normalizeInvisibleText = (text: string) =>\n text\n .replace(/\\u00a0/g, ' ')\n .replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n .trim();\n\nconst isEmptyRichTextHtml = (html: string): boolean => {\n const raw = (html || '').trim();\n if (!raw) return true;\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n const text = raw\n .replace(/<br\\s*\\/?>/gi, '')\n .replace(/<\\/?[^>]+>/g, '')\n .replace(/&nbsp;/gi, ' ');\n return normalizeInvisibleText(text) === '';\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(raw, 'text/html');\n const text = normalizeInvisibleText(doc.body.textContent || '');\n if (text) return false;\n\n return !doc.body.querySelector(MEANINGFUL_NODE_SELECTOR);\n};\n\nconst getNormalizedEditorHtml = (editor: Editor): string => {\n const html = editor.getHTML();\n return isEmptyRichTextHtml(html) ? '' : html;\n};\n\nconst TiptapEditor: React.FC<TiptapEditorProps> = ({\n elementId,\n content,\n editMode,\n docNum,\n receiveData,\n receiveStatus,\n onUploadFile,\n onAlert,\n onLoadingChange,\n onRegisterReset,\n placeholder = 'Enter content here...',\n toolbarConfig,\n customValidationFn\n}) => {\n // Use provided functions or fallback to defaults\n const alertFn = onAlert || ((msg: string) => window.alert(msg));\n const loadingChangeFn = onLoadingChange || (() => {});\n const isReadOnly = !editMode;\n const containerRef = useRef<HTMLDivElement>(null);\n const imageInputRef = useRef<HTMLInputElement>(null);\n const attachInputRef = useRef<HTMLInputElement>(null);\n const [showHighlightMenu, setShowHighlightMenu] = React.useState(false);\n const [showTextColorMenu, setShowTextColorMenu] = React.useState(false);\n const [showFontMenu, setShowFontMenu] = React.useState(false);\n const [showFontSizeMenu, setShowFontSizeMenu] = React.useState(false);\n const [showHeadingMenu, setShowHeadingMenu] = React.useState(false);\n const [showLinkMenu, setShowLinkMenu] = React.useState(false);\n const [showTableMenu, setShowTableMenu] = React.useState(false);\n const [tableHoverSize, setTableHoverSize] = React.useState({ rows: 0, cols: 0 });\n const [linkUrl, setLinkUrl] = React.useState('');\n\n // Track whether the editor content has been initialised (uncontrolled after init)\n const initializedRef = useRef(false);\n // Track the last HTML emitted to prevent state update loops from resetting the cursor\n const lastEmittedContentRef = useRef(content || '');\n // Timestamp of the last local update to ignore immediate 'echo' props from parent\n const lastUpdateTimestampRef = useRef(0);\n // Track the number of active uploads to prevent onUpdate from prematurely clearing loading\n const activeUploadsRef = useRef(0);\n\n const closeAllMenus = React.useCallback(() => {\n setShowHighlightMenu(false);\n setShowTextColorMenu(false);\n setShowFontMenu(false);\n setShowFontSizeMenu(false);\n setShowHeadingMenu(false);\n setShowLinkMenu(false);\n setShowTableMenu(false);\n }, []);\n\n // Handle clicking outside the editor to close menus\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n closeAllMenus();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [closeAllMenus]);\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: createTiptapExtensions(placeholder),\n content: content || '',\n editable: editMode,\n onFocus: () => {\n closeAllMenus();\n },\n onSelectionUpdate: () => {\n closeAllMenus();\n },\n editorProps: {\n // Handle clipboard paste - support pasting images (e.g. screenshots)\n handlePaste: (view, event) => {\n if (!editMode) return false;\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n\n // Check for image files in clipboard (screenshot paste)\n const items = Array.from(clipboardData.items);\n const imageItems = items.filter((item) => item.kind === 'file' && IMAGE_MIME_TYPES.includes(item.type));\n\n if (imageItems.length > 0) {\n event.preventDefault();\n\n if (!onUploadFile) {\n alertFn('Upload function not provided');\n return true;\n }\n\n // Mark batch upload as active to prevent onUpdate from clearing loading\n activeUploadsRef.current += 1;\n // Start global loading\n loadingChangeFn(true);\n\n Promise.all(\n imageItems.map((item) => {\n const file = item.getAsFile();\n if (!file) return Promise.resolve();\n\n // Upload pasted image with global event suppressed\n return uploadFileToCOS(\n file,\n docNum,\n onUploadFile,\n receiveStatus,\n elementId,\n loadingChangeFn,\n true\n )\n .then((url) => {\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.image.create({ src: url, alt: file.name })\n )\n );\n })\n .catch((err: Error) => {\n alertFn(err.message || 'Image upload failed');\n });\n })\n ).finally(() => {\n activeUploadsRef.current -= 1;\n // End global loading\n loadingChangeFn(false);\n // Now that all uploads are done, push the final content to the parent\n if (activeUploadsRef.current === 0) {\n if (editor) {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n });\n return true;\n }\n return false;\n },\n },\n onUpdate: ({ editor }) => {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n lastUpdateTimestampRef.current = Date.now();\n // Skip receiveData during active uploads to prevent parent from clearing loading state\n if (activeUploadsRef.current === 0) {\n receiveData && receiveData(elementId, html);\n }\n },\n });\n\n // Sync external content changes into editor (read-only mode or form reset)\n useEffect(() => {\n if (!editor) return;\n\n if (!initializedRef.current) {\n // First initialisation - set content without emitting an update event\n initializedRef.current = true;\n if (content && content !== editor.getHTML()) {\n editor.commands.setContent(content || '', { emitUpdate: false });\n lastEmittedContentRef.current = content;\n }\n return;\n }\n\n // Subsequent external updates:\n // 1. If we just did a local update, ignore the incoming 'echo' for 150ms\n if (Date.now() - lastUpdateTimestampRef.current < 150) {\n return;\n }\n\n // 2. IMPORTANT: If the editor is currently focused, do NOT overwrite its content.\n // The local user is the source of truth. Content syncing from external props\n // should only happen when the editor is idle/blurred (e.g. form reset, external load).\n if (editor.isFocused) {\n return;\n }\n\n // Abort if the incoming content is just the echo of what we just emitted!\n if (content === lastEmittedContentRef.current) {\n return;\n }\n\n // Only update if it's genuinely a new external change\n if (content !== editor.getHTML()) {\n editor.commands.setContent(content || '', { emitUpdate: false });\n lastEmittedContentRef.current = content || '';\n }\n }, [content, editor]);\n\n // Sync editMode changes\n useEffect(() => {\n if (!editor) return;\n editor.setEditable(editMode);\n }, [editMode, editor]);\n\n // Register reset callback with parent (if provided)\n useEffect(() => {\n if (!editor || !onRegisterReset) return;\n const handleReset = (newContent: string) => {\n editor.commands.setContent(newContent || '', { emitUpdate: false });\n };\n const unregister = onRegisterReset(handleReset);\n return () => {\n unregister && unregister();\n };\n }, [editor, onRegisterReset]);\n\n // ---- Image upload handler ----\n const handleImageFileChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0 || !editor) return;\n // Reset input so the same file can be selected again\n e.target.value = '';\n\n if (!onUploadFile) {\n alertFn('Upload function not provided');\n return;\n }\n // validate files\n if (customValidationFn) {\n const validateResult = await customValidationFn(files);\n if (!validateResult) {\n return;\n }\n }\n\n // Mark batch upload as active to prevent onUpdate from clearing loading\n activeUploadsRef.current += 1;\n // Start global loading\n loadingChangeFn(true);\n try {\n const uploadResults = await Promise.all(\n files.map(async (file) => {\n const url = await uploadFileToCOS(\n file,\n docNum,\n onUploadFile,\n receiveStatus,\n elementId,\n loadingChangeFn,\n true\n );\n return { url, name: file.name };\n })\n );\n editor.chain().focus().run(); // focus\n const imagesHtml = uploadResults.map(res => \n `<img src=\"${res.url}\" alt=\"${res.name}\" />`\n ).join('<br/>');\n editor.chain().insertContent(imagesHtml).run();\n } catch (err: any) {\n alertFn(err.message || 'Image upload failed');\n } finally {\n activeUploadsRef.current -= 1;\n // End global loading\n loadingChangeFn(false);\n // Now that all uploads are done, push the final content to the parent\n if (activeUploadsRef.current === 0) {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]\n );\n\n // ---- Attachment (non-image file) upload handler ----\n const handleAttachFileChange = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0 || !editor) return;\n // Reset input so the same file can be selected again\n e.target.value = '';\n\n if (!onUploadFile) {\n alertFn('Upload function not provided');\n return;\n }\n // validate files\n if (customValidationFn) {\n const validateResult = await customValidationFn(files);\n if (!validateResult) {\n return;\n }\n }\n\n // Mark batch upload as active to prevent onUpdate from clearing loading\n activeUploadsRef.current += 1;\n // Start global loading\n loadingChangeFn(true);\n try {\n const uploadResults = await await Promise.all(\n files.map(async (file) => {\n const url = await uploadFileToCOS(\n file,\n docNum,\n onUploadFile,\n receiveStatus,\n elementId,\n loadingChangeFn,\n true\n );\n return { url, name: file.name };\n })\n );\n // Insert a hyperlink styled as an attachment with a marker attribute for CSS styling\n const attachmentsHtml = uploadResults.map(res => \n `<a href=\"${res.url}\" target=\"_blank\" rel=\"noopener noreferrer\" data-attachment=\"true\">${res.name}</a>`\n ).join('<br/>');\n editor.chain().focus().insertContent(attachmentsHtml).run();\n } catch (err: any) {\n alertFn(err.message || 'Attachment upload failed');\n } finally {\n activeUploadsRef.current -= 1;\n // End global loading\n loadingChangeFn(false);\n // Now that all uploads are done, push the final content to the parent\n if (activeUploadsRef.current === 0) {\n const html = getNormalizedEditorHtml(editor);\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]\n );\n\n // ---- Link set/unset handler ----\n const handleLinkClick = useCallback(() => {\n if (!editor || isReadOnly) return;\n const nextState = !showLinkMenu;\n closeAllMenus();\n\n if (nextState) {\n // Find existing link href if active\n const previousUrl = editor.getAttributes('link').href;\n setLinkUrl(previousUrl || '');\n }\n\n setShowLinkMenu(nextState);\n }, [editor, isReadOnly, showLinkMenu, closeAllMenus]);\n\n const submitLink = useCallback(() => {\n if (!editor) return;\n if (linkUrl === null || linkUrl.trim() === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n } else {\n const formattedUrl = /^https?:\\/\\//.test(linkUrl) ? linkUrl : `https://${linkUrl}`;\n const { from, to } = editor.state.selection;\n const hasSelection = from !== to;\n \n if (hasSelection) {\n // If text is selected, apply link to selection\n editor.chain().focus().extendMarkRange('link').setLink({ href: formattedUrl }).run();\n } else {\n // If no text is selected, insert the link URL as text with link\n editor.chain().focus().insertContent(`<a href=\"${formattedUrl}\">${linkUrl}</a>`).run();\n }\n }\n setShowLinkMenu(false);\n }, [editor, linkUrl]);\n\n if (!editor) return null;\n\n // ---- Render Helpers for Readability ----\n const getHiddenInputs = () => (\n <>\n <input\n ref={imageInputRef}\n type='file'\n accept='image/*'\n multiple\n className='tiptap-hidden-input'\n onChange={handleImageFileChange}\n />\n <input\n ref={attachInputRef}\n type='file'\n accept='*/*'\n multiple\n className='tiptap-hidden-input'\n onChange={handleAttachFileChange}\n />\n </>\n );\n\n // Default toolbar groups if none specified\n const defaultGroups: ToolbarGroup[] = [\n 'history',\n 'heading',\n 'font',\n 'fontSize',\n 'textColor',\n 'highlight',\n 'list',\n 'alignment',\n 'table',\n 'inline',\n 'link',\n 'insert',\n ];\n\n // Get configured groups or use defaults\n const toolbarGroups = toolbarConfig?.groups || defaultGroups;\n\n // Determine if dividers should be shown\n const showDividers = toolbarConfig?.showDividers !== undefined ? toolbarConfig.showDividers : true;\n\n const getToolbar = () => {\n // Create a map of toolbar components for easy lookup\n const toolbarComponents: Record<ToolbarGroup, JSX.Element> = {\n history: (<HistoryGroup editor={editor} isReadOnly={isReadOnly} />),\n heading: (<HeadingGroup \n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showHeadingMenu}\n onToggle={() => {\n const nextState = !showHeadingMenu;\n closeAllMenus();\n setShowHeadingMenu(nextState);\n }}\n onClose={() => setShowHeadingMenu(false)}\n />),\n font: (\n <FontGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showFontMenu}\n onToggle={() => {\n const nextState = !showFontMenu;\n closeAllMenus();\n setShowFontMenu(nextState);\n }}\n onClose={() => setShowFontMenu(false)}\n />\n ),\n fontSize: (\n <FontSizeGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showFontSizeMenu}\n onToggle={() => {\n const nextState = !showFontSizeMenu;\n closeAllMenus();\n setShowFontSizeMenu(nextState);\n }}\n onClose={() => setShowFontSizeMenu(false)}\n />\n ),\n textColor: (\n <TextColorGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showTextColorMenu}\n onToggle={() => {\n const nextState = !showTextColorMenu;\n closeAllMenus();\n setShowTextColorMenu(nextState);\n }}\n onClose={() => setShowTextColorMenu(false)}\n />\n ),\n highlight: (\n <HighlightGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showHighlightMenu}\n onToggle={() => {\n const nextState = !showHighlightMenu;\n closeAllMenus();\n setShowHighlightMenu(nextState);\n }}\n onClose={() => setShowHighlightMenu(false)}\n />\n ),\n list: <ListGroup editor={editor} isReadOnly={isReadOnly} />,\n alignment: <AlignmentGroup editor={editor} isReadOnly={isReadOnly} />,\n table: (\n <TableGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showTableMenu}\n onToggle={() => !isReadOnly && setShowTableMenu(!showTableMenu)}\n onClose={() => setShowTableMenu(false)}\n tableHoverSize={tableHoverSize}\n onGridHover={(rows, cols) => setTableHoverSize({ rows, cols })}\n />\n ),\n inline: <InlineGroup editor={editor} isReadOnly={isReadOnly} />,\n link: (\n <LinkGroup\n editor={editor}\n isReadOnly={isReadOnly}\n showMenu={showLinkMenu}\n onToggle={handleLinkClick}\n onClose={() => setShowLinkMenu(false)}\n linkUrl={linkUrl}\n onLinkUrlChange={setLinkUrl}\n onSubmit={submitLink}\n />\n ),\n insert: (\n <InsertGroup\n editor={editor}\n isReadOnly={isReadOnly}\n onImageClick={() => !isReadOnly && imageInputRef.current?.click()}\n onAttachClick={() => !isReadOnly && attachInputRef.current?.click()}\n />\n ),\n };\n\n // Build toolbar items based on configured groups\n const toolbarItems = toolbarGroups\n .map((group, index) => {\n const component = toolbarComponents[group];\n if (!component) return null;\n\n // Add divider if needed (except before the first item)\n const divider = showDividers && index > 0 ? <span className='toolbar-divider' /> : null;\n\n return (\n <React.Fragment key={group}>\n {divider}\n {component}\n </React.Fragment>\n );\n })\n .filter(Boolean); // Remove any null items\n\n return (\n <div\n className={`tiptap-toolbar${isReadOnly ? ' toolbar-disabled' : ''}`}\n role='toolbar'\n aria-label='Editor toolbar'\n >\n {toolbarItems}\n </div>\n );\n };\n\n return (\n <div id={elementId} className={`tiptap-editor-wrapper${isReadOnly ? ' read-only' : ''}`} ref={containerRef}>\n {getHiddenInputs()}\n {getToolbar()}\n {/* Editor content area */}\n <div onMouseDown={closeAllMenus}>\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n};\n\nexport default TiptapEditor;\n","import StarterKit from '@tiptap/starter-kit';\nimport Image from '@tiptap/extension-image';\nimport Link from '@tiptap/extension-link';\nimport Underline from '@tiptap/extension-underline';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport FontFamily from '@tiptap/extension-font-family';\nimport { Color } from '@tiptap/extension-color';\nimport Superscript from '@tiptap/extension-superscript';\nimport Subscript from '@tiptap/extension-subscript';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { Table } from '@tiptap/extension-table';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport TableHeader from '@tiptap/extension-table-header';\nimport { TableCell } from '@tiptap/extension-table-cell';\nimport { FontSize } from './fontSize';\nimport { BackgroundColor } from './backgroundColor';\n\nexport const createTiptapExtensions = (placeholder = 'Enter content here...') => [\n StarterKit.configure({\n heading: { levels: [1, 2, 3, 4, 5, 6] },\n }),\n Link.configure({\n openOnClick: false,\n autolink: true,\n HTMLAttributes: { rel: 'noopener noreferrer' },\n }),\n Underline,\n Image.configure({ inline: false, allowBase64: true }),\n TextStyle,\n FontSize,\n BackgroundColor,\n FontFamily,\n Color,\n Superscript,\n Subscript,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Placeholder.configure({ placeholder }),\n Table.configure({\n resizable: true,\n HTMLAttributes: {\n class: 'tiptap-table',\n },\n }),\n TableRow,\n TableHeader,\n TableCell,\n];\n","import { Extension } from '@tiptap/core';\nimport '@tiptap/extension-text-style';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fontSize: {\n /**\n * Set the font size\n */\n setFontSize: (size: string) => ReturnType;\n /**\n * Unset the font size\n */\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nexport const 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.replace(/['\"]+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n\n return {\n style: `font-size: ${attributes.fontSize}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize) =>\n ({ chain }) => {\n // Map keyword sizes to actual CSS values for compatibility\n const mapping: Record<string, string> = {\n 'tiny': '0.7em',\n 'small': '0.85em',\n 'big': '1.4em',\n 'huge': '1.8em',\n };\n \n const value = mapping[fontSize] || fontSize;\n return chain().setMark('textStyle', { fontSize: value }).run();\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","import { Extension } from '@tiptap/core';\nimport '@tiptap/extension-text-style';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n backgroundColor: {\n /**\n * Set the background color\n */\n setBackgroundColor: (color: string) => ReturnType;\n /**\n * Unset the background color\n */\n unsetBackgroundColor: () => ReturnType;\n };\n }\n}\n\nexport const BackgroundColor = Extension.create({\n name: 'backgroundColor',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n backgroundColor: {\n default: null,\n parseHTML: (element) => element.style.backgroundColor.replace(/['\"]+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setBackgroundColor:\n (backgroundColor) =>\n ({ chain }) => {\n return chain().setMark('textStyle', { backgroundColor }).run();\n },\n unsetBackgroundColor:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { backgroundColor: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","/**\n * Upload a file and return the public URL.\n * Notifies the parent component of upload status changes.\n */\nexport async function uploadFileToCOS(\n file: File,\n docNum: string,\n onUploadFile: (file: File, docNum: string) => Promise<string>,\n receiveStatus?: (id: string, uploading: boolean) => void,\n elementId?: string,\n onLoadingChange?: (isLoading: boolean) => void,\n suppressStatusChange: boolean = false\n): Promise<string> {\n // Notify parent that upload has started\n receiveStatus && elementId && receiveStatus(elementId, true);\n if (!suppressStatusChange) onLoadingChange?.(true);\n\n try {\n const url = await onUploadFile(file, docNum);\n if (!url) throw new Error('Upload failed: no URL returned');\n return url;\n } finally {\n // Notify parent that upload has finished (success or failure)\n if (!suppressStatusChange) onLoadingChange?.(false);\n receiveStatus && elementId && receiveStatus(elementId, false);\n }\n}\n","// Tiptap Editor Constants and Configuration\n\nexport const TIPTAP_COLORS = [\n '#000000', '#4d4d4d', '#999999', '#e6e6e6', '#ffffff',\n '#e64d3d', '#eb9120', '#f3da35', '#7ed822', '#00d924',\n '#1abc9c', '#32dada', '#3498db', '#2980b9', '#a290e4'\n];\n\nexport const FONT_FAMILIES = [\n { label: 'Default', value: '' },\n { label: 'Arial', value: 'Arial' },\n { label: 'Courier New', value: 'Courier New' },\n { label: 'Georgia', value: 'Georgia' },\n { label: 'Lucida Sans Unicode', value: 'Lucida Sans Unicode' },\n { label: 'Tahoma', value: 'Tahoma' },\n { label: 'Times New Roman', value: 'Times New Roman' },\n { label: 'Trebuchet MS', value: 'Trebuchet MS' },\n { label: 'Verdana', value: 'Verdana' },\n];\n\nexport const FONT_SIZES = [\n { label: 'Tiny', value: 'tiny' },\n { label: 'Small', value: 'small' },\n { label: 'Default', value: '' },\n { label: 'Big', value: 'big' },\n { label: 'Huge', value: 'huge' },\n];\n\nexport const IMAGE_MIME_TYPES = [\n 'image/png', \n 'image/jpeg', \n 'image/jpg', \n 'image/gif', \n 'image/webp', \n 'image/bmp'\n];\n","import React from 'react';\nimport { Editor } from '@tiptap/react';\nimport {\n UndoIcon,\n RedoIcon,\n BulletListIcon,\n OrderedListIcon,\n BlockquoteIcon,\n BoldIcon,\n ItalicIcon,\n StrikeIcon,\n UnderlineIcon,\n CodeIcon,\n HighlightIcon,\n LinkIcon,\n ImageIcon,\n AlignLeftIcon,\n AlignCenterIcon,\n AlignRightIcon,\n TableIcon,\n AddRowBeforeIcon,\n AddRowAfterIcon,\n DeleteRowIcon,\n AddColBeforeIcon,\n AddColAfterIcon,\n DeleteColIcon,\n MergeCellsIcon,\n SplitCellIcon,\n DeleteTableIcon,\n ClearIcon,\n SubmitIcon,\n AttachIcon,\n SuperscriptIcon,\n SubscriptIcon,\n HeadingIcon,\n FontSizeIcon,\n FontFamilyIcon,\n TextColorIcon,\n EraserIcon\n} from './Icons';\nimport { FONT_FAMILIES, FONT_SIZES, TIPTAP_COLORS } from './constants';\n\ninterface GroupProps {\n editor: Editor;\n isReadOnly: boolean;\n}\n\ninterface DropdownGroupProps extends GroupProps {\n showMenu: boolean;\n onToggle: () => void;\n onClose: () => void;\n}\n\nexport const HistoryGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly || !editor.can().undo()}\n aria-label=\"Undo\"\n >\n <UndoIcon />\n </button>\n <button\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly || !editor.can().redo()}\n aria-label=\"Redo\"\n >\n <RedoIcon />\n </button>\n </>\n);\n\nexport const HeadingGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Heading\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Heading selection\"\n >\n <HeadingIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-heading-menu\">\n <button\n className={`heading-option ${!editor.isActive('heading') ? 'is-active' : ''}`}\n onClick={() => {\n editor.chain().focus().setParagraph().run();\n onClose();\n }}\n >\n Paragraph\n </button>\n {[1, 2, 3, 4, 5, 6].map((level) => (\n <button\n key={level}\n className={`heading-option h${level} ${editor.isActive('heading', { level }) ? 'is-active' : ''}`}\n onClick={() => {\n editor.chain().focus().toggleHeading({ level: level as any }).run();\n onClose();\n }}\n >\n Heading {level}\n </button>\n ))}\n </div>\n )}\n </div>\n);\n\nexport const FontGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Font family\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Font family selection\"\n >\n <FontFamilyIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-font-menu\">\n {FONT_FAMILIES.map((font) => {\n const isActive = editor.getAttributes('textStyle').fontFamily === font.value;\n return (\n <button\n key={font.label}\n className={`font-option ${isActive ? 'is-active' : ''}`}\n style={{ fontFamily: font.value || 'inherit' }}\n onClick={() => {\n if (font.value) {\n editor.chain().focus().setFontFamily(font.value).run();\n } else {\n editor.chain().focus().unsetFontFamily().run();\n }\n onClose();\n }}\n >\n {font.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n);\n\nexport const FontSizeGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Font size\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Font size selection\"\n >\n <FontSizeIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-font-menu\">\n {FONT_SIZES.map((size) => {\n const currentSize = editor.getAttributes('textStyle').fontSize;\n const mapping: Record<string, string> = {\n 'tiny': '0.7em',\n 'small': '0.85em',\n 'big': '1.4em',\n 'huge': '1.8em',\n };\n const targetValue = mapping[size.value] || size.value || null;\n const isActive = (!currentSize && !size.value) || currentSize === targetValue;\n\n return (\n <button\n key={size.label}\n className={`font-option ${isActive ? 'is-active' : ''}`}\n onClick={() => {\n if (size.value) {\n editor.chain().focus().setFontSize(size.value).run();\n } else {\n editor.chain().focus().unsetFontSize().run();\n }\n onClose();\n }}\n >\n {size.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n);\n\nexport const TextColorGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Text color\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Text color picker\"\n >\n <TextColorIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-color-picker\">\n <button\n className=\"color-remove-btn\"\n onClick={() => {\n editor.chain().focus().unsetColor().run();\n onClose();\n }}\n >\n <EraserIcon /> Remove color\n </button>\n <div className=\"color-grid\">\n {TIPTAP_COLORS.map((color) => (\n <button\n key={color}\n className={`color-swatch ${editor.isActive('textStyle', { color }) ? 'is-active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => {\n editor.chain().focus().setColor(color).run();\n onClose();\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\nexport const HighlightGroup: React.FC<DropdownGroupProps> = ({ editor, isReadOnly, showMenu, onToggle, onClose }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Highlight\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${showMenu ? 'is-active' : ''}`}\n aria-label=\"Background color picker\"\n >\n <HighlightIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-color-picker\">\n <button\n className=\"color-remove-btn\"\n onClick={() => {\n editor.chain().focus().unsetBackgroundColor().run();\n onClose();\n }}\n >\n <EraserIcon /> Remove color\n </button>\n <div className=\"color-grid\">\n {TIPTAP_COLORS.map((color) => (\n <button\n key={color}\n className={`color-swatch ${editor.isActive('textStyle', { backgroundColor: color }) ? 'is-active' : ''}`}\n style={{ backgroundColor: color }}\n onClick={() => {\n editor.chain().focus().setBackgroundColor(color).run();\n onClose();\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\nexport const ListGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Bulleted list\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('bulletList') ? 'is-active' : ''}\n aria-label=\"Bulleted list\"\n >\n <BulletListIcon />\n </button>\n <button\n title=\"Ordered list\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('orderedList') ? 'is-active' : ''}\n aria-label=\"Ordered list\"\n >\n <OrderedListIcon />\n </button>\n <button\n title=\"Blockquote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('blockquote') ? 'is-active' : ''}\n aria-label=\"Blockquote\"\n >\n <BlockquoteIcon />\n </button>\n </>\n);\n\nexport const InlineGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('bold') ? 'is-active' : ''}\n aria-label=\"Bold\"\n >\n <BoldIcon />\n </button>\n <button\n title=\"Italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('italic') ? 'is-active' : ''}\n aria-label=\"Italic\"\n >\n <ItalicIcon />\n </button>\n <button\n title=\"Strikethrough\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('strike') ? 'is-active' : ''}\n aria-label=\"Strikethrough\"\n >\n <StrikeIcon />\n </button>\n <button\n title=\"Underline\"\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('underline') ? 'is-active' : ''}\n aria-label=\"Underline\"\n >\n <UnderlineIcon />\n </button>\n <button\n title=\"Code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('code') ? 'is-active' : ''}\n aria-label=\"Inline code\"\n >\n <CodeIcon />\n </button>\n </>\n);\n\ntype LinkMenuPlacement = 'center' | 'start' | 'end';\n\nconst getLinkMenuPlacement = (triggerEl: HTMLDivElement | null): LinkMenuPlacement => {\n if (!triggerEl || typeof document === 'undefined') return 'center';\n\n const boundaryEl = triggerEl.closest('.tiptap-editor-wrapper') as HTMLElement | null;\n const boundaryRect = boundaryEl?.getBoundingClientRect() || document.documentElement.getBoundingClientRect();\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuWidth = 300;\n const edgePadding = 8;\n const centeredLeft = triggerRect.left + triggerRect.width / 2 - menuWidth / 2;\n const centeredRight = centeredLeft + menuWidth;\n\n if (centeredLeft < boundaryRect.left + edgePadding) return 'start';\n if (centeredRight > boundaryRect.right - edgePadding) return 'end';\n return 'center';\n};\n\nexport const LinkGroup: React.FC<DropdownGroupProps & {\n linkUrl: string;\n onLinkUrlChange: (url: string) => void;\n onSubmit: () => void;\n}> = ({ editor, isReadOnly, showMenu, onToggle, onClose, linkUrl, onLinkUrlChange, onSubmit }) => {\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const [menuPlacement, setMenuPlacement] = React.useState<LinkMenuPlacement>('center');\n\n React.useEffect(() => {\n if (!showMenu || isReadOnly) return;\n\n const updatePlacement = () => {\n setMenuPlacement(getLinkMenuPlacement(triggerRef.current));\n };\n\n updatePlacement();\n window.addEventListener('resize', updatePlacement);\n return () => window.removeEventListener('resize', updatePlacement);\n }, [showMenu, isReadOnly]);\n\n return (\n <div ref={triggerRef} style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Insert link\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('link') ? 'is-active' : ''}\n aria-label=\"Insert link\"\n >\n <LinkIcon />\n </button>\n {showMenu && !isReadOnly && (\n <div className={`tiptap-link-menu align-${menuPlacement}`}>\n <input\n type=\"url\"\n placeholder=\"Paste a link...\"\n value={linkUrl}\n onChange={(e) => onLinkUrlChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSubmit();\n if (e.key === 'Escape') onClose();\n }}\n autoFocus\n />\n <button onClick={onSubmit} title=\"Apply\" className=\"link-submit-btn\">\n <SubmitIcon />\n </button>\n <button\n onClick={() => {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n onClose();\n }}\n title=\"Unlink\"\n className=\"link-clear-btn\"\n >\n <ClearIcon />\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport const FormatGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Superscript\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('superscript') ? 'is-active' : ''}\n aria-label=\"Superscript\"\n >\n <SuperscriptIcon />\n </button>\n <button\n title=\"Subscript\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive('subscript') ? 'is-active' : ''}\n aria-label=\"Subscript\"\n >\n <SubscriptIcon />\n </button>\n </>\n);\n\nexport const AlignmentGroup: React.FC<GroupProps> = ({ editor, isReadOnly }) => (\n <>\n <button\n title=\"Align left\"\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive({ textAlign: 'left' }) ? 'is-active' : ''}\n aria-label=\"Align left\"\n >\n <AlignLeftIcon />\n </button>\n <button\n title=\"Align center\"\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive({ textAlign: 'center' }) ? 'is-active' : ''}\n aria-label=\"Align center\"\n >\n <AlignCenterIcon />\n </button>\n <button\n title=\"Align right\"\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={editor.isActive({ textAlign: 'right' }) ? 'is-active' : ''}\n aria-label=\"Align right\"\n >\n <AlignRightIcon />\n </button>\n </>\n);\n\nexport const TableGroup: React.FC<DropdownGroupProps & {\n tableHoverSize: { rows: number; cols: number };\n onGridHover: (rows: number, cols: number) => void;\n}> = ({ editor, isReadOnly, showMenu, onToggle, onClose, tableHoverSize, onGridHover }) => (\n <div style={{ position: 'relative', display: 'inline-flex' }}>\n <button\n title=\"Table\"\n onClick={onToggle}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n className={`toolbar-button-dropdown ${editor.isActive('table') ? 'is-active' : ''}`}\n aria-label=\"Table options\"\n >\n <TableIcon />\n <svg className=\"dropdown-arrow\" viewBox=\"0 0 24 24\" width=\"10\" height=\"10\">\n <path d=\"M7 10l5 5 5-5z\" fill=\"currentColor\" />\n </svg>\n </button>\n {showMenu && !isReadOnly && (\n <div className=\"tiptap-table-menu\">\n {!editor.isActive('table') ? (\n <div\n className=\"table-grid-picker-wrapper\"\n onMouseLeave={() => onGridHover(0, 0)}\n >\n <div className=\"table-grid-picker\">\n {[...Array(10)].map((_, r) => (\n <div key={r} className=\"grid-row\">\n {[...Array(10)].map((_, c) => (\n <div\n key={c}\n className={`grid-cell ${(r + 1 <= tableHoverSize.rows && c + 1 <= tableHoverSize.cols) ? 'is-active' : ''}`}\n onMouseEnter={() => onGridHover(r + 1, c + 1)}\n onClick={() => {\n editor.chain().focus().insertTable({ rows: r + 1, cols: c + 1, withHeaderRow: true }).run();\n onClose();\n onGridHover(0, 0);\n }}\n />\n ))}\n </div>\n ))}\n </div>\n <div className=\"table-grid-label\">\n {tableHoverSize.rows > 0 ? `${tableHoverSize.rows} x ${tableHoverSize.cols}` : 'Square Grid'}\n </div>\n </div>\n ) : (\n <div className=\"table-menu-grid\">\n <button onClick={() => editor.chain().focus().addColumnBefore().run()} title=\"Add column before\"><AddColBeforeIcon /></button>\n <button onClick={() => editor.chain().focus().addColumnAfter().run()} title=\"Add column after\"><AddColAfterIcon /></button>\n <button onClick={() => editor.chain().focus().deleteColumn().run()} title=\"Delete column\"><DeleteColIcon /></button>\n\n <button onClick={() => editor.chain().focus().addRowBefore().run()} title=\"Add row before\"><AddRowBeforeIcon /></button>\n <button onClick={() => editor.chain().focus().addRowAfter().run()} title=\"Add row after\"><AddRowAfterIcon /></button>\n <button onClick={() => editor.chain().focus().deleteRow().run()} title=\"Delete row\"><DeleteRowIcon /></button>\n\n <button onClick={() => editor.chain().focus().mergeCells().run()} title=\"Merge cells\"><MergeCellsIcon /></button>\n <button onClick={() => editor.chain().focus().splitCell().run()} title=\"Split cell\"><SplitCellIcon /></button>\n\n <button onClick={() => {\n editor.chain().focus().deleteTable().run();\n onClose();\n }} className=\"danger\" title=\"Delete table\"><DeleteTableIcon /></button>\n </div>\n )}\n </div>\n )}\n </div>\n);\n\nexport const InsertGroup: React.FC<GroupProps & {\n onImageClick: () => void;\n onAttachClick: () => void;\n}> = ({ isReadOnly, onImageClick, onAttachClick }) => (\n <>\n <button\n title=\"Insert image\"\n onClick={onImageClick}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n aria-label=\"Insert image\"\n >\n <ImageIcon />\n </button>\n <button\n title=\"Attach file\"\n onClick={onAttachClick}\n onMouseDown={(e) => e.preventDefault()}\n disabled={isReadOnly}\n aria-label=\"Attach file\"\n >\n <AttachIcon />\n </button>\n </>\n);\n","import React from 'react';\n\n/* ---- Official Tiptap (Lucide) SVG icons ---- */\n\nconst LucideSvg = ({ children }: { children: React.ReactNode }) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n {children}\n </svg>\n);\n\nexport const UndoIcon = () => <LucideSvg><path d=\"M3 7v6h6\" /><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\" /></LucideSvg>;\nexport const RedoIcon = () => <LucideSvg><path d=\"M21 7v6h-6\" /><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\" /></LucideSvg>;\nexport const BulletListIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const OrderedListIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const BlockquoteIcon = () => <LucideSvg><path d=\"M17 6H3\" /><path d=\"M21 12H8\" /><path d=\"M21 18H8\" /><path d=\"M3 12v6\" /></LucideSvg>;\nexport const BoldIcon = () => <LucideSvg><path d=\"M14 12a4 4 0 0 0 0-8H6v8\" /><path d=\"M15 20a4 4 0 0 0 0-8H6v8Z\" /></LucideSvg>;\nexport const ItalicIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const StrikeIcon = () => <LucideSvg><path d=\"M16 4H9a3 3 0 0 0-2.83 4\" /><path d=\"M14 12a4 4 0 0 1 0 8H6\" /><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" /></LucideSvg>;\nexport const UnderlineIcon = () => <LucideSvg><path d=\"M6 4v6a6 6 0 0 0 12 0V4\" /><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" /></LucideSvg>;\nexport const CodeIcon = () => <LucideSvg><polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" /></LucideSvg>;\nexport const HighlightIcon = () => <LucideSvg><path d=\"m9 11-6 6v3h9l3-3\" /><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\" /></LucideSvg>;\nexport const LinkIcon = () => <LucideSvg><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\" /></LucideSvg>;\nexport const ImageIcon = () => <LucideSvg><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" /><circle cx=\"9\" cy=\"9\" r=\"2\" /><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" /></LucideSvg>;\nexport const AlignLeftIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\" /><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\" /></LucideSvg>;\nexport const AlignCenterIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"21\" y1=\"12\" x2=\"3\" y2=\"12\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" /><line x1=\"17\" y1=\"12\" x2=\"7\" y2=\"12\" /></LucideSvg>;\nexport const AlignRightIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" /><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" /></LucideSvg>;\nexport const AlignJustifyIcon = () => <LucideSvg><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /><line x1=\"21\" y1=\"12\" x2=\"3\" y2=\"12\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" /></LucideSvg>;\nexport const TableIcon = () => <LucideSvg><path d=\"M3 3h18v18H3z\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /><path d=\"M15 3v18\" /></LucideSvg>;\nexport const AddRowBeforeIcon = () => <LucideSvg><path d=\"M3 13v5a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5\" /><path d=\"M3 9h18\" /><path d=\"M12 2v8\" /><path d=\"m9 5 3-3 3 3\" /></LucideSvg>;\nexport const AddRowAfterIcon = () => <LucideSvg><path d=\"M3 11V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5\" /><path d=\"M3 15h18\" /><path d=\"M12 22v-8\" /><path d=\"m9 19 3 3 3-3\" /></LucideSvg>;\nexport const DeleteRowIcon = () => <LucideSvg><path d=\"M3 11V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5\" /><path d=\"M3 15h18\" /><line x1=\"18\" y1=\"20\" x2=\"12\" y2=\"20\" /></LucideSvg>;\nexport const AddColBeforeIcon = () => <LucideSvg><path d=\"M13 3h5a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-5\" /><path d=\"M9 3v18\" /><path d=\"M2 12h8\" /><path d=\"m5 9-3 3 3 3\" /></LucideSvg>;\nexport const AddColAfterIcon = () => <LucideSvg><path d=\"M11 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\" /><path d=\"M15 3v18\" /><path d=\"M22 12h-8\" /><path d=\"m19 9 3 3-3 3\" /></LucideSvg>;\nexport const DeleteColIcon = () => <LucideSvg><path d=\"M11 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5\" /><path d=\"M15 3v18\" /><line x1=\"20\" y1=\"18\" x2=\"20\" y2=\"12\" /></LucideSvg>;\nexport const MergeCellsIcon = () => <LucideSvg><path d=\"M15 3v18\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /></LucideSvg>;\nexport const SplitCellIcon = () => <LucideSvg><path d=\"M3 3h18v18H3z\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /><path d=\"M15 3v18\" /></LucideSvg>;\nexport const DeleteTableIcon = () => <LucideSvg><path d=\"M3 3h18v18H3z\" /><path d=\"M3 9h18\" /><path d=\"M3 15h18\" /><path d=\"M9 3v18\" /><path d=\"M15 3v18\" /><line x1=\"18\" y1=\"18\" x2=\"12\" y2=\"12\" /></LucideSvg>;\nexport const ClearIcon = () => <LucideSvg><path d=\"M18 6L6 18\" /><path d=\"M6 6l12 12\" /></LucideSvg>;\nexport const SubmitIcon = () => <LucideSvg><polyline points=\"20 6 9 17 4 12\" /></LucideSvg>;\nexport const AttachIcon = () => <LucideSvg><path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.82-2.82l8.49-8.48\" /></LucideSvg>;\n\nexport const SuperscriptIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"4\" y=\"17\" fontSize=\"16\" fontWeight=\"500\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'Georgia, serif', fontStyle: 'italic' }}>X</text>\n <text x=\"13\" y=\"11\" fontSize=\"10\" fontWeight=\"600\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'sans-serif' }}>2</text>\n </svg>\n);\n\nexport const SubscriptIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"4\" y=\"14\" fontSize=\"16\" fontWeight=\"500\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'Georgia, serif', fontStyle: 'italic' }}>X</text>\n <text x=\"13\" y=\"19\" fontSize=\"10\" fontWeight=\"600\" fill=\"currentColor\" stroke=\"none\" style={{ fontFamily: 'sans-serif' }}>2</text>\n </svg>\n);\n\nexport const HeadingIcon = () => (\n <LucideSvg>\n <path d=\"M6 12h12\" />\n <path d=\"M6 20V4\" />\n <path d=\"M18 20V4\" />\n </LucideSvg>\n);\n\nexport const FontSizeIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m3 7 5-5 5 5\" />\n <path d=\"M8 2v10\" />\n <path d=\"m21 17-5 5-5-5\" />\n <path d=\"M16 12v10\" />\n <path d=\"M3 13h18\" />\n </svg>\n);\n\nexport const FontFamilyIcon = () => (\n <LucideSvg>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\n </LucideSvg>\n);\n\nexport const TextColorIcon = () => (\n <LucideSvg>\n <path d=\"M4 20h16\" />\n <path d=\"m6 16 6-12 6 12\" />\n <path d=\"M8 12h8\" />\n </LucideSvg>\n);\n\nexport const EraserIcon = () => (\n <LucideSvg>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.9-9.9c1-1 2.5-1 3.4 0l4.4 4.4c1 1 1 2.5 0 3.4L10.8 21z\" />\n <path d=\"m22 21h-8\" />\n <path d=\"m5 11 9 9\" />\n </LucideSvg>\n);\n"],"mappings":"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","names":["import_react","import_extension_text_style","import_core","import_extension_text_style","StarterKit","Link","Underline","Image","FontFamily","Superscript","Subscript","TextAlign","Placeholder","TableHeader","import_jsx_runtime","React","_","import_jsx_runtime","text","React","editor"]}