oneuxi-editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/Editor.tsx","../src/core/EditorContext.tsx","../src/extensions/image/ImageNode.tsx","../src/html/serializer.ts","../src/security/sanitizer.ts","../src/html/parser.ts","../src/theme/theme.ts","../src/toolbar/Toolbar.tsx","../src/components/Icons.tsx","../src/components/LinkModal.tsx","../src/components/ImageModal.tsx","../src/components/TableModal.tsx","../src/components/FindReplaceDialog.tsx","../src/toolbar/BubbleToolbar.tsx","../src/core/Extension.ts","../src/extensions/image/ImageExtension.ts","../src/extensions/table/TableExtension.ts","../src/extensions/code/CodeExtension.ts","../src/extensions/media/MediaExtension.ts","../src/extensions/file/FileExtension.ts","../src/extensions/mention/MentionExtension.ts","../src/extensions/emoji/EmojiExtension.ts","../src/extensions/slash-command/SlashCommandExtension.ts","../src/presets/index.ts","../src/paste/cleaner.ts"],"sourcesContent":["import React, {\n forwardRef,\n useImperativeHandle,\n useRef,\n useState,\n useEffect,\n useCallback,\n} from \"react\"\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\"\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\"\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\"\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\"\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\"\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\"\nimport { CheckListPlugin } from \"@lexical/react/LexicalCheckListPlugin\"\nimport { LinkPlugin } from \"@lexical/react/LexicalLinkPlugin\"\nimport { HorizontalRulePlugin } from \"@lexical/react/LexicalHorizontalRulePlugin\"\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\"\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\"\n\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\"\nimport { ListNode, ListItemNode } from \"@lexical/list\"\nimport { LinkNode, AutoLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\"\nimport { TableNode, TableRowNode, TableCellNode, $createTableNodeWithDimensions } from \"@lexical/table\"\nimport { CodeNode, CodeHighlightNode, $createCodeNode } from \"@lexical/code\"\nimport { HorizontalRuleNode, $createHorizontalRuleNode } from \"@lexical/react/LexicalHorizontalRuleNode\"\nimport {\n $getRoot,\n $getSelection,\n $isRangeSelection,\n $createParagraphNode,\n FORMAT_TEXT_COMMAND,\n FORMAT_ELEMENT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n INDENT_CONTENT_COMMAND,\n OUTDENT_CONTENT_COMMAND,\n CAN_UNDO_COMMAND,\n CAN_REDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n type LexicalEditor,\n} from \"lexical\"\nimport { $setBlocksType } from \"@lexical/selection\"\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\"\nimport {\n INSERT_UNORDERED_LIST_COMMAND,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_CHECK_LIST_COMMAND,\n} from \"@lexical/list\"\n\nimport { EditorContext, type EditorActiveStates, type EditorContextValue } from \"./EditorContext\"\nimport { ImageNode, $createImageNode } from \"../extensions/image/ImageNode\"\nimport { getEditorHTML } from \"../html/serializer\"\nimport { setEditorHTML } from \"../html/parser\"\nimport { useResolvedTheme } from \"../theme/theme\"\nimport { Toolbar } from \"../toolbar/Toolbar\"\nimport { BubbleToolbar } from \"../toolbar/BubbleToolbar\"\nimport { fullPreset, basicPreset } from \"../presets\"\nimport type { EditorProps, EditorRef, EditorJSON } from \"../types\"\n\nfunction EditorInstancePlugin({\n onMount,\n}: {\n onMount: (editor: LexicalEditor) => void\n}) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n onMount(editor)\n }, [editor, onMount])\n\n return null\n}\n\nfunction EditorStateTracker({\n onStateChange,\n}: {\n onStateChange: React.Dispatch<React.SetStateAction<EditorActiveStates>>\n}) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n const unregisterUndo = editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n onStateChange((prev) => ({ ...prev, canUndo: payload }))\n return false\n },\n COMMAND_PRIORITY_CRITICAL\n )\n\n const unregisterRedo = editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n onStateChange((prev) => ({ ...prev, canRedo: payload }))\n return false\n },\n COMMAND_PRIORITY_CRITICAL\n )\n\n const updateStates = () => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) return\n\n const anchorNode = selection.anchor.getNode()\n const element =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : anchorNode.getTopLevelElementOrThrow()\n\n const elementType = element.getType()\n\n // Eagerly evaluate all Lexical values inside read() before passing to setState\n const snapshot = {\n isBold: selection.hasFormat(\"bold\"),\n isItalic: selection.hasFormat(\"italic\"),\n isUnderline: selection.hasFormat(\"underline\"),\n isStrikethrough: selection.hasFormat(\"strikethrough\"),\n isCode: selection.hasFormat(\"code\"),\n isSubscript: selection.hasFormat(\"subscript\"),\n isSuperscript: selection.hasFormat(\"superscript\"),\n isLink: anchorNode.getParent()?.getType() === \"link\",\n isH1: elementType === \"heading\" && (element as any).getTag() === \"h1\",\n isH2: elementType === \"heading\" && (element as any).getTag() === \"h2\",\n isH3: elementType === \"heading\" && (element as any).getTag() === \"h3\",\n isH4: elementType === \"heading\" && (element as any).getTag() === \"h4\",\n isH5: elementType === \"heading\" && (element as any).getTag() === \"h5\",\n isH6: elementType === \"heading\" && (element as any).getTag() === \"h6\",\n isParagraph: elementType === \"paragraph\",\n isBulletList: elementType === \"list\" && (element as any).getListType() === \"bullet\",\n isOrderedList: elementType === \"list\" && (element as any).getListType() === \"number\",\n isCheckList: elementType === \"list\" && (element as any).getListType() === \"check\",\n isBlockquote: elementType === \"quote\",\n isCodeBlock: elementType === \"code\",\n isAlignLeft: false,\n isAlignCenter: false,\n isAlignRight: false,\n isAlignJustify: false,\n }\n\n // Updater only spreads pre-computed plain values — safe to call outside read()\n onStateChange((prev) => ({ ...prev, ...snapshot }))\n })\n }\n\n const unregisterUpdate = editor.registerUpdateListener(updateStates)\n return () => {\n unregisterUndo()\n unregisterRedo()\n unregisterUpdate()\n }\n }, [editor, onStateChange])\n\n return null\n}\n\nfunction InitialContentPlugin({ html }: { html?: string }) {\n const [editor] = useLexicalComposerContext()\n const isInitialized = useRef(false)\n\n useEffect(() => {\n if (isInitialized.current || !html) return\n isInitialized.current = true\n setEditorHTML(editor, html)\n }, [editor, html])\n\n return null\n}\n\nexport const Editor = forwardRef<EditorRef, EditorProps>((props, ref) => {\n const {\n id,\n className = \"\",\n style,\n \"data-testid\": testId,\n value,\n defaultValue,\n output = \"html\",\n placeholder = \"Start writing...\",\n readOnly = false,\n disabled = false,\n theme = \"system\",\n toolbar,\n bubbleToolbar,\n icons,\n extensions,\n preset,\n sourceMode: initialSourceMode = false,\n fullscreen: initialFullscreen = false,\n characterCount,\n wordCount,\n maxLength,\n html: htmlPolicy,\n autosave,\n onChange,\n onUpdate,\n onError,\n onDirtyChange,\n onCharacterCountChange,\n } = props\n\n const [editorInstance, setEditorInstance] = useState<LexicalEditor | null>(null)\n const [isFullscreen, setIsFullscreen] = useState(initialFullscreen)\n const [isSourceMode, setIsSourceMode] = useState(initialSourceMode)\n const [sourceHtml, setSourceHtml] = useState(\"\")\n const [isDirtyState, setIsDirtyState] = useState(false)\n const [charCount, setCharCount] = useState(0)\n const [wCount, setWCount] = useState(0)\n\n const initialHtmlRef = useRef(value !== undefined ? value : defaultValue || \"\")\n const lastHtmlRef = useRef(initialHtmlRef.current)\n\n const { mode: resolvedMode, styleObject: themeStyles } = useResolvedTheme(theme)\n\n const [activeStates, setActiveStates] = useState<EditorActiveStates>({\n isBold: false,\n isItalic: false,\n isUnderline: false,\n isStrikethrough: false,\n isCode: false,\n isSubscript: false,\n isSuperscript: false,\n isLink: false,\n isH1: false,\n isH2: false,\n isH3: false,\n isH4: false,\n isH5: false,\n isH6: false,\n isParagraph: true,\n isBulletList: false,\n isOrderedList: false,\n isCheckList: false,\n isBlockquote: false,\n isCodeBlock: false,\n isAlignLeft: true,\n isAlignCenter: false,\n isAlignRight: false,\n isAlignJustify: false,\n canUndo: false,\n canRedo: false,\n })\n\n const activeExtensions = extensions || (preset === \"full\" ? fullPreset : preset === \"basic\" ? basicPreset : [])\n const extensionNodes = activeExtensions.flatMap((ext: any) => ext.nodes || [])\n\n const initialConfig = {\n namespace: \"OneUXIEditor\",\n editable: !readOnly && !disabled,\n theme: {\n paragraph: \"oue-paragraph\",\n quote: \"oue-quote\",\n heading: {\n h1: \"oue-h1\",\n h2: \"oue-h2\",\n h3: \"oue-h3\",\n h4: \"oue-h4\",\n h5: \"oue-h5\",\n h6: \"oue-h6\",\n },\n list: {\n nested: {\n listitem: \"oue-nested-listitem\",\n },\n ol: \"oue-ol\",\n ul: \"oue-ul\",\n listitem: \"oue-listitem\",\n checklist: \"oue-checklist\",\n listitemChecked: \"oue-checklist-item-checked\",\n listitemUnchecked: \"oue-checklist-item-unchecked\",\n },\n image: \"oue-image\",\n link: \"oue-link\",\n text: {\n bold: \"oue-bold\",\n italic: \"oue-italic\",\n underline: \"oue-underline\",\n strikethrough: \"oue-strike\",\n code: \"oue-code\",\n subscript: \"oue-subscript\",\n superscript: \"oue-superscript\",\n },\n code: \"oue-code-block\",\n },\n onError: (error: Error) => {\n if (onError) onError(error)\n },\n nodes: [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n AutoLinkNode,\n TableNode,\n TableRowNode,\n TableCellNode,\n CodeNode,\n CodeHighlightNode,\n HorizontalRuleNode,\n ImageNode,\n ...extensionNodes,\n ],\n }\n\n useEffect(() => {\n if (!editorInstance || value === undefined) return\n if (value !== lastHtmlRef.current) {\n setEditorHTML(editorInstance, value, htmlPolicy)\n lastHtmlRef.current = value\n }\n }, [editorInstance, value, htmlPolicy])\n\n const toggleBold = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")\n }, [editorInstance])\n\n const toggleItalic = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\n }, [editorInstance])\n\n const toggleUnderline = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")\n }, [editorInstance])\n\n const toggleStrikethrough = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\n }, [editorInstance])\n\n const toggleCode = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")\n }, [editorInstance])\n\n const toggleSubscript = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\n }, [editorInstance])\n\n const toggleSuperscript = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\n }, [editorInstance])\n\n const clearFormatting = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n selection.getNodes().forEach((node) => {\n if (\"setFormat\" in node && typeof (node as any).setFormat === \"function\") {\n (node as any).setFormat(0)\n }\n })\n }\n })\n }, [editorInstance])\n\n const setHeading = useCallback(\n (tag: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\") => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n if (tag === \"p\") {\n $setBlocksType(selection, () => $createParagraphNode())\n } else {\n $setBlocksType(selection, () => $createHeadingNode(tag))\n }\n }\n })\n },\n [editorInstance]\n )\n\n const toggleBlockquote = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createQuoteNode())\n }\n })\n }, [editorInstance])\n\n const insertHR = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const hr = $createHorizontalRuleNode()\n selection.insertNodes([hr])\n }\n })\n }, [editorInstance])\n\n const toggleBulletList = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n }, [editorInstance])\n\n const toggleOrderedList = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n }, [editorInstance])\n\n const toggleCheckList = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\n }, [editorInstance])\n\n const indent = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n }, [editorInstance])\n\n const outdent = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n }, [editorInstance])\n\n const setAlignment = useCallback(\n (align: \"left\" | \"center\" | \"right\" | \"justify\") => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(FORMAT_ELEMENT_COMMAND, align)\n },\n [editorInstance]\n )\n\n const insertLink = useCallback(\n (url: string, target?: string, title?: string) => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(TOGGLE_LINK_COMMAND, { url, target, title })\n },\n [editorInstance]\n )\n\n const removeLink = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }, [editorInstance])\n\n\n const insertTable = useCallback(\n (rows = 3, cols = 3) => {\n if (!editorInstance) return\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const tableNode = $createTableNodeWithDimensions(rows, cols, false)\n selection.insertNodes([tableNode])\n }\n })\n },\n [editorInstance]\n )\n\n const insertImage = useCallback(\n (src: string, alt?: string, width?: number, height?: number) => {\n if (!editorInstance) return\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const imageNode = $createImageNode({ src, alt, width, height })\n selection.insertNodes([imageNode])\n }\n })\n },\n [editorInstance]\n )\n\n const insertCodeBlock = useCallback(\n (language = \"javascript\") => {\n if (!editorInstance) return\n editorInstance.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const codeNode = $createCodeNode(language)\n selection.insertNodes([codeNode])\n }\n })\n },\n [editorInstance]\n )\n\n const undo = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(UNDO_COMMAND, undefined)\n }, [editorInstance])\n\n const redo = useCallback(() => {\n if (!editorInstance) return\n editorInstance.focus()\n editorInstance.dispatchCommand(REDO_COMMAND, undefined)\n }, [editorInstance])\n const focus = useCallback(() => editorInstance?.focus(), [editorInstance])\n const blur = useCallback(() => editorInstance?.blur(), [editorInstance])\n\n const clear = useCallback(() => {\n if (!editorInstance) return\n editorInstance.update(() => {\n const root = $getRoot()\n root.clear()\n const p = $createParagraphNode()\n root.append(p)\n p.select()\n })\n }, [editorInstance])\n\n const getHTML = useCallback(() => {\n if (!editorInstance) return \"\"\n return getEditorHTML(editorInstance, htmlPolicy)\n }, [editorInstance, htmlPolicy])\n\n const setHTML = useCallback(\n (html: string) => {\n if (!editorInstance) return\n setEditorHTML(editorInstance, html, htmlPolicy)\n lastHtmlRef.current = html\n },\n [editorInstance, htmlPolicy]\n )\n\n const getText = useCallback(() => {\n if (!editorInstance) return \"\"\n let text = \"\"\n editorInstance.getEditorState().read(() => {\n text = $getRoot().getTextContent()\n })\n return text\n }, [editorInstance])\n\n const getJSON = useCallback((): EditorJSON => {\n if (!editorInstance) return { root: {} }\n return editorInstance.getEditorState().toJSON() as unknown as EditorJSON\n }, [editorInstance])\n\n const setJSON = useCallback(\n (json: EditorJSON) => {\n if (!editorInstance) return\n const state = editorInstance.parseEditorState(JSON.stringify(json))\n editorInstance.setEditorState(state)\n },\n [editorInstance]\n )\n\n const isEmpty = useCallback(() => {\n if (!editorInstance) return true\n let empty = true\n editorInstance.getEditorState().read(() => {\n const root = $getRoot()\n const children = root.getChildren()\n if (children.length === 0) {\n empty = true\n return\n }\n const text = root.getTextContent().trim()\n empty = text.length === 0\n })\n return empty\n }, [editorInstance])\n\n const isDirty = useCallback(() => isDirtyState, [isDirtyState])\n const markClean = useCallback(() => {\n setIsDirtyState(false)\n if (onDirtyChange) onDirtyChange(false)\n }, [onDirtyChange])\n\n const toggleFullscreen = useCallback(() => setIsFullscreen((prev) => !prev), [])\n\n const toggleSourceMode = useCallback(() => {\n setIsSourceMode((prev) => {\n const next = !prev\n if (next && editorInstance) {\n setSourceHtml(getEditorHTML(editorInstance, htmlPolicy))\n } else if (!next && editorInstance) {\n setEditorHTML(editorInstance, sourceHtml, htmlPolicy)\n }\n return next\n })\n }, [editorInstance, htmlPolicy, sourceHtml])\n\n useImperativeHandle(\n ref,\n (): EditorRef => ({\n focus,\n blur,\n clear,\n getHTML,\n setHTML,\n getText,\n getJSON,\n setJSON,\n isEmpty,\n isDirty,\n markClean,\n undo,\n redo,\n }),\n [focus, blur, clear, getHTML, setHTML, getText, getJSON, setJSON, isEmpty, isDirty, markClean, undo, redo]\n )\n\n const handleEditorChange = useCallback(() => {\n if (!editorInstance) return\n\n const currentText = editorInstance.getEditorState().read(() => $getRoot().getTextContent())\n const currentLength = currentText.length\n const currentWords = currentText.trim() ? currentText.trim().split(/\\s+/).length : 0\n\n setCharCount(currentLength)\n setWCount(currentWords)\n if (onCharacterCountChange) onCharacterCountChange(currentLength)\n\n if (maxLength && currentLength > maxLength) {\n editorInstance.update(() => {\n const root = $getRoot()\n const text = root.getTextContent().slice(0, maxLength)\n root.clear()\n const p = $createParagraphNode()\n p.append(document.createTextNode(text) as any)\n root.append(p)\n })\n return\n }\n\n const htmlOutput = getEditorHTML(editorInstance, htmlPolicy)\n const jsonOutput = editorInstance.getEditorState().toJSON() as unknown as EditorJSON\n const isCurrentlyEmpty = isEmpty()\n\n if (htmlOutput !== lastHtmlRef.current) {\n lastHtmlRef.current = htmlOutput\n\n if (!isDirtyState) {\n setIsDirtyState(true)\n if (onDirtyChange) onDirtyChange(true)\n }\n\n if (onChange) {\n const result = output === \"json\" ? JSON.stringify(jsonOutput) : output === \"text\" ? currentText : htmlOutput\n onChange(result)\n }\n\n if (onUpdate) {\n onUpdate({\n html: htmlOutput,\n text: currentText,\n json: jsonOutput,\n isEmpty: isCurrentlyEmpty,\n })\n }\n\n if (autosave?.onSave) {\n autosave.onSave({ html: htmlOutput, json: jsonOutput, text: currentText })\n }\n }\n }, [\n editorInstance,\n onCharacterCountChange,\n maxLength,\n htmlPolicy,\n isEmpty,\n isDirtyState,\n onDirtyChange,\n onChange,\n output,\n onUpdate,\n autosave,\n ])\n\n const contextValue: EditorContextValue = {\n editor: editorInstance,\n activeStates,\n icons,\n toggleBold,\n toggleItalic,\n toggleUnderline,\n toggleStrikethrough,\n toggleCode,\n toggleSubscript,\n toggleSuperscript,\n clearFormatting,\n setHeading,\n toggleBlockquote,\n insertHR,\n toggleBulletList,\n toggleOrderedList,\n toggleCheckList,\n indent,\n outdent,\n setAlignment,\n insertLink,\n removeLink,\n insertTable,\n insertImage,\n insertCodeBlock,\n undo,\n redo,\n focus,\n blur,\n clear,\n getHTML,\n setHTML,\n getText,\n getJSON,\n setJSON,\n isEmpty,\n isDirty,\n markClean,\n isFullscreen,\n toggleFullscreen,\n isSourceMode,\n toggleSourceMode,\n }\n\n const imageExt = activeExtensions.find((e: any) => e.name === \"image\")\n const imageUploader = imageExt?.options?.upload\n\n return (\n <LexicalComposer initialConfig={initialConfig}>\n <EditorContext.Provider value={contextValue}>\n <div\n id={id}\n data-testid={testId}\n data-theme={resolvedMode}\n className={`oue-editor-container oue-editor-wrapper ${isFullscreen ? \"oue-fullscreen\" : \"\"} ${disabled ? \"oue-disabled\" : \"\"\n } ${className}`}\n style={{ ...themeStyles, ...style }}\n >\n <EditorInstancePlugin onMount={setEditorInstance} />\n <EditorStateTracker onStateChange={setActiveStates} />\n <InitialContentPlugin html={initialHtmlRef.current} />\n\n <Toolbar config={toolbar} imageUploader={imageUploader} />\n <BubbleToolbar config={bubbleToolbar} />\n\n {isSourceMode ? (\n <textarea\n className=\"oue-source-textarea\"\n value={sourceHtml}\n onChange={(e) => {\n setSourceHtml(e.target.value)\n if (editorInstance) {\n setEditorHTML(editorInstance, e.target.value, htmlPolicy)\n }\n }}\n />\n ) : (\n <div style={{ position: \"relative\" }}>\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n className=\"oue-content-editable\"\n aria-placeholder={placeholder}\n placeholder={<div className=\"oue-placeholder\">{placeholder}</div>}\n />\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </div>\n )}\n\n <HistoryPlugin />\n <ListPlugin />\n <CheckListPlugin />\n <LinkPlugin />\n <HorizontalRulePlugin />\n <OnChangePlugin onChange={handleEditorChange} />\n\n {(characterCount || wordCount) && (\n <div className=\"oue-footer\">\n <div>\n {wordCount && <span>{wCount} words </span>}\n {characterCount && (\n <span>\n ({charCount} {maxLength ? `/ ${maxLength}` : \"\"} chars)\n </span>\n )}\n </div>\n {isDirtyState && <span>Unsaved changes</span>}\n </div>\n )}\n </div>\n </EditorContext.Provider>\n </LexicalComposer>\n )\n})\n\nEditor.displayName = \"Editor\"\n","import React, { createContext, useContext } from \"react\"\nimport type { LexicalEditor } from \"lexical\"\nimport type { EditorJSON, CustomIconMap } from \"../types\"\n\nexport interface EditorActiveStates {\n isBold: boolean\n isItalic: boolean\n isUnderline: boolean\n isStrikethrough: boolean\n isCode: boolean\n isSubscript: boolean\n isSuperscript: boolean\n isLink: boolean\n isH1: boolean\n isH2: boolean\n isH3: boolean\n isH4: boolean\n isH5: boolean\n isH6: boolean\n isParagraph: boolean\n isBulletList: boolean\n isOrderedList: boolean\n isCheckList: boolean\n isBlockquote: boolean\n isCodeBlock: boolean\n isAlignLeft: boolean\n isAlignCenter: boolean\n isAlignRight: boolean\n isAlignJustify: boolean\n canUndo: boolean\n canRedo: boolean\n}\n\nexport interface EditorContextValue {\n editor: LexicalEditor | null\n activeStates: EditorActiveStates\n icons?: CustomIconMap\n\n toggleBold: () => void\n toggleItalic: () => void\n toggleUnderline: () => void\n toggleStrikethrough: () => void\n toggleCode: () => void\n toggleSubscript: () => void\n toggleSuperscript: () => void\n clearFormatting: () => void\n\n setHeading: (heading: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\") => void\n toggleBlockquote: () => void\n insertHR: () => void\n\n toggleBulletList: () => void\n toggleOrderedList: () => void\n toggleCheckList: () => void\n indent: () => void\n outdent: () => void\n\n setAlignment: (align: \"left\" | \"center\" | \"right\" | \"justify\") => void\n\n insertLink: (url: string, target?: string, title?: string) => void\n removeLink: () => void\n\n insertTable: (rows?: number, cols?: number) => void\n insertImage: (src: string, alt?: string, width?: number, height?: number) => void\n insertCodeBlock: (language?: string) => void\n\n undo: () => void\n redo: () => void\n focus: () => void\n blur: () => void\n clear: () => void\n\n getHTML: () => string\n setHTML: (html: string) => void\n getText: () => string\n getJSON: () => EditorJSON\n setJSON: (json: EditorJSON) => void\n\n isEmpty: () => boolean\n isDirty: () => boolean\n markClean: () => void\n\n isFullscreen: boolean\n toggleFullscreen: () => void\n isSourceMode: boolean\n toggleSourceMode: () => void\n}\n\nexport const EditorContext = createContext<EditorContextValue | null>(null)\n\nexport function useEditor(): EditorContextValue {\n const context = useContext(EditorContext)\n if (!context) {\n throw new Error(\"useEditor must be used within an <Editor> component\")\n }\n return context\n}\n","import {\n DecoratorNode,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\"\nimport React from \"react\"\n\nexport interface ImagePayload {\n src: string\n alt?: string\n width?: number\n height?: number\n alignment?: \"left\" | \"center\" | \"right\"\n caption?: string\n key?: NodeKey\n}\n\nexport type SerializedImageNode = Spread<\n {\n src: string\n alt?: string\n width?: number\n height?: number\n alignment?: \"left\" | \"center\" | \"right\"\n caption?: string\n },\n SerializedLexicalNode\n>\n\nexport class ImageNode extends DecoratorNode<React.ReactNode> {\n __src: string\n __alt: string\n __width?: number\n __height?: number\n __alignment: \"left\" | \"center\" | \"right\"\n __caption: string\n\n static getType(): string {\n return \"image\"\n }\n\n static clone(node: ImageNode): ImageNode {\n return new ImageNode(\n node.__src,\n node.__alt,\n node.__width,\n node.__height,\n node.__alignment,\n node.__caption,\n node.__key\n )\n }\n\n constructor(\n src: string,\n alt?: string,\n width?: number,\n height?: number,\n alignment?: \"left\" | \"center\" | \"right\",\n caption?: string,\n key?: NodeKey\n ) {\n super(key)\n this.__src = src\n this.__alt = alt || \"\"\n this.__width = width\n this.__height = height\n this.__alignment = alignment || \"center\"\n this.__caption = caption || \"\"\n }\n\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\n const { src, alt, width, height, alignment, caption } = serializedNode\n return new ImageNode(src, alt, width, height, alignment, caption)\n }\n\n exportJSON(): SerializedImageNode {\n return {\n type: \"image\",\n version: 1,\n src: this.__src,\n alt: this.__alt,\n width: this.__width,\n height: this.__height,\n alignment: this.__alignment,\n caption: this.__caption,\n }\n }\n\n createDOM(): HTMLElement {\n const span = document.createElement(\"span\")\n span.className = `oue-image-container oue-align-${this.__alignment}`\n return span\n }\n\n updateDOM(): boolean {\n return false\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement(\"img\")\n element.setAttribute(\"src\", this.__src)\n if (this.__alt) element.setAttribute(\"alt\", this.__alt)\n if (this.__width) element.setAttribute(\"width\", String(this.__width))\n if (this.__height) element.setAttribute(\"height\", String(this.__height))\n return { element }\n }\n\n decorate(): React.ReactNode {\n return (\n <span className={`oue-image-container oue-align-${this.__alignment}`}>\n <img\n src={this.__src}\n alt={this.__alt}\n style={{\n width: this.__width ? `${this.__width}px` : \"auto\",\n height: this.__height ? `${this.__height}px` : \"auto\",\n }}\n />\n {this.__caption && <span className=\"oue-image-caption\">{this.__caption}</span>}\n </span>\n )\n }\n}\n\nexport function $createImageNode(payload: ImagePayload): ImageNode {\n return new ImageNode(\n payload.src,\n payload.alt,\n payload.width,\n payload.height,\n payload.alignment,\n payload.caption,\n payload.key\n )\n}\n\nexport function $isImageNode(node: LexicalNode | null | undefined): node is ImageNode {\n return node instanceof ImageNode\n}\n","import { $generateHtmlFromNodes } from \"@lexical/html\"\nimport type { LexicalEditor } from \"lexical\"\nimport { sanitizeHTML } from \"../security/sanitizer\"\nimport type { HTMLPolicy } from \"../types\"\n\nexport function getEditorHTML(editor: LexicalEditor, policy?: HTMLPolicy): string {\n let html = \"\"\n editor.getEditorState().read(() => {\n html = $generateHtmlFromNodes(editor, null)\n })\n\n return sanitizeHTML(html, policy)\n}\n","import DOMPurify from \"dompurify\"\nimport type { HTMLPolicy } from \"../types\"\n\nconst DEFAULT_ALLOWED_TAGS = [\n \"p\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"blockquote\", \"pre\", \"code\",\n \"ul\", \"ol\", \"li\", \"hr\", \"br\", \"span\", \"div\",\n \"strong\", \"b\", \"em\", \"i\", \"u\", \"s\", \"sub\", \"sup\",\n \"a\", \"img\", \"iframe\", \"video\", \"source\",\n \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\",\n \"figure\", \"figcaption\", \"input\"\n]\n\nconst DEFAULT_ALLOWED_ATTR = [\n \"href\", \"target\", \"rel\", \"title\",\n \"src\", \"alt\", \"width\", \"height\", \"align\",\n \"class\", \"style\", \"id\", \"data-*\",\n \"type\", \"checked\", \"disabled\",\n \"frameborder\", \"allowfullscreen\", \"allow\"\n]\n\nexport function sanitizeHTML(html: string, policy?: HTMLPolicy): string {\n if (!html) return \"\"\n\n // SSR environment guard\n if (typeof window === \"undefined\") {\n // Fallback basic server-side sanitization against script tags & javascript: protocols\n return html\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, \"\")\n .replace(/on\\w+\\s*=\\s*([\"']).*?\\1/gi, \"\")\n .replace(/on\\w+\\s*=\\s*[^\"'\\s>]+/gi, \"\")\n .replace(/href\\s*=\\s*[\"']?\\s*javascript:[^\"'>]*/gi, 'href=\"#\"')\n }\n\n const allowedTags = policy?.allowedTags || DEFAULT_ALLOWED_TAGS\n const allowedAttributes = policy?.allowedAttributes\n ? Object.keys(policy.allowedAttributes).reduce((acc, tag) => {\n return [...acc, ...(policy.allowedAttributes![tag] || [])]\n }, DEFAULT_ALLOWED_ATTR)\n : DEFAULT_ALLOWED_ATTR\n\n const clean = DOMPurify.sanitize(html, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttributes,\n ADD_ATTR: [\"target\", \"rel\"],\n FORCE_BODY: true,\n })\n\n // Prevent javascript: URLs in <a> tags\n return clean.replace(/href=[\"']?\\s*javascript:[^\"'>]*/gi, 'href=\"#\"')\n}\n","import { $generateNodesFromDOM } from \"@lexical/html\"\nimport { $getRoot, type LexicalEditor } from \"lexical\"\nimport { sanitizeHTML } from \"../security/sanitizer\"\nimport type { HTMLPolicy } from \"../types\"\n\nexport function setEditorHTML(editor: LexicalEditor, html: string, policy?: HTMLPolicy): void {\n const sanitized = sanitizeHTML(html, policy)\n\n editor.update(() => {\n const root = $getRoot()\n root.clear()\n\n if (sanitized.trim().length === 0) return\n\n const parser = typeof window !== \"undefined\" ? new DOMParser() : null\n if (!parser) return\n\n const dom = parser.parseFromString(sanitized, \"text/html\")\n const nodes = $generateNodesFromDOM(editor, dom)\n $getRoot().append(...nodes)\n })\n}\n","import { useSyncExternalStore, useEffect, useState } from \"react\"\nimport type { EditorTheme, ThemeMode, EditorThemeObject } from \"../types\"\n\nconst COLOR_SCHEME_QUERY = \"(prefers-color-scheme: dark)\"\n\nfunction getSystemThemeSnapshot(): boolean {\n if (typeof window === \"undefined\") return false\n return window.matchMedia(COLOR_SCHEME_QUERY).matches\n}\n\nfunction getServerThemeSnapshot(): boolean {\n return false\n}\n\nfunction subscribeSystemTheme(callback: () => void) {\n if (typeof window === \"undefined\") return () => {}\n const matchMedia = window.matchMedia(COLOR_SCHEME_QUERY)\n matchMedia.addEventListener(\"change\", callback)\n return () => matchMedia.removeEventListener(\"change\", callback)\n}\n\nexport function useResolvedTheme(theme: EditorTheme = \"system\"): {\n mode: \"light\" | \"dark\"\n styleObject: Record<string, string>\n} {\n const isSystemDark = useSyncExternalStore(\n subscribeSystemTheme,\n getSystemThemeSnapshot,\n getServerThemeSnapshot\n )\n\n // Track client mount to avoid SSR/CSR mismatch for \"system\" theme\n const [mounted, setMounted] = useState(false)\n useEffect(() => { setMounted(true) }, [])\n\n let themeObj: EditorThemeObject = {}\n let mode: ThemeMode = \"system\"\n\n if (typeof theme === \"string\") {\n mode = theme\n } else if (typeof theme === \"object\" && theme !== null) {\n themeObj = theme\n mode = theme.mode || \"system\"\n }\n\n // For \"system\" theme: use \"light\" on server/first-render to avoid flash,\n // then switch to real detected value once mounted on client\n const resolvedMode: \"light\" | \"dark\" =\n mode === \"system\"\n ? mounted\n ? isSystemDark ? \"dark\" : \"light\"\n : \"light\"\n : mode as \"light\" | \"dark\"\n\n const cssVarMap: Record<keyof EditorThemeObject, string> = {\n mode: \"\",\n background: \"--oue-bg\",\n surface: \"--oue-surface\",\n text: \"--oue-text\",\n textMuted: \"--oue-text-muted\",\n border: \"--oue-border\",\n primary: \"--oue-primary\",\n primaryForeground: \"--oue-primary-foreground\",\n hover: \"--oue-hover\",\n active: \"--oue-active\",\n selection: \"--oue-selection\",\n codeBg: \"--oue-code-bg\",\n toolbarBg: \"--oue-toolbar-bg\",\n toolbarBorder: \"--oue-toolbar-border\",\n popupBg: \"--oue-popup-bg\",\n radius: \"--oue-radius\",\n shadow: \"--oue-shadow\",\n fontFamily: \"--oue-font-family\",\n fontSize: \"--oue-font-size\",\n }\n\n const styleObject: Record<string, string> = {}\n\n Object.entries(themeObj).forEach(([key, val]) => {\n if (val && cssVarMap[key as keyof EditorThemeObject]) {\n styleObject[cssVarMap[key as keyof EditorThemeObject]] = String(val)\n }\n })\n\n return {\n mode: resolvedMode,\n styleObject,\n }\n}\n\n","import React, { useState } from \"react\"\nimport { useEditor } from \"../core/EditorContext\"\nimport { getIcon } from \"../components/Icons\"\nimport { LinkModal } from \"../components/LinkModal\"\nimport { ImageModal } from \"../components/ImageModal\"\nimport { TableModal } from \"../components/TableModal\"\nimport { FindReplaceDialog } from \"../components/FindReplaceDialog\"\nimport type { ToolbarConfig, ToolbarItem, ImageUploadHandler } from \"../types\"\n\ninterface ToolbarProps {\n config?: ToolbarConfig\n imageUploader?: ImageUploadHandler\n}\n\nexport function Toolbar({ config, imageUploader }: ToolbarProps) {\n const editorCtx = useEditor()\n const { activeStates, icons } = editorCtx\n\n const [isLinkOpen, setIsLinkOpen] = useState(false)\n const [isImageOpen, setIsImageOpen] = useState(false)\n const [isTableOpen, setIsTableOpen] = useState(false)\n const [isFindOpen, setIsFindOpen] = useState(false)\n\n if (config === false) return null\n\n const items: ToolbarItem[] = config || [\n \"undo\",\n \"redo\",\n \"|\",\n \"heading\",\n \"|\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"|\",\n \"align\",\n \"|\",\n \"bulletList\",\n \"orderedList\",\n \"checkList\",\n \"|\",\n \"link\",\n \"image\",\n \"table\",\n \"codeBlock\",\n \"blockquote\",\n \"hr\",\n \"|\",\n \"sourceMode\",\n \"findReplace\",\n \"fullscreen\",\n ]\n\n const handleHeadingChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const val = e.target.value as \"p\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"\n editorCtx.setHeading(val)\n }\n\n const handleAlignChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const val = e.target.value as \"left\" | \"center\" | \"right\" | \"justify\"\n editorCtx.setAlignment(val)\n }\n\n const getCurrentHeadingValue = () => {\n if (activeStates.isH1) return \"h1\"\n if (activeStates.isH2) return \"h2\"\n if (activeStates.isH3) return \"h3\"\n if (activeStates.isH4) return \"h4\"\n if (activeStates.isH5) return \"h5\"\n if (activeStates.isH6) return \"h6\"\n return \"p\"\n }\n\n const getCurrentAlignValue = () => {\n if (activeStates.isAlignCenter) return \"center\"\n if (activeStates.isAlignRight) return \"right\"\n if (activeStates.isAlignJustify) return \"justify\"\n return \"left\"\n }\n\n return (\n <>\n <div \n className=\"oue-toolbar\" \n role=\"toolbar\" \n aria-label=\"Editor formatting toolbar\"\n onMouseDown={(e) => {\n // Don't prevent default for <select> — it breaks the dropdown\n if ((e.target as HTMLElement).closest(\"select\") === null) {\n e.preventDefault()\n }\n }}\n >\n {items.map((item, idx) => {\n if (typeof item === \"function\" || typeof item === \"object\") {\n const CustomComp = item as React.ComponentType\n return <CustomComp key={idx} />\n }\n\n if (item === \"|\") {\n return <div key={idx} className=\"oue-toolbar-separator\" aria-hidden=\"true\" />\n }\n\n switch (item) {\n case \"undo\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Undo\"\n title=\"Undo (Ctrl+Z)\"\n className=\"oue-toolbar-btn\"\n disabled={!activeStates.canUndo}\n onClick={editorCtx.undo}\n >\n {getIcon(\"undo\", icons)}\n </button>\n )\n case \"redo\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Redo\"\n title=\"Redo (Ctrl+Y / Cmd+Shift+Z)\"\n className=\"oue-toolbar-btn\"\n disabled={!activeStates.canRedo}\n onClick={editorCtx.redo}\n >\n {getIcon(\"redo\", icons)}\n </button>\n )\n case \"heading\":\n return (\n <select\n key={idx}\n aria-label=\"Text style heading\"\n className=\"oue-toolbar-select\"\n value={getCurrentHeadingValue()}\n onChange={handleHeadingChange}\n >\n <option value=\"p\">Paragraph</option>\n <option value=\"h1\">Heading 1</option>\n <option value=\"h2\">Heading 2</option>\n <option value=\"h3\">Heading 3</option>\n <option value=\"h4\">Heading 4</option>\n <option value=\"h5\">Heading 5</option>\n <option value=\"h6\">Heading 6</option>\n </select>\n )\n case \"bold\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Bold\"\n title=\"Bold (Ctrl+B)\"\n className={`oue-toolbar-btn ${activeStates.isBold ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleBold}\n >\n {getIcon(\"bold\", icons)}\n </button>\n )\n case \"italic\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Italic\"\n title=\"Italic (Ctrl+I)\"\n className={`oue-toolbar-btn ${activeStates.isItalic ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleItalic}\n >\n {getIcon(\"italic\", icons)}\n </button>\n )\n case \"underline\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Underline\"\n title=\"Underline (Ctrl+U)\"\n className={`oue-toolbar-btn ${activeStates.isUnderline ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleUnderline}\n >\n {getIcon(\"underline\", icons)}\n </button>\n )\n case \"strike\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Strikethrough\"\n title=\"Strikethrough\"\n className={`oue-toolbar-btn ${activeStates.isStrikethrough ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleStrikethrough}\n >\n {getIcon(\"strike\", icons)}\n </button>\n )\n case \"code\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Inline Code\"\n title=\"Inline Code\"\n className={`oue-toolbar-btn ${activeStates.isCode ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleCode}\n >\n {getIcon(\"code\", icons)}\n </button>\n )\n case \"subscript\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Subscript\"\n title=\"Subscript\"\n className={`oue-toolbar-btn ${activeStates.isSubscript ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleSubscript}\n >\n {getIcon(\"subscript\", icons)}\n </button>\n )\n case \"superscript\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Superscript\"\n title=\"Superscript\"\n className={`oue-toolbar-btn ${activeStates.isSuperscript ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleSuperscript}\n >\n {getIcon(\"superscript\", icons)}\n </button>\n )\n case \"clearFormatting\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Clear formatting\"\n title=\"Clear formatting\"\n className=\"oue-toolbar-btn\"\n onClick={editorCtx.clearFormatting}\n >\n {getIcon(\"clearFormatting\", icons)}\n </button>\n )\n case \"align\":\n return (\n <select\n key={idx}\n aria-label=\"Text Alignment\"\n className=\"oue-toolbar-select\"\n value={getCurrentAlignValue()}\n onChange={handleAlignChange}\n >\n <option value=\"left\">Align Left</option>\n <option value=\"center\">Align Center</option>\n <option value=\"right\">Align Right</option>\n <option value=\"justify\">Justify</option>\n </select>\n )\n case \"bulletList\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Bullet List\"\n title=\"Bullet List\"\n className={`oue-toolbar-btn ${activeStates.isBulletList ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleBulletList}\n >\n {getIcon(\"bulletList\", icons)}\n </button>\n )\n case \"orderedList\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Numbered List\"\n title=\"Numbered List\"\n className={`oue-toolbar-btn ${activeStates.isOrderedList ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleOrderedList}\n >\n {getIcon(\"orderedList\", icons)}\n </button>\n )\n case \"checkList\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Task List\"\n title=\"Task List\"\n className={`oue-toolbar-btn ${activeStates.isCheckList ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleCheckList}\n >\n {getIcon(\"checkList\", icons)}\n </button>\n )\n case \"indent\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Indent\"\n title=\"Indent (Tab)\"\n className=\"oue-toolbar-btn\"\n onClick={editorCtx.indent}\n >\n {getIcon(\"indent\", icons)}\n </button>\n )\n case \"outdent\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Outdent\"\n title=\"Outdent (Shift+Tab)\"\n className=\"oue-toolbar-btn\"\n onClick={editorCtx.outdent}\n >\n {getIcon(\"outdent\", icons)}\n </button>\n )\n case \"link\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Insert Link\"\n title=\"Insert Link\"\n className={`oue-toolbar-btn ${activeStates.isLink ? \"oue-active\" : \"\"}`}\n onClick={() => setIsLinkOpen(true)}\n >\n {getIcon(\"link\", icons)}\n </button>\n )\n case \"image\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Insert Image\"\n title=\"Insert Image\"\n className=\"oue-toolbar-btn\"\n onClick={() => setIsImageOpen(true)}\n >\n {getIcon(\"image\", icons)}\n </button>\n )\n case \"table\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Insert Table\"\n title=\"Insert Table\"\n className=\"oue-toolbar-btn\"\n onClick={() => setIsTableOpen(true)}\n >\n {getIcon(\"table\", icons)}\n </button>\n )\n case \"codeBlock\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Code Block\"\n title=\"Code Block\"\n className={`oue-toolbar-btn ${activeStates.isCodeBlock ? \"oue-active\" : \"\"}`}\n onClick={() => editorCtx.insertCodeBlock()}\n >\n {getIcon(\"codeBlock\", icons)}\n </button>\n )\n case \"blockquote\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Blockquote\"\n title=\"Blockquote\"\n className={`oue-toolbar-btn ${activeStates.isBlockquote ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleBlockquote}\n >\n {getIcon(\"blockquote\", icons)}\n </button>\n )\n case \"hr\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Horizontal Rule\"\n title=\"Horizontal Rule\"\n className=\"oue-toolbar-btn\"\n onClick={editorCtx.insertHR}\n >\n {getIcon(\"hr\", icons)}\n </button>\n )\n case \"sourceMode\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"HTML Source Mode\"\n title=\"Toggle HTML Source\"\n className={`oue-toolbar-btn ${editorCtx.isSourceMode ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleSourceMode}\n >\n {getIcon(\"sourceMode\", icons)}\n </button>\n )\n case \"findReplace\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Find and Replace\"\n title=\"Find & Replace (Ctrl+F)\"\n className=\"oue-toolbar-btn\"\n onClick={() => setIsFindOpen(true)}\n >\n {getIcon(\"findReplace\", icons)}\n </button>\n )\n case \"fullscreen\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Fullscreen\"\n title=\"Toggle Fullscreen\"\n className={`oue-toolbar-btn ${editorCtx.isFullscreen ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleFullscreen}\n >\n {getIcon(\"fullscreen\", icons)}\n </button>\n )\n default:\n return null\n }\n })}\n </div>\n\n <LinkModal\n isOpen={isLinkOpen}\n onClose={() => setIsLinkOpen(false)}\n onSubmit={({ url, target, title }) => editorCtx.insertLink(url, target, title)}\n />\n\n <ImageModal\n isOpen={isImageOpen}\n uploader={imageUploader}\n onClose={() => setIsImageOpen(false)}\n onSubmit={({ src, alt, width, height }) => editorCtx.insertImage(src, alt, width, height)}\n />\n\n <TableModal\n isOpen={isTableOpen}\n onClose={() => setIsTableOpen(false)}\n onSubmit={(rows, cols) => editorCtx.insertTable(rows, cols)}\n />\n\n <FindReplaceDialog isOpen={isFindOpen} onClose={() => setIsFindOpen(false)} />\n </>\n )\n}\n","import React from \"react\"\nimport type { CustomIconMap } from \"../types\"\n\nconst createSvg = (path: React.ReactNode) => {\n return function SvgIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n {path}\n </svg>\n )\n }\n}\n\nexport const DefaultIcons = {\n bold: createSvg(<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />),\n italic: createSvg(<path d=\"M19 4h-9M14 20H5M15 4L9 20\" />),\n underline: createSvg(<path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3M4 21h16\" />),\n strike: createSvg(<path d=\"M16 4H9a3 3 0 0 0-2.83 4M14 12a4 4 0 0 1 0 8H6M4 12h16\" />),\n code: createSvg(<path d=\"M16 18l6-6-6-6M8 6l-6 6 6 6\" />),\n subscript: createSvg(<path d=\"M4 5l8 8M12 5l-8 8M20 19h-4l3-3a1.5 1.5 0 0 0-2.12-2.12\" />),\n superscript: createSvg(<path d=\"M4 19l8-8M12 19l-8-8M20 9h-4l3-3a1.5 1.5 0 0 0-2.12-2.12\" />),\n clearFormatting: createSvg(<path d=\"M18 6L6 18M6 6l12 12\" />),\n\n heading: createSvg(<path d=\"M4 12h8M4 18V6M12 18V6M17 12l3-3v9\" />),\n paragraph: createSvg(<path d=\"M13 4v16M17 4v16M19 4H9.5a4.5 4.5 0 0 0 0 9H13\" />),\n\n bulletList: createSvg(<path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />),\n orderedList: createSvg(<path d=\"M10 6h11M10 12h11M10 18h11M4 6h1v4M4 10h2M4 18h3M4 14h3v4\" />),\n checkList: createSvg(<path d=\"M9 11l3 3L22 4M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />),\n indent: createSvg(<path d=\"M3 12h18M3 6h18M3 18h18M13 8l4 4-4 4\" />),\n outdent: createSvg(<path d=\"M3 12h18M3 6h18M3 18h18M11 8l-4 4 4 4\" />),\n\n alignLeft: createSvg(<path d=\"M17 10H3M21 6H3M21 14H3M17 18H3\" />),\n alignCenter: createSvg(<path d=\"M18 10H6M21 6H3M21 14H3M18 18H6\" />),\n alignRight: createSvg(<path d=\"M21 10H7M21 6H3M21 14H3M21 18H7\" />),\n alignJustify: createSvg(<path d=\"M21 10H3M21 6H3M21 14H3M21 18H3\" />),\n\n link: createSvg(<path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />),\n image: createSvg(<path d=\"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z M8.5 10a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z M21 15l-5-5L5 21\" />),\n table: createSvg(<path d=\"M3 3h18v18H3V3z M3 9h18 M3 15h18 M9 3v18 M15 3v18\" />),\n media: createSvg(<path d=\"M23 7l-7 5 7 5V7z M14 5H3a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2z\" />),\n file: createSvg(<path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z M13 2v7h7\" />),\n codeBlock: createSvg(<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M10 12l-2 2 2 2 M14 12l2 2-2 2\" />),\n blockquote: createSvg(<path d=\"M3 21c3 0 7-1 7-8V5H3v8h4c0 4-2 6-4 7zm11 0c3 0 7-1 7-8V5h-7v8h4c0 4-2 6-4 7z\" />),\n hr: createSvg(<path d=\"M5 12h14\" />),\n\n undo: createSvg(<path d=\"M3 7v6h6M3 13L9 7c6-6 12 0 12 0\" />),\n redo: createSvg(<path d=\"M21 7v6h-6M21 13L15 7c-6-6-12 0-12 0\" />),\n\n sourceMode: createSvg(<path d=\"M14 4l-4 16M4 8l-4 4 4 4M20 8l4 4-4 4\" />),\n findReplace: createSvg(<path d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z M21 21l-4.35-4.35\" />),\n fullscreen: createSvg(<path d=\"M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3\" />)\n}\n\nexport function getIcon(key: keyof CustomIconMap, customIcons?: CustomIconMap) {\n if (customIcons && customIcons[key]) {\n const CustomComp = customIcons[key]!\n return <CustomComp />\n }\n const DefaultSvg = DefaultIcons[key]\n return DefaultSvg ? <DefaultSvg /> : null\n}\n","import React, { useState } from \"react\"\n\ninterface LinkModalProps {\n initialUrl?: string\n initialTarget?: string\n initialTitle?: string\n isOpen: boolean\n onClose: () => void\n onSubmit: (data: { url: string; target?: string; title?: string }) => void\n}\n\nexport function LinkModal({\n initialUrl = \"\",\n initialTarget = \"_self\",\n initialTitle = \"\",\n isOpen,\n onClose,\n onSubmit,\n}: LinkModalProps) {\n const [url, setUrl] = useState(initialUrl)\n const [target, setTarget] = useState(initialTarget)\n const [title, setTitle] = useState(initialTitle)\n const [error, setError] = useState(\"\")\n\n if (!isOpen) return null\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (!url.trim()) {\n setError(\"URL is required\")\n return\n }\n\n if (url.trim().toLowerCase().startsWith(\"javascript:\")) {\n setError(\"Unsafe URL protocol (javascript:) is not permitted.\")\n return\n }\n\n let finalUrl = url.trim()\n if (!/^https?:\\/\\//i.test(finalUrl) && !/^\\//.test(finalUrl) && !/^mailto:/i.test(finalUrl) && !/^tel:/i.test(finalUrl)) {\n finalUrl = `https://${finalUrl}`\n }\n\n onSubmit({\n url: finalUrl,\n target: target === \"_blank\" ? \"_blank\" : undefined,\n title: title.trim() || undefined,\n })\n onClose()\n }\n\n return (\n <div className=\"oue-dialog-overlay\" onClick={onClose}>\n <div className=\"oue-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"oue-dialog-title\">Insert / Edit Link</div>\n <form onSubmit={handleSubmit}>\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">URL</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => {\n setUrl(e.target.value)\n setError(\"\")\n }}\n autoFocus\n />\n {error && <span style={{ color: \"#ef4444\", fontSize: 12 }}>{error}</span>}\n </div>\n\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Title (optional)</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"Link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n\n <div className=\"oue-dialog-field\" style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <input\n type=\"checkbox\"\n id=\"oue-link-target\"\n checked={target === \"_blank\"}\n onChange={(e) => setTarget(e.target.checked ? \"_blank\" : \"_self\")}\n />\n <label htmlFor=\"oue-link-target\" className=\"oue-dialog-label\" style={{ cursor: \"pointer\" }}>\n Open in new tab (target=\"_blank\")\n </label>\n </div>\n\n <div className=\"oue-dialog-actions\">\n <button type=\"button\" className=\"oue-toolbar-btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n type=\"submit\"\n className=\"oue-toolbar-btn\"\n style={{ backgroundColor: \"var(--oue-primary)\", color: \"var(--oue-primary-foreground)\", padding: \"0 14px\" }}\n >\n Save Link\n </button>\n </div>\n </form>\n </div>\n </div>\n )\n}\n","import React, { useState } from \"react\"\nimport type { ImageUploadHandler } from \"../types\"\n\ninterface ImageModalProps {\n isOpen: boolean\n onClose: () => void\n uploader?: ImageUploadHandler\n maxSize?: number // in bytes\n allowedTypes?: string[]\n onSubmit: (data: { src: string; alt?: string; width?: number; height?: number }) => void\n}\n\nexport function ImageModal({\n isOpen,\n onClose,\n uploader,\n maxSize,\n allowedTypes,\n onSubmit,\n}: ImageModalProps) {\n const [tab, setTab] = useState<\"url\" | \"upload\">(\"url\")\n const [url, setUrl] = useState(\"\")\n const [alt, setAlt] = useState(\"\")\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState(\"\")\n\n if (!isOpen) return null\n\n const handleUrlSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (!url.trim()) {\n setError(\"Image URL is required\")\n return\n }\n onSubmit({ src: url.trim(), alt: alt.trim() || undefined })\n onClose()\n }\n\n const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n\n if (maxSize && file.size > maxSize) {\n setError(`File size exceeds maximum allowed limit (${(maxSize / (1024 * 1024)).toFixed(1)} MB)`)\n return\n }\n\n if (allowedTypes && allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\n setError(`File type ${file.type} is not allowed.`)\n return\n }\n\n setIsLoading(true)\n setError(\"\")\n\n try {\n if (uploader) {\n const res = await uploader(file)\n onSubmit({\n src: res.src,\n alt: res.alt || alt.trim() || file.name,\n width: res.width,\n height: res.height,\n })\n } else {\n // Fallback FileReader base64\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n onSubmit({ src: reader.result, alt: alt.trim() || file.name })\n }\n }\n reader.readAsDataURL(file)\n }\n onClose()\n } catch (err: any) {\n setError(err?.message || \"Failed to upload image\")\n } finally {\n setIsLoading(false)\n }\n }\n\n return (\n <div className=\"oue-dialog-overlay\" onClick={onClose}>\n <div className=\"oue-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"oue-dialog-title\">Insert Image</div>\n\n <div style={{ display: \"flex\", gap: 12, marginBottom: 16, borderBottom: \"1px solid var(--oue-border)\" }}>\n <button\n type=\"button\"\n className={`oue-toolbar-btn ${tab === \"url\" ? \"oue-active\" : \"\"}`}\n onClick={() => setTab(\"url\")}\n >\n Image URL\n </button>\n <button\n type=\"button\"\n className={`oue-toolbar-btn ${tab === \"upload\" ? \"oue-active\" : \"\"}`}\n onClick={() => setTab(\"upload\")}\n >\n Upload File\n </button>\n </div>\n\n {tab === \"url\" ? (\n <form onSubmit={handleUrlSubmit}>\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Image URL</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"https://example.com/image.jpg\"\n value={url}\n onChange={(e) => {\n setUrl(e.target.value)\n setError(\"\")\n }}\n autoFocus\n />\n </div>\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Alt Text (description)</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"Describe image...\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n />\n </div>\n {error && <div style={{ color: \"#ef4444\", fontSize: 12, marginBottom: 12 }}>{error}</div>}\n <div className=\"oue-dialog-actions\">\n <button type=\"button\" className=\"oue-toolbar-btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n type=\"submit\"\n className=\"oue-toolbar-btn\"\n style={{ backgroundColor: \"var(--oue-primary)\", color: \"var(--oue-primary-foreground)\", padding: \"0 14px\" }}\n >\n Insert Image\n </button>\n </div>\n </form>\n ) : (\n <div>\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Select Image File</label>\n <input\n type=\"file\"\n accept={allowedTypes ? allowedTypes.join(\",\") : \"image/*\"}\n onChange={handleFileUpload}\n disabled={isLoading}\n />\n </div>\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Alt Text (optional)</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"Describe image...\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n />\n </div>\n {isLoading && <div style={{ fontSize: 13, color: \"var(--oue-text-muted)\", margin: \"8px 0\" }}>Uploading...</div>}\n {error && <div style={{ color: \"#ef4444\", fontSize: 12, marginBottom: 12 }}>{error}</div>}\n <div className=\"oue-dialog-actions\">\n <button type=\"button\" className=\"oue-toolbar-btn\" onClick={onClose}>\n Cancel\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import React, { useState } from \"react\"\n\ninterface TableModalProps {\n isOpen: boolean\n onClose: () => void\n onSubmit: (rows: number, cols: number) => void\n}\n\nexport function TableModal({ isOpen, onClose, onSubmit }: TableModalProps) {\n const [rows, setRows] = useState(3)\n const [cols, setCols] = useState(3)\n\n if (!isOpen) return null\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n onSubmit(Math.max(1, rows), Math.max(1, cols))\n onClose()\n }\n\n return (\n <div className=\"oue-dialog-overlay\" onClick={onClose}>\n <div className=\"oue-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"oue-dialog-title\">Insert Table</div>\n <form onSubmit={handleSubmit}>\n <div style={{ display: \"flex\", gap: 16 }}>\n <div className=\"oue-dialog-field\" style={{ flex: 1 }}>\n <label className=\"oue-dialog-label\">Rows</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"20\"\n className=\"oue-dialog-input\"\n value={rows}\n onChange={(e) => setRows(parseInt(e.target.value) || 1)}\n autoFocus\n />\n </div>\n <div className=\"oue-dialog-field\" style={{ flex: 1 }}>\n <label className=\"oue-dialog-label\">Columns</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"20\"\n className=\"oue-dialog-input\"\n value={cols}\n onChange={(e) => setCols(parseInt(e.target.value) || 1)}\n />\n </div>\n </div>\n\n <div className=\"oue-dialog-actions\">\n <button type=\"button\" className=\"oue-toolbar-btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n type=\"submit\"\n className=\"oue-toolbar-btn\"\n style={{ backgroundColor: \"var(--oue-primary)\", color: \"var(--oue-primary-foreground)\", padding: \"0 14px\" }}\n >\n Insert Table\n </button>\n </div>\n </form>\n </div>\n </div>\n )\n}\n","import React, { useState } from \"react\"\nimport { useEditor } from \"../core/EditorContext\"\n\ninterface FindReplaceDialogProps {\n isOpen: boolean\n onClose: () => void\n}\n\nexport function FindReplaceDialog({ isOpen, onClose }: FindReplaceDialogProps) {\n const { editor, getHTML, setHTML } = useEditor()\n const [findText, setFindText] = useState(\"\")\n const [replaceText, setReplaceText] = useState(\"\")\n const [matchCase, setMatchCase] = useState(false)\n const [statusMessage, setStatusMessage] = useState(\"\")\n\n if (!isOpen) return null\n\n const handleReplaceAll = () => {\n if (!findText) return\n const html = getHTML()\n const flags = matchCase ? \"g\" : \"gi\"\n const regex = new RegExp(findText.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), flags)\n const matches = (html.match(regex) || []).length\n\n if (matches === 0) {\n setStatusMessage(\"No matches found\")\n return\n }\n\n const updatedHtml = html.replace(regex, replaceText)\n setHTML(updatedHtml)\n setStatusMessage(`Replaced ${matches} occurrence(s)`)\n }\n\n const handleReplaceNext = () => {\n if (!findText) return\n const html = getHTML()\n const flags = matchCase ? \"\" : \"i\"\n const regex = new RegExp(findText.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), flags)\n if (!regex.test(html)) {\n setStatusMessage(\"No matches found\")\n return\n }\n const updatedHtml = html.replace(regex, replaceText)\n setHTML(updatedHtml)\n setStatusMessage(\"Replaced 1 occurrence\")\n }\n\n return (\n <div className=\"oue-dialog-overlay\" onClick={onClose}>\n <div className=\"oue-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"oue-dialog-title\">Find and Replace</div>\n\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Find</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"Search text...\"\n value={findText}\n onChange={(e) => {\n setFindText(e.target.value)\n setStatusMessage(\"\")\n }}\n autoFocus\n />\n </div>\n\n <div className=\"oue-dialog-field\">\n <label className=\"oue-dialog-label\">Replace with</label>\n <input\n type=\"text\"\n className=\"oue-dialog-input\"\n placeholder=\"Replacement text...\"\n value={replaceText}\n onChange={(e) => {\n setReplaceText(e.target.value)\n setStatusMessage(\"\")\n }}\n />\n </div>\n\n <div className=\"oue-dialog-field\" style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <input\n type=\"checkbox\"\n id=\"oue-match-case\"\n checked={matchCase}\n onChange={(e) => setMatchCase(e.target.checked)}\n />\n <label htmlFor=\"oue-match-case\" className=\"oue-dialog-label\" style={{ cursor: \"pointer\" }}>\n Match case\n </label>\n </div>\n\n {statusMessage && (\n <div style={{ fontSize: 12, color: \"var(--oue-primary)\", margin: \"8px 0\" }}>\n {statusMessage}\n </div>\n )}\n\n <div className=\"oue-dialog-actions\">\n <button type=\"button\" className=\"oue-toolbar-btn\" onClick={onClose}>\n Close\n </button>\n <button type=\"button\" className=\"oue-toolbar-btn\" onClick={handleReplaceNext}>\n Replace\n </button>\n <button\n type=\"button\"\n className=\"oue-toolbar-btn\"\n style={{ backgroundColor: \"var(--oue-primary)\", color: \"var(--oue-primary-foreground)\", padding: \"0 14px\" }}\n onClick={handleReplaceAll}\n >\n Replace All\n </button>\n </div>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useState, useRef } from \"react\"\nimport { useEditor } from \"../core/EditorContext\"\nimport { getIcon } from \"../components/Icons\"\nimport { LinkModal } from \"../components/LinkModal\"\nimport type { ToolbarConfig } from \"../types\"\n\ninterface BubbleToolbarProps {\n config?: ToolbarConfig\n}\n\nexport function BubbleToolbar({ config }: BubbleToolbarProps) {\n const editorCtx = useEditor()\n const { editor, activeStates, icons } = editorCtx\n\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null)\n const [isLinkOpen, setIsLinkOpen] = useState(false)\n const toolbarRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!editor || config === false) return\n\n const updatePosition = () => {\n const selection = window.getSelection()\n if (!selection || selection.isCollapsed || !selection.rangeCount) {\n setPosition(null)\n return\n }\n\n const range = selection.getRangeAt(0)\n const rect = range.getBoundingClientRect()\n\n if (rect.width === 0 || rect.height === 0) {\n setPosition(null)\n return\n }\n\n const top = rect.top - 48 + window.scrollY\n const left = rect.left + rect.width / 2 + window.scrollX\n\n setPosition({ top: Math.max(10, top), left })\n }\n\n document.addEventListener(\"selectionchange\", updatePosition)\n return () => document.removeEventListener(\"selectionchange\", updatePosition)\n }, [editor, config])\n\n if (config === false || !position) return null\n\n const items = config || [\"bold\", \"italic\", \"underline\", \"strike\", \"link\"]\n\n return (\n <>\n <div\n ref={toolbarRef}\n className=\"oue-bubble-toolbar\"\n style={{\n top: position.top,\n left: position.left,\n transform: \"translateX(-50%)\",\n }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {items.map((item, idx) => {\n if (typeof item !== \"string\") return null\n switch (item) {\n case \"bold\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Bold\"\n className={`oue-toolbar-btn ${activeStates.isBold ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleBold}\n >\n {getIcon(\"bold\", icons)}\n </button>\n )\n case \"italic\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Italic\"\n className={`oue-toolbar-btn ${activeStates.isItalic ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleItalic}\n >\n {getIcon(\"italic\", icons)}\n </button>\n )\n case \"underline\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Underline\"\n className={`oue-toolbar-btn ${activeStates.isUnderline ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleUnderline}\n >\n {getIcon(\"underline\", icons)}\n </button>\n )\n case \"strike\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Strikethrough\"\n className={`oue-toolbar-btn ${activeStates.isStrikethrough ? \"oue-active\" : \"\"}`}\n onClick={editorCtx.toggleStrikethrough}\n >\n {getIcon(\"strike\", icons)}\n </button>\n )\n case \"link\":\n return (\n <button\n key={idx}\n type=\"button\"\n aria-label=\"Link\"\n className={`oue-toolbar-btn ${activeStates.isLink ? \"oue-active\" : \"\"}`}\n onClick={() => setIsLinkOpen(true)}\n >\n {getIcon(\"link\", icons)}\n </button>\n )\n default:\n return null\n }\n })}\n </div>\n\n <LinkModal\n isOpen={isLinkOpen}\n onClose={() => setIsLinkOpen(false)}\n onSubmit={({ url, target, title }) => editorCtx.insertLink(url, target, title)}\n />\n </>\n )\n}\n","import type { EditorExtension, ToolbarItem } from \"../types\"\nimport type { ComponentType } from \"react\"\n\nexport interface ExtensionConfig<Options = Record<string, unknown>> {\n name: string\n nodes?: Array<unknown>\n plugins?: Array<ComponentType>\n commands?: Array<{\n name: string\n action: (editor: unknown) => void\n }>\n toolbarItems?: ToolbarItem[]\n configure?: (options?: Options) => EditorExtension\n}\n\nexport function createExtension<Options = Record<string, unknown>>(\n config: ExtensionConfig<Options>\n): EditorExtension & { configure: (options?: Options) => EditorExtension } {\n const extension: EditorExtension & { configure: (options?: Options) => EditorExtension } = {\n name: config.name,\n nodes: config.nodes || [],\n plugins: config.plugins || [],\n commands: config.commands || [],\n toolbarItems: config.toolbarItems || [],\n configure: (options?: Options) => {\n if (config.configure) {\n return config.configure(options)\n }\n return extension\n },\n }\n\n return extension\n}\n","import { createExtension } from \"../../core/Extension\"\nimport { ImageNode } from \"./ImageNode\"\nimport type { ImageUploadHandler } from \"../../types\"\n\nexport interface ImageExtensionOptions {\n upload?: ImageUploadHandler\n maxSize?: number\n allowedTypes?: string[]\n}\n\nexport const ImageExtension = createExtension<ImageExtensionOptions>({\n name: \"image\",\n nodes: [ImageNode],\n configure: (options?: ImageExtensionOptions) => {\n return {\n name: \"image\",\n nodes: [ImageNode],\n options,\n } as any\n },\n})\n","import { TableNode, TableRowNode, TableCellNode } from \"@lexical/table\"\nimport { createExtension } from \"../../core/Extension\"\n\nexport const TableExtension = createExtension({\n name: \"table\",\n nodes: [TableNode, TableRowNode, TableCellNode],\n})\n","import { CodeNode, CodeHighlightNode } from \"@lexical/code\"\nimport { createExtension } from \"../../core/Extension\"\n\nexport const CodeExtension = createExtension({\n name: \"code\",\n nodes: [CodeNode, CodeHighlightNode],\n})\n","import { createExtension } from \"../../core/Extension\"\n\nexport interface MediaExtensionOptions {\n youtube?: boolean\n allowedDomains?: string[]\n}\n\nexport const MediaExtension = createExtension<MediaExtensionOptions>({\n name: \"media\",\n configure: (options?: MediaExtensionOptions) => {\n return {\n name: \"media\",\n options: options || { youtube: true, allowedDomains: [\"youtube.com\", \"youtu.be\"] },\n } as any\n },\n})\n","import { createExtension } from \"../../core/Extension\"\nimport type { FileUploadHandler } from \"../../types\"\n\nexport interface FileExtensionOptions {\n upload?: FileUploadHandler\n}\n\nexport const FileExtension = createExtension<FileExtensionOptions>({\n name: \"file\",\n configure: (options?: FileExtensionOptions) => {\n return {\n name: \"file\",\n options,\n } as any\n },\n})\n","import { createExtension } from \"../../core/Extension\"\nimport type { MentionUser } from \"../../types\"\n\nexport interface MentionExtensionOptions {\n trigger?: string\n search?: (query: string) => Promise<MentionUser[]> | MentionUser[]\n}\n\nexport const MentionExtension = createExtension<MentionExtensionOptions>({\n name: \"mention\",\n configure: (options?: MentionExtensionOptions) => {\n return {\n name: \"mention\",\n options: options || { trigger: \"@\" },\n } as any\n },\n})\n","import { createExtension } from \"../../core/Extension\"\n\nexport const EmojiExtension = createExtension({\n name: \"emoji\",\n})\n","import { createExtension } from \"../../core/Extension\"\nimport type { SlashCommandItem } from \"../../types\"\n\nexport interface SlashCommandExtensionOptions {\n commands?: SlashCommandItem[]\n}\n\nexport const SlashCommandExtension = createExtension<SlashCommandExtensionOptions>({\n name: \"slashCommand\",\n configure: (options?: SlashCommandExtensionOptions) => {\n return {\n name: \"slashCommand\",\n options,\n } as any\n },\n})\n","import { ImageExtension } from \"../extensions/image/ImageExtension\"\nimport { TableExtension } from \"../extensions/table/TableExtension\"\nimport { CodeExtension } from \"../extensions/code/CodeExtension\"\nimport { MediaExtension } from \"../extensions/media/MediaExtension\"\nimport { FileExtension } from \"../extensions/file/FileExtension\"\nimport { MentionExtension } from \"../extensions/mention/MentionExtension\"\nimport { EmojiExtension } from \"../extensions/emoji/EmojiExtension\"\nimport { SlashCommandExtension } from \"../extensions/slash-command/SlashCommandExtension\"\n\nexport const basicPreset = []\n\nexport const fullPreset = [\n ImageExtension,\n TableExtension,\n CodeExtension,\n MediaExtension,\n FileExtension,\n MentionExtension,\n EmojiExtension,\n SlashCommandExtension,\n]\n","import { sanitizeHTML } from \"../security/sanitizer\"\n\nexport function cleanPastedHTML(rawHtml: string): string {\n if (!rawHtml) return \"\"\n\n let cleaned = rawHtml\n\n // 1. Remove proprietary office comments & XML tags\n cleaned = cleaned.replace(/<!--[\\s\\S]*?-->/g, \"\")\n cleaned = cleaned.replace(/<\\/?(?:xml|meta|link|style)\\b[^>]*>/gi, \"\")\n\n // 2. Remove proprietary class names like MsoNormal, MsoListParagraph, etc.\n cleaned = cleaned.replace(/class=[\"']?\\bMso[a-zA-Z0-9_-]+\\b[\"']?/gi, \"\")\n\n // 3. Remove inline mso-* styles\n cleaned = cleaned.replace(/style=[\"']([^\"']*)[\"']/gi, (match, styleContent) => {\n const cleanStyles = styleContent\n .split(\";\")\n .filter((style: string) => {\n const trimmed = style.trim().toLowerCase()\n return (\n trimmed &&\n !trimmed.startsWith(\"mso-\") &&\n !trimmed.startsWith(\"font-family\") &&\n !trimmed.startsWith(\"line-height\") &&\n !trimmed.startsWith(\"tab-stops\")\n )\n })\n .join(\";\")\n return cleanStyles ? `style=\"${cleanStyles}\"` : \"\"\n })\n\n // 4. Unwrap unnecessary span tags with no attributes or empty style\n cleaned = cleaned.replace(/<span\\s*>(.*?)<\\/span>/gi, \"$1\")\n cleaned = cleaned.replace(/<span\\s+style=[\"']\\s*[\"']>(.*?)<\\/span>/gi, \"$1\")\n\n // 5. Clean up inline styled wrapper spans\n cleaned = cleaned.replace(/<b\\s+style=[\"']font-weight:\\s*normal;?[\"']>(.*?)<\\/b>/gi, \"$1\")\n cleaned = cleaned.replace(/<span\\s+style=[\"'][^\"']*font-weight:\\s*700;?[^\"']*[\"']>(.*?)<\\/span>/gi, \"<strong>$1</strong>\")\n cleaned = cleaned.replace(/<span\\s+style=[\"'][^\"']*font-style:\\s*italic;?[^\"']*[\"']>(.*?)<\\/span>/gi, \"<em>$1</em>\")\n\n // 6. Sanitize with DOMPurify\n return sanitizeHTML(cleaned)\n}\n"],"mappings":"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","names":["useRef","useState","useEffect","TableNode","TableRowNode","TableCellNode","CodeNode","CodeHighlightNode","$getRoot","useState","jsx","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs","useEffect","useRef","useState","TableNode","TableRowNode","TableCellNode","CodeNode","CodeHighlightNode","$getRoot"]}