tiptap-editor-custom-stg 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +29 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -93,6 +93,7 @@ function MyComponent() {
|
|
|
93
93
|
| `onRegisterReset` | `(callback) => () => void` | — | — | Register a reset callback, returns cleanup fn |
|
|
94
94
|
| `placeholder` | `string` | — | `'Start typing...'` | Editor placeholder text. This value is passed into Tiptap's `Placeholder` extension and is shown when the editor is empty |
|
|
95
95
|
| `toolbarConfig` | `{ groups?: ToolbarGroup[]; showDividers?: boolean }` | — | default toolbar config | Customize which toolbar groups are shown and whether dividers are rendered |
|
|
96
|
+
| `customValidationFn` | `(files: File[]) => Promise<boolean>` | — | — | Custom async function to validate selected files before upload. Return `true` to proceed or `false` to abort. |
|
|
96
97
|
|
|
97
98
|
### Styling
|
|
98
99
|
|
package/dist/index.d.mts
CHANGED
|
@@ -26,6 +26,7 @@ interface TiptapEditorProps {
|
|
|
26
26
|
onRegisterReset?: (resetCallback: (newContent: string) => void) => (() => void);
|
|
27
27
|
placeholder?: string;
|
|
28
28
|
toolbarConfig?: ToolbarConfig;
|
|
29
|
+
customValidationFn?: (files: File[]) => Promise<boolean>;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
declare const TiptapEditor: React.FC<TiptapEditorProps>;
|
package/dist/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ interface TiptapEditorProps {
|
|
|
26
26
|
onRegisterReset?: (resetCallback: (newContent: string) => void) => (() => void);
|
|
27
27
|
placeholder?: string;
|
|
28
28
|
toolbarConfig?: ToolbarConfig;
|
|
29
|
+
customValidationFn?: (files: File[]) => Promise<boolean>;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
declare const TiptapEditor: React.FC<TiptapEditorProps>;
|
package/dist/index.js
CHANGED
|
@@ -891,7 +891,8 @@ var TiptapEditor = ({
|
|
|
891
891
|
onLoadingChange,
|
|
892
892
|
onRegisterReset,
|
|
893
893
|
placeholder = "Enter content here...",
|
|
894
|
-
toolbarConfig
|
|
894
|
+
toolbarConfig,
|
|
895
|
+
customValidationFn
|
|
895
896
|
}) => {
|
|
896
897
|
const alertFn = onAlert || ((msg) => window.alert(msg));
|
|
897
898
|
const loadingChangeFn = onLoadingChange || (() => {
|
|
@@ -1052,10 +1053,16 @@ var TiptapEditor = ({
|
|
|
1052
1053
|
alertFn("Upload function not provided");
|
|
1053
1054
|
return;
|
|
1054
1055
|
}
|
|
1056
|
+
if (customValidationFn) {
|
|
1057
|
+
const validateResult = await customValidationFn(files);
|
|
1058
|
+
if (!validateResult) {
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1055
1062
|
activeUploadsRef.current += 1;
|
|
1056
1063
|
loadingChangeFn(true);
|
|
1057
1064
|
try {
|
|
1058
|
-
await Promise.all(
|
|
1065
|
+
const uploadResults = await Promise.all(
|
|
1059
1066
|
files.map(async (file) => {
|
|
1060
1067
|
const url = await uploadFileToCOS(
|
|
1061
1068
|
file,
|
|
@@ -1066,9 +1073,14 @@ var TiptapEditor = ({
|
|
|
1066
1073
|
loadingChangeFn,
|
|
1067
1074
|
true
|
|
1068
1075
|
);
|
|
1069
|
-
|
|
1076
|
+
return { url, name: file.name };
|
|
1070
1077
|
})
|
|
1071
1078
|
);
|
|
1079
|
+
editor.chain().focus().run();
|
|
1080
|
+
const imagesHtml = uploadResults.map(
|
|
1081
|
+
(res) => `<img src="${res.url}" alt="${res.name}" />`
|
|
1082
|
+
).join(" ");
|
|
1083
|
+
editor.chain().insertContent(imagesHtml).run();
|
|
1072
1084
|
} catch (err) {
|
|
1073
1085
|
alertFn(err.message || "Image upload failed");
|
|
1074
1086
|
} finally {
|
|
@@ -1081,7 +1093,7 @@ var TiptapEditor = ({
|
|
|
1081
1093
|
}
|
|
1082
1094
|
}
|
|
1083
1095
|
},
|
|
1084
|
-
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]
|
|
1096
|
+
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]
|
|
1085
1097
|
);
|
|
1086
1098
|
const handleAttachFileChange = (0, import_react.useCallback)(
|
|
1087
1099
|
async (e) => {
|
|
@@ -1092,10 +1104,16 @@ var TiptapEditor = ({
|
|
|
1092
1104
|
alertFn("Upload function not provided");
|
|
1093
1105
|
return;
|
|
1094
1106
|
}
|
|
1107
|
+
if (customValidationFn) {
|
|
1108
|
+
const validateResult = await customValidationFn(files);
|
|
1109
|
+
if (!validateResult) {
|
|
1110
|
+
return;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1095
1113
|
activeUploadsRef.current += 1;
|
|
1096
1114
|
loadingChangeFn(true);
|
|
1097
1115
|
try {
|
|
1098
|
-
await Promise.all(
|
|
1116
|
+
const uploadResults = await await Promise.all(
|
|
1099
1117
|
files.map(async (file) => {
|
|
1100
1118
|
const url = await uploadFileToCOS(
|
|
1101
1119
|
file,
|
|
@@ -1106,11 +1124,13 @@ var TiptapEditor = ({
|
|
|
1106
1124
|
loadingChangeFn,
|
|
1107
1125
|
true
|
|
1108
1126
|
);
|
|
1109
|
-
|
|
1110
|
-
`<a href="${url}" target="_blank" rel="noopener noreferrer" data-attachment="true">${file.name}</a> `
|
|
1111
|
-
).run();
|
|
1127
|
+
return { url, name: file.name };
|
|
1112
1128
|
})
|
|
1113
1129
|
);
|
|
1130
|
+
const attachmentsHtml = uploadResults.map(
|
|
1131
|
+
(res) => `<a href="${res.url}" target="_blank" rel="noopener noreferrer" data-attachment="true">${res.name}</a>`
|
|
1132
|
+
).join(" ");
|
|
1133
|
+
editor.chain().focus().insertContent(attachmentsHtml).run();
|
|
1114
1134
|
} catch (err) {
|
|
1115
1135
|
alertFn(err.message || "Attachment upload failed");
|
|
1116
1136
|
} finally {
|
|
@@ -1123,7 +1143,7 @@ var TiptapEditor = ({
|
|
|
1123
1143
|
}
|
|
1124
1144
|
}
|
|
1125
1145
|
},
|
|
1126
|
-
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]
|
|
1146
|
+
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]
|
|
1127
1147
|
);
|
|
1128
1148
|
const handleLinkClick = (0, import_react.useCallback)(() => {
|
|
1129
1149
|
if (!editor || isReadOnly) 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/Icons.tsx","../src/ToolbarGroups.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 } 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 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}) => {\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 const html = editor?.getHTML();\n if (html) {\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 = editor.getHTML();\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\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 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 editor.chain().focus().setImage({ src: url, alt: file.name }).run();\n })\n );\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 = editor.getHTML();\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]\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\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 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 // Insert a hyperlink styled as an attachment with a marker attribute for CSS styling\n editor\n .chain()\n .focus()\n .insertContent(\n `<a href=\"${url}\" target=\"_blank\" rel=\"noopener noreferrer\" data-attachment=\"true\">${file.name}</a> `\n )\n .run();\n })\n );\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 = editor.getHTML();\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]\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 editor.chain().focus().extendMarkRange('link').setLink({ href: formattedUrl }).run();\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 '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 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: false }),\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';\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","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=\"Bullet 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=\"Bullet 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\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 <div 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\">\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\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAsD;AACtD,IAAAA,gBAAyC;;;ACDzC,yBAAuB;AACvB,6BAAkB;AAClB,4BAAiB;AACjB,iCAAsB;AACtB,IAAAC,+BAA0B;AAC1B,mCAAuB;AACvB,6BAAsB;AACtB,mCAAwB;AACxB,iCAAsB;AACtB,kCAAsB;AACtB,mCAAwB;AACxB,6BAAsB;AACtB,iCAAyB;AACzB,oCAAwB;AACxB,kCAA0B;;;ACd1B,kBAA0B;AAC1B,kCAAO;AAiBA,IAAM,WAAW,sBAAU,OAAO;AAAA,EACrC,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,WAAW;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,UAAU;AAAA,YACN,SAAS;AAAA,YACT,WAAW,CAAC,YAAY,QAAQ,MAAM,SAAS,QAAQ,UAAU,EAAE;AAAA,YACnE,YAAY,CAAC,eAAe;AACxB,kBAAI,CAAC,WAAW,UAAU;AACtB,uBAAO,CAAC;AAAA,cACZ;AAEA,qBAAO;AAAA,gBACH,OAAO,cAAc,WAAW,QAAQ;AAAA,cAC5C;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,aACI,CAAC,aACD,CAAC,EAAE,MAAM,MAAM;AAEX,cAAM,UAAkC;AAAA,UACpC,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,QAAQ;AAAA,QACZ;AAEA,cAAM,QAAQ,QAAQ,QAAQ,KAAK;AACnC,eAAO,MAAM,EAAE,QAAQ,aAAa,EAAE,UAAU,MAAM,CAAC,EAAE,IAAI;AAAA,MACjE;AAAA,MACJ,eACI,MACA,CAAC,EAAE,MAAM,MAAM;AACX,eAAO,MAAM,EAAE,QAAQ,aAAa,EAAE,UAAU,KAAK,CAAC,EAAE,qBAAqB,EAAE,IAAI;AAAA,MACvF;AAAA,IACR;AAAA,EACJ;AACJ,CAAC;;;ACzED,IAAAC,eAA0B;AAC1B,IAAAC,+BAAO;AAiBA,IAAM,kBAAkB,uBAAU,OAAO;AAAA,EAC5C,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,WAAW;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,iBAAiB;AAAA,YACb,SAAS;AAAA,YACT,WAAW,CAAC,YAAY,QAAQ,MAAM,gBAAgB,QAAQ,UAAU,EAAE;AAAA,YAC1E,YAAY,CAAC,eAAe;AACxB,kBAAI,CAAC,WAAW,iBAAiB;AAC7B,uBAAO,CAAC;AAAA,cACZ;AAEA,qBAAO;AAAA,gBACH,OAAO,qBAAqB,WAAW,eAAe;AAAA,cAC1D;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,oBACI,CAAC,oBACD,CAAC,EAAE,MAAM,MAAM;AACX,eAAO,MAAM,EAAE,QAAQ,aAAa,EAAE,gBAAgB,CAAC,EAAE,IAAI;AAAA,MACjE;AAAA,MACJ,sBACI,MACA,CAAC,EAAE,MAAM,MAAM;AACX,eAAO,MAAM,EAAE,QAAQ,aAAa,EAAE,iBAAiB,KAAK,CAAC,EAAE,qBAAqB,EAAE,IAAI;AAAA,MAC9F;AAAA,IACR;AAAA,EACJ;AACJ,CAAC;;;AF9CM,IAAM,yBAAyB,CAAC,cAAc,4BAA4B;AAAA,EAC7E,mBAAAC,QAAW,UAAU;AAAA,IACjB,SAAS,EAAE,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,EAC1C,CAAC;AAAA,EACD,sBAAAC,QAAK,UAAU;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB,EAAE,KAAK,sBAAsB;AAAA,EACjD,CAAC;AAAA,EACD,2BAAAC;AAAA,EACA,uBAAAC,QAAM,UAAU,EAAE,QAAQ,OAAO,aAAa,MAAM,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,4BAAAC,QAAU,UAAU,EAAE,OAAO,CAAC,WAAW,WAAW,EAAE,CAAC;AAAA,EACvD,6BAAAC,QAAY,UAAU,EAAE,YAAY,CAAC;AAAA,EACrC,6BAAM,UAAU;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB;AAAA,MACZ,OAAO;AAAA,IACX;AAAA,EACJ,CAAC;AAAA,EACD;AAAA,EACA,8BAAAC;AAAA,EACA;AACJ;;;AG3CA,eAAsB,gBAClB,MACA,QACA,cACA,eACA,WACA,iBACA,uBAAgC,OACjB;AAEf,mBAAiB,aAAa,cAAc,WAAW,IAAI;AAC3D,MAAI,CAAC,qBAAsB,oDAAkB;AAE7C,MAAI;AACA,UAAM,MAAM,MAAM,aAAa,MAAM,MAAM;AAC3C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gCAAgC;AAC1D,WAAO;AAAA,EACX,UAAE;AAEE,QAAI,CAAC,qBAAsB,oDAAkB;AAC7C,qBAAiB,aAAa,cAAc,WAAW,KAAK;AAAA,EAChE;AACJ;;;ACxBO,IAAM,gBAAgB;AAAA,EACzB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC5C;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC5C;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAChD;AAEO,IAAM,gBAAgB;AAAA,EACzB,EAAE,OAAO,WAAW,OAAO,GAAG;AAAA,EAC9B,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,uBAAuB,OAAO,sBAAsB;AAAA,EAC7D,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,EACrD,EAAE,OAAO,gBAAgB,OAAO,eAAe;AAAA,EAC/C,EAAE,OAAO,WAAW,OAAO,UAAU;AACzC;AAEO,IAAM,aAAa;AAAA,EACtB,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,WAAW,OAAO,GAAG;AAAA,EAC9B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AACnC;AAEO,IAAM,mBAAmB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;AC9BI;AADJ,IAAM,YAAY,CAAC,EAAE,SAAS,MAC1B,4CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,OAAM,8BACzH,UACL;AAGG,IAAM,WAAW,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,6CAA4C;AAAA,GAAE;AAC7G,IAAM,WAAW,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,cAAa;AAAA,EAAE,4CAAC,UAAK,GAAE,6CAA4C;AAAA,GAAE;AAC/G,IAAM,iBAAiB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,QAAO,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,QAAO,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,QAAO,IAAG,MAAK;AAAA,GAAE;AACpR,IAAM,kBAAkB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,kCAAiC;AAAA,GAAE;AACnP,IAAM,iBAAiB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,GAAE;AAC1H,IAAM,WAAW,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,4BAA2B;AAAA,EAAE,4CAAC,UAAK,GAAE,6BAA4B;AAAA,GAAE;AAC7G,IAAM,aAAa,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,GAAE;AACvJ,IAAM,aAAa,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,4BAA2B;AAAA,EAAE,4CAAC,UAAK,GAAE,0BAAyB;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,GAAE;AACnJ,IAAM,gBAAgB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,2BAA0B;AAAA,EAAE,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,GAAE;AAClH,IAAM,WAAW,MAAM,6CAAC,aAAU;AAAA,8CAAC,cAAS,QAAO,oBAAmB;AAAA,EAAE,4CAAC,cAAS,QAAO,iBAAgB;AAAA,GAAE;AAC3G,IAAM,gBAAgB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,qBAAoB;AAAA,EAAE,4CAAC,UAAK,GAAE,gEAA+D;AAAA,GAAE;AAC9I,IAAM,WAAW,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,+DAA8D;AAAA,EAAE,4CAAC,UAAK,GAAE,gEAA+D;AAAA,GAAE;AACnL,IAAM,YAAY,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,EAAE,4CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,EAAE,4CAAC,UAAK,GAAE,6CAA4C;AAAA,GAAE;AAChL,IAAM,gBAAgB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,GAAE;AAC1J,IAAM,kBAAkB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,GAAE;AACnM,IAAM,iBAAiB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,GAAE;AAE3J,IAAM,YAAY,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,iBAAgB;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,GAAE;AAC/I,IAAM,mBAAmB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,6CAA4C;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,gBAAe;AAAA,GAAE;AACjK,IAAM,kBAAkB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,4CAA2C;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,aAAY;AAAA,EAAE,4CAAC,UAAK,GAAE,iBAAgB;AAAA,GAAE;AACnK,IAAM,gBAAgB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,4CAA2C;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,GAAE;AACzJ,IAAM,mBAAmB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,6CAA4C;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,gBAAe;AAAA,GAAE;AACjK,IAAM,kBAAkB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,4CAA2C;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,aAAY;AAAA,EAAE,4CAAC,UAAK,GAAE,iBAAgB;AAAA,GAAE;AACnK,IAAM,gBAAgB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,4CAA2C;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,GAAE;AACzJ,IAAM,iBAAiB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,GAAE;AAC1H,IAAM,gBAAgB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,iBAAgB;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,GAAE;AACnJ,IAAM,kBAAkB,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,iBAAgB;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,GAAE,WAAU;AAAA,EAAE,4CAAC,UAAK,GAAE,YAAW;AAAA,EAAE,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,GAAE;AAC7L,IAAM,YAAY,MAAM,6CAAC,aAAU;AAAA,8CAAC,UAAK,GAAE,cAAa;AAAA,EAAE,4CAAC,UAAK,GAAE,cAAa;AAAA,GAAE;AACjF,IAAM,aAAa,MAAM,4CAAC,aAAU,sDAAC,cAAS,QAAO,kBAAiB,GAAE;AACxE,IAAM,aAAa,MAAM,4CAAC,aAAU,sDAAC,UAAK,GAAE,oHAAmH,GAAE;AAwBjK,IAAM,eAAe,MACxB,6CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,OAAM,8BAC1H;AAAA,8CAAC,UAAK,GAAE,gBAAe;AAAA,EACvB,4CAAC,UAAK,GAAE,WAAU;AAAA,EAClB,4CAAC,UAAK,GAAE,kBAAiB;AAAA,EACzB,4CAAC,UAAK,GAAE,aAAY;AAAA,EACpB,4CAAC,UAAK,GAAE,YAAW;AAAA,GACvB;AAGG,IAAM,iBAAiB,MAC1B,6CAAC,aACG;AAAA,8CAAC,cAAS,QAAO,qBAAoB;AAAA,EACrC,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,EACrC,4CAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,GACzC;AAGG,IAAM,gBAAgB,MACzB,6CAAC,aACG;AAAA,8CAAC,UAAK,GAAE,YAAW;AAAA,EACnB,4CAAC,UAAK,GAAE,mBAAkB;AAAA,EAC1B,4CAAC,UAAK,GAAE,WAAU;AAAA,GACtB;AAGG,IAAM,aAAa,MACtB,6CAAC,aACG;AAAA,8CAAC,UAAK,GAAE,2FAA0F;AAAA,EAClG,4CAAC,UAAK,GAAE,aAAY;AAAA,EACpB,4CAAC,UAAK,GAAE,aAAY;AAAA,GACxB;;;ACxCA,IAAAC,sBAAA;AADG,IAAM,eAAqC,CAAC,EAAE,QAAQ,WAAW,MACpE,8EACI;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,MACjD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU,cAAc,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,MAC3C,cAAW;AAAA,MAEX,uDAAC,YAAS;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,MACjD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU,cAAc,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,MAC3C,cAAW;AAAA,MAEX,uDAAC,YAAS;AAAA;AAAA,EACd;AAAA,GACJ;AA8CG,IAAM,YAA0C,CAAC,EAAE,QAAQ,YAAY,UAAU,UAAU,QAAQ,MACtG,8CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,2BAA2B,WAAW,cAAc,EAAE;AAAA,MACjE,cAAW;AAAA,MAEX;AAAA,qDAAC,kBAAe;AAAA,QAChB,6CAAC,SAAI,WAAU,kBAAiB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAClE,uDAAC,UAAK,GAAE,kBAAiB,MAAK,gBAAe,GACjD;AAAA;AAAA;AAAA,EACJ;AAAA,EACC,YAAY,CAAC,cACV,6CAAC,SAAI,WAAU,oBACV,wBAAc,IAAI,CAAC,SAAS;AACzB,UAAM,WAAW,OAAO,cAAc,WAAW,EAAE,eAAe,KAAK;AACvE,WACI;AAAA,MAAC;AAAA;AAAA,QAEG,WAAW,eAAe,WAAW,cAAc,EAAE;AAAA,QACrD,OAAO,EAAE,YAAY,KAAK,SAAS,UAAU;AAAA,QAC7C,SAAS,MAAM;AACX,cAAI,KAAK,OAAO;AACZ,mBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,KAAK,EAAE,IAAI;AAAA,UACzD,OAAO;AACH,mBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,UACjD;AACA,kBAAQ;AAAA,QACZ;AAAA,QAEC,eAAK;AAAA;AAAA,MAZD,KAAK;AAAA,IAad;AAAA,EAER,CAAC,GACL;AAAA,GAER;AAGG,IAAM,gBAA8C,CAAC,EAAE,QAAQ,YAAY,UAAU,UAAU,QAAQ,MAC1G,8CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,2BAA2B,WAAW,cAAc,EAAE;AAAA,MACjE,cAAW;AAAA,MAEX;AAAA,qDAAC,gBAAa;AAAA,QACd,6CAAC,SAAI,WAAU,kBAAiB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAClE,uDAAC,UAAK,GAAE,kBAAiB,MAAK,gBAAe,GACjD;AAAA;AAAA;AAAA,EACJ;AAAA,EACC,YAAY,CAAC,cACV,6CAAC,SAAI,WAAU,oBACV,qBAAW,IAAI,CAAC,SAAS;AACtB,UAAM,cAAc,OAAO,cAAc,WAAW,EAAE;AACtD,UAAM,UAAkC;AAAA,MACpC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,IACZ;AACA,UAAM,cAAc,QAAQ,KAAK,KAAK,KAAK,KAAK,SAAS;AACzD,UAAM,WAAY,CAAC,eAAe,CAAC,KAAK,SAAU,gBAAgB;AAElE,WACI;AAAA,MAAC;AAAA;AAAA,QAEG,WAAW,eAAe,WAAW,cAAc,EAAE;AAAA,QACrD,SAAS,MAAM;AACX,cAAI,KAAK,OAAO;AACZ,mBAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,KAAK,EAAE,IAAI;AAAA,UACvD,OAAO;AACH,mBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;AAAA,UAC/C;AACA,kBAAQ;AAAA,QACZ;AAAA,QAEC,eAAK;AAAA;AAAA,MAXD,KAAK;AAAA,IAYd;AAAA,EAER,CAAC,GACL;AAAA,GAER;AAGG,IAAM,iBAA+C,CAAC,EAAE,QAAQ,YAAY,UAAU,UAAU,QAAQ,MAC3G,8CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,2BAA2B,WAAW,cAAc,EAAE;AAAA,MACjE,cAAW;AAAA,MAEX;AAAA,qDAAC,iBAAc;AAAA,QACf,6CAAC,SAAI,WAAU,kBAAiB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAClE,uDAAC,UAAK,GAAE,kBAAiB,MAAK,gBAAe,GACjD;AAAA;AAAA;AAAA,EACJ;AAAA,EACC,YAAY,CAAC,cACV,8CAAC,SAAI,WAAU,uBACX;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MAAM;AACX,iBAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AACxC,kBAAQ;AAAA,QACZ;AAAA,QAEA;AAAA,uDAAC,cAAW;AAAA,UAAE;AAAA;AAAA;AAAA,IAClB;AAAA,IACA,6CAAC,SAAI,WAAU,cACV,wBAAc,IAAI,CAAC,UAChB;AAAA,MAAC;AAAA;AAAA,QAEG,WAAW,gBAAgB,OAAO,SAAS,aAAa,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE;AAAA,QACrF,OAAO,EAAE,iBAAiB,MAAM;AAAA,QAChC,SAAS,MAAM;AACX,iBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,IAAI;AAC3C,kBAAQ;AAAA,QACZ;AAAA;AAAA,MANK;AAAA,IAOT,CACH,GACL;AAAA,KACJ;AAAA,GAER;AAGG,IAAM,iBAA+C,CAAC,EAAE,QAAQ,YAAY,UAAU,UAAU,QAAQ,MAC3G,8CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,2BAA2B,WAAW,cAAc,EAAE;AAAA,MACjE,cAAW;AAAA,MAEX;AAAA,qDAAC,iBAAc;AAAA,QACf,6CAAC,SAAI,WAAU,kBAAiB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAClE,uDAAC,UAAK,GAAE,kBAAiB,MAAK,gBAAe,GACjD;AAAA;AAAA;AAAA,EACJ;AAAA,EACC,YAAY,CAAC,cACV,8CAAC,SAAI,WAAU,uBACX;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MAAM;AACX,iBAAO,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI;AAClD,kBAAQ;AAAA,QACZ;AAAA,QAEA;AAAA,uDAAC,cAAW;AAAA,UAAE;AAAA;AAAA;AAAA,IAClB;AAAA,IACA,6CAAC,SAAI,WAAU,cACV,wBAAc,IAAI,CAAC,UAChB;AAAA,MAAC;AAAA;AAAA,QAEG,WAAW,gBAAgB,OAAO,SAAS,aAAa,EAAE,iBAAiB,MAAM,CAAC,IAAI,cAAc,EAAE;AAAA,QACtG,OAAO,EAAE,iBAAiB,MAAM;AAAA,QAChC,SAAS,MAAM;AACX,iBAAO,MAAM,EAAE,MAAM,EAAE,mBAAmB,KAAK,EAAE,IAAI;AACrD,kBAAQ;AAAA,QACZ;AAAA;AAAA,MANK;AAAA,IAOT,CACH,GACL;AAAA,KACJ;AAAA,GAER;AAGG,IAAM,YAAkC,CAAC,EAAE,QAAQ,WAAW,MACjE,8EACI;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,MAC7D,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,YAAY,IAAI,cAAc;AAAA,MACzD,cAAW;AAAA,MAEX,uDAAC,kBAAe;AAAA;AAAA,EACpB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,MAC9D,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,aAAa,IAAI,cAAc;AAAA,MAC1D,cAAW;AAAA,MAEX,uDAAC,mBAAgB;AAAA;AAAA,EACrB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,MAC7D,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,YAAY,IAAI,cAAc;AAAA,MACzD,cAAW;AAAA,MAEX,uDAAC,kBAAe;AAAA;AAAA,EACpB;AAAA,GACJ;AAGG,IAAM,cAAoC,CAAC,EAAE,QAAQ,WAAW,MACnE,8EACI;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,MACvD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,MAAM,IAAI,cAAc;AAAA,MACnD,cAAW;AAAA,MAEX,uDAAC,YAAS;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,MACzD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,QAAQ,IAAI,cAAc;AAAA,MACrD,cAAW;AAAA,MAEX,uDAAC,cAAW;AAAA;AAAA,EAChB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,MACzD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,QAAQ,IAAI,cAAc;AAAA,MACrD,cAAW;AAAA,MAEX,uDAAC,cAAW;AAAA;AAAA,EAChB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,MAC5D,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,WAAW,IAAI,cAAc;AAAA,MACxD,cAAW;AAAA,MAEX,uDAAC,iBAAc;AAAA;AAAA,EACnB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,MACvD,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,MAAM,IAAI,cAAc;AAAA,MACnD,cAAW;AAAA,MAEX,uDAAC,YAAS;AAAA;AAAA,EACd;AAAA,GACJ;AAGG,IAAM,YAIR,CAAC,EAAE,QAAQ,YAAY,UAAU,UAAU,SAAS,SAAS,iBAAiB,SAAS,MACxF,8CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,MAAM,IAAI,cAAc;AAAA,MACnD,cAAW;AAAA,MAEX,uDAAC,YAAS;AAAA;AAAA,EACd;AAAA,EACC,YAAY,CAAC,cACV,8CAAC,SAAI,WAAU,oBACX;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,QAC/C,WAAW,CAAC,MAAM;AACd,cAAI,EAAE,QAAQ,QAAS,UAAS;AAChC,cAAI,EAAE,QAAQ,SAAU,SAAQ;AAAA,QACpC;AAAA,QACA,WAAS;AAAA;AAAA,IACb;AAAA,IACA,6CAAC,YAAO,SAAS,UAAU,OAAM,SAAQ,WAAU,mBAC/C,uDAAC,cAAW,GAChB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACG,SAAS,MAAM;AACX,iBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAC/D,kBAAQ;AAAA,QACZ;AAAA,QACA,OAAM;AAAA,QACN,WAAU;AAAA,QAEV,uDAAC,aAAU;AAAA;AAAA,IACf;AAAA,KACJ;AAAA,GAER;AA4BG,IAAM,iBAAuC,CAAC,EAAE,QAAQ,WAAW,MACtE,8EACI;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI;AAAA,MAC/D,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,EAAE,WAAW,OAAO,CAAC,IAAI,cAAc;AAAA,MAClE,cAAW;AAAA,MAEX,uDAAC,iBAAc;AAAA;AAAA,EACnB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,QAAQ,EAAE,IAAI;AAAA,MACjE,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,EAAE,WAAW,SAAS,CAAC,IAAI,cAAc;AAAA,MACpE,cAAW;AAAA,MAEX,uDAAC,mBAAgB;AAAA;AAAA,EACrB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,OAAO,EAAE,IAAI;AAAA,MAChE,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,OAAO,SAAS,EAAE,WAAW,QAAQ,CAAC,IAAI,cAAc;AAAA,MACnE,cAAW;AAAA,MAEX,uDAAC,kBAAe;AAAA;AAAA,EACpB;AAAA,GACJ;AAGG,IAAM,aAGR,CAAC,EAAE,QAAQ,YAAY,UAAU,UAAU,SAAS,gBAAgB,YAAY,MACjF,8CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc,GACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,WAAW,2BAA2B,OAAO,SAAS,OAAO,IAAI,cAAc,EAAE;AAAA,MACjF,cAAW;AAAA,MAEX;AAAA,qDAAC,aAAU;AAAA,QACX,6CAAC,SAAI,WAAU,kBAAiB,SAAQ,aAAY,OAAM,MAAK,QAAO,MAClE,uDAAC,UAAK,GAAE,kBAAiB,MAAK,gBAAe,GACjD;AAAA;AAAA;AAAA,EACJ;AAAA,EACC,YAAY,CAAC,cACV,6CAAC,SAAI,WAAU,qBACV,WAAC,OAAO,SAAS,OAAO,IACrB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,cAAc,MAAM,YAAY,GAAG,CAAC;AAAA,MAEpC;AAAA,qDAAC,SAAI,WAAU,qBACV,WAAC,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACpB,6CAAC,SAAY,WAAU,YAClB,WAAC,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,CAACC,IAAG,MACpB;AAAA,UAAC;AAAA;AAAA,YAEG,WAAW,aAAc,IAAI,KAAK,eAAe,QAAQ,IAAI,KAAK,eAAe,OAAQ,cAAc,EAAE;AAAA,YACzG,cAAc,MAAM,YAAY,IAAI,GAAG,IAAI,CAAC;AAAA,YAC5C,SAAS,MAAM;AACX,qBAAO,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,eAAe,KAAK,CAAC,EAAE,IAAI;AAC1F,sBAAQ;AACR,0BAAY,GAAG,CAAC;AAAA,YACpB;AAAA;AAAA,UAPK;AAAA,QAQT,CACH,KAZK,CAaV,CACH,GACL;AAAA,QACA,6CAAC,SAAI,WAAU,oBACV,yBAAe,OAAO,IAAI,GAAG,eAAe,IAAI,MAAM,eAAe,IAAI,KAAK,eACnF;AAAA;AAAA;AAAA,EACJ,IAEA,8CAAC,SAAI,WAAU,mBACX;AAAA,iDAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,GAAG,OAAM,qBAAoB,uDAAC,oBAAiB,GAAE;AAAA,IACrH,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,GAAG,OAAM,oBAAmB,uDAAC,mBAAgB,GAAE;AAAA,IAClH,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,OAAM,iBAAgB,uDAAC,iBAAc,GAAE;AAAA,IAE3G,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,OAAM,kBAAiB,uDAAC,oBAAiB,GAAE;AAAA,IAC/G,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAG,OAAM,iBAAgB,uDAAC,mBAAgB,GAAE;AAAA,IAC5G,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,OAAM,cAAa,uDAAC,iBAAc,GAAE;AAAA,IAErG,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,OAAM,eAAc,uDAAC,kBAAe,GAAE;AAAA,IACxG,6CAAC,YAAO,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,OAAM,cAAa,uDAAC,iBAAc,GAAE;AAAA,IAErG,6CAAC,YAAO,SAAS,MAAM;AACnB,aAAO,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI;AACzC,cAAQ;AAAA,IACZ,GAAG,WAAU,UAAS,OAAM,gBAAe,uDAAC,mBAAgB,GAAE;AAAA,KAClE,GAER;AAAA,GAER;AAGG,IAAM,cAGR,CAAC,EAAE,YAAY,cAAc,cAAc,MAC5C,8EACI;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,cAAW;AAAA,MAEX,uDAAC,aAAU;AAAA;AAAA,EACf;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,MACrC,UAAU;AAAA,MACV,cAAW;AAAA,MAEX,uDAAC,cAAW;AAAA;AAAA,EAChB;AAAA,GACJ;;;AP7NI,IAAAC,sBAAA;AA1VR,IAAM,eAA4C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACJ,MAAM;AAEF,QAAM,UAAU,YAAY,CAAC,QAAgB,OAAO,MAAM,GAAG;AAC7D,QAAM,kBAAkB,oBAAoB,MAAM;AAAA,EAAC;AACnD,QAAM,aAAa,CAAC;AACpB,QAAM,mBAAe,qBAAuB,IAAI;AAChD,QAAM,oBAAgB,qBAAyB,IAAI;AACnD,QAAM,qBAAiB,qBAAyB,IAAI;AACpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,aAAAC,QAAM,SAAS,KAAK;AACtE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,aAAAA,QAAM,SAAS,KAAK;AACtE,QAAM,CAAC,cAAc,eAAe,IAAI,aAAAA,QAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,aAAAA,QAAM,SAAS,KAAK;AAEpE,QAAM,CAAC,cAAc,eAAe,IAAI,aAAAA,QAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,eAAe,gBAAgB,IAAI,aAAAA,QAAM,SAAS,KAAK;AAC9D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,aAAAA,QAAM,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;AAC/E,QAAM,CAAC,SAAS,UAAU,IAAI,aAAAA,QAAM,SAAS,EAAE;AAG/C,QAAM,qBAAiB,qBAAO,KAAK;AAEnC,QAAM,4BAAwB,qBAAO,WAAW,EAAE;AAElD,QAAM,6BAAyB,qBAAO,CAAC;AAEvC,QAAM,uBAAmB,qBAAO,CAAC;AAEjC,QAAM,gBAAgB,aAAAA,QAAM,YAAY,MAAM;AAC1C,yBAAqB,KAAK;AAC1B,yBAAqB,KAAK;AAC1B,oBAAgB,KAAK;AACrB,wBAAoB,KAAK;AAEzB,oBAAgB,KAAK;AACrB,qBAAiB,KAAK;AAAA,EAC1B,GAAG,CAAC,CAAC;AAGL,eAAAA,QAAM,UAAU,MAAM;AAClB,UAAM,qBAAqB,CAAC,UAAsB;AAC9C,UAAI,aAAa,WAAW,CAAC,aAAa,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,sBAAc;AAAA,MAClB;AAAA,IACJ;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM;AACT,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAChE;AAAA,EACJ,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,aAAS,yBAAU;AAAA,IACrB,mBAAmB;AAAA,IACnB,YAAY,uBAAuB,WAAW;AAAA,IAC9C,SAAS,WAAW;AAAA,IACpB,UAAU;AAAA,IACV,SAAS,MAAM;AACX,oBAAc;AAAA,IAClB;AAAA,IACA,mBAAmB,MAAM;AACrB,oBAAc;AAAA,IAClB;AAAA,IACA,aAAa;AAAA;AAAA,MAET,aAAa,CAAC,MAAM,UAAU;AAC1B,YAAI,CAAC,SAAU,QAAO;AACtB,cAAM,gBAAgB,MAAM;AAC5B,YAAI,CAAC,cAAe,QAAO;AAG3B,cAAM,QAAQ,MAAM,KAAK,cAAc,KAAK;AAC5C,cAAM,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,UAAU,iBAAiB,SAAS,KAAK,IAAI,CAAC;AAEtG,YAAI,WAAW,SAAS,GAAG;AACvB,gBAAM,eAAe;AAErB,cAAI,CAAC,cAAc;AACf,oBAAQ,8BAA8B;AACtC,mBAAO;AAAA,UACX;AAGA,2BAAiB,WAAW;AAE5B,0BAAgB,IAAI;AAEpB,kBAAQ;AAAA,YACJ,WAAW,IAAI,CAAC,SAAS;AACrB,oBAAM,OAAO,KAAK,UAAU;AAC5B,kBAAI,CAAC,KAAM,QAAO,QAAQ,QAAQ;AAGlC,qBAAO;AAAA,gBACH;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ,EACK,KAAK,CAAC,QAAQ;AACX,qBAAK;AAAA,kBACD,KAAK,MAAM,GAAG;AAAA,oBACV,KAAK,MAAM,OAAO,MAAM,MAAM,OAAO,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,kBACrE;AAAA,gBACJ;AAAA,cACJ,CAAC,EACA,MAAM,CAAC,QAAe;AACnB,wBAAQ,IAAI,WAAW,qBAAqB;AAAA,cAChD,CAAC;AAAA,YACT,CAAC;AAAA,UACL,EAAE,QAAQ,MAAM;AACZ,6BAAiB,WAAW;AAE5B,4BAAgB,KAAK;AAErB,gBAAI,iBAAiB,YAAY,GAAG;AAChC,oBAAM,OAAO,iCAAQ;AACrB,kBAAI,MAAM;AACN,sCAAsB,UAAU;AAChC,+BAAe,YAAY,WAAW,IAAI;AAAA,cAC9C;AAAA,YACJ;AAAA,UACJ,CAAC;AACD,iBAAO;AAAA,QACX;AACA,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,IACA,UAAU,CAAC,EAAE,QAAAC,QAAO,MAAM;AACtB,YAAM,OAAOA,QAAO,QAAQ;AAC5B,4BAAsB,UAAU;AAChC,6BAAuB,UAAU,KAAK,IAAI;AAE1C,UAAI,iBAAiB,YAAY,GAAG;AAChC,uBAAe,YAAY,WAAW,IAAI;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,8BAAU,MAAM;AACZ,QAAI,CAAC,OAAQ;AAEb,QAAI,CAAC,eAAe,SAAS;AAEzB,qBAAe,UAAU;AACzB,UAAI,WAAW,YAAY,OAAO,QAAQ,GAAG;AACzC,eAAO,SAAS,WAAW,WAAW,IAAI,KAAK;AAC/C,8BAAsB,UAAU;AAAA,MACpC;AACA;AAAA,IACJ;AAIA,QAAI,KAAK,IAAI,IAAI,uBAAuB,UAAU,KAAK;AACnD;AAAA,IACJ;AAKA,QAAI,OAAO,WAAW;AAClB;AAAA,IACJ;AAGA,QAAI,YAAY,sBAAsB,SAAS;AAC3C;AAAA,IACJ;AAGA,QAAI,YAAY,OAAO,QAAQ,GAAG;AAC9B,aAAO,SAAS,WAAW,WAAW,IAAI,KAAK;AAC/C,4BAAsB,UAAU,WAAW;AAAA,IAC/C;AAAA,EACJ,GAAG,CAAC,SAAS,MAAM,CAAC;AAGpB,8BAAU,MAAM;AACZ,QAAI,CAAC,OAAQ;AACb,WAAO,YAAY,QAAQ;AAAA,EAC/B,GAAG,CAAC,UAAU,MAAM,CAAC;AAGrB,8BAAU,MAAM;AACZ,QAAI,CAAC,UAAU,CAAC,gBAAiB;AACjC,UAAM,cAAc,CAAC,eAAuB;AACxC,aAAO,SAAS,WAAW,cAAc,IAAI,KAAK;AAAA,IACtD;AACA,UAAM,aAAa,gBAAgB,WAAW;AAC9C,WAAO,MAAM;AACT,oBAAc,WAAW;AAAA,IAC7B;AAAA,EACJ,GAAG,CAAC,QAAQ,eAAe,CAAC;AAG5B,QAAM,4BAAwB;AAAA,IAC1B,OAAO,MAA2C;AAC9C,YAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC;AAC7C,UAAI,MAAM,WAAW,KAAK,CAAC,OAAQ;AAEnC,QAAE,OAAO,QAAQ;AAEjB,UAAI,CAAC,cAAc;AACf,gBAAQ,8BAA8B;AACtC;AAAA,MACJ;AAGA,uBAAiB,WAAW;AAE5B,sBAAgB,IAAI;AACpB,UAAI;AACA,cAAM,QAAQ;AAAA,UACV,MAAM,IAAI,OAAO,SAAS;AACtB,kBAAM,MAAM,MAAM;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACJ;AACA,mBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,IAAI;AAAA,UACtE,CAAC;AAAA,QACL;AAAA,MACJ,SAAS,KAAU;AACf,gBAAQ,IAAI,WAAW,qBAAqB;AAAA,MAChD,UAAE;AACE,yBAAiB,WAAW;AAE5B,wBAAgB,KAAK;AAErB,YAAI,iBAAiB,YAAY,GAAG;AAChC,gBAAM,OAAO,OAAO,QAAQ;AAC5B,gCAAsB,UAAU;AAChC,yBAAe,YAAY,WAAW,IAAI;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,QAAQ,QAAQ,eAAe,WAAW,aAAa,cAAc,SAAS,eAAe;AAAA,EAClG;AAGA,QAAM,6BAAyB;AAAA,IAC3B,OAAO,MAA2C;AAC9C,YAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC;AAC7C,UAAI,MAAM,WAAW,KAAK,CAAC,OAAQ;AAEnC,QAAE,OAAO,QAAQ;AAEjB,UAAI,CAAC,cAAc;AACf,gBAAQ,8BAA8B;AACtC;AAAA,MACJ;AAGA,uBAAiB,WAAW;AAE5B,sBAAgB,IAAI;AACpB,UAAI;AACA,cAAM,QAAQ;AAAA,UACV,MAAM,IAAI,OAAO,SAAS;AACtB,kBAAM,MAAM,MAAM;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACJ;AAEA,mBACK,MAAM,EACN,MAAM,EACN;AAAA,cACG,YAAY,GAAG,sEAAsE,KAAK,IAAI;AAAA,YAClG,EACC,IAAI;AAAA,UACb,CAAC;AAAA,QACL;AAAA,MACJ,SAAS,KAAU;AACf,gBAAQ,IAAI,WAAW,0BAA0B;AAAA,MACrD,UAAE;AACE,yBAAiB,WAAW;AAE5B,wBAAgB,KAAK;AAErB,YAAI,iBAAiB,YAAY,GAAG;AAChC,gBAAM,OAAO,OAAO,QAAQ;AAC5B,gCAAsB,UAAU;AAChC,yBAAe,YAAY,WAAW,IAAI;AAAA,QAC9C;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,QAAQ,QAAQ,eAAe,WAAW,aAAa,cAAc,SAAS,eAAe;AAAA,EAClG;AAGA,QAAM,sBAAkB,0BAAY,MAAM;AACtC,QAAI,CAAC,UAAU,WAAY;AAC3B,UAAM,YAAY,CAAC;AACnB,kBAAc;AAEd,QAAI,WAAW;AAEX,YAAM,cAAc,OAAO,cAAc,MAAM,EAAE;AACjD,iBAAW,eAAe,EAAE;AAAA,IAChC;AAEA,oBAAgB,SAAS;AAAA,EAC7B,GAAG,CAAC,QAAQ,YAAY,cAAc,aAAa,CAAC;AAEpD,QAAM,iBAAa,0BAAY,MAAM;AACjC,QAAI,CAAC,OAAQ;AACb,QAAI,YAAY,QAAQ,QAAQ,KAAK,MAAM,IAAI;AAC3C,aAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAAA,IACnE,OAAO;AACH,YAAM,eAAe,eAAe,KAAK,OAAO,IAAI,UAAU,WAAW,OAAO;AAChF,aAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC,EAAE,IAAI;AAAA,IACvF;AACA,oBAAgB,KAAK;AAAA,EACzB,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,kBAAkB,MACpB,8EACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAO;AAAA,QACP,UAAQ;AAAA,QACR,WAAU;AAAA,QACV,UAAU;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,MAAK;AAAA,QACL,QAAO;AAAA,QACP,UAAQ;AAAA,QACR,WAAU;AAAA,QACV,UAAU;AAAA;AAAA,IACd;AAAA,KACJ;AAIJ,QAAM,gBAAgC;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAGA,QAAM,iBAAgB,+CAAe,WAAU;AAG/C,QAAM,gBAAe,+CAAe,kBAAiB,SAAY,cAAc,eAAe;AAE9F,QAAM,aAAa,MAAM;AAErB,UAAM,oBAAuD;AAAA,MACzD,SAAS,6CAAC,gBAAa,QAAgB,YAAwB;AAAA,MAC/D,MACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM;AACZ,kBAAM,YAAY,CAAC;AACnB,0BAAc;AACd,4BAAgB,SAAS;AAAA,UAC7B;AAAA,UACA,SAAS,MAAM,gBAAgB,KAAK;AAAA;AAAA,MACxC;AAAA,MAEJ,UACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM;AACZ,kBAAM,YAAY,CAAC;AACnB,0BAAc;AACd,gCAAoB,SAAS;AAAA,UACjC;AAAA,UACA,SAAS,MAAM,oBAAoB,KAAK;AAAA;AAAA,MAC5C;AAAA,MAEJ,WACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM;AACZ,kBAAM,YAAY,CAAC;AACnB,0BAAc;AACd,iCAAqB,SAAS;AAAA,UAClC;AAAA,UACA,SAAS,MAAM,qBAAqB,KAAK;AAAA;AAAA,MAC7C;AAAA,MAEJ,WACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM;AACZ,kBAAM,YAAY,CAAC;AACnB,0BAAc;AACd,iCAAqB,SAAS;AAAA,UAClC;AAAA,UACA,SAAS,MAAM,qBAAqB,KAAK;AAAA;AAAA,MAC7C;AAAA,MAEJ,MAAM,6CAAC,aAAU,QAAgB,YAAwB;AAAA,MACzD,WAAW,6CAAC,kBAAe,QAAgB,YAAwB;AAAA,MACnE,OACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM,CAAC,cAAc,iBAAiB,CAAC,aAAa;AAAA,UAC9D,SAAS,MAAM,iBAAiB,KAAK;AAAA,UACrC;AAAA,UACA,aAAa,CAAC,MAAM,SAAS,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAAA;AAAA,MACjE;AAAA,MAEJ,QAAQ,6CAAC,eAAY,QAAgB,YAAwB;AAAA,MAC7D,MACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS,MAAM,gBAAgB,KAAK;AAAA,UACpC;AAAA,UACA,iBAAiB;AAAA,UACjB,UAAU;AAAA;AAAA,MACd;AAAA,MAEJ,QACI;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,cAAc,MAAG;AAhfrC;AAgfwC,oBAAC,gBAAc,mBAAc,YAAd,mBAAuB;AAAA;AAAA,UAC1D,eAAe,MAAG;AAjftC;AAifyC,oBAAC,gBAAc,oBAAe,YAAf,mBAAwB;AAAA;AAAA;AAAA,MAChE;AAAA,IAER;AAGA,UAAM,eAAe,cAChB,IAAI,CAAC,OAAO,UAAU;AACnB,YAAM,YAAY,kBAAkB,KAAK;AACzC,UAAI,CAAC,UAAW,QAAO;AAGvB,YAAM,UAAU,gBAAgB,QAAQ,IAAI,6CAAC,UAAK,WAAU,mBAAkB,IAAK;AAEnF,aACI,8CAAC,aAAAD,QAAM,UAAN,EACI;AAAA;AAAA,QACA;AAAA,WAFgB,KAGrB;AAAA,IAER,CAAC,EACA,OAAO,OAAO;AAEnB,WACI;AAAA,MAAC;AAAA;AAAA,QACG,WAAW,iBAAiB,aAAa,sBAAsB,EAAE;AAAA,QACjE,MAAK;AAAA,QACL,cAAW;AAAA,QAEV;AAAA;AAAA,IACL;AAAA,EAER;AAEA,SACI,8CAAC,SAAI,IAAI,WAAW,WAAW,wBAAwB,aAAa,eAAe,EAAE,IAAI,KAAK,cACzF;AAAA,oBAAgB;AAAA,IAChB,WAAW;AAAA,IAEZ,6CAAC,SAAI,aAAa,eACd,uDAAC,+BAAc,QAAgB,GACnC;AAAA,KACJ;AAER;AAEA,IAAO,uBAAQ;","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","_","import_jsx_runtime","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/Icons.tsx","../src/ToolbarGroups.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 } 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 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 const html = editor?.getHTML();\n if (html) {\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 = editor.getHTML();\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(' ');\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 = editor.getHTML();\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(' ');\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 = editor.getHTML();\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 editor.chain().focus().extendMarkRange('link').setLink({ href: formattedUrl }).run();\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 '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 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: false }),\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';\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","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=\"Bullet 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=\"Bullet 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\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 <div 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\">\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\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"],"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","_","import_jsx_runtime","React","editor"]}
|
package/dist/index.mjs
CHANGED
|
@@ -848,7 +848,8 @@ var TiptapEditor = ({
|
|
|
848
848
|
onLoadingChange,
|
|
849
849
|
onRegisterReset,
|
|
850
850
|
placeholder = "Enter content here...",
|
|
851
|
-
toolbarConfig
|
|
851
|
+
toolbarConfig,
|
|
852
|
+
customValidationFn
|
|
852
853
|
}) => {
|
|
853
854
|
const alertFn = onAlert || ((msg) => window.alert(msg));
|
|
854
855
|
const loadingChangeFn = onLoadingChange || (() => {
|
|
@@ -1009,10 +1010,16 @@ var TiptapEditor = ({
|
|
|
1009
1010
|
alertFn("Upload function not provided");
|
|
1010
1011
|
return;
|
|
1011
1012
|
}
|
|
1013
|
+
if (customValidationFn) {
|
|
1014
|
+
const validateResult = await customValidationFn(files);
|
|
1015
|
+
if (!validateResult) {
|
|
1016
|
+
return;
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1012
1019
|
activeUploadsRef.current += 1;
|
|
1013
1020
|
loadingChangeFn(true);
|
|
1014
1021
|
try {
|
|
1015
|
-
await Promise.all(
|
|
1022
|
+
const uploadResults = await Promise.all(
|
|
1016
1023
|
files.map(async (file) => {
|
|
1017
1024
|
const url = await uploadFileToCOS(
|
|
1018
1025
|
file,
|
|
@@ -1023,9 +1030,14 @@ var TiptapEditor = ({
|
|
|
1023
1030
|
loadingChangeFn,
|
|
1024
1031
|
true
|
|
1025
1032
|
);
|
|
1026
|
-
|
|
1033
|
+
return { url, name: file.name };
|
|
1027
1034
|
})
|
|
1028
1035
|
);
|
|
1036
|
+
editor.chain().focus().run();
|
|
1037
|
+
const imagesHtml = uploadResults.map(
|
|
1038
|
+
(res) => `<img src="${res.url}" alt="${res.name}" />`
|
|
1039
|
+
).join(" ");
|
|
1040
|
+
editor.chain().insertContent(imagesHtml).run();
|
|
1029
1041
|
} catch (err) {
|
|
1030
1042
|
alertFn(err.message || "Image upload failed");
|
|
1031
1043
|
} finally {
|
|
@@ -1038,7 +1050,7 @@ var TiptapEditor = ({
|
|
|
1038
1050
|
}
|
|
1039
1051
|
}
|
|
1040
1052
|
},
|
|
1041
|
-
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]
|
|
1053
|
+
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]
|
|
1042
1054
|
);
|
|
1043
1055
|
const handleAttachFileChange = useCallback(
|
|
1044
1056
|
async (e) => {
|
|
@@ -1049,10 +1061,16 @@ var TiptapEditor = ({
|
|
|
1049
1061
|
alertFn("Upload function not provided");
|
|
1050
1062
|
return;
|
|
1051
1063
|
}
|
|
1064
|
+
if (customValidationFn) {
|
|
1065
|
+
const validateResult = await customValidationFn(files);
|
|
1066
|
+
if (!validateResult) {
|
|
1067
|
+
return;
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1052
1070
|
activeUploadsRef.current += 1;
|
|
1053
1071
|
loadingChangeFn(true);
|
|
1054
1072
|
try {
|
|
1055
|
-
await Promise.all(
|
|
1073
|
+
const uploadResults = await await Promise.all(
|
|
1056
1074
|
files.map(async (file) => {
|
|
1057
1075
|
const url = await uploadFileToCOS(
|
|
1058
1076
|
file,
|
|
@@ -1063,11 +1081,13 @@ var TiptapEditor = ({
|
|
|
1063
1081
|
loadingChangeFn,
|
|
1064
1082
|
true
|
|
1065
1083
|
);
|
|
1066
|
-
|
|
1067
|
-
`<a href="${url}" target="_blank" rel="noopener noreferrer" data-attachment="true">${file.name}</a> `
|
|
1068
|
-
).run();
|
|
1084
|
+
return { url, name: file.name };
|
|
1069
1085
|
})
|
|
1070
1086
|
);
|
|
1087
|
+
const attachmentsHtml = uploadResults.map(
|
|
1088
|
+
(res) => `<a href="${res.url}" target="_blank" rel="noopener noreferrer" data-attachment="true">${res.name}</a>`
|
|
1089
|
+
).join(" ");
|
|
1090
|
+
editor.chain().focus().insertContent(attachmentsHtml).run();
|
|
1071
1091
|
} catch (err) {
|
|
1072
1092
|
alertFn(err.message || "Attachment upload failed");
|
|
1073
1093
|
} finally {
|
|
@@ -1080,7 +1100,7 @@ var TiptapEditor = ({
|
|
|
1080
1100
|
}
|
|
1081
1101
|
}
|
|
1082
1102
|
},
|
|
1083
|
-
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]
|
|
1103
|
+
[editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn, customValidationFn]
|
|
1084
1104
|
);
|
|
1085
1105
|
const handleLinkClick = useCallback(() => {
|
|
1086
1106
|
if (!editor || isReadOnly) return;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/TiptapEditor.tsx","../src/extensions.ts","../src/fontSize.ts","../src/backgroundColor.ts","../src/utils.ts","../src/constants.ts","../src/Icons.tsx","../src/ToolbarGroups.tsx"],"sourcesContent":["import React, { useRef, useCallback, useEffect } from 'react';\nimport { useEditor, EditorContent } 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 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}) => {\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 const html = editor?.getHTML();\n if (html) {\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 = editor.getHTML();\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\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 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 editor.chain().focus().setImage({ src: url, alt: file.name }).run();\n })\n );\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 = editor.getHTML();\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]\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\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 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 // Insert a hyperlink styled as an attachment with a marker attribute for CSS styling\n editor\n .chain()\n .focus()\n .insertContent(\n `<a href=\"${url}\" target=\"_blank\" rel=\"noopener noreferrer\" data-attachment=\"true\">${file.name}</a> `\n )\n .run();\n })\n );\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 = editor.getHTML();\n lastEmittedContentRef.current = html;\n receiveData && receiveData(elementId, html);\n }\n }\n },\n [editor, docNum, receiveStatus, elementId, receiveData, onUploadFile, alertFn, loadingChangeFn]\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 editor.chain().focus().extendMarkRange('link').setLink({ href: formattedUrl }).run();\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 '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 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: false }),\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';\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","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=\"Bullet 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=\"Bullet 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\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 <div 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\">\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\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"],"mappings":"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","names":["Extension","jsx","jsxs","jsxs","jsx","jsxs","jsx","_","Fragment","jsx","jsxs","editor"]}
|
|
1
|
+
{"version":3,"sources":["../src/TiptapEditor.tsx","../src/extensions.ts","../src/fontSize.ts","../src/backgroundColor.ts","../src/utils.ts","../src/constants.ts","../src/Icons.tsx","../src/ToolbarGroups.tsx"],"sourcesContent":["import React, { useRef, useCallback, useEffect } from 'react';\nimport { useEditor, EditorContent } 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 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 const html = editor?.getHTML();\n if (html) {\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 = editor.getHTML();\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(' ');\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 = editor.getHTML();\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(' ');\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 = editor.getHTML();\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 editor.chain().focus().extendMarkRange('link').setLink({ href: formattedUrl }).run();\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 '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 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: false }),\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';\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","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=\"Bullet 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=\"Bullet 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\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 <div 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\">\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\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"],"mappings":"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","names":["Extension","jsx","jsxs","jsxs","jsx","jsxs","jsx","_","Fragment","jsx","jsxs","editor"]}
|
package/package.json
CHANGED