rte-builder 2.0.2 โ†’ 2.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extensions/FontSize.ts","../src/extensions/LineHeight.ts","../src/extensions/Video.ts","../src/extensions/Emoji.ts","../src/extensions/Fullscreen.ts","../src/extensions/Print.ts","../src/extensions/Indent.ts","../src/adapters/tiptap/TipTapToolbar.tsx","../src/adapters/tiptap/TipTapEditorComponent.tsx","../node_modules/is-hotkey/lib/index.js","../src/adapters/slate/SlateToolbar.tsx","../src/adapters/slate/SlateEditorComponent.tsx","../src/adapters/lexical/LexicalToolbar.tsx","../src/adapters/lexical/LexicalEditorComponent.tsx","../src/index.tsx","../src/components/UnifiedEditor.tsx","../src/core/registry.ts","../src/core/presets.ts","../src/core/types.ts","../src/adapters/tiptap/TipTapAdapter.ts","../src/adapters/tiptap/index.ts","../src/adapters/slate/SlateAdapter.ts","../src/adapters/lexical/LexicalAdapter.ts","../src/components/RichTextEditor.tsx","../src/components/Toolbar.tsx","../src/collaboration/CollaborationContext.tsx","../src/collaboration/PresenceIndicator.tsx","../src/comments/types.ts","../src/comments/CommentsContext.tsx","../src/comments/CommentsPanel.tsx","../src/history/VersionHistoryContext.tsx","../src/history/VersionHistoryPanel.tsx"],"sourcesContent":["import { Extension } from '@tiptap/core'\n\nexport type FontSizeOptions = {\n types: string[]\n}\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<FontSizeOptions>({\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) =>\n 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 return chain().setMark('textStyle', { fontSize }).run()\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain()\n .setMark('textStyle', { fontSize: null })\n .removeEmptyTextStyle()\n .run()\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport type LineHeightOptions = {\n types: string[]\n defaultLineHeight: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n lineHeight: {\n /**\n * Set the line height\n */\n setLineHeight: (lineHeight: string) => ReturnType\n /**\n * Unset the line height\n */\n unsetLineHeight: () => ReturnType\n }\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading'],\n defaultLineHeight: 'normal',\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) =>\n element.style.lineHeight || this.options.defaultLineHeight,\n renderHTML: (attributes) => {\n if (!attributes.lineHeight) {\n return {}\n }\n\n return {\n style: `line-height: ${attributes.lineHeight}`,\n }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { lineHeight }),\n )\n },\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, 'lineHeight'),\n )\n },\n }\n },\n})\n","import { Node, mergeAttributes } from '@tiptap/core'\n\nexport interface VideoOptions {\n inline: boolean\n allowBase64: boolean\n HTMLAttributes: Record<string, unknown>\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n video: {\n /**\n * Insert a video\n */\n setVideo: (options: { src: string; alt?: string; title?: string }) => ReturnType\n }\n }\n}\n\nexport const Video = Node.create<VideoOptions>({\n name: 'video',\n\n addOptions() {\n return {\n inline: false,\n allowBase64: false,\n HTMLAttributes: {},\n }\n },\n\n inline() {\n return this.options.inline\n },\n\n group() {\n return this.options.inline ? 'inline' : 'block'\n },\n\n draggable: true,\n\n addAttributes() {\n return {\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n },\n height: {\n default: null,\n },\n controls: {\n default: true,\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'video',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'video',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ['source', { src: HTMLAttributes.src }],\n ]\n },\n\n addCommands() {\n return {\n setVideo:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface EmojiOptions {\n enableEmoticons: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n emoji: {\n /**\n * Insert an emoji at the current position\n */\n insertEmoji: (emoji: string) => ReturnType\n }\n }\n}\n\n// Common emoji categories\nexport const EMOJI_CATEGORIES = {\n smileys: {\n label: 'Smileys & People',\n emojis: [\n '๐Ÿ˜€', '๐Ÿ˜ƒ', '๐Ÿ˜„', '๐Ÿ˜', '๐Ÿ˜†', '๐Ÿ˜…', '๐Ÿคฃ', '๐Ÿ˜‚', '๐Ÿ™‚', '๐Ÿ™ƒ',\n '๐Ÿ˜‰', '๐Ÿ˜Š', '๐Ÿ˜‡', '๐Ÿฅฐ', '๐Ÿ˜', '๐Ÿคฉ', '๐Ÿ˜˜', '๐Ÿ˜—', '๐Ÿ˜š', '๐Ÿ˜™',\n '๐Ÿฅฒ', '๐Ÿ˜‹', '๐Ÿ˜›', '๐Ÿ˜œ', '๐Ÿคช', '๐Ÿ˜', '๐Ÿค‘', '๐Ÿค—', '๐Ÿคญ', '๐Ÿคซ',\n '๐Ÿค”', '๐Ÿค', '๐Ÿคจ', '๐Ÿ˜', '๐Ÿ˜‘', '๐Ÿ˜ถ', '๐Ÿ˜', '๐Ÿ˜’', '๐Ÿ™„', '๐Ÿ˜ฌ',\n '๐Ÿ˜ฎโ€๐Ÿ’จ', '๐Ÿคฅ', '๐Ÿ˜Œ', '๐Ÿ˜”', '๐Ÿ˜ช', '๐Ÿคค', '๐Ÿ˜ด', '๐Ÿ˜ท', '๐Ÿค’', '๐Ÿค•',\n '๐Ÿคข', '๐Ÿคฎ', '๐Ÿคง', '๐Ÿฅต', '๐Ÿฅถ', '๐Ÿฅด', '๐Ÿ˜ต', '๐Ÿคฏ', '๐Ÿค ', '๐Ÿฅณ',\n '๐Ÿฅธ', '๐Ÿ˜Ž', '๐Ÿค“', '๐Ÿง', '๐Ÿ˜•', '๐Ÿ˜Ÿ', '๐Ÿ™', 'โ˜น๏ธ', '๐Ÿ˜ฎ', '๐Ÿ˜ฏ',\n '๐Ÿ˜ฒ', '๐Ÿ˜ณ', '๐Ÿฅบ', '๐Ÿ˜ฆ', '๐Ÿ˜ง', '๐Ÿ˜จ', '๐Ÿ˜ฐ', '๐Ÿ˜ฅ', '๐Ÿ˜ข', '๐Ÿ˜ญ',\n '๐Ÿ˜ฑ', '๐Ÿ˜–', '๐Ÿ˜ฃ', '๐Ÿ˜ž', '๐Ÿ˜“', '๐Ÿ˜ฉ', '๐Ÿ˜ซ', '๐Ÿฅฑ', '๐Ÿ˜ค', '๐Ÿ˜ก',\n '๐Ÿ˜ ', '๐Ÿคฌ', '๐Ÿ˜ˆ', '๐Ÿ‘ฟ', '๐Ÿ’€', 'โ˜ ๏ธ', '๐Ÿ’ฉ', '๐Ÿคก', '๐Ÿ‘น', '๐Ÿ‘บ',\n ]\n },\n gestures: {\n label: 'Gestures & Body',\n emojis: [\n '๐Ÿ‘‹', '๐Ÿคš', '๐Ÿ–๏ธ', 'โœ‹', '๐Ÿ––', '๐Ÿ‘Œ', '๐ŸคŒ', '๐Ÿค', 'โœŒ๏ธ', '๐Ÿคž',\n '๐ŸคŸ', '๐Ÿค˜', '๐Ÿค™', '๐Ÿ‘ˆ', '๐Ÿ‘‰', '๐Ÿ‘†', '๐Ÿ–•', '๐Ÿ‘‡', 'โ˜๏ธ', '๐Ÿ‘',\n '๐Ÿ‘Ž', 'โœŠ', '๐Ÿ‘Š', '๐Ÿค›', '๐Ÿคœ', '๐Ÿ‘', '๐Ÿ™Œ', '๐Ÿ‘', '๐Ÿคฒ', '๐Ÿค',\n '๐Ÿ™', 'โœ๏ธ', '๐Ÿ’…', '๐Ÿคณ', '๐Ÿ’ช', '๐Ÿฆพ', '๐Ÿฆฟ', '๐Ÿฆต', '๐Ÿฆถ', '๐Ÿ‘‚',\n '๐Ÿฆป', '๐Ÿ‘ƒ', '๐Ÿง ', '๐Ÿซ€', '๐Ÿซ', '๐Ÿฆท', '๐Ÿฆด', '๐Ÿ‘€', '๐Ÿ‘๏ธ', '๐Ÿ‘…',\n '๐Ÿ‘„', '๐Ÿ’‹', '๐Ÿฉธ',\n ]\n },\n animals: {\n label: 'Animals & Nature',\n emojis: [\n '๐Ÿถ', '๐Ÿฑ', '๐Ÿญ', '๐Ÿน', '๐Ÿฐ', '๐ŸฆŠ', '๐Ÿป', '๐Ÿผ', '๐Ÿปโ€โ„๏ธ', '๐Ÿจ',\n '๐Ÿฏ', '๐Ÿฆ', '๐Ÿฎ', '๐Ÿท', '๐Ÿธ', '๐Ÿต', '๐Ÿ™ˆ', '๐Ÿ™‰', '๐Ÿ™Š', '๐Ÿ’',\n '๐Ÿ”', '๐Ÿง', '๐Ÿฆ', '๐Ÿค', '๐Ÿฃ', '๐Ÿฅ', '๐Ÿฆ†', '๐Ÿฆ…', '๐Ÿฆ‰', '๐Ÿฆ‡',\n '๐Ÿบ', '๐Ÿ—', '๐Ÿด', '๐Ÿฆ„', '๐Ÿ', '๐Ÿ›', '๐Ÿฆ‹', '๐ŸŒ', '๐Ÿž', '๐Ÿœ',\n '๐ŸฆŸ', '๐Ÿฆ—', '๐Ÿฆ‚', '๐Ÿข', '๐Ÿ', '๐ŸฆŽ', '๐Ÿฆ–', '๐Ÿฆ•', '๐Ÿ™', '๐Ÿฆ‘',\n '๐Ÿฆ', '๐Ÿฆž', '๐Ÿฆ€', '๐Ÿก', '๐Ÿ ', '๐ŸŸ', '๐Ÿฌ', '๐Ÿณ', '๐Ÿ‹', '๐Ÿฆˆ',\n '๐ŸŠ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฆ“', '๐Ÿฆ', '๐Ÿฆง', '๐Ÿฆฃ', '๐Ÿ˜', '๐Ÿฆ›', '๐Ÿฆ',\n '๐ŸŒธ', '๐ŸŒบ', '๐ŸŒป', '๐ŸŒผ', '๐ŸŒท', '๐ŸŒน', '๐Ÿฅ€', '๐ŸŒต', '๐ŸŒฒ', '๐ŸŒณ',\n '๐ŸŒด', '๐ŸŒฑ', '๐ŸŒฟ', 'โ˜˜๏ธ', '๐Ÿ€', '๐Ÿ', '๐Ÿ‚', '๐Ÿƒ', '๐Ÿ„', '๐ŸŒพ',\n ]\n },\n food: {\n label: 'Food & Drink',\n emojis: [\n '๐ŸŽ', '๐Ÿ', '๐ŸŠ', '๐Ÿ‹', '๐ŸŒ', '๐Ÿ‰', '๐Ÿ‡', '๐Ÿ“', '๐Ÿซ', '๐Ÿˆ',\n '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅญ', '๐Ÿ', '๐Ÿฅฅ', '๐Ÿฅ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฅ‘', '๐Ÿฅฆ',\n '๐Ÿฅฌ', '๐Ÿฅ’', '๐ŸŒถ๏ธ', '๐Ÿซ‘', '๐ŸŒฝ', '๐Ÿฅ•', '๐Ÿซ’', '๐Ÿง„', '๐Ÿง…', '๐Ÿฅ”',\n '๐Ÿ ', '๐Ÿฅ', '๐Ÿฅฏ', '๐Ÿž', '๐Ÿฅ–', '๐Ÿฅจ', '๐Ÿง€', '๐Ÿฅš', '๐Ÿณ', '๐Ÿงˆ',\n '๐Ÿฅž', '๐Ÿง‡', '๐Ÿฅ“', '๐Ÿฅฉ', '๐Ÿ—', '๐Ÿ–', '๐Ÿฆด', '๐ŸŒญ', '๐Ÿ”', '๐ŸŸ',\n '๐Ÿ•', '๐Ÿซ“', '๐Ÿฅช', '๐Ÿฅ™', '๐Ÿง†', '๐ŸŒฎ', '๐ŸŒฏ', '๐Ÿซ”', '๐Ÿฅ—', '๐Ÿฅ˜',\n '๐Ÿซ•', '๐Ÿ', '๐Ÿœ', '๐Ÿฒ', '๐Ÿ›', '๐Ÿฃ', '๐Ÿฑ', '๐ŸฅŸ', '๐Ÿฆช', '๐Ÿค',\n '๐Ÿ™', '๐Ÿš', '๐Ÿ˜', '๐Ÿฅ', '๐Ÿฅ ', '๐Ÿฅฎ', '๐Ÿข', '๐Ÿก', '๐Ÿง', '๐Ÿจ',\n '๐Ÿฆ', '๐Ÿฅง', '๐Ÿง', '๐Ÿฐ', '๐ŸŽ‚', '๐Ÿฎ', '๐Ÿญ', '๐Ÿฌ', '๐Ÿซ', '๐Ÿฟ',\n '๐Ÿฉ', '๐Ÿช', '๐ŸŒฐ', '๐Ÿฅœ', '๐Ÿฏ', 'โ˜•', '๐Ÿต', '๐Ÿงƒ', '๐Ÿฅค', '๐Ÿถ',\n '๐Ÿบ', '๐Ÿป', '๐Ÿฅ‚', '๐Ÿท', '๐Ÿฅƒ', '๐Ÿธ', '๐Ÿน', '๐Ÿง‰', '๐ŸงŠ',\n ]\n },\n activities: {\n label: 'Activities',\n emojis: [\n 'โšฝ', '๐Ÿ€', '๐Ÿˆ', 'โšพ', '๐ŸฅŽ', '๐ŸŽพ', '๐Ÿ', '๐Ÿ‰', '๐Ÿฅ', '๐ŸŽฑ',\n '๐Ÿช€', '๐Ÿ“', '๐Ÿธ', '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅ', '๐Ÿ', '๐Ÿชƒ', '๐Ÿฅ…', 'โ›ณ',\n '๐Ÿช', '๐Ÿน', '๐ŸŽฃ', '๐Ÿคฟ', '๐ŸฅŠ', '๐Ÿฅ‹', '๐ŸŽฝ', '๐Ÿ›น', '๐Ÿ›ผ', '๐Ÿ›ท',\n 'โ›ธ๏ธ', '๐ŸฅŒ', '๐ŸŽฟ', 'โ›ท๏ธ', '๐Ÿ‚', '๐Ÿช‚', '๐Ÿ‹๏ธ', '๐Ÿคผ', '๐Ÿคธ', 'โ›น๏ธ',\n '๐Ÿคบ', '๐Ÿคพ', '๐ŸŒ๏ธ', '๐Ÿ‡', '๐Ÿง˜', '๐Ÿ„', '๐ŸŠ', '๐Ÿคฝ', '๐Ÿšฃ', '๐Ÿง—',\n '๐Ÿšต', '๐Ÿšด', '๐Ÿ†', '๐Ÿฅ‡', '๐Ÿฅˆ', '๐Ÿฅ‰', '๐Ÿ…', '๐ŸŽ–๏ธ', '๐Ÿต๏ธ', '๐ŸŽ—๏ธ',\n '๐ŸŽซ', '๐ŸŽŸ๏ธ', '๐ŸŽช', '๐ŸŽญ', '๐ŸŽจ', '๐ŸŽฌ', '๐ŸŽค', '๐ŸŽง', '๐ŸŽผ', '๐ŸŽน',\n '๐Ÿฅ', '๐Ÿช˜', '๐ŸŽท', '๐ŸŽบ', '๐Ÿช—', '๐ŸŽธ', '๐Ÿช•', '๐ŸŽป', '๐ŸŽฒ', 'โ™Ÿ๏ธ',\n '๐ŸŽฏ', '๐ŸŽณ', '๐ŸŽฎ', '๐ŸŽฐ', '๐Ÿงฉ',\n ]\n },\n objects: {\n label: 'Objects',\n emojis: [\n 'โŒš', '๐Ÿ“ฑ', '๐Ÿ’ป', 'โŒจ๏ธ', '๐Ÿ–ฅ๏ธ', '๐Ÿ–จ๏ธ', '๐Ÿ–ฑ๏ธ', '๐Ÿ–ฒ๏ธ', '๐Ÿ•น๏ธ', '๐Ÿ—œ๏ธ',\n '๐Ÿ’ฝ', '๐Ÿ’พ', '๐Ÿ’ฟ', '๐Ÿ“€', '๐Ÿ“ผ', '๐Ÿ“ท', '๐Ÿ“ธ', '๐Ÿ“น', '๐ŸŽฅ', '๐Ÿ“ฝ๏ธ',\n '๐ŸŽž๏ธ', '๐Ÿ“ž', 'โ˜Ž๏ธ', '๐Ÿ“Ÿ', '๐Ÿ“ ', '๐Ÿ“บ', '๐Ÿ“ป', '๐ŸŽ™๏ธ', '๐ŸŽš๏ธ', '๐ŸŽ›๏ธ',\n '๐Ÿงญ', 'โฑ๏ธ', 'โฒ๏ธ', 'โฐ', '๐Ÿ•ฐ๏ธ', 'โŒ›', 'โณ', '๐Ÿ“ก', '๐Ÿ”‹', '๐Ÿ”Œ',\n '๐Ÿ’ก', '๐Ÿ”ฆ', '๐Ÿ•ฏ๏ธ', '๐Ÿช”', '๐Ÿงฏ', '๐Ÿ›ข๏ธ', '๐Ÿ’ธ', '๐Ÿ’ต', '๐Ÿ’ด', '๐Ÿ’ถ',\n '๐Ÿ’ท', '๐Ÿช™', '๐Ÿ’ฐ', '๐Ÿ’ณ', '๐Ÿงพ', '๐Ÿ’Ž', 'โš–๏ธ', '๐Ÿชœ', '๐Ÿงฐ', '๐Ÿช›',\n '๐Ÿ”ง', '๐Ÿ”จ', 'โš’๏ธ', '๐Ÿ› ๏ธ', 'โ›๏ธ', '๐Ÿชš', '๐Ÿ”ฉ', 'โš™๏ธ', '๐Ÿชค', '๐Ÿงฑ',\n 'โ›“๏ธ', '๐Ÿงฒ', '๐Ÿ”ซ', '๐Ÿ’ฃ', '๐Ÿงจ', '๐Ÿช“', '๐Ÿ”ช', '๐Ÿ—ก๏ธ', 'โš”๏ธ', '๐Ÿ›ก๏ธ',\n '๐Ÿšฌ', 'โšฐ๏ธ', '๐Ÿชฆ', 'โšฑ๏ธ', '๐Ÿบ', '๐Ÿ”ฎ', '๐Ÿ“ฟ', '๐Ÿงฟ', '๐Ÿ’ˆ', 'โš—๏ธ',\n '๐Ÿ”ญ', '๐Ÿ”ฌ', '๐Ÿ•ณ๏ธ', '๐Ÿฉน', '๐Ÿฉบ', '๐Ÿ’Š', '๐Ÿ’‰', '๐Ÿฉธ', '๐Ÿงฌ', '๐Ÿฆ ',\n '๐Ÿงซ', '๐Ÿงช', '๐ŸŒก๏ธ', '๐Ÿงน', '๐Ÿช ', '๐Ÿงบ', '๐Ÿงป', '๐Ÿšฝ', '๐Ÿšฐ', '๐Ÿšฟ',\n '๐Ÿ›', '๐Ÿ›€', '๐Ÿงผ', '๐Ÿชฅ', '๐Ÿช’', '๐Ÿงฝ', '๐Ÿชฃ', '๐Ÿงด', '๐Ÿ›Ž๏ธ', '๐Ÿ”‘',\n '๐Ÿ—๏ธ', '๐Ÿšช', '๐Ÿช‘', '๐Ÿ›‹๏ธ', '๐Ÿ›๏ธ', '๐Ÿ›Œ', '๐Ÿงธ', '๐Ÿช†', '๐Ÿ–ผ๏ธ', '๐Ÿชž',\n '๐ŸชŸ', '๐Ÿ›๏ธ', '๐Ÿ›’', '๐ŸŽ', '๐ŸŽˆ', '๐ŸŽ', '๐ŸŽ€', '๐Ÿช„', '๐Ÿช…', '๐ŸŽŠ',\n '๐ŸŽ‰', '๐ŸŽŽ', '๐Ÿฎ', '๐ŸŽ', '๐Ÿงง', 'โœ‰๏ธ', '๐Ÿ“ฉ', '๐Ÿ“จ', '๐Ÿ“ง', '๐Ÿ’Œ',\n '๐Ÿ“ฅ', '๐Ÿ“ค', '๐Ÿ“ฆ', '๐Ÿท๏ธ', '๐Ÿ“ช', '๐Ÿ“ซ', '๐Ÿ“ฌ', '๐Ÿ“ญ', '๐Ÿ“ฎ', '๐Ÿ“ฏ',\n '๐Ÿ“œ', '๐Ÿ“ƒ', '๐Ÿ“„', '๐Ÿ“‘', '๐Ÿงพ', '๐Ÿ“Š', '๐Ÿ“ˆ', '๐Ÿ“‰', '๐Ÿ—’๏ธ', '๐Ÿ—“๏ธ',\n '๐Ÿ“†', '๐Ÿ“…', '๐Ÿ—‘๏ธ', '๐Ÿ“‡', '๐Ÿ—ƒ๏ธ', '๐Ÿ—ณ๏ธ', '๐Ÿ—„๏ธ', '๐Ÿ“‹', '๐Ÿ“', '๐Ÿ“‚',\n '๐Ÿ—‚๏ธ', '๐Ÿ—ž๏ธ', '๐Ÿ“ฐ', '๐Ÿ““', '๐Ÿ“”', '๐Ÿ“’', '๐Ÿ“•', '๐Ÿ“—', '๐Ÿ“˜', '๐Ÿ“™',\n '๐Ÿ“š', '๐Ÿ“–', '๐Ÿ”–', '๐Ÿงท', '๐Ÿ”—', '๐Ÿ“Ž', '๐Ÿ–‡๏ธ', '๐Ÿ“', '๐Ÿ“', '๐Ÿงฎ',\n '๐Ÿ“Œ', '๐Ÿ“', 'โœ‚๏ธ', '๐Ÿ–Š๏ธ', '๐Ÿ–‹๏ธ', 'โœ’๏ธ', '๐Ÿ–Œ๏ธ', '๐Ÿ–๏ธ', '๐Ÿ“', 'โœ๏ธ',\n '๐Ÿ”', '๐Ÿ”Ž', '๐Ÿ”', '๐Ÿ”', '๐Ÿ”’', '๐Ÿ”“',\n ]\n },\n symbols: {\n label: 'Symbols',\n emojis: [\n 'โค๏ธ', '๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ', '๐Ÿ’”',\n 'โฃ๏ธ', '๐Ÿ’•', '๐Ÿ’ž', '๐Ÿ’“', '๐Ÿ’—', '๐Ÿ’–', '๐Ÿ’˜', '๐Ÿ’', '๐Ÿ’Ÿ', 'โ˜ฎ๏ธ',\n 'โœ๏ธ', 'โ˜ช๏ธ', '๐Ÿ•‰๏ธ', 'โ˜ธ๏ธ', 'โœก๏ธ', '๐Ÿ”ฏ', '๐Ÿ•Ž', 'โ˜ฏ๏ธ', 'โ˜ฆ๏ธ', '๐Ÿ›',\n 'โ›Ž', 'โ™ˆ', 'โ™‰', 'โ™Š', 'โ™‹', 'โ™Œ', 'โ™', 'โ™Ž', 'โ™', 'โ™',\n 'โ™‘', 'โ™’', 'โ™“', '๐Ÿ†”', 'โš›๏ธ', '๐Ÿ‰‘', 'โ˜ข๏ธ', 'โ˜ฃ๏ธ', '๐Ÿ“ด', '๐Ÿ“ณ',\n '๐Ÿˆถ', '๐Ÿˆš', '๐Ÿˆธ', '๐Ÿˆบ', '๐Ÿˆท๏ธ', 'โœด๏ธ', '๐Ÿ†š', '๐Ÿ’ฎ', '๐Ÿ‰', 'ใŠ™๏ธ',\n 'ใŠ—๏ธ', '๐Ÿˆด', '๐Ÿˆต', '๐Ÿˆน', '๐Ÿˆฒ', '๐Ÿ…ฐ๏ธ', '๐Ÿ…ฑ๏ธ', '๐Ÿ†Ž', '๐Ÿ†‘', '๐Ÿ…พ๏ธ',\n '๐Ÿ†˜', 'โŒ', 'โญ•', '๐Ÿ›‘', 'โ›”', '๐Ÿ“›', '๐Ÿšซ', '๐Ÿ’ฏ', '๐Ÿ’ข', 'โ™จ๏ธ',\n '๐Ÿšท', '๐Ÿšฏ', '๐Ÿšณ', '๐Ÿšฑ', '๐Ÿ”ž', '๐Ÿ“ต', '๐Ÿšญ', 'โ—', 'โ•', 'โ“',\n 'โ”', 'โ€ผ๏ธ', 'โ‰๏ธ', '๐Ÿ”…', '๐Ÿ”†', 'ใ€ฝ๏ธ', 'โš ๏ธ', '๐Ÿšธ', '๐Ÿ”ฑ', 'โšœ๏ธ',\n '๐Ÿ”ฐ', 'โ™ป๏ธ', 'โœ…', '๐Ÿˆฏ', '๐Ÿ’น', 'โ‡๏ธ', 'โœณ๏ธ', 'โŽ', '๐ŸŒ', '๐Ÿ’ ',\n 'โ“‚๏ธ', '๐ŸŒ€', '๐Ÿ’ค', '๐Ÿง', '๐Ÿšพ', 'โ™ฟ', '๐Ÿ…ฟ๏ธ', '๐Ÿ›—', '๐Ÿˆณ', '๐Ÿˆ‚๏ธ',\n '๐Ÿ›‚', '๐Ÿ›ƒ', '๐Ÿ›„', '๐Ÿ›…', '๐Ÿšน', '๐Ÿšบ', '๐Ÿšผ', 'โšง๏ธ', '๐Ÿšป', '๐Ÿšฎ',\n '๐ŸŽฆ', '๐Ÿ“ถ', '๐Ÿˆ', '๐Ÿ”ฃ', 'โ„น๏ธ', '๐Ÿ”ค', '๐Ÿ”ก', '๐Ÿ” ', '๐Ÿ†–', '๐Ÿ†—',\n '๐Ÿ†™', '๐Ÿ†’', '๐Ÿ†•', '๐Ÿ†“', '0๏ธโƒฃ', '1๏ธโƒฃ', '2๏ธโƒฃ', '3๏ธโƒฃ', '4๏ธโƒฃ', '5๏ธโƒฃ',\n '6๏ธโƒฃ', '7๏ธโƒฃ', '8๏ธโƒฃ', '9๏ธโƒฃ', '๐Ÿ”Ÿ', '๐Ÿ”ข', '#๏ธโƒฃ', '*๏ธโƒฃ', 'โ๏ธ', 'โ–ถ๏ธ',\n 'โธ๏ธ', 'โฏ๏ธ', 'โน๏ธ', 'โบ๏ธ', 'โญ๏ธ', 'โฎ๏ธ', 'โฉ', 'โช', 'โซ', 'โฌ',\n 'โ—€๏ธ', '๐Ÿ”ผ', '๐Ÿ”ฝ', 'โžก๏ธ', 'โฌ…๏ธ', 'โฌ†๏ธ', 'โฌ‡๏ธ', 'โ†—๏ธ', 'โ†˜๏ธ', 'โ†™๏ธ',\n 'โ†–๏ธ', 'โ†•๏ธ', 'โ†”๏ธ', 'โ†ช๏ธ', 'โ†ฉ๏ธ', 'โคด๏ธ', 'โคต๏ธ', '๐Ÿ”€', '๐Ÿ”', '๐Ÿ”‚',\n '๐Ÿ”„', '๐Ÿ”ƒ', '๐ŸŽต', '๐ŸŽถ', 'โž•', 'โž–', 'โž—', 'โœ–๏ธ', 'โ™พ๏ธ', '๐Ÿ’ฒ',\n '๐Ÿ’ฑ', 'โ„ข๏ธ', 'ยฉ๏ธ', 'ยฎ๏ธ', 'ใ€ฐ๏ธ', 'โžฐ', 'โžฟ', '๐Ÿ”š', '๐Ÿ”™', '๐Ÿ”›',\n '๐Ÿ”', '๐Ÿ”œ', 'โœ”๏ธ', 'โ˜‘๏ธ', '๐Ÿ”˜', '๐Ÿ”ด', '๐ŸŸ ', '๐ŸŸก', '๐ŸŸข', '๐Ÿ”ต',\n '๐ŸŸฃ', 'โšซ', 'โšช', '๐ŸŸค', '๐Ÿ”บ', '๐Ÿ”ป', '๐Ÿ”ธ', '๐Ÿ”น', '๐Ÿ”ถ', '๐Ÿ”ท',\n '๐Ÿ”ณ', '๐Ÿ”ฒ', 'โ–ช๏ธ', 'โ–ซ๏ธ', 'โ—พ', 'โ—ฝ', 'โ—ผ๏ธ', 'โ—ป๏ธ', '๐ŸŸฅ', '๐ŸŸง',\n '๐ŸŸจ', '๐ŸŸฉ', '๐ŸŸฆ', '๐ŸŸช', 'โฌ›', 'โฌœ', '๐ŸŸซ', '๐Ÿ”ˆ', '๐Ÿ”‡', '๐Ÿ”‰',\n '๐Ÿ”Š', '๐Ÿ””', '๐Ÿ”•', '๐Ÿ“ฃ', '๐Ÿ“ข', '๐Ÿ’ฌ', '๐Ÿ’ญ', '๐Ÿ—ฏ๏ธ', 'โ™ ๏ธ', 'โ™ฃ๏ธ',\n 'โ™ฅ๏ธ', 'โ™ฆ๏ธ', '๐Ÿƒ', '๐ŸŽด', '๐Ÿ€„', '๐Ÿ•', '๐Ÿ•‘', '๐Ÿ•’', '๐Ÿ•“', '๐Ÿ•”',\n '๐Ÿ••', '๐Ÿ•–', '๐Ÿ•—', '๐Ÿ•˜', '๐Ÿ•™', '๐Ÿ•š', '๐Ÿ•›', '๐Ÿ•œ', '๐Ÿ•', '๐Ÿ•ž',\n '๐Ÿ•Ÿ', '๐Ÿ• ', '๐Ÿ•ก', '๐Ÿ•ข', '๐Ÿ•ฃ', '๐Ÿ•ค', '๐Ÿ•ฅ', '๐Ÿ•ฆ', '๐Ÿ•ง',\n ]\n },\n flags: {\n label: 'Flags',\n emojis: [\n '๐Ÿณ๏ธ', '๐Ÿด', '๐Ÿดโ€โ˜ ๏ธ', '๐Ÿ', '๐Ÿšฉ', '๐ŸŽŒ', '๐Ÿณ๏ธโ€๐ŸŒˆ', '๐Ÿณ๏ธโ€โšง๏ธ',\n '๐Ÿ‡บ๐Ÿ‡ธ', '๐Ÿ‡ฌ๐Ÿ‡ง', '๐Ÿ‡จ๐Ÿ‡ฆ', '๐Ÿ‡ฆ๐Ÿ‡บ', '๐Ÿ‡ฎ๐Ÿ‡ณ', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‡จ๐Ÿ‡ณ', '๐Ÿ‡ฐ๐Ÿ‡ท',\n '๐Ÿ‡ฉ๐Ÿ‡ช', '๐Ÿ‡ซ๐Ÿ‡ท', '๐Ÿ‡ฎ๐Ÿ‡น', '๐Ÿ‡ช๐Ÿ‡ธ', '๐Ÿ‡ง๐Ÿ‡ท', '๐Ÿ‡ฒ๐Ÿ‡ฝ', '๐Ÿ‡ท๐Ÿ‡บ', '๐Ÿ‡ฟ๐Ÿ‡ฆ',\n ]\n }\n} as const\n\nexport const Emoji = Extension.create<EmojiOptions>({\n name: 'emoji',\n\n addOptions() {\n return {\n enableEmoticons: true,\n }\n },\n\n addCommands() {\n return {\n insertEmoji:\n (emoji: string) =>\n ({ commands }) => {\n return commands.insertContent(emoji)\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface FullscreenOptions {\n className: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fullscreen: {\n /**\n * Toggle fullscreen mode\n */\n toggleFullscreen: () => ReturnType\n /**\n * Enter fullscreen mode\n */\n enterFullscreen: () => ReturnType\n /**\n * Exit fullscreen mode\n */\n exitFullscreen: () => ReturnType\n }\n }\n}\n\nexport const Fullscreen = Extension.create<FullscreenOptions>({\n name: 'fullscreen',\n\n addOptions() {\n return {\n className: 'rte-builder-fullscreen',\n }\n },\n\n addStorage() {\n return {\n isFullscreen: false,\n }\n },\n\n addCommands() {\n return {\n toggleFullscreen:\n () =>\n ({ editor }) => {\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\n if (!wrapper) return false\n\n this.storage.isFullscreen = !this.storage.isFullscreen\n\n if (this.storage.isFullscreen) {\n wrapper.classList.add(this.options.className)\n document.body.style.overflow = 'hidden'\n } else {\n wrapper.classList.remove(this.options.className)\n document.body.style.overflow = ''\n }\n\n // Trigger re-render to update button state\n editor.view.dispatch(editor.state.tr)\n\n return true\n },\n enterFullscreen:\n () =>\n ({ editor }) => {\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\n if (!wrapper) return false\n\n this.storage.isFullscreen = true\n wrapper.classList.add(this.options.className)\n document.body.style.overflow = 'hidden'\n editor.view.dispatch(editor.state.tr)\n\n return true\n },\n exitFullscreen:\n () =>\n ({ editor }) => {\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\n if (!wrapper) return false\n\n this.storage.isFullscreen = false\n wrapper.classList.remove(this.options.className)\n document.body.style.overflow = ''\n editor.view.dispatch(editor.state.tr)\n\n return true\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n Escape: () => {\n if (this.storage.isFullscreen) {\n return this.editor.commands.exitFullscreen()\n }\n return false\n },\n 'Mod-Shift-f': () => {\n return this.editor.commands.toggleFullscreen()\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface PrintOptions {\n title?: string\n styles?: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n print: {\n /**\n * Print the editor content\n */\n print: () => ReturnType\n }\n }\n}\n\nconst defaultPrintStyles = `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #1f2937;\n padding: 20px;\n max-width: 800px;\n margin: 0 auto;\n }\n\n h1 { font-size: 2em; font-weight: 700; margin: 1em 0 0.5em; }\n h2 { font-size: 1.5em; font-weight: 700; margin: 0.83em 0 0.5em; }\n h3 { font-size: 1.25em; font-weight: 600; margin: 1em 0 0.5em; }\n h4 { font-size: 1.1em; font-weight: 600; margin: 1.33em 0 0.5em; }\n h5 { font-size: 1em; font-weight: 600; margin: 1.67em 0 0.5em; }\n h6 { font-size: 0.875em; font-weight: 600; margin: 2.33em 0 0.5em; }\n\n p { margin: 0 0 1em; }\n\n ul, ol { padding-left: 2em; margin: 0 0 1em; }\n ul { list-style-type: disc; }\n ol { list-style-type: decimal; }\n li { margin: 0.25em 0; }\n\n blockquote {\n border-left: 4px solid #3b82f6;\n padding-left: 1em;\n margin: 1em 0;\n color: #6b7280;\n font-style: italic;\n }\n\n code {\n background: #f3f4f6;\n color: #e11d48;\n padding: 2px 6px;\n border-radius: 3px;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9em;\n }\n\n pre {\n background: #1f2937;\n color: #f9fafb;\n padding: 1em;\n border-radius: 6px;\n overflow-x: auto;\n margin: 1em 0;\n }\n\n pre code {\n background: transparent;\n color: inherit;\n padding: 0;\n }\n\n a { color: #3b82f6; text-decoration: underline; }\n\n img, video {\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n display: block;\n margin: 1em 0;\n }\n\n hr {\n border: none;\n border-top: 2px solid #e5e7eb;\n margin: 2em 0;\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n }\n\n th, td {\n border: 1px solid #d1d5db;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n background: #f3f4f6;\n font-weight: 600;\n }\n\n mark {\n background-color: #fef08a;\n padding: 2px 0;\n }\n\n @media print {\n body {\n padding: 0;\n margin: 0;\n }\n\n pre {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n img, video {\n page-break-inside: avoid;\n }\n\n h1, h2, h3, h4, h5, h6 {\n page-break-after: avoid;\n }\n }\n`\n\nexport const Print = Extension.create<PrintOptions>({\n name: 'print',\n\n addOptions() {\n return {\n title: 'Print Document',\n styles: defaultPrintStyles,\n }\n },\n\n addCommands() {\n return {\n print:\n () =>\n ({ editor }) => {\n const content = editor.getHTML()\n const printWindow = window.open('', '_blank')\n\n if (!printWindow) {\n console.error('Failed to open print window. Please allow popups.')\n return false\n }\n\n const title = this.options.title || 'Print Document'\n const styles = this.options.styles || defaultPrintStyles\n\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${title}</title>\n <style>${styles}</style>\n </head>\n <body>\n ${content}\n </body>\n </html>\n `)\n\n printWindow.document.close()\n\n // Wait for content to load, then print\n printWindow.onload = () => {\n printWindow.focus()\n printWindow.print()\n // Close window after printing (optional - some browsers close automatically)\n // printWindow.close()\n }\n\n // Fallback for browsers that don't trigger onload\n setTimeout(() => {\n printWindow.focus()\n printWindow.print()\n }, 500)\n\n return true\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-p': () => {\n return this.editor.commands.print()\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface IndentOptions {\n types: string[]\n minIndent: number\n maxIndent: number\n indentUnit: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n indent: {\n /**\n * Indent the current block\n */\n indent: () => ReturnType\n /**\n * Outdent the current block\n */\n outdent: () => ReturnType\n }\n }\n}\n\nexport const Indent = Extension.create<IndentOptions>({\n name: 'indent',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading', 'blockquote'],\n minIndent: 0,\n maxIndent: 10,\n indentUnit: '2em',\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n indent: {\n default: 0,\n parseHTML: (element) => {\n const marginLeft = element.style.marginLeft\n if (marginLeft) {\n const match = marginLeft.match(/^(\\d+)/)\n if (match) {\n return parseInt(match[1], 10) / 2 // Assuming 2em per level\n }\n }\n return 0\n },\n renderHTML: (attributes) => {\n if (!attributes.indent || attributes.indent === 0) {\n return {}\n }\n\n return {\n style: `margin-left: ${attributes.indent * 2}em`,\n }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n indent:\n () =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n const { from, to } = selection\n\n let changed = false\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (this.options.types.includes(node.type.name)) {\n const currentIndent = node.attrs.indent || 0\n if (currentIndent < this.options.maxIndent) {\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n indent: currentIndent + 1,\n })\n }\n changed = true\n }\n }\n })\n\n return changed\n },\n\n outdent:\n () =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n const { from, to } = selection\n\n let changed = false\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (this.options.types.includes(node.type.name)) {\n const currentIndent = node.attrs.indent || 0\n if (currentIndent > this.options.minIndent) {\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n indent: currentIndent - 1,\n })\n }\n changed = true\n }\n }\n })\n\n return changed\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => this.editor.commands.indent(),\n 'Shift-Tab': () => this.editor.commands.outdent(),\n }\n },\n})\n","/**\n * TipTap Toolbar Component\n *\n * Toolbar implementation specific to TipTap editor.\n */\n\nimport React, { useState, useRef, useEffect } from 'react'\nimport type { Editor } from '@tiptap/react'\nimport type { ToolbarButtonType } from '../../core/types'\nimport { EMOJI_CATEGORIES } from '../../extensions/Emoji'\n\ninterface TipTapToolbarProps {\n editor: Editor | null\n buttons: ToolbarButtonType[]\n onMediaPickerImage?: () => void\n onMediaPickerVideo?: () => void\n}\n\nconst FONT_FAMILIES = [\n { value: 'Arial', label: 'Arial' },\n { value: 'Georgia', label: 'Georgia' },\n { value: 'Times New Roman', label: 'Times New Roman' },\n { value: 'Courier New', label: 'Courier New' },\n { value: 'Verdana', label: 'Verdana' },\n { value: 'Roboto', label: 'Roboto' },\n { value: 'Open Sans', label: 'Open Sans' },\n { value: 'Lato', label: 'Lato' },\n { value: 'Montserrat', label: 'Montserrat' },\n { value: 'Poppins', label: 'Poppins' },\n]\n\nconst FONT_SIZES = [\n '8px', '10px', '12px', '14px', '16px', '18px', '20px', '24px', '30px', '36px', '48px', '60px', '72px',\n]\n\nconst LINE_HEIGHTS = [\n { value: '1', label: 'Single' },\n { value: '1.15', label: '1.15' },\n { value: '1.5', label: '1.5' },\n { value: '1.75', label: '1.75' },\n { value: '2', label: 'Double' },\n { value: '2.5', label: '2.5' },\n { value: '3', label: 'Triple' },\n]\n\n// Emoji Picker Component\nconst EmojiPicker: React.FC<{\n onSelect: (emoji: string) => void\n onClose: () => void\n}> = ({ onSelect, onClose }) => {\n const [activeCategory, setActiveCategory] = useState<keyof typeof EMOJI_CATEGORIES>('smileys')\n const popoverRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n onClose()\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [onClose])\n\n return (\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n type=\"button\"\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? 'active' : ''}`}\n onClick={() => setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)}\n title={category.label}\n >\n {category.emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\n <button\n key={`${emoji}-${i}`}\n type=\"button\"\n className=\"rte-builder-emoji-btn\"\n onClick={() => {\n onSelect(emoji)\n onClose()\n }}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\nexport const TipTapToolbar: React.FC<TipTapToolbarProps> = ({\n editor,\n buttons,\n onMediaPickerImage,\n onMediaPickerVideo,\n}) => {\n const [showEmojiPicker, setShowEmojiPicker] = useState(false)\n const emojiButtonRef = useRef<HTMLButtonElement>(null)\n\n if (!editor) return null\n\n const ToolbarButton = ({\n onClick,\n active = false,\n disabled = false,\n children,\n title,\n buttonRef,\n }: {\n onClick: () => void\n active?: boolean\n disabled?: boolean\n children: React.ReactNode\n title?: string\n buttonRef?: React.RefObject<HTMLButtonElement>\n }) => (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`rte-builder-toolbar-btn ${active ? 'active' : ''} ${disabled ? 'disabled' : ''}`}\n >\n {children}\n </button>\n )\n\n const renderButton = (button: ToolbarButtonType, index: number) => {\n switch (button) {\n case 'bold':\n return (\n <ToolbarButton\n key=\"bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={editor.isActive('bold')}\n title=\"Bold (Ctrl+B)\"\n >\n <strong>B</strong>\n </ToolbarButton>\n )\n\n case 'italic':\n return (\n <ToolbarButton\n key=\"italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={editor.isActive('italic')}\n title=\"Italic (Ctrl+I)\"\n >\n <em>I</em>\n </ToolbarButton>\n )\n\n case 'underline':\n return (\n <ToolbarButton\n key=\"underline\"\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive('underline')}\n title=\"Underline (Ctrl+U)\"\n >\n <u>U</u>\n </ToolbarButton>\n )\n\n case 'strike':\n return (\n <ToolbarButton\n key=\"strike\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={editor.isActive('strike')}\n title=\"Strikethrough\"\n >\n <s>S</s>\n </ToolbarButton>\n )\n\n case 'code':\n return (\n <ToolbarButton\n key=\"code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n active={editor.isActive('code')}\n title=\"Inline Code\"\n >\n {'</>'}\n </ToolbarButton>\n )\n\n case 'codeBlock':\n return (\n <ToolbarButton\n key=\"codeBlock\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n active={editor.isActive('codeBlock')}\n title=\"Code Block\"\n >\n {'{ }'}\n </ToolbarButton>\n )\n\n case 'subscript':\n return (\n <ToolbarButton\n key=\"subscript\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={editor.isActive('subscript')}\n title=\"Subscript\"\n >\n X<sub>2</sub>\n </ToolbarButton>\n )\n\n case 'superscript':\n return (\n <ToolbarButton\n key=\"superscript\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={editor.isActive('superscript')}\n title=\"Superscript\"\n >\n X<sup>2</sup>\n </ToolbarButton>\n )\n\n case 'clearFormatting':\n return (\n <ToolbarButton\n key=\"clearFormatting\"\n onClick={() => editor.chain().focus().clearNodes().unsetAllMarks().run()}\n title=\"Clear Formatting\"\n >\n โœ•\n </ToolbarButton>\n )\n\n case 'fontFamily':\n return (\n <select\n key=\"fontFamily\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === 'default') {\n editor.chain().focus().unsetFontFamily().run()\n } else {\n editor.chain().focus().setFontFamily(e.target.value).run()\n }\n }}\n value={editor.getAttributes('textStyle').fontFamily || 'default'}\n >\n <option value=\"default\">Font Family</option>\n {FONT_FAMILIES.map((font) => (\n <option key={font.value} value={font.value}>\n {font.label}\n </option>\n ))}\n </select>\n )\n\n case 'fontSize':\n return (\n <select\n key=\"fontSize\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === 'default') {\n editor.chain().focus().unsetFontSize().run()\n } else {\n editor.chain().focus().setFontSize(e.target.value).run()\n }\n }}\n value={editor.getAttributes('textStyle').fontSize || 'default'}\n >\n <option value=\"default\">Font Size</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n )\n\n case 'lineHeight':\n return (\n <select\n key=\"lineHeight\"\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\n onChange={(e) => {\n if (e.target.value === 'default') {\n editor.chain().focus().unsetLineHeight().run()\n } else {\n editor.chain().focus().setLineHeight(e.target.value).run()\n }\n }}\n value={\n editor.getAttributes('paragraph').lineHeight ||\n editor.getAttributes('heading').lineHeight ||\n 'default'\n }\n title=\"Line Height\"\n >\n <option value=\"default\">Line Height</option>\n {LINE_HEIGHTS.map((lh) => (\n <option key={lh.value} value={lh.value}>\n {lh.label}\n </option>\n ))}\n </select>\n )\n\n case 'textColor':\n return (\n <span key=\"textColor\" className=\"rte-builder-toolbar-color\">\n <label title=\"Text Color\">\n A\n <input\n type=\"color\"\n onChange={(e) => editor.chain().focus().setColor(e.target.value).run()}\n value={editor.getAttributes('textStyle').color || '#000000'}\n />\n </label>\n </span>\n )\n\n case 'backgroundColor':\n return (\n <span key=\"backgroundColor\" className=\"rte-builder-toolbar-color\">\n <label title=\"Background Color\">\n โฌ›\n <input\n type=\"color\"\n onChange={(e) =>\n editor.chain().focus().toggleHighlight({ color: e.target.value }).run()\n }\n value={editor.getAttributes('highlight').color || '#ffff00'}\n />\n </label>\n </span>\n )\n\n case 'alignLeft':\n return (\n <ToolbarButton\n key=\"alignLeft\"\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n active={editor.isActive({ textAlign: 'left' })}\n title=\"Align Left\"\n >\n โฌ…\n </ToolbarButton>\n )\n\n case 'alignCenter':\n return (\n <ToolbarButton\n key=\"alignCenter\"\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n active={editor.isActive({ textAlign: 'center' })}\n title=\"Align Center\"\n >\n โ†”\n </ToolbarButton>\n )\n\n case 'alignRight':\n return (\n <ToolbarButton\n key=\"alignRight\"\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n active={editor.isActive({ textAlign: 'right' })}\n title=\"Align Right\"\n >\n โžก\n </ToolbarButton>\n )\n\n case 'alignJustify':\n return (\n <ToolbarButton\n key=\"alignJustify\"\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n active={editor.isActive({ textAlign: 'justify' })}\n title=\"Justify\"\n >\n โฌŒ\n </ToolbarButton>\n )\n\n case 'indent':\n return (\n <ToolbarButton\n key=\"indent\"\n onClick={() => editor.chain().focus().indent().run()}\n title=\"Indent (Tab)\"\n >\n โ†’|\n </ToolbarButton>\n )\n\n case 'outdent':\n return (\n <ToolbarButton\n key=\"outdent\"\n onClick={() => editor.chain().focus().outdent().run()}\n title=\"Outdent (Shift+Tab)\"\n >\n |โ†\n </ToolbarButton>\n )\n\n case 'bulletList':\n return (\n <ToolbarButton\n key=\"bulletList\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={editor.isActive('bulletList')}\n title=\"Bullet List\"\n >\n โ€ข\n </ToolbarButton>\n )\n\n case 'orderedList':\n return (\n <ToolbarButton\n key=\"orderedList\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={editor.isActive('orderedList')}\n title=\"Numbered List\"\n >\n 1.\n </ToolbarButton>\n )\n\n case 'heading1':\n case 'heading2':\n case 'heading3':\n case 'heading4':\n case 'heading5':\n case 'heading6':\n const level = parseInt(button.replace('heading', '')) as 1 | 2 | 3 | 4 | 5 | 6\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\n active={editor.isActive('heading', { level })}\n title={`Heading ${level}`}\n >\n H{level}\n </ToolbarButton>\n )\n\n case 'blockquote':\n return (\n <ToolbarButton\n key=\"blockquote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={editor.isActive('blockquote')}\n title=\"Blockquote\"\n >\n \"\n </ToolbarButton>\n )\n\n case 'horizontalRule':\n return (\n <ToolbarButton\n key=\"horizontalRule\"\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title=\"Horizontal Rule\"\n >\n โ€•\n </ToolbarButton>\n )\n\n case 'link':\n return (\n <ToolbarButton\n key=\"link\"\n onClick={() => {\n const url = window.prompt('Enter URL:')\n if (url) {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }}\n active={editor.isActive('link')}\n title=\"Insert Link\"\n >\n ๐Ÿ”—\n </ToolbarButton>\n )\n\n case 'unlink':\n return (\n <ToolbarButton\n key=\"unlink\"\n onClick={() => editor.chain().focus().unsetLink().run()}\n disabled={!editor.isActive('link')}\n title=\"Remove Link\"\n >\n ๐Ÿ”—โœ•\n </ToolbarButton>\n )\n\n case 'image':\n return (\n <ToolbarButton\n key=\"image\"\n onClick={() => {\n if (onMediaPickerImage) {\n onMediaPickerImage()\n } else {\n const url = window.prompt('Enter image URL:')\n if (url) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n }}\n title=\"Insert Image\"\n >\n ๐Ÿ–ผ๏ธ\n </ToolbarButton>\n )\n\n case 'video':\n return (\n <ToolbarButton\n key=\"video\"\n onClick={() => {\n if (onMediaPickerVideo) {\n onMediaPickerVideo()\n } else {\n const url = window.prompt('Enter video URL:')\n if (url) {\n editor.chain().focus().setVideo({ src: url }).run()\n }\n }\n }}\n title=\"Insert Video\"\n >\n ๐ŸŽฅ\n </ToolbarButton>\n )\n\n case 'table':\n return (\n <ToolbarButton\n key=\"table\"\n onClick={() =>\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()\n }\n title=\"Insert Table\"\n >\n โŠž\n </ToolbarButton>\n )\n\n case 'emoji':\n return (\n <span key=\"emoji\" style={{ position: 'relative' }}>\n <ToolbarButton\n buttonRef={emojiButtonRef}\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n active={showEmojiPicker}\n title=\"Insert Emoji\"\n >\n ๐Ÿ˜€\n </ToolbarButton>\n {showEmojiPicker && (\n <EmojiPicker\n onSelect={(emoji) => editor.chain().focus().insertEmoji(emoji).run()}\n onClose={() => setShowEmojiPicker(false)}\n />\n )}\n </span>\n )\n\n case 'fullscreen':\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false\n return (\n <ToolbarButton\n key=\"fullscreen\"\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\n active={isFullscreen}\n title={isFullscreen ? 'Exit Fullscreen (Esc)' : 'Fullscreen (Ctrl+Shift+F)'}\n >\n {isFullscreen ? 'โŠ—' : 'โ›ถ'}\n </ToolbarButton>\n )\n\n case 'print':\n return (\n <ToolbarButton\n key=\"print\"\n onClick={() => editor.chain().focus().print().run()}\n title=\"Print (Ctrl+P)\"\n >\n ๐Ÿ–จ๏ธ\n </ToolbarButton>\n )\n\n case 'undo':\n return (\n <ToolbarButton\n key=\"undo\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo (Ctrl+Z)\"\n >\n โ†ถ\n </ToolbarButton>\n )\n\n case 'redo':\n return (\n <ToolbarButton\n key=\"redo\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo (Ctrl+Y)\"\n >\n โ†ท\n </ToolbarButton>\n )\n\n case 'separator':\n return <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n\n default:\n return null\n }\n }\n\n return <div className=\"rte-builder-toolbar\">{buttons.map(renderButton)}</div>\n}\n\nexport default TipTapToolbar\n","/**\n * TipTap Editor Component\n *\n * This is the actual TipTap editor implementation that conforms\n * to the adapter interface.\n */\n\nimport { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport { Document } from \"@tiptap/extension-document\";\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\nimport { Text } from \"@tiptap/extension-text\";\nimport { Bold } from \"@tiptap/extension-bold\";\nimport { Italic } from \"@tiptap/extension-italic\";\nimport { Underline } from \"@tiptap/extension-underline\";\nimport { Strike } from \"@tiptap/extension-strike\";\nimport { Code } from \"@tiptap/extension-code\";\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { FontFamily } from \"@tiptap/extension-font-family\";\nimport { Color } from \"@tiptap/extension-color\";\nimport { Highlight } from \"@tiptap/extension-highlight\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { Heading } from \"@tiptap/extension-heading\";\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\nimport { ListItem } from \"@tiptap/extension-list-item\";\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\nimport { Link } from \"@tiptap/extension-link\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport { History } from \"@tiptap/extension-history\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\nimport { common, createLowlight } from \"lowlight\";\n\n// Custom extensions\nimport { FontSize } from \"../../extensions/FontSize\";\nimport { LineHeight } from \"../../extensions/LineHeight\";\nimport { Video } from \"../../extensions/Video\";\nimport { Emoji } from \"../../extensions/Emoji\";\nimport { Fullscreen } from \"../../extensions/Fullscreen\";\nimport { Print } from \"../../extensions/Print\";\nimport { Indent } from \"../../extensions/Indent\";\n\n// Toolbar\nimport { TipTapToolbar } from \"./TipTapToolbar\";\n\n// Types\nimport type { AdapterComponentProps, AdapterEditorRef } from \"../../core/types\";\n\n// Create lowlight instance\nconst lowlight = createLowlight(common);\n\ninterface TipTapEditorComponentProps extends AdapterComponentProps {}\n\nexport const TipTapEditorComponent = forwardRef<\n AdapterEditorRef,\n TipTapEditorComponentProps\n>(\n (\n {\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n placeholder = \"Start typing...\",\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarButtons,\n className = \"\",\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = \"javascript\",\n editorConfig = {},\n },\n ref,\n ) => {\n // Initialize editor\n const editor = useEditor({\n extensions: [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n enableCodeHighlight\n ? CodeBlockLowlight.configure({\n lowlight,\n defaultLanguage: defaultCodeLanguage,\n })\n : CodeBlockLowlight.configure({\n lowlight: null as any,\n }),\n Subscript,\n Superscript,\n TextStyle,\n FontFamily,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n LineHeight,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Heading.configure({\n levels: [1, 2, 3, 4, 5, 6],\n }),\n BulletList,\n OrderedList,\n ListItem,\n Blockquote,\n HorizontalRule,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Image.configure({\n inline: false,\n allowBase64: true,\n }),\n Video,\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableCell,\n TableHeader,\n History,\n Placeholder.configure({\n placeholder,\n }),\n CharacterCount.configure({\n limit: charCounterMax > 0 ? charCounterMax : undefined,\n }),\n Gapcursor,\n Dropcursor,\n HardBreak,\n Emoji,\n Fullscreen,\n Print,\n Indent,\n ],\n content: value,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n onChange?.(html);\n },\n onBlur: () => {\n onBlur?.();\n },\n onFocus: () => {\n onFocus?.();\n },\n editorProps: {\n attributes: {\n class: \"rte-builder-content\",\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\n },\n },\n ...editorConfig,\n });\n\n // Update content when value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n // Update editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!disabled && !readOnly);\n }\n }, [disabled, readOnly, editor]);\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage && editor) {\n const file = await onMediaPickerImage();\n if (file) {\n editor\n .chain()\n .focus()\n .setImage({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerImage, editor]);\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo && editor) {\n const file = await onMediaPickerVideo();\n if (file) {\n editor\n .chain()\n .focus()\n .setVideo({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerVideo, editor]);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => {\n return editor?.getHTML() || \"\";\n },\n getText: () => {\n return editor?.getText() || \"\";\n },\n getJSON: () => {\n return editor?.getJSON();\n },\n setContent: (html: string) => {\n editor?.commands.setContent(html);\n },\n focus: () => {\n editor?.commands.focus();\n },\n blur: () => {\n editor?.commands.blur();\n },\n insertHTML: (html: string) => {\n editor?.commands.insertContent(html);\n },\n insertText: (text: string) => {\n editor?.commands.insertContent(text);\n },\n clear: () => {\n editor?.commands.clearContent();\n },\n isEmpty: () => {\n return editor?.isEmpty ?? true;\n },\n getCharacterCount: () => {\n return editor?.storage.characterCount?.characters() || 0;\n },\n getWordCount: () => {\n return editor?.storage.characterCount?.words() || 0;\n },\n isFullscreen: () => {\n return editor?.storage.fullscreen?.isFullscreen || false;\n },\n toggleFullscreen: () => {\n editor?.commands.toggleFullscreen();\n },\n print: () => {\n editor?.commands.print();\n },\n undo: () => {\n editor?.commands.undo();\n },\n redo: () => {\n editor?.commands.redo();\n },\n canUndo: () => {\n return editor?.can().undo() ?? false;\n },\n canRedo: () => {\n return editor?.can().redo() ?? false;\n },\n getNativeEditor: () => {\n return editor;\n },\n }));\n\n if (!editor) {\n return null;\n }\n\n const characterCount = editor.storage.characterCount?.characters() || 0;\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\n\n return (\n <div\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\n >\n <TipTapToolbar\n editor={editor}\n buttons={toolbarButtons}\n onMediaPickerImage={\n onMediaPickerImage ? handleMediaPickerImage : undefined\n }\n onMediaPickerVideo={\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\n }\n />\n <div\n className=\"rte-builder-container\"\n style={{ height: `${height}px` }}\n >\n <EditorContent editor={editor} />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\">\n {\" \"}\n (limit exceeded)\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nTipTapEditorComponent.displayName = \"TipTapEditorComponent\";\n\nexport default TipTapEditorComponent;\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\n/**\n * Constants.\n */\n\nvar IS_MAC = typeof window != 'undefined' && /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\n\nvar MODIFIERS = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey'\n};\n\nvar ALIASES = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta'\n};\n\nvar CODES = {\n backspace: 8,\n tab: 9,\n enter: 13,\n shift: 16,\n control: 17,\n alt: 18,\n pause: 19,\n capslock: 20,\n escape: 27,\n ' ': 32,\n pageup: 33,\n pagedown: 34,\n end: 35,\n home: 36,\n arrowleft: 37,\n arrowup: 38,\n arrowright: 39,\n arrowdown: 40,\n insert: 45,\n delete: 46,\n meta: 91,\n numlock: 144,\n scrolllock: 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n '\\'': 222\n};\n\nfor (var f = 1; f < 20; f++) {\n CODES['f' + f] = 111 + f;\n}\n\n/**\n * Is hotkey?\n */\n\nfunction isHotkey(hotkey, options, event) {\n if (options && !('byKey' in options)) {\n event = options;\n options = null;\n }\n\n if (!Array.isArray(hotkey)) {\n hotkey = [hotkey];\n }\n\n var array = hotkey.map(function (string) {\n return parseHotkey(string, options);\n });\n var check = function check(e) {\n return array.some(function (object) {\n return compareHotkey(object, e);\n });\n };\n var ret = event == null ? check : check(event);\n return ret;\n}\n\nfunction isCodeHotkey(hotkey, event) {\n return isHotkey(hotkey, event);\n}\n\nfunction isKeyHotkey(hotkey, event) {\n return isHotkey(hotkey, { byKey: true }, event);\n}\n\n/**\n * Parse.\n */\n\nfunction parseHotkey(hotkey, options) {\n var byKey = options && options.byKey;\n var ret = {};\n\n // Special case to handle the `+` key since we use it as a separator.\n hotkey = hotkey.replace('++', '+add');\n var values = hotkey.split('+');\n var length = values.length;\n\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n\n for (var k in MODIFIERS) {\n ret[MODIFIERS[k]] = false;\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var value = _step.value;\n\n var optional = value.endsWith('?') && value.length > 1;\n\n if (optional) {\n value = value.slice(0, -1);\n }\n\n var name = toKeyName(value);\n var modifier = MODIFIERS[name];\n\n if (value.length > 1 && !modifier && !ALIASES[value] && !CODES[name]) {\n throw new TypeError('Unknown modifier: \"' + value + '\"');\n }\n\n if (length === 1 || !modifier) {\n if (byKey) {\n ret.key = name;\n } else {\n ret.which = toKeyCode(value);\n }\n }\n\n if (modifier) {\n ret[modifier] = optional ? null : true;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return ret;\n}\n\n/**\n * Compare.\n */\n\nfunction compareHotkey(object, event) {\n for (var key in object) {\n var expected = object[key];\n var actual = void 0;\n\n if (expected == null) {\n continue;\n }\n\n if (key === 'key' && event.key != null) {\n actual = event.key.toLowerCase();\n } else if (key === 'which') {\n actual = expected === 91 && event.which === 93 ? 91 : event.which;\n } else {\n actual = event[key];\n }\n\n if (actual == null && expected === false) {\n continue;\n }\n\n if (actual !== expected) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Utils.\n */\n\nfunction toKeyCode(name) {\n name = toKeyName(name);\n var code = CODES[name] || name.toUpperCase().charCodeAt(0);\n return code;\n}\n\nfunction toKeyName(name) {\n name = name.toLowerCase();\n name = ALIASES[name] || name;\n return name;\n}\n\n/**\n * Export.\n */\n\nexports.default = isHotkey;\nexports.isHotkey = isHotkey;\nexports.isCodeHotkey = isCodeHotkey;\nexports.isKeyHotkey = isKeyHotkey;\nexports.parseHotkey = parseHotkey;\nexports.compareHotkey = compareHotkey;\nexports.toKeyCode = toKeyCode;\nexports.toKeyName = toKeyName;","/**\n * Slate.js Toolbar Component\n *\n * A toolbar component for the Slate.js editor with all standard formatting options.\n */\n\nimport React, { useCallback, useState, useRef, useEffect } from 'react'\nimport { Editor, Transforms, Element as SlateElement } from 'slate'\nimport { useSlate, ReactEditor } from 'slate-react'\n\nimport type { ToolbarButtonType } from '../../core/types'\nimport { EMOJI_CATEGORIES } from '../../extensions/Emoji'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface SlateToolbarProps {\n editor: Editor\n buttons?: ToolbarButtonType[]\n onMediaPickerImage?: () => Promise<void>\n onMediaPickerVideo?: () => Promise<void>\n onToggleFullscreen?: () => void\n onPrint?: () => void\n isFullscreen?: boolean\n toggleMark: (editor: Editor, format: string) => void\n toggleBlock: (editor: Editor, format: string) => void\n isMarkActive: (editor: Editor, format: string) => boolean\n isBlockActive: (editor: Editor, format: string, blockType?: 'type' | 'align') => boolean\n}\n\n// ============================================================================\n// TOOLBAR BUTTON COMPONENT\n// ============================================================================\n\ninterface ToolbarButtonProps {\n active?: boolean\n disabled?: boolean\n onClick: () => void\n title: string\n children: React.ReactNode\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n active = false,\n disabled = false,\n onClick,\n title,\n children,\n}) => (\n <button\n className={`rte-builder-toolbar-button ${active ? 'active' : ''}`}\n onClick={(e) => {\n e.preventDefault()\n onClick()\n }}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {children}\n </button>\n)\n\n// ============================================================================\n// TOOLBAR ICONS (Simple SVG icons)\n// ============================================================================\n\nconst icons: Record<string, JSX.Element> = {\n bold: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>,\n italic: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>,\n underline: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>,\n strike: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"/></svg>,\n code: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>,\n codeBlock: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>,\n subscript: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M22 18h-2v1h3v1h-4v-2.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18v-1h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"/></svg>,\n superscript: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M22 7h-2v1h3v1h-4V6.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18V4h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"/></svg>,\n clearFormatting: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z\"/></svg>,\n fontFamily: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M9.93 13.5h4.14L12 7.98 9.93 13.5zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z\"/></svg>,\n fontSize: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3v-3H3v3z\"/></svg>,\n lineHeight: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M6 7h2.5L5 3.5 1.5 7H4v10H1.5L5 20.5 8.5 17H6V7zm4-2v2h12V5H10zm0 14h12v-2H10v2zm0-6h12v-2H10v2z\"/></svg>,\n textColor: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"/></svg>,\n backgroundColor: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5zM2 20h20v4H2v-4z\"/></svg>,\n alignLeft: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/></svg>,\n alignCenter: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/></svg>,\n alignRight: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/></svg>,\n alignJustify: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"/></svg>,\n indent: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"/></svg>,\n outdent: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"/></svg>,\n bulletList: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"/></svg>,\n orderedList: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"/></svg>,\n heading1: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z\"/></svg>,\n heading2: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2h-2v2h4v2H9v-4c0-1.1.9-2 2-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"/></svg>,\n heading3: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2v0c1.1 0 2 .9 2 2v1c0 1.1-.9 2-2 2H9v-2h4v-2h-2v-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"/></svg>,\n blockquote: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/></svg>,\n horizontalRule: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M4 11h16v2H4z\"/></svg>,\n link: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>,\n unlink: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11A4.991 4.991 0 002 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z\"/></svg>,\n image: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>,\n video: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"/></svg>,\n table: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z\"/></svg>,\n emoji: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"/></svg>,\n undo: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M12.5 8c-2.65 0-5.05 1.04-6.83 2.73L3 8v9h9l-3.01-3c1.37-1.12 3.11-1.8 5.01-1.8 3.33 0 6.17 2.11 7.22 5.06l1.98-.65C21.79 12.58 17.54 8 12.5 8z\"/></svg>,\n redo: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22l1.98.65c1.05-3.19 4.05-5.47 7.98-5.47 1.9 0 3.64.68 5.01 1.8L13.5 15h9V6l-4.1 4.6z\"/></svg>,\n fullscreen: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/></svg>,\n print: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"/></svg>,\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const SlateToolbar: React.FC<SlateToolbarProps> = ({\n editor,\n buttons = [],\n onMediaPickerImage,\n onMediaPickerVideo,\n onToggleFullscreen,\n onPrint,\n isFullscreen = false,\n toggleMark,\n toggleBlock,\n isMarkActive,\n isBlockActive,\n}) => {\n // Emoji picker state\n const [showEmojiPicker, setShowEmojiPicker] = useState(false)\n const [selectedEmojiCategory, setSelectedEmojiCategory] = useState<string>('smileys')\n const emojiPickerRef = useRef<HTMLDivElement>(null)\n\n // Link dialog state\n const [showLinkDialog, setShowLinkDialog] = useState(false)\n const [linkUrl, setLinkUrl] = useState('')\n const linkDialogRef = useRef<HTMLDivElement>(null)\n\n // Color picker state\n const [showColorPicker, setShowColorPicker] = useState<'text' | 'bg' | null>(null)\n const colorPickerRef = useRef<HTMLDivElement>(null)\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target as Node)) {\n setShowEmojiPicker(false)\n }\n if (linkDialogRef.current && !linkDialogRef.current.contains(event.target as Node)) {\n setShowLinkDialog(false)\n }\n if (colorPickerRef.current && !colorPickerRef.current.contains(event.target as Node)) {\n setShowColorPicker(null)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Insert emoji\n const insertEmoji = useCallback(\n (emoji: string) => {\n Transforms.insertText(editor, emoji)\n setShowEmojiPicker(false)\n ReactEditor.focus(editor)\n },\n [editor]\n )\n\n // Insert link\n const insertLink = useCallback(() => {\n if (linkUrl) {\n const link = {\n type: 'link' as const,\n url: linkUrl,\n children: [{ text: linkUrl }],\n }\n Transforms.insertNodes(editor, link)\n setLinkUrl('')\n setShowLinkDialog(false)\n ReactEditor.focus(editor)\n }\n }, [editor, linkUrl])\n\n // Remove link\n const removeLink = useCallback(() => {\n Transforms.unwrapNodes(editor, {\n match: n => !Editor.isEditor(n) && SlateElement.isElement(n) && n.type === 'link',\n })\n }, [editor])\n\n // Insert horizontal rule\n const insertHorizontalRule = useCallback(() => {\n const hr = { type: 'horizontal-rule' as const, children: [{ text: '' }] }\n Transforms.insertNodes(editor, hr)\n Transforms.insertNodes(editor, { type: 'paragraph', children: [{ text: '' }] })\n }, [editor])\n\n // Insert table\n const insertTable = useCallback(() => {\n const table = {\n type: 'table' as const,\n children: [\n {\n type: 'table-row' as const,\n children: [\n { type: 'table-cell' as const, children: [{ text: '' }] },\n { type: 'table-cell' as const, children: [{ text: '' }] },\n { type: 'table-cell' as const, children: [{ text: '' }] },\n ],\n },\n {\n type: 'table-row' as const,\n children: [\n { type: 'table-cell' as const, children: [{ text: '' }] },\n { type: 'table-cell' as const, children: [{ text: '' }] },\n { type: 'table-cell' as const, children: [{ text: '' }] },\n ],\n },\n ],\n }\n Transforms.insertNodes(editor, table)\n }, [editor])\n\n // Set color\n const setColor = useCallback(\n (color: string, type: 'text' | 'bg') => {\n if (type === 'text') {\n Editor.addMark(editor, 'color', color)\n } else {\n Editor.addMark(editor, 'backgroundColor', color)\n }\n setShowColorPicker(null)\n },\n [editor]\n )\n\n // Color palette\n const colors = [\n '#000000', '#434343', '#666666', '#999999', '#b7b7b7', '#cccccc', '#d9d9d9', '#efefef', '#f3f3f3', '#ffffff',\n '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff',\n '#e6b8af', '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#c9daf8', '#cfe2f3', '#d9d2e9', '#ead1dc',\n ]\n\n // Render toolbar button based on type\n const renderButton = (button: ToolbarButtonType, index: number) => {\n if (button === 'separator') {\n return <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n }\n\n switch (button) {\n // Text formatting\n case 'bold':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'bold')}\n onClick={() => toggleMark(editor, 'bold')}\n title=\"Bold (Ctrl+B)\"\n >\n {icons.bold}\n </ToolbarButton>\n )\n case 'italic':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'italic')}\n onClick={() => toggleMark(editor, 'italic')}\n title=\"Italic (Ctrl+I)\"\n >\n {icons.italic}\n </ToolbarButton>\n )\n case 'underline':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'underline')}\n onClick={() => toggleMark(editor, 'underline')}\n title=\"Underline (Ctrl+U)\"\n >\n {icons.underline}\n </ToolbarButton>\n )\n case 'strike':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'strikethrough')}\n onClick={() => toggleMark(editor, 'strikethrough')}\n title=\"Strikethrough\"\n >\n {icons.strike}\n </ToolbarButton>\n )\n case 'code':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'code')}\n onClick={() => toggleMark(editor, 'code')}\n title=\"Code\"\n >\n {icons.code}\n </ToolbarButton>\n )\n case 'codeBlock':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'code-block')}\n onClick={() => toggleBlock(editor, 'code-block')}\n title=\"Code Block\"\n >\n {icons.codeBlock}\n </ToolbarButton>\n )\n case 'subscript':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'subscript')}\n onClick={() => toggleMark(editor, 'subscript')}\n title=\"Subscript\"\n >\n {icons.subscript}\n </ToolbarButton>\n )\n case 'superscript':\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, 'superscript')}\n onClick={() => toggleMark(editor, 'superscript')}\n title=\"Superscript\"\n >\n {icons.superscript}\n </ToolbarButton>\n )\n case 'clearFormatting':\n return (\n <ToolbarButton\n key={button}\n onClick={() => {\n Editor.removeMark(editor, 'bold')\n Editor.removeMark(editor, 'italic')\n Editor.removeMark(editor, 'underline')\n Editor.removeMark(editor, 'strikethrough')\n Editor.removeMark(editor, 'code')\n Editor.removeMark(editor, 'subscript')\n Editor.removeMark(editor, 'superscript')\n Editor.removeMark(editor, 'color')\n Editor.removeMark(editor, 'backgroundColor')\n Editor.removeMark(editor, 'fontSize')\n Editor.removeMark(editor, 'fontFamily')\n }}\n title=\"Clear Formatting\"\n >\n {icons.clearFormatting}\n </ToolbarButton>\n )\n\n // Alignment\n case 'alignLeft':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'left', 'align')}\n onClick={() => toggleBlock(editor, 'left')}\n title=\"Align Left\"\n >\n {icons.alignLeft}\n </ToolbarButton>\n )\n case 'alignCenter':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'center', 'align')}\n onClick={() => toggleBlock(editor, 'center')}\n title=\"Align Center\"\n >\n {icons.alignCenter}\n </ToolbarButton>\n )\n case 'alignRight':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'right', 'align')}\n onClick={() => toggleBlock(editor, 'right')}\n title=\"Align Right\"\n >\n {icons.alignRight}\n </ToolbarButton>\n )\n case 'alignJustify':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'justify', 'align')}\n onClick={() => toggleBlock(editor, 'justify')}\n title=\"Justify\"\n >\n {icons.alignJustify}\n </ToolbarButton>\n )\n\n // Lists\n case 'bulletList':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'bulleted-list')}\n onClick={() => toggleBlock(editor, 'bulleted-list')}\n title=\"Bullet List\"\n >\n {icons.bulletList}\n </ToolbarButton>\n )\n case 'orderedList':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'numbered-list')}\n onClick={() => toggleBlock(editor, 'numbered-list')}\n title=\"Numbered List\"\n >\n {icons.orderedList}\n </ToolbarButton>\n )\n\n // Headings\n case 'heading1':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'heading')}\n onClick={() => {\n Transforms.setNodes(editor, { type: 'heading', level: 1 } as any)\n }}\n title=\"Heading 1\"\n >\n {icons.heading1}\n </ToolbarButton>\n )\n case 'heading2':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'heading')}\n onClick={() => {\n Transforms.setNodes(editor, { type: 'heading', level: 2 } as any)\n }}\n title=\"Heading 2\"\n >\n {icons.heading2}\n </ToolbarButton>\n )\n case 'heading3':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'heading')}\n onClick={() => {\n Transforms.setNodes(editor, { type: 'heading', level: 3 } as any)\n }}\n title=\"Heading 3\"\n >\n {icons.heading3}\n </ToolbarButton>\n )\n\n // Blocks\n case 'blockquote':\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, 'blockquote')}\n onClick={() => toggleBlock(editor, 'blockquote')}\n title=\"Blockquote\"\n >\n {icons.blockquote}\n </ToolbarButton>\n )\n case 'horizontalRule':\n return (\n <ToolbarButton\n key={button}\n onClick={insertHorizontalRule}\n title=\"Horizontal Rule\"\n >\n {icons.horizontalRule}\n </ToolbarButton>\n )\n\n // Links\n case 'link':\n return (\n <div key={button} className=\"rte-builder-toolbar-dropdown\" ref={linkDialogRef}>\n <ToolbarButton\n onClick={() => setShowLinkDialog(!showLinkDialog)}\n title=\"Insert Link\"\n >\n {icons.link}\n </ToolbarButton>\n {showLinkDialog && (\n <div className=\"rte-builder-toolbar-dropdown-content\">\n <input\n type=\"url\"\n placeholder=\"Enter URL...\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n insertLink()\n }\n }}\n autoFocus\n />\n <button onClick={insertLink}>Insert</button>\n </div>\n )}\n </div>\n )\n case 'unlink':\n return (\n <ToolbarButton\n key={button}\n onClick={removeLink}\n title=\"Remove Link\"\n >\n {icons.unlink}\n </ToolbarButton>\n )\n\n // Media\n case 'image':\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerImage || (() => {})}\n disabled={!onMediaPickerImage}\n title=\"Insert Image\"\n >\n {icons.image}\n </ToolbarButton>\n )\n case 'video':\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerVideo || (() => {})}\n disabled={!onMediaPickerVideo}\n title=\"Insert Video\"\n >\n {icons.video}\n </ToolbarButton>\n )\n case 'table':\n return (\n <ToolbarButton\n key={button}\n onClick={insertTable}\n title=\"Insert Table\"\n >\n {icons.table}\n </ToolbarButton>\n )\n\n // Colors\n case 'textColor':\n return (\n <div key={button} className=\"rte-builder-toolbar-dropdown\" ref={colorPickerRef}>\n <ToolbarButton\n onClick={() => setShowColorPicker(showColorPicker === 'text' ? null : 'text')}\n title=\"Text Color\"\n >\n {icons.textColor}\n </ToolbarButton>\n {showColorPicker === 'text' && (\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\n {colors.map((color) => (\n <button\n key={color}\n className=\"rte-builder-color-swatch\"\n style={{ backgroundColor: color }}\n onClick={() => setColor(color, 'text')}\n title={color}\n />\n ))}\n </div>\n )}\n </div>\n )\n case 'backgroundColor':\n return (\n <div key={button} className=\"rte-builder-toolbar-dropdown\" ref={colorPickerRef}>\n <ToolbarButton\n onClick={() => setShowColorPicker(showColorPicker === 'bg' ? null : 'bg')}\n title=\"Background Color\"\n >\n {icons.backgroundColor}\n </ToolbarButton>\n {showColorPicker === 'bg' && (\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\n {colors.map((color) => (\n <button\n key={color}\n className=\"rte-builder-color-swatch\"\n style={{ backgroundColor: color }}\n onClick={() => setColor(color, 'bg')}\n title={color}\n />\n ))}\n </div>\n )}\n </div>\n )\n\n // Emoji\n case 'emoji':\n return (\n <div key={button} className=\"rte-builder-toolbar-dropdown\" ref={emojiPickerRef}>\n <ToolbarButton\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n title=\"Insert Emoji\"\n >\n {icons.emoji}\n </ToolbarButton>\n {showEmojiPicker && (\n <div className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? 'active' : ''}`}\n onClick={() => setSelectedEmojiCategory(key)}\n title={(category as any).label}\n >\n {(category as any).emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {(EMOJI_CATEGORIES[selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES] as any)?.emojis.map(\n (emoji: string, idx: number) => (\n <button\n key={idx}\n className=\"rte-builder-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n )\n )}\n </div>\n </div>\n )}\n </div>\n )\n\n // Actions\n case 'undo':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.undo()}\n title=\"Undo (Ctrl+Z)\"\n >\n {icons.undo}\n </ToolbarButton>\n )\n case 'redo':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.redo()}\n title=\"Redo (Ctrl+Y)\"\n >\n {icons.redo}\n </ToolbarButton>\n )\n case 'fullscreen':\n return (\n <ToolbarButton\n key={button}\n active={isFullscreen}\n onClick={onToggleFullscreen || (() => {})}\n title=\"Toggle Fullscreen\"\n >\n {icons.fullscreen}\n </ToolbarButton>\n )\n case 'print':\n return (\n <ToolbarButton\n key={button}\n onClick={onPrint || (() => {})}\n title=\"Print\"\n >\n {icons.print}\n </ToolbarButton>\n )\n\n default:\n return null\n }\n }\n\n return (\n <div className=\"rte-builder-toolbar slate-toolbar\">\n {buttons.map((button, index) => renderButton(button, index))}\n </div>\n )\n}\n\nexport default SlateToolbar\n","/**\n * Slate.js Editor Component\n *\n * This is the actual Slate.js editor implementation that conforms\n * to the adapter interface.\n */\n\nimport React, {\n useEffect,\n useImperativeHandle,\n forwardRef,\n useCallback,\n useMemo,\n useState,\n useRef,\n} from 'react'\nimport { createEditor, Descendant, Editor, Transforms, Text, Element as SlateElement, Node } from 'slate'\nimport { Slate, Editable, withReact, ReactEditor, useSlate } from 'slate-react'\nimport { withHistory, HistoryEditor } from 'slate-history'\nimport isHotkey from 'is-hotkey'\n\n// Toolbar\nimport { SlateToolbar } from './SlateToolbar'\n\n// Types\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\n\n// ============================================================================\n// CUSTOM TYPES\n// ============================================================================\n\ntype CustomText = {\n text: string\n bold?: boolean\n italic?: boolean\n underline?: boolean\n strikethrough?: boolean\n code?: boolean\n subscript?: boolean\n superscript?: boolean\n color?: string\n backgroundColor?: string\n fontSize?: string\n fontFamily?: string\n}\n\ntype ParagraphElement = { type: 'paragraph'; align?: string; indent?: number; children: Descendant[] }\ntype HeadingElement = { type: 'heading'; level: 1 | 2 | 3 | 4 | 5 | 6; align?: string; children: Descendant[] }\ntype BlockquoteElement = { type: 'blockquote'; children: Descendant[] }\ntype CodeBlockElement = { type: 'code-block'; language?: string; children: Descendant[] }\ntype BulletListElement = { type: 'bulleted-list'; children: Descendant[] }\ntype NumberedListElement = { type: 'numbered-list'; children: Descendant[] }\ntype ListItemElement = { type: 'list-item'; children: Descendant[] }\ntype LinkElement = { type: 'link'; url: string; children: Descendant[] }\ntype ImageElement = { type: 'image'; url: string; alt?: string; children: Descendant[] }\ntype VideoElement = { type: 'video'; url: string; children: Descendant[] }\ntype HorizontalRuleElement = { type: 'horizontal-rule'; children: Descendant[] }\ntype TableElement = { type: 'table'; children: Descendant[] }\ntype TableRowElement = { type: 'table-row'; children: Descendant[] }\ntype TableCellElement = { type: 'table-cell'; children: Descendant[] }\n\ntype CustomElement =\n | ParagraphElement\n | HeadingElement\n | BlockquoteElement\n | CodeBlockElement\n | BulletListElement\n | NumberedListElement\n | ListItemElement\n | LinkElement\n | ImageElement\n | VideoElement\n | HorizontalRuleElement\n | TableElement\n | TableRowElement\n | TableCellElement\n\ndeclare module 'slate' {\n interface CustomTypes {\n Editor: Editor & ReactEditor & HistoryEditor\n Element: CustomElement\n Text: CustomText\n }\n}\n\n// ============================================================================\n// HOTKEYS\n// ============================================================================\n\nconst HOTKEYS: Record<string, string> = {\n 'mod+b': 'bold',\n 'mod+i': 'italic',\n 'mod+u': 'underline',\n 'mod+`': 'code',\n 'mod+shift+s': 'strikethrough',\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\n\nconst isMarkActive = (editor: Editor, format: string) => {\n const marks = Editor.marks(editor)\n return marks ? (marks as Record<string, unknown>)[format] === true : false\n}\n\nconst isBlockActive = (editor: Editor, format: string, blockType: 'type' | 'align' = 'type') => {\n const { selection } = editor\n if (!selection) return false\n\n const [match] = Array.from(\n Editor.nodes(editor, {\n at: Editor.unhangRange(editor, selection),\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n (blockType === 'type' ? n.type === format : (n as any).align === format),\n })\n )\n\n return !!match\n}\n\nconst toggleMark = (editor: Editor, format: string) => {\n const isActive = isMarkActive(editor, format)\n\n if (isActive) {\n Editor.removeMark(editor, format)\n } else {\n Editor.addMark(editor, format, true)\n }\n}\n\nconst toggleBlock = (editor: Editor, format: string) => {\n const isActive = isBlockActive(\n editor,\n format,\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\n )\n const isList = LIST_TYPES.includes(format)\n\n Transforms.unwrapNodes(editor, {\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n LIST_TYPES.includes(n.type) &&\n !TEXT_ALIGN_TYPES.includes(format),\n split: true,\n })\n\n let newProperties: Partial<CustomElement>\n if (TEXT_ALIGN_TYPES.includes(format)) {\n newProperties = {\n align: isActive ? undefined : format,\n } as Partial<CustomElement>\n } else {\n newProperties = {\n type: isActive ? 'paragraph' : isList ? 'list-item' : format,\n } as Partial<CustomElement>\n }\n Transforms.setNodes<CustomElement>(editor, newProperties)\n\n if (!isActive && isList) {\n const block = { type: format, children: [] } as CustomElement\n Transforms.wrapNodes(editor, block)\n }\n}\n\n// ============================================================================\n// SERIALIZATION\n// ============================================================================\n\nconst serializeToHtml = (nodes: Descendant[]): string => {\n return nodes.map(n => serializeNode(n)).join('')\n}\n\nconst serializeNode = (node: Descendant): string => {\n if (Text.isText(node)) {\n let string = escapeHtml(node.text)\n if (node.bold) string = `<strong>${string}</strong>`\n if (node.italic) string = `<em>${string}</em>`\n if (node.underline) string = `<u>${string}</u>`\n if (node.strikethrough) string = `<s>${string}</s>`\n if (node.code) string = `<code>${string}</code>`\n if (node.subscript) string = `<sub>${string}</sub>`\n if (node.superscript) string = `<sup>${string}</sup>`\n if (node.color) string = `<span style=\"color: ${node.color}\">${string}</span>`\n if (node.backgroundColor) string = `<span style=\"background-color: ${node.backgroundColor}\">${string}</span>`\n if (node.fontSize) string = `<span style=\"font-size: ${node.fontSize}\">${string}</span>`\n if (node.fontFamily) string = `<span style=\"font-family: ${node.fontFamily}\">${string}</span>`\n return string\n }\n\n const children = (node.children as Descendant[]).map(n => serializeNode(n)).join('')\n const element = node as CustomElement\n const alignStyle = (element as any).align ? ` style=\"text-align: ${(element as any).align}\"` : ''\n\n switch (element.type) {\n case 'paragraph':\n return `<p${alignStyle}>${children}</p>`\n case 'heading':\n return `<h${element.level}${alignStyle}>${children}</h${element.level}>`\n case 'blockquote':\n return `<blockquote>${children}</blockquote>`\n case 'code-block':\n return `<pre><code class=\"language-${element.language || 'plaintext'}\">${children}</code></pre>`\n case 'bulleted-list':\n return `<ul>${children}</ul>`\n case 'numbered-list':\n return `<ol>${children}</ol>`\n case 'list-item':\n return `<li>${children}</li>`\n case 'link':\n return `<a href=\"${escapeHtml(element.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">${children}</a>`\n case 'image':\n return `<img src=\"${escapeHtml(element.url)}\" alt=\"${escapeHtml(element.alt || '')}\" />`\n case 'video':\n return `<video src=\"${escapeHtml(element.url)}\" controls></video>`\n case 'horizontal-rule':\n return '<hr />'\n case 'table':\n return `<table>${children}</table>`\n case 'table-row':\n return `<tr>${children}</tr>`\n case 'table-cell':\n return `<td>${children}</td>`\n default:\n return children\n }\n}\n\nconst escapeHtml = (str: string): string => {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\nconst deserializeFromHtml = (html: string): Descendant[] => {\n if (!html || html.trim() === '') {\n return [{ type: 'paragraph', children: [{ text: '' }] }]\n }\n\n const doc = new DOMParser().parseFromString(html, 'text/html')\n return deserializeElement(doc.body)\n}\n\nconst deserializeElement = (el: HTMLElement): Descendant[] => {\n if (el.nodeType === 3) {\n return [{ text: el.textContent || '' }]\n }\n\n if (el.nodeType !== 1) {\n return [{ text: '' }]\n }\n\n const children: Descendant[] = Array.from(el.childNodes)\n .flatMap(child => deserializeElement(child as HTMLElement))\n\n if (children.length === 0) {\n children.push({ text: '' })\n }\n\n switch (el.nodeName) {\n case 'BODY':\n return children\n case 'BR':\n return [{ text: '\\n' }]\n case 'P':\n return [{ type: 'paragraph', align: el.style.textAlign || undefined, children }]\n case 'H1':\n return [{ type: 'heading', level: 1, children }]\n case 'H2':\n return [{ type: 'heading', level: 2, children }]\n case 'H3':\n return [{ type: 'heading', level: 3, children }]\n case 'H4':\n return [{ type: 'heading', level: 4, children }]\n case 'H5':\n return [{ type: 'heading', level: 5, children }]\n case 'H6':\n return [{ type: 'heading', level: 6, children }]\n case 'BLOCKQUOTE':\n return [{ type: 'blockquote', children }]\n case 'PRE':\n return [{ type: 'code-block', children }]\n case 'UL':\n return [{ type: 'bulleted-list', children }]\n case 'OL':\n return [{ type: 'numbered-list', children }]\n case 'LI':\n return [{ type: 'list-item', children }]\n case 'A':\n return [{ type: 'link', url: el.getAttribute('href') || '', children }]\n case 'IMG':\n return [{ type: 'image', url: el.getAttribute('src') || '', alt: el.getAttribute('alt') || '', children: [{ text: '' }] }]\n case 'VIDEO':\n return [{ type: 'video', url: el.getAttribute('src') || '', children: [{ text: '' }] }]\n case 'HR':\n return [{ type: 'horizontal-rule', children: [{ text: '' }] }]\n case 'TABLE':\n return [{ type: 'table', children }]\n case 'TR':\n return [{ type: 'table-row', children }]\n case 'TD':\n case 'TH':\n return [{ type: 'table-cell', children }]\n case 'STRONG':\n case 'B':\n return children.map(child => ({ ...child, bold: true } as CustomText))\n case 'EM':\n case 'I':\n return children.map(child => ({ ...child, italic: true } as CustomText))\n case 'U':\n return children.map(child => ({ ...child, underline: true } as CustomText))\n case 'S':\n case 'STRIKE':\n case 'DEL':\n return children.map(child => ({ ...child, strikethrough: true } as CustomText))\n case 'CODE':\n return children.map(child => ({ ...child, code: true } as CustomText))\n case 'SUB':\n return children.map(child => ({ ...child, subscript: true } as CustomText))\n case 'SUP':\n return children.map(child => ({ ...child, superscript: true } as CustomText))\n default:\n return children\n }\n}\n\n// ============================================================================\n// RENDER ELEMENTS & LEAVES\n// ============================================================================\n\nconst renderElement = (props: { attributes: any; children: React.ReactNode; element: CustomElement }) => {\n const { attributes, children, element } = props\n const style = { textAlign: (element as any).align }\n\n switch (element.type) {\n case 'heading':\n const Tag = `h${element.level}` as keyof JSX.IntrinsicElements\n return <Tag style={style} {...attributes}>{children}</Tag>\n case 'blockquote':\n return <blockquote {...attributes}>{children}</blockquote>\n case 'code-block':\n return (\n <pre {...attributes}>\n <code>{children}</code>\n </pre>\n )\n case 'bulleted-list':\n return <ul {...attributes}>{children}</ul>\n case 'numbered-list':\n return <ol {...attributes}>{children}</ol>\n case 'list-item':\n return <li {...attributes}>{children}</li>\n case 'link':\n return (\n <a href={element.url} target=\"_blank\" rel=\"noopener noreferrer\" {...attributes}>\n {children}\n </a>\n )\n case 'image':\n return (\n <div {...attributes} contentEditable={false}>\n <img src={element.url} alt={element.alt || ''} style={{ maxWidth: '100%' }} />\n {children}\n </div>\n )\n case 'video':\n return (\n <div {...attributes} contentEditable={false}>\n <video src={element.url} controls style={{ maxWidth: '100%' }} />\n {children}\n </div>\n )\n case 'horizontal-rule':\n return (\n <div {...attributes} contentEditable={false}>\n <hr />\n {children}\n </div>\n )\n case 'table':\n return <table {...attributes}><tbody>{children}</tbody></table>\n case 'table-row':\n return <tr {...attributes}>{children}</tr>\n case 'table-cell':\n return <td {...attributes}>{children}</td>\n case 'paragraph':\n default:\n return <p style={style} {...attributes}>{children}</p>\n }\n}\n\nconst renderLeaf = (props: { attributes: any; children: React.ReactNode; leaf: CustomText }) => {\n const { attributes, leaf } = props\n let { children } = props\n\n if (leaf.bold) {\n children = <strong>{children}</strong>\n }\n if (leaf.italic) {\n children = <em>{children}</em>\n }\n if (leaf.underline) {\n children = <u>{children}</u>\n }\n if (leaf.strikethrough) {\n children = <s>{children}</s>\n }\n if (leaf.code) {\n children = <code>{children}</code>\n }\n if (leaf.subscript) {\n children = <sub>{children}</sub>\n }\n if (leaf.superscript) {\n children = <sup>{children}</sup>\n }\n\n const style: React.CSSProperties = {}\n if (leaf.color) style.color = leaf.color\n if (leaf.backgroundColor) style.backgroundColor = leaf.backgroundColor\n if (leaf.fontSize) style.fontSize = leaf.fontSize\n if (leaf.fontFamily) style.fontFamily = leaf.fontFamily\n\n return (\n <span {...attributes} style={Object.keys(style).length > 0 ? style : undefined}>\n {children}\n </span>\n )\n}\n\n// ============================================================================\n// WITHPLUGINS\n// ============================================================================\n\nconst withInlines = (editor: Editor) => {\n const { isInline, isVoid } = editor\n\n editor.isInline = (element) => {\n return element.type === 'link' ? true : isInline(element)\n }\n\n editor.isVoid = (element) => {\n return ['image', 'video', 'horizontal-rule'].includes(element.type) ? true : isVoid(element)\n }\n\n return editor\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\ninterface SlateEditorComponentProps extends AdapterComponentProps {}\n\nexport const SlateEditorComponent = forwardRef<AdapterEditorRef, SlateEditorComponentProps>(\n (\n {\n value = '',\n onChange,\n onBlur,\n onFocus,\n placeholder = 'Start typing...',\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarButtons,\n className = '',\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = 'javascript',\n editorConfig = {},\n },\n ref\n ) => {\n // Create editor instance\n const editor = useMemo(\n () => withInlines(withHistory(withReact(createEditor()))),\n []\n )\n\n // Track fullscreen state\n const [isFullscreen, setIsFullscreen] = useState(false)\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // Initial value\n const [editorValue, setEditorValue] = useState<Descendant[]>(() => {\n return deserializeFromHtml(value)\n })\n\n // Update value when prop changes\n useEffect(() => {\n const currentHtml = serializeToHtml(editorValue)\n if (value !== currentHtml) {\n const newValue = deserializeFromHtml(value)\n setEditorValue(newValue)\n // Reset editor selection\n editor.children = newValue\n Transforms.select(editor, { anchor: { path: [0, 0], offset: 0 }, focus: { path: [0, 0], offset: 0 } })\n }\n }, [value])\n\n // Handle change\n const handleChange = useCallback(\n (newValue: Descendant[]) => {\n setEditorValue(newValue)\n const html = serializeToHtml(newValue)\n onChange?.(html)\n },\n [onChange]\n )\n\n // Handle keydown\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n for (const hotkey in HOTKEYS) {\n if (isHotkey(hotkey, event as any)) {\n event.preventDefault()\n const mark = HOTKEYS[hotkey]\n toggleMark(editor, mark)\n }\n }\n },\n [editor]\n )\n\n // Get text content\n const getText = useCallback(() => {\n return editorValue.map(n => Node.string(n)).join('\\n')\n }, [editorValue])\n\n // Get character count\n const getCharacterCount = useCallback(() => {\n return getText().length\n }, [getText])\n\n // Get word count\n const getWordCount = useCallback(() => {\n const text = getText()\n return text.split(/\\s+/).filter(word => word.length > 0).length\n }, [getText])\n\n // Toggle fullscreen\n const handleToggleFullscreen = useCallback(() => {\n setIsFullscreen(prev => !prev)\n }, [])\n\n // Print\n const handlePrint = useCallback(() => {\n const html = serializeToHtml(editorValue)\n const printWindow = window.open('', '_blank')\n if (printWindow) {\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Print</title>\n <style>\n body { font-family: Arial, sans-serif; padding: 20px; }\n img { max-width: 100%; }\n </style>\n </head>\n <body>${html}</body>\n </html>\n `)\n printWindow.document.close()\n printWindow.print()\n }\n }, [editorValue])\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage) {\n const file = await onMediaPickerImage()\n if (file) {\n const image: ImageElement = {\n type: 'image',\n url: file.url,\n alt: file.alt || file.name,\n children: [{ text: '' }],\n }\n Transforms.insertNodes(editor, image)\n }\n }\n }, [onMediaPickerImage, editor])\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo) {\n const file = await onMediaPickerVideo()\n if (file) {\n const video: VideoElement = {\n type: 'video',\n url: file.url,\n children: [{ text: '' }],\n }\n Transforms.insertNodes(editor, video)\n }\n }\n }, [onMediaPickerVideo, editor])\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => serializeToHtml(editorValue),\n getText,\n getJSON: () => editorValue,\n setContent: (html: string) => {\n const newValue = deserializeFromHtml(html)\n setEditorValue(newValue)\n editor.children = newValue\n },\n focus: () => {\n ReactEditor.focus(editor)\n },\n blur: () => {\n ReactEditor.blur(editor)\n },\n insertHTML: (html: string) => {\n const fragment = deserializeFromHtml(html)\n Transforms.insertFragment(editor, fragment)\n },\n insertText: (text: string) => {\n Transforms.insertText(editor, text)\n },\n clear: () => {\n const emptyValue: Descendant[] = [{ type: 'paragraph', children: [{ text: '' }] }]\n setEditorValue(emptyValue)\n editor.children = emptyValue\n },\n isEmpty: () => {\n return (\n editorValue.length === 1 &&\n editorValue[0].type === 'paragraph' &&\n (editorValue[0] as ParagraphElement).children.length === 1 &&\n ((editorValue[0] as ParagraphElement).children[0] as CustomText).text === ''\n )\n },\n getCharacterCount,\n getWordCount,\n isFullscreen: () => isFullscreen,\n toggleFullscreen: handleToggleFullscreen,\n print: handlePrint,\n undo: () => {\n HistoryEditor.undo(editor)\n },\n redo: () => {\n HistoryEditor.redo(editor)\n },\n canUndo: () => {\n return editor.history.undos.length > 0\n },\n canRedo: () => {\n return editor.history.redos.length > 0\n },\n getNativeEditor: () => editor,\n }))\n\n const characterCount = getCharacterCount()\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\n\n return (\n <div\n ref={wrapperRef}\n className={`rte-builder-wrapper slate-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\n >\n <Slate editor={editor} initialValue={editorValue} onChange={handleChange}>\n <SlateToolbar\n editor={editor}\n buttons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\n onToggleFullscreen={handleToggleFullscreen}\n onPrint={handlePrint}\n isFullscreen={isFullscreen}\n toggleMark={toggleMark}\n toggleBlock={toggleBlock}\n isMarkActive={isMarkActive}\n isBlockActive={isBlockActive}\n />\n <div\n className=\"rte-builder-container\"\n style={{\n height: `${height}px`,\n minHeight: `${minHeight}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n overflow: 'auto',\n }}\n >\n <Editable\n className=\"rte-builder-content\"\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n placeholder={placeholder}\n spellCheck\n autoFocus\n readOnly={disabled || readOnly}\n onKeyDown={handleKeyDown}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\n )}\n </div>\n </div>\n )}\n </Slate>\n </div>\n )\n }\n)\n\nSlateEditorComponent.displayName = 'SlateEditorComponent'\n\nexport default SlateEditorComponent\n","/**\n * Lexical Toolbar Component\n *\n * A toolbar component for the Lexical editor with all standard formatting options.\n */\n\nimport React, { useCallback, useState, useRef, useEffect } from 'react'\nimport {\n $getSelection,\n $isRangeSelection,\n FORMAT_TEXT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n LexicalEditor,\n} from 'lexical'\nimport { $isHeadingNode, $createHeadingNode, HeadingTagType } from '@lexical/rich-text'\nimport {\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n REMOVE_LIST_COMMAND,\n $isListNode,\n ListNode,\n} from '@lexical/list'\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $createQuoteNode } from '@lexical/rich-text'\nimport { $createCodeNode } from '@lexical/code'\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '@lexical/react/LexicalHorizontalRuleNode'\nimport {\n INSERT_TABLE_COMMAND,\n TableNode,\n} from '@lexical/table'\nimport { $createParagraphNode, $getRoot } from 'lexical'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\n\nimport type { ToolbarButtonType } from '../../core/types'\nimport { EMOJI_CATEGORIES } from '../../extensions/Emoji'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface LexicalToolbarProps {\n editor: LexicalEditor\n buttons?: ToolbarButtonType[]\n onMediaPickerImage?: () => Promise<void>\n onMediaPickerVideo?: () => Promise<void>\n onToggleFullscreen?: () => void\n onPrint?: () => void\n isFullscreen?: boolean\n}\n\n// ============================================================================\n// TOOLBAR BUTTON COMPONENT\n// ============================================================================\n\ninterface ToolbarButtonProps {\n active?: boolean\n disabled?: boolean\n onClick: () => void\n title: string\n children: React.ReactNode\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n active = false,\n disabled = false,\n onClick,\n title,\n children,\n}) => (\n <button\n className={`rte-builder-toolbar-button ${active ? 'active' : ''}`}\n onClick={(e) => {\n e.preventDefault()\n onClick()\n }}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {children}\n </button>\n)\n\n// ============================================================================\n// TOOLBAR ICONS (Simple SVG icons)\n// ============================================================================\n\nconst icons: Record<string, JSX.Element> = {\n bold: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>,\n italic: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>,\n underline: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>,\n strike: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"/></svg>,\n code: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>,\n codeBlock: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"/></svg>,\n subscript: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M22 18h-2v1h3v1h-4v-2.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18v-1h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"/></svg>,\n superscript: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M22 7h-2v1h3v1h-4V6.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18V4h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"/></svg>,\n clearFormatting: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z\"/></svg>,\n alignLeft: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/></svg>,\n alignCenter: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/></svg>,\n alignRight: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/></svg>,\n alignJustify: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"/></svg>,\n indent: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"/></svg>,\n outdent: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"/></svg>,\n bulletList: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"/></svg>,\n orderedList: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"/></svg>,\n heading1: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z\"/></svg>,\n heading2: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2h-2v2h4v2H9v-4c0-1.1.9-2 2-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"/></svg>,\n heading3: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2v0c1.1 0 2 .9 2 2v1c0 1.1-.9 2-2 2H9v-2h4v-2h-2v-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"/></svg>,\n blockquote: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\"/></svg>,\n horizontalRule: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M4 11h16v2H4z\"/></svg>,\n link: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>,\n unlink: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11A4.991 4.991 0 002 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z\"/></svg>,\n image: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>,\n video: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"/></svg>,\n table: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z\"/></svg>,\n emoji: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"/></svg>,\n undo: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M12.5 8c-2.65 0-5.05 1.04-6.83 2.73L3 8v9h9l-3.01-3c1.37-1.12 3.11-1.8 5.01-1.8 3.33 0 6.17 2.11 7.22 5.06l1.98-.65C21.79 12.58 17.54 8 12.5 8z\"/></svg>,\n redo: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22l1.98.65c1.05-3.19 4.05-5.47 7.98-5.47 1.9 0 3.64.68 5.01 1.8L13.5 15h9V6l-4.1 4.6z\"/></svg>,\n fullscreen: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/></svg>,\n print: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"/></svg>,\n textColor: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"/></svg>,\n backgroundColor: <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\"><path fill=\"currentColor\" d=\"M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5zM2 20h20v4H2v-4z\"/></svg>,\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const LexicalToolbar: React.FC<LexicalToolbarProps> = ({\n editor,\n buttons = [],\n onMediaPickerImage,\n onMediaPickerVideo,\n onToggleFullscreen,\n onPrint,\n isFullscreen = false,\n}) => {\n // Emoji picker state\n const [showEmojiPicker, setShowEmojiPicker] = useState(false)\n const [selectedEmojiCategory, setSelectedEmojiCategory] = useState<string>('smileys')\n const emojiPickerRef = useRef<HTMLDivElement>(null)\n\n // Link dialog state\n const [showLinkDialog, setShowLinkDialog] = useState(false)\n const [linkUrl, setLinkUrl] = useState('')\n const linkDialogRef = useRef<HTMLDivElement>(null)\n\n // Active states\n const [isBold, setIsBold] = useState(false)\n const [isItalic, setIsItalic] = useState(false)\n const [isUnderline, setIsUnderline] = useState(false)\n const [isStrikethrough, setIsStrikethrough] = useState(false)\n const [isCode, setIsCode] = useState(false)\n const [isSubscript, setIsSubscript] = useState(false)\n const [isSuperscript, setIsSuperscript] = useState(false)\n\n // Update active states on selection change\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n setIsBold(selection.hasFormat('bold'))\n setIsItalic(selection.hasFormat('italic'))\n setIsUnderline(selection.hasFormat('underline'))\n setIsStrikethrough(selection.hasFormat('strikethrough'))\n setIsCode(selection.hasFormat('code'))\n setIsSubscript(selection.hasFormat('subscript'))\n setIsSuperscript(selection.hasFormat('superscript'))\n }\n })\n })\n }, [editor])\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (emojiPickerRef.current && !emojiPickerRef.current.contains(event.target as Node)) {\n setShowEmojiPicker(false)\n }\n if (linkDialogRef.current && !linkDialogRef.current.contains(event.target as Node)) {\n setShowLinkDialog(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Insert emoji\n const insertEmoji = useCallback(\n (emoji: string) => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n selection.insertText(emoji)\n }\n })\n setShowEmojiPicker(false)\n },\n [editor]\n )\n\n // Insert link\n const insertLink = useCallback(() => {\n if (linkUrl) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, linkUrl)\n setLinkUrl('')\n setShowLinkDialog(false)\n }\n }, [editor, linkUrl])\n\n // Remove link\n const removeLink = useCallback(() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }, [editor])\n\n // Format heading\n const formatHeading = useCallback(\n (headingTag: HeadingTagType) => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createHeadingNode(headingTag))\n }\n })\n },\n [editor]\n )\n\n // Format paragraph\n const formatParagraph = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createParagraphNode())\n }\n })\n }, [editor])\n\n // Format quote\n const formatQuote = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createQuoteNode())\n }\n })\n }, [editor])\n\n // Format code block\n const formatCodeBlock = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createCodeNode())\n }\n })\n }, [editor])\n\n // Insert table\n const insertTable = useCallback(() => {\n editor.dispatchCommand(INSERT_TABLE_COMMAND, { rows: '3', columns: '3' })\n }, [editor])\n\n // Render toolbar button based on type\n const renderButton = (button: ToolbarButtonType, index: number) => {\n if (button === 'separator') {\n return <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n }\n\n switch (button) {\n // Text formatting\n case 'bold':\n return (\n <ToolbarButton\n key={button}\n active={isBold}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')}\n title=\"Bold (Ctrl+B)\"\n >\n {icons.bold}\n </ToolbarButton>\n )\n case 'italic':\n return (\n <ToolbarButton\n key={button}\n active={isItalic}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')}\n title=\"Italic (Ctrl+I)\"\n >\n {icons.italic}\n </ToolbarButton>\n )\n case 'underline':\n return (\n <ToolbarButton\n key={button}\n active={isUnderline}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')}\n title=\"Underline (Ctrl+U)\"\n >\n {icons.underline}\n </ToolbarButton>\n )\n case 'strike':\n return (\n <ToolbarButton\n key={button}\n active={isStrikethrough}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')}\n title=\"Strikethrough\"\n >\n {icons.strike}\n </ToolbarButton>\n )\n case 'code':\n return (\n <ToolbarButton\n key={button}\n active={isCode}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code')}\n title=\"Code\"\n >\n {icons.code}\n </ToolbarButton>\n )\n case 'codeBlock':\n return (\n <ToolbarButton\n key={button}\n onClick={formatCodeBlock}\n title=\"Code Block\"\n >\n {icons.codeBlock}\n </ToolbarButton>\n )\n case 'subscript':\n return (\n <ToolbarButton\n key={button}\n active={isSubscript}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')}\n title=\"Subscript\"\n >\n {icons.subscript}\n </ToolbarButton>\n )\n case 'superscript':\n return (\n <ToolbarButton\n key={button}\n active={isSuperscript}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')}\n title=\"Superscript\"\n >\n {icons.superscript}\n </ToolbarButton>\n )\n case 'clearFormatting':\n return (\n <ToolbarButton\n key={button}\n onClick={formatParagraph}\n title=\"Clear Formatting\"\n >\n {icons.clearFormatting}\n </ToolbarButton>\n )\n\n // Lists\n case 'bulletList':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)}\n title=\"Bullet List\"\n >\n {icons.bulletList}\n </ToolbarButton>\n )\n case 'orderedList':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)}\n title=\"Numbered List\"\n >\n {icons.orderedList}\n </ToolbarButton>\n )\n\n // Headings\n case 'heading1':\n return (\n <ToolbarButton\n key={button}\n onClick={() => formatHeading('h1')}\n title=\"Heading 1\"\n >\n {icons.heading1}\n </ToolbarButton>\n )\n case 'heading2':\n return (\n <ToolbarButton\n key={button}\n onClick={() => formatHeading('h2')}\n title=\"Heading 2\"\n >\n {icons.heading2}\n </ToolbarButton>\n )\n case 'heading3':\n return (\n <ToolbarButton\n key={button}\n onClick={() => formatHeading('h3')}\n title=\"Heading 3\"\n >\n {icons.heading3}\n </ToolbarButton>\n )\n\n // Blocks\n case 'blockquote':\n return (\n <ToolbarButton\n key={button}\n onClick={formatQuote}\n title=\"Blockquote\"\n >\n {icons.blockquote}\n </ToolbarButton>\n )\n case 'horizontalRule':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)}\n title=\"Horizontal Rule\"\n >\n {icons.horizontalRule}\n </ToolbarButton>\n )\n\n // Links\n case 'link':\n return (\n <div key={button} className=\"rte-builder-toolbar-dropdown\" ref={linkDialogRef}>\n <ToolbarButton\n onClick={() => setShowLinkDialog(!showLinkDialog)}\n title=\"Insert Link\"\n >\n {icons.link}\n </ToolbarButton>\n {showLinkDialog && (\n <div className=\"rte-builder-toolbar-dropdown-content\">\n <input\n type=\"url\"\n placeholder=\"Enter URL...\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n insertLink()\n }\n }}\n autoFocus\n />\n <button onClick={insertLink}>Insert</button>\n </div>\n )}\n </div>\n )\n case 'unlink':\n return (\n <ToolbarButton\n key={button}\n onClick={removeLink}\n title=\"Remove Link\"\n >\n {icons.unlink}\n </ToolbarButton>\n )\n\n // Media\n case 'image':\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerImage || (() => {})}\n disabled={!onMediaPickerImage}\n title=\"Insert Image\"\n >\n {icons.image}\n </ToolbarButton>\n )\n case 'video':\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerVideo || (() => {})}\n disabled={!onMediaPickerVideo}\n title=\"Insert Video\"\n >\n {icons.video}\n </ToolbarButton>\n )\n case 'table':\n return (\n <ToolbarButton\n key={button}\n onClick={insertTable}\n title=\"Insert Table\"\n >\n {icons.table}\n </ToolbarButton>\n )\n\n // Emoji\n case 'emoji':\n return (\n <div key={button} className=\"rte-builder-toolbar-dropdown\" ref={emojiPickerRef}>\n <ToolbarButton\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n title=\"Insert Emoji\"\n >\n {icons.emoji}\n </ToolbarButton>\n {showEmojiPicker && (\n <div className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? 'active' : ''}`}\n onClick={() => setSelectedEmojiCategory(key)}\n title={(category as any).label}\n >\n {(category as any).emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {(EMOJI_CATEGORIES[selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES] as any)?.emojis.map(\n (emoji: string, idx: number) => (\n <button\n key={idx}\n className=\"rte-builder-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n )\n )}\n </div>\n </div>\n )}\n </div>\n )\n\n // Actions\n case 'undo':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\n title=\"Undo (Ctrl+Z)\"\n >\n {icons.undo}\n </ToolbarButton>\n )\n case 'redo':\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\n title=\"Redo (Ctrl+Y)\"\n >\n {icons.redo}\n </ToolbarButton>\n )\n case 'fullscreen':\n return (\n <ToolbarButton\n key={button}\n active={isFullscreen}\n onClick={onToggleFullscreen || (() => {})}\n title=\"Toggle Fullscreen\"\n >\n {icons.fullscreen}\n </ToolbarButton>\n )\n case 'print':\n return (\n <ToolbarButton\n key={button}\n onClick={onPrint || (() => {})}\n title=\"Print\"\n >\n {icons.print}\n </ToolbarButton>\n )\n\n default:\n return null\n }\n }\n\n return (\n <div className=\"rte-builder-toolbar lexical-toolbar\">\n {buttons.map((button, index) => renderButton(button, index))}\n </div>\n )\n}\n\nexport default LexicalToolbar\n","/**\n * Lexical Editor Component\n *\n * This is the actual Lexical editor implementation that conforms\n * to the adapter interface.\n */\n\nimport React, {\n useEffect,\n useImperativeHandle,\n forwardRef,\n useCallback,\n useState,\n useRef,\n} from 'react'\n\n// Lexical core\nimport { LexicalComposer } from '@lexical/react/LexicalComposer'\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable'\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin'\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'\nimport { TablePlugin } from '@lexical/react/LexicalTablePlugin'\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin'\n\n// Lexical nodes\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text'\nimport { ListNode, ListItemNode } from '@lexical/list'\nimport { LinkNode, AutoLinkNode } from '@lexical/link'\nimport { CodeNode, CodeHighlightNode } from '@lexical/code'\nimport { TableNode, TableCellNode, TableRowNode } from '@lexical/table'\nimport { HorizontalRuleNode } from '@lexical/react/LexicalHorizontalRuleNode'\n\n// Lexical utilities\nimport {\n $getRoot,\n $getSelection,\n $isRangeSelection,\n $createParagraphNode,\n $createTextNode,\n EditorState,\n LexicalEditor,\n FORMAT_TEXT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n CAN_UNDO_COMMAND,\n CAN_REDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n} from 'lexical'\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html'\n\n// Toolbar\nimport { LexicalToolbar } from './LexicalToolbar'\n\n// Types\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\n\n// ============================================================================\n// THEME\n// ============================================================================\n\nconst theme = {\n ltr: 'ltr',\n rtl: 'rtl',\n paragraph: 'rte-builder-paragraph',\n quote: 'rte-builder-blockquote',\n heading: {\n h1: 'rte-builder-h1',\n h2: 'rte-builder-h2',\n h3: 'rte-builder-h3',\n h4: 'rte-builder-h4',\n h5: 'rte-builder-h5',\n h6: 'rte-builder-h6',\n },\n list: {\n nested: {\n listitem: 'rte-builder-nested-listitem',\n },\n ol: 'rte-builder-ol',\n ul: 'rte-builder-ul',\n listitem: 'rte-builder-listitem',\n listitemChecked: 'rte-builder-listitem-checked',\n listitemUnchecked: 'rte-builder-listitem-unchecked',\n },\n hashtag: 'rte-builder-hashtag',\n image: 'rte-builder-image',\n link: 'rte-builder-link',\n text: {\n bold: 'rte-builder-bold',\n code: 'rte-builder-code',\n italic: 'rte-builder-italic',\n strikethrough: 'rte-builder-strikethrough',\n subscript: 'rte-builder-subscript',\n superscript: 'rte-builder-superscript',\n underline: 'rte-builder-underline',\n underlineStrikethrough: 'rte-builder-underline-strikethrough',\n },\n code: 'rte-builder-code-block',\n codeHighlight: {\n atrule: 'rte-builder-code-atrule',\n attr: 'rte-builder-code-attr',\n boolean: 'rte-builder-code-boolean',\n builtin: 'rte-builder-code-builtin',\n cdata: 'rte-builder-code-cdata',\n char: 'rte-builder-code-char',\n class: 'rte-builder-code-class',\n 'class-name': 'rte-builder-code-class-name',\n comment: 'rte-builder-code-comment',\n constant: 'rte-builder-code-constant',\n deleted: 'rte-builder-code-deleted',\n doctype: 'rte-builder-code-doctype',\n entity: 'rte-builder-code-entity',\n function: 'rte-builder-code-function',\n important: 'rte-builder-code-important',\n inserted: 'rte-builder-code-inserted',\n keyword: 'rte-builder-code-keyword',\n namespace: 'rte-builder-code-namespace',\n number: 'rte-builder-code-number',\n operator: 'rte-builder-code-operator',\n prolog: 'rte-builder-code-prolog',\n property: 'rte-builder-code-property',\n punctuation: 'rte-builder-code-punctuation',\n regex: 'rte-builder-code-regex',\n selector: 'rte-builder-code-selector',\n string: 'rte-builder-code-string',\n symbol: 'rte-builder-code-symbol',\n tag: 'rte-builder-code-tag',\n url: 'rte-builder-code-url',\n variable: 'rte-builder-code-variable',\n },\n table: 'rte-builder-table',\n tableCell: 'rte-builder-table-cell',\n tableCellHeader: 'rte-builder-table-cell-header',\n tableRow: 'rte-builder-table-row',\n}\n\n// ============================================================================\n// ERROR HANDLING\n// ============================================================================\n\nfunction onError(error: Error): void {\n console.error('Lexical Error:', error)\n}\n\n// ============================================================================\n// EDITOR INNER COMPONENT\n// ============================================================================\n\ninterface EditorInnerProps {\n value: string\n onChange?: (content: string) => void\n onBlur?: () => void\n onFocus?: () => void\n placeholder: string\n height: number\n minHeight: number\n maxHeight?: number\n disabled: boolean\n readOnly: boolean\n charCounterMax: number\n showCharCounter: boolean\n toolbarButtons?: string[]\n onMediaPickerImage?: () => Promise<void>\n onMediaPickerVideo?: () => Promise<void>\n editorRef: React.Ref<AdapterEditorRef>\n isFullscreen: boolean\n onToggleFullscreen: () => void\n}\n\nconst EditorInner: React.FC<EditorInnerProps> = ({\n value,\n onChange,\n onBlur,\n onFocus,\n placeholder,\n height,\n minHeight,\n maxHeight,\n disabled,\n readOnly,\n charCounterMax,\n showCharCounter,\n toolbarButtons,\n onMediaPickerImage,\n onMediaPickerVideo,\n editorRef,\n isFullscreen,\n onToggleFullscreen,\n}) => {\n const [editor] = useLexicalComposerContext()\n const [characterCount, setCharacterCount] = useState(0)\n const [canUndo, setCanUndo] = useState(false)\n const [canRedo, setCanRedo] = useState(false)\n const initialLoadRef = useRef(true)\n\n // Load initial value\n useEffect(() => {\n if (value && initialLoadRef.current) {\n initialLoadRef.current = false\n editor.update(() => {\n const parser = new DOMParser()\n const dom = parser.parseFromString(value, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n const root = $getRoot()\n root.clear()\n root.append(...nodes)\n })\n }\n }, [value, editor])\n\n // Update editable state\n useEffect(() => {\n editor.setEditable(!disabled && !readOnly)\n }, [disabled, readOnly, editor])\n\n // Track can undo/redo\n useEffect(() => {\n return editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n setCanUndo(payload)\n return false\n },\n COMMAND_PRIORITY_CRITICAL\n )\n }, [editor])\n\n useEffect(() => {\n return editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n setCanRedo(payload)\n return false\n },\n COMMAND_PRIORITY_CRITICAL\n )\n }, [editor])\n\n // Handle change\n const handleChange = useCallback(\n (editorState: EditorState) => {\n editorState.read(() => {\n const root = $getRoot()\n const text = root.getTextContent()\n setCharacterCount(text.length)\n\n if (onChange) {\n const html = $generateHtmlFromNodes(editor, null)\n onChange(html)\n }\n })\n },\n [onChange, editor]\n )\n\n // Print function\n const handlePrint = useCallback(() => {\n editor.getEditorState().read(() => {\n const html = $generateHtmlFromNodes(editor, null)\n const printWindow = window.open('', '_blank')\n if (printWindow) {\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Print</title>\n <style>\n body { font-family: Arial, sans-serif; padding: 20px; }\n img { max-width: 100%; }\n </style>\n </head>\n <body>${html}</body>\n </html>\n `)\n printWindow.document.close()\n printWindow.print()\n }\n })\n }, [editor])\n\n // Expose methods via ref\n useImperativeHandle(editorRef, () => ({\n getContent: () => {\n let html = ''\n editor.getEditorState().read(() => {\n html = $generateHtmlFromNodes(editor, null)\n })\n return html\n },\n getText: () => {\n let text = ''\n editor.getEditorState().read(() => {\n text = $getRoot().getTextContent()\n })\n return text\n },\n getJSON: () => {\n return editor.getEditorState().toJSON()\n },\n setContent: (html: string) => {\n editor.update(() => {\n const parser = new DOMParser()\n const dom = parser.parseFromString(html, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n const root = $getRoot()\n root.clear()\n root.append(...nodes)\n })\n },\n focus: () => {\n editor.focus()\n },\n blur: () => {\n editor.blur()\n },\n insertHTML: (html: string) => {\n editor.update(() => {\n const parser = new DOMParser()\n const dom = parser.parseFromString(html, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n selection.insertNodes(nodes)\n }\n })\n },\n insertText: (text: string) => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n selection.insertText(text)\n }\n })\n },\n clear: () => {\n editor.update(() => {\n const root = $getRoot()\n root.clear()\n root.append($createParagraphNode())\n })\n },\n isEmpty: () => {\n let isEmpty = true\n editor.getEditorState().read(() => {\n const text = $getRoot().getTextContent()\n isEmpty = text.trim().length === 0\n })\n return isEmpty\n },\n getCharacterCount: () => characterCount,\n getWordCount: () => {\n let wordCount = 0\n editor.getEditorState().read(() => {\n const text = $getRoot().getTextContent()\n wordCount = text.split(/\\s+/).filter(word => word.length > 0).length\n })\n return wordCount\n },\n isFullscreen: () => isFullscreen,\n toggleFullscreen: onToggleFullscreen,\n print: handlePrint,\n undo: () => {\n editor.dispatchCommand(UNDO_COMMAND, undefined)\n },\n redo: () => {\n editor.dispatchCommand(REDO_COMMAND, undefined)\n },\n canUndo: () => canUndo,\n canRedo: () => canRedo,\n getNativeEditor: () => editor,\n }))\n\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\n\n return (\n <>\n <LexicalToolbar\n editor={editor}\n buttons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage}\n onMediaPickerVideo={onMediaPickerVideo}\n onToggleFullscreen={onToggleFullscreen}\n onPrint={handlePrint}\n isFullscreen={isFullscreen}\n />\n <div\n className=\"rte-builder-container\"\n style={{\n height: `${height}px`,\n minHeight: `${minHeight}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n overflow: 'auto',\n }}\n >\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n className=\"rte-builder-content\"\n onBlur={onBlur}\n onFocus={onFocus}\n />\n }\n placeholder={<div className=\"rte-builder-placeholder\">{placeholder}</div>}\n ErrorBoundary={LexicalErrorBoundary}\n />\n <OnChangePlugin onChange={handleChange} />\n <HistoryPlugin />\n <ListPlugin />\n <LinkPlugin />\n <TablePlugin />\n <CheckListPlugin />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\ninterface LexicalEditorComponentProps extends AdapterComponentProps {}\n\nexport const LexicalEditorComponent = forwardRef<AdapterEditorRef, LexicalEditorComponentProps>(\n (\n {\n value = '',\n onChange,\n onBlur,\n onFocus,\n placeholder = 'Start typing...',\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarButtons,\n className = '',\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = 'javascript',\n editorConfig = {},\n },\n ref\n ) => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const handleToggleFullscreen = useCallback(() => {\n setIsFullscreen(prev => !prev)\n }, [])\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage) {\n await onMediaPickerImage()\n }\n }, [onMediaPickerImage])\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo) {\n await onMediaPickerVideo()\n }\n }, [onMediaPickerVideo])\n\n const initialConfig = {\n namespace: 'RTEBuilder',\n theme,\n onError,\n nodes: [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n AutoLinkNode,\n CodeNode,\n CodeHighlightNode,\n TableNode,\n TableCellNode,\n TableRowNode,\n HorizontalRuleNode,\n ],\n editable: !disabled && !readOnly,\n ...editorConfig,\n }\n\n return (\n <div\n className={`rte-builder-wrapper lexical-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\n >\n <LexicalComposer initialConfig={initialConfig}>\n <EditorInner\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onFocus={onFocus}\n placeholder={placeholder}\n height={height}\n minHeight={minHeight}\n maxHeight={maxHeight}\n disabled={disabled}\n readOnly={readOnly}\n charCounterMax={charCounterMax}\n showCharCounter={showCharCounter}\n toolbarButtons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\n editorRef={ref}\n isFullscreen={isFullscreen}\n onToggleFullscreen={handleToggleFullscreen}\n />\n </LexicalComposer>\n </div>\n )\n }\n)\n\nLexicalEditorComponent.displayName = 'LexicalEditorComponent'\n\nexport default LexicalEditorComponent\n","/**\n * RTE Builder - Universal Rich Text Editor Library\n *\n * A generic, adapter-based rich text editor that supports multiple editor backends:\n * - TipTap (default, included)\n * - Slate.js (included)\n * - Lexical (included)\n * - Quill (planned)\n * - Draft.js (planned)\n *\n * @example Basic Usage\n * ```tsx\n * import { RichTextEditor } from 'rte-builder'\n *\n * function App() {\n * const [content, setContent] = useState('')\n * return <RichTextEditor value={content} onChange={setContent} />\n * }\n * ```\n *\n * @example With Specific Editor\n * ```tsx\n * <RichTextEditor editor=\"tiptap\" value={content} onChange={setContent} />\n * ```\n */\n\n// ============================================================================\n// MAIN COMPONENT EXPORTS\n// ============================================================================\n\n// The unified editor (recommended for most use cases)\nexport { UnifiedEditor } from \"./components/UnifiedEditor\";\n\n// Legacy TipTap-specific editor (for backwards compatibility)\nexport { RichTextEditor } from \"./components/RichTextEditor\";\n\n// ============================================================================\n// TYPE EXPORTS\n// ============================================================================\n\n// Legacy types (backwards compatibility)\nexport type {\n EditorProps,\n EditorRef,\n MediaFile as LegacyMediaFile,\n ToolbarButton,\n ToolbarConfig as LegacyToolbarConfig,\n} from \"./types\";\n\n// Core types (new unified interface)\nexport type {\n EditorType,\n BaseEditorConfig,\n MediaFile,\n ToolbarButtonType,\n ToolbarPreset,\n ToolbarConfig,\n UnifiedEditorProps,\n UnifiedEditorRef,\n EditorAdapter,\n AdapterComponentProps,\n AdapterEditorRef,\n EditorFeatures,\n} from \"./core/types\";\n\nexport { DEFAULT_FEATURES } from \"./core/types\";\n\n// ============================================================================\n// REGISTRY EXPORTS\n// ============================================================================\n\nexport {\n registerAdapter,\n unregisterAdapter,\n getAdapter,\n getAllAdapters,\n getAvailableAdapters,\n isEditorAvailable,\n getBestAvailableEditor,\n getDefaultEditorType,\n getEditorFeatures,\n compareEditorFeatures,\n getRegistryStats,\n EditorRegistry,\n} from \"./core/registry\";\n\n// ============================================================================\n// TOOLBAR PRESET EXPORTS\n// ============================================================================\n\nexport {\n fullToolbar,\n mediumToolbar,\n simpleToolbar,\n minimalToolbar,\n codeToolbar,\n blogToolbar,\n emailToolbar,\n toolbarPresets,\n getToolbarPreset,\n customizeToolbar,\n} from \"./core/presets\";\n\nexport type { ToolbarPresetName } from \"./core/presets\";\n\n// ============================================================================\n// ADAPTER EXPORTS\n// ============================================================================\n\n// TipTap adapter (included by default)\nexport { TipTapAdapter } from \"./adapters/tiptap\";\nexport { TipTapEditorComponent } from \"./adapters/tiptap/TipTapEditorComponent\";\nexport { TipTapToolbar } from \"./adapters/tiptap/TipTapToolbar\";\n\n// Note: Slate.js and Lexical adapters are available but require additional\n// dependencies to be installed. They are not exported by default to avoid\n// bundling issues. Import them directly from their paths if needed:\n// import { SlateAdapter } from 'rte-builder/adapters/slate/SlateAdapter'\n// import { LexicalAdapter } from 'rte-builder/adapters/lexical/LexicalAdapter'\n\n// ============================================================================\n// EXTENSION EXPORTS\n// ============================================================================\n\n// Custom TipTap extensions (can be used independently)\nexport { FontSize } from \"./extensions/FontSize\";\nexport { LineHeight } from \"./extensions/LineHeight\";\nexport { Video } from \"./extensions/Video\";\nexport { Emoji, EMOJI_CATEGORIES } from \"./extensions/Emoji\";\nexport { Fullscreen } from \"./extensions/Fullscreen\";\nexport { Print } from \"./extensions/Print\";\nexport { Indent } from \"./extensions/Indent\";\n\n// ============================================================================\n// COLLABORATION EXPORTS (v2.0)\n// ============================================================================\n\nexport {\n CollaborationProvider,\n useCollaboration,\n useCollaborationOptional,\n} from \"./collaboration\";\n\nexport type {\n CollaborationUser,\n CollaborationConfig,\n CollaborationState,\n CollaborationStatus,\n CollaborationEvent,\n CollaborationProps,\n CursorPosition,\n} from \"./collaboration\";\n\nexport { PresenceIndicator } from \"./collaboration/PresenceIndicator\";\n\n// ============================================================================\n// COMMENTS EXPORTS (v2.1)\n// ============================================================================\n\nexport {\n CommentsProvider,\n useComments,\n useCommentsOptional,\n DEFAULT_REACTION_EMOJIS,\n} from \"./comments\";\n\nexport type {\n Comment,\n CommentThread,\n CommentAuthor,\n CommentRange,\n CommentsConfig,\n CommentsState,\n CommentEvent,\n CommentsProps,\n} from \"./comments\";\n\nexport { CommentsPanel } from \"./comments/CommentsPanel\";\n\n// ============================================================================\n// VERSION HISTORY EXPORTS (v2.2)\n// ============================================================================\n\nexport {\n VersionHistoryProvider,\n useVersionHistory,\n useVersionHistoryOptional,\n} from \"./history\";\n\nexport type {\n Version,\n VersionAuthor,\n VersionHistoryConfig,\n VersionHistoryState,\n VersionHistoryEvent,\n VersionHistoryProps,\n VersionComparison,\n VersionChange,\n} from \"./history\";\n\nexport { VersionHistoryPanel } from \"./history/VersionHistoryPanel\";\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\n// Import styles (they will be bundled with the library)\nimport \"./styles/editor.css\";\nimport \"./styles/collaboration.css\";\nimport \"./styles/comments.css\";\nimport \"./styles/version-history.css\";\n","/**\n * Unified Rich Text Editor Component\n *\n * This is the main entry point for the rte-builder library.\n * It provides a unified interface that works with any registered editor adapter.\n */\n\nimport { forwardRef, useImperativeHandle, useRef, useMemo, useState } from \"react\";\nimport type {\n UnifiedEditorProps,\n UnifiedEditorRef,\n EditorType,\n ToolbarButtonType,\n AdapterEditorRef,\n} from \"../core/types\";\nimport {\n getAdapter,\n getBestAvailableEditor,\n getAvailableAdapters,\n registerAdapter,\n} from \"../core/registry\";\nimport { getToolbarPreset, toolbarPresets } from \"../core/presets\";\n\n// Import and register all adapters\nimport { TipTapAdapter } from \"../adapters/tiptap\";\nimport { SlateAdapter } from \"../adapters/slate/SlateAdapter\";\nimport { LexicalAdapter } from \"../adapters/lexical/LexicalAdapter\";\n\n// Register adapters on module load (only if available)\nregisterAdapter(TipTapAdapter);\nif (SlateAdapter.isAvailable()) {\n registerAdapter(SlateAdapter);\n}\nif (LexicalAdapter.isAvailable()) {\n registerAdapter(LexicalAdapter);\n}\n\nexport const UnifiedEditor = forwardRef<UnifiedEditorRef, UnifiedEditorProps>(\n (\n {\n editor: editorType,\n showEditorSwitcher = false,\n onEditorChange,\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n placeholder = \"Start typing...\",\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbar = \"full\",\n toolbarButtons: customToolbarButtons,\n className = \"\",\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = \"javascript\",\n editorConfig,\n },\n ref,\n ) => {\n const adapterRef = useRef<AdapterEditorRef>(null);\n const [internalEditorType, setInternalEditorType] = useState<EditorType | undefined>(editorType);\n\n // Get available adapters for the switcher\n const availableAdapters = useMemo(() => getAvailableAdapters(), []);\n\n // Determine which editor to use (controlled or internal state)\n const currentEditorType = editorType !== undefined ? editorType : internalEditorType;\n\n // Determine which editor to use\n const selectedAdapter = useMemo(() => {\n if (currentEditorType) {\n const adapter = getAdapter(currentEditorType);\n if (adapter?.isAvailable()) {\n return adapter;\n }\n console.warn(\n `Editor \"${currentEditorType}\" is not available. Falling back to best available.`,\n );\n }\n return getBestAvailableEditor();\n }, [currentEditorType]);\n\n // Handle editor switch\n const handleEditorSwitch = (newEditorType: EditorType) => {\n if (onEditorChange) {\n onEditorChange(newEditorType);\n } else {\n setInternalEditorType(newEditorType);\n }\n };\n\n // Determine toolbar buttons\n const toolbarButtons = useMemo((): ToolbarButtonType[] => {\n if (customToolbarButtons) {\n return customToolbarButtons;\n }\n\n if (typeof toolbar === \"string\") {\n return getToolbarPreset(toolbar as keyof typeof toolbarPresets);\n }\n\n if (toolbar.buttons) {\n return toolbar.buttons;\n }\n\n if (toolbar.preset) {\n return getToolbarPreset(toolbar.preset as keyof typeof toolbarPresets);\n }\n\n return getToolbarPreset(\"full\");\n }, [toolbar, customToolbarButtons]);\n\n // Expose unified methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => adapterRef.current?.getContent() || \"\",\n getText: () => adapterRef.current?.getText() || \"\",\n getJSON: () => adapterRef.current?.getJSON(),\n setContent: (content: string) => adapterRef.current?.setContent(content),\n focus: () => adapterRef.current?.focus(),\n blur: () => adapterRef.current?.blur(),\n insertHTML: (html: string) => adapterRef.current?.insertHTML(html),\n insertText: (text: string) => adapterRef.current?.insertText(text),\n clear: () => adapterRef.current?.clear(),\n isEmpty: () => adapterRef.current?.isEmpty() ?? true,\n getCharacterCount: () => adapterRef.current?.getCharacterCount() || 0,\n getWordCount: () => adapterRef.current?.getWordCount() || 0,\n isFullscreen: () => adapterRef.current?.isFullscreen() || false,\n toggleFullscreen: () => adapterRef.current?.toggleFullscreen(),\n print: () => adapterRef.current?.print(),\n undo: () => adapterRef.current?.undo(),\n redo: () => adapterRef.current?.redo(),\n canUndo: () => adapterRef.current?.canUndo() ?? false,\n canRedo: () => adapterRef.current?.canRedo() ?? false,\n getNativeEditor: () => adapterRef.current?.getNativeEditor(),\n getEditorType: () => selectedAdapter?.type || (\"tiptap\" as EditorType),\n }));\n\n // Handle case where no editor is available\n if (!selectedAdapter) {\n return (\n <div className={`rte-builder-wrapper rte-builder-error ${className}`}>\n <div className=\"rte-builder-error-message\">\n No editor available. Please install an editor package:\n <br />\n <code>npm install @tiptap/react @tiptap/starter-kit</code>\n </div>\n </div>\n );\n }\n\n // Get the editor component from the adapter\n const EditorComponent = selectedAdapter.getComponent();\n\n // Handle onChange to ensure it's always called\n const handleChange = (content: string) => {\n onChange?.(content);\n };\n\n return (\n <div className={`rte-builder-unified-wrapper ${className}`}>\n {showEditorSwitcher && availableAdapters.length > 1 && (\n <div className=\"rte-builder-editor-switcher\">\n <label className=\"rte-builder-editor-switcher-label\">Editor:</label>\n <select\n className=\"rte-builder-editor-switcher-select\"\n value={selectedAdapter.type}\n onChange={(e) => handleEditorSwitch(e.target.value as EditorType)}\n disabled={disabled}\n >\n {availableAdapters.map((adapter) => (\n <option key={adapter.type} value={adapter.type}>\n {adapter.name}\n </option>\n ))}\n </select>\n </div>\n )}\n <EditorComponent\n key={selectedAdapter.type}\n editorRef={adapterRef}\n value={value}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n placeholder={placeholder}\n height={height}\n minHeight={minHeight}\n maxHeight={maxHeight}\n disabled={disabled}\n readOnly={readOnly}\n charCounterMax={charCounterMax}\n showCharCounter={showCharCounter}\n toolbarButtons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage}\n onMediaPickerVideo={onMediaPickerVideo}\n enableCodeHighlight={enableCodeHighlight}\n defaultCodeLanguage={defaultCodeLanguage}\n editorConfig={editorConfig}\n />\n </div>\n );\n },\n);\n\nUnifiedEditor.displayName = \"UnifiedEditor\";\n\nexport default UnifiedEditor;\n","/**\n * Editor Registry - Manages available editor adapters\n *\n * This module provides a central registry for editor adapters.\n * It allows dynamic registration of editors and automatic selection\n * based on availability.\n */\n\nimport type { EditorAdapter, EditorType, EditorFeatures } from './types'\n\n// Registry to store all registered adapters\nconst adapters = new Map<EditorType, EditorAdapter>()\n\n// Default editor preference order\nconst defaultPreferenceOrder: EditorType[] = ['tiptap', 'slate', 'lexical', 'quill', 'draft']\n\n/**\n * Register an editor adapter\n * @param adapter The adapter to register\n */\nexport function registerAdapter(adapter: EditorAdapter): void {\n adapters.set(adapter.type, adapter)\n}\n\n/**\n * Unregister an editor adapter\n * @param type The editor type to unregister\n */\nexport function unregisterAdapter(type: EditorType): void {\n adapters.delete(type)\n}\n\n/**\n * Get an adapter by type\n * @param type The editor type\n * @returns The adapter or undefined\n */\nexport function getAdapter(type: EditorType): EditorAdapter | undefined {\n return adapters.get(type)\n}\n\n/**\n * Get all registered adapters\n * @returns Array of all registered adapters\n */\nexport function getAllAdapters(): EditorAdapter[] {\n return Array.from(adapters.values())\n}\n\n/**\n * Get all available adapters (ones with dependencies installed)\n * @returns Array of available adapters\n */\nexport function getAvailableAdapters(): EditorAdapter[] {\n return getAllAdapters().filter(adapter => adapter.isAvailable())\n}\n\n/**\n * Check if an editor type is available\n * @param type The editor type to check\n * @returns Whether the editor is available\n */\nexport function isEditorAvailable(type: EditorType): boolean {\n const adapter = adapters.get(type)\n return adapter?.isAvailable() ?? false\n}\n\n/**\n * Get the best available editor based on preference order\n * @param preferenceOrder Custom preference order (optional)\n * @returns The best available adapter or undefined\n */\nexport function getBestAvailableEditor(\n preferenceOrder: EditorType[] = defaultPreferenceOrder\n): EditorAdapter | undefined {\n for (const type of preferenceOrder) {\n const adapter = adapters.get(type)\n if (adapter?.isAvailable()) {\n return adapter\n }\n }\n\n // Fallback: return any available adapter\n return getAvailableAdapters()[0]\n}\n\n/**\n * Get the default editor (first available in preference order)\n * @returns The default editor type or undefined\n */\nexport function getDefaultEditorType(): EditorType | undefined {\n const adapter = getBestAvailableEditor()\n return adapter?.type\n}\n\n/**\n * Get features supported by an editor\n * @param type The editor type\n * @returns The features object or undefined\n */\nexport function getEditorFeatures(type: EditorType): EditorFeatures | undefined {\n const adapter = adapters.get(type)\n return adapter?.getSupportedFeatures()\n}\n\n/**\n * Compare features between two editors\n * @param type1 First editor type\n * @param type2 Second editor type\n * @returns Object with features and their support status\n */\nexport function compareEditorFeatures(\n type1: EditorType,\n type2: EditorType\n): Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> | undefined {\n const features1 = getEditorFeatures(type1)\n const features2 = getEditorFeatures(type2)\n\n if (!features1 || !features2) return undefined\n\n const result: Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> = {} as any\n\n for (const key of Object.keys(features1) as (keyof EditorFeatures)[]) {\n result[key] = {\n [type1]: features1[key],\n [type2]: features2[key],\n }\n }\n\n return result\n}\n\n/**\n * Get registry statistics\n * @returns Statistics about registered adapters\n */\nexport function getRegistryStats(): {\n total: number\n available: number\n unavailable: number\n editors: { type: EditorType; available: boolean; name: string }[]\n} {\n const allAdapters = getAllAdapters()\n const availableAdapters = getAvailableAdapters()\n\n return {\n total: allAdapters.length,\n available: availableAdapters.length,\n unavailable: allAdapters.length - availableAdapters.length,\n editors: allAdapters.map(adapter => ({\n type: adapter.type,\n available: adapter.isAvailable(),\n name: adapter.name,\n })),\n }\n}\n\n// Export the registry for advanced use cases\nexport const EditorRegistry = {\n register: registerAdapter,\n unregister: unregisterAdapter,\n get: getAdapter,\n getAll: getAllAdapters,\n getAvailable: getAvailableAdapters,\n isAvailable: isEditorAvailable,\n getBest: getBestAvailableEditor,\n getDefault: getDefaultEditorType,\n getFeatures: getEditorFeatures,\n compareFeatures: compareEditorFeatures,\n getStats: getRegistryStats,\n}\n\nexport default EditorRegistry\n","/**\n * Toolbar Presets - Predefined toolbar configurations\n */\n\nimport type { ToolbarButtonType } from './types'\n\n/** Full toolbar with all features */\nexport const fullToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'separator',\n 'subscript',\n 'superscript',\n 'clearFormatting',\n 'separator',\n 'fontFamily',\n 'fontSize',\n 'lineHeight',\n 'textColor',\n 'backgroundColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'alignJustify',\n 'separator',\n 'indent',\n 'outdent',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'heading4',\n 'heading5',\n 'heading6',\n 'blockquote',\n 'separator',\n 'link',\n 'unlink',\n 'image',\n 'video',\n 'table',\n 'emoji',\n 'separator',\n 'codeBlock',\n 'horizontalRule',\n 'separator',\n 'undo',\n 'redo',\n 'separator',\n 'fullscreen',\n 'print',\n]\n\n/** Medium toolbar for standard editing */\nexport const mediumToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'separator',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'backgroundColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'separator',\n 'link',\n 'image',\n 'table',\n 'emoji',\n 'separator',\n 'undo',\n 'redo',\n 'fullscreen',\n]\n\n/** Simple toolbar for basic editing */\nexport const simpleToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'link',\n 'image',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** Minimal toolbar for comments/notes */\nexport const minimalToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'separator',\n 'link',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** Code-focused toolbar for technical documentation */\nexport const codeToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'code',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'link',\n 'image',\n 'separator',\n 'codeBlock',\n 'blockquote',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** Blog/Article toolbar */\nexport const blogToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'separator',\n 'fontSize',\n 'textColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'blockquote',\n 'separator',\n 'link',\n 'image',\n 'video',\n 'separator',\n 'horizontalRule',\n 'separator',\n 'undo',\n 'redo',\n 'fullscreen',\n]\n\n/** Email composition toolbar */\nexport const emailToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'separator',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'link',\n 'image',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** All preset configurations */\nexport const toolbarPresets = {\n full: fullToolbar,\n medium: mediumToolbar,\n simple: simpleToolbar,\n minimal: minimalToolbar,\n code: codeToolbar,\n blog: blogToolbar,\n email: emailToolbar,\n} as const\n\nexport type ToolbarPresetName = keyof typeof toolbarPresets\n\n/**\n * Get a toolbar preset by name\n * @param name The preset name\n * @returns The toolbar buttons array\n */\nexport function getToolbarPreset(name: ToolbarPresetName): ToolbarButtonType[] {\n return toolbarPresets[name] || toolbarPresets.full\n}\n\n/**\n * Create a custom toolbar from a preset with modifications\n * @param base Base preset name\n * @param options Modification options\n * @returns Modified toolbar buttons array\n */\nexport function customizeToolbar(\n base: ToolbarPresetName,\n options: {\n add?: ToolbarButtonType[]\n remove?: ToolbarButtonType[]\n insertBefore?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\n insertAfter?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\n }\n): ToolbarButtonType[] {\n let toolbar = [...getToolbarPreset(base)]\n\n // Remove buttons\n if (options.remove) {\n toolbar = toolbar.filter(btn => !options.remove!.includes(btn))\n }\n\n // Insert before\n if (options.insertBefore) {\n const index = toolbar.indexOf(options.insertBefore.button)\n if (index !== -1) {\n toolbar.splice(index, 0, ...options.insertBefore.items)\n }\n }\n\n // Insert after\n if (options.insertAfter) {\n const index = toolbar.indexOf(options.insertAfter.button)\n if (index !== -1) {\n toolbar.splice(index + 1, 0, ...options.insertAfter.items)\n }\n }\n\n // Add at end\n if (options.add) {\n toolbar.push('separator', ...options.add)\n }\n\n return toolbar\n}\n\nexport default toolbarPresets\n","/**\n * Core types for the RTE Builder - Editor Agnostic\n * These types define the common interface that all editor adapters must implement\n */\n\n// ============================================================================\n// EDITOR TYPES\n// ============================================================================\n\n/** Supported editor types */\nexport type EditorType = 'tiptap' | 'slate' | 'lexical' | 'quill' | 'draft'\n\n/** Editor configuration that applies to all editors */\nexport interface BaseEditorConfig {\n /** Initial HTML content */\n initialContent?: string\n /** Placeholder text */\n placeholder?: string\n /** Whether the editor is editable */\n editable?: boolean\n /** Auto-focus on mount */\n autoFocus?: boolean\n /** Custom attributes for the editor element */\n attributes?: Record<string, string>\n}\n\n/** Media file for image/video insertion */\nexport interface MediaFile {\n /** File URL */\n url: string\n /** File name */\n name?: string\n /** File type/MIME type */\n type?: string\n /** Alt text for images */\n alt?: string\n /** Title attribute */\n title?: string\n /** Width */\n width?: number\n /** Height */\n height?: number\n}\n\n// ============================================================================\n// TOOLBAR TYPES\n// ============================================================================\n\n/** All available toolbar button types */\nexport type ToolbarButtonType =\n // Text formatting\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'codeBlock'\n | 'subscript'\n | 'superscript'\n | 'clearFormatting'\n // Font & Colors\n | 'fontFamily'\n | 'fontSize'\n | 'lineHeight'\n | 'textColor'\n | 'backgroundColor'\n // Alignment & Indentation\n | 'alignLeft'\n | 'alignCenter'\n | 'alignRight'\n | 'alignJustify'\n | 'indent'\n | 'outdent'\n // Lists\n | 'bulletList'\n | 'orderedList'\n // Headings\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n // Blocks\n | 'blockquote'\n | 'horizontalRule'\n // Links & Media\n | 'link'\n | 'unlink'\n | 'image'\n | 'video'\n | 'table'\n | 'emoji'\n // Actions\n | 'undo'\n | 'redo'\n | 'fullscreen'\n | 'print'\n // Special\n | 'separator'\n\n/** Toolbar preset names */\nexport type ToolbarPreset = 'full' | 'medium' | 'simple' | 'minimal'\n\n/** Toolbar configuration */\nexport interface ToolbarConfig {\n /** Preset to use, or custom buttons array */\n preset?: ToolbarPreset\n /** Custom buttons array (overrides preset) */\n buttons?: ToolbarButtonType[]\n /** Whether toolbar is sticky */\n sticky?: boolean\n /** Sticky offset in pixels */\n stickyOffset?: number\n}\n\n// ============================================================================\n// EDITOR PROPS & REF TYPES\n// ============================================================================\n\n/** Props for the unified RichTextEditor component */\nexport interface UnifiedEditorProps {\n /** Which editor to use */\n editor?: EditorType\n /** Show editor switcher dropdown in toolbar */\n showEditorSwitcher?: boolean\n /** Callback when editor type changes via switcher */\n onEditorChange?: (editorType: EditorType) => void\n /** Initial content (HTML string) */\n value?: string\n /** Callback when content changes */\n onChange?: (content: string) => void\n /** Callback when editor loses focus */\n onBlur?: () => void\n /** Callback when editor gains focus */\n onFocus?: () => void\n /** Placeholder text */\n placeholder?: string\n /** Editor height in pixels */\n height?: number\n /** Minimum height in pixels */\n minHeight?: number\n /** Maximum height in pixels */\n maxHeight?: number\n /** Whether the editor is disabled */\n disabled?: boolean\n /** Whether the editor is read-only */\n readOnly?: boolean\n /** Character limit (-1 for no limit) */\n charCounterMax?: number\n /** Show character counter */\n showCharCounter?: boolean\n /** Toolbar preset or custom config */\n toolbar?: ToolbarPreset | ToolbarConfig\n /** Custom toolbar buttons (shorthand for toolbar.buttons) */\n toolbarButtons?: ToolbarButtonType[]\n /** Additional className */\n className?: string\n /** Callback for custom image picker */\n onMediaPickerImage?: () => Promise<MediaFile | null>\n /** Callback for custom video picker */\n onMediaPickerVideo?: () => Promise<MediaFile | null>\n /** Enable syntax highlighting for code blocks */\n enableCodeHighlight?: boolean\n /** Default language for code blocks */\n defaultCodeLanguage?: string\n /** Additional editor-specific config */\n editorConfig?: Record<string, unknown>\n}\n\n/** Methods exposed via ref */\nexport interface UnifiedEditorRef {\n /** Get the current HTML content */\n getContent: () => string\n /** Get content as plain text */\n getText: () => string\n /** Get content as JSON (if supported) */\n getJSON: () => unknown\n /** Set the HTML content */\n setContent: (content: string) => void\n /** Focus the editor */\n focus: () => void\n /** Blur the editor */\n blur: () => void\n /** Insert HTML at cursor position */\n insertHTML: (html: string) => void\n /** Insert text at cursor position */\n insertText: (text: string) => void\n /** Clear all content */\n clear: () => void\n /** Check if content is empty */\n isEmpty: () => boolean\n /** Get character count */\n getCharacterCount: () => number\n /** Get word count */\n getWordCount: () => number\n /** Check if editor is in fullscreen mode */\n isFullscreen: () => boolean\n /** Toggle fullscreen mode */\n toggleFullscreen: () => void\n /** Print the content */\n print: () => void\n /** Undo last action */\n undo: () => void\n /** Redo last undone action */\n redo: () => void\n /** Check if can undo */\n canUndo: () => boolean\n /** Check if can redo */\n canRedo: () => boolean\n /** Get the native editor instance */\n getNativeEditor: () => unknown\n /** Get the editor type */\n getEditorType: () => EditorType\n}\n\n// ============================================================================\n// EDITOR ADAPTER INTERFACE\n// ============================================================================\n\n/**\n * Abstract interface that all editor adapters must implement.\n * This ensures consistency across different editor implementations.\n */\nexport interface EditorAdapter {\n /** The type of editor this adapter handles */\n readonly type: EditorType\n\n /** Human-readable name */\n readonly name: string\n\n /** Description of the editor */\n readonly description: string\n\n /** Whether this adapter is available (dependencies installed) */\n isAvailable: () => boolean\n\n /** Get the React component for this editor */\n getComponent: () => React.ComponentType<AdapterComponentProps>\n\n /** Get supported features */\n getSupportedFeatures: () => EditorFeatures\n}\n\n/** Props passed to adapter components */\nexport interface AdapterComponentProps {\n value: string\n onChange: (content: string) => void\n onBlur?: () => void\n onFocus?: () => void\n placeholder?: string\n height?: number\n minHeight?: number\n maxHeight?: number\n disabled?: boolean\n readOnly?: boolean\n charCounterMax?: number\n showCharCounter?: boolean\n toolbarButtons: ToolbarButtonType[]\n className?: string\n onMediaPickerImage?: () => Promise<MediaFile | null>\n onMediaPickerVideo?: () => Promise<MediaFile | null>\n enableCodeHighlight?: boolean\n defaultCodeLanguage?: string\n editorConfig?: Record<string, unknown>\n /** Ref forwarding */\n editorRef?: React.Ref<AdapterEditorRef>\n}\n\n/** Ref methods that adapters must expose */\nexport interface AdapterEditorRef {\n getContent: () => string\n getText: () => string\n getJSON: () => unknown\n setContent: (content: string) => void\n focus: () => void\n blur: () => void\n insertHTML: (html: string) => void\n insertText: (text: string) => void\n clear: () => void\n isEmpty: () => boolean\n getCharacterCount: () => number\n getWordCount: () => number\n isFullscreen: () => boolean\n toggleFullscreen: () => void\n print: () => void\n undo: () => void\n redo: () => void\n canUndo: () => boolean\n canRedo: () => boolean\n getNativeEditor: () => unknown\n}\n\n// ============================================================================\n// FEATURE FLAGS\n// ============================================================================\n\n/** Features that an editor may or may not support */\nexport interface EditorFeatures {\n // Text formatting\n bold: boolean\n italic: boolean\n underline: boolean\n strikethrough: boolean\n subscript: boolean\n superscript: boolean\n code: boolean\n codeBlock: boolean\n codeHighlighting: boolean\n\n // Font styling\n fontFamily: boolean\n fontSize: boolean\n textColor: boolean\n backgroundColor: boolean\n lineHeight: boolean\n\n // Alignment & Structure\n textAlign: boolean\n indent: boolean\n headings: boolean\n blockquote: boolean\n horizontalRule: boolean\n\n // Lists\n bulletList: boolean\n orderedList: boolean\n nestedLists: boolean\n\n // Links & Media\n links: boolean\n images: boolean\n videos: boolean\n embeds: boolean\n\n // Tables\n tables: boolean\n tableResize: boolean\n\n // Advanced\n emoji: boolean\n mentions: boolean\n hashtags: boolean\n markdown: boolean\n\n // UI\n fullscreen: boolean\n print: boolean\n characterCount: boolean\n\n // History\n undoRedo: boolean\n\n // Collaboration\n collaboration: boolean\n comments: boolean\n}\n\n/** Default feature set - all false */\nexport const DEFAULT_FEATURES: EditorFeatures = {\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false,\n subscript: false,\n superscript: false,\n code: false,\n codeBlock: false,\n codeHighlighting: false,\n fontFamily: false,\n fontSize: false,\n textColor: false,\n backgroundColor: false,\n lineHeight: false,\n textAlign: false,\n indent: false,\n headings: false,\n blockquote: false,\n horizontalRule: false,\n bulletList: false,\n orderedList: false,\n nestedLists: false,\n links: false,\n images: false,\n videos: false,\n embeds: false,\n tables: false,\n tableResize: false,\n emoji: false,\n mentions: false,\n hashtags: false,\n markdown: false,\n fullscreen: false,\n print: false,\n characterCount: false,\n undoRedo: false,\n collaboration: false,\n comments: false,\n}\n","/**\n * TipTap Editor Adapter\n *\n * This adapter wraps the TipTap editor to conform to the unified editor interface.\n */\n\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\nimport { DEFAULT_FEATURES } from \"../../core/types\";\n\n// Check if TipTap is available\nfunction checkTipTapAvailable(): boolean {\n try {\n require(\"@tiptap/react\");\n return true;\n } catch {\n return false;\n }\n}\n\n// TipTap features\nconst TIPTAP_FEATURES: EditorFeatures = {\n ...DEFAULT_FEATURES,\n // Text formatting\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n subscript: true,\n superscript: true,\n code: true,\n codeBlock: true,\n codeHighlighting: true,\n // Font styling\n fontFamily: true,\n fontSize: true,\n textColor: true,\n backgroundColor: true,\n lineHeight: true,\n // Alignment & Structure\n textAlign: true,\n indent: true,\n headings: true,\n blockquote: true,\n horizontalRule: true,\n // Lists\n bulletList: true,\n orderedList: true,\n nestedLists: true,\n // Links & Media\n links: true,\n images: true,\n videos: true,\n embeds: false,\n // Tables\n tables: true,\n tableResize: true,\n // Advanced\n emoji: true,\n mentions: false, // Can be added with extension\n hashtags: false, // Can be added with extension\n markdown: false, // Can be added with extension\n // UI\n fullscreen: true,\n print: true,\n characterCount: true,\n // History\n undoRedo: true,\n // Collaboration\n collaboration: false, // Requires Y.js integration\n comments: false,\n};\n\n/**\n * TipTap Editor Adapter\n */\nexport const TipTapAdapter: EditorAdapter = {\n type: \"tiptap\",\n name: \"TipTap\",\n description:\n \"A headless, framework-agnostic rich text editor built on ProseMirror. Highly customizable with excellent TypeScript support.\",\n\n isAvailable: checkTipTapAvailable,\n\n getComponent: () => {\n // Dynamic import to avoid bundling if not used\n const { TipTapEditorComponent } = require(\"./TipTapEditorComponent\");\n return TipTapEditorComponent;\n },\n\n getSupportedFeatures: () => TIPTAP_FEATURES,\n};\n\nexport default TipTapAdapter;\n","/**\n * TipTap Adapter Exports\n */\n\nexport { TipTapAdapter, default } from './TipTapAdapter'\nexport { TipTapEditorComponent } from './TipTapEditorComponent'\nexport { TipTapToolbar } from './TipTapToolbar'\n","/**\n * Slate.js Editor Adapter\n *\n * This adapter wraps the Slate.js editor to conform to the unified editor interface.\n * Slate is a completely customizable framework for building rich text editors.\n */\n\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\nimport { DEFAULT_FEATURES } from \"../../core/types\";\n\n// Check if Slate is available\nfunction checkSlateAvailable(): boolean {\n try {\n require(\"slate\");\n require(\"slate-react\");\n return true;\n } catch {\n return false;\n }\n}\n\n// Slate.js features\nconst SLATE_FEATURES: EditorFeatures = {\n ...DEFAULT_FEATURES,\n // Text formatting\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n subscript: true,\n superscript: true,\n code: true,\n codeBlock: true,\n codeHighlighting: true,\n // Font styling\n fontFamily: true,\n fontSize: true,\n textColor: true,\n backgroundColor: true,\n lineHeight: true,\n // Alignment & Structure\n textAlign: true,\n indent: true,\n headings: true,\n blockquote: true,\n horizontalRule: true,\n // Lists\n bulletList: true,\n orderedList: true,\n nestedLists: true,\n // Links & Media\n links: true,\n images: true,\n videos: true,\n embeds: true,\n // Tables\n tables: true,\n tableResize: false, // Requires custom implementation\n // Advanced\n emoji: true,\n mentions: true, // Slate has good mention support\n hashtags: true,\n markdown: true, // Can be added with plugins\n // UI\n fullscreen: true,\n print: true,\n characterCount: true,\n // History\n undoRedo: true,\n // Collaboration\n collaboration: false, // Can be added with plugins\n comments: false,\n};\n\n/**\n * Slate.js Editor Adapter\n */\nexport const SlateAdapter: EditorAdapter = {\n type: \"slate\",\n name: \"Slate.js\",\n description:\n \"A completely customizable framework for building rich text editors. Provides full control over rendering and behavior.\",\n\n isAvailable: checkSlateAvailable,\n\n getComponent: () => {\n // Dynamic import to avoid bundling if not used\n const { SlateEditorComponent } = require(\"./SlateEditorComponent\");\n return SlateEditorComponent;\n },\n\n getSupportedFeatures: () => SLATE_FEATURES,\n};\n\nexport default SlateAdapter;\n","/**\n * Lexical Editor Adapter\n *\n * This adapter wraps Meta's Lexical editor to conform to the unified editor interface.\n * Lexical is a modern, extensible text editor framework with excellent performance.\n */\n\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\nimport { DEFAULT_FEATURES } from \"../../core/types\";\n\n// Check if Lexical is available\nfunction checkLexicalAvailable(): boolean {\n try {\n require(\"lexical\");\n require(\"@lexical/react/LexicalComposer\");\n return true;\n } catch {\n return false;\n }\n}\n\n// Lexical features\nconst LEXICAL_FEATURES: EditorFeatures = {\n ...DEFAULT_FEATURES,\n // Text formatting\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n subscript: true,\n superscript: true,\n code: true,\n codeBlock: true,\n codeHighlighting: true,\n // Font styling\n fontFamily: true,\n fontSize: true,\n textColor: true,\n backgroundColor: true,\n lineHeight: false, // Requires custom plugin\n // Alignment & Structure\n textAlign: true,\n indent: true,\n headings: true,\n blockquote: true,\n horizontalRule: true,\n // Lists\n bulletList: true,\n orderedList: true,\n nestedLists: true,\n // Links & Media\n links: true,\n images: true,\n videos: true,\n embeds: true,\n // Tables\n tables: true,\n tableResize: false, // Requires custom implementation\n // Advanced\n emoji: true,\n mentions: true, // Excellent mention support\n hashtags: true,\n markdown: true, // Native markdown support\n // UI\n fullscreen: true,\n print: true,\n characterCount: true,\n // History\n undoRedo: true,\n // Collaboration\n collaboration: true, // Built-in Yjs support\n comments: false,\n};\n\n/**\n * Lexical Editor Adapter\n */\nexport const LexicalAdapter: EditorAdapter = {\n type: \"lexical\",\n name: \"Lexical\",\n description:\n \"Meta's modern, extensible text editor framework with excellent performance and built-in collaboration support.\",\n\n isAvailable: checkLexicalAvailable,\n\n getComponent: () => {\n // Dynamic import to avoid bundling if not used\n const { LexicalEditorComponent } = require(\"./LexicalEditorComponent\");\n return LexicalEditorComponent;\n },\n\n getSupportedFeatures: () => LEXICAL_FEATURES,\n};\n\nexport default LexicalAdapter;\n","import { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport { Document } from \"@tiptap/extension-document\";\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\nimport { Text } from \"@tiptap/extension-text\";\nimport { Bold } from \"@tiptap/extension-bold\";\nimport { Italic } from \"@tiptap/extension-italic\";\nimport { Underline } from \"@tiptap/extension-underline\";\nimport { Strike } from \"@tiptap/extension-strike\";\nimport { Code } from \"@tiptap/extension-code\";\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { FontFamily } from \"@tiptap/extension-font-family\";\nimport { Color } from \"@tiptap/extension-color\";\nimport { Highlight } from \"@tiptap/extension-highlight\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { Heading } from \"@tiptap/extension-heading\";\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\nimport { ListItem } from \"@tiptap/extension-list-item\";\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\nimport { Link } from \"@tiptap/extension-link\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport { History } from \"@tiptap/extension-history\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\n\n// Lowlight for syntax highlighting\nimport { common, createLowlight } from \"lowlight\";\n\n// Custom extensions\nimport { FontSize } from \"../extensions/FontSize\";\nimport { LineHeight } from \"../extensions/LineHeight\";\nimport { Video } from \"../extensions/Video\";\nimport { Emoji } from \"../extensions/Emoji\";\nimport { Fullscreen } from \"../extensions/Fullscreen\";\nimport { Print } from \"../extensions/Print\";\nimport { Indent } from \"../extensions/Indent\";\n\n// Components\nimport { Toolbar } from \"./Toolbar\";\n\n// Types\nimport type { EditorProps, EditorRef, ToolbarButton } from \"../types\";\n\n// Create lowlight instance\nconst lowlight = createLowlight(common);\n\n// Toolbar presets\nconst toolbarPresets: Record<\"full\" | \"medium\" | \"simple\", ToolbarButton[]> = {\n full: [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"separator\",\n \"subscript\",\n \"superscript\",\n \"clearFormatting\",\n \"separator\",\n \"fontFamily\",\n \"fontSize\",\n \"lineHeight\",\n \"textColor\",\n \"backgroundColor\",\n \"separator\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\n \"alignJustify\",\n \"separator\",\n \"indent\",\n \"outdent\",\n \"separator\",\n \"bulletList\",\n \"orderedList\",\n \"separator\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"blockquote\",\n \"separator\",\n \"link\",\n \"unlink\",\n \"image\",\n \"video\",\n \"table\",\n \"emoji\",\n \"separator\",\n \"codeBlock\",\n \"horizontalRule\",\n \"separator\",\n \"undo\",\n \"redo\",\n \"separator\",\n \"fullscreen\",\n \"print\",\n ],\n medium: [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"separator\",\n \"fontFamily\",\n \"fontSize\",\n \"textColor\",\n \"backgroundColor\",\n \"separator\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\n \"separator\",\n \"bulletList\",\n \"orderedList\",\n \"separator\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"separator\",\n \"link\",\n \"image\",\n \"table\",\n \"emoji\",\n \"separator\",\n \"undo\",\n \"redo\",\n \"fullscreen\",\n ],\n simple: [\n \"bold\",\n \"italic\",\n \"underline\",\n \"separator\",\n \"bulletList\",\n \"orderedList\",\n \"separator\",\n \"link\",\n \"image\",\n \"separator\",\n \"undo\",\n \"redo\",\n ],\n};\n\nexport const RichTextEditor = forwardRef<EditorRef, EditorProps>(\n (\n {\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n placeholder = \"Start typing...\",\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarPreset = \"full\",\n toolbarButtons,\n className = \"\",\n config = {},\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = \"javascript\",\n },\n ref,\n ) => {\n // Determine which toolbar buttons to use\n const activeToolbarButtons =\n toolbarButtons || toolbarPresets[toolbarPreset];\n\n // Initialize editor\n const editor = useEditor({\n extensions: [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n enableCodeHighlight\n ? CodeBlockLowlight.configure({\n lowlight,\n defaultLanguage: defaultCodeLanguage,\n })\n : CodeBlockLowlight.configure({\n lowlight: null as any,\n }),\n Subscript,\n Superscript,\n TextStyle,\n FontFamily,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n LineHeight,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Heading.configure({\n levels: [1, 2, 3, 4, 5, 6],\n }),\n BulletList,\n OrderedList,\n ListItem,\n Blockquote,\n HorizontalRule,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Image.configure({\n inline: false,\n allowBase64: true,\n }),\n Video,\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableCell,\n TableHeader,\n History,\n Placeholder.configure({\n placeholder,\n }),\n CharacterCount.configure({\n limit: charCounterMax > 0 ? charCounterMax : undefined,\n }),\n Gapcursor,\n Dropcursor,\n HardBreak,\n // New extensions\n Emoji,\n Fullscreen,\n Print,\n Indent,\n ],\n content: value,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n onChange?.(html);\n },\n onBlur: () => {\n onBlur?.();\n },\n onFocus: () => {\n onFocus?.();\n },\n editorProps: {\n attributes: {\n class: \"rte-builder-content\",\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\n },\n },\n ...config,\n });\n\n // Update content when value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n // Update editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!disabled && !readOnly);\n }\n }, [disabled, readOnly, editor]);\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage && editor) {\n const file = await onMediaPickerImage();\n if (file) {\n editor\n .chain()\n .focus()\n .setImage({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerImage, editor]);\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo && editor) {\n const file = await onMediaPickerVideo();\n if (file) {\n editor\n .chain()\n .focus()\n .setVideo({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerVideo, editor]);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => {\n return editor?.getHTML() || \"\";\n },\n setContent: (html: string) => {\n editor?.commands.setContent(html);\n },\n focus: () => {\n editor?.commands.focus();\n },\n getEditor: () => {\n return editor;\n },\n insertHTML: (html: string) => {\n editor?.commands.insertContent(html);\n },\n clear: () => {\n editor?.commands.clearContent();\n },\n isFullscreen: () => {\n return editor?.storage.fullscreen?.isFullscreen || false;\n },\n toggleFullscreen: () => {\n editor?.commands.toggleFullscreen();\n },\n print: () => {\n editor?.commands.print();\n },\n }));\n\n if (!editor) {\n return null;\n }\n\n const characterCount = editor.storage.characterCount.characters();\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\n\n return (\n <div\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\n >\n <Toolbar\n editor={editor}\n buttons={activeToolbarButtons}\n onMediaPickerImage={\n onMediaPickerImage ? handleMediaPickerImage : undefined\n }\n onMediaPickerVideo={\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\n }\n />\n <div\n className=\"rte-builder-container\"\n style={{ height: `${height}px` }}\n >\n <EditorContent editor={editor} />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\">\n {\" \"}\n (limit exceeded)\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nRichTextEditor.displayName = \"RichTextEditor\";\n","import React, { useState, useRef, useEffect } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport type { ToolbarButton } from \"../types\";\nimport { EMOJI_CATEGORIES } from \"../extensions/Emoji\";\n\ninterface ToolbarProps {\n editor: Editor | null;\n buttons: ToolbarButton[];\n onMediaPickerImage?: () => void;\n onMediaPickerVideo?: () => void;\n}\n\nconst FONT_FAMILIES = [\n { value: \"Arial\", label: \"Arial\" },\n { value: \"Georgia\", label: \"Georgia\" },\n { value: \"Times New Roman\", label: \"Times New Roman\" },\n { value: \"Courier New\", label: \"Courier New\" },\n { value: \"Verdana\", label: \"Verdana\" },\n { value: \"Roboto\", label: \"Roboto\" },\n { value: \"Open Sans\", label: \"Open Sans\" },\n { value: \"Lato\", label: \"Lato\" },\n { value: \"Montserrat\", label: \"Montserrat\" },\n { value: \"Poppins\", label: \"Poppins\" },\n];\n\nconst FONT_SIZES = [\n \"8px\",\n \"10px\",\n \"12px\",\n \"14px\",\n \"16px\",\n \"18px\",\n \"20px\",\n \"24px\",\n \"30px\",\n \"36px\",\n \"48px\",\n \"60px\",\n \"72px\",\n];\n\nconst LINE_HEIGHTS = [\n { value: \"1\", label: \"Single\" },\n { value: \"1.15\", label: \"1.15\" },\n { value: \"1.5\", label: \"1.5\" },\n { value: \"1.75\", label: \"1.75\" },\n { value: \"2\", label: \"Double\" },\n { value: \"2.5\", label: \"2.5\" },\n { value: \"3\", label: \"Triple\" },\n];\n\nconst CODE_LANGUAGES = [\n { value: \"javascript\", label: \"JavaScript\" },\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"python\", label: \"Python\" },\n { value: \"java\", label: \"Java\" },\n { value: \"cpp\", label: \"C++\" },\n { value: \"csharp\", label: \"C#\" },\n { value: \"php\", label: \"PHP\" },\n { value: \"ruby\", label: \"Ruby\" },\n { value: \"go\", label: \"Go\" },\n { value: \"rust\", label: \"Rust\" },\n { value: \"html\", label: \"HTML\" },\n { value: \"css\", label: \"CSS\" },\n { value: \"sql\", label: \"SQL\" },\n { value: \"bash\", label: \"Bash\" },\n { value: \"json\", label: \"JSON\" },\n { value: \"yaml\", label: \"YAML\" },\n { value: \"markdown\", label: \"Markdown\" },\n { value: \"xml\", label: \"XML\" },\n];\n\n// Emoji Picker Popover Component\nconst EmojiPicker: React.FC<{\n onSelect: (emoji: string) => void;\n onClose: () => void;\n}> = ({ onSelect, onClose }) => {\n const [activeCategory, setActiveCategory] =\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [onClose]);\n\n return (\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n type=\"button\"\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\n onClick={() =>\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\n }\n title={category.label}\n >\n {category.emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\n <button\n key={`${emoji}-${i}`}\n type=\"button\"\n className=\"rte-builder-emoji-btn\"\n onClick={() => {\n onSelect(emoji);\n onClose();\n }}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n );\n};\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n editor,\n buttons,\n onMediaPickerImage,\n onMediaPickerVideo,\n}) => {\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\n\n if (!editor) return null;\n\n const ToolbarButton = ({\n onClick,\n active = false,\n disabled = false,\n children,\n title,\n buttonRef,\n }: {\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n title?: string;\n buttonRef?: React.RefObject<HTMLButtonElement>;\n }) => (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\n >\n {children}\n </button>\n );\n\n const renderButton = (button: ToolbarButton, index: number) => {\n switch (button) {\n case \"bold\":\n return (\n <ToolbarButton\n key=\"bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={editor.isActive(\"bold\")}\n title=\"Bold (Ctrl+B)\"\n >\n <strong>B</strong>\n </ToolbarButton>\n );\n\n case \"italic\":\n return (\n <ToolbarButton\n key=\"italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={editor.isActive(\"italic\")}\n title=\"Italic (Ctrl+I)\"\n >\n <em>I</em>\n </ToolbarButton>\n );\n\n case \"underline\":\n return (\n <ToolbarButton\n key=\"underline\"\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive(\"underline\")}\n title=\"Underline (Ctrl+U)\"\n >\n <u>U</u>\n </ToolbarButton>\n );\n\n case \"strike\":\n return (\n <ToolbarButton\n key=\"strike\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={editor.isActive(\"strike\")}\n title=\"Strikethrough\"\n >\n <s>S</s>\n </ToolbarButton>\n );\n\n case \"code\":\n return (\n <ToolbarButton\n key=\"code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n active={editor.isActive(\"code\")}\n title=\"Inline Code\"\n >\n {\"</>\"}\n </ToolbarButton>\n );\n\n case \"codeBlock\":\n return (\n <ToolbarButton\n key=\"codeBlock\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n active={editor.isActive(\"codeBlock\")}\n title=\"Code Block\"\n >\n {\"{ }\"}\n </ToolbarButton>\n );\n\n case \"subscript\":\n return (\n <ToolbarButton\n key=\"subscript\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={editor.isActive(\"subscript\")}\n title=\"Subscript\"\n >\n X<sub>2</sub>\n </ToolbarButton>\n );\n\n case \"superscript\":\n return (\n <ToolbarButton\n key=\"superscript\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={editor.isActive(\"superscript\")}\n title=\"Superscript\"\n >\n X<sup>2</sup>\n </ToolbarButton>\n );\n\n case \"clearFormatting\":\n return (\n <ToolbarButton\n key=\"clearFormatting\"\n onClick={() =>\n editor.chain().focus().clearNodes().unsetAllMarks().run()\n }\n title=\"Clear Formatting\"\n >\n โœ•\n </ToolbarButton>\n );\n\n case \"fontFamily\":\n return (\n <select\n key=\"fontFamily\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetFontFamily().run();\n } else {\n editor.chain().focus().setFontFamily(e.target.value).run();\n }\n }}\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\n >\n <option value=\"default\">Font Family</option>\n {FONT_FAMILIES.map((font) => (\n <option key={font.value} value={font.value}>\n {font.label}\n </option>\n ))}\n </select>\n );\n\n case \"fontSize\":\n return (\n <select\n key=\"fontSize\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetFontSize().run();\n } else {\n editor.chain().focus().setFontSize(e.target.value).run();\n }\n }}\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\n >\n <option value=\"default\">Font Size</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n );\n\n case \"lineHeight\":\n return (\n <select\n key=\"lineHeight\"\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetLineHeight().run();\n } else {\n editor.chain().focus().setLineHeight(e.target.value).run();\n }\n }}\n value={\n editor.getAttributes(\"paragraph\").lineHeight ||\n editor.getAttributes(\"heading\").lineHeight ||\n \"default\"\n }\n title=\"Line Height\"\n >\n <option value=\"default\">Line Height</option>\n {LINE_HEIGHTS.map((lh) => (\n <option key={lh.value} value={lh.value}>\n {lh.label}\n </option>\n ))}\n </select>\n );\n\n case \"textColor\":\n return (\n <span key=\"textColor\" className=\"rte-builder-toolbar-color\">\n <label title=\"Text Color\">\n A\n <input\n type=\"color\"\n onChange={(e) =>\n editor.chain().focus().setColor(e.target.value).run()\n }\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\n />\n </label>\n </span>\n );\n\n case \"backgroundColor\":\n return (\n <span key=\"backgroundColor\" className=\"rte-builder-toolbar-color\">\n <label title=\"Background Color\">\n โฌ›\n <input\n type=\"color\"\n onChange={(e) =>\n editor\n .chain()\n .focus()\n .toggleHighlight({ color: e.target.value })\n .run()\n }\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\n />\n </label>\n </span>\n );\n\n case \"alignLeft\":\n return (\n <ToolbarButton\n key=\"alignLeft\"\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\n active={editor.isActive({ textAlign: \"left\" })}\n title=\"Align Left\"\n >\n โฌ…\n </ToolbarButton>\n );\n\n case \"alignCenter\":\n return (\n <ToolbarButton\n key=\"alignCenter\"\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\n active={editor.isActive({ textAlign: \"center\" })}\n title=\"Align Center\"\n >\n โ†”\n </ToolbarButton>\n );\n\n case \"alignRight\":\n return (\n <ToolbarButton\n key=\"alignRight\"\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\n active={editor.isActive({ textAlign: \"right\" })}\n title=\"Align Right\"\n >\n โžก\n </ToolbarButton>\n );\n\n case \"alignJustify\":\n return (\n <ToolbarButton\n key=\"alignJustify\"\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\n active={editor.isActive({ textAlign: \"justify\" })}\n title=\"Justify\"\n >\n โฌŒ\n </ToolbarButton>\n );\n\n case \"indent\":\n return (\n <ToolbarButton\n key=\"indent\"\n onClick={() => editor.chain().focus().indent().run()}\n title=\"Indent (Tab)\"\n >\n โ†’|\n </ToolbarButton>\n );\n\n case \"outdent\":\n return (\n <ToolbarButton\n key=\"outdent\"\n onClick={() => editor.chain().focus().outdent().run()}\n title=\"Outdent (Shift+Tab)\"\n >\n |โ†\n </ToolbarButton>\n );\n\n case \"bulletList\":\n return (\n <ToolbarButton\n key=\"bulletList\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n โ€ข\n </ToolbarButton>\n );\n\n case \"orderedList\":\n return (\n <ToolbarButton\n key=\"orderedList\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n 1.\n </ToolbarButton>\n );\n\n case \"heading1\":\n case \"heading2\":\n case \"heading3\":\n case \"heading4\":\n case \"heading5\":\n case \"heading6\":\n const level = parseInt(button.replace(\"heading\", \"\")) as\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6;\n return (\n <ToolbarButton\n key={button}\n onClick={() =>\n editor.chain().focus().toggleHeading({ level }).run()\n }\n active={editor.isActive(\"heading\", { level })}\n title={`Heading ${level}`}\n >\n H{level}\n </ToolbarButton>\n );\n\n case \"blockquote\":\n return (\n <ToolbarButton\n key=\"blockquote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={editor.isActive(\"blockquote\")}\n title=\"Blockquote\"\n >\n \"\n </ToolbarButton>\n );\n\n case \"horizontalRule\":\n return (\n <ToolbarButton\n key=\"horizontalRule\"\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title=\"Horizontal Rule\"\n >\n โ€•\n </ToolbarButton>\n );\n\n case \"link\":\n return (\n <ToolbarButton\n key=\"link\"\n onClick={() => {\n const url = window.prompt(\"Enter URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n active={editor.isActive(\"link\")}\n title=\"Insert Link\"\n >\n ๐Ÿ”—\n </ToolbarButton>\n );\n\n case \"unlink\":\n return (\n <ToolbarButton\n key=\"unlink\"\n onClick={() => editor.chain().focus().unsetLink().run()}\n disabled={!editor.isActive(\"link\")}\n title=\"Remove Link\"\n >\n ๐Ÿ”—โœ•\n </ToolbarButton>\n );\n\n case \"image\":\n return (\n <ToolbarButton\n key=\"image\"\n onClick={() => {\n if (onMediaPickerImage) {\n onMediaPickerImage();\n } else {\n const url = window.prompt(\"Enter image URL:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }\n }}\n title=\"Insert Image\"\n >\n ๐Ÿ–ผ๏ธ\n </ToolbarButton>\n );\n\n case \"video\":\n return (\n <ToolbarButton\n key=\"video\"\n onClick={() => {\n if (onMediaPickerVideo) {\n onMediaPickerVideo();\n } else {\n const url = window.prompt(\"Enter video URL:\");\n if (url) {\n editor.chain().focus().setVideo({ src: url }).run();\n }\n }\n }}\n title=\"Insert Video\"\n >\n ๐ŸŽฅ\n </ToolbarButton>\n );\n\n case \"table\":\n return (\n <ToolbarButton\n key=\"table\"\n onClick={() =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run()\n }\n title=\"Insert Table\"\n >\n โŠž\n </ToolbarButton>\n );\n\n case \"emoji\":\n return (\n <span key=\"emoji\" style={{ position: \"relative\" }}>\n <ToolbarButton\n buttonRef={emojiButtonRef}\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n active={showEmojiPicker}\n title=\"Insert Emoji\"\n >\n ๐Ÿ˜€\n </ToolbarButton>\n {showEmojiPicker && (\n <EmojiPicker\n onSelect={(emoji) =>\n editor.chain().focus().insertEmoji(emoji).run()\n }\n onClose={() => setShowEmojiPicker(false)}\n />\n )}\n </span>\n );\n\n case \"fullscreen\":\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\n return (\n <ToolbarButton\n key=\"fullscreen\"\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\n active={isFullscreen}\n title={\n isFullscreen\n ? \"Exit Fullscreen (Esc)\"\n : \"Fullscreen (Ctrl+Shift+F)\"\n }\n >\n {isFullscreen ? \"โŠ—\" : \"โ›ถ\"}\n </ToolbarButton>\n );\n\n case \"print\":\n return (\n <ToolbarButton\n key=\"print\"\n onClick={() => editor.chain().focus().print().run()}\n title=\"Print (Ctrl+P)\"\n >\n ๐Ÿ–จ๏ธ\n </ToolbarButton>\n );\n\n case \"undo\":\n return (\n <ToolbarButton\n key=\"undo\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo (Ctrl+Z)\"\n >\n โ†ถ\n </ToolbarButton>\n );\n\n case \"redo\":\n return (\n <ToolbarButton\n key=\"redo\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo (Ctrl+Y)\"\n >\n โ†ท\n </ToolbarButton>\n );\n\n case \"separator\":\n return (\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n );\n\n default:\n return null;\n }\n };\n\n return <div className=\"rte-builder-toolbar\">{buttons.map(renderButton)}</div>;\n};\n","/**\n * Collaboration Context\n * Provides real-time collaboration state and methods to child components\n */\n\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\nimport type {\n CollaborationState,\n CollaborationConfig,\n CollaborationUser,\n CollaborationStatus,\n CollaborationEvent,\n CursorPosition,\n} from './types'\n\n/** Actions for collaboration reducer */\ntype CollaborationAction =\n | { type: 'SET_STATUS'; status: CollaborationStatus }\n | { type: 'SET_USERS'; users: CollaborationUser[] }\n | { type: 'ADD_USER'; user: CollaborationUser }\n | { type: 'REMOVE_USER'; userId: string }\n | { type: 'UPDATE_CURSOR'; userId: string; cursor: CursorPosition }\n | { type: 'SET_ERROR'; error: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'SET_HOST'; isHost: boolean }\n\n/** Initial collaboration state */\nconst initialState: CollaborationState = {\n status: 'disconnected',\n users: [],\n error: undefined,\n isHost: false,\n}\n\n/** Collaboration reducer */\nfunction collaborationReducer(state: CollaborationState, action: CollaborationAction): CollaborationState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, status: action.status, error: action.status === 'error' ? state.error : undefined }\n case 'SET_USERS':\n return { ...state, users: action.users }\n case 'ADD_USER':\n if (state.users.find(u => u.id === action.user.id)) {\n return {\n ...state,\n users: state.users.map(u => u.id === action.user.id ? action.user : u),\n }\n }\n return { ...state, users: [...state.users, action.user] }\n case 'REMOVE_USER':\n return { ...state, users: state.users.filter(u => u.id !== action.userId) }\n case 'UPDATE_CURSOR':\n return {\n ...state,\n users: state.users.map(u =>\n u.id === action.userId ? { ...u, cursor: action.cursor, lastActive: Date.now() } : u\n ),\n }\n case 'SET_ERROR':\n return { ...state, status: 'error', error: action.error }\n case 'CLEAR_ERROR':\n return { ...state, error: undefined }\n case 'SET_HOST':\n return { ...state, isHost: action.isHost }\n default:\n return state\n }\n}\n\n/** Context value type */\ninterface CollaborationContextValue {\n state: CollaborationState\n config: CollaborationConfig | null\n connect: () => Promise<void>\n disconnect: () => void\n updateCursor: (cursor: CursorPosition) => void\n isEnabled: boolean\n}\n\n/** Create context */\nconst CollaborationContext = createContext<CollaborationContextValue | null>(null)\n\n/** Provider props */\ninterface CollaborationProviderProps {\n children: ReactNode\n config?: CollaborationConfig\n onStatusChange?: (status: CollaborationStatus) => void\n onUsersChange?: (users: CollaborationUser[]) => void\n}\n\n/** Generate a random color for user */\nfunction generateUserColor(): string {\n const colors = [\n '#f87171', '#fb923c', '#fbbf24', '#a3e635', '#4ade80',\n '#2dd4bf', '#22d3ee', '#60a5fa', '#a78bfa', '#e879f9',\n ]\n return colors[Math.floor(Math.random() * colors.length)]\n}\n\n/** Collaboration Provider Component */\nexport function CollaborationProvider({\n children,\n config,\n onStatusChange,\n onUsersChange,\n}: CollaborationProviderProps) {\n const [state, dispatch] = useReducer(collaborationReducer, initialState)\n const wsRef = useRef<WebSocket | null>(null)\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const reconnectAttemptsRef = useRef(0)\n\n // Notify on status change\n useEffect(() => {\n onStatusChange?.(state.status)\n }, [state.status, onStatusChange])\n\n // Notify on users change\n useEffect(() => {\n onUsersChange?.(state.users)\n }, [state.users, onUsersChange])\n\n /** Connect to collaboration server */\n const connect = useCallback(async () => {\n if (!config) return\n\n dispatch({ type: 'SET_STATUS', status: 'connecting' })\n\n try {\n if (config.provider === 'websocket' && config.serverUrl) {\n const url = new URL(config.serverUrl)\n url.searchParams.set('room', config.roomId)\n if (config.token) {\n url.searchParams.set('token', config.token)\n }\n\n const ws = new WebSocket(url.toString())\n wsRef.current = ws\n\n ws.onopen = () => {\n dispatch({ type: 'SET_STATUS', status: 'connected' })\n reconnectAttemptsRef.current = 0\n\n // Send join message\n ws.send(JSON.stringify({\n type: 'join',\n user: {\n id: config.user.id,\n name: config.user.name,\n avatar: config.user.avatar,\n color: config.user.color || generateUserColor(),\n },\n }))\n }\n\n ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as CollaborationEvent\n handleCollaborationEvent(message)\n } catch {\n console.error('Failed to parse collaboration message')\n }\n }\n\n ws.onclose = () => {\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\n handleReconnect()\n }\n\n ws.onerror = () => {\n dispatch({ type: 'SET_ERROR', error: 'Connection error' })\n }\n } else if (config.provider === 'webrtc') {\n // WebRTC implementation would go here\n dispatch({ type: 'SET_ERROR', error: 'WebRTC provider not yet implemented' })\n } else if (config.provider === 'custom') {\n // Custom provider - user handles connection\n dispatch({ type: 'SET_STATUS', status: 'connected' })\n }\n } catch (error) {\n dispatch({ type: 'SET_ERROR', error: error instanceof Error ? error.message : 'Connection failed' })\n }\n }, [config])\n\n /** Handle collaboration events */\n const handleCollaborationEvent = useCallback((event: CollaborationEvent) => {\n switch (event.type) {\n case 'user-joined':\n dispatch({ type: 'ADD_USER', user: event.user })\n break\n case 'user-left':\n dispatch({ type: 'REMOVE_USER', userId: event.userId })\n break\n case 'cursor-moved':\n dispatch({ type: 'UPDATE_CURSOR', userId: event.userId, cursor: event.cursor })\n break\n case 'status-changed':\n dispatch({ type: 'SET_STATUS', status: event.status })\n break\n case 'error':\n dispatch({ type: 'SET_ERROR', error: event.message })\n break\n }\n }, [])\n\n /** Handle reconnection */\n const handleReconnect = useCallback(() => {\n if (!config?.autoReconnect) return\n\n const maxAttempts = config.maxReconnectAttempts ?? 5\n const interval = config.reconnectInterval ?? 3000\n\n if (reconnectAttemptsRef.current >= maxAttempts) {\n dispatch({ type: 'SET_ERROR', error: 'Max reconnection attempts reached' })\n return\n }\n\n dispatch({ type: 'SET_STATUS', status: 'reconnecting' })\n reconnectAttemptsRef.current++\n\n reconnectTimeoutRef.current = setTimeout(() => {\n connect()\n }, interval)\n }, [config, connect])\n\n /** Disconnect from collaboration server */\n const disconnect = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current)\n }\n\n if (wsRef.current) {\n wsRef.current.close()\n wsRef.current = null\n }\n\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\n dispatch({ type: 'SET_USERS', users: [] })\n }, [])\n\n /** Update cursor position */\n const updateCursor = useCallback((cursor: CursorPosition) => {\n if (!config || !wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) return\n\n wsRef.current.send(JSON.stringify({\n type: 'cursor',\n userId: config.user.id,\n cursor,\n }))\n }, [config])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n disconnect()\n }\n }, [disconnect])\n\n const value: CollaborationContextValue = {\n state,\n config: config ?? null,\n connect,\n disconnect,\n updateCursor,\n isEnabled: !!config,\n }\n\n return (\n <CollaborationContext.Provider value={value}>\n {children}\n </CollaborationContext.Provider>\n )\n}\n\n/** Hook to use collaboration context */\nexport function useCollaboration() {\n const context = useContext(CollaborationContext)\n if (!context) {\n throw new Error('useCollaboration must be used within a CollaborationProvider')\n }\n return context\n}\n\n/** Hook to check if collaboration is available (doesn't throw) */\nexport function useCollaborationOptional() {\n return useContext(CollaborationContext)\n}\n\nexport default CollaborationContext\n","/**\n * Presence Indicator Component\n * Shows connected users with avatars and status\n */\n\nimport { useCollaborationOptional } from './CollaborationContext'\nimport type { CollaborationUser } from './types'\n\ninterface PresenceIndicatorProps {\n /** Maximum avatars to show before \"+N\" */\n maxAvatars?: number\n /** Show user names on hover */\n showNames?: boolean\n /** Custom class name */\n className?: string\n}\n\n/** Get initials from name */\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map(n => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n}\n\n/** Single user avatar */\nfunction UserAvatar({ user, showName }: { user: CollaborationUser; showName?: boolean }) {\n return (\n <div\n className=\"rte-presence-avatar\"\n style={{ borderColor: user.color }}\n title={user.name}\n >\n {user.avatar ? (\n <img src={user.avatar} alt={user.name} />\n ) : (\n <span style={{ backgroundColor: user.color }}>\n {getInitials(user.name)}\n </span>\n )}\n {user.isActive && <div className=\"rte-presence-active-dot\" />}\n {showName && <div className=\"rte-presence-name\">{user.name}</div>}\n </div>\n )\n}\n\n/** Connection status badge */\nfunction StatusBadge({ status }: { status: string }) {\n const statusConfig: Record<string, { label: string; color: string }> = {\n connected: { label: 'Connected', color: '#22c55e' },\n connecting: { label: 'Connecting...', color: '#eab308' },\n reconnecting: { label: 'Reconnecting...', color: '#f97316' },\n disconnected: { label: 'Disconnected', color: '#6b7280' },\n error: { label: 'Error', color: '#ef4444' },\n }\n\n const config = statusConfig[status] || statusConfig.disconnected\n\n return (\n <div className=\"rte-presence-status\" style={{ color: config.color }}>\n <div className=\"rte-presence-status-dot\" style={{ backgroundColor: config.color }} />\n {config.label}\n </div>\n )\n}\n\n/** Presence Indicator Component */\nexport function PresenceIndicator({\n maxAvatars = 5,\n showNames = false,\n className = '',\n}: PresenceIndicatorProps) {\n const collaboration = useCollaborationOptional()\n\n if (!collaboration?.isEnabled) {\n return null\n }\n\n const { state } = collaboration\n const visibleUsers = state.users.slice(0, maxAvatars)\n const remainingCount = Math.max(0, state.users.length - maxAvatars)\n\n return (\n <div className={`rte-presence-indicator ${className}`}>\n <StatusBadge status={state.status} />\n\n {state.users.length > 0 && (\n <div className=\"rte-presence-avatars\">\n {visibleUsers.map(user => (\n <UserAvatar key={user.id} user={user} showName={showNames} />\n ))}\n {remainingCount > 0 && (\n <div className=\"rte-presence-avatar rte-presence-more\">\n +{remainingCount}\n </div>\n )}\n </div>\n )}\n\n {state.error && (\n <div className=\"rte-presence-error\" title={state.error}>\n !\n </div>\n )}\n </div>\n )\n}\n\nexport default PresenceIndicator\n","/**\n * Comments & Annotations Types\n * Types for inline comments and annotation features\n */\n\n/** Comment author information */\nexport interface CommentAuthor {\n /** Unique user identifier */\n id: string\n /** Display name */\n name: string\n /** Avatar URL (optional) */\n avatar?: string\n}\n\n/** Text range for comment anchor */\nexport interface CommentRange {\n /** Start position in document */\n from: number\n /** End position in document */\n to: number\n /** Selected text content */\n text: string\n}\n\n/** Single comment in a thread */\nexport interface Comment {\n /** Unique comment identifier */\n id: string\n /** Thread this comment belongs to */\n threadId: string\n /** Comment content (can be HTML) */\n content: string\n /** Comment author */\n author: CommentAuthor\n /** Creation timestamp */\n createdAt: number\n /** Last update timestamp */\n updatedAt?: number\n /** Is this comment edited */\n isEdited: boolean\n /** Reactions on this comment */\n reactions?: CommentReaction[]\n}\n\n/** Reaction on a comment */\nexport interface CommentReaction {\n /** Emoji reaction */\n emoji: string\n /** Users who reacted */\n users: CommentAuthor[]\n}\n\n/** Comment thread (group of comments on a text range) */\nexport interface CommentThread {\n /** Unique thread identifier */\n id: string\n /** Text range this thread is attached to */\n range: CommentRange\n /** Comments in this thread */\n comments: Comment[]\n /** Thread status */\n status: 'open' | 'resolved'\n /** Thread creation timestamp */\n createdAt: number\n /** Thread resolution timestamp */\n resolvedAt?: number\n /** User who resolved the thread */\n resolvedBy?: CommentAuthor\n}\n\n/** Comment highlight type */\nexport type CommentHighlightType = 'active' | 'hover' | 'resolved' | 'default'\n\n/** Comments state */\nexport interface CommentsState {\n /** All comment threads */\n threads: CommentThread[]\n /** Currently active/selected thread ID */\n activeThreadId: string | null\n /** Is comment panel open */\n isPanelOpen: boolean\n /** Filter for threads */\n filter: 'all' | 'open' | 'resolved'\n /** Current user (for adding comments) */\n currentUser: CommentAuthor | null\n}\n\n/** Comment event types */\nexport type CommentEvent =\n | { type: 'thread-created'; thread: CommentThread }\n | { type: 'thread-deleted'; threadId: string }\n | { type: 'thread-resolved'; threadId: string; resolvedBy: CommentAuthor }\n | { type: 'thread-reopened'; threadId: string }\n | { type: 'comment-added'; threadId: string; comment: Comment }\n | { type: 'comment-updated'; threadId: string; comment: Comment }\n | { type: 'comment-deleted'; threadId: string; commentId: string }\n | { type: 'reaction-added'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\n | { type: 'reaction-removed'; threadId: string; commentId: string; emoji: string; userId: string }\n\n/** Comments configuration */\nexport interface CommentsConfig {\n /** Current user for adding comments */\n currentUser: CommentAuthor\n /** Allow resolving threads */\n allowResolve?: boolean\n /** Allow deleting comments */\n allowDelete?: boolean\n /** Allow editing comments */\n allowEdit?: boolean\n /** Allow reactions */\n allowReactions?: boolean\n /** Available reaction emojis */\n reactionEmojis?: string[]\n /** Callback to persist comments */\n onSave?: (threads: CommentThread[]) => Promise<void>\n /** Callback to load comments */\n onLoad?: () => Promise<CommentThread[]>\n}\n\n/** Props for comments-enabled editor */\nexport interface CommentsProps {\n /** Enable comments features */\n comments?: CommentsConfig\n /** Initial comment threads */\n initialThreads?: CommentThread[]\n /** Callback when threads change */\n onThreadsChange?: (threads: CommentThread[]) => void\n /** Show comment highlights in editor */\n showCommentHighlights?: boolean\n /** Show comment panel */\n showCommentPanel?: boolean\n /** Comment panel position */\n commentPanelPosition?: 'left' | 'right'\n}\n\n/** Default reaction emojis */\nexport const DEFAULT_REACTION_EMOJIS = ['๐Ÿ‘', '๐Ÿ‘Ž', 'โค๏ธ', '๐ŸŽ‰', '๐Ÿ˜„', '๐Ÿ˜•', '๐Ÿ‘€', '๐Ÿš€']\n","/**\n * Comments Context\n * Provides comments and annotations state and methods to child components\n */\n\nimport { createContext, useContext, useReducer, useCallback, useEffect, ReactNode } from 'react'\nimport type {\n CommentsState,\n CommentsConfig,\n CommentThread,\n Comment,\n CommentAuthor,\n CommentRange,\n CommentEvent,\n} from './types'\nimport { DEFAULT_REACTION_EMOJIS } from './types'\n\n/** Actions for comments reducer */\ntype CommentsAction =\n | { type: 'SET_THREADS'; threads: CommentThread[] }\n | { type: 'ADD_THREAD'; thread: CommentThread }\n | { type: 'DELETE_THREAD'; threadId: string }\n | { type: 'RESOLVE_THREAD'; threadId: string; resolvedBy: CommentAuthor }\n | { type: 'REOPEN_THREAD'; threadId: string }\n | { type: 'ADD_COMMENT'; threadId: string; comment: Comment }\n | { type: 'UPDATE_COMMENT'; threadId: string; comment: Comment }\n | { type: 'DELETE_COMMENT'; threadId: string; commentId: string }\n | { type: 'ADD_REACTION'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\n | { type: 'REMOVE_REACTION'; threadId: string; commentId: string; emoji: string; userId: string }\n | { type: 'SET_ACTIVE_THREAD'; threadId: string | null }\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\n | { type: 'SET_FILTER'; filter: 'all' | 'open' | 'resolved' }\n | { type: 'SET_CURRENT_USER'; user: CommentAuthor | null }\n\n/** Initial comments state */\nconst initialState: CommentsState = {\n threads: [],\n activeThreadId: null,\n isPanelOpen: false,\n filter: 'all',\n currentUser: null,\n}\n\n/** Generate unique ID */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/** Comments reducer */\nfunction commentsReducer(state: CommentsState, action: CommentsAction): CommentsState {\n switch (action.type) {\n case 'SET_THREADS':\n return { ...state, threads: action.threads }\n\n case 'ADD_THREAD':\n return { ...state, threads: [...state.threads, action.thread] }\n\n case 'DELETE_THREAD':\n return {\n ...state,\n threads: state.threads.filter(t => t.id !== action.threadId),\n activeThreadId: state.activeThreadId === action.threadId ? null : state.activeThreadId,\n }\n\n case 'RESOLVE_THREAD':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, status: 'resolved' as const, resolvedAt: Date.now(), resolvedBy: action.resolvedBy }\n : t\n ),\n }\n\n case 'REOPEN_THREAD':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, status: 'open' as const, resolvedAt: undefined, resolvedBy: undefined }\n : t\n ),\n }\n\n case 'ADD_COMMENT':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, comments: [...t.comments, action.comment] }\n : t\n ),\n }\n\n case 'UPDATE_COMMENT':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? {\n ...t,\n comments: t.comments.map(c =>\n c.id === action.comment.id ? action.comment : c\n ),\n }\n : t\n ),\n }\n\n case 'DELETE_COMMENT':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, comments: t.comments.filter(c => c.id !== action.commentId) }\n : t\n ),\n }\n\n case 'ADD_REACTION':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? {\n ...t,\n comments: t.comments.map(c => {\n if (c.id !== action.commentId) return c\n const reactions = c.reactions || []\n const existingReaction = reactions.find(r => r.emoji === action.emoji)\n if (existingReaction) {\n return {\n ...c,\n reactions: reactions.map(r =>\n r.emoji === action.emoji\n ? { ...r, users: [...r.users, action.user] }\n : r\n ),\n }\n }\n return {\n ...c,\n reactions: [...reactions, { emoji: action.emoji, users: [action.user] }],\n }\n }),\n }\n : t\n ),\n }\n\n case 'REMOVE_REACTION':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? {\n ...t,\n comments: t.comments.map(c => {\n if (c.id !== action.commentId) return c\n return {\n ...c,\n reactions: (c.reactions || [])\n .map(r =>\n r.emoji === action.emoji\n ? { ...r, users: r.users.filter(u => u.id !== action.userId) }\n : r\n )\n .filter(r => r.users.length > 0),\n }\n }),\n }\n : t\n ),\n }\n\n case 'SET_ACTIVE_THREAD':\n return { ...state, activeThreadId: action.threadId }\n\n case 'TOGGLE_PANEL':\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\n\n case 'SET_FILTER':\n return { ...state, filter: action.filter }\n\n case 'SET_CURRENT_USER':\n return { ...state, currentUser: action.user }\n\n default:\n return state\n }\n}\n\n/** Context value type */\ninterface CommentsContextValue {\n state: CommentsState\n config: CommentsConfig | null\n\n // Thread operations\n createThread: (range: CommentRange, initialComment: string) => CommentThread | null\n deleteThread: (threadId: string) => void\n resolveThread: (threadId: string) => void\n reopenThread: (threadId: string) => void\n\n // Comment operations\n addComment: (threadId: string, content: string) => Comment | null\n updateComment: (threadId: string, commentId: string, content: string) => void\n deleteComment: (threadId: string, commentId: string) => void\n\n // Reaction operations\n addReaction: (threadId: string, commentId: string, emoji: string) => void\n removeReaction: (threadId: string, commentId: string, emoji: string) => void\n\n // UI operations\n setActiveThread: (threadId: string | null) => void\n togglePanel: (isOpen?: boolean) => void\n setFilter: (filter: 'all' | 'open' | 'resolved') => void\n\n // Getters\n getThreadByRange: (from: number, to: number) => CommentThread | undefined\n getFilteredThreads: () => CommentThread[]\n\n // Event subscription\n subscribe: (callback: (event: CommentEvent) => void) => () => void\n\n isEnabled: boolean\n}\n\n/** Create context */\nconst CommentsContext = createContext<CommentsContextValue | null>(null)\n\n/** Provider props */\ninterface CommentsProviderProps {\n children: ReactNode\n config?: CommentsConfig\n initialThreads?: CommentThread[]\n onThreadsChange?: (threads: CommentThread[]) => void\n}\n\n/** Comments Provider Component */\nexport function CommentsProvider({\n children,\n config,\n initialThreads = [],\n onThreadsChange,\n}: CommentsProviderProps) {\n const [state, dispatch] = useReducer(commentsReducer, {\n ...initialState,\n threads: initialThreads,\n currentUser: config?.currentUser ?? null,\n })\n\n const subscribersRef = { current: new Set<(event: CommentEvent) => void>() }\n\n // Load initial threads\n useEffect(() => {\n if (config?.onLoad) {\n config.onLoad().then(threads => {\n dispatch({ type: 'SET_THREADS', threads })\n })\n }\n }, [config])\n\n // Notify on threads change\n useEffect(() => {\n onThreadsChange?.(state.threads)\n if (config?.onSave) {\n config.onSave(state.threads)\n }\n }, [state.threads, onThreadsChange, config])\n\n // Update current user when config changes\n useEffect(() => {\n if (config?.currentUser) {\n dispatch({ type: 'SET_CURRENT_USER', user: config.currentUser })\n }\n }, [config?.currentUser])\n\n /** Emit event to subscribers */\n const emitEvent = useCallback((event: CommentEvent) => {\n subscribersRef.current.forEach(callback => callback(event))\n }, [])\n\n /** Create a new thread */\n const createThread = useCallback((range: CommentRange, initialComment: string): CommentThread | null => {\n if (!state.currentUser) return null\n\n const threadId = generateId()\n const commentId = generateId()\n const now = Date.now()\n\n const comment: Comment = {\n id: commentId,\n threadId,\n content: initialComment,\n author: state.currentUser,\n createdAt: now,\n isEdited: false,\n }\n\n const thread: CommentThread = {\n id: threadId,\n range,\n comments: [comment],\n status: 'open',\n createdAt: now,\n }\n\n dispatch({ type: 'ADD_THREAD', thread })\n emitEvent({ type: 'thread-created', thread })\n return thread\n }, [state.currentUser, emitEvent])\n\n /** Delete a thread */\n const deleteThread = useCallback((threadId: string) => {\n if (config?.allowDelete === false) return\n dispatch({ type: 'DELETE_THREAD', threadId })\n emitEvent({ type: 'thread-deleted', threadId })\n }, [config, emitEvent])\n\n /** Resolve a thread */\n const resolveThread = useCallback((threadId: string) => {\n if (!state.currentUser || config?.allowResolve === false) return\n dispatch({ type: 'RESOLVE_THREAD', threadId, resolvedBy: state.currentUser })\n emitEvent({ type: 'thread-resolved', threadId, resolvedBy: state.currentUser })\n }, [state.currentUser, config, emitEvent])\n\n /** Reopen a thread */\n const reopenThread = useCallback((threadId: string) => {\n dispatch({ type: 'REOPEN_THREAD', threadId })\n emitEvent({ type: 'thread-reopened', threadId })\n }, [emitEvent])\n\n /** Add a comment to a thread */\n const addComment = useCallback((threadId: string, content: string): Comment | null => {\n if (!state.currentUser) return null\n\n const comment: Comment = {\n id: generateId(),\n threadId,\n content,\n author: state.currentUser,\n createdAt: Date.now(),\n isEdited: false,\n }\n\n dispatch({ type: 'ADD_COMMENT', threadId, comment })\n emitEvent({ type: 'comment-added', threadId, comment })\n return comment\n }, [state.currentUser, emitEvent])\n\n /** Update a comment */\n const updateComment = useCallback((threadId: string, commentId: string, content: string) => {\n if (config?.allowEdit === false) return\n\n const thread = state.threads.find(t => t.id === threadId)\n const existingComment = thread?.comments.find(c => c.id === commentId)\n if (!existingComment) return\n\n const updatedComment: Comment = {\n ...existingComment,\n content,\n updatedAt: Date.now(),\n isEdited: true,\n }\n\n dispatch({ type: 'UPDATE_COMMENT', threadId, comment: updatedComment })\n emitEvent({ type: 'comment-updated', threadId, comment: updatedComment })\n }, [state.threads, config, emitEvent])\n\n /** Delete a comment */\n const deleteComment = useCallback((threadId: string, commentId: string) => {\n if (config?.allowDelete === false) return\n dispatch({ type: 'DELETE_COMMENT', threadId, commentId })\n emitEvent({ type: 'comment-deleted', threadId, commentId })\n }, [config, emitEvent])\n\n /** Add a reaction */\n const addReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\n if (!state.currentUser || config?.allowReactions === false) return\n\n const allowedEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\n if (!allowedEmojis.includes(emoji)) return\n\n dispatch({ type: 'ADD_REACTION', threadId, commentId, emoji, user: state.currentUser })\n emitEvent({ type: 'reaction-added', threadId, commentId, emoji, user: state.currentUser })\n }, [state.currentUser, config, emitEvent])\n\n /** Remove a reaction */\n const removeReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\n if (!state.currentUser) return\n dispatch({ type: 'REMOVE_REACTION', threadId, commentId, emoji, userId: state.currentUser.id })\n emitEvent({ type: 'reaction-removed', threadId, commentId, emoji, userId: state.currentUser.id })\n }, [state.currentUser, emitEvent])\n\n /** Set active thread */\n const setActiveThread = useCallback((threadId: string | null) => {\n dispatch({ type: 'SET_ACTIVE_THREAD', threadId })\n }, [])\n\n /** Toggle panel */\n const togglePanel = useCallback((isOpen?: boolean) => {\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\n }, [])\n\n /** Set filter */\n const setFilter = useCallback((filter: 'all' | 'open' | 'resolved') => {\n dispatch({ type: 'SET_FILTER', filter })\n }, [])\n\n /** Get thread by range */\n const getThreadByRange = useCallback((from: number, to: number) => {\n return state.threads.find(t => t.range.from === from && t.range.to === to)\n }, [state.threads])\n\n /** Get filtered threads */\n const getFilteredThreads = useCallback(() => {\n if (state.filter === 'all') return state.threads\n return state.threads.filter(t => t.status === state.filter)\n }, [state.threads, state.filter])\n\n /** Subscribe to events */\n const subscribe = useCallback((callback: (event: CommentEvent) => void) => {\n subscribersRef.current.add(callback)\n return () => {\n subscribersRef.current.delete(callback)\n }\n }, [])\n\n const value: CommentsContextValue = {\n state,\n config: config ?? null,\n createThread,\n deleteThread,\n resolveThread,\n reopenThread,\n addComment,\n updateComment,\n deleteComment,\n addReaction,\n removeReaction,\n setActiveThread,\n togglePanel,\n setFilter,\n getThreadByRange,\n getFilteredThreads,\n subscribe,\n isEnabled: !!config,\n }\n\n return (\n <CommentsContext.Provider value={value}>\n {children}\n </CommentsContext.Provider>\n )\n}\n\n/** Hook to use comments context */\nexport function useComments() {\n const context = useContext(CommentsContext)\n if (!context) {\n throw new Error('useComments must be used within a CommentsProvider')\n }\n return context\n}\n\n/** Hook to check if comments is available (doesn't throw) */\nexport function useCommentsOptional() {\n return useContext(CommentsContext)\n}\n\nexport default CommentsContext\n","/**\n * Comments Panel Component\n * Displays comment threads with reply functionality\n */\n\nimport { useState } from 'react'\nimport { useCommentsOptional } from './CommentsContext'\nimport type { CommentThread, Comment as CommentType } from './types'\nimport { DEFAULT_REACTION_EMOJIS } from './types'\n\ninterface CommentsPanelProps {\n /** Panel position */\n position?: 'left' | 'right'\n /** Custom class name */\n className?: string\n}\n\n/** Format relative time */\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now()\n const diff = now - timestamp\n const minutes = Math.floor(diff / 60000)\n const hours = Math.floor(diff / 3600000)\n const days = Math.floor(diff / 86400000)\n\n if (minutes < 1) return 'Just now'\n if (minutes < 60) return `${minutes}m ago`\n if (hours < 24) return `${hours}h ago`\n if (days < 7) return `${days}d ago`\n\n return new Date(timestamp).toLocaleDateString()\n}\n\n/** Single comment component */\nfunction CommentItem({\n comment,\n threadId,\n isFirst,\n}: {\n comment: CommentType\n threadId: string\n isFirst: boolean\n}) {\n const comments = useCommentsOptional()\n const [isEditing, setIsEditing] = useState(false)\n const [editContent, setEditContent] = useState(comment.content)\n const [showReactions, setShowReactions] = useState(false)\n\n if (!comments) return null\n\n const { config, updateComment, deleteComment, addReaction, removeReaction, state } = comments\n const canEdit = config?.allowEdit !== false && comment.author.id === state.currentUser?.id\n const canDelete = config?.allowDelete !== false && comment.author.id === state.currentUser?.id\n const canReact = config?.allowReactions !== false\n const reactionEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\n\n const handleSaveEdit = () => {\n updateComment(threadId, comment.id, editContent)\n setIsEditing(false)\n }\n\n const handleToggleReaction = (emoji: string) => {\n const reaction = comment.reactions?.find(r => r.emoji === emoji)\n const hasReacted = reaction?.users.some(u => u.id === state.currentUser?.id)\n\n if (hasReacted) {\n removeReaction(threadId, comment.id, emoji)\n } else {\n addReaction(threadId, comment.id, emoji)\n }\n setShowReactions(false)\n }\n\n return (\n <div className={`rte-comment ${isFirst ? 'rte-comment-first' : ''}`}>\n <div className=\"rte-comment-header\">\n <div className=\"rte-comment-author\">\n {comment.author.avatar ? (\n <img src={comment.author.avatar} alt={comment.author.name} className=\"rte-comment-avatar\" />\n ) : (\n <div className=\"rte-comment-avatar-placeholder\">\n {comment.author.name.charAt(0).toUpperCase()}\n </div>\n )}\n <span className=\"rte-comment-author-name\">{comment.author.name}</span>\n </div>\n <span className=\"rte-comment-time\">\n {formatRelativeTime(comment.createdAt)}\n {comment.isEdited && ' (edited)'}\n </span>\n </div>\n\n {isEditing ? (\n <div className=\"rte-comment-edit\">\n <textarea\n value={editContent}\n onChange={e => setEditContent(e.target.value)}\n className=\"rte-comment-edit-input\"\n />\n <div className=\"rte-comment-edit-actions\">\n <button onClick={handleSaveEdit} className=\"rte-comment-btn-save\">Save</button>\n <button onClick={() => setIsEditing(false)} className=\"rte-comment-btn-cancel\">Cancel</button>\n </div>\n </div>\n ) : (\n <div className=\"rte-comment-content\" dangerouslySetInnerHTML={{ __html: comment.content }} />\n )}\n\n {/* Reactions */}\n {comment.reactions && comment.reactions.length > 0 && (\n <div className=\"rte-comment-reactions\">\n {comment.reactions.map(reaction => (\n <button\n key={reaction.emoji}\n className={`rte-comment-reaction ${\n reaction.users.some(u => u.id === state.currentUser?.id) ? 'active' : ''\n }`}\n onClick={() => handleToggleReaction(reaction.emoji)}\n title={reaction.users.map(u => u.name).join(', ')}\n >\n {reaction.emoji} {reaction.users.length}\n </button>\n ))}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"rte-comment-actions\">\n {canReact && (\n <div className=\"rte-comment-reaction-picker\">\n <button\n className=\"rte-comment-action-btn\"\n onClick={() => setShowReactions(!showReactions)}\n >\n ๐Ÿ˜Š\n </button>\n {showReactions && (\n <div className=\"rte-comment-reaction-dropdown\">\n {reactionEmojis.map(emoji => (\n <button key={emoji} onClick={() => handleToggleReaction(emoji)}>\n {emoji}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n {canEdit && (\n <button className=\"rte-comment-action-btn\" onClick={() => setIsEditing(true)}>\n Edit\n </button>\n )}\n {canDelete && !isFirst && (\n <button\n className=\"rte-comment-action-btn rte-comment-action-delete\"\n onClick={() => deleteComment(threadId, comment.id)}\n >\n Delete\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/** Thread component */\nfunction ThreadItem({ thread }: { thread: CommentThread }) {\n const comments = useCommentsOptional()\n const [replyContent, setReplyContent] = useState('')\n const [showReply, setShowReply] = useState(false)\n\n if (!comments) return null\n\n const { state, setActiveThread, addComment, resolveThread, reopenThread, deleteThread, config } = comments\n const isActive = state.activeThreadId === thread.id\n const canResolve = config?.allowResolve !== false\n\n const handleReply = () => {\n if (replyContent.trim()) {\n addComment(thread.id, replyContent)\n setReplyContent('')\n setShowReply(false)\n }\n }\n\n return (\n <div\n className={`rte-thread ${isActive ? 'rte-thread-active' : ''} ${\n thread.status === 'resolved' ? 'rte-thread-resolved' : ''\n }`}\n onClick={() => setActiveThread(thread.id)}\n >\n {/* Thread header */}\n <div className=\"rte-thread-header\">\n <div className=\"rte-thread-quote\">\"{thread.range.text.slice(0, 50)}...\"</div>\n <div className=\"rte-thread-meta\">\n <span className={`rte-thread-status rte-thread-status-${thread.status}`}>\n {thread.status}\n </span>\n <span className=\"rte-thread-count\">{thread.comments.length} comment{thread.comments.length !== 1 ? 's' : ''}</span>\n </div>\n </div>\n\n {/* Comments */}\n <div className=\"rte-thread-comments\">\n {thread.comments.map((comment, index) => (\n <CommentItem\n key={comment.id}\n comment={comment}\n threadId={thread.id}\n isFirst={index === 0}\n />\n ))}\n </div>\n\n {/* Reply form */}\n {thread.status === 'open' && (\n <div className=\"rte-thread-reply\">\n {showReply ? (\n <>\n <textarea\n value={replyContent}\n onChange={e => setReplyContent(e.target.value)}\n placeholder=\"Write a reply...\"\n className=\"rte-thread-reply-input\"\n />\n <div className=\"rte-thread-reply-actions\">\n <button onClick={handleReply} className=\"rte-btn-primary\" disabled={!replyContent.trim()}>\n Reply\n </button>\n <button onClick={() => setShowReply(false)} className=\"rte-btn-secondary\">\n Cancel\n </button>\n </div>\n </>\n ) : (\n <button onClick={() => setShowReply(true)} className=\"rte-thread-reply-btn\">\n Reply\n </button>\n )}\n </div>\n )}\n\n {/* Thread actions */}\n <div className=\"rte-thread-actions\">\n {canResolve && thread.status === 'open' && (\n <button onClick={() => resolveThread(thread.id)} className=\"rte-btn-resolve\">\n โœ“ Resolve\n </button>\n )}\n {thread.status === 'resolved' && (\n <button onClick={() => reopenThread(thread.id)} className=\"rte-btn-reopen\">\n Reopen\n </button>\n )}\n <button\n onClick={e => {\n e.stopPropagation()\n deleteThread(thread.id)\n }}\n className=\"rte-btn-delete-thread\"\n >\n Delete\n </button>\n </div>\n </div>\n )\n}\n\n/** Comments Panel Component */\nexport function CommentsPanel({ position = 'right', className = '' }: CommentsPanelProps) {\n const comments = useCommentsOptional()\n\n if (!comments?.isEnabled || !comments.state.isPanelOpen) {\n return null\n }\n\n const { state, togglePanel, setFilter, getFilteredThreads } = comments\n const filteredThreads = getFilteredThreads()\n\n return (\n <div className={`rte-comments-panel rte-comments-panel-${position} ${className}`}>\n {/* Panel header */}\n <div className=\"rte-comments-panel-header\">\n <h3>Comments</h3>\n <button onClick={() => togglePanel(false)} className=\"rte-comments-close-btn\">ร—</button>\n </div>\n\n {/* Filter tabs */}\n <div className=\"rte-comments-filters\">\n {(['all', 'open', 'resolved'] as const).map(filter => (\n <button\n key={filter}\n className={`rte-comments-filter ${state.filter === filter ? 'active' : ''}`}\n onClick={() => setFilter(filter)}\n >\n {filter.charAt(0).toUpperCase() + filter.slice(1)}\n <span className=\"rte-comments-filter-count\">\n {filter === 'all'\n ? state.threads.length\n : state.threads.filter(t => t.status === filter).length}\n </span>\n </button>\n ))}\n </div>\n\n {/* Threads list */}\n <div className=\"rte-comments-list\">\n {filteredThreads.length === 0 ? (\n <div className=\"rte-comments-empty\">\n {state.filter === 'all'\n ? 'No comments yet. Select text and add a comment.'\n : `No ${state.filter} comments.`}\n </div>\n ) : (\n filteredThreads.map(thread => (\n <ThreadItem key={thread.id} thread={thread} />\n ))\n )}\n </div>\n </div>\n )\n}\n\nexport default CommentsPanel\n","/**\n * Version History Context\n * Provides version history state and methods to child components\n */\n\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\nimport type {\n VersionHistoryState,\n VersionHistoryConfig,\n Version,\n VersionComparison,\n VersionChange,\n VersionHistoryEvent,\n} from './types'\n\n/** Actions for version history reducer */\ntype VersionHistoryAction =\n | { type: 'SET_VERSIONS'; versions: Version[] }\n | { type: 'ADD_VERSION'; version: Version }\n | { type: 'DELETE_VERSION'; versionId: string }\n | { type: 'PIN_VERSION'; versionId: string }\n | { type: 'UNPIN_VERSION'; versionId: string }\n | { type: 'RENAME_VERSION'; versionId: string; title: string }\n | { type: 'SET_VIEWING_VERSION'; versionId: string | null }\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\n | { type: 'START_COMPARE'; fromId: string; toId: string }\n | { type: 'STOP_COMPARE' }\n | { type: 'SET_AUTO_SAVE'; enabled: boolean }\n | { type: 'SET_AUTO_SAVE_INTERVAL'; interval: number }\n\n/** Initial version history state */\nconst initialState: VersionHistoryState = {\n versions: [],\n viewingVersionId: null,\n isPanelOpen: false,\n isComparing: false,\n compareFromId: null,\n compareToId: null,\n autoSaveEnabled: true,\n autoSaveInterval: 60000,\n}\n\n/** Generate unique ID */\nfunction generateId(): string {\n return `v-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/** Version history reducer */\nfunction versionHistoryReducer(state: VersionHistoryState, action: VersionHistoryAction): VersionHistoryState {\n switch (action.type) {\n case 'SET_VERSIONS':\n return { ...state, versions: action.versions }\n\n case 'ADD_VERSION':\n return {\n ...state,\n versions: [action.version, ...state.versions],\n }\n\n case 'DELETE_VERSION':\n return {\n ...state,\n versions: state.versions.filter(v => v.id !== action.versionId),\n viewingVersionId: state.viewingVersionId === action.versionId ? null : state.viewingVersionId,\n }\n\n case 'PIN_VERSION':\n return {\n ...state,\n versions: state.versions.map(v =>\n v.id === action.versionId ? { ...v, isPinned: true } : v\n ),\n }\n\n case 'UNPIN_VERSION':\n return {\n ...state,\n versions: state.versions.map(v =>\n v.id === action.versionId ? { ...v, isPinned: false } : v\n ),\n }\n\n case 'RENAME_VERSION':\n return {\n ...state,\n versions: state.versions.map(v =>\n v.id === action.versionId ? { ...v, title: action.title } : v\n ),\n }\n\n case 'SET_VIEWING_VERSION':\n return { ...state, viewingVersionId: action.versionId }\n\n case 'TOGGLE_PANEL':\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\n\n case 'START_COMPARE':\n return {\n ...state,\n isComparing: true,\n compareFromId: action.fromId,\n compareToId: action.toId,\n }\n\n case 'STOP_COMPARE':\n return {\n ...state,\n isComparing: false,\n compareFromId: null,\n compareToId: null,\n }\n\n case 'SET_AUTO_SAVE':\n return { ...state, autoSaveEnabled: action.enabled }\n\n case 'SET_AUTO_SAVE_INTERVAL':\n return { ...state, autoSaveInterval: action.interval }\n\n default:\n return state\n }\n}\n\n/** Count words in text */\nfunction countWords(text: string): number {\n return text.trim().split(/\\s+/).filter(Boolean).length\n}\n\n/** Simple diff algorithm for version comparison */\nfunction computeDiff(oldText: string, newText: string): VersionChange[] {\n const changes: VersionChange[] = []\n const oldLines = oldText.split('\\n')\n const newLines = newText.split('\\n')\n\n let i = 0\n let j = 0\n\n while (i < oldLines.length || j < newLines.length) {\n if (i >= oldLines.length) {\n // Remaining new lines are additions\n changes.push({\n type: 'addition',\n content: newLines[j],\n position: j,\n })\n j++\n } else if (j >= newLines.length) {\n // Remaining old lines are deletions\n changes.push({\n type: 'deletion',\n content: oldLines[i],\n position: i,\n })\n i++\n } else if (oldLines[i] === newLines[j]) {\n // Lines match, move on\n i++\n j++\n } else {\n // Lines differ - check if it's a modification or add/delete\n const oldLineInNew = newLines.indexOf(oldLines[i], j)\n const newLineInOld = oldLines.indexOf(newLines[j], i)\n\n if (oldLineInNew === -1 && newLineInOld === -1) {\n // Modification\n changes.push({\n type: 'modification',\n content: `${oldLines[i]} -> ${newLines[j]}`,\n position: i,\n })\n i++\n j++\n } else if (oldLineInNew === -1) {\n // Deletion\n changes.push({\n type: 'deletion',\n content: oldLines[i],\n position: i,\n })\n i++\n } else {\n // Addition\n changes.push({\n type: 'addition',\n content: newLines[j],\n position: j,\n })\n j++\n }\n }\n }\n\n return changes\n}\n\n/** Context value type */\ninterface VersionHistoryContextValue {\n state: VersionHistoryState\n config: VersionHistoryConfig | null\n\n // Version operations\n createVersion: (content: string, jsonContent?: unknown, options?: { title?: string; isAutoSave?: boolean }) => Version | null\n deleteVersion: (versionId: string) => void\n restoreVersion: (versionId: string) => string | null\n pinVersion: (versionId: string) => void\n unpinVersion: (versionId: string) => void\n renameVersion: (versionId: string, title: string) => void\n\n // Viewing operations\n viewVersion: (versionId: string | null) => void\n getVersionContent: (versionId: string) => string | null\n\n // Comparison operations\n compareVersions: (fromId: string, toId: string) => VersionComparison | null\n startCompare: (fromId: string, toId: string) => void\n stopCompare: () => void\n\n // UI operations\n togglePanel: (isOpen?: boolean) => void\n setAutoSave: (enabled: boolean) => void\n\n // Getters\n getVersion: (versionId: string) => Version | undefined\n getLatestVersion: () => Version | undefined\n getPinnedVersions: () => Version[]\n\n // Event subscription\n subscribe: (callback: (event: VersionHistoryEvent) => void) => () => void\n\n isEnabled: boolean\n}\n\n/** Create context */\nconst VersionHistoryContext = createContext<VersionHistoryContextValue | null>(null)\n\n/** Provider props */\ninterface VersionHistoryProviderProps {\n children: ReactNode\n config?: VersionHistoryConfig\n initialVersions?: Version[]\n onVersionsChange?: (versions: Version[]) => void\n getCurrentContent?: () => { html: string; json?: unknown; text: string }\n}\n\n/** Version History Provider Component */\nexport function VersionHistoryProvider({\n children,\n config,\n initialVersions = [],\n onVersionsChange,\n getCurrentContent,\n}: VersionHistoryProviderProps) {\n const [state, dispatch] = useReducer(versionHistoryReducer, {\n ...initialState,\n versions: initialVersions,\n autoSaveEnabled: config?.autoSave ?? true,\n autoSaveInterval: config?.autoSaveInterval ?? 60000,\n })\n\n const subscribersRef = useRef(new Set<(event: VersionHistoryEvent) => void>())\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\n const lastContentRef = useRef<string>('')\n const versionNumberRef = useRef(initialVersions.length)\n\n // Load initial versions\n useEffect(() => {\n if (config?.onLoad) {\n config.onLoad().then(versions => {\n dispatch({ type: 'SET_VERSIONS', versions })\n versionNumberRef.current = versions.length\n })\n }\n }, [config])\n\n // Notify on versions change\n useEffect(() => {\n onVersionsChange?.(state.versions)\n if (config?.onSave) {\n config.onSave(state.versions)\n }\n }, [state.versions, onVersionsChange, config])\n\n // Auto-save timer\n useEffect(() => {\n if (!state.autoSaveEnabled || !config || !getCurrentContent) return\n\n autoSaveTimerRef.current = setInterval(() => {\n const { html, json } = getCurrentContent()\n\n // Only save if content changed\n if (html !== lastContentRef.current) {\n lastContentRef.current = html\n createVersion(html, json, { isAutoSave: true })\n }\n }, state.autoSaveInterval)\n\n return () => {\n if (autoSaveTimerRef.current) {\n clearInterval(autoSaveTimerRef.current)\n }\n }\n }, [state.autoSaveEnabled, state.autoSaveInterval, config, getCurrentContent])\n\n /** Emit event to subscribers */\n const emitEvent = useCallback((event: VersionHistoryEvent) => {\n subscribersRef.current.forEach(callback => callback(event))\n }, [])\n\n /** Create a new version */\n const createVersion = useCallback((\n content: string,\n jsonContent?: unknown,\n options?: { title?: string; isAutoSave?: boolean }\n ): Version | null => {\n if (!config?.currentUser) return null\n\n // Check max versions\n const maxVersions = config.maxVersions ?? 100\n let versions = state.versions\n\n if (versions.length >= maxVersions) {\n // Remove oldest non-pinned version\n const oldestUnpinned = [...versions].reverse().find(v => !v.isPinned)\n if (oldestUnpinned) {\n versions = versions.filter(v => v.id !== oldestUnpinned.id)\n }\n }\n\n versionNumberRef.current++\n const textContent = content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n\n const version: Version = {\n id: generateId(),\n number: versionNumberRef.current,\n title: options?.title,\n content,\n jsonContent,\n textContent,\n author: config.currentUser,\n createdAt: Date.now(),\n wordCount: countWords(textContent),\n characterCount: textContent.length,\n isAutoSave: options?.isAutoSave ?? false,\n isPinned: false,\n }\n\n dispatch({ type: 'ADD_VERSION', version })\n emitEvent({ type: 'version-created', version })\n return version\n }, [config, state.versions, emitEvent])\n\n /** Delete a version */\n const deleteVersion = useCallback((versionId: string) => {\n dispatch({ type: 'DELETE_VERSION', versionId })\n emitEvent({ type: 'version-deleted', versionId })\n }, [emitEvent])\n\n /** Restore a version */\n const restoreVersion = useCallback((versionId: string): string | null => {\n const version = state.versions.find(v => v.id === versionId)\n if (!version) return null\n\n config?.onRestore?.(version)\n emitEvent({ type: 'version-restored', versionId })\n return version.content\n }, [state.versions, config, emitEvent])\n\n /** Pin a version */\n const pinVersion = useCallback((versionId: string) => {\n dispatch({ type: 'PIN_VERSION', versionId })\n emitEvent({ type: 'version-pinned', versionId })\n }, [emitEvent])\n\n /** Unpin a version */\n const unpinVersion = useCallback((versionId: string) => {\n dispatch({ type: 'UNPIN_VERSION', versionId })\n emitEvent({ type: 'version-unpinned', versionId })\n }, [emitEvent])\n\n /** Rename a version */\n const renameVersion = useCallback((versionId: string, title: string) => {\n dispatch({ type: 'RENAME_VERSION', versionId, title })\n emitEvent({ type: 'version-renamed', versionId, title })\n }, [emitEvent])\n\n /** View a version */\n const viewVersion = useCallback((versionId: string | null) => {\n dispatch({ type: 'SET_VIEWING_VERSION', versionId })\n }, [])\n\n /** Get version content */\n const getVersionContent = useCallback((versionId: string): string | null => {\n const version = state.versions.find(v => v.id === versionId)\n return version?.content ?? null\n }, [state.versions])\n\n /** Compare two versions */\n const compareVersions = useCallback((fromId: string, toId: string): VersionComparison | null => {\n const fromVersion = state.versions.find(v => v.id === fromId)\n const toVersion = state.versions.find(v => v.id === toId)\n\n if (!fromVersion || !toVersion) return null\n\n const changes = computeDiff(fromVersion.textContent, toVersion.textContent)\n\n return {\n fromVersionId: fromId,\n toVersionId: toId,\n changes,\n stats: {\n additions: changes.filter(c => c.type === 'addition').length,\n deletions: changes.filter(c => c.type === 'deletion').length,\n modifications: changes.filter(c => c.type === 'modification').length,\n },\n }\n }, [state.versions])\n\n /** Start comparing versions */\n const startCompare = useCallback((fromId: string, toId: string) => {\n dispatch({ type: 'START_COMPARE', fromId, toId })\n }, [])\n\n /** Stop comparing versions */\n const stopCompare = useCallback(() => {\n dispatch({ type: 'STOP_COMPARE' })\n }, [])\n\n /** Toggle panel */\n const togglePanel = useCallback((isOpen?: boolean) => {\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\n }, [])\n\n /** Set auto-save */\n const setAutoSave = useCallback((enabled: boolean) => {\n dispatch({ type: 'SET_AUTO_SAVE', enabled })\n emitEvent({ type: 'auto-save-toggled', enabled })\n }, [emitEvent])\n\n /** Get a version by ID */\n const getVersion = useCallback((versionId: string) => {\n return state.versions.find(v => v.id === versionId)\n }, [state.versions])\n\n /** Get latest version */\n const getLatestVersion = useCallback(() => {\n return state.versions[0]\n }, [state.versions])\n\n /** Get pinned versions */\n const getPinnedVersions = useCallback(() => {\n return state.versions.filter(v => v.isPinned)\n }, [state.versions])\n\n /** Subscribe to events */\n const subscribe = useCallback((callback: (event: VersionHistoryEvent) => void) => {\n subscribersRef.current.add(callback)\n return () => {\n subscribersRef.current.delete(callback)\n }\n }, [])\n\n const value: VersionHistoryContextValue = {\n state,\n config: config ?? null,\n createVersion,\n deleteVersion,\n restoreVersion,\n pinVersion,\n unpinVersion,\n renameVersion,\n viewVersion,\n getVersionContent,\n compareVersions,\n startCompare,\n stopCompare,\n togglePanel,\n setAutoSave,\n getVersion,\n getLatestVersion,\n getPinnedVersions,\n subscribe,\n isEnabled: !!config,\n }\n\n return (\n <VersionHistoryContext.Provider value={value}>\n {children}\n </VersionHistoryContext.Provider>\n )\n}\n\n/** Hook to use version history context */\nexport function useVersionHistory() {\n const context = useContext(VersionHistoryContext)\n if (!context) {\n throw new Error('useVersionHistory must be used within a VersionHistoryProvider')\n }\n return context\n}\n\n/** Hook to check if version history is available (doesn't throw) */\nexport function useVersionHistoryOptional() {\n return useContext(VersionHistoryContext)\n}\n\nexport default VersionHistoryContext\n","/**\n * Version History Panel Component\n * Displays version history with restore and compare functionality\n */\n\nimport { useState } from 'react'\nimport { useVersionHistoryOptional } from './VersionHistoryContext'\nimport type { Version } from './types'\n\ninterface VersionHistoryPanelProps {\n /** Panel position */\n position?: 'left' | 'right'\n /** Custom class name */\n className?: string\n}\n\n/** Format date */\nfunction formatDate(timestamp: number): string {\n const date = new Date(timestamp)\n const now = new Date()\n const isToday = date.toDateString() === now.toDateString()\n\n if (isToday) {\n return `Today at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\n }\n\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n if (date.toDateString() === yesterday.toDateString()) {\n return `Yesterday at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\n }\n\n return date.toLocaleDateString([], {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\n/** Single version item */\nfunction VersionItem({\n version,\n isViewing,\n isCompareFrom,\n isCompareTo,\n onView,\n onRestore,\n onPin,\n onRename,\n onDelete,\n onCompareSelect,\n}: {\n version: Version\n isViewing: boolean\n isCompareFrom: boolean\n isCompareTo: boolean\n onView: () => void\n onRestore: () => void\n onPin: () => void\n onRename: (title: string) => void\n onDelete: () => void\n onCompareSelect: () => void\n}) {\n const [isRenaming, setIsRenaming] = useState(false)\n const [newTitle, setNewTitle] = useState(version.title || '')\n\n const handleRename = () => {\n onRename(newTitle)\n setIsRenaming(false)\n }\n\n return (\n <div\n className={`rte-version-item ${isViewing ? 'rte-version-viewing' : ''} ${\n isCompareFrom ? 'rte-version-compare-from' : ''\n } ${isCompareTo ? 'rte-version-compare-to' : ''}`}\n >\n {/* Version header */}\n <div className=\"rte-version-header\" onClick={onView}>\n <div className=\"rte-version-info\">\n {isRenaming ? (\n <input\n type=\"text\"\n value={newTitle}\n onChange={e => setNewTitle(e.target.value)}\n onBlur={handleRename}\n onKeyDown={e => e.key === 'Enter' && handleRename()}\n className=\"rte-version-rename-input\"\n onClick={e => e.stopPropagation()}\n autoFocus\n />\n ) : (\n <span className=\"rte-version-title\">\n {version.title || `Version ${version.number}`}\n {version.isPinned && <span className=\"rte-version-pin-icon\">๐Ÿ“Œ</span>}\n {version.isAutoSave && <span className=\"rte-version-auto-badge\">Auto</span>}\n </span>\n )}\n <span className=\"rte-version-time\">{formatDate(version.createdAt)}</span>\n </div>\n <div className=\"rte-version-author\">\n {version.author.avatar ? (\n <img src={version.author.avatar} alt={version.author.name} className=\"rte-version-avatar\" />\n ) : (\n <div className=\"rte-version-avatar-placeholder\">\n {version.author.name.charAt(0).toUpperCase()}\n </div>\n )}\n <span>{version.author.name}</span>\n </div>\n </div>\n\n {/* Version stats */}\n <div className=\"rte-version-stats\">\n <span>{version.wordCount} words</span>\n <span>{version.characterCount} chars</span>\n </div>\n\n {/* Version actions */}\n <div className=\"rte-version-actions\">\n <button onClick={onRestore} className=\"rte-version-btn\" title=\"Restore this version\">\n โ†บ Restore\n </button>\n <button onClick={onCompareSelect} className=\"rte-version-btn\" title=\"Compare with another version\">\n โ‡„ Compare\n </button>\n <button onClick={onPin} className=\"rte-version-btn\" title={version.isPinned ? 'Unpin' : 'Pin'}>\n {version.isPinned ? '๐Ÿ“Œ Unpin' : '๐Ÿ“Œ Pin'}\n </button>\n <button\n onClick={() => setIsRenaming(true)}\n className=\"rte-version-btn\"\n title=\"Rename version\"\n >\n โœ๏ธ\n </button>\n {!version.isPinned && (\n <button onClick={onDelete} className=\"rte-version-btn rte-version-btn-delete\" title=\"Delete\">\n ๐Ÿ—‘๏ธ\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/** Version comparison view */\nfunction ComparisonView({\n fromVersion,\n toVersion,\n onClose,\n}: {\n fromVersion: Version\n toVersion: Version\n onClose: () => void\n}) {\n const versionHistory = useVersionHistoryOptional()\n if (!versionHistory) return null\n\n const comparison = versionHistory.compareVersions(fromVersion.id, toVersion.id)\n\n return (\n <div className=\"rte-version-comparison\">\n <div className=\"rte-version-comparison-header\">\n <h4>Comparing Versions</h4>\n <button onClick={onClose} className=\"rte-version-comparison-close\">ร—</button>\n </div>\n\n <div className=\"rte-version-comparison-info\">\n <div className=\"rte-version-comparison-from\">\n <span className=\"rte-version-comparison-label\">From:</span>\n {fromVersion.title || `Version ${fromVersion.number}`}\n </div>\n <span className=\"rte-version-comparison-arrow\">โ†’</span>\n <div className=\"rte-version-comparison-to\">\n <span className=\"rte-version-comparison-label\">To:</span>\n {toVersion.title || `Version ${toVersion.number}`}\n </div>\n </div>\n\n {comparison && (\n <div className=\"rte-version-comparison-stats\">\n <span className=\"rte-comparison-stat rte-comparison-additions\">\n +{comparison.stats.additions} additions\n </span>\n <span className=\"rte-comparison-stat rte-comparison-deletions\">\n -{comparison.stats.deletions} deletions\n </span>\n <span className=\"rte-comparison-stat rte-comparison-modifications\">\n ~{comparison.stats.modifications} modifications\n </span>\n </div>\n )}\n\n <div className=\"rte-version-comparison-diff\">\n {comparison?.changes.map((change, index) => (\n <div key={index} className={`rte-diff-line rte-diff-${change.type}`}>\n <span className=\"rte-diff-indicator\">\n {change.type === 'addition' ? '+' : change.type === 'deletion' ? '-' : '~'}\n </span>\n <span className=\"rte-diff-content\">{change.content}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n/** Version History Panel Component */\nexport function VersionHistoryPanel({ position = 'right', className = '' }: VersionHistoryPanelProps) {\n const versionHistory = useVersionHistoryOptional()\n const [compareFromId, setCompareFromId] = useState<string | null>(null)\n\n if (!versionHistory?.isEnabled || !versionHistory.state.isPanelOpen) {\n return null\n }\n\n const {\n state,\n togglePanel,\n viewVersion,\n restoreVersion,\n pinVersion,\n unpinVersion,\n renameVersion,\n deleteVersion,\n setAutoSave,\n getVersion,\n createVersion,\n stopCompare,\n } = versionHistory\n\n const handleRestore = (versionId: string) => {\n const content = restoreVersion(versionId)\n if (content) {\n viewVersion(null) // Go back to current\n }\n }\n\n const handleCompareSelect = (versionId: string) => {\n if (!compareFromId) {\n setCompareFromId(versionId)\n } else {\n versionHistory.startCompare(compareFromId, versionId)\n setCompareFromId(null)\n }\n }\n\n const handleCancelCompare = () => {\n setCompareFromId(null)\n stopCompare()\n }\n\n // Get versions for comparison view\n const compareFromVersion = state.compareFromId ? getVersion(state.compareFromId) : undefined\n const compareToVersion = state.compareToId ? getVersion(state.compareToId) : undefined\n\n return (\n <div className={`rte-version-panel rte-version-panel-${position} ${className}`}>\n {/* Panel header */}\n <div className=\"rte-version-panel-header\">\n <h3>Version History</h3>\n <button onClick={() => togglePanel(false)} className=\"rte-version-close-btn\">ร—</button>\n </div>\n\n {/* Auto-save toggle */}\n <div className=\"rte-version-autosave\">\n <label className=\"rte-version-autosave-label\">\n <input\n type=\"checkbox\"\n checked={state.autoSaveEnabled}\n onChange={e => setAutoSave(e.target.checked)}\n />\n Auto-save versions\n </label>\n <button\n onClick={() => createVersion('', undefined, { isAutoSave: false })}\n className=\"rte-version-save-btn\"\n >\n Save Now\n </button>\n </div>\n\n {/* Compare mode indicator */}\n {compareFromId && !state.isComparing && (\n <div className=\"rte-version-compare-mode\">\n <span>Select another version to compare</span>\n <button onClick={handleCancelCompare}>Cancel</button>\n </div>\n )}\n\n {/* Comparison view */}\n {state.isComparing && compareFromVersion && compareToVersion && (\n <ComparisonView\n fromVersion={compareFromVersion}\n toVersion={compareToVersion}\n onClose={handleCancelCompare}\n />\n )}\n\n {/* Versions list */}\n {!state.isComparing && (\n <div className=\"rte-version-list\">\n {state.versions.length === 0 ? (\n <div className=\"rte-version-empty\">\n No versions saved yet. Changes will be auto-saved periodically.\n </div>\n ) : (\n <>\n {/* Pinned versions */}\n {state.versions.some(v => v.isPinned) && (\n <div className=\"rte-version-section\">\n <div className=\"rte-version-section-title\">๐Ÿ“Œ Pinned</div>\n {state.versions\n .filter(v => v.isPinned)\n .map(version => (\n <VersionItem\n key={version.id}\n version={version}\n isViewing={state.viewingVersionId === version.id}\n isCompareFrom={compareFromId === version.id}\n isCompareTo={false}\n onView={() => viewVersion(version.id)}\n onRestore={() => handleRestore(version.id)}\n onPin={() => unpinVersion(version.id)}\n onRename={title => renameVersion(version.id, title)}\n onDelete={() => deleteVersion(version.id)}\n onCompareSelect={() => handleCompareSelect(version.id)}\n />\n ))}\n </div>\n )}\n\n {/* Recent versions */}\n <div className=\"rte-version-section\">\n <div className=\"rte-version-section-title\">Recent</div>\n {state.versions\n .filter(v => !v.isPinned)\n .map(version => (\n <VersionItem\n key={version.id}\n version={version}\n isViewing={state.viewingVersionId === version.id}\n isCompareFrom={compareFromId === version.id}\n isCompareTo={false}\n onView={() => viewVersion(version.id)}\n onRestore={() => handleRestore(version.id)}\n onPin={() => pinVersion(version.id)}\n onRename={title => renameVersion(version.id, title)}\n onDelete={() => deleteVersion(version.id)}\n onCompareSelect={() => handleCompareSelect(version.id)}\n />\n ))}\n </div>\n </>\n )}\n </div>\n )}\n\n {/* Viewing version indicator */}\n {state.viewingVersionId && (\n <div className=\"rte-version-viewing-indicator\">\n <span>Viewing: {getVersion(state.viewingVersionId)?.title || `Version ${getVersion(state.viewingVersionId)?.number}`}</span>\n <button onClick={() => viewVersion(null)} className=\"rte-version-back-btn\">\n โ† Back to current\n </button>\n </div>\n )}\n </div>\n )\n}\n\nexport default VersionHistoryPanel\n"],"mappings":"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AAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAC1D;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAC1D;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACxD;AAAA,UAAM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D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,gBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,iBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,eAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","names":["import_core","import_core","import_core","import_core","import_core","import_core","ToolbarButton","import_react","import_jsx_runtime","editor","exports","isHotkey","check","import_react","import_jsx_runtime","toggleMark","toggleBlock","isMarkActive","isBlockActive","SlateElement","import_react","import_slate","import_slate_react","import_jsx_runtime","SlateElement","isHotkey","import_react","import_rich_text","import_lexical","import_jsx_runtime","ToolbarButton","icons","import_react","import_rich_text","import_list","import_link","import_code","import_table","import_LexicalHorizontalRuleNode","import_lexical","import_jsx_runtime","import_react","TipTapEditorComponent","SlateEditorComponent","LexicalEditorComponent","import_jsx_runtime","import_react","import_extension_document","import_extension_paragraph","import_extension_text","import_extension_bold","import_extension_italic","import_extension_underline","import_extension_strike","import_extension_code","import_extension_code_block_lowlight","import_extension_subscript","import_extension_superscript","import_extension_text_style","import_extension_font_family","import_extension_color","import_extension_highlight","import_extension_text_align","import_extension_heading","import_extension_bullet_list","import_extension_ordered_list","import_extension_list_item","import_extension_blockquote","import_extension_horizontal_rule","import_extension_link","import_extension_image","import_extension_table","import_extension_table_row","import_extension_table_cell","import_extension_table_header","import_extension_history","import_extension_placeholder","import_extension_character_count","import_extension_gapcursor","import_extension_dropcursor","import_extension_hard_break","import_lowlight","import_react","import_jsx_runtime","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","EmojiPicker","ToolbarButton","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","import_jsx_runtime","lowlight","toolbarPresets","editor","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","initialState","import_react","import_jsx_runtime","import_react","import_jsx_runtime","initialState","generateId","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/extensions/FontSize.ts","../src/extensions/LineHeight.ts","../src/extensions/Video.ts","../src/extensions/Emoji.ts","../src/extensions/Fullscreen.ts","../src/extensions/Print.ts","../src/extensions/Indent.ts","../src/adapters/tiptap/TipTapToolbar.tsx","../src/adapters/tiptap/TipTapEditorComponent.tsx","../node_modules/is-hotkey/lib/index.js","../src/adapters/slate/SlateToolbar.tsx","../src/adapters/slate/SlateEditorComponent.tsx","../src/adapters/lexical/LexicalToolbar.tsx","../src/adapters/lexical/LexicalEditorComponent.tsx","../src/index.tsx","../src/components/UnifiedEditor.tsx","../src/core/registry.ts","../src/core/presets.ts","../src/core/types.ts","../src/adapters/tiptap/TipTapAdapter.ts","../src/adapters/tiptap/index.ts","../src/adapters/slate/SlateAdapter.ts","../src/adapters/lexical/LexicalAdapter.ts","../src/components/RichTextEditor.tsx","../src/components/Toolbar.tsx","../src/collaboration/CollaborationContext.tsx","../src/collaboration/PresenceIndicator.tsx","../src/comments/types.ts","../src/comments/CommentsContext.tsx","../src/comments/CommentsPanel.tsx","../src/history/VersionHistoryContext.tsx","../src/history/VersionHistoryPanel.tsx"],"sourcesContent":["import { Extension } from '@tiptap/core'\n\nexport type FontSizeOptions = {\n types: string[]\n}\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<FontSizeOptions>({\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) =>\n 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 return chain().setMark('textStyle', { fontSize }).run()\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain()\n .setMark('textStyle', { fontSize: null })\n .removeEmptyTextStyle()\n .run()\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport type LineHeightOptions = {\n types: string[]\n defaultLineHeight: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n lineHeight: {\n /**\n * Set the line height\n */\n setLineHeight: (lineHeight: string) => ReturnType\n /**\n * Unset the line height\n */\n unsetLineHeight: () => ReturnType\n }\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading'],\n defaultLineHeight: 'normal',\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) =>\n element.style.lineHeight || this.options.defaultLineHeight,\n renderHTML: (attributes) => {\n if (!attributes.lineHeight) {\n return {}\n }\n\n return {\n style: `line-height: ${attributes.lineHeight}`,\n }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight) =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.updateAttributes(type, { lineHeight }),\n )\n },\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every((type) =>\n commands.resetAttributes(type, 'lineHeight'),\n )\n },\n }\n },\n})\n","import { Node, mergeAttributes } from '@tiptap/core'\n\nexport interface VideoOptions {\n inline: boolean\n allowBase64: boolean\n HTMLAttributes: Record<string, unknown>\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n video: {\n /**\n * Insert a video\n */\n setVideo: (options: { src: string; alt?: string; title?: string }) => ReturnType\n }\n }\n}\n\nexport const Video = Node.create<VideoOptions>({\n name: 'video',\n\n addOptions() {\n return {\n inline: false,\n allowBase64: false,\n HTMLAttributes: {},\n }\n },\n\n inline() {\n return this.options.inline\n },\n\n group() {\n return this.options.inline ? 'inline' : 'block'\n },\n\n draggable: true,\n\n addAttributes() {\n return {\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n },\n height: {\n default: null,\n },\n controls: {\n default: true,\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'video',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'video',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ['source', { src: HTMLAttributes.src }],\n ]\n },\n\n addCommands() {\n return {\n setVideo:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface EmojiOptions {\n enableEmoticons: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n emoji: {\n /**\n * Insert an emoji at the current position\n */\n insertEmoji: (emoji: string) => ReturnType\n }\n }\n}\n\n// Common emoji categories\nexport const EMOJI_CATEGORIES = {\n smileys: {\n label: 'Smileys & People',\n emojis: [\n '๐Ÿ˜€', '๐Ÿ˜ƒ', '๐Ÿ˜„', '๐Ÿ˜', '๐Ÿ˜†', '๐Ÿ˜…', '๐Ÿคฃ', '๐Ÿ˜‚', '๐Ÿ™‚', '๐Ÿ™ƒ',\n '๐Ÿ˜‰', '๐Ÿ˜Š', '๐Ÿ˜‡', '๐Ÿฅฐ', '๐Ÿ˜', '๐Ÿคฉ', '๐Ÿ˜˜', '๐Ÿ˜—', '๐Ÿ˜š', '๐Ÿ˜™',\n '๐Ÿฅฒ', '๐Ÿ˜‹', '๐Ÿ˜›', '๐Ÿ˜œ', '๐Ÿคช', '๐Ÿ˜', '๐Ÿค‘', '๐Ÿค—', '๐Ÿคญ', '๐Ÿคซ',\n '๐Ÿค”', '๐Ÿค', '๐Ÿคจ', '๐Ÿ˜', '๐Ÿ˜‘', '๐Ÿ˜ถ', '๐Ÿ˜', '๐Ÿ˜’', '๐Ÿ™„', '๐Ÿ˜ฌ',\n '๐Ÿ˜ฎโ€๐Ÿ’จ', '๐Ÿคฅ', '๐Ÿ˜Œ', '๐Ÿ˜”', '๐Ÿ˜ช', '๐Ÿคค', '๐Ÿ˜ด', '๐Ÿ˜ท', '๐Ÿค’', '๐Ÿค•',\n '๐Ÿคข', '๐Ÿคฎ', '๐Ÿคง', '๐Ÿฅต', '๐Ÿฅถ', '๐Ÿฅด', '๐Ÿ˜ต', '๐Ÿคฏ', '๐Ÿค ', '๐Ÿฅณ',\n '๐Ÿฅธ', '๐Ÿ˜Ž', '๐Ÿค“', '๐Ÿง', '๐Ÿ˜•', '๐Ÿ˜Ÿ', '๐Ÿ™', 'โ˜น๏ธ', '๐Ÿ˜ฎ', '๐Ÿ˜ฏ',\n '๐Ÿ˜ฒ', '๐Ÿ˜ณ', '๐Ÿฅบ', '๐Ÿ˜ฆ', '๐Ÿ˜ง', '๐Ÿ˜จ', '๐Ÿ˜ฐ', '๐Ÿ˜ฅ', '๐Ÿ˜ข', '๐Ÿ˜ญ',\n '๐Ÿ˜ฑ', '๐Ÿ˜–', '๐Ÿ˜ฃ', '๐Ÿ˜ž', '๐Ÿ˜“', '๐Ÿ˜ฉ', '๐Ÿ˜ซ', '๐Ÿฅฑ', '๐Ÿ˜ค', '๐Ÿ˜ก',\n '๐Ÿ˜ ', '๐Ÿคฌ', '๐Ÿ˜ˆ', '๐Ÿ‘ฟ', '๐Ÿ’€', 'โ˜ ๏ธ', '๐Ÿ’ฉ', '๐Ÿคก', '๐Ÿ‘น', '๐Ÿ‘บ',\n ]\n },\n gestures: {\n label: 'Gestures & Body',\n emojis: [\n '๐Ÿ‘‹', '๐Ÿคš', '๐Ÿ–๏ธ', 'โœ‹', '๐Ÿ––', '๐Ÿ‘Œ', '๐ŸคŒ', '๐Ÿค', 'โœŒ๏ธ', '๐Ÿคž',\n '๐ŸคŸ', '๐Ÿค˜', '๐Ÿค™', '๐Ÿ‘ˆ', '๐Ÿ‘‰', '๐Ÿ‘†', '๐Ÿ–•', '๐Ÿ‘‡', 'โ˜๏ธ', '๐Ÿ‘',\n '๐Ÿ‘Ž', 'โœŠ', '๐Ÿ‘Š', '๐Ÿค›', '๐Ÿคœ', '๐Ÿ‘', '๐Ÿ™Œ', '๐Ÿ‘', '๐Ÿคฒ', '๐Ÿค',\n '๐Ÿ™', 'โœ๏ธ', '๐Ÿ’…', '๐Ÿคณ', '๐Ÿ’ช', '๐Ÿฆพ', '๐Ÿฆฟ', '๐Ÿฆต', '๐Ÿฆถ', '๐Ÿ‘‚',\n '๐Ÿฆป', '๐Ÿ‘ƒ', '๐Ÿง ', '๐Ÿซ€', '๐Ÿซ', '๐Ÿฆท', '๐Ÿฆด', '๐Ÿ‘€', '๐Ÿ‘๏ธ', '๐Ÿ‘…',\n '๐Ÿ‘„', '๐Ÿ’‹', '๐Ÿฉธ',\n ]\n },\n animals: {\n label: 'Animals & Nature',\n emojis: [\n '๐Ÿถ', '๐Ÿฑ', '๐Ÿญ', '๐Ÿน', '๐Ÿฐ', '๐ŸฆŠ', '๐Ÿป', '๐Ÿผ', '๐Ÿปโ€โ„๏ธ', '๐Ÿจ',\n '๐Ÿฏ', '๐Ÿฆ', '๐Ÿฎ', '๐Ÿท', '๐Ÿธ', '๐Ÿต', '๐Ÿ™ˆ', '๐Ÿ™‰', '๐Ÿ™Š', '๐Ÿ’',\n '๐Ÿ”', '๐Ÿง', '๐Ÿฆ', '๐Ÿค', '๐Ÿฃ', '๐Ÿฅ', '๐Ÿฆ†', '๐Ÿฆ…', '๐Ÿฆ‰', '๐Ÿฆ‡',\n '๐Ÿบ', '๐Ÿ—', '๐Ÿด', '๐Ÿฆ„', '๐Ÿ', '๐Ÿ›', '๐Ÿฆ‹', '๐ŸŒ', '๐Ÿž', '๐Ÿœ',\n '๐ŸฆŸ', '๐Ÿฆ—', '๐Ÿฆ‚', '๐Ÿข', '๐Ÿ', '๐ŸฆŽ', '๐Ÿฆ–', '๐Ÿฆ•', '๐Ÿ™', '๐Ÿฆ‘',\n '๐Ÿฆ', '๐Ÿฆž', '๐Ÿฆ€', '๐Ÿก', '๐Ÿ ', '๐ŸŸ', '๐Ÿฌ', '๐Ÿณ', '๐Ÿ‹', '๐Ÿฆˆ',\n '๐ŸŠ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฆ“', '๐Ÿฆ', '๐Ÿฆง', '๐Ÿฆฃ', '๐Ÿ˜', '๐Ÿฆ›', '๐Ÿฆ',\n '๐ŸŒธ', '๐ŸŒบ', '๐ŸŒป', '๐ŸŒผ', '๐ŸŒท', '๐ŸŒน', '๐Ÿฅ€', '๐ŸŒต', '๐ŸŒฒ', '๐ŸŒณ',\n '๐ŸŒด', '๐ŸŒฑ', '๐ŸŒฟ', 'โ˜˜๏ธ', '๐Ÿ€', '๐Ÿ', '๐Ÿ‚', '๐Ÿƒ', '๐Ÿ„', '๐ŸŒพ',\n ]\n },\n food: {\n label: 'Food & Drink',\n emojis: [\n '๐ŸŽ', '๐Ÿ', '๐ŸŠ', '๐Ÿ‹', '๐ŸŒ', '๐Ÿ‰', '๐Ÿ‡', '๐Ÿ“', '๐Ÿซ', '๐Ÿˆ',\n '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅญ', '๐Ÿ', '๐Ÿฅฅ', '๐Ÿฅ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฅ‘', '๐Ÿฅฆ',\n '๐Ÿฅฌ', '๐Ÿฅ’', '๐ŸŒถ๏ธ', '๐Ÿซ‘', '๐ŸŒฝ', '๐Ÿฅ•', '๐Ÿซ’', '๐Ÿง„', '๐Ÿง…', '๐Ÿฅ”',\n '๐Ÿ ', '๐Ÿฅ', '๐Ÿฅฏ', '๐Ÿž', '๐Ÿฅ–', '๐Ÿฅจ', '๐Ÿง€', '๐Ÿฅš', '๐Ÿณ', '๐Ÿงˆ',\n '๐Ÿฅž', '๐Ÿง‡', '๐Ÿฅ“', '๐Ÿฅฉ', '๐Ÿ—', '๐Ÿ–', '๐Ÿฆด', '๐ŸŒญ', '๐Ÿ”', '๐ŸŸ',\n '๐Ÿ•', '๐Ÿซ“', '๐Ÿฅช', '๐Ÿฅ™', '๐Ÿง†', '๐ŸŒฎ', '๐ŸŒฏ', '๐Ÿซ”', '๐Ÿฅ—', '๐Ÿฅ˜',\n '๐Ÿซ•', '๐Ÿ', '๐Ÿœ', '๐Ÿฒ', '๐Ÿ›', '๐Ÿฃ', '๐Ÿฑ', '๐ŸฅŸ', '๐Ÿฆช', '๐Ÿค',\n '๐Ÿ™', '๐Ÿš', '๐Ÿ˜', '๐Ÿฅ', '๐Ÿฅ ', '๐Ÿฅฎ', '๐Ÿข', '๐Ÿก', '๐Ÿง', '๐Ÿจ',\n '๐Ÿฆ', '๐Ÿฅง', '๐Ÿง', '๐Ÿฐ', '๐ŸŽ‚', '๐Ÿฎ', '๐Ÿญ', '๐Ÿฌ', '๐Ÿซ', '๐Ÿฟ',\n '๐Ÿฉ', '๐Ÿช', '๐ŸŒฐ', '๐Ÿฅœ', '๐Ÿฏ', 'โ˜•', '๐Ÿต', '๐Ÿงƒ', '๐Ÿฅค', '๐Ÿถ',\n '๐Ÿบ', '๐Ÿป', '๐Ÿฅ‚', '๐Ÿท', '๐Ÿฅƒ', '๐Ÿธ', '๐Ÿน', '๐Ÿง‰', '๐ŸงŠ',\n ]\n },\n activities: {\n label: 'Activities',\n emojis: [\n 'โšฝ', '๐Ÿ€', '๐Ÿˆ', 'โšพ', '๐ŸฅŽ', '๐ŸŽพ', '๐Ÿ', '๐Ÿ‰', '๐Ÿฅ', '๐ŸŽฑ',\n '๐Ÿช€', '๐Ÿ“', '๐Ÿธ', '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅ', '๐Ÿ', '๐Ÿชƒ', '๐Ÿฅ…', 'โ›ณ',\n '๐Ÿช', '๐Ÿน', '๐ŸŽฃ', '๐Ÿคฟ', '๐ŸฅŠ', '๐Ÿฅ‹', '๐ŸŽฝ', '๐Ÿ›น', '๐Ÿ›ผ', '๐Ÿ›ท',\n 'โ›ธ๏ธ', '๐ŸฅŒ', '๐ŸŽฟ', 'โ›ท๏ธ', '๐Ÿ‚', '๐Ÿช‚', '๐Ÿ‹๏ธ', '๐Ÿคผ', '๐Ÿคธ', 'โ›น๏ธ',\n '๐Ÿคบ', '๐Ÿคพ', '๐ŸŒ๏ธ', '๐Ÿ‡', '๐Ÿง˜', '๐Ÿ„', '๐ŸŠ', '๐Ÿคฝ', '๐Ÿšฃ', '๐Ÿง—',\n '๐Ÿšต', '๐Ÿšด', '๐Ÿ†', '๐Ÿฅ‡', '๐Ÿฅˆ', '๐Ÿฅ‰', '๐Ÿ…', '๐ŸŽ–๏ธ', '๐Ÿต๏ธ', '๐ŸŽ—๏ธ',\n '๐ŸŽซ', '๐ŸŽŸ๏ธ', '๐ŸŽช', '๐ŸŽญ', '๐ŸŽจ', '๐ŸŽฌ', '๐ŸŽค', '๐ŸŽง', '๐ŸŽผ', '๐ŸŽน',\n '๐Ÿฅ', '๐Ÿช˜', '๐ŸŽท', '๐ŸŽบ', '๐Ÿช—', '๐ŸŽธ', '๐Ÿช•', '๐ŸŽป', '๐ŸŽฒ', 'โ™Ÿ๏ธ',\n '๐ŸŽฏ', '๐ŸŽณ', '๐ŸŽฎ', '๐ŸŽฐ', '๐Ÿงฉ',\n ]\n },\n objects: {\n label: 'Objects',\n emojis: [\n 'โŒš', '๐Ÿ“ฑ', '๐Ÿ’ป', 'โŒจ๏ธ', '๐Ÿ–ฅ๏ธ', '๐Ÿ–จ๏ธ', '๐Ÿ–ฑ๏ธ', '๐Ÿ–ฒ๏ธ', '๐Ÿ•น๏ธ', '๐Ÿ—œ๏ธ',\n '๐Ÿ’ฝ', '๐Ÿ’พ', '๐Ÿ’ฟ', '๐Ÿ“€', '๐Ÿ“ผ', '๐Ÿ“ท', '๐Ÿ“ธ', '๐Ÿ“น', '๐ŸŽฅ', '๐Ÿ“ฝ๏ธ',\n '๐ŸŽž๏ธ', '๐Ÿ“ž', 'โ˜Ž๏ธ', '๐Ÿ“Ÿ', '๐Ÿ“ ', '๐Ÿ“บ', '๐Ÿ“ป', '๐ŸŽ™๏ธ', '๐ŸŽš๏ธ', '๐ŸŽ›๏ธ',\n '๐Ÿงญ', 'โฑ๏ธ', 'โฒ๏ธ', 'โฐ', '๐Ÿ•ฐ๏ธ', 'โŒ›', 'โณ', '๐Ÿ“ก', '๐Ÿ”‹', '๐Ÿ”Œ',\n '๐Ÿ’ก', '๐Ÿ”ฆ', '๐Ÿ•ฏ๏ธ', '๐Ÿช”', '๐Ÿงฏ', '๐Ÿ›ข๏ธ', '๐Ÿ’ธ', '๐Ÿ’ต', '๐Ÿ’ด', '๐Ÿ’ถ',\n '๐Ÿ’ท', '๐Ÿช™', '๐Ÿ’ฐ', '๐Ÿ’ณ', '๐Ÿงพ', '๐Ÿ’Ž', 'โš–๏ธ', '๐Ÿชœ', '๐Ÿงฐ', '๐Ÿช›',\n '๐Ÿ”ง', '๐Ÿ”จ', 'โš’๏ธ', '๐Ÿ› ๏ธ', 'โ›๏ธ', '๐Ÿชš', '๐Ÿ”ฉ', 'โš™๏ธ', '๐Ÿชค', '๐Ÿงฑ',\n 'โ›“๏ธ', '๐Ÿงฒ', '๐Ÿ”ซ', '๐Ÿ’ฃ', '๐Ÿงจ', '๐Ÿช“', '๐Ÿ”ช', '๐Ÿ—ก๏ธ', 'โš”๏ธ', '๐Ÿ›ก๏ธ',\n '๐Ÿšฌ', 'โšฐ๏ธ', '๐Ÿชฆ', 'โšฑ๏ธ', '๐Ÿบ', '๐Ÿ”ฎ', '๐Ÿ“ฟ', '๐Ÿงฟ', '๐Ÿ’ˆ', 'โš—๏ธ',\n '๐Ÿ”ญ', '๐Ÿ”ฌ', '๐Ÿ•ณ๏ธ', '๐Ÿฉน', '๐Ÿฉบ', '๐Ÿ’Š', '๐Ÿ’‰', '๐Ÿฉธ', '๐Ÿงฌ', '๐Ÿฆ ',\n '๐Ÿงซ', '๐Ÿงช', '๐ŸŒก๏ธ', '๐Ÿงน', '๐Ÿช ', '๐Ÿงบ', '๐Ÿงป', '๐Ÿšฝ', '๐Ÿšฐ', '๐Ÿšฟ',\n '๐Ÿ›', '๐Ÿ›€', '๐Ÿงผ', '๐Ÿชฅ', '๐Ÿช’', '๐Ÿงฝ', '๐Ÿชฃ', '๐Ÿงด', '๐Ÿ›Ž๏ธ', '๐Ÿ”‘',\n '๐Ÿ—๏ธ', '๐Ÿšช', '๐Ÿช‘', '๐Ÿ›‹๏ธ', '๐Ÿ›๏ธ', '๐Ÿ›Œ', '๐Ÿงธ', '๐Ÿช†', '๐Ÿ–ผ๏ธ', '๐Ÿชž',\n '๐ŸชŸ', '๐Ÿ›๏ธ', '๐Ÿ›’', '๐ŸŽ', '๐ŸŽˆ', '๐ŸŽ', '๐ŸŽ€', '๐Ÿช„', '๐Ÿช…', '๐ŸŽŠ',\n '๐ŸŽ‰', '๐ŸŽŽ', '๐Ÿฎ', '๐ŸŽ', '๐Ÿงง', 'โœ‰๏ธ', '๐Ÿ“ฉ', '๐Ÿ“จ', '๐Ÿ“ง', '๐Ÿ’Œ',\n '๐Ÿ“ฅ', '๐Ÿ“ค', '๐Ÿ“ฆ', '๐Ÿท๏ธ', '๐Ÿ“ช', '๐Ÿ“ซ', '๐Ÿ“ฌ', '๐Ÿ“ญ', '๐Ÿ“ฎ', '๐Ÿ“ฏ',\n '๐Ÿ“œ', '๐Ÿ“ƒ', '๐Ÿ“„', '๐Ÿ“‘', '๐Ÿงพ', '๐Ÿ“Š', '๐Ÿ“ˆ', '๐Ÿ“‰', '๐Ÿ—’๏ธ', '๐Ÿ—“๏ธ',\n '๐Ÿ“†', '๐Ÿ“…', '๐Ÿ—‘๏ธ', '๐Ÿ“‡', '๐Ÿ—ƒ๏ธ', '๐Ÿ—ณ๏ธ', '๐Ÿ—„๏ธ', '๐Ÿ“‹', '๐Ÿ“', '๐Ÿ“‚',\n '๐Ÿ—‚๏ธ', '๐Ÿ—ž๏ธ', '๐Ÿ“ฐ', '๐Ÿ““', '๐Ÿ“”', '๐Ÿ“’', '๐Ÿ“•', '๐Ÿ“—', '๐Ÿ“˜', '๐Ÿ“™',\n '๐Ÿ“š', '๐Ÿ“–', '๐Ÿ”–', '๐Ÿงท', '๐Ÿ”—', '๐Ÿ“Ž', '๐Ÿ–‡๏ธ', '๐Ÿ“', '๐Ÿ“', '๐Ÿงฎ',\n '๐Ÿ“Œ', '๐Ÿ“', 'โœ‚๏ธ', '๐Ÿ–Š๏ธ', '๐Ÿ–‹๏ธ', 'โœ’๏ธ', '๐Ÿ–Œ๏ธ', '๐Ÿ–๏ธ', '๐Ÿ“', 'โœ๏ธ',\n '๐Ÿ”', '๐Ÿ”Ž', '๐Ÿ”', '๐Ÿ”', '๐Ÿ”’', '๐Ÿ”“',\n ]\n },\n symbols: {\n label: 'Symbols',\n emojis: [\n 'โค๏ธ', '๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ', '๐Ÿ’”',\n 'โฃ๏ธ', '๐Ÿ’•', '๐Ÿ’ž', '๐Ÿ’“', '๐Ÿ’—', '๐Ÿ’–', '๐Ÿ’˜', '๐Ÿ’', '๐Ÿ’Ÿ', 'โ˜ฎ๏ธ',\n 'โœ๏ธ', 'โ˜ช๏ธ', '๐Ÿ•‰๏ธ', 'โ˜ธ๏ธ', 'โœก๏ธ', '๐Ÿ”ฏ', '๐Ÿ•Ž', 'โ˜ฏ๏ธ', 'โ˜ฆ๏ธ', '๐Ÿ›',\n 'โ›Ž', 'โ™ˆ', 'โ™‰', 'โ™Š', 'โ™‹', 'โ™Œ', 'โ™', 'โ™Ž', 'โ™', 'โ™',\n 'โ™‘', 'โ™’', 'โ™“', '๐Ÿ†”', 'โš›๏ธ', '๐Ÿ‰‘', 'โ˜ข๏ธ', 'โ˜ฃ๏ธ', '๐Ÿ“ด', '๐Ÿ“ณ',\n '๐Ÿˆถ', '๐Ÿˆš', '๐Ÿˆธ', '๐Ÿˆบ', '๐Ÿˆท๏ธ', 'โœด๏ธ', '๐Ÿ†š', '๐Ÿ’ฎ', '๐Ÿ‰', 'ใŠ™๏ธ',\n 'ใŠ—๏ธ', '๐Ÿˆด', '๐Ÿˆต', '๐Ÿˆน', '๐Ÿˆฒ', '๐Ÿ…ฐ๏ธ', '๐Ÿ…ฑ๏ธ', '๐Ÿ†Ž', '๐Ÿ†‘', '๐Ÿ…พ๏ธ',\n '๐Ÿ†˜', 'โŒ', 'โญ•', '๐Ÿ›‘', 'โ›”', '๐Ÿ“›', '๐Ÿšซ', '๐Ÿ’ฏ', '๐Ÿ’ข', 'โ™จ๏ธ',\n '๐Ÿšท', '๐Ÿšฏ', '๐Ÿšณ', '๐Ÿšฑ', '๐Ÿ”ž', '๐Ÿ“ต', '๐Ÿšญ', 'โ—', 'โ•', 'โ“',\n 'โ”', 'โ€ผ๏ธ', 'โ‰๏ธ', '๐Ÿ”…', '๐Ÿ”†', 'ใ€ฝ๏ธ', 'โš ๏ธ', '๐Ÿšธ', '๐Ÿ”ฑ', 'โšœ๏ธ',\n '๐Ÿ”ฐ', 'โ™ป๏ธ', 'โœ…', '๐Ÿˆฏ', '๐Ÿ’น', 'โ‡๏ธ', 'โœณ๏ธ', 'โŽ', '๐ŸŒ', '๐Ÿ’ ',\n 'โ“‚๏ธ', '๐ŸŒ€', '๐Ÿ’ค', '๐Ÿง', '๐Ÿšพ', 'โ™ฟ', '๐Ÿ…ฟ๏ธ', '๐Ÿ›—', '๐Ÿˆณ', '๐Ÿˆ‚๏ธ',\n '๐Ÿ›‚', '๐Ÿ›ƒ', '๐Ÿ›„', '๐Ÿ›…', '๐Ÿšน', '๐Ÿšบ', '๐Ÿšผ', 'โšง๏ธ', '๐Ÿšป', '๐Ÿšฎ',\n '๐ŸŽฆ', '๐Ÿ“ถ', '๐Ÿˆ', '๐Ÿ”ฃ', 'โ„น๏ธ', '๐Ÿ”ค', '๐Ÿ”ก', '๐Ÿ” ', '๐Ÿ†–', '๐Ÿ†—',\n '๐Ÿ†™', '๐Ÿ†’', '๐Ÿ†•', '๐Ÿ†“', '0๏ธโƒฃ', '1๏ธโƒฃ', '2๏ธโƒฃ', '3๏ธโƒฃ', '4๏ธโƒฃ', '5๏ธโƒฃ',\n '6๏ธโƒฃ', '7๏ธโƒฃ', '8๏ธโƒฃ', '9๏ธโƒฃ', '๐Ÿ”Ÿ', '๐Ÿ”ข', '#๏ธโƒฃ', '*๏ธโƒฃ', 'โ๏ธ', 'โ–ถ๏ธ',\n 'โธ๏ธ', 'โฏ๏ธ', 'โน๏ธ', 'โบ๏ธ', 'โญ๏ธ', 'โฎ๏ธ', 'โฉ', 'โช', 'โซ', 'โฌ',\n 'โ—€๏ธ', '๐Ÿ”ผ', '๐Ÿ”ฝ', 'โžก๏ธ', 'โฌ…๏ธ', 'โฌ†๏ธ', 'โฌ‡๏ธ', 'โ†—๏ธ', 'โ†˜๏ธ', 'โ†™๏ธ',\n 'โ†–๏ธ', 'โ†•๏ธ', 'โ†”๏ธ', 'โ†ช๏ธ', 'โ†ฉ๏ธ', 'โคด๏ธ', 'โคต๏ธ', '๐Ÿ”€', '๐Ÿ”', '๐Ÿ”‚',\n '๐Ÿ”„', '๐Ÿ”ƒ', '๐ŸŽต', '๐ŸŽถ', 'โž•', 'โž–', 'โž—', 'โœ–๏ธ', 'โ™พ๏ธ', '๐Ÿ’ฒ',\n '๐Ÿ’ฑ', 'โ„ข๏ธ', 'ยฉ๏ธ', 'ยฎ๏ธ', 'ใ€ฐ๏ธ', 'โžฐ', 'โžฟ', '๐Ÿ”š', '๐Ÿ”™', '๐Ÿ”›',\n '๐Ÿ”', '๐Ÿ”œ', 'โœ”๏ธ', 'โ˜‘๏ธ', '๐Ÿ”˜', '๐Ÿ”ด', '๐ŸŸ ', '๐ŸŸก', '๐ŸŸข', '๐Ÿ”ต',\n '๐ŸŸฃ', 'โšซ', 'โšช', '๐ŸŸค', '๐Ÿ”บ', '๐Ÿ”ป', '๐Ÿ”ธ', '๐Ÿ”น', '๐Ÿ”ถ', '๐Ÿ”ท',\n '๐Ÿ”ณ', '๐Ÿ”ฒ', 'โ–ช๏ธ', 'โ–ซ๏ธ', 'โ—พ', 'โ—ฝ', 'โ—ผ๏ธ', 'โ—ป๏ธ', '๐ŸŸฅ', '๐ŸŸง',\n '๐ŸŸจ', '๐ŸŸฉ', '๐ŸŸฆ', '๐ŸŸช', 'โฌ›', 'โฌœ', '๐ŸŸซ', '๐Ÿ”ˆ', '๐Ÿ”‡', '๐Ÿ”‰',\n '๐Ÿ”Š', '๐Ÿ””', '๐Ÿ”•', '๐Ÿ“ฃ', '๐Ÿ“ข', '๐Ÿ’ฌ', '๐Ÿ’ญ', '๐Ÿ—ฏ๏ธ', 'โ™ ๏ธ', 'โ™ฃ๏ธ',\n 'โ™ฅ๏ธ', 'โ™ฆ๏ธ', '๐Ÿƒ', '๐ŸŽด', '๐Ÿ€„', '๐Ÿ•', '๐Ÿ•‘', '๐Ÿ•’', '๐Ÿ•“', '๐Ÿ•”',\n '๐Ÿ••', '๐Ÿ•–', '๐Ÿ•—', '๐Ÿ•˜', '๐Ÿ•™', '๐Ÿ•š', '๐Ÿ•›', '๐Ÿ•œ', '๐Ÿ•', '๐Ÿ•ž',\n '๐Ÿ•Ÿ', '๐Ÿ• ', '๐Ÿ•ก', '๐Ÿ•ข', '๐Ÿ•ฃ', '๐Ÿ•ค', '๐Ÿ•ฅ', '๐Ÿ•ฆ', '๐Ÿ•ง',\n ]\n },\n flags: {\n label: 'Flags',\n emojis: [\n '๐Ÿณ๏ธ', '๐Ÿด', '๐Ÿดโ€โ˜ ๏ธ', '๐Ÿ', '๐Ÿšฉ', '๐ŸŽŒ', '๐Ÿณ๏ธโ€๐ŸŒˆ', '๐Ÿณ๏ธโ€โšง๏ธ',\n '๐Ÿ‡บ๐Ÿ‡ธ', '๐Ÿ‡ฌ๐Ÿ‡ง', '๐Ÿ‡จ๐Ÿ‡ฆ', '๐Ÿ‡ฆ๐Ÿ‡บ', '๐Ÿ‡ฎ๐Ÿ‡ณ', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‡จ๐Ÿ‡ณ', '๐Ÿ‡ฐ๐Ÿ‡ท',\n '๐Ÿ‡ฉ๐Ÿ‡ช', '๐Ÿ‡ซ๐Ÿ‡ท', '๐Ÿ‡ฎ๐Ÿ‡น', '๐Ÿ‡ช๐Ÿ‡ธ', '๐Ÿ‡ง๐Ÿ‡ท', '๐Ÿ‡ฒ๐Ÿ‡ฝ', '๐Ÿ‡ท๐Ÿ‡บ', '๐Ÿ‡ฟ๐Ÿ‡ฆ',\n ]\n }\n} as const\n\nexport const Emoji = Extension.create<EmojiOptions>({\n name: 'emoji',\n\n addOptions() {\n return {\n enableEmoticons: true,\n }\n },\n\n addCommands() {\n return {\n insertEmoji:\n (emoji: string) =>\n ({ commands }) => {\n return commands.insertContent(emoji)\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface FullscreenOptions {\n className: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fullscreen: {\n /**\n * Toggle fullscreen mode\n */\n toggleFullscreen: () => ReturnType\n /**\n * Enter fullscreen mode\n */\n enterFullscreen: () => ReturnType\n /**\n * Exit fullscreen mode\n */\n exitFullscreen: () => ReturnType\n }\n }\n}\n\nexport const Fullscreen = Extension.create<FullscreenOptions>({\n name: 'fullscreen',\n\n addOptions() {\n return {\n className: 'rte-builder-fullscreen',\n }\n },\n\n addStorage() {\n return {\n isFullscreen: false,\n }\n },\n\n addCommands() {\n return {\n toggleFullscreen:\n () =>\n ({ editor }) => {\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\n if (!wrapper) return false\n\n this.storage.isFullscreen = !this.storage.isFullscreen\n\n if (this.storage.isFullscreen) {\n wrapper.classList.add(this.options.className)\n document.body.style.overflow = 'hidden'\n } else {\n wrapper.classList.remove(this.options.className)\n document.body.style.overflow = ''\n }\n\n // Trigger re-render to update button state\n editor.view.dispatch(editor.state.tr)\n\n return true\n },\n enterFullscreen:\n () =>\n ({ editor }) => {\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\n if (!wrapper) return false\n\n this.storage.isFullscreen = true\n wrapper.classList.add(this.options.className)\n document.body.style.overflow = 'hidden'\n editor.view.dispatch(editor.state.tr)\n\n return true\n },\n exitFullscreen:\n () =>\n ({ editor }) => {\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\n if (!wrapper) return false\n\n this.storage.isFullscreen = false\n wrapper.classList.remove(this.options.className)\n document.body.style.overflow = ''\n editor.view.dispatch(editor.state.tr)\n\n return true\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n Escape: () => {\n if (this.storage.isFullscreen) {\n return this.editor.commands.exitFullscreen()\n }\n return false\n },\n 'Mod-Shift-f': () => {\n return this.editor.commands.toggleFullscreen()\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface PrintOptions {\n title?: string\n styles?: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n print: {\n /**\n * Print the editor content\n */\n print: () => ReturnType\n }\n }\n}\n\nconst defaultPrintStyles = `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #1f2937;\n padding: 20px;\n max-width: 800px;\n margin: 0 auto;\n }\n\n h1 { font-size: 2em; font-weight: 700; margin: 1em 0 0.5em; }\n h2 { font-size: 1.5em; font-weight: 700; margin: 0.83em 0 0.5em; }\n h3 { font-size: 1.25em; font-weight: 600; margin: 1em 0 0.5em; }\n h4 { font-size: 1.1em; font-weight: 600; margin: 1.33em 0 0.5em; }\n h5 { font-size: 1em; font-weight: 600; margin: 1.67em 0 0.5em; }\n h6 { font-size: 0.875em; font-weight: 600; margin: 2.33em 0 0.5em; }\n\n p { margin: 0 0 1em; }\n\n ul, ol { padding-left: 2em; margin: 0 0 1em; }\n ul { list-style-type: disc; }\n ol { list-style-type: decimal; }\n li { margin: 0.25em 0; }\n\n blockquote {\n border-left: 4px solid #3b82f6;\n padding-left: 1em;\n margin: 1em 0;\n color: #6b7280;\n font-style: italic;\n }\n\n code {\n background: #f3f4f6;\n color: #e11d48;\n padding: 2px 6px;\n border-radius: 3px;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9em;\n }\n\n pre {\n background: #1f2937;\n color: #f9fafb;\n padding: 1em;\n border-radius: 6px;\n overflow-x: auto;\n margin: 1em 0;\n }\n\n pre code {\n background: transparent;\n color: inherit;\n padding: 0;\n }\n\n a { color: #3b82f6; text-decoration: underline; }\n\n img, video {\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n display: block;\n margin: 1em 0;\n }\n\n hr {\n border: none;\n border-top: 2px solid #e5e7eb;\n margin: 2em 0;\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n }\n\n th, td {\n border: 1px solid #d1d5db;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n background: #f3f4f6;\n font-weight: 600;\n }\n\n mark {\n background-color: #fef08a;\n padding: 2px 0;\n }\n\n @media print {\n body {\n padding: 0;\n margin: 0;\n }\n\n pre {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n img, video {\n page-break-inside: avoid;\n }\n\n h1, h2, h3, h4, h5, h6 {\n page-break-after: avoid;\n }\n }\n`\n\nexport const Print = Extension.create<PrintOptions>({\n name: 'print',\n\n addOptions() {\n return {\n title: 'Print Document',\n styles: defaultPrintStyles,\n }\n },\n\n addCommands() {\n return {\n print:\n () =>\n ({ editor }) => {\n const content = editor.getHTML()\n const printWindow = window.open('', '_blank')\n\n if (!printWindow) {\n console.error('Failed to open print window. Please allow popups.')\n return false\n }\n\n const title = this.options.title || 'Print Document'\n const styles = this.options.styles || defaultPrintStyles\n\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${title}</title>\n <style>${styles}</style>\n </head>\n <body>\n ${content}\n </body>\n </html>\n `)\n\n printWindow.document.close()\n\n // Wait for content to load, then print\n printWindow.onload = () => {\n printWindow.focus()\n printWindow.print()\n // Close window after printing (optional - some browsers close automatically)\n // printWindow.close()\n }\n\n // Fallback for browsers that don't trigger onload\n setTimeout(() => {\n printWindow.focus()\n printWindow.print()\n }, 500)\n\n return true\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-p': () => {\n return this.editor.commands.print()\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\n\nexport interface IndentOptions {\n types: string[]\n minIndent: number\n maxIndent: number\n indentUnit: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n indent: {\n /**\n * Indent the current block\n */\n indent: () => ReturnType\n /**\n * Outdent the current block\n */\n outdent: () => ReturnType\n }\n }\n}\n\nexport const Indent = Extension.create<IndentOptions>({\n name: 'indent',\n\n addOptions() {\n return {\n types: ['paragraph', 'heading', 'blockquote'],\n minIndent: 0,\n maxIndent: 10,\n indentUnit: '2em',\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n indent: {\n default: 0,\n parseHTML: (element) => {\n const marginLeft = element.style.marginLeft\n if (marginLeft) {\n const match = marginLeft.match(/^(\\d+)/)\n if (match) {\n return parseInt(match[1], 10) / 2 // Assuming 2em per level\n }\n }\n return 0\n },\n renderHTML: (attributes) => {\n if (!attributes.indent || attributes.indent === 0) {\n return {}\n }\n\n return {\n style: `margin-left: ${attributes.indent * 2}em`,\n }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n indent:\n () =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n const { from, to } = selection\n\n let changed = false\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (this.options.types.includes(node.type.name)) {\n const currentIndent = node.attrs.indent || 0\n if (currentIndent < this.options.maxIndent) {\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n indent: currentIndent + 1,\n })\n }\n changed = true\n }\n }\n })\n\n return changed\n },\n\n outdent:\n () =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n const { from, to } = selection\n\n let changed = false\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (this.options.types.includes(node.type.name)) {\n const currentIndent = node.attrs.indent || 0\n if (currentIndent > this.options.minIndent) {\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n indent: currentIndent - 1,\n })\n }\n changed = true\n }\n }\n })\n\n return changed\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => this.editor.commands.indent(),\n 'Shift-Tab': () => this.editor.commands.outdent(),\n }\n },\n})\n","/**\n * TipTap Toolbar Component\n *\n * Toolbar implementation specific to TipTap editor.\n */\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport type { ToolbarButtonType } from \"../../core/types\";\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\n\ninterface TipTapToolbarProps {\n editor: Editor | null;\n buttons: ToolbarButtonType[];\n onMediaPickerImage?: () => void;\n onMediaPickerVideo?: () => void;\n}\n\nconst FONT_FAMILIES = [\n { value: \"Arial\", label: \"Arial\" },\n { value: \"Georgia\", label: \"Georgia\" },\n { value: \"Times New Roman\", label: \"Times New Roman\" },\n { value: \"Courier New\", label: \"Courier New\" },\n { value: \"Verdana\", label: \"Verdana\" },\n { value: \"Roboto\", label: \"Roboto\" },\n { value: \"Open Sans\", label: \"Open Sans\" },\n { value: \"Lato\", label: \"Lato\" },\n { value: \"Montserrat\", label: \"Montserrat\" },\n { value: \"Poppins\", label: \"Poppins\" },\n];\n\nconst FONT_SIZES = [\n \"8px\",\n \"10px\",\n \"12px\",\n \"14px\",\n \"16px\",\n \"18px\",\n \"20px\",\n \"24px\",\n \"30px\",\n \"36px\",\n \"48px\",\n \"60px\",\n \"72px\",\n];\n\nconst LINE_HEIGHTS = [\n { value: \"1\", label: \"Single\" },\n { value: \"1.15\", label: \"1.15\" },\n { value: \"1.5\", label: \"1.5\" },\n { value: \"1.75\", label: \"1.75\" },\n { value: \"2\", label: \"Double\" },\n { value: \"2.5\", label: \"2.5\" },\n { value: \"3\", label: \"Triple\" },\n];\n\n// Emoji Picker Component\nconst EmojiPicker: React.FC<{\n onSelect: (emoji: string) => void;\n onClose: () => void;\n}> = ({ onSelect, onClose }) => {\n const [activeCategory, setActiveCategory] =\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [onClose]);\n\n return (\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n type=\"button\"\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\n onClick={() =>\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\n }\n title={category.label}\n >\n {category.emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\n <button\n key={`${emoji}-${i}`}\n type=\"button\"\n className=\"rte-builder-emoji-btn\"\n onClick={() => {\n onSelect(emoji);\n onClose();\n }}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n );\n};\n\nexport const TipTapToolbar: React.FC<TipTapToolbarProps> = ({\n editor,\n buttons,\n onMediaPickerImage,\n onMediaPickerVideo,\n}) => {\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\n\n if (!editor) return null;\n\n const ToolbarButton = ({\n onClick,\n active = false,\n disabled = false,\n children,\n title,\n buttonRef,\n }: {\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n title?: string;\n buttonRef?: React.RefObject<HTMLButtonElement>;\n }) => (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\n >\n {children}\n </button>\n );\n\n const renderButton = (button: ToolbarButtonType, index: number) => {\n switch (button) {\n case \"bold\":\n return (\n <ToolbarButton\n key=\"bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={editor.isActive(\"bold\")}\n title=\"Bold (Ctrl+B)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"italic\":\n return (\n <ToolbarButton\n key=\"italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={editor.isActive(\"italic\")}\n title=\"Italic (Ctrl+I)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"underline\":\n return (\n <ToolbarButton\n key=\"underline\"\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive(\"underline\")}\n title=\"Underline (Ctrl+U)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"strike\":\n return (\n <ToolbarButton\n key=\"strike\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={editor.isActive(\"strike\")}\n title=\"Strikethrough\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"code\":\n return (\n <ToolbarButton\n key=\"code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n active={editor.isActive(\"code\")}\n title=\"Inline Code\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"16 18 22 12 16 6\"></polyline>\n <polyline points=\"8 6 2 12 8 18\"></polyline>\n </svg>\n </ToolbarButton>\n );\n\n case \"codeBlock\":\n return (\n <ToolbarButton\n key=\"codeBlock\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n active={editor.isActive(\"codeBlock\")}\n title=\"Code Block\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <polyline points=\"9 8 5 12 9 16\"></polyline>\n <polyline points=\"15 8 19 12 15 16\"></polyline>\n </svg>\n </ToolbarButton>\n );\n\n case \"subscript\":\n return (\n <ToolbarButton\n key=\"subscript\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={editor.isActive(\"subscript\")}\n title=\"Subscript\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M22 18h-2v1h3v1h-4v-2.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18v-1h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"superscript\":\n return (\n <ToolbarButton\n key=\"superscript\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={editor.isActive(\"superscript\")}\n title=\"Superscript\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M22 7h-2v1h3v1h-4V6.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18V4h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"clearFormatting\":\n return (\n <ToolbarButton\n key=\"clearFormatting\"\n onClick={() =>\n editor.chain().focus().clearNodes().unsetAllMarks().run()\n }\n title=\"Clear Formatting\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"fontFamily\":\n return (\n <select\n key=\"fontFamily\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetFontFamily().run();\n } else {\n editor.chain().focus().setFontFamily(e.target.value).run();\n }\n }}\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\n >\n <option value=\"default\">Font Family</option>\n {FONT_FAMILIES.map((font) => (\n <option key={font.value} value={font.value}>\n {font.label}\n </option>\n ))}\n </select>\n );\n\n case \"fontSize\":\n return (\n <select\n key=\"fontSize\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetFontSize().run();\n } else {\n editor.chain().focus().setFontSize(e.target.value).run();\n }\n }}\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\n >\n <option value=\"default\">Font Size</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n );\n\n case \"lineHeight\":\n return (\n <select\n key=\"lineHeight\"\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetLineHeight().run();\n } else {\n editor.chain().focus().setLineHeight(e.target.value).run();\n }\n }}\n value={\n editor.getAttributes(\"paragraph\").lineHeight ||\n editor.getAttributes(\"heading\").lineHeight ||\n \"default\"\n }\n title=\"Line Height\"\n >\n <option value=\"default\">Line Height</option>\n {LINE_HEIGHTS.map((lh) => (\n <option key={lh.value} value={lh.value}>\n {lh.label}\n </option>\n ))}\n </select>\n );\n\n case \"textColor\":\n const textPresetColors = [\"#11a161\", \"#85144b\", \"#ff851b\", \"#b10dc9\"];\n return (\n <span key=\"textColor\" className=\"rte-builder-toolbar-color-group\">\n {textPresetColors.map((color) => (\n <button\n key={`text-${color}`}\n className=\"rte-builder-color-preset\"\n style={{ backgroundColor: color }}\n onClick={() => editor.chain().focus().setColor(color).run()}\n title={`Text Color: ${color}`}\n type=\"button\"\n />\n ))}\n <span className=\"rte-builder-toolbar-color\">\n <label title=\"Custom Text Color\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\" />\n </svg>\n <input\n type=\"color\"\n onChange={(e) =>\n editor.chain().focus().setColor(e.target.value).run()\n }\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\n />\n </label>\n </span>\n </span>\n );\n\n case \"backgroundColor\":\n const bgPresetColors = [\"#11a161\", \"#85144b\", \"#ff851b\", \"#b10dc9\"];\n return (\n <span\n key=\"backgroundColor\"\n className=\"rte-builder-toolbar-color-group\"\n >\n {bgPresetColors.map((color) => (\n <button\n key={`bg-${color}`}\n className=\"rte-builder-color-preset rte-builder-color-preset-bg\"\n style={{ backgroundColor: color }}\n onClick={() =>\n editor.chain().focus().toggleHighlight({ color }).run()\n }\n title={`Highlight Color: ${color}`}\n type=\"button\"\n />\n ))}\n <span className=\"rte-builder-toolbar-color\">\n <label title=\"Custom Background Color\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z\" />\n <path d=\"M2 20h20v4H2z\" fillOpacity=\".36\" />\n </svg>\n <input\n type=\"color\"\n onChange={(e) =>\n editor\n .chain()\n .focus()\n .toggleHighlight({ color: e.target.value })\n .run()\n }\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\n />\n </label>\n </span>\n </span>\n );\n\n case \"alignLeft\":\n return (\n <ToolbarButton\n key=\"alignLeft\"\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\n active={editor.isActive({ textAlign: \"left\" })}\n title=\"Align Left\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"alignCenter\":\n return (\n <ToolbarButton\n key=\"alignCenter\"\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\n active={editor.isActive({ textAlign: \"center\" })}\n title=\"Align Center\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"alignRight\":\n return (\n <ToolbarButton\n key=\"alignRight\"\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\n active={editor.isActive({ textAlign: \"right\" })}\n title=\"Align Right\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"alignJustify\":\n return (\n <ToolbarButton\n key=\"alignJustify\"\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\n active={editor.isActive({ textAlign: \"justify\" })}\n title=\"Justify\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zM3 3v2h18V3H3z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"indent\":\n return (\n <ToolbarButton\n key=\"indent\"\n onClick={() => editor.chain().focus().indent().run()}\n title=\"Indent (Tab)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"outdent\":\n return (\n <ToolbarButton\n key=\"outdent\"\n onClick={() => editor.chain().focus().outdent().run()}\n title=\"Outdent (Shift+Tab)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"bulletList\":\n return (\n <ToolbarButton\n key=\"bulletList\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"orderedList\":\n return (\n <ToolbarButton\n key=\"orderedList\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"heading1\":\n case \"heading2\":\n case \"heading3\":\n case \"heading4\":\n case \"heading5\":\n case \"heading6\":\n const level = parseInt(button.replace(\"heading\", \"\")) as\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6;\n const headingIcons: Record<number, JSX.Element> = {\n 1: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z\" />\n </svg>\n ),\n 2: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2h-2v2h4v2H9v-4c0-1.1.9-2 2-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\" />\n </svg>\n ),\n 3: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2v0c1.1 0 2 .9 2 2v0c0 1.1-.9 2-2 2H9v-2h4v-2h-2v-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\" />\n </svg>\n ),\n 4: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 14h-2v-4H9V7h2v4h2V7h2v10z\" />\n </svg>\n ),\n 5: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .9 2 2v2c0 1.1-.9 2-2 2H9v-2h4v-2H9V7h6v2z\" />\n </svg>\n ),\n 6: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2h-2v-2h2V9H9v6h4c1.1 0 2-.9 2-2v-2c0-1.1-.9-2-2-2h-2V7h2c1.1 0 2 .9 2 2v2z\" />\n </svg>\n ),\n };\n return (\n <ToolbarButton\n key={button}\n onClick={() =>\n editor.chain().focus().toggleHeading({ level }).run()\n }\n active={editor.isActive(\"heading\", { level })}\n title={`Heading ${level}`}\n >\n {headingIcons[level]}\n </ToolbarButton>\n );\n\n case \"blockquote\":\n return (\n <ToolbarButton\n key=\"blockquote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={editor.isActive(\"blockquote\")}\n title=\"Blockquote\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"horizontalRule\":\n return (\n <ToolbarButton\n key=\"horizontalRule\"\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title=\"Horizontal Rule\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M4 11h16v2H4z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"link\":\n return (\n <ToolbarButton\n key=\"link\"\n onClick={() => {\n const url = window.prompt(\"Enter URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n active={editor.isActive(\"link\")}\n title=\"Insert Link\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"unlink\":\n return (\n <ToolbarButton\n key=\"unlink\"\n onClick={() => editor.chain().focus().unsetLink().run()}\n disabled={!editor.isActive(\"link\")}\n title=\"Remove Link\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11C3.29 8.12 2 9.91 2 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"image\":\n return (\n <ToolbarButton\n key=\"image\"\n onClick={() => {\n if (onMediaPickerImage) {\n onMediaPickerImage();\n } else {\n const url = window.prompt(\"Enter image URL:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }\n }}\n title=\"Insert Image\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"video\":\n return (\n <ToolbarButton\n key=\"video\"\n onClick={() => {\n if (onMediaPickerVideo) {\n onMediaPickerVideo();\n } else {\n const url = window.prompt(\"Enter video URL:\");\n if (url) {\n editor.chain().focus().setVideo({ src: url }).run();\n }\n }\n }}\n title=\"Insert Video\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"table\":\n return (\n <ToolbarButton\n key=\"table\"\n onClick={() =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run()\n }\n title=\"Insert Table\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 2v4H5V5h14zm0 6v4h-6v-4h6zM5 15v-4h6v4H5zm0 2h6v2H5v-2zm8 2v-2h6v2h-6z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"emoji\":\n return (\n <span key=\"emoji\" style={{ position: \"relative\" }}>\n <ToolbarButton\n buttonRef={emojiButtonRef}\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n active={showEmojiPicker}\n title=\"Insert Emoji\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\" />\n </svg>\n </ToolbarButton>\n {showEmojiPicker && (\n <EmojiPicker\n onSelect={(emoji) =>\n editor.chain().focus().insertEmoji(emoji).run()\n }\n onClose={() => setShowEmojiPicker(false)}\n />\n )}\n </span>\n );\n\n case \"fullscreen\":\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\n return (\n <ToolbarButton\n key=\"fullscreen\"\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\n active={isFullscreen}\n title={\n isFullscreen\n ? \"Exit Fullscreen (Esc)\"\n : \"Fullscreen (Ctrl+Shift+F)\"\n }\n >\n {isFullscreen ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\" />\n </svg>\n ) : (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" />\n </svg>\n )}\n </ToolbarButton>\n );\n\n case \"print\":\n return (\n <ToolbarButton\n key=\"print\"\n onClick={() => editor.chain().focus().print().run()}\n title=\"Print (Ctrl+P)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"undo\":\n return (\n <ToolbarButton\n key=\"undo\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo (Ctrl+Z)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"redo\":\n return (\n <ToolbarButton\n key=\"redo\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo (Ctrl+Y)\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n </svg>\n </ToolbarButton>\n );\n\n case \"separator\":\n return (\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n );\n\n default:\n return null;\n }\n };\n\n return <div className=\"rte-builder-toolbar\">{buttons.map(renderButton)}</div>;\n};\n\nexport default TipTapToolbar;\n","/**\n * TipTap Editor Component\n *\n * This is the actual TipTap editor implementation that conforms\n * to the adapter interface.\n */\n\nimport { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport { Document } from \"@tiptap/extension-document\";\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\nimport { Text } from \"@tiptap/extension-text\";\nimport { Bold } from \"@tiptap/extension-bold\";\nimport { Italic } from \"@tiptap/extension-italic\";\nimport { Underline } from \"@tiptap/extension-underline\";\nimport { Strike } from \"@tiptap/extension-strike\";\nimport { Code } from \"@tiptap/extension-code\";\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { FontFamily } from \"@tiptap/extension-font-family\";\nimport { Color } from \"@tiptap/extension-color\";\nimport { Highlight } from \"@tiptap/extension-highlight\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { Heading } from \"@tiptap/extension-heading\";\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\nimport { ListItem } from \"@tiptap/extension-list-item\";\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\nimport { Link } from \"@tiptap/extension-link\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport { History } from \"@tiptap/extension-history\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\nimport { common, createLowlight } from \"lowlight\";\n\n// Custom extensions\nimport { FontSize } from \"../../extensions/FontSize\";\nimport { LineHeight } from \"../../extensions/LineHeight\";\nimport { Video } from \"../../extensions/Video\";\nimport { Emoji } from \"../../extensions/Emoji\";\nimport { Fullscreen } from \"../../extensions/Fullscreen\";\nimport { Print } from \"../../extensions/Print\";\nimport { Indent } from \"../../extensions/Indent\";\n\n// Toolbar\nimport { TipTapToolbar } from \"./TipTapToolbar\";\n\n// Types\nimport type { AdapterComponentProps, AdapterEditorRef } from \"../../core/types\";\n\n// Create lowlight instance\nconst lowlight = createLowlight(common);\n\ninterface TipTapEditorComponentProps extends AdapterComponentProps {}\n\nexport const TipTapEditorComponent = forwardRef<\n AdapterEditorRef,\n TipTapEditorComponentProps\n>(\n (\n {\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n placeholder = \"Start typing...\",\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarButtons,\n className = \"\",\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = \"javascript\",\n editorConfig = {},\n },\n ref,\n ) => {\n // Initialize editor\n const editor = useEditor({\n extensions: [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n enableCodeHighlight\n ? CodeBlockLowlight.configure({\n lowlight,\n defaultLanguage: defaultCodeLanguage,\n })\n : CodeBlockLowlight.configure({\n lowlight: null as any,\n }),\n Subscript,\n Superscript,\n TextStyle,\n FontFamily,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n LineHeight,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Heading.configure({\n levels: [1, 2, 3, 4, 5, 6],\n }),\n BulletList,\n OrderedList,\n ListItem,\n Blockquote,\n HorizontalRule,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Image.configure({\n inline: false,\n allowBase64: true,\n }),\n Video,\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableCell,\n TableHeader,\n History,\n Placeholder.configure({\n placeholder,\n }),\n CharacterCount.configure({\n limit: charCounterMax > 0 ? charCounterMax : undefined,\n }),\n Gapcursor,\n Dropcursor,\n HardBreak,\n Emoji,\n Fullscreen,\n Print,\n Indent,\n ],\n content: value,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n onChange?.(html);\n },\n onBlur: () => {\n onBlur?.();\n },\n onFocus: () => {\n onFocus?.();\n },\n editorProps: {\n attributes: {\n class: \"rte-builder-content\",\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\n },\n },\n ...editorConfig,\n });\n\n // Update content when value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n // Update editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!disabled && !readOnly);\n }\n }, [disabled, readOnly, editor]);\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage && editor) {\n const file = await onMediaPickerImage();\n if (file) {\n editor\n .chain()\n .focus()\n .setImage({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerImage, editor]);\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo && editor) {\n const file = await onMediaPickerVideo();\n if (file) {\n editor\n .chain()\n .focus()\n .setVideo({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerVideo, editor]);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => {\n return editor?.getHTML() || \"\";\n },\n getText: () => {\n return editor?.getText() || \"\";\n },\n getJSON: () => {\n return editor?.getJSON();\n },\n setContent: (html: string) => {\n editor?.commands.setContent(html);\n },\n focus: () => {\n editor?.commands.focus();\n },\n blur: () => {\n editor?.commands.blur();\n },\n insertHTML: (html: string) => {\n editor?.commands.insertContent(html);\n },\n insertText: (text: string) => {\n editor?.commands.insertContent(text);\n },\n clear: () => {\n editor?.commands.clearContent();\n },\n isEmpty: () => {\n return editor?.isEmpty ?? true;\n },\n getCharacterCount: () => {\n return editor?.storage.characterCount?.characters() || 0;\n },\n getWordCount: () => {\n return editor?.storage.characterCount?.words() || 0;\n },\n isFullscreen: () => {\n return editor?.storage.fullscreen?.isFullscreen || false;\n },\n toggleFullscreen: () => {\n editor?.commands.toggleFullscreen();\n },\n print: () => {\n editor?.commands.print();\n },\n undo: () => {\n editor?.commands.undo();\n },\n redo: () => {\n editor?.commands.redo();\n },\n canUndo: () => {\n return editor?.can().undo() ?? false;\n },\n canRedo: () => {\n return editor?.can().redo() ?? false;\n },\n getNativeEditor: () => {\n return editor;\n },\n }));\n\n if (!editor) {\n return null;\n }\n\n const characterCount = editor.storage.characterCount?.characters() || 0;\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\n\n return (\n <div\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\n >\n <TipTapToolbar\n editor={editor}\n buttons={toolbarButtons}\n onMediaPickerImage={\n onMediaPickerImage ? handleMediaPickerImage : undefined\n }\n onMediaPickerVideo={\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\n }\n />\n <div\n className=\"rte-builder-container\"\n style={{ height: `${height}px` }}\n >\n <EditorContent editor={editor} />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\">\n {\" \"}\n (limit exceeded)\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nTipTapEditorComponent.displayName = \"TipTapEditorComponent\";\n\nexport default TipTapEditorComponent;\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\n/**\n * Constants.\n */\n\nvar IS_MAC = typeof window != 'undefined' && /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\n\nvar MODIFIERS = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey'\n};\n\nvar ALIASES = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta'\n};\n\nvar CODES = {\n backspace: 8,\n tab: 9,\n enter: 13,\n shift: 16,\n control: 17,\n alt: 18,\n pause: 19,\n capslock: 20,\n escape: 27,\n ' ': 32,\n pageup: 33,\n pagedown: 34,\n end: 35,\n home: 36,\n arrowleft: 37,\n arrowup: 38,\n arrowright: 39,\n arrowdown: 40,\n insert: 45,\n delete: 46,\n meta: 91,\n numlock: 144,\n scrolllock: 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n '\\'': 222\n};\n\nfor (var f = 1; f < 20; f++) {\n CODES['f' + f] = 111 + f;\n}\n\n/**\n * Is hotkey?\n */\n\nfunction isHotkey(hotkey, options, event) {\n if (options && !('byKey' in options)) {\n event = options;\n options = null;\n }\n\n if (!Array.isArray(hotkey)) {\n hotkey = [hotkey];\n }\n\n var array = hotkey.map(function (string) {\n return parseHotkey(string, options);\n });\n var check = function check(e) {\n return array.some(function (object) {\n return compareHotkey(object, e);\n });\n };\n var ret = event == null ? check : check(event);\n return ret;\n}\n\nfunction isCodeHotkey(hotkey, event) {\n return isHotkey(hotkey, event);\n}\n\nfunction isKeyHotkey(hotkey, event) {\n return isHotkey(hotkey, { byKey: true }, event);\n}\n\n/**\n * Parse.\n */\n\nfunction parseHotkey(hotkey, options) {\n var byKey = options && options.byKey;\n var ret = {};\n\n // Special case to handle the `+` key since we use it as a separator.\n hotkey = hotkey.replace('++', '+add');\n var values = hotkey.split('+');\n var length = values.length;\n\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n\n for (var k in MODIFIERS) {\n ret[MODIFIERS[k]] = false;\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var value = _step.value;\n\n var optional = value.endsWith('?') && value.length > 1;\n\n if (optional) {\n value = value.slice(0, -1);\n }\n\n var name = toKeyName(value);\n var modifier = MODIFIERS[name];\n\n if (value.length > 1 && !modifier && !ALIASES[value] && !CODES[name]) {\n throw new TypeError('Unknown modifier: \"' + value + '\"');\n }\n\n if (length === 1 || !modifier) {\n if (byKey) {\n ret.key = name;\n } else {\n ret.which = toKeyCode(value);\n }\n }\n\n if (modifier) {\n ret[modifier] = optional ? null : true;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return ret;\n}\n\n/**\n * Compare.\n */\n\nfunction compareHotkey(object, event) {\n for (var key in object) {\n var expected = object[key];\n var actual = void 0;\n\n if (expected == null) {\n continue;\n }\n\n if (key === 'key' && event.key != null) {\n actual = event.key.toLowerCase();\n } else if (key === 'which') {\n actual = expected === 91 && event.which === 93 ? 91 : event.which;\n } else {\n actual = event[key];\n }\n\n if (actual == null && expected === false) {\n continue;\n }\n\n if (actual !== expected) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Utils.\n */\n\nfunction toKeyCode(name) {\n name = toKeyName(name);\n var code = CODES[name] || name.toUpperCase().charCodeAt(0);\n return code;\n}\n\nfunction toKeyName(name) {\n name = name.toLowerCase();\n name = ALIASES[name] || name;\n return name;\n}\n\n/**\n * Export.\n */\n\nexports.default = isHotkey;\nexports.isHotkey = isHotkey;\nexports.isCodeHotkey = isCodeHotkey;\nexports.isKeyHotkey = isKeyHotkey;\nexports.parseHotkey = parseHotkey;\nexports.compareHotkey = compareHotkey;\nexports.toKeyCode = toKeyCode;\nexports.toKeyName = toKeyName;","/**\n * Slate.js Toolbar Component\n *\n * A toolbar component for the Slate.js editor with all standard formatting options.\n */\n\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\nimport { Editor, Transforms, Element as SlateElement } from \"slate\";\nimport { useSlate, ReactEditor } from \"slate-react\";\n\nimport type { ToolbarButtonType } from \"../../core/types\";\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface SlateToolbarProps {\n editor: Editor;\n buttons?: ToolbarButtonType[];\n onMediaPickerImage?: () => Promise<void>;\n onMediaPickerVideo?: () => Promise<void>;\n onToggleFullscreen?: () => void;\n onPrint?: () => void;\n isFullscreen?: boolean;\n toggleMark: (editor: Editor, format: string) => void;\n toggleBlock: (editor: Editor, format: string) => void;\n isMarkActive: (editor: Editor, format: string) => boolean;\n isBlockActive: (\n editor: Editor,\n format: string,\n blockType?: \"type\" | \"align\",\n ) => boolean;\n}\n\n// ============================================================================\n// TOOLBAR BUTTON COMPONENT\n// ============================================================================\n\ninterface ToolbarButtonProps {\n active?: boolean;\n disabled?: boolean;\n onClick: () => void;\n title: string;\n children: React.ReactNode;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n active = false,\n disabled = false,\n onClick,\n title,\n children,\n}) => (\n <button\n className={`rte-builder-toolbar-button ${active ? \"active\" : \"\"}`}\n onClick={(e) => {\n e.preventDefault();\n onClick();\n }}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {children}\n </button>\n);\n\n// ============================================================================\n// TOOLBAR ICONS (Simple SVG icons)\n// ============================================================================\n\nconst icons: Record<string, JSX.Element> = {\n bold: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"\n />\n </svg>\n ),\n italic: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"\n />\n </svg>\n ),\n underline: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"\n />\n </svg>\n ),\n strike: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"\n />\n </svg>\n ),\n code: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"\n />\n </svg>\n ),\n codeBlock: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9.5 8.5L7 14l2.5 2.5L8 18l-4-4 4-4 1.5 1.5zm7 5L15 18l4-4-4-4 1.5-1.5L19 11l-2.5 2.5z\"\n />\n </svg>\n ),\n subscript: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M22 18h-2v1h3v1h-4v-2.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18v-1h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"\n />\n </svg>\n ),\n superscript: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M22 7h-2v1h3v1h-4V6.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18V4h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"\n />\n </svg>\n ),\n clearFormatting: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z\"\n />\n </svg>\n ),\n fontFamily: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M9.93 13.5h4.14L12 7.98 9.93 13.5zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z\"\n />\n </svg>\n ),\n fontSize: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3v-3H3v3z\"\n />\n </svg>\n ),\n lineHeight: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M6 7h2.5L5 3.5 1.5 7H4v10H1.5L5 20.5 8.5 17H6V7zm4-2v2h12V5H10zm0 14h12v-2H10v2zm0-6h12v-2H10v2z\"\n />\n </svg>\n ),\n textColor: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"\n />\n </svg>\n ),\n backgroundColor: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5zM2 20h20v4H2v-4z\"\n />\n </svg>\n ),\n alignLeft: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"\n />\n </svg>\n ),\n alignCenter: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"\n />\n </svg>\n ),\n alignRight: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"\n />\n </svg>\n ),\n alignJustify: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"\n />\n </svg>\n ),\n indent: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\n />\n </svg>\n ),\n outdent: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\n />\n </svg>\n ),\n bulletList: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"\n />\n </svg>\n ),\n orderedList: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"\n />\n </svg>\n ),\n heading1: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z\"\n />\n </svg>\n ),\n heading2: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2h-2v2h4v2H9v-4c0-1.1.9-2 2-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"\n />\n </svg>\n ),\n heading3: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2v0c1.1 0 2 .9 2 2v1c0 1.1-.9 2-2 2H9v-2h4v-2h-2v-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"\n />\n </svg>\n ),\n blockquote: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </svg>\n ),\n horizontalRule: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path fill=\"currentColor\" d=\"M4 11h16v2H4z\" />\n </svg>\n ),\n link: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"\n />\n </svg>\n ),\n unlink: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11A4.991 4.991 0 002 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z\"\n />\n </svg>\n ),\n image: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"\n />\n </svg>\n ),\n video: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"\n />\n </svg>\n ),\n table: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z\"\n />\n </svg>\n ),\n emoji: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"\n />\n </svg>\n ),\n undo: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M12.5 8c-2.65 0-5.05 1.04-6.83 2.73L3 8v9h9l-3.01-3c1.37-1.12 3.11-1.8 5.01-1.8 3.33 0 6.17 2.11 7.22 5.06l1.98-.65C21.79 12.58 17.54 8 12.5 8z\"\n />\n </svg>\n ),\n redo: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22l1.98.65c1.05-3.19 4.05-5.47 7.98-5.47 1.9 0 3.64.68 5.01 1.8L13.5 15h9V6l-4.1 4.6z\"\n />\n </svg>\n ),\n fullscreen: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n ),\n print: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"\n />\n </svg>\n ),\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const SlateToolbar: React.FC<SlateToolbarProps> = ({\n editor,\n buttons = [],\n onMediaPickerImage,\n onMediaPickerVideo,\n onToggleFullscreen,\n onPrint,\n isFullscreen = false,\n toggleMark,\n toggleBlock,\n isMarkActive,\n isBlockActive,\n}) => {\n // Emoji picker state\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const [selectedEmojiCategory, setSelectedEmojiCategory] =\n useState<string>(\"smileys\");\n const emojiPickerRef = useRef<HTMLDivElement>(null);\n\n // Link dialog state\n const [showLinkDialog, setShowLinkDialog] = useState(false);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const linkDialogRef = useRef<HTMLDivElement>(null);\n\n // Color picker state\n const [showColorPicker, setShowColorPicker] = useState<\"text\" | \"bg\" | null>(\n null,\n );\n const colorPickerRef = useRef<HTMLDivElement>(null);\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n emojiPickerRef.current &&\n !emojiPickerRef.current.contains(event.target as Node)\n ) {\n setShowEmojiPicker(false);\n }\n if (\n linkDialogRef.current &&\n !linkDialogRef.current.contains(event.target as Node)\n ) {\n setShowLinkDialog(false);\n }\n if (\n colorPickerRef.current &&\n !colorPickerRef.current.contains(event.target as Node)\n ) {\n setShowColorPicker(null);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Insert emoji\n const insertEmoji = useCallback(\n (emoji: string) => {\n Transforms.insertText(editor, emoji);\n setShowEmojiPicker(false);\n ReactEditor.focus(editor);\n },\n [editor],\n );\n\n // Insert link\n const insertLink = useCallback(() => {\n if (linkUrl) {\n const link = {\n type: \"link\" as const,\n url: linkUrl,\n children: [{ text: linkUrl }],\n };\n Transforms.insertNodes(editor, link);\n setLinkUrl(\"\");\n setShowLinkDialog(false);\n ReactEditor.focus(editor);\n }\n }, [editor, linkUrl]);\n\n // Remove link\n const removeLink = useCallback(() => {\n Transforms.unwrapNodes(editor, {\n match: (n) =>\n !Editor.isEditor(n) && SlateElement.isElement(n) && n.type === \"link\",\n });\n }, [editor]);\n\n // Insert horizontal rule\n const insertHorizontalRule = useCallback(() => {\n const hr = { type: \"horizontal-rule\" as const, children: [{ text: \"\" }] };\n Transforms.insertNodes(editor, hr);\n Transforms.insertNodes(editor, {\n type: \"paragraph\",\n children: [{ text: \"\" }],\n });\n }, [editor]);\n\n // Insert table\n const insertTable = useCallback(() => {\n const table = {\n type: \"table\" as const,\n children: [\n {\n type: \"table-row\" as const,\n children: [\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\n ],\n },\n {\n type: \"table-row\" as const,\n children: [\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\n ],\n },\n ],\n };\n Transforms.insertNodes(editor, table);\n }, [editor]);\n\n // Set color\n const setColor = useCallback(\n (color: string, type: \"text\" | \"bg\") => {\n if (type === \"text\") {\n Editor.addMark(editor, \"color\", color);\n } else {\n Editor.addMark(editor, \"backgroundColor\", color);\n }\n setShowColorPicker(null);\n },\n [editor],\n );\n\n // Color palette\n const colors = [\n \"#000000\",\n \"#434343\",\n \"#666666\",\n \"#999999\",\n \"#b7b7b7\",\n \"#cccccc\",\n \"#d9d9d9\",\n \"#efefef\",\n \"#f3f3f3\",\n \"#ffffff\",\n \"#980000\",\n \"#ff0000\",\n \"#ff9900\",\n \"#ffff00\",\n \"#00ff00\",\n \"#00ffff\",\n \"#4a86e8\",\n \"#0000ff\",\n \"#9900ff\",\n \"#ff00ff\",\n \"#e6b8af\",\n \"#f4cccc\",\n \"#fce5cd\",\n \"#fff2cc\",\n \"#d9ead3\",\n \"#d0e0e3\",\n \"#c9daf8\",\n \"#cfe2f3\",\n \"#d9d2e9\",\n \"#ead1dc\",\n ];\n\n // Render toolbar button based on type\n const renderButton = (button: ToolbarButtonType, index: number) => {\n if (button === \"separator\") {\n return (\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n );\n }\n\n switch (button) {\n // Text formatting\n case \"bold\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"bold\")}\n onClick={() => toggleMark(editor, \"bold\")}\n title=\"Bold (Ctrl+B)\"\n >\n {icons.bold}\n </ToolbarButton>\n );\n case \"italic\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"italic\")}\n onClick={() => toggleMark(editor, \"italic\")}\n title=\"Italic (Ctrl+I)\"\n >\n {icons.italic}\n </ToolbarButton>\n );\n case \"underline\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"underline\")}\n onClick={() => toggleMark(editor, \"underline\")}\n title=\"Underline (Ctrl+U)\"\n >\n {icons.underline}\n </ToolbarButton>\n );\n case \"strike\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"strikethrough\")}\n onClick={() => toggleMark(editor, \"strikethrough\")}\n title=\"Strikethrough\"\n >\n {icons.strike}\n </ToolbarButton>\n );\n case \"code\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"code\")}\n onClick={() => toggleMark(editor, \"code\")}\n title=\"Code\"\n >\n {icons.code}\n </ToolbarButton>\n );\n case \"codeBlock\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"code-block\")}\n onClick={() => toggleBlock(editor, \"code-block\")}\n title=\"Code Block\"\n >\n {icons.codeBlock}\n </ToolbarButton>\n );\n case \"subscript\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"subscript\")}\n onClick={() => toggleMark(editor, \"subscript\")}\n title=\"Subscript\"\n >\n {icons.subscript}\n </ToolbarButton>\n );\n case \"superscript\":\n return (\n <ToolbarButton\n key={button}\n active={isMarkActive(editor, \"superscript\")}\n onClick={() => toggleMark(editor, \"superscript\")}\n title=\"Superscript\"\n >\n {icons.superscript}\n </ToolbarButton>\n );\n case \"clearFormatting\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => {\n Editor.removeMark(editor, \"bold\");\n Editor.removeMark(editor, \"italic\");\n Editor.removeMark(editor, \"underline\");\n Editor.removeMark(editor, \"strikethrough\");\n Editor.removeMark(editor, \"code\");\n Editor.removeMark(editor, \"subscript\");\n Editor.removeMark(editor, \"superscript\");\n Editor.removeMark(editor, \"color\");\n Editor.removeMark(editor, \"backgroundColor\");\n Editor.removeMark(editor, \"fontSize\");\n Editor.removeMark(editor, \"fontFamily\");\n }}\n title=\"Clear Formatting\"\n >\n {icons.clearFormatting}\n </ToolbarButton>\n );\n\n // Alignment\n case \"alignLeft\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"left\", \"align\")}\n onClick={() => toggleBlock(editor, \"left\")}\n title=\"Align Left\"\n >\n {icons.alignLeft}\n </ToolbarButton>\n );\n case \"alignCenter\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"center\", \"align\")}\n onClick={() => toggleBlock(editor, \"center\")}\n title=\"Align Center\"\n >\n {icons.alignCenter}\n </ToolbarButton>\n );\n case \"alignRight\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"right\", \"align\")}\n onClick={() => toggleBlock(editor, \"right\")}\n title=\"Align Right\"\n >\n {icons.alignRight}\n </ToolbarButton>\n );\n case \"alignJustify\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"justify\", \"align\")}\n onClick={() => toggleBlock(editor, \"justify\")}\n title=\"Justify\"\n >\n {icons.alignJustify}\n </ToolbarButton>\n );\n\n // Lists\n case \"bulletList\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"bulleted-list\")}\n onClick={() => toggleBlock(editor, \"bulleted-list\")}\n title=\"Bullet List\"\n >\n {icons.bulletList}\n </ToolbarButton>\n );\n case \"orderedList\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"numbered-list\")}\n onClick={() => toggleBlock(editor, \"numbered-list\")}\n title=\"Numbered List\"\n >\n {icons.orderedList}\n </ToolbarButton>\n );\n\n // Headings\n case \"heading1\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"heading\")}\n onClick={() => {\n Transforms.setNodes(editor, { type: \"heading\", level: 1 } as any);\n }}\n title=\"Heading 1\"\n >\n {icons.heading1}\n </ToolbarButton>\n );\n case \"heading2\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"heading\")}\n onClick={() => {\n Transforms.setNodes(editor, { type: \"heading\", level: 2 } as any);\n }}\n title=\"Heading 2\"\n >\n {icons.heading2}\n </ToolbarButton>\n );\n case \"heading3\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"heading\")}\n onClick={() => {\n Transforms.setNodes(editor, { type: \"heading\", level: 3 } as any);\n }}\n title=\"Heading 3\"\n >\n {icons.heading3}\n </ToolbarButton>\n );\n\n // Blocks\n case \"blockquote\":\n return (\n <ToolbarButton\n key={button}\n active={isBlockActive(editor, \"blockquote\")}\n onClick={() => toggleBlock(editor, \"blockquote\")}\n title=\"Blockquote\"\n >\n {icons.blockquote}\n </ToolbarButton>\n );\n case \"horizontalRule\":\n return (\n <ToolbarButton\n key={button}\n onClick={insertHorizontalRule}\n title=\"Horizontal Rule\"\n >\n {icons.horizontalRule}\n </ToolbarButton>\n );\n\n // Links\n case \"link\":\n return (\n <div\n key={button}\n className=\"rte-builder-toolbar-dropdown\"\n ref={linkDialogRef}\n >\n <ToolbarButton\n onClick={() => setShowLinkDialog(!showLinkDialog)}\n title=\"Insert Link\"\n >\n {icons.link}\n </ToolbarButton>\n {showLinkDialog && (\n <div className=\"rte-builder-toolbar-dropdown-content\">\n <input\n type=\"url\"\n placeholder=\"Enter URL...\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n insertLink();\n }\n }}\n autoFocus\n />\n <button onClick={insertLink}>Insert</button>\n </div>\n )}\n </div>\n );\n case \"unlink\":\n return (\n <ToolbarButton key={button} onClick={removeLink} title=\"Remove Link\">\n {icons.unlink}\n </ToolbarButton>\n );\n\n // Media\n case \"image\":\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerImage || (() => {})}\n disabled={!onMediaPickerImage}\n title=\"Insert Image\"\n >\n {icons.image}\n </ToolbarButton>\n );\n case \"video\":\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerVideo || (() => {})}\n disabled={!onMediaPickerVideo}\n title=\"Insert Video\"\n >\n {icons.video}\n </ToolbarButton>\n );\n case \"table\":\n return (\n <ToolbarButton\n key={button}\n onClick={insertTable}\n title=\"Insert Table\"\n >\n {icons.table}\n </ToolbarButton>\n );\n\n // Colors\n case \"textColor\":\n return (\n <div\n key={button}\n className=\"rte-builder-toolbar-dropdown\"\n ref={colorPickerRef}\n >\n <ToolbarButton\n onClick={() =>\n setShowColorPicker(showColorPicker === \"text\" ? null : \"text\")\n }\n title=\"Text Color\"\n >\n {icons.textColor}\n </ToolbarButton>\n {showColorPicker === \"text\" && (\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\n {colors.map((color) => (\n <button\n key={color}\n className=\"rte-builder-color-swatch\"\n style={{ backgroundColor: color }}\n onClick={() => setColor(color, \"text\")}\n title={color}\n />\n ))}\n </div>\n )}\n </div>\n );\n case \"backgroundColor\":\n return (\n <div\n key={button}\n className=\"rte-builder-toolbar-dropdown\"\n ref={colorPickerRef}\n >\n <ToolbarButton\n onClick={() =>\n setShowColorPicker(showColorPicker === \"bg\" ? null : \"bg\")\n }\n title=\"Background Color\"\n >\n {icons.backgroundColor}\n </ToolbarButton>\n {showColorPicker === \"bg\" && (\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\n {colors.map((color) => (\n <button\n key={color}\n className=\"rte-builder-color-swatch\"\n style={{ backgroundColor: color }}\n onClick={() => setColor(color, \"bg\")}\n title={color}\n />\n ))}\n </div>\n )}\n </div>\n );\n\n // Emoji\n case \"emoji\":\n return (\n <div\n key={button}\n className=\"rte-builder-toolbar-dropdown\"\n ref={emojiPickerRef}\n >\n <ToolbarButton\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n title=\"Insert Emoji\"\n >\n {icons.emoji}\n </ToolbarButton>\n {showEmojiPicker && (\n <div className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? \"active\" : \"\"}`}\n onClick={() => setSelectedEmojiCategory(key)}\n title={(category as any).label}\n >\n {(category as any).emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {(\n EMOJI_CATEGORIES[\n selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES\n ] as any\n )?.emojis.map((emoji: string, idx: number) => (\n <button\n key={idx}\n className=\"rte-builder-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n // Actions\n case \"undo\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.undo()}\n title=\"Undo (Ctrl+Z)\"\n >\n {icons.undo}\n </ToolbarButton>\n );\n case \"redo\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.redo()}\n title=\"Redo (Ctrl+Y)\"\n >\n {icons.redo}\n </ToolbarButton>\n );\n case \"fullscreen\":\n return (\n <ToolbarButton\n key={button}\n active={isFullscreen}\n onClick={onToggleFullscreen || (() => {})}\n title=\"Toggle Fullscreen\"\n >\n {icons.fullscreen}\n </ToolbarButton>\n );\n case \"print\":\n return (\n <ToolbarButton\n key={button}\n onClick={onPrint || (() => {})}\n title=\"Print\"\n >\n {icons.print}\n </ToolbarButton>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div className=\"rte-builder-toolbar slate-toolbar\">\n {buttons.map((button, index) => renderButton(button, index))}\n </div>\n );\n};\n\nexport default SlateToolbar;\n","/**\n * Slate.js Editor Component\n *\n * This is the actual Slate.js editor implementation that conforms\n * to the adapter interface.\n */\n\nimport React, {\n useEffect,\n useImperativeHandle,\n forwardRef,\n useCallback,\n useMemo,\n useState,\n useRef,\n} from 'react'\nimport { createEditor, Descendant, Editor, Transforms, Text, Element as SlateElement, Node } from 'slate'\nimport { Slate, Editable, withReact, ReactEditor, useSlate } from 'slate-react'\nimport { withHistory, HistoryEditor } from 'slate-history'\nimport isHotkey from 'is-hotkey'\n\n// Toolbar\nimport { SlateToolbar } from './SlateToolbar'\n\n// Types\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\n\n// ============================================================================\n// CUSTOM TYPES\n// ============================================================================\n\ntype CustomText = {\n text: string\n bold?: boolean\n italic?: boolean\n underline?: boolean\n strikethrough?: boolean\n code?: boolean\n subscript?: boolean\n superscript?: boolean\n color?: string\n backgroundColor?: string\n fontSize?: string\n fontFamily?: string\n}\n\ntype ParagraphElement = { type: 'paragraph'; align?: string; indent?: number; children: Descendant[] }\ntype HeadingElement = { type: 'heading'; level: 1 | 2 | 3 | 4 | 5 | 6; align?: string; children: Descendant[] }\ntype BlockquoteElement = { type: 'blockquote'; children: Descendant[] }\ntype CodeBlockElement = { type: 'code-block'; language?: string; children: Descendant[] }\ntype BulletListElement = { type: 'bulleted-list'; children: Descendant[] }\ntype NumberedListElement = { type: 'numbered-list'; children: Descendant[] }\ntype ListItemElement = { type: 'list-item'; children: Descendant[] }\ntype LinkElement = { type: 'link'; url: string; children: Descendant[] }\ntype ImageElement = { type: 'image'; url: string; alt?: string; children: Descendant[] }\ntype VideoElement = { type: 'video'; url: string; children: Descendant[] }\ntype HorizontalRuleElement = { type: 'horizontal-rule'; children: Descendant[] }\ntype TableElement = { type: 'table'; children: Descendant[] }\ntype TableRowElement = { type: 'table-row'; children: Descendant[] }\ntype TableCellElement = { type: 'table-cell'; children: Descendant[] }\n\ntype CustomElement =\n | ParagraphElement\n | HeadingElement\n | BlockquoteElement\n | CodeBlockElement\n | BulletListElement\n | NumberedListElement\n | ListItemElement\n | LinkElement\n | ImageElement\n | VideoElement\n | HorizontalRuleElement\n | TableElement\n | TableRowElement\n | TableCellElement\n\ndeclare module 'slate' {\n interface CustomTypes {\n Editor: Editor & ReactEditor & HistoryEditor\n Element: CustomElement\n Text: CustomText\n }\n}\n\n// ============================================================================\n// HOTKEYS\n// ============================================================================\n\nconst HOTKEYS: Record<string, string> = {\n 'mod+b': 'bold',\n 'mod+i': 'italic',\n 'mod+u': 'underline',\n 'mod+`': 'code',\n 'mod+shift+s': 'strikethrough',\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\n\nconst isMarkActive = (editor: Editor, format: string) => {\n const marks = Editor.marks(editor)\n return marks ? (marks as Record<string, unknown>)[format] === true : false\n}\n\nconst isBlockActive = (editor: Editor, format: string, blockType: 'type' | 'align' = 'type') => {\n const { selection } = editor\n if (!selection) return false\n\n const [match] = Array.from(\n Editor.nodes(editor, {\n at: Editor.unhangRange(editor, selection),\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n (blockType === 'type' ? n.type === format : (n as any).align === format),\n })\n )\n\n return !!match\n}\n\nconst toggleMark = (editor: Editor, format: string) => {\n const isActive = isMarkActive(editor, format)\n\n if (isActive) {\n Editor.removeMark(editor, format)\n } else {\n Editor.addMark(editor, format, true)\n }\n}\n\nconst toggleBlock = (editor: Editor, format: string) => {\n const isActive = isBlockActive(\n editor,\n format,\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\n )\n const isList = LIST_TYPES.includes(format)\n\n Transforms.unwrapNodes(editor, {\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n LIST_TYPES.includes(n.type) &&\n !TEXT_ALIGN_TYPES.includes(format),\n split: true,\n })\n\n let newProperties: Partial<CustomElement>\n if (TEXT_ALIGN_TYPES.includes(format)) {\n newProperties = {\n align: isActive ? undefined : format,\n } as Partial<CustomElement>\n } else {\n newProperties = {\n type: isActive ? 'paragraph' : isList ? 'list-item' : format,\n } as Partial<CustomElement>\n }\n Transforms.setNodes<CustomElement>(editor, newProperties)\n\n if (!isActive && isList) {\n const block = { type: format, children: [] } as CustomElement\n Transforms.wrapNodes(editor, block)\n }\n}\n\n// ============================================================================\n// SERIALIZATION\n// ============================================================================\n\nconst serializeToHtml = (nodes: Descendant[]): string => {\n return nodes.map(n => serializeNode(n)).join('')\n}\n\nconst serializeNode = (node: Descendant): string => {\n if (Text.isText(node)) {\n let string = escapeHtml(node.text)\n if (node.bold) string = `<strong>${string}</strong>`\n if (node.italic) string = `<em>${string}</em>`\n if (node.underline) string = `<u>${string}</u>`\n if (node.strikethrough) string = `<s>${string}</s>`\n if (node.code) string = `<code>${string}</code>`\n if (node.subscript) string = `<sub>${string}</sub>`\n if (node.superscript) string = `<sup>${string}</sup>`\n if (node.color) string = `<span style=\"color: ${node.color}\">${string}</span>`\n if (node.backgroundColor) string = `<span style=\"background-color: ${node.backgroundColor}\">${string}</span>`\n if (node.fontSize) string = `<span style=\"font-size: ${node.fontSize}\">${string}</span>`\n if (node.fontFamily) string = `<span style=\"font-family: ${node.fontFamily}\">${string}</span>`\n return string\n }\n\n const children = (node.children as Descendant[]).map(n => serializeNode(n)).join('')\n const element = node as CustomElement\n const alignStyle = (element as any).align ? ` style=\"text-align: ${(element as any).align}\"` : ''\n\n switch (element.type) {\n case 'paragraph':\n return `<p${alignStyle}>${children}</p>`\n case 'heading':\n return `<h${element.level}${alignStyle}>${children}</h${element.level}>`\n case 'blockquote':\n return `<blockquote>${children}</blockquote>`\n case 'code-block':\n return `<pre><code class=\"language-${element.language || 'plaintext'}\">${children}</code></pre>`\n case 'bulleted-list':\n return `<ul>${children}</ul>`\n case 'numbered-list':\n return `<ol>${children}</ol>`\n case 'list-item':\n return `<li>${children}</li>`\n case 'link':\n return `<a href=\"${escapeHtml(element.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">${children}</a>`\n case 'image':\n return `<img src=\"${escapeHtml(element.url)}\" alt=\"${escapeHtml(element.alt || '')}\" />`\n case 'video':\n return `<video src=\"${escapeHtml(element.url)}\" controls></video>`\n case 'horizontal-rule':\n return '<hr />'\n case 'table':\n return `<table>${children}</table>`\n case 'table-row':\n return `<tr>${children}</tr>`\n case 'table-cell':\n return `<td>${children}</td>`\n default:\n return children\n }\n}\n\nconst escapeHtml = (str: string): string => {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n\nconst deserializeFromHtml = (html: string): Descendant[] => {\n if (!html || html.trim() === '') {\n return [{ type: 'paragraph', children: [{ text: '' }] }]\n }\n\n const doc = new DOMParser().parseFromString(html, 'text/html')\n return deserializeElement(doc.body)\n}\n\nconst deserializeElement = (el: HTMLElement): Descendant[] => {\n if (el.nodeType === 3) {\n return [{ text: el.textContent || '' }]\n }\n\n if (el.nodeType !== 1) {\n return [{ text: '' }]\n }\n\n const children: Descendant[] = Array.from(el.childNodes)\n .flatMap(child => deserializeElement(child as HTMLElement))\n\n if (children.length === 0) {\n children.push({ text: '' })\n }\n\n switch (el.nodeName) {\n case 'BODY':\n return children\n case 'BR':\n return [{ text: '\\n' }]\n case 'P':\n return [{ type: 'paragraph', align: el.style.textAlign || undefined, children }]\n case 'H1':\n return [{ type: 'heading', level: 1, children }]\n case 'H2':\n return [{ type: 'heading', level: 2, children }]\n case 'H3':\n return [{ type: 'heading', level: 3, children }]\n case 'H4':\n return [{ type: 'heading', level: 4, children }]\n case 'H5':\n return [{ type: 'heading', level: 5, children }]\n case 'H6':\n return [{ type: 'heading', level: 6, children }]\n case 'BLOCKQUOTE':\n return [{ type: 'blockquote', children }]\n case 'PRE':\n return [{ type: 'code-block', children }]\n case 'UL':\n return [{ type: 'bulleted-list', children }]\n case 'OL':\n return [{ type: 'numbered-list', children }]\n case 'LI':\n return [{ type: 'list-item', children }]\n case 'A':\n return [{ type: 'link', url: el.getAttribute('href') || '', children }]\n case 'IMG':\n return [{ type: 'image', url: el.getAttribute('src') || '', alt: el.getAttribute('alt') || '', children: [{ text: '' }] }]\n case 'VIDEO':\n return [{ type: 'video', url: el.getAttribute('src') || '', children: [{ text: '' }] }]\n case 'HR':\n return [{ type: 'horizontal-rule', children: [{ text: '' }] }]\n case 'TABLE':\n return [{ type: 'table', children }]\n case 'TR':\n return [{ type: 'table-row', children }]\n case 'TD':\n case 'TH':\n return [{ type: 'table-cell', children }]\n case 'STRONG':\n case 'B':\n return children.map(child => ({ ...child, bold: true } as CustomText))\n case 'EM':\n case 'I':\n return children.map(child => ({ ...child, italic: true } as CustomText))\n case 'U':\n return children.map(child => ({ ...child, underline: true } as CustomText))\n case 'S':\n case 'STRIKE':\n case 'DEL':\n return children.map(child => ({ ...child, strikethrough: true } as CustomText))\n case 'CODE':\n return children.map(child => ({ ...child, code: true } as CustomText))\n case 'SUB':\n return children.map(child => ({ ...child, subscript: true } as CustomText))\n case 'SUP':\n return children.map(child => ({ ...child, superscript: true } as CustomText))\n default:\n return children\n }\n}\n\n// ============================================================================\n// RENDER ELEMENTS & LEAVES\n// ============================================================================\n\nconst renderElement = (props: { attributes: any; children: React.ReactNode; element: CustomElement }) => {\n const { attributes, children, element } = props\n const style = { textAlign: (element as any).align }\n\n switch (element.type) {\n case 'heading':\n const Tag = `h${element.level}` as keyof JSX.IntrinsicElements\n return <Tag style={style} {...attributes}>{children}</Tag>\n case 'blockquote':\n return <blockquote {...attributes}>{children}</blockquote>\n case 'code-block':\n return (\n <pre {...attributes}>\n <code>{children}</code>\n </pre>\n )\n case 'bulleted-list':\n return <ul {...attributes}>{children}</ul>\n case 'numbered-list':\n return <ol {...attributes}>{children}</ol>\n case 'list-item':\n return <li {...attributes}>{children}</li>\n case 'link':\n return (\n <a href={element.url} target=\"_blank\" rel=\"noopener noreferrer\" {...attributes}>\n {children}\n </a>\n )\n case 'image':\n return (\n <div {...attributes} contentEditable={false}>\n <img src={element.url} alt={element.alt || ''} style={{ maxWidth: '100%' }} />\n {children}\n </div>\n )\n case 'video':\n return (\n <div {...attributes} contentEditable={false}>\n <video src={element.url} controls style={{ maxWidth: '100%' }} />\n {children}\n </div>\n )\n case 'horizontal-rule':\n return (\n <div {...attributes} contentEditable={false}>\n <hr />\n {children}\n </div>\n )\n case 'table':\n return <table {...attributes}><tbody>{children}</tbody></table>\n case 'table-row':\n return <tr {...attributes}>{children}</tr>\n case 'table-cell':\n return <td {...attributes}>{children}</td>\n case 'paragraph':\n default:\n return <p style={style} {...attributes}>{children}</p>\n }\n}\n\nconst renderLeaf = (props: { attributes: any; children: React.ReactNode; leaf: CustomText }) => {\n const { attributes, leaf } = props\n let { children } = props\n\n if (leaf.bold) {\n children = <strong>{children}</strong>\n }\n if (leaf.italic) {\n children = <em>{children}</em>\n }\n if (leaf.underline) {\n children = <u>{children}</u>\n }\n if (leaf.strikethrough) {\n children = <s>{children}</s>\n }\n if (leaf.code) {\n children = <code>{children}</code>\n }\n if (leaf.subscript) {\n children = <sub>{children}</sub>\n }\n if (leaf.superscript) {\n children = <sup>{children}</sup>\n }\n\n const style: React.CSSProperties = {}\n if (leaf.color) style.color = leaf.color\n if (leaf.backgroundColor) style.backgroundColor = leaf.backgroundColor\n if (leaf.fontSize) style.fontSize = leaf.fontSize\n if (leaf.fontFamily) style.fontFamily = leaf.fontFamily\n\n return (\n <span {...attributes} style={Object.keys(style).length > 0 ? style : undefined}>\n {children}\n </span>\n )\n}\n\n// ============================================================================\n// WITHPLUGINS\n// ============================================================================\n\nconst withInlines = (editor: Editor) => {\n const { isInline, isVoid } = editor\n\n editor.isInline = (element) => {\n return element.type === 'link' ? true : isInline(element)\n }\n\n editor.isVoid = (element) => {\n return ['image', 'video', 'horizontal-rule'].includes(element.type) ? true : isVoid(element)\n }\n\n return editor\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\ninterface SlateEditorComponentProps extends AdapterComponentProps {}\n\nexport const SlateEditorComponent = forwardRef<AdapterEditorRef, SlateEditorComponentProps>(\n (\n {\n value = '',\n onChange,\n onBlur,\n onFocus,\n placeholder = 'Start typing...',\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarButtons,\n className = '',\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = 'javascript',\n editorConfig = {},\n },\n ref\n ) => {\n // Create editor instance\n const editor = useMemo(\n () => withInlines(withHistory(withReact(createEditor()))),\n []\n )\n\n // Track fullscreen state\n const [isFullscreen, setIsFullscreen] = useState(false)\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // Initial value\n const [editorValue, setEditorValue] = useState<Descendant[]>(() => {\n return deserializeFromHtml(value)\n })\n\n // Update value when prop changes\n useEffect(() => {\n const currentHtml = serializeToHtml(editorValue)\n if (value !== currentHtml) {\n const newValue = deserializeFromHtml(value)\n setEditorValue(newValue)\n // Reset editor selection\n editor.children = newValue\n Transforms.select(editor, { anchor: { path: [0, 0], offset: 0 }, focus: { path: [0, 0], offset: 0 } })\n }\n }, [value])\n\n // Handle change\n const handleChange = useCallback(\n (newValue: Descendant[]) => {\n setEditorValue(newValue)\n const html = serializeToHtml(newValue)\n onChange?.(html)\n },\n [onChange]\n )\n\n // Handle keydown\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n for (const hotkey in HOTKEYS) {\n if (isHotkey(hotkey, event as any)) {\n event.preventDefault()\n const mark = HOTKEYS[hotkey]\n toggleMark(editor, mark)\n }\n }\n },\n [editor]\n )\n\n // Get text content\n const getText = useCallback(() => {\n return editorValue.map(n => Node.string(n)).join('\\n')\n }, [editorValue])\n\n // Get character count\n const getCharacterCount = useCallback(() => {\n return getText().length\n }, [getText])\n\n // Get word count\n const getWordCount = useCallback(() => {\n const text = getText()\n return text.split(/\\s+/).filter(word => word.length > 0).length\n }, [getText])\n\n // Toggle fullscreen\n const handleToggleFullscreen = useCallback(() => {\n setIsFullscreen(prev => !prev)\n }, [])\n\n // Print\n const handlePrint = useCallback(() => {\n const html = serializeToHtml(editorValue)\n const printWindow = window.open('', '_blank')\n if (printWindow) {\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Print</title>\n <style>\n body { font-family: Arial, sans-serif; padding: 20px; }\n img { max-width: 100%; }\n </style>\n </head>\n <body>${html}</body>\n </html>\n `)\n printWindow.document.close()\n printWindow.print()\n }\n }, [editorValue])\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage) {\n const file = await onMediaPickerImage()\n if (file) {\n const image: ImageElement = {\n type: 'image',\n url: file.url,\n alt: file.alt || file.name,\n children: [{ text: '' }],\n }\n Transforms.insertNodes(editor, image)\n }\n }\n }, [onMediaPickerImage, editor])\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo) {\n const file = await onMediaPickerVideo()\n if (file) {\n const video: VideoElement = {\n type: 'video',\n url: file.url,\n children: [{ text: '' }],\n }\n Transforms.insertNodes(editor, video)\n }\n }\n }, [onMediaPickerVideo, editor])\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => serializeToHtml(editorValue),\n getText,\n getJSON: () => editorValue,\n setContent: (html: string) => {\n const newValue = deserializeFromHtml(html)\n setEditorValue(newValue)\n editor.children = newValue\n },\n focus: () => {\n ReactEditor.focus(editor)\n },\n blur: () => {\n ReactEditor.blur(editor)\n },\n insertHTML: (html: string) => {\n const fragment = deserializeFromHtml(html)\n Transforms.insertFragment(editor, fragment)\n },\n insertText: (text: string) => {\n Transforms.insertText(editor, text)\n },\n clear: () => {\n const emptyValue: Descendant[] = [{ type: 'paragraph', children: [{ text: '' }] }]\n setEditorValue(emptyValue)\n editor.children = emptyValue\n },\n isEmpty: () => {\n return (\n editorValue.length === 1 &&\n editorValue[0].type === 'paragraph' &&\n (editorValue[0] as ParagraphElement).children.length === 1 &&\n ((editorValue[0] as ParagraphElement).children[0] as CustomText).text === ''\n )\n },\n getCharacterCount,\n getWordCount,\n isFullscreen: () => isFullscreen,\n toggleFullscreen: handleToggleFullscreen,\n print: handlePrint,\n undo: () => {\n HistoryEditor.undo(editor)\n },\n redo: () => {\n HistoryEditor.redo(editor)\n },\n canUndo: () => {\n return editor.history.undos.length > 0\n },\n canRedo: () => {\n return editor.history.redos.length > 0\n },\n getNativeEditor: () => editor,\n }))\n\n const characterCount = getCharacterCount()\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\n\n return (\n <div\n ref={wrapperRef}\n className={`rte-builder-wrapper slate-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\n >\n <Slate editor={editor} initialValue={editorValue} onChange={handleChange}>\n <SlateToolbar\n editor={editor}\n buttons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\n onToggleFullscreen={handleToggleFullscreen}\n onPrint={handlePrint}\n isFullscreen={isFullscreen}\n toggleMark={toggleMark}\n toggleBlock={toggleBlock}\n isMarkActive={isMarkActive}\n isBlockActive={isBlockActive}\n />\n <div\n className=\"rte-builder-container\"\n style={{\n height: `${height}px`,\n minHeight: `${minHeight}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n overflow: 'auto',\n }}\n >\n <Editable\n className=\"rte-builder-content\"\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n placeholder={placeholder}\n spellCheck\n autoFocus\n readOnly={disabled || readOnly}\n onKeyDown={handleKeyDown}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\n )}\n </div>\n </div>\n )}\n </Slate>\n </div>\n )\n }\n)\n\nSlateEditorComponent.displayName = 'SlateEditorComponent'\n\nexport default SlateEditorComponent\n","/**\n * Lexical Toolbar Component\n *\n * A toolbar component for the Lexical editor with all standard formatting options.\n */\n\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\nimport {\n $getSelection,\n $isRangeSelection,\n FORMAT_TEXT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n LexicalEditor,\n} from \"lexical\";\nimport {\n $isHeadingNode,\n $createHeadingNode,\n HeadingTagType,\n} from \"@lexical/rich-text\";\nimport {\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n REMOVE_LIST_COMMAND,\n $isListNode,\n ListNode,\n} from \"@lexical/list\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $createQuoteNode } from \"@lexical/rich-text\";\nimport { $createCodeNode } from \"@lexical/code\";\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\";\nimport { INSERT_TABLE_COMMAND, TableNode } from \"@lexical/table\";\nimport { $createParagraphNode, $getRoot } from \"lexical\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\n\nimport type { ToolbarButtonType } from \"../../core/types\";\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface LexicalToolbarProps {\n editor: LexicalEditor;\n buttons?: ToolbarButtonType[];\n onMediaPickerImage?: () => Promise<void>;\n onMediaPickerVideo?: () => Promise<void>;\n onToggleFullscreen?: () => void;\n onPrint?: () => void;\n isFullscreen?: boolean;\n}\n\n// ============================================================================\n// TOOLBAR BUTTON COMPONENT\n// ============================================================================\n\ninterface ToolbarButtonProps {\n active?: boolean;\n disabled?: boolean;\n onClick: () => void;\n title: string;\n children: React.ReactNode;\n}\n\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\n active = false,\n disabled = false,\n onClick,\n title,\n children,\n}) => (\n <button\n className={`rte-builder-toolbar-button ${active ? \"active\" : \"\"}`}\n onClick={(e) => {\n e.preventDefault();\n onClick();\n }}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {children}\n </button>\n);\n\n// ============================================================================\n// TOOLBAR ICONS (Simple SVG icons)\n// ============================================================================\n\nconst icons: Record<string, JSX.Element> = {\n bold: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"\n />\n </svg>\n ),\n italic: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"\n />\n </svg>\n ),\n underline: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"\n />\n </svg>\n ),\n strike: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"\n />\n </svg>\n ),\n code: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\"\n />\n </svg>\n ),\n codeBlock: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9.5 8.5L7 14l2.5 2.5L8 18l-4-4 4-4 1.5 1.5zm7 5L15 18l4-4-4-4 1.5-1.5L19 11l-2.5 2.5z\"\n />\n </svg>\n ),\n subscript: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M22 18h-2v1h3v1h-4v-2.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18v-1h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"\n />\n </svg>\n ),\n superscript: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M22 7h-2v1h3v1h-4V6.5a.5.5 0 01.5-.5h2a.5.5 0 00.5-.5v-.5H18V4h4v2.5a.5.5 0 01-.5.5h-2a.5.5 0 00-.5.5v.5zM5.88 5h2.66l3.4 5.42h.12L15.5 5h2.62l-4.87 7.38L18.22 20h-2.66l-3.62-5.63h-.12l-3.62 5.63H5.56l4.92-7.62L5.88 5z\"\n />\n </svg>\n ),\n clearFormatting: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z\"\n />\n </svg>\n ),\n alignLeft: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"\n />\n </svg>\n ),\n alignCenter: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"\n />\n </svg>\n ),\n alignRight: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"\n />\n </svg>\n ),\n alignJustify: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"\n />\n </svg>\n ),\n indent: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\n />\n </svg>\n ),\n outdent: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\n />\n </svg>\n ),\n bulletList: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"\n />\n </svg>\n ),\n orderedList: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"\n />\n </svg>\n ),\n heading1: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z\"\n />\n </svg>\n ),\n heading2: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2h-2v2h4v2H9v-4c0-1.1.9-2 2-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"\n />\n </svg>\n ),\n heading3: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.1-.9 2-2 2v0c1.1 0 2 .9 2 2v1c0 1.1-.9 2-2 2H9v-2h4v-2h-2v-2h2V9H9V7h4c1.1 0 2 .9 2 2v2z\"\n />\n </svg>\n ),\n blockquote: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </svg>\n ),\n horizontalRule: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path fill=\"currentColor\" d=\"M4 11h16v2H4z\" />\n </svg>\n ),\n link: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"\n />\n </svg>\n ),\n unlink: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16v-2zM2 4.27l3.11 3.11A4.991 4.991 0 002 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z\"\n />\n </svg>\n ),\n image: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"\n />\n </svg>\n ),\n video: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\"\n />\n </svg>\n ),\n table: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z\"\n />\n </svg>\n ),\n emoji: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"\n />\n </svg>\n ),\n undo: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M12.5 8c-2.65 0-5.05 1.04-6.83 2.73L3 8v9h9l-3.01-3c1.37-1.12 3.11-1.8 5.01-1.8 3.33 0 6.17 2.11 7.22 5.06l1.98-.65C21.79 12.58 17.54 8 12.5 8z\"\n />\n </svg>\n ),\n redo: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22l1.98.65c1.05-3.19 4.05-5.47 7.98-5.47 1.9 0 3.64.68 5.01 1.8L13.5 15h9V6l-4.1 4.6z\"\n />\n </svg>\n ),\n fullscreen: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n ),\n print: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"\n />\n </svg>\n ),\n textColor: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"\n />\n </svg>\n ),\n backgroundColor: (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5zM2 20h20v4H2v-4z\"\n />\n </svg>\n ),\n};\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport const LexicalToolbar: React.FC<LexicalToolbarProps> = ({\n editor,\n buttons = [],\n onMediaPickerImage,\n onMediaPickerVideo,\n onToggleFullscreen,\n onPrint,\n isFullscreen = false,\n}) => {\n // Emoji picker state\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const [selectedEmojiCategory, setSelectedEmojiCategory] =\n useState<string>(\"smileys\");\n const emojiPickerRef = useRef<HTMLDivElement>(null);\n\n // Link dialog state\n const [showLinkDialog, setShowLinkDialog] = useState(false);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const linkDialogRef = useRef<HTMLDivElement>(null);\n\n // Active states\n const [isBold, setIsBold] = useState(false);\n const [isItalic, setIsItalic] = useState(false);\n const [isUnderline, setIsUnderline] = useState(false);\n const [isStrikethrough, setIsStrikethrough] = useState(false);\n const [isCode, setIsCode] = useState(false);\n const [isSubscript, setIsSubscript] = useState(false);\n const [isSuperscript, setIsSuperscript] = useState(false);\n\n // Update active states on selection change\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n setIsBold(selection.hasFormat(\"bold\"));\n setIsItalic(selection.hasFormat(\"italic\"));\n setIsUnderline(selection.hasFormat(\"underline\"));\n setIsStrikethrough(selection.hasFormat(\"strikethrough\"));\n setIsCode(selection.hasFormat(\"code\"));\n setIsSubscript(selection.hasFormat(\"subscript\"));\n setIsSuperscript(selection.hasFormat(\"superscript\"));\n }\n });\n });\n }, [editor]);\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n emojiPickerRef.current &&\n !emojiPickerRef.current.contains(event.target as Node)\n ) {\n setShowEmojiPicker(false);\n }\n if (\n linkDialogRef.current &&\n !linkDialogRef.current.contains(event.target as Node)\n ) {\n setShowLinkDialog(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Insert emoji\n const insertEmoji = useCallback(\n (emoji: string) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n selection.insertText(emoji);\n }\n });\n setShowEmojiPicker(false);\n },\n [editor],\n );\n\n // Insert link\n const insertLink = useCallback(() => {\n if (linkUrl) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, linkUrl);\n setLinkUrl(\"\");\n setShowLinkDialog(false);\n }\n }, [editor, linkUrl]);\n\n // Remove link\n const removeLink = useCallback(() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }, [editor]);\n\n // Format heading\n const formatHeading = useCallback(\n (headingTag: HeadingTagType) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createHeadingNode(headingTag));\n }\n });\n },\n [editor],\n );\n\n // Format paragraph\n const formatParagraph = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createParagraphNode());\n }\n });\n }, [editor]);\n\n // Format quote\n const formatQuote = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createQuoteNode());\n }\n });\n }, [editor]);\n\n // Format code block\n const formatCodeBlock = useCallback(() => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createCodeNode());\n }\n });\n }, [editor]);\n\n // Insert table\n const insertTable = useCallback(() => {\n editor.dispatchCommand(INSERT_TABLE_COMMAND, { rows: \"3\", columns: \"3\" });\n }, [editor]);\n\n // Render toolbar button based on type\n const renderButton = (button: ToolbarButtonType, index: number) => {\n if (button === \"separator\") {\n return (\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n );\n }\n\n switch (button) {\n // Text formatting\n case \"bold\":\n return (\n <ToolbarButton\n key={button}\n active={isBold}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\n title=\"Bold (Ctrl+B)\"\n >\n {icons.bold}\n </ToolbarButton>\n );\n case \"italic\":\n return (\n <ToolbarButton\n key={button}\n active={isItalic}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\n }\n title=\"Italic (Ctrl+I)\"\n >\n {icons.italic}\n </ToolbarButton>\n );\n case \"underline\":\n return (\n <ToolbarButton\n key={button}\n active={isUnderline}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")\n }\n title=\"Underline (Ctrl+U)\"\n >\n {icons.underline}\n </ToolbarButton>\n );\n case \"strike\":\n return (\n <ToolbarButton\n key={button}\n active={isStrikethrough}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\n }\n title=\"Strikethrough\"\n >\n {icons.strike}\n </ToolbarButton>\n );\n case \"code\":\n return (\n <ToolbarButton\n key={button}\n active={isCode}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\n title=\"Code\"\n >\n {icons.code}\n </ToolbarButton>\n );\n case \"codeBlock\":\n return (\n <ToolbarButton\n key={button}\n onClick={formatCodeBlock}\n title=\"Code Block\"\n >\n {icons.codeBlock}\n </ToolbarButton>\n );\n case \"subscript\":\n return (\n <ToolbarButton\n key={button}\n active={isSubscript}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\n }\n title=\"Subscript\"\n >\n {icons.subscript}\n </ToolbarButton>\n );\n case \"superscript\":\n return (\n <ToolbarButton\n key={button}\n active={isSuperscript}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\n }\n title=\"Superscript\"\n >\n {icons.superscript}\n </ToolbarButton>\n );\n case \"clearFormatting\":\n return (\n <ToolbarButton\n key={button}\n onClick={formatParagraph}\n title=\"Clear Formatting\"\n >\n {icons.clearFormatting}\n </ToolbarButton>\n );\n\n // Lists\n case \"bulletList\":\n return (\n <ToolbarButton\n key={button}\n onClick={() =>\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n }\n title=\"Bullet List\"\n >\n {icons.bulletList}\n </ToolbarButton>\n );\n case \"orderedList\":\n return (\n <ToolbarButton\n key={button}\n onClick={() =>\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n }\n title=\"Numbered List\"\n >\n {icons.orderedList}\n </ToolbarButton>\n );\n\n // Headings\n case \"heading1\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => formatHeading(\"h1\")}\n title=\"Heading 1\"\n >\n {icons.heading1}\n </ToolbarButton>\n );\n case \"heading2\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => formatHeading(\"h2\")}\n title=\"Heading 2\"\n >\n {icons.heading2}\n </ToolbarButton>\n );\n case \"heading3\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => formatHeading(\"h3\")}\n title=\"Heading 3\"\n >\n {icons.heading3}\n </ToolbarButton>\n );\n\n // Blocks\n case \"blockquote\":\n return (\n <ToolbarButton key={button} onClick={formatQuote} title=\"Blockquote\">\n {icons.blockquote}\n </ToolbarButton>\n );\n case \"horizontalRule\":\n return (\n <ToolbarButton\n key={button}\n onClick={() =>\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\n }\n title=\"Horizontal Rule\"\n >\n {icons.horizontalRule}\n </ToolbarButton>\n );\n\n // Links\n case \"link\":\n return (\n <div\n key={button}\n className=\"rte-builder-toolbar-dropdown\"\n ref={linkDialogRef}\n >\n <ToolbarButton\n onClick={() => setShowLinkDialog(!showLinkDialog)}\n title=\"Insert Link\"\n >\n {icons.link}\n </ToolbarButton>\n {showLinkDialog && (\n <div className=\"rte-builder-toolbar-dropdown-content\">\n <input\n type=\"url\"\n placeholder=\"Enter URL...\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n insertLink();\n }\n }}\n autoFocus\n />\n <button onClick={insertLink}>Insert</button>\n </div>\n )}\n </div>\n );\n case \"unlink\":\n return (\n <ToolbarButton key={button} onClick={removeLink} title=\"Remove Link\">\n {icons.unlink}\n </ToolbarButton>\n );\n\n // Media\n case \"image\":\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerImage || (() => {})}\n disabled={!onMediaPickerImage}\n title=\"Insert Image\"\n >\n {icons.image}\n </ToolbarButton>\n );\n case \"video\":\n return (\n <ToolbarButton\n key={button}\n onClick={onMediaPickerVideo || (() => {})}\n disabled={!onMediaPickerVideo}\n title=\"Insert Video\"\n >\n {icons.video}\n </ToolbarButton>\n );\n case \"table\":\n return (\n <ToolbarButton\n key={button}\n onClick={insertTable}\n title=\"Insert Table\"\n >\n {icons.table}\n </ToolbarButton>\n );\n\n // Emoji\n case \"emoji\":\n return (\n <div\n key={button}\n className=\"rte-builder-toolbar-dropdown\"\n ref={emojiPickerRef}\n >\n <ToolbarButton\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n title=\"Insert Emoji\"\n >\n {icons.emoji}\n </ToolbarButton>\n {showEmojiPicker && (\n <div className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? \"active\" : \"\"}`}\n onClick={() => setSelectedEmojiCategory(key)}\n title={(category as any).label}\n >\n {(category as any).emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {(\n EMOJI_CATEGORIES[\n selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES\n ] as any\n )?.emojis.map((emoji: string, idx: number) => (\n <button\n key={idx}\n className=\"rte-builder-emoji-btn\"\n onClick={() => insertEmoji(emoji)}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n // Actions\n case \"undo\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\n title=\"Undo (Ctrl+Z)\"\n >\n {icons.undo}\n </ToolbarButton>\n );\n case \"redo\":\n return (\n <ToolbarButton\n key={button}\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\n title=\"Redo (Ctrl+Y)\"\n >\n {icons.redo}\n </ToolbarButton>\n );\n case \"fullscreen\":\n return (\n <ToolbarButton\n key={button}\n active={isFullscreen}\n onClick={onToggleFullscreen || (() => {})}\n title=\"Toggle Fullscreen\"\n >\n {icons.fullscreen}\n </ToolbarButton>\n );\n case \"print\":\n return (\n <ToolbarButton\n key={button}\n onClick={onPrint || (() => {})}\n title=\"Print\"\n >\n {icons.print}\n </ToolbarButton>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div className=\"rte-builder-toolbar lexical-toolbar\">\n {buttons.map((button, index) => renderButton(button, index))}\n </div>\n );\n};\n\nexport default LexicalToolbar;\n","/**\n * Lexical Editor Component\n *\n * This is the actual Lexical editor implementation that conforms\n * to the adapter interface.\n */\n\nimport React, {\n useEffect,\n useImperativeHandle,\n forwardRef,\n useCallback,\n useState,\n useRef,\n} from 'react'\n\n// Lexical core\nimport { LexicalComposer } from '@lexical/react/LexicalComposer'\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable'\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin'\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'\nimport { TablePlugin } from '@lexical/react/LexicalTablePlugin'\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin'\n\n// Lexical nodes\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text'\nimport { ListNode, ListItemNode } from '@lexical/list'\nimport { LinkNode, AutoLinkNode } from '@lexical/link'\nimport { CodeNode, CodeHighlightNode } from '@lexical/code'\nimport { TableNode, TableCellNode, TableRowNode } from '@lexical/table'\nimport { HorizontalRuleNode } from '@lexical/react/LexicalHorizontalRuleNode'\n\n// Lexical utilities\nimport {\n $getRoot,\n $getSelection,\n $isRangeSelection,\n $createParagraphNode,\n $createTextNode,\n EditorState,\n LexicalEditor,\n FORMAT_TEXT_COMMAND,\n UNDO_COMMAND,\n REDO_COMMAND,\n CAN_UNDO_COMMAND,\n CAN_REDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n} from 'lexical'\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html'\n\n// Toolbar\nimport { LexicalToolbar } from './LexicalToolbar'\n\n// Types\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\n\n// ============================================================================\n// THEME\n// ============================================================================\n\nconst theme = {\n ltr: 'ltr',\n rtl: 'rtl',\n paragraph: 'rte-builder-paragraph',\n quote: 'rte-builder-blockquote',\n heading: {\n h1: 'rte-builder-h1',\n h2: 'rte-builder-h2',\n h3: 'rte-builder-h3',\n h4: 'rte-builder-h4',\n h5: 'rte-builder-h5',\n h6: 'rte-builder-h6',\n },\n list: {\n nested: {\n listitem: 'rte-builder-nested-listitem',\n },\n ol: 'rte-builder-ol',\n ul: 'rte-builder-ul',\n listitem: 'rte-builder-listitem',\n listitemChecked: 'rte-builder-listitem-checked',\n listitemUnchecked: 'rte-builder-listitem-unchecked',\n },\n hashtag: 'rte-builder-hashtag',\n image: 'rte-builder-image',\n link: 'rte-builder-link',\n text: {\n bold: 'rte-builder-bold',\n code: 'rte-builder-code',\n italic: 'rte-builder-italic',\n strikethrough: 'rte-builder-strikethrough',\n subscript: 'rte-builder-subscript',\n superscript: 'rte-builder-superscript',\n underline: 'rte-builder-underline',\n underlineStrikethrough: 'rte-builder-underline-strikethrough',\n },\n code: 'rte-builder-code-block',\n codeHighlight: {\n atrule: 'rte-builder-code-atrule',\n attr: 'rte-builder-code-attr',\n boolean: 'rte-builder-code-boolean',\n builtin: 'rte-builder-code-builtin',\n cdata: 'rte-builder-code-cdata',\n char: 'rte-builder-code-char',\n class: 'rte-builder-code-class',\n 'class-name': 'rte-builder-code-class-name',\n comment: 'rte-builder-code-comment',\n constant: 'rte-builder-code-constant',\n deleted: 'rte-builder-code-deleted',\n doctype: 'rte-builder-code-doctype',\n entity: 'rte-builder-code-entity',\n function: 'rte-builder-code-function',\n important: 'rte-builder-code-important',\n inserted: 'rte-builder-code-inserted',\n keyword: 'rte-builder-code-keyword',\n namespace: 'rte-builder-code-namespace',\n number: 'rte-builder-code-number',\n operator: 'rte-builder-code-operator',\n prolog: 'rte-builder-code-prolog',\n property: 'rte-builder-code-property',\n punctuation: 'rte-builder-code-punctuation',\n regex: 'rte-builder-code-regex',\n selector: 'rte-builder-code-selector',\n string: 'rte-builder-code-string',\n symbol: 'rte-builder-code-symbol',\n tag: 'rte-builder-code-tag',\n url: 'rte-builder-code-url',\n variable: 'rte-builder-code-variable',\n },\n table: 'rte-builder-table',\n tableCell: 'rte-builder-table-cell',\n tableCellHeader: 'rte-builder-table-cell-header',\n tableRow: 'rte-builder-table-row',\n}\n\n// ============================================================================\n// ERROR HANDLING\n// ============================================================================\n\nfunction onError(error: Error): void {\n console.error('Lexical Error:', error)\n}\n\n// ============================================================================\n// EDITOR INNER COMPONENT\n// ============================================================================\n\ninterface EditorInnerProps {\n value: string\n onChange?: (content: string) => void\n onBlur?: () => void\n onFocus?: () => void\n placeholder: string\n height: number\n minHeight: number\n maxHeight?: number\n disabled: boolean\n readOnly: boolean\n charCounterMax: number\n showCharCounter: boolean\n toolbarButtons?: string[]\n onMediaPickerImage?: () => Promise<void>\n onMediaPickerVideo?: () => Promise<void>\n editorRef: React.Ref<AdapterEditorRef>\n isFullscreen: boolean\n onToggleFullscreen: () => void\n}\n\nconst EditorInner: React.FC<EditorInnerProps> = ({\n value,\n onChange,\n onBlur,\n onFocus,\n placeholder,\n height,\n minHeight,\n maxHeight,\n disabled,\n readOnly,\n charCounterMax,\n showCharCounter,\n toolbarButtons,\n onMediaPickerImage,\n onMediaPickerVideo,\n editorRef,\n isFullscreen,\n onToggleFullscreen,\n}) => {\n const [editor] = useLexicalComposerContext()\n const [characterCount, setCharacterCount] = useState(0)\n const [canUndo, setCanUndo] = useState(false)\n const [canRedo, setCanRedo] = useState(false)\n const initialLoadRef = useRef(true)\n\n // Load initial value\n useEffect(() => {\n if (value && initialLoadRef.current) {\n initialLoadRef.current = false\n editor.update(() => {\n const parser = new DOMParser()\n const dom = parser.parseFromString(value, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n const root = $getRoot()\n root.clear()\n root.append(...nodes)\n })\n }\n }, [value, editor])\n\n // Update editable state\n useEffect(() => {\n editor.setEditable(!disabled && !readOnly)\n }, [disabled, readOnly, editor])\n\n // Track can undo/redo\n useEffect(() => {\n return editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n setCanUndo(payload)\n return false\n },\n COMMAND_PRIORITY_CRITICAL\n )\n }, [editor])\n\n useEffect(() => {\n return editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n setCanRedo(payload)\n return false\n },\n COMMAND_PRIORITY_CRITICAL\n )\n }, [editor])\n\n // Handle change\n const handleChange = useCallback(\n (editorState: EditorState) => {\n editorState.read(() => {\n const root = $getRoot()\n const text = root.getTextContent()\n setCharacterCount(text.length)\n\n if (onChange) {\n const html = $generateHtmlFromNodes(editor, null)\n onChange(html)\n }\n })\n },\n [onChange, editor]\n )\n\n // Print function\n const handlePrint = useCallback(() => {\n editor.getEditorState().read(() => {\n const html = $generateHtmlFromNodes(editor, null)\n const printWindow = window.open('', '_blank')\n if (printWindow) {\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Print</title>\n <style>\n body { font-family: Arial, sans-serif; padding: 20px; }\n img { max-width: 100%; }\n </style>\n </head>\n <body>${html}</body>\n </html>\n `)\n printWindow.document.close()\n printWindow.print()\n }\n })\n }, [editor])\n\n // Expose methods via ref\n useImperativeHandle(editorRef, () => ({\n getContent: () => {\n let html = ''\n editor.getEditorState().read(() => {\n html = $generateHtmlFromNodes(editor, null)\n })\n return html\n },\n getText: () => {\n let text = ''\n editor.getEditorState().read(() => {\n text = $getRoot().getTextContent()\n })\n return text\n },\n getJSON: () => {\n return editor.getEditorState().toJSON()\n },\n setContent: (html: string) => {\n editor.update(() => {\n const parser = new DOMParser()\n const dom = parser.parseFromString(html, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n const root = $getRoot()\n root.clear()\n root.append(...nodes)\n })\n },\n focus: () => {\n editor.focus()\n },\n blur: () => {\n editor.blur()\n },\n insertHTML: (html: string) => {\n editor.update(() => {\n const parser = new DOMParser()\n const dom = parser.parseFromString(html, 'text/html')\n const nodes = $generateNodesFromDOM(editor, dom)\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n selection.insertNodes(nodes)\n }\n })\n },\n insertText: (text: string) => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n selection.insertText(text)\n }\n })\n },\n clear: () => {\n editor.update(() => {\n const root = $getRoot()\n root.clear()\n root.append($createParagraphNode())\n })\n },\n isEmpty: () => {\n let isEmpty = true\n editor.getEditorState().read(() => {\n const text = $getRoot().getTextContent()\n isEmpty = text.trim().length === 0\n })\n return isEmpty\n },\n getCharacterCount: () => characterCount,\n getWordCount: () => {\n let wordCount = 0\n editor.getEditorState().read(() => {\n const text = $getRoot().getTextContent()\n wordCount = text.split(/\\s+/).filter(word => word.length > 0).length\n })\n return wordCount\n },\n isFullscreen: () => isFullscreen,\n toggleFullscreen: onToggleFullscreen,\n print: handlePrint,\n undo: () => {\n editor.dispatchCommand(UNDO_COMMAND, undefined)\n },\n redo: () => {\n editor.dispatchCommand(REDO_COMMAND, undefined)\n },\n canUndo: () => canUndo,\n canRedo: () => canRedo,\n getNativeEditor: () => editor,\n }))\n\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\n\n return (\n <>\n <LexicalToolbar\n editor={editor}\n buttons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage}\n onMediaPickerVideo={onMediaPickerVideo}\n onToggleFullscreen={onToggleFullscreen}\n onPrint={handlePrint}\n isFullscreen={isFullscreen}\n />\n <div\n className=\"rte-builder-container\"\n style={{\n height: `${height}px`,\n minHeight: `${minHeight}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n overflow: 'auto',\n }}\n >\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n className=\"rte-builder-content\"\n onBlur={onBlur}\n onFocus={onFocus}\n />\n }\n placeholder={<div className=\"rte-builder-placeholder\">{placeholder}</div>}\n ErrorBoundary={LexicalErrorBoundary}\n />\n <OnChangePlugin onChange={handleChange} />\n <HistoryPlugin />\n <ListPlugin />\n <LinkPlugin />\n <TablePlugin />\n <CheckListPlugin />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\ninterface LexicalEditorComponentProps extends AdapterComponentProps {}\n\nexport const LexicalEditorComponent = forwardRef<AdapterEditorRef, LexicalEditorComponentProps>(\n (\n {\n value = '',\n onChange,\n onBlur,\n onFocus,\n placeholder = 'Start typing...',\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarButtons,\n className = '',\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = 'javascript',\n editorConfig = {},\n },\n ref\n ) => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const handleToggleFullscreen = useCallback(() => {\n setIsFullscreen(prev => !prev)\n }, [])\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage) {\n await onMediaPickerImage()\n }\n }, [onMediaPickerImage])\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo) {\n await onMediaPickerVideo()\n }\n }, [onMediaPickerVideo])\n\n const initialConfig = {\n namespace: 'RTEBuilder',\n theme,\n onError,\n nodes: [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n AutoLinkNode,\n CodeNode,\n CodeHighlightNode,\n TableNode,\n TableCellNode,\n TableRowNode,\n HorizontalRuleNode,\n ],\n editable: !disabled && !readOnly,\n ...editorConfig,\n }\n\n return (\n <div\n className={`rte-builder-wrapper lexical-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\n >\n <LexicalComposer initialConfig={initialConfig}>\n <EditorInner\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onFocus={onFocus}\n placeholder={placeholder}\n height={height}\n minHeight={minHeight}\n maxHeight={maxHeight}\n disabled={disabled}\n readOnly={readOnly}\n charCounterMax={charCounterMax}\n showCharCounter={showCharCounter}\n toolbarButtons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\n editorRef={ref}\n isFullscreen={isFullscreen}\n onToggleFullscreen={handleToggleFullscreen}\n />\n </LexicalComposer>\n </div>\n )\n }\n)\n\nLexicalEditorComponent.displayName = 'LexicalEditorComponent'\n\nexport default LexicalEditorComponent\n","/**\n * RTE Builder - Universal Rich Text Editor Library\n *\n * A generic, adapter-based rich text editor that supports multiple editor backends:\n * - TipTap (default, included)\n * - Slate.js (included)\n * - Lexical (included)\n * - Quill (planned)\n * - Draft.js (planned)\n *\n * @example Basic Usage\n * ```tsx\n * import { RichTextEditor } from 'rte-builder'\n *\n * function App() {\n * const [content, setContent] = useState('')\n * return <RichTextEditor value={content} onChange={setContent} />\n * }\n * ```\n *\n * @example With Specific Editor\n * ```tsx\n * <RichTextEditor editor=\"tiptap\" value={content} onChange={setContent} />\n * ```\n */\n\n// ============================================================================\n// MAIN COMPONENT EXPORTS\n// ============================================================================\n\n// The unified editor (recommended for most use cases)\nexport { UnifiedEditor } from \"./components/UnifiedEditor\";\n\n// Legacy TipTap-specific editor (for backwards compatibility)\nexport { RichTextEditor } from \"./components/RichTextEditor\";\n\n// ============================================================================\n// TYPE EXPORTS\n// ============================================================================\n\n// Legacy types (backwards compatibility)\nexport type {\n EditorProps,\n EditorRef,\n MediaFile as LegacyMediaFile,\n ToolbarButton,\n ToolbarConfig as LegacyToolbarConfig,\n} from \"./types\";\n\n// Core types (new unified interface)\nexport type {\n EditorType,\n BaseEditorConfig,\n MediaFile,\n ToolbarButtonType,\n ToolbarPreset,\n ToolbarConfig,\n UnifiedEditorProps,\n UnifiedEditorRef,\n EditorAdapter,\n AdapterComponentProps,\n AdapterEditorRef,\n EditorFeatures,\n} from \"./core/types\";\n\nexport { DEFAULT_FEATURES } from \"./core/types\";\n\n// ============================================================================\n// REGISTRY EXPORTS\n// ============================================================================\n\nexport {\n registerAdapter,\n unregisterAdapter,\n getAdapter,\n getAllAdapters,\n getAvailableAdapters,\n isEditorAvailable,\n getBestAvailableEditor,\n getDefaultEditorType,\n getEditorFeatures,\n compareEditorFeatures,\n getRegistryStats,\n EditorRegistry,\n} from \"./core/registry\";\n\n// ============================================================================\n// TOOLBAR PRESET EXPORTS\n// ============================================================================\n\nexport {\n fullToolbar,\n mediumToolbar,\n simpleToolbar,\n minimalToolbar,\n codeToolbar,\n blogToolbar,\n emailToolbar,\n toolbarPresets,\n getToolbarPreset,\n customizeToolbar,\n} from \"./core/presets\";\n\nexport type { ToolbarPresetName } from \"./core/presets\";\n\n// ============================================================================\n// ADAPTER EXPORTS\n// ============================================================================\n\n// TipTap adapter (included by default)\nexport { TipTapAdapter } from \"./adapters/tiptap\";\nexport { TipTapEditorComponent } from \"./adapters/tiptap/TipTapEditorComponent\";\nexport { TipTapToolbar } from \"./adapters/tiptap/TipTapToolbar\";\n\n// Note: Slate.js and Lexical adapters are available but require additional\n// dependencies to be installed. They are not exported by default to avoid\n// bundling issues. Import them directly from their paths if needed:\n// import { SlateAdapter } from 'rte-builder/adapters/slate/SlateAdapter'\n// import { LexicalAdapter } from 'rte-builder/adapters/lexical/LexicalAdapter'\n\n// ============================================================================\n// EXTENSION EXPORTS\n// ============================================================================\n\n// Custom TipTap extensions (can be used independently)\nexport { FontSize } from \"./extensions/FontSize\";\nexport { LineHeight } from \"./extensions/LineHeight\";\nexport { Video } from \"./extensions/Video\";\nexport { Emoji, EMOJI_CATEGORIES } from \"./extensions/Emoji\";\nexport { Fullscreen } from \"./extensions/Fullscreen\";\nexport { Print } from \"./extensions/Print\";\nexport { Indent } from \"./extensions/Indent\";\n\n// ============================================================================\n// COLLABORATION EXPORTS (v2.0)\n// ============================================================================\n\nexport {\n CollaborationProvider,\n useCollaboration,\n useCollaborationOptional,\n} from \"./collaboration\";\n\nexport type {\n CollaborationUser,\n CollaborationConfig,\n CollaborationState,\n CollaborationStatus,\n CollaborationEvent,\n CollaborationProps,\n CursorPosition,\n} from \"./collaboration\";\n\nexport { PresenceIndicator } from \"./collaboration/PresenceIndicator\";\n\n// ============================================================================\n// COMMENTS EXPORTS (v2.1)\n// ============================================================================\n\nexport {\n CommentsProvider,\n useComments,\n useCommentsOptional,\n DEFAULT_REACTION_EMOJIS,\n} from \"./comments\";\n\nexport type {\n Comment,\n CommentThread,\n CommentAuthor,\n CommentRange,\n CommentsConfig,\n CommentsState,\n CommentEvent,\n CommentsProps,\n} from \"./comments\";\n\nexport { CommentsPanel } from \"./comments/CommentsPanel\";\n\n// ============================================================================\n// VERSION HISTORY EXPORTS (v2.2)\n// ============================================================================\n\nexport {\n VersionHistoryProvider,\n useVersionHistory,\n useVersionHistoryOptional,\n} from \"./history\";\n\nexport type {\n Version,\n VersionAuthor,\n VersionHistoryConfig,\n VersionHistoryState,\n VersionHistoryEvent,\n VersionHistoryProps,\n VersionComparison,\n VersionChange,\n} from \"./history\";\n\nexport { VersionHistoryPanel } from \"./history/VersionHistoryPanel\";\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\n// Import styles (they will be bundled with the library)\nimport \"./styles/editor.css\";\nimport \"./styles/collaboration.css\";\nimport \"./styles/comments.css\";\nimport \"./styles/version-history.css\";\n","/**\n * Unified Rich Text Editor Component\n *\n * This is the main entry point for the rte-builder library.\n * It provides a unified interface that works with any registered editor adapter.\n */\n\nimport { forwardRef, useImperativeHandle, useRef, useMemo, useState } from \"react\";\nimport type {\n UnifiedEditorProps,\n UnifiedEditorRef,\n EditorType,\n ToolbarButtonType,\n AdapterEditorRef,\n} from \"../core/types\";\nimport {\n getAdapter,\n getBestAvailableEditor,\n getAvailableAdapters,\n registerAdapter,\n} from \"../core/registry\";\nimport { getToolbarPreset, toolbarPresets } from \"../core/presets\";\n\n// Import and register all adapters\nimport { TipTapAdapter } from \"../adapters/tiptap\";\nimport { SlateAdapter } from \"../adapters/slate/SlateAdapter\";\nimport { LexicalAdapter } from \"../adapters/lexical/LexicalAdapter\";\n\n// Register adapters on module load (only if available)\nregisterAdapter(TipTapAdapter);\nif (SlateAdapter.isAvailable()) {\n registerAdapter(SlateAdapter);\n}\nif (LexicalAdapter.isAvailable()) {\n registerAdapter(LexicalAdapter);\n}\n\nexport const UnifiedEditor = forwardRef<UnifiedEditorRef, UnifiedEditorProps>(\n (\n {\n editor: editorType,\n showEditorSwitcher = false,\n onEditorChange,\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n placeholder = \"Start typing...\",\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbar = \"full\",\n toolbarButtons: customToolbarButtons,\n className = \"\",\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = \"javascript\",\n editorConfig,\n },\n ref,\n ) => {\n const adapterRef = useRef<AdapterEditorRef>(null);\n const [internalEditorType, setInternalEditorType] = useState<EditorType | undefined>(editorType);\n\n // Get available adapters for the switcher\n const availableAdapters = useMemo(() => getAvailableAdapters(), []);\n\n // Determine which editor to use (controlled or internal state)\n const currentEditorType = editorType !== undefined ? editorType : internalEditorType;\n\n // Determine which editor to use\n const selectedAdapter = useMemo(() => {\n if (currentEditorType) {\n const adapter = getAdapter(currentEditorType);\n if (adapter?.isAvailable()) {\n return adapter;\n }\n console.warn(\n `Editor \"${currentEditorType}\" is not available. Falling back to best available.`,\n );\n }\n return getBestAvailableEditor();\n }, [currentEditorType]);\n\n // Handle editor switch\n const handleEditorSwitch = (newEditorType: EditorType) => {\n if (onEditorChange) {\n onEditorChange(newEditorType);\n } else {\n setInternalEditorType(newEditorType);\n }\n };\n\n // Determine toolbar buttons\n const toolbarButtons = useMemo((): ToolbarButtonType[] => {\n if (customToolbarButtons) {\n return customToolbarButtons;\n }\n\n if (typeof toolbar === \"string\") {\n return getToolbarPreset(toolbar as keyof typeof toolbarPresets);\n }\n\n if (toolbar.buttons) {\n return toolbar.buttons;\n }\n\n if (toolbar.preset) {\n return getToolbarPreset(toolbar.preset as keyof typeof toolbarPresets);\n }\n\n return getToolbarPreset(\"full\");\n }, [toolbar, customToolbarButtons]);\n\n // Expose unified methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => adapterRef.current?.getContent() || \"\",\n getText: () => adapterRef.current?.getText() || \"\",\n getJSON: () => adapterRef.current?.getJSON(),\n setContent: (content: string) => adapterRef.current?.setContent(content),\n focus: () => adapterRef.current?.focus(),\n blur: () => adapterRef.current?.blur(),\n insertHTML: (html: string) => adapterRef.current?.insertHTML(html),\n insertText: (text: string) => adapterRef.current?.insertText(text),\n clear: () => adapterRef.current?.clear(),\n isEmpty: () => adapterRef.current?.isEmpty() ?? true,\n getCharacterCount: () => adapterRef.current?.getCharacterCount() || 0,\n getWordCount: () => adapterRef.current?.getWordCount() || 0,\n isFullscreen: () => adapterRef.current?.isFullscreen() || false,\n toggleFullscreen: () => adapterRef.current?.toggleFullscreen(),\n print: () => adapterRef.current?.print(),\n undo: () => adapterRef.current?.undo(),\n redo: () => adapterRef.current?.redo(),\n canUndo: () => adapterRef.current?.canUndo() ?? false,\n canRedo: () => adapterRef.current?.canRedo() ?? false,\n getNativeEditor: () => adapterRef.current?.getNativeEditor(),\n getEditorType: () => selectedAdapter?.type || (\"tiptap\" as EditorType),\n }));\n\n // Handle case where no editor is available\n if (!selectedAdapter) {\n return (\n <div className={`rte-builder-wrapper rte-builder-error ${className}`}>\n <div className=\"rte-builder-error-message\">\n No editor available. Please install an editor package:\n <br />\n <code>npm install @tiptap/react @tiptap/starter-kit</code>\n </div>\n </div>\n );\n }\n\n // Get the editor component from the adapter\n const EditorComponent = selectedAdapter.getComponent();\n\n // Handle onChange to ensure it's always called\n const handleChange = (content: string) => {\n onChange?.(content);\n };\n\n return (\n <div className={`rte-builder-unified-wrapper ${className}`}>\n {showEditorSwitcher && availableAdapters.length > 1 && (\n <div className=\"rte-builder-editor-switcher\">\n <label className=\"rte-builder-editor-switcher-label\">Editor:</label>\n <select\n className=\"rte-builder-editor-switcher-select\"\n value={selectedAdapter.type}\n onChange={(e) => handleEditorSwitch(e.target.value as EditorType)}\n disabled={disabled}\n >\n {availableAdapters.map((adapter) => (\n <option key={adapter.type} value={adapter.type}>\n {adapter.name}\n </option>\n ))}\n </select>\n </div>\n )}\n <EditorComponent\n key={selectedAdapter.type}\n editorRef={adapterRef}\n value={value}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n placeholder={placeholder}\n height={height}\n minHeight={minHeight}\n maxHeight={maxHeight}\n disabled={disabled}\n readOnly={readOnly}\n charCounterMax={charCounterMax}\n showCharCounter={showCharCounter}\n toolbarButtons={toolbarButtons}\n onMediaPickerImage={onMediaPickerImage}\n onMediaPickerVideo={onMediaPickerVideo}\n enableCodeHighlight={enableCodeHighlight}\n defaultCodeLanguage={defaultCodeLanguage}\n editorConfig={editorConfig}\n />\n </div>\n );\n },\n);\n\nUnifiedEditor.displayName = \"UnifiedEditor\";\n\nexport default UnifiedEditor;\n","/**\n * Editor Registry - Manages available editor adapters\n *\n * This module provides a central registry for editor adapters.\n * It allows dynamic registration of editors and automatic selection\n * based on availability.\n */\n\nimport type { EditorAdapter, EditorType, EditorFeatures } from './types'\n\n// Registry to store all registered adapters\nconst adapters = new Map<EditorType, EditorAdapter>()\n\n// Default editor preference order\nconst defaultPreferenceOrder: EditorType[] = ['tiptap', 'slate', 'lexical', 'quill', 'draft']\n\n/**\n * Register an editor adapter\n * @param adapter The adapter to register\n */\nexport function registerAdapter(adapter: EditorAdapter): void {\n adapters.set(adapter.type, adapter)\n}\n\n/**\n * Unregister an editor adapter\n * @param type The editor type to unregister\n */\nexport function unregisterAdapter(type: EditorType): void {\n adapters.delete(type)\n}\n\n/**\n * Get an adapter by type\n * @param type The editor type\n * @returns The adapter or undefined\n */\nexport function getAdapter(type: EditorType): EditorAdapter | undefined {\n return adapters.get(type)\n}\n\n/**\n * Get all registered adapters\n * @returns Array of all registered adapters\n */\nexport function getAllAdapters(): EditorAdapter[] {\n return Array.from(adapters.values())\n}\n\n/**\n * Get all available adapters (ones with dependencies installed)\n * @returns Array of available adapters\n */\nexport function getAvailableAdapters(): EditorAdapter[] {\n return getAllAdapters().filter(adapter => adapter.isAvailable())\n}\n\n/**\n * Check if an editor type is available\n * @param type The editor type to check\n * @returns Whether the editor is available\n */\nexport function isEditorAvailable(type: EditorType): boolean {\n const adapter = adapters.get(type)\n return adapter?.isAvailable() ?? false\n}\n\n/**\n * Get the best available editor based on preference order\n * @param preferenceOrder Custom preference order (optional)\n * @returns The best available adapter or undefined\n */\nexport function getBestAvailableEditor(\n preferenceOrder: EditorType[] = defaultPreferenceOrder\n): EditorAdapter | undefined {\n for (const type of preferenceOrder) {\n const adapter = adapters.get(type)\n if (adapter?.isAvailable()) {\n return adapter\n }\n }\n\n // Fallback: return any available adapter\n return getAvailableAdapters()[0]\n}\n\n/**\n * Get the default editor (first available in preference order)\n * @returns The default editor type or undefined\n */\nexport function getDefaultEditorType(): EditorType | undefined {\n const adapter = getBestAvailableEditor()\n return adapter?.type\n}\n\n/**\n * Get features supported by an editor\n * @param type The editor type\n * @returns The features object or undefined\n */\nexport function getEditorFeatures(type: EditorType): EditorFeatures | undefined {\n const adapter = adapters.get(type)\n return adapter?.getSupportedFeatures()\n}\n\n/**\n * Compare features between two editors\n * @param type1 First editor type\n * @param type2 Second editor type\n * @returns Object with features and their support status\n */\nexport function compareEditorFeatures(\n type1: EditorType,\n type2: EditorType\n): Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> | undefined {\n const features1 = getEditorFeatures(type1)\n const features2 = getEditorFeatures(type2)\n\n if (!features1 || !features2) return undefined\n\n const result: Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> = {} as any\n\n for (const key of Object.keys(features1) as (keyof EditorFeatures)[]) {\n result[key] = {\n [type1]: features1[key],\n [type2]: features2[key],\n }\n }\n\n return result\n}\n\n/**\n * Get registry statistics\n * @returns Statistics about registered adapters\n */\nexport function getRegistryStats(): {\n total: number\n available: number\n unavailable: number\n editors: { type: EditorType; available: boolean; name: string }[]\n} {\n const allAdapters = getAllAdapters()\n const availableAdapters = getAvailableAdapters()\n\n return {\n total: allAdapters.length,\n available: availableAdapters.length,\n unavailable: allAdapters.length - availableAdapters.length,\n editors: allAdapters.map(adapter => ({\n type: adapter.type,\n available: adapter.isAvailable(),\n name: adapter.name,\n })),\n }\n}\n\n// Export the registry for advanced use cases\nexport const EditorRegistry = {\n register: registerAdapter,\n unregister: unregisterAdapter,\n get: getAdapter,\n getAll: getAllAdapters,\n getAvailable: getAvailableAdapters,\n isAvailable: isEditorAvailable,\n getBest: getBestAvailableEditor,\n getDefault: getDefaultEditorType,\n getFeatures: getEditorFeatures,\n compareFeatures: compareEditorFeatures,\n getStats: getRegistryStats,\n}\n\nexport default EditorRegistry\n","/**\n * Toolbar Presets - Predefined toolbar configurations\n */\n\nimport type { ToolbarButtonType } from './types'\n\n/** Full toolbar with all features */\nexport const fullToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'separator',\n 'subscript',\n 'superscript',\n 'clearFormatting',\n 'separator',\n 'fontFamily',\n 'fontSize',\n 'lineHeight',\n 'textColor',\n 'backgroundColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'alignJustify',\n 'separator',\n 'indent',\n 'outdent',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'heading4',\n 'heading5',\n 'heading6',\n 'blockquote',\n 'separator',\n 'link',\n 'unlink',\n 'image',\n 'video',\n 'table',\n 'emoji',\n 'separator',\n 'codeBlock',\n 'horizontalRule',\n 'separator',\n 'undo',\n 'redo',\n 'separator',\n 'fullscreen',\n 'print',\n]\n\n/** Medium toolbar for standard editing */\nexport const mediumToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'separator',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'backgroundColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'separator',\n 'link',\n 'image',\n 'table',\n 'emoji',\n 'separator',\n 'undo',\n 'redo',\n 'fullscreen',\n]\n\n/** Simple toolbar for basic editing */\nexport const simpleToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'link',\n 'image',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** Minimal toolbar for comments/notes */\nexport const minimalToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'separator',\n 'link',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** Code-focused toolbar for technical documentation */\nexport const codeToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'code',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'link',\n 'image',\n 'separator',\n 'codeBlock',\n 'blockquote',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** Blog/Article toolbar */\nexport const blogToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'separator',\n 'fontSize',\n 'textColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'heading1',\n 'heading2',\n 'heading3',\n 'blockquote',\n 'separator',\n 'link',\n 'image',\n 'video',\n 'separator',\n 'horizontalRule',\n 'separator',\n 'undo',\n 'redo',\n 'fullscreen',\n]\n\n/** Email composition toolbar */\nexport const emailToolbar: ToolbarButtonType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'separator',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'separator',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'separator',\n 'bulletList',\n 'orderedList',\n 'separator',\n 'link',\n 'image',\n 'separator',\n 'undo',\n 'redo',\n]\n\n/** All preset configurations */\nexport const toolbarPresets = {\n full: fullToolbar,\n medium: mediumToolbar,\n simple: simpleToolbar,\n minimal: minimalToolbar,\n code: codeToolbar,\n blog: blogToolbar,\n email: emailToolbar,\n} as const\n\nexport type ToolbarPresetName = keyof typeof toolbarPresets\n\n/**\n * Get a toolbar preset by name\n * @param name The preset name\n * @returns The toolbar buttons array\n */\nexport function getToolbarPreset(name: ToolbarPresetName): ToolbarButtonType[] {\n return toolbarPresets[name] || toolbarPresets.full\n}\n\n/**\n * Create a custom toolbar from a preset with modifications\n * @param base Base preset name\n * @param options Modification options\n * @returns Modified toolbar buttons array\n */\nexport function customizeToolbar(\n base: ToolbarPresetName,\n options: {\n add?: ToolbarButtonType[]\n remove?: ToolbarButtonType[]\n insertBefore?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\n insertAfter?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\n }\n): ToolbarButtonType[] {\n let toolbar = [...getToolbarPreset(base)]\n\n // Remove buttons\n if (options.remove) {\n toolbar = toolbar.filter(btn => !options.remove!.includes(btn))\n }\n\n // Insert before\n if (options.insertBefore) {\n const index = toolbar.indexOf(options.insertBefore.button)\n if (index !== -1) {\n toolbar.splice(index, 0, ...options.insertBefore.items)\n }\n }\n\n // Insert after\n if (options.insertAfter) {\n const index = toolbar.indexOf(options.insertAfter.button)\n if (index !== -1) {\n toolbar.splice(index + 1, 0, ...options.insertAfter.items)\n }\n }\n\n // Add at end\n if (options.add) {\n toolbar.push('separator', ...options.add)\n }\n\n return toolbar\n}\n\nexport default toolbarPresets\n","/**\n * Core types for the RTE Builder - Editor Agnostic\n * These types define the common interface that all editor adapters must implement\n */\n\n// ============================================================================\n// EDITOR TYPES\n// ============================================================================\n\n/** Supported editor types */\nexport type EditorType = 'tiptap' | 'slate' | 'lexical' | 'quill' | 'draft'\n\n/** Editor configuration that applies to all editors */\nexport interface BaseEditorConfig {\n /** Initial HTML content */\n initialContent?: string\n /** Placeholder text */\n placeholder?: string\n /** Whether the editor is editable */\n editable?: boolean\n /** Auto-focus on mount */\n autoFocus?: boolean\n /** Custom attributes for the editor element */\n attributes?: Record<string, string>\n}\n\n/** Media file for image/video insertion */\nexport interface MediaFile {\n /** File URL */\n url: string\n /** File name */\n name?: string\n /** File type/MIME type */\n type?: string\n /** Alt text for images */\n alt?: string\n /** Title attribute */\n title?: string\n /** Width */\n width?: number\n /** Height */\n height?: number\n}\n\n// ============================================================================\n// TOOLBAR TYPES\n// ============================================================================\n\n/** All available toolbar button types */\nexport type ToolbarButtonType =\n // Text formatting\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'codeBlock'\n | 'subscript'\n | 'superscript'\n | 'clearFormatting'\n // Font & Colors\n | 'fontFamily'\n | 'fontSize'\n | 'lineHeight'\n | 'textColor'\n | 'backgroundColor'\n // Alignment & Indentation\n | 'alignLeft'\n | 'alignCenter'\n | 'alignRight'\n | 'alignJustify'\n | 'indent'\n | 'outdent'\n // Lists\n | 'bulletList'\n | 'orderedList'\n // Headings\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n // Blocks\n | 'blockquote'\n | 'horizontalRule'\n // Links & Media\n | 'link'\n | 'unlink'\n | 'image'\n | 'video'\n | 'table'\n | 'emoji'\n // Actions\n | 'undo'\n | 'redo'\n | 'fullscreen'\n | 'print'\n // Special\n | 'separator'\n\n/** Toolbar preset names */\nexport type ToolbarPreset = 'full' | 'medium' | 'simple' | 'minimal'\n\n/** Toolbar configuration */\nexport interface ToolbarConfig {\n /** Preset to use, or custom buttons array */\n preset?: ToolbarPreset\n /** Custom buttons array (overrides preset) */\n buttons?: ToolbarButtonType[]\n /** Whether toolbar is sticky */\n sticky?: boolean\n /** Sticky offset in pixels */\n stickyOffset?: number\n}\n\n// ============================================================================\n// EDITOR PROPS & REF TYPES\n// ============================================================================\n\n/** Props for the unified RichTextEditor component */\nexport interface UnifiedEditorProps {\n /** Which editor to use */\n editor?: EditorType\n /** Show editor switcher dropdown in toolbar */\n showEditorSwitcher?: boolean\n /** Callback when editor type changes via switcher */\n onEditorChange?: (editorType: EditorType) => void\n /** Initial content (HTML string) */\n value?: string\n /** Callback when content changes */\n onChange?: (content: string) => void\n /** Callback when editor loses focus */\n onBlur?: () => void\n /** Callback when editor gains focus */\n onFocus?: () => void\n /** Placeholder text */\n placeholder?: string\n /** Editor height in pixels */\n height?: number\n /** Minimum height in pixels */\n minHeight?: number\n /** Maximum height in pixels */\n maxHeight?: number\n /** Whether the editor is disabled */\n disabled?: boolean\n /** Whether the editor is read-only */\n readOnly?: boolean\n /** Character limit (-1 for no limit) */\n charCounterMax?: number\n /** Show character counter */\n showCharCounter?: boolean\n /** Toolbar preset or custom config */\n toolbar?: ToolbarPreset | ToolbarConfig\n /** Custom toolbar buttons (shorthand for toolbar.buttons) */\n toolbarButtons?: ToolbarButtonType[]\n /** Additional className */\n className?: string\n /** Callback for custom image picker */\n onMediaPickerImage?: () => Promise<MediaFile | null>\n /** Callback for custom video picker */\n onMediaPickerVideo?: () => Promise<MediaFile | null>\n /** Enable syntax highlighting for code blocks */\n enableCodeHighlight?: boolean\n /** Default language for code blocks */\n defaultCodeLanguage?: string\n /** Additional editor-specific config */\n editorConfig?: Record<string, unknown>\n}\n\n/** Methods exposed via ref */\nexport interface UnifiedEditorRef {\n /** Get the current HTML content */\n getContent: () => string\n /** Get content as plain text */\n getText: () => string\n /** Get content as JSON (if supported) */\n getJSON: () => unknown\n /** Set the HTML content */\n setContent: (content: string) => void\n /** Focus the editor */\n focus: () => void\n /** Blur the editor */\n blur: () => void\n /** Insert HTML at cursor position */\n insertHTML: (html: string) => void\n /** Insert text at cursor position */\n insertText: (text: string) => void\n /** Clear all content */\n clear: () => void\n /** Check if content is empty */\n isEmpty: () => boolean\n /** Get character count */\n getCharacterCount: () => number\n /** Get word count */\n getWordCount: () => number\n /** Check if editor is in fullscreen mode */\n isFullscreen: () => boolean\n /** Toggle fullscreen mode */\n toggleFullscreen: () => void\n /** Print the content */\n print: () => void\n /** Undo last action */\n undo: () => void\n /** Redo last undone action */\n redo: () => void\n /** Check if can undo */\n canUndo: () => boolean\n /** Check if can redo */\n canRedo: () => boolean\n /** Get the native editor instance */\n getNativeEditor: () => unknown\n /** Get the editor type */\n getEditorType: () => EditorType\n}\n\n// ============================================================================\n// EDITOR ADAPTER INTERFACE\n// ============================================================================\n\n/**\n * Abstract interface that all editor adapters must implement.\n * This ensures consistency across different editor implementations.\n */\nexport interface EditorAdapter {\n /** The type of editor this adapter handles */\n readonly type: EditorType\n\n /** Human-readable name */\n readonly name: string\n\n /** Description of the editor */\n readonly description: string\n\n /** Whether this adapter is available (dependencies installed) */\n isAvailable: () => boolean\n\n /** Get the React component for this editor */\n getComponent: () => React.ComponentType<AdapterComponentProps>\n\n /** Get supported features */\n getSupportedFeatures: () => EditorFeatures\n}\n\n/** Props passed to adapter components */\nexport interface AdapterComponentProps {\n value: string\n onChange: (content: string) => void\n onBlur?: () => void\n onFocus?: () => void\n placeholder?: string\n height?: number\n minHeight?: number\n maxHeight?: number\n disabled?: boolean\n readOnly?: boolean\n charCounterMax?: number\n showCharCounter?: boolean\n toolbarButtons: ToolbarButtonType[]\n className?: string\n onMediaPickerImage?: () => Promise<MediaFile | null>\n onMediaPickerVideo?: () => Promise<MediaFile | null>\n enableCodeHighlight?: boolean\n defaultCodeLanguage?: string\n editorConfig?: Record<string, unknown>\n /** Ref forwarding */\n editorRef?: React.Ref<AdapterEditorRef>\n}\n\n/** Ref methods that adapters must expose */\nexport interface AdapterEditorRef {\n getContent: () => string\n getText: () => string\n getJSON: () => unknown\n setContent: (content: string) => void\n focus: () => void\n blur: () => void\n insertHTML: (html: string) => void\n insertText: (text: string) => void\n clear: () => void\n isEmpty: () => boolean\n getCharacterCount: () => number\n getWordCount: () => number\n isFullscreen: () => boolean\n toggleFullscreen: () => void\n print: () => void\n undo: () => void\n redo: () => void\n canUndo: () => boolean\n canRedo: () => boolean\n getNativeEditor: () => unknown\n}\n\n// ============================================================================\n// FEATURE FLAGS\n// ============================================================================\n\n/** Features that an editor may or may not support */\nexport interface EditorFeatures {\n // Text formatting\n bold: boolean\n italic: boolean\n underline: boolean\n strikethrough: boolean\n subscript: boolean\n superscript: boolean\n code: boolean\n codeBlock: boolean\n codeHighlighting: boolean\n\n // Font styling\n fontFamily: boolean\n fontSize: boolean\n textColor: boolean\n backgroundColor: boolean\n lineHeight: boolean\n\n // Alignment & Structure\n textAlign: boolean\n indent: boolean\n headings: boolean\n blockquote: boolean\n horizontalRule: boolean\n\n // Lists\n bulletList: boolean\n orderedList: boolean\n nestedLists: boolean\n\n // Links & Media\n links: boolean\n images: boolean\n videos: boolean\n embeds: boolean\n\n // Tables\n tables: boolean\n tableResize: boolean\n\n // Advanced\n emoji: boolean\n mentions: boolean\n hashtags: boolean\n markdown: boolean\n\n // UI\n fullscreen: boolean\n print: boolean\n characterCount: boolean\n\n // History\n undoRedo: boolean\n\n // Collaboration\n collaboration: boolean\n comments: boolean\n}\n\n/** Default feature set - all false */\nexport const DEFAULT_FEATURES: EditorFeatures = {\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false,\n subscript: false,\n superscript: false,\n code: false,\n codeBlock: false,\n codeHighlighting: false,\n fontFamily: false,\n fontSize: false,\n textColor: false,\n backgroundColor: false,\n lineHeight: false,\n textAlign: false,\n indent: false,\n headings: false,\n blockquote: false,\n horizontalRule: false,\n bulletList: false,\n orderedList: false,\n nestedLists: false,\n links: false,\n images: false,\n videos: false,\n embeds: false,\n tables: false,\n tableResize: false,\n emoji: false,\n mentions: false,\n hashtags: false,\n markdown: false,\n fullscreen: false,\n print: false,\n characterCount: false,\n undoRedo: false,\n collaboration: false,\n comments: false,\n}\n","/**\n * TipTap Editor Adapter\n *\n * This adapter wraps the TipTap editor to conform to the unified editor interface.\n */\n\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\nimport { DEFAULT_FEATURES } from \"../../core/types\";\n\n// Check if TipTap is available\n// Since TipTap is bundled with rte-builder, it's always available\nfunction checkTipTapAvailable(): boolean {\n return true;\n}\n\n// TipTap features\nconst TIPTAP_FEATURES: EditorFeatures = {\n ...DEFAULT_FEATURES,\n // Text formatting\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n subscript: true,\n superscript: true,\n code: true,\n codeBlock: true,\n codeHighlighting: true,\n // Font styling\n fontFamily: true,\n fontSize: true,\n textColor: true,\n backgroundColor: true,\n lineHeight: true,\n // Alignment & Structure\n textAlign: true,\n indent: true,\n headings: true,\n blockquote: true,\n horizontalRule: true,\n // Lists\n bulletList: true,\n orderedList: true,\n nestedLists: true,\n // Links & Media\n links: true,\n images: true,\n videos: true,\n embeds: false,\n // Tables\n tables: true,\n tableResize: true,\n // Advanced\n emoji: true,\n mentions: false, // Can be added with extension\n hashtags: false, // Can be added with extension\n markdown: false, // Can be added with extension\n // UI\n fullscreen: true,\n print: true,\n characterCount: true,\n // History\n undoRedo: true,\n // Collaboration\n collaboration: false, // Requires Y.js integration\n comments: false,\n};\n\n/**\n * TipTap Editor Adapter\n */\nexport const TipTapAdapter: EditorAdapter = {\n type: \"tiptap\",\n name: \"TipTap\",\n description:\n \"A headless, framework-agnostic rich text editor built on ProseMirror. Highly customizable with excellent TypeScript support.\",\n\n isAvailable: checkTipTapAvailable,\n\n getComponent: () => {\n // Dynamic import to avoid bundling if not used\n const { TipTapEditorComponent } = require(\"./TipTapEditorComponent\");\n return TipTapEditorComponent;\n },\n\n getSupportedFeatures: () => TIPTAP_FEATURES,\n};\n\nexport default TipTapAdapter;\n","/**\n * TipTap Adapter Exports\n */\n\nexport { TipTapAdapter, default } from './TipTapAdapter'\nexport { TipTapEditorComponent } from './TipTapEditorComponent'\nexport { TipTapToolbar } from './TipTapToolbar'\n","/**\n * Slate.js Editor Adapter\n *\n * This adapter wraps the Slate.js editor to conform to the unified editor interface.\n * Slate is a completely customizable framework for building rich text editors.\n */\n\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\nimport { DEFAULT_FEATURES } from \"../../core/types\";\n\n// Check if Slate is available\nfunction checkSlateAvailable(): boolean {\n try {\n require(\"slate\");\n require(\"slate-react\");\n return true;\n } catch {\n return false;\n }\n}\n\n// Slate.js features\nconst SLATE_FEATURES: EditorFeatures = {\n ...DEFAULT_FEATURES,\n // Text formatting\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n subscript: true,\n superscript: true,\n code: true,\n codeBlock: true,\n codeHighlighting: true,\n // Font styling\n fontFamily: true,\n fontSize: true,\n textColor: true,\n backgroundColor: true,\n lineHeight: true,\n // Alignment & Structure\n textAlign: true,\n indent: true,\n headings: true,\n blockquote: true,\n horizontalRule: true,\n // Lists\n bulletList: true,\n orderedList: true,\n nestedLists: true,\n // Links & Media\n links: true,\n images: true,\n videos: true,\n embeds: true,\n // Tables\n tables: true,\n tableResize: false, // Requires custom implementation\n // Advanced\n emoji: true,\n mentions: true, // Slate has good mention support\n hashtags: true,\n markdown: true, // Can be added with plugins\n // UI\n fullscreen: true,\n print: true,\n characterCount: true,\n // History\n undoRedo: true,\n // Collaboration\n collaboration: false, // Can be added with plugins\n comments: false,\n};\n\n/**\n * Slate.js Editor Adapter\n */\nexport const SlateAdapter: EditorAdapter = {\n type: \"slate\",\n name: \"Slate.js\",\n description:\n \"A completely customizable framework for building rich text editors. Provides full control over rendering and behavior.\",\n\n isAvailable: checkSlateAvailable,\n\n getComponent: () => {\n // Dynamic import to avoid bundling if not used\n const { SlateEditorComponent } = require(\"./SlateEditorComponent\");\n return SlateEditorComponent;\n },\n\n getSupportedFeatures: () => SLATE_FEATURES,\n};\n\nexport default SlateAdapter;\n","/**\n * Lexical Editor Adapter\n *\n * This adapter wraps Meta's Lexical editor to conform to the unified editor interface.\n * Lexical is a modern, extensible text editor framework with excellent performance.\n */\n\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\nimport { DEFAULT_FEATURES } from \"../../core/types\";\n\n// Check if Lexical is available\nfunction checkLexicalAvailable(): boolean {\n try {\n require(\"lexical\");\n require(\"@lexical/react/LexicalComposer\");\n return true;\n } catch {\n return false;\n }\n}\n\n// Lexical features\nconst LEXICAL_FEATURES: EditorFeatures = {\n ...DEFAULT_FEATURES,\n // Text formatting\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n subscript: true,\n superscript: true,\n code: true,\n codeBlock: true,\n codeHighlighting: true,\n // Font styling\n fontFamily: true,\n fontSize: true,\n textColor: true,\n backgroundColor: true,\n lineHeight: false, // Requires custom plugin\n // Alignment & Structure\n textAlign: true,\n indent: true,\n headings: true,\n blockquote: true,\n horizontalRule: true,\n // Lists\n bulletList: true,\n orderedList: true,\n nestedLists: true,\n // Links & Media\n links: true,\n images: true,\n videos: true,\n embeds: true,\n // Tables\n tables: true,\n tableResize: false, // Requires custom implementation\n // Advanced\n emoji: true,\n mentions: true, // Excellent mention support\n hashtags: true,\n markdown: true, // Native markdown support\n // UI\n fullscreen: true,\n print: true,\n characterCount: true,\n // History\n undoRedo: true,\n // Collaboration\n collaboration: true, // Built-in Yjs support\n comments: false,\n};\n\n/**\n * Lexical Editor Adapter\n */\nexport const LexicalAdapter: EditorAdapter = {\n type: \"lexical\",\n name: \"Lexical\",\n description:\n \"Meta's modern, extensible text editor framework with excellent performance and built-in collaboration support.\",\n\n isAvailable: checkLexicalAvailable,\n\n getComponent: () => {\n // Dynamic import to avoid bundling if not used\n const { LexicalEditorComponent } = require(\"./LexicalEditorComponent\");\n return LexicalEditorComponent;\n },\n\n getSupportedFeatures: () => LEXICAL_FEATURES,\n};\n\nexport default LexicalAdapter;\n","import { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport { Document } from \"@tiptap/extension-document\";\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\nimport { Text } from \"@tiptap/extension-text\";\nimport { Bold } from \"@tiptap/extension-bold\";\nimport { Italic } from \"@tiptap/extension-italic\";\nimport { Underline } from \"@tiptap/extension-underline\";\nimport { Strike } from \"@tiptap/extension-strike\";\nimport { Code } from \"@tiptap/extension-code\";\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { FontFamily } from \"@tiptap/extension-font-family\";\nimport { Color } from \"@tiptap/extension-color\";\nimport { Highlight } from \"@tiptap/extension-highlight\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { Heading } from \"@tiptap/extension-heading\";\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\nimport { ListItem } from \"@tiptap/extension-list-item\";\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\nimport { Link } from \"@tiptap/extension-link\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport { History } from \"@tiptap/extension-history\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\n\n// Lowlight for syntax highlighting\nimport { common, createLowlight } from \"lowlight\";\n\n// Custom extensions\nimport { FontSize } from \"../extensions/FontSize\";\nimport { LineHeight } from \"../extensions/LineHeight\";\nimport { Video } from \"../extensions/Video\";\nimport { Emoji } from \"../extensions/Emoji\";\nimport { Fullscreen } from \"../extensions/Fullscreen\";\nimport { Print } from \"../extensions/Print\";\nimport { Indent } from \"../extensions/Indent\";\n\n// Components\nimport { Toolbar } from \"./Toolbar\";\n\n// Types\nimport type { EditorProps, EditorRef, ToolbarButton } from \"../types\";\n\n// Create lowlight instance\nconst lowlight = createLowlight(common);\n\n// Toolbar presets\nconst toolbarPresets: Record<\"full\" | \"medium\" | \"simple\", ToolbarButton[]> = {\n full: [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"separator\",\n \"subscript\",\n \"superscript\",\n \"clearFormatting\",\n \"separator\",\n \"fontFamily\",\n \"fontSize\",\n \"lineHeight\",\n \"textColor\",\n \"backgroundColor\",\n \"separator\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\n \"alignJustify\",\n \"separator\",\n \"indent\",\n \"outdent\",\n \"separator\",\n \"bulletList\",\n \"orderedList\",\n \"separator\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"blockquote\",\n \"separator\",\n \"link\",\n \"unlink\",\n \"image\",\n \"video\",\n \"table\",\n \"emoji\",\n \"separator\",\n \"codeBlock\",\n \"horizontalRule\",\n \"separator\",\n \"undo\",\n \"redo\",\n \"separator\",\n \"fullscreen\",\n \"print\",\n ],\n medium: [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"separator\",\n \"fontFamily\",\n \"fontSize\",\n \"textColor\",\n \"backgroundColor\",\n \"separator\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\n \"separator\",\n \"bulletList\",\n \"orderedList\",\n \"separator\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"separator\",\n \"link\",\n \"image\",\n \"table\",\n \"emoji\",\n \"separator\",\n \"undo\",\n \"redo\",\n \"fullscreen\",\n ],\n simple: [\n \"bold\",\n \"italic\",\n \"underline\",\n \"separator\",\n \"bulletList\",\n \"orderedList\",\n \"separator\",\n \"link\",\n \"image\",\n \"separator\",\n \"undo\",\n \"redo\",\n ],\n};\n\nexport const RichTextEditor = forwardRef<EditorRef, EditorProps>(\n (\n {\n value = \"\",\n onChange,\n onBlur,\n onFocus,\n placeholder = \"Start typing...\",\n height = 400,\n minHeight = 300,\n maxHeight,\n disabled = false,\n readOnly = false,\n charCounterMax = -1,\n showCharCounter = false,\n toolbarPreset = \"full\",\n toolbarButtons,\n className = \"\",\n config = {},\n onMediaPickerImage,\n onMediaPickerVideo,\n enableCodeHighlight = true,\n defaultCodeLanguage = \"javascript\",\n },\n ref,\n ) => {\n // Determine which toolbar buttons to use\n const activeToolbarButtons =\n toolbarButtons || toolbarPresets[toolbarPreset];\n\n // Initialize editor\n const editor = useEditor({\n extensions: [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Underline,\n Strike,\n Code,\n enableCodeHighlight\n ? CodeBlockLowlight.configure({\n lowlight,\n defaultLanguage: defaultCodeLanguage,\n })\n : CodeBlockLowlight.configure({\n lowlight: null as any,\n }),\n Subscript,\n Superscript,\n TextStyle,\n FontFamily,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n LineHeight,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Heading.configure({\n levels: [1, 2, 3, 4, 5, 6],\n }),\n BulletList,\n OrderedList,\n ListItem,\n Blockquote,\n HorizontalRule,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Image.configure({\n inline: false,\n allowBase64: true,\n }),\n Video,\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableCell,\n TableHeader,\n History,\n Placeholder.configure({\n placeholder,\n }),\n CharacterCount.configure({\n limit: charCounterMax > 0 ? charCounterMax : undefined,\n }),\n Gapcursor,\n Dropcursor,\n HardBreak,\n // New extensions\n Emoji,\n Fullscreen,\n Print,\n Indent,\n ],\n content: value,\n editable: !disabled && !readOnly,\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n onChange?.(html);\n },\n onBlur: () => {\n onBlur?.();\n },\n onFocus: () => {\n onFocus?.();\n },\n editorProps: {\n attributes: {\n class: \"rte-builder-content\",\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\n },\n },\n ...config,\n });\n\n // Update content when value prop changes\n useEffect(() => {\n if (editor && value !== editor.getHTML()) {\n editor.commands.setContent(value);\n }\n }, [value, editor]);\n\n // Update editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!disabled && !readOnly);\n }\n }, [disabled, readOnly, editor]);\n\n // Handle media picker for images\n const handleMediaPickerImage = useCallback(async () => {\n if (onMediaPickerImage && editor) {\n const file = await onMediaPickerImage();\n if (file) {\n editor\n .chain()\n .focus()\n .setImage({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerImage, editor]);\n\n // Handle media picker for videos\n const handleMediaPickerVideo = useCallback(async () => {\n if (onMediaPickerVideo && editor) {\n const file = await onMediaPickerVideo();\n if (file) {\n editor\n .chain()\n .focus()\n .setVideo({ src: file.url, alt: file.alt || file.name })\n .run();\n }\n }\n }, [onMediaPickerVideo, editor]);\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n getContent: () => {\n return editor?.getHTML() || \"\";\n },\n setContent: (html: string) => {\n editor?.commands.setContent(html);\n },\n focus: () => {\n editor?.commands.focus();\n },\n getEditor: () => {\n return editor;\n },\n insertHTML: (html: string) => {\n editor?.commands.insertContent(html);\n },\n clear: () => {\n editor?.commands.clearContent();\n },\n isFullscreen: () => {\n return editor?.storage.fullscreen?.isFullscreen || false;\n },\n toggleFullscreen: () => {\n editor?.commands.toggleFullscreen();\n },\n print: () => {\n editor?.commands.print();\n },\n }));\n\n if (!editor) {\n return null;\n }\n\n const characterCount = editor.storage.characterCount.characters();\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\n\n return (\n <div\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\n >\n <Toolbar\n editor={editor}\n buttons={activeToolbarButtons}\n onMediaPickerImage={\n onMediaPickerImage ? handleMediaPickerImage : undefined\n }\n onMediaPickerVideo={\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\n }\n />\n <div\n className=\"rte-builder-container\"\n style={{ height: `${height}px` }}\n >\n <EditorContent editor={editor} />\n </div>\n {showCharCounter && (\n <div className=\"rte-builder-footer\">\n <div className=\"rte-builder-char-counter\">\n {characterCount}\n {characterLimit && ` / ${characterLimit}`}\n {characterLimit && characterCount > characterLimit && (\n <span className=\"rte-builder-char-counter-exceeded\">\n {\" \"}\n (limit exceeded)\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nRichTextEditor.displayName = \"RichTextEditor\";\n","import React, { useState, useRef, useEffect } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\nimport type { ToolbarButton } from \"../types\";\nimport { EMOJI_CATEGORIES } from \"../extensions/Emoji\";\nimport {\n Bold,\n Italic,\n Underline,\n Strikethrough,\n Code,\n FileCode,\n Subscript,\n Superscript,\n RemoveFormatting,\n Type,\n Highlighter,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignJustify,\n Indent,\n Outdent,\n List,\n ListOrdered,\n Heading,\n Quote,\n Minus,\n Link,\n Unlink,\n Image,\n Video,\n Table,\n Smile,\n Maximize,\n Minimize,\n Printer,\n Undo,\n Redo,\n} from \"lucide-react\";\n\ninterface ToolbarProps {\n editor: Editor | null;\n buttons: ToolbarButton[];\n onMediaPickerImage?: () => void;\n onMediaPickerVideo?: () => void;\n}\n\nconst FONT_FAMILIES = [\n { value: \"Arial\", label: \"Arial\" },\n { value: \"Georgia\", label: \"Georgia\" },\n { value: \"Times New Roman\", label: \"Times New Roman\" },\n { value: \"Courier New\", label: \"Courier New\" },\n { value: \"Verdana\", label: \"Verdana\" },\n { value: \"Roboto\", label: \"Roboto\" },\n { value: \"Open Sans\", label: \"Open Sans\" },\n { value: \"Lato\", label: \"Lato\" },\n { value: \"Montserrat\", label: \"Montserrat\" },\n { value: \"Poppins\", label: \"Poppins\" },\n];\n\nconst FONT_SIZES = [\n \"8px\",\n \"10px\",\n \"12px\",\n \"14px\",\n \"16px\",\n \"18px\",\n \"20px\",\n \"24px\",\n \"30px\",\n \"36px\",\n \"48px\",\n \"60px\",\n \"72px\",\n];\n\nconst LINE_HEIGHTS = [\n { value: \"1\", label: \"Single\" },\n { value: \"1.15\", label: \"1.15\" },\n { value: \"1.5\", label: \"1.5\" },\n { value: \"1.75\", label: \"1.75\" },\n { value: \"2\", label: \"Double\" },\n { value: \"2.5\", label: \"2.5\" },\n { value: \"3\", label: \"Triple\" },\n];\n\nconst CODE_LANGUAGES = [\n { value: \"javascript\", label: \"JavaScript\" },\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"python\", label: \"Python\" },\n { value: \"java\", label: \"Java\" },\n { value: \"cpp\", label: \"C++\" },\n { value: \"csharp\", label: \"C#\" },\n { value: \"php\", label: \"PHP\" },\n { value: \"ruby\", label: \"Ruby\" },\n { value: \"go\", label: \"Go\" },\n { value: \"rust\", label: \"Rust\" },\n { value: \"html\", label: \"HTML\" },\n { value: \"css\", label: \"CSS\" },\n { value: \"sql\", label: \"SQL\" },\n { value: \"bash\", label: \"Bash\" },\n { value: \"json\", label: \"JSON\" },\n { value: \"yaml\", label: \"YAML\" },\n { value: \"markdown\", label: \"Markdown\" },\n { value: \"xml\", label: \"XML\" },\n];\n\n// Emoji Picker Popover Component\nconst EmojiPicker: React.FC<{\n onSelect: (emoji: string) => void;\n onClose: () => void;\n}> = ({ onSelect, onClose }) => {\n const [activeCategory, setActiveCategory] =\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [onClose]);\n\n return (\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\n <div className=\"rte-builder-emoji-categories\">\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\n <button\n key={key}\n type=\"button\"\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\n onClick={() =>\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\n }\n title={category.label}\n >\n {category.emojis[0]}\n </button>\n ))}\n </div>\n <div className=\"rte-builder-emoji-grid\">\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\n <button\n key={`${emoji}-${i}`}\n type=\"button\"\n className=\"rte-builder-emoji-btn\"\n onClick={() => {\n onSelect(emoji);\n onClose();\n }}\n >\n {emoji}\n </button>\n ))}\n </div>\n </div>\n );\n};\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n editor,\n buttons,\n onMediaPickerImage,\n onMediaPickerVideo,\n}) => {\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\n\n if (!editor) return null;\n\n const ToolbarButton = ({\n onClick,\n active = false,\n disabled = false,\n children,\n title,\n buttonRef,\n }: {\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n title?: string;\n buttonRef?: React.RefObject<HTMLButtonElement>;\n }) => (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\n >\n {children}\n </button>\n );\n\n const renderButton = (button: ToolbarButton, index: number) => {\n switch (button) {\n case \"bold\":\n return (\n <ToolbarButton\n key=\"bold\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n active={editor.isActive(\"bold\")}\n title=\"Bold (Ctrl+B)\"\n >\n <Bold size={18} />\n </ToolbarButton>\n );\n\n case \"italic\":\n return (\n <ToolbarButton\n key=\"italic\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n active={editor.isActive(\"italic\")}\n title=\"Italic (Ctrl+I)\"\n >\n <Italic size={18} />\n </ToolbarButton>\n );\n\n case \"underline\":\n return (\n <ToolbarButton\n key=\"underline\"\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive(\"underline\")}\n title=\"Underline (Ctrl+U)\"\n >\n <Underline size={18} />\n </ToolbarButton>\n );\n\n case \"strike\":\n return (\n <ToolbarButton\n key=\"strike\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n active={editor.isActive(\"strike\")}\n title=\"Strikethrough\"\n >\n <Strikethrough size={18} />\n </ToolbarButton>\n );\n\n case \"code\":\n return (\n <ToolbarButton\n key=\"code\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n active={editor.isActive(\"code\")}\n title=\"Inline Code\"\n >\n <Code size={18} />\n </ToolbarButton>\n );\n\n case \"codeBlock\":\n return (\n <ToolbarButton\n key=\"codeBlock\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n active={editor.isActive(\"codeBlock\")}\n title=\"Code Block\"\n >\n <FileCode size={18} />\n </ToolbarButton>\n );\n\n case \"subscript\":\n return (\n <ToolbarButton\n key=\"subscript\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n active={editor.isActive(\"subscript\")}\n title=\"Subscript\"\n >\n <Subscript size={18} />\n </ToolbarButton>\n );\n\n case \"superscript\":\n return (\n <ToolbarButton\n key=\"superscript\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n active={editor.isActive(\"superscript\")}\n title=\"Superscript\"\n >\n <Superscript size={18} />\n </ToolbarButton>\n );\n\n case \"clearFormatting\":\n return (\n <ToolbarButton\n key=\"clearFormatting\"\n onClick={() =>\n editor.chain().focus().clearNodes().unsetAllMarks().run()\n }\n title=\"Clear Formatting\"\n >\n <RemoveFormatting size={18} />\n </ToolbarButton>\n );\n\n case \"fontFamily\":\n return (\n <select\n key=\"fontFamily\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetFontFamily().run();\n } else {\n editor.chain().focus().setFontFamily(e.target.value).run();\n }\n }}\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\n >\n <option value=\"default\">Font Family</option>\n {FONT_FAMILIES.map((font) => (\n <option key={font.value} value={font.value}>\n {font.label}\n </option>\n ))}\n </select>\n );\n\n case \"fontSize\":\n return (\n <select\n key=\"fontSize\"\n className=\"rte-builder-toolbar-select\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetFontSize().run();\n } else {\n editor.chain().focus().setFontSize(e.target.value).run();\n }\n }}\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\n >\n <option value=\"default\">Font Size</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n );\n\n case \"lineHeight\":\n return (\n <select\n key=\"lineHeight\"\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\n onChange={(e) => {\n if (e.target.value === \"default\") {\n editor.chain().focus().unsetLineHeight().run();\n } else {\n editor.chain().focus().setLineHeight(e.target.value).run();\n }\n }}\n value={\n editor.getAttributes(\"paragraph\").lineHeight ||\n editor.getAttributes(\"heading\").lineHeight ||\n \"default\"\n }\n title=\"Line Height\"\n >\n <option value=\"default\">Line Height</option>\n {LINE_HEIGHTS.map((lh) => (\n <option key={lh.value} value={lh.value}>\n {lh.label}\n </option>\n ))}\n </select>\n );\n\n case \"textColor\":\n return (\n <span key=\"textColor\" className=\"rte-builder-toolbar-color\">\n <label title=\"Text Color\">\n <Type size={18} />\n <input\n type=\"color\"\n onChange={(e) =>\n editor.chain().focus().setColor(e.target.value).run()\n }\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\n />\n </label>\n </span>\n );\n\n case \"backgroundColor\":\n return (\n <span key=\"backgroundColor\" className=\"rte-builder-toolbar-color\">\n <label title=\"Background Color\">\n <Highlighter size={18} />\n <input\n type=\"color\"\n onChange={(e) =>\n editor\n .chain()\n .focus()\n .toggleHighlight({ color: e.target.value })\n .run()\n }\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\n />\n </label>\n </span>\n );\n\n case \"alignLeft\":\n return (\n <ToolbarButton\n key=\"alignLeft\"\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\n active={editor.isActive({ textAlign: \"left\" })}\n title=\"Align Left\"\n >\n <AlignLeft size={18} />\n </ToolbarButton>\n );\n\n case \"alignCenter\":\n return (\n <ToolbarButton\n key=\"alignCenter\"\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\n active={editor.isActive({ textAlign: \"center\" })}\n title=\"Align Center\"\n >\n <AlignCenter size={18} />\n </ToolbarButton>\n );\n\n case \"alignRight\":\n return (\n <ToolbarButton\n key=\"alignRight\"\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\n active={editor.isActive({ textAlign: \"right\" })}\n title=\"Align Right\"\n >\n <AlignRight size={18} />\n </ToolbarButton>\n );\n\n case \"alignJustify\":\n return (\n <ToolbarButton\n key=\"alignJustify\"\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\n active={editor.isActive({ textAlign: \"justify\" })}\n title=\"Justify\"\n >\n <AlignJustify size={18} />\n </ToolbarButton>\n );\n\n case \"indent\":\n return (\n <ToolbarButton\n key=\"indent\"\n onClick={() => editor.chain().focus().indent().run()}\n title=\"Indent (Tab)\"\n >\n <Indent size={18} />\n </ToolbarButton>\n );\n\n case \"outdent\":\n return (\n <ToolbarButton\n key=\"outdent\"\n onClick={() => editor.chain().focus().outdent().run()}\n title=\"Outdent (Shift+Tab)\"\n >\n <Outdent size={18} />\n </ToolbarButton>\n );\n\n case \"bulletList\":\n return (\n <ToolbarButton\n key=\"bulletList\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n active={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n <List size={18} />\n </ToolbarButton>\n );\n\n case \"orderedList\":\n return (\n <ToolbarButton\n key=\"orderedList\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n active={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n <ListOrdered size={18} />\n </ToolbarButton>\n );\n\n case \"heading1\":\n case \"heading2\":\n case \"heading3\":\n case \"heading4\":\n case \"heading5\":\n case \"heading6\":\n const level = parseInt(button.replace(\"heading\", \"\")) as\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6;\n return (\n <ToolbarButton\n key={button}\n onClick={() =>\n editor.chain().focus().toggleHeading({ level }).run()\n }\n active={editor.isActive(\"heading\", { level })}\n title={`Heading ${level}`}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"2px\" }}>\n <Heading size={18} />\n <span style={{ fontSize: \"11px\", fontWeight: \"bold\" }}>{level}</span>\n </span>\n </ToolbarButton>\n );\n\n case \"blockquote\":\n return (\n <ToolbarButton\n key=\"blockquote\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n active={editor.isActive(\"blockquote\")}\n title=\"Blockquote\"\n >\n <Quote size={18} />\n </ToolbarButton>\n );\n\n case \"horizontalRule\":\n return (\n <ToolbarButton\n key=\"horizontalRule\"\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title=\"Horizontal Rule\"\n >\n <Minus size={18} />\n </ToolbarButton>\n );\n\n case \"link\":\n return (\n <ToolbarButton\n key=\"link\"\n onClick={() => {\n const url = window.prompt(\"Enter URL:\");\n if (url) {\n editor.chain().focus().setLink({ href: url }).run();\n }\n }}\n active={editor.isActive(\"link\")}\n title=\"Insert Link\"\n >\n <Link size={18} />\n </ToolbarButton>\n );\n\n case \"unlink\":\n return (\n <ToolbarButton\n key=\"unlink\"\n onClick={() => editor.chain().focus().unsetLink().run()}\n disabled={!editor.isActive(\"link\")}\n title=\"Remove Link\"\n >\n <Unlink size={18} />\n </ToolbarButton>\n );\n\n case \"image\":\n return (\n <ToolbarButton\n key=\"image\"\n onClick={() => {\n if (onMediaPickerImage) {\n onMediaPickerImage();\n } else {\n const url = window.prompt(\"Enter image URL:\");\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }\n }}\n title=\"Insert Image\"\n >\n <Image size={18} />\n </ToolbarButton>\n );\n\n case \"video\":\n return (\n <ToolbarButton\n key=\"video\"\n onClick={() => {\n if (onMediaPickerVideo) {\n onMediaPickerVideo();\n } else {\n const url = window.prompt(\"Enter video URL:\");\n if (url) {\n editor.chain().focus().setVideo({ src: url }).run();\n }\n }\n }}\n title=\"Insert Video\"\n >\n <Video size={18} />\n </ToolbarButton>\n );\n\n case \"table\":\n return (\n <ToolbarButton\n key=\"table\"\n onClick={() =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run()\n }\n title=\"Insert Table\"\n >\n <Table size={18} />\n </ToolbarButton>\n );\n\n case \"emoji\":\n return (\n <span key=\"emoji\" style={{ position: \"relative\" }}>\n <ToolbarButton\n buttonRef={emojiButtonRef}\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\n active={showEmojiPicker}\n title=\"Insert Emoji\"\n >\n <Smile size={18} />\n </ToolbarButton>\n {showEmojiPicker && (\n <EmojiPicker\n onSelect={(emoji) =>\n editor.chain().focus().insertEmoji(emoji).run()\n }\n onClose={() => setShowEmojiPicker(false)}\n />\n )}\n </span>\n );\n\n case \"fullscreen\":\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\n return (\n <ToolbarButton\n key=\"fullscreen\"\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\n active={isFullscreen}\n title={\n isFullscreen\n ? \"Exit Fullscreen (Esc)\"\n : \"Fullscreen (Ctrl+Shift+F)\"\n }\n >\n {isFullscreen ? <Minimize size={18} /> : <Maximize size={18} />}\n </ToolbarButton>\n );\n\n case \"print\":\n return (\n <ToolbarButton\n key=\"print\"\n onClick={() => editor.chain().focus().print().run()}\n title=\"Print (Ctrl+P)\"\n >\n <Printer size={18} />\n </ToolbarButton>\n );\n\n case \"undo\":\n return (\n <ToolbarButton\n key=\"undo\"\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo (Ctrl+Z)\"\n >\n <Undo size={18} />\n </ToolbarButton>\n );\n\n case \"redo\":\n return (\n <ToolbarButton\n key=\"redo\"\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo (Ctrl+Y)\"\n >\n <Redo size={18} />\n </ToolbarButton>\n );\n\n case \"separator\":\n return (\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\n );\n\n default:\n return null;\n }\n };\n\n return <div className=\"rte-builder-toolbar\">{buttons.map(renderButton)}</div>;\n};\n","/**\n * Collaboration Context\n * Provides real-time collaboration state and methods to child components\n */\n\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\nimport type {\n CollaborationState,\n CollaborationConfig,\n CollaborationUser,\n CollaborationStatus,\n CollaborationEvent,\n CursorPosition,\n} from './types'\n\n/** Actions for collaboration reducer */\ntype CollaborationAction =\n | { type: 'SET_STATUS'; status: CollaborationStatus }\n | { type: 'SET_USERS'; users: CollaborationUser[] }\n | { type: 'ADD_USER'; user: CollaborationUser }\n | { type: 'REMOVE_USER'; userId: string }\n | { type: 'UPDATE_CURSOR'; userId: string; cursor: CursorPosition }\n | { type: 'SET_ERROR'; error: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'SET_HOST'; isHost: boolean }\n\n/** Initial collaboration state */\nconst initialState: CollaborationState = {\n status: 'disconnected',\n users: [],\n error: undefined,\n isHost: false,\n}\n\n/** Collaboration reducer */\nfunction collaborationReducer(state: CollaborationState, action: CollaborationAction): CollaborationState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, status: action.status, error: action.status === 'error' ? state.error : undefined }\n case 'SET_USERS':\n return { ...state, users: action.users }\n case 'ADD_USER':\n if (state.users.find(u => u.id === action.user.id)) {\n return {\n ...state,\n users: state.users.map(u => u.id === action.user.id ? action.user : u),\n }\n }\n return { ...state, users: [...state.users, action.user] }\n case 'REMOVE_USER':\n return { ...state, users: state.users.filter(u => u.id !== action.userId) }\n case 'UPDATE_CURSOR':\n return {\n ...state,\n users: state.users.map(u =>\n u.id === action.userId ? { ...u, cursor: action.cursor, lastActive: Date.now() } : u\n ),\n }\n case 'SET_ERROR':\n return { ...state, status: 'error', error: action.error }\n case 'CLEAR_ERROR':\n return { ...state, error: undefined }\n case 'SET_HOST':\n return { ...state, isHost: action.isHost }\n default:\n return state\n }\n}\n\n/** Context value type */\ninterface CollaborationContextValue {\n state: CollaborationState\n config: CollaborationConfig | null\n connect: () => Promise<void>\n disconnect: () => void\n updateCursor: (cursor: CursorPosition) => void\n isEnabled: boolean\n}\n\n/** Create context */\nconst CollaborationContext = createContext<CollaborationContextValue | null>(null)\n\n/** Provider props */\ninterface CollaborationProviderProps {\n children: ReactNode\n config?: CollaborationConfig\n onStatusChange?: (status: CollaborationStatus) => void\n onUsersChange?: (users: CollaborationUser[]) => void\n}\n\n/** Generate a random color for user */\nfunction generateUserColor(): string {\n const colors = [\n '#f87171', '#fb923c', '#fbbf24', '#a3e635', '#4ade80',\n '#2dd4bf', '#22d3ee', '#60a5fa', '#a78bfa', '#e879f9',\n ]\n return colors[Math.floor(Math.random() * colors.length)]\n}\n\n/** Collaboration Provider Component */\nexport function CollaborationProvider({\n children,\n config,\n onStatusChange,\n onUsersChange,\n}: CollaborationProviderProps) {\n const [state, dispatch] = useReducer(collaborationReducer, initialState)\n const wsRef = useRef<WebSocket | null>(null)\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n const reconnectAttemptsRef = useRef(0)\n\n // Notify on status change\n useEffect(() => {\n onStatusChange?.(state.status)\n }, [state.status, onStatusChange])\n\n // Notify on users change\n useEffect(() => {\n onUsersChange?.(state.users)\n }, [state.users, onUsersChange])\n\n /** Connect to collaboration server */\n const connect = useCallback(async () => {\n if (!config) return\n\n dispatch({ type: 'SET_STATUS', status: 'connecting' })\n\n try {\n if (config.provider === 'websocket' && config.serverUrl) {\n const url = new URL(config.serverUrl)\n url.searchParams.set('room', config.roomId)\n if (config.token) {\n url.searchParams.set('token', config.token)\n }\n\n const ws = new WebSocket(url.toString())\n wsRef.current = ws\n\n ws.onopen = () => {\n dispatch({ type: 'SET_STATUS', status: 'connected' })\n reconnectAttemptsRef.current = 0\n\n // Send join message\n ws.send(JSON.stringify({\n type: 'join',\n user: {\n id: config.user.id,\n name: config.user.name,\n avatar: config.user.avatar,\n color: config.user.color || generateUserColor(),\n },\n }))\n }\n\n ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as CollaborationEvent\n handleCollaborationEvent(message)\n } catch {\n console.error('Failed to parse collaboration message')\n }\n }\n\n ws.onclose = () => {\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\n handleReconnect()\n }\n\n ws.onerror = () => {\n dispatch({ type: 'SET_ERROR', error: 'Connection error' })\n }\n } else if (config.provider === 'webrtc') {\n // WebRTC implementation would go here\n dispatch({ type: 'SET_ERROR', error: 'WebRTC provider not yet implemented' })\n } else if (config.provider === 'custom') {\n // Custom provider - user handles connection\n dispatch({ type: 'SET_STATUS', status: 'connected' })\n }\n } catch (error) {\n dispatch({ type: 'SET_ERROR', error: error instanceof Error ? error.message : 'Connection failed' })\n }\n }, [config])\n\n /** Handle collaboration events */\n const handleCollaborationEvent = useCallback((event: CollaborationEvent) => {\n switch (event.type) {\n case 'user-joined':\n dispatch({ type: 'ADD_USER', user: event.user })\n break\n case 'user-left':\n dispatch({ type: 'REMOVE_USER', userId: event.userId })\n break\n case 'cursor-moved':\n dispatch({ type: 'UPDATE_CURSOR', userId: event.userId, cursor: event.cursor })\n break\n case 'status-changed':\n dispatch({ type: 'SET_STATUS', status: event.status })\n break\n case 'error':\n dispatch({ type: 'SET_ERROR', error: event.message })\n break\n }\n }, [])\n\n /** Handle reconnection */\n const handleReconnect = useCallback(() => {\n if (!config?.autoReconnect) return\n\n const maxAttempts = config.maxReconnectAttempts ?? 5\n const interval = config.reconnectInterval ?? 3000\n\n if (reconnectAttemptsRef.current >= maxAttempts) {\n dispatch({ type: 'SET_ERROR', error: 'Max reconnection attempts reached' })\n return\n }\n\n dispatch({ type: 'SET_STATUS', status: 'reconnecting' })\n reconnectAttemptsRef.current++\n\n reconnectTimeoutRef.current = setTimeout(() => {\n connect()\n }, interval)\n }, [config, connect])\n\n /** Disconnect from collaboration server */\n const disconnect = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current)\n }\n\n if (wsRef.current) {\n wsRef.current.close()\n wsRef.current = null\n }\n\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\n dispatch({ type: 'SET_USERS', users: [] })\n }, [])\n\n /** Update cursor position */\n const updateCursor = useCallback((cursor: CursorPosition) => {\n if (!config || !wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) return\n\n wsRef.current.send(JSON.stringify({\n type: 'cursor',\n userId: config.user.id,\n cursor,\n }))\n }, [config])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n disconnect()\n }\n }, [disconnect])\n\n const value: CollaborationContextValue = {\n state,\n config: config ?? null,\n connect,\n disconnect,\n updateCursor,\n isEnabled: !!config,\n }\n\n return (\n <CollaborationContext.Provider value={value}>\n {children}\n </CollaborationContext.Provider>\n )\n}\n\n/** Hook to use collaboration context */\nexport function useCollaboration() {\n const context = useContext(CollaborationContext)\n if (!context) {\n throw new Error('useCollaboration must be used within a CollaborationProvider')\n }\n return context\n}\n\n/** Hook to check if collaboration is available (doesn't throw) */\nexport function useCollaborationOptional() {\n return useContext(CollaborationContext)\n}\n\nexport default CollaborationContext\n","/**\n * Presence Indicator Component\n * Shows connected users with avatars and status\n */\n\nimport { useCollaborationOptional } from './CollaborationContext'\nimport type { CollaborationUser } from './types'\n\ninterface PresenceIndicatorProps {\n /** Maximum avatars to show before \"+N\" */\n maxAvatars?: number\n /** Show user names on hover */\n showNames?: boolean\n /** Custom class name */\n className?: string\n}\n\n/** Get initials from name */\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .map(n => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n}\n\n/** Single user avatar */\nfunction UserAvatar({ user, showName }: { user: CollaborationUser; showName?: boolean }) {\n return (\n <div\n className=\"rte-presence-avatar\"\n style={{ borderColor: user.color }}\n title={user.name}\n >\n {user.avatar ? (\n <img src={user.avatar} alt={user.name} />\n ) : (\n <span style={{ backgroundColor: user.color }}>\n {getInitials(user.name)}\n </span>\n )}\n {user.isActive && <div className=\"rte-presence-active-dot\" />}\n {showName && <div className=\"rte-presence-name\">{user.name}</div>}\n </div>\n )\n}\n\n/** Connection status badge */\nfunction StatusBadge({ status }: { status: string }) {\n const statusConfig: Record<string, { label: string; color: string }> = {\n connected: { label: 'Connected', color: '#22c55e' },\n connecting: { label: 'Connecting...', color: '#eab308' },\n reconnecting: { label: 'Reconnecting...', color: '#f97316' },\n disconnected: { label: 'Disconnected', color: '#6b7280' },\n error: { label: 'Error', color: '#ef4444' },\n }\n\n const config = statusConfig[status] || statusConfig.disconnected\n\n return (\n <div className=\"rte-presence-status\" style={{ color: config.color }}>\n <div className=\"rte-presence-status-dot\" style={{ backgroundColor: config.color }} />\n {config.label}\n </div>\n )\n}\n\n/** Presence Indicator Component */\nexport function PresenceIndicator({\n maxAvatars = 5,\n showNames = false,\n className = '',\n}: PresenceIndicatorProps) {\n const collaboration = useCollaborationOptional()\n\n if (!collaboration?.isEnabled) {\n return null\n }\n\n const { state } = collaboration\n const visibleUsers = state.users.slice(0, maxAvatars)\n const remainingCount = Math.max(0, state.users.length - maxAvatars)\n\n return (\n <div className={`rte-presence-indicator ${className}`}>\n <StatusBadge status={state.status} />\n\n {state.users.length > 0 && (\n <div className=\"rte-presence-avatars\">\n {visibleUsers.map(user => (\n <UserAvatar key={user.id} user={user} showName={showNames} />\n ))}\n {remainingCount > 0 && (\n <div className=\"rte-presence-avatar rte-presence-more\">\n +{remainingCount}\n </div>\n )}\n </div>\n )}\n\n {state.error && (\n <div className=\"rte-presence-error\" title={state.error}>\n !\n </div>\n )}\n </div>\n )\n}\n\nexport default PresenceIndicator\n","/**\n * Comments & Annotations Types\n * Types for inline comments and annotation features\n */\n\n/** Comment author information */\nexport interface CommentAuthor {\n /** Unique user identifier */\n id: string\n /** Display name */\n name: string\n /** Avatar URL (optional) */\n avatar?: string\n}\n\n/** Text range for comment anchor */\nexport interface CommentRange {\n /** Start position in document */\n from: number\n /** End position in document */\n to: number\n /** Selected text content */\n text: string\n}\n\n/** Single comment in a thread */\nexport interface Comment {\n /** Unique comment identifier */\n id: string\n /** Thread this comment belongs to */\n threadId: string\n /** Comment content (can be HTML) */\n content: string\n /** Comment author */\n author: CommentAuthor\n /** Creation timestamp */\n createdAt: number\n /** Last update timestamp */\n updatedAt?: number\n /** Is this comment edited */\n isEdited: boolean\n /** Reactions on this comment */\n reactions?: CommentReaction[]\n}\n\n/** Reaction on a comment */\nexport interface CommentReaction {\n /** Emoji reaction */\n emoji: string\n /** Users who reacted */\n users: CommentAuthor[]\n}\n\n/** Comment thread (group of comments on a text range) */\nexport interface CommentThread {\n /** Unique thread identifier */\n id: string\n /** Text range this thread is attached to */\n range: CommentRange\n /** Comments in this thread */\n comments: Comment[]\n /** Thread status */\n status: 'open' | 'resolved'\n /** Thread creation timestamp */\n createdAt: number\n /** Thread resolution timestamp */\n resolvedAt?: number\n /** User who resolved the thread */\n resolvedBy?: CommentAuthor\n}\n\n/** Comment highlight type */\nexport type CommentHighlightType = 'active' | 'hover' | 'resolved' | 'default'\n\n/** Comments state */\nexport interface CommentsState {\n /** All comment threads */\n threads: CommentThread[]\n /** Currently active/selected thread ID */\n activeThreadId: string | null\n /** Is comment panel open */\n isPanelOpen: boolean\n /** Filter for threads */\n filter: 'all' | 'open' | 'resolved'\n /** Current user (for adding comments) */\n currentUser: CommentAuthor | null\n}\n\n/** Comment event types */\nexport type CommentEvent =\n | { type: 'thread-created'; thread: CommentThread }\n | { type: 'thread-deleted'; threadId: string }\n | { type: 'thread-resolved'; threadId: string; resolvedBy: CommentAuthor }\n | { type: 'thread-reopened'; threadId: string }\n | { type: 'comment-added'; threadId: string; comment: Comment }\n | { type: 'comment-updated'; threadId: string; comment: Comment }\n | { type: 'comment-deleted'; threadId: string; commentId: string }\n | { type: 'reaction-added'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\n | { type: 'reaction-removed'; threadId: string; commentId: string; emoji: string; userId: string }\n\n/** Comments configuration */\nexport interface CommentsConfig {\n /** Current user for adding comments */\n currentUser: CommentAuthor\n /** Allow resolving threads */\n allowResolve?: boolean\n /** Allow deleting comments */\n allowDelete?: boolean\n /** Allow editing comments */\n allowEdit?: boolean\n /** Allow reactions */\n allowReactions?: boolean\n /** Available reaction emojis */\n reactionEmojis?: string[]\n /** Callback to persist comments */\n onSave?: (threads: CommentThread[]) => Promise<void>\n /** Callback to load comments */\n onLoad?: () => Promise<CommentThread[]>\n}\n\n/** Props for comments-enabled editor */\nexport interface CommentsProps {\n /** Enable comments features */\n comments?: CommentsConfig\n /** Initial comment threads */\n initialThreads?: CommentThread[]\n /** Callback when threads change */\n onThreadsChange?: (threads: CommentThread[]) => void\n /** Show comment highlights in editor */\n showCommentHighlights?: boolean\n /** Show comment panel */\n showCommentPanel?: boolean\n /** Comment panel position */\n commentPanelPosition?: 'left' | 'right'\n}\n\n/** Default reaction emojis */\nexport const DEFAULT_REACTION_EMOJIS = ['๐Ÿ‘', '๐Ÿ‘Ž', 'โค๏ธ', '๐ŸŽ‰', '๐Ÿ˜„', '๐Ÿ˜•', '๐Ÿ‘€', '๐Ÿš€']\n","/**\n * Comments Context\n * Provides comments and annotations state and methods to child components\n */\n\nimport { createContext, useContext, useReducer, useCallback, useEffect, ReactNode } from 'react'\nimport type {\n CommentsState,\n CommentsConfig,\n CommentThread,\n Comment,\n CommentAuthor,\n CommentRange,\n CommentEvent,\n} from './types'\nimport { DEFAULT_REACTION_EMOJIS } from './types'\n\n/** Actions for comments reducer */\ntype CommentsAction =\n | { type: 'SET_THREADS'; threads: CommentThread[] }\n | { type: 'ADD_THREAD'; thread: CommentThread }\n | { type: 'DELETE_THREAD'; threadId: string }\n | { type: 'RESOLVE_THREAD'; threadId: string; resolvedBy: CommentAuthor }\n | { type: 'REOPEN_THREAD'; threadId: string }\n | { type: 'ADD_COMMENT'; threadId: string; comment: Comment }\n | { type: 'UPDATE_COMMENT'; threadId: string; comment: Comment }\n | { type: 'DELETE_COMMENT'; threadId: string; commentId: string }\n | { type: 'ADD_REACTION'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\n | { type: 'REMOVE_REACTION'; threadId: string; commentId: string; emoji: string; userId: string }\n | { type: 'SET_ACTIVE_THREAD'; threadId: string | null }\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\n | { type: 'SET_FILTER'; filter: 'all' | 'open' | 'resolved' }\n | { type: 'SET_CURRENT_USER'; user: CommentAuthor | null }\n\n/** Initial comments state */\nconst initialState: CommentsState = {\n threads: [],\n activeThreadId: null,\n isPanelOpen: false,\n filter: 'all',\n currentUser: null,\n}\n\n/** Generate unique ID */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/** Comments reducer */\nfunction commentsReducer(state: CommentsState, action: CommentsAction): CommentsState {\n switch (action.type) {\n case 'SET_THREADS':\n return { ...state, threads: action.threads }\n\n case 'ADD_THREAD':\n return { ...state, threads: [...state.threads, action.thread] }\n\n case 'DELETE_THREAD':\n return {\n ...state,\n threads: state.threads.filter(t => t.id !== action.threadId),\n activeThreadId: state.activeThreadId === action.threadId ? null : state.activeThreadId,\n }\n\n case 'RESOLVE_THREAD':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, status: 'resolved' as const, resolvedAt: Date.now(), resolvedBy: action.resolvedBy }\n : t\n ),\n }\n\n case 'REOPEN_THREAD':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, status: 'open' as const, resolvedAt: undefined, resolvedBy: undefined }\n : t\n ),\n }\n\n case 'ADD_COMMENT':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, comments: [...t.comments, action.comment] }\n : t\n ),\n }\n\n case 'UPDATE_COMMENT':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? {\n ...t,\n comments: t.comments.map(c =>\n c.id === action.comment.id ? action.comment : c\n ),\n }\n : t\n ),\n }\n\n case 'DELETE_COMMENT':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? { ...t, comments: t.comments.filter(c => c.id !== action.commentId) }\n : t\n ),\n }\n\n case 'ADD_REACTION':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? {\n ...t,\n comments: t.comments.map(c => {\n if (c.id !== action.commentId) return c\n const reactions = c.reactions || []\n const existingReaction = reactions.find(r => r.emoji === action.emoji)\n if (existingReaction) {\n return {\n ...c,\n reactions: reactions.map(r =>\n r.emoji === action.emoji\n ? { ...r, users: [...r.users, action.user] }\n : r\n ),\n }\n }\n return {\n ...c,\n reactions: [...reactions, { emoji: action.emoji, users: [action.user] }],\n }\n }),\n }\n : t\n ),\n }\n\n case 'REMOVE_REACTION':\n return {\n ...state,\n threads: state.threads.map(t =>\n t.id === action.threadId\n ? {\n ...t,\n comments: t.comments.map(c => {\n if (c.id !== action.commentId) return c\n return {\n ...c,\n reactions: (c.reactions || [])\n .map(r =>\n r.emoji === action.emoji\n ? { ...r, users: r.users.filter(u => u.id !== action.userId) }\n : r\n )\n .filter(r => r.users.length > 0),\n }\n }),\n }\n : t\n ),\n }\n\n case 'SET_ACTIVE_THREAD':\n return { ...state, activeThreadId: action.threadId }\n\n case 'TOGGLE_PANEL':\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\n\n case 'SET_FILTER':\n return { ...state, filter: action.filter }\n\n case 'SET_CURRENT_USER':\n return { ...state, currentUser: action.user }\n\n default:\n return state\n }\n}\n\n/** Context value type */\ninterface CommentsContextValue {\n state: CommentsState\n config: CommentsConfig | null\n\n // Thread operations\n createThread: (range: CommentRange, initialComment: string) => CommentThread | null\n deleteThread: (threadId: string) => void\n resolveThread: (threadId: string) => void\n reopenThread: (threadId: string) => void\n\n // Comment operations\n addComment: (threadId: string, content: string) => Comment | null\n updateComment: (threadId: string, commentId: string, content: string) => void\n deleteComment: (threadId: string, commentId: string) => void\n\n // Reaction operations\n addReaction: (threadId: string, commentId: string, emoji: string) => void\n removeReaction: (threadId: string, commentId: string, emoji: string) => void\n\n // UI operations\n setActiveThread: (threadId: string | null) => void\n togglePanel: (isOpen?: boolean) => void\n setFilter: (filter: 'all' | 'open' | 'resolved') => void\n\n // Getters\n getThreadByRange: (from: number, to: number) => CommentThread | undefined\n getFilteredThreads: () => CommentThread[]\n\n // Event subscription\n subscribe: (callback: (event: CommentEvent) => void) => () => void\n\n isEnabled: boolean\n}\n\n/** Create context */\nconst CommentsContext = createContext<CommentsContextValue | null>(null)\n\n/** Provider props */\ninterface CommentsProviderProps {\n children: ReactNode\n config?: CommentsConfig\n initialThreads?: CommentThread[]\n onThreadsChange?: (threads: CommentThread[]) => void\n}\n\n/** Comments Provider Component */\nexport function CommentsProvider({\n children,\n config,\n initialThreads = [],\n onThreadsChange,\n}: CommentsProviderProps) {\n const [state, dispatch] = useReducer(commentsReducer, {\n ...initialState,\n threads: initialThreads,\n currentUser: config?.currentUser ?? null,\n })\n\n const subscribersRef = { current: new Set<(event: CommentEvent) => void>() }\n\n // Load initial threads\n useEffect(() => {\n if (config?.onLoad) {\n config.onLoad().then(threads => {\n dispatch({ type: 'SET_THREADS', threads })\n })\n }\n }, [config])\n\n // Notify on threads change\n useEffect(() => {\n onThreadsChange?.(state.threads)\n if (config?.onSave) {\n config.onSave(state.threads)\n }\n }, [state.threads, onThreadsChange, config])\n\n // Update current user when config changes\n useEffect(() => {\n if (config?.currentUser) {\n dispatch({ type: 'SET_CURRENT_USER', user: config.currentUser })\n }\n }, [config?.currentUser])\n\n /** Emit event to subscribers */\n const emitEvent = useCallback((event: CommentEvent) => {\n subscribersRef.current.forEach(callback => callback(event))\n }, [])\n\n /** Create a new thread */\n const createThread = useCallback((range: CommentRange, initialComment: string): CommentThread | null => {\n if (!state.currentUser) return null\n\n const threadId = generateId()\n const commentId = generateId()\n const now = Date.now()\n\n const comment: Comment = {\n id: commentId,\n threadId,\n content: initialComment,\n author: state.currentUser,\n createdAt: now,\n isEdited: false,\n }\n\n const thread: CommentThread = {\n id: threadId,\n range,\n comments: [comment],\n status: 'open',\n createdAt: now,\n }\n\n dispatch({ type: 'ADD_THREAD', thread })\n emitEvent({ type: 'thread-created', thread })\n return thread\n }, [state.currentUser, emitEvent])\n\n /** Delete a thread */\n const deleteThread = useCallback((threadId: string) => {\n if (config?.allowDelete === false) return\n dispatch({ type: 'DELETE_THREAD', threadId })\n emitEvent({ type: 'thread-deleted', threadId })\n }, [config, emitEvent])\n\n /** Resolve a thread */\n const resolveThread = useCallback((threadId: string) => {\n if (!state.currentUser || config?.allowResolve === false) return\n dispatch({ type: 'RESOLVE_THREAD', threadId, resolvedBy: state.currentUser })\n emitEvent({ type: 'thread-resolved', threadId, resolvedBy: state.currentUser })\n }, [state.currentUser, config, emitEvent])\n\n /** Reopen a thread */\n const reopenThread = useCallback((threadId: string) => {\n dispatch({ type: 'REOPEN_THREAD', threadId })\n emitEvent({ type: 'thread-reopened', threadId })\n }, [emitEvent])\n\n /** Add a comment to a thread */\n const addComment = useCallback((threadId: string, content: string): Comment | null => {\n if (!state.currentUser) return null\n\n const comment: Comment = {\n id: generateId(),\n threadId,\n content,\n author: state.currentUser,\n createdAt: Date.now(),\n isEdited: false,\n }\n\n dispatch({ type: 'ADD_COMMENT', threadId, comment })\n emitEvent({ type: 'comment-added', threadId, comment })\n return comment\n }, [state.currentUser, emitEvent])\n\n /** Update a comment */\n const updateComment = useCallback((threadId: string, commentId: string, content: string) => {\n if (config?.allowEdit === false) return\n\n const thread = state.threads.find(t => t.id === threadId)\n const existingComment = thread?.comments.find(c => c.id === commentId)\n if (!existingComment) return\n\n const updatedComment: Comment = {\n ...existingComment,\n content,\n updatedAt: Date.now(),\n isEdited: true,\n }\n\n dispatch({ type: 'UPDATE_COMMENT', threadId, comment: updatedComment })\n emitEvent({ type: 'comment-updated', threadId, comment: updatedComment })\n }, [state.threads, config, emitEvent])\n\n /** Delete a comment */\n const deleteComment = useCallback((threadId: string, commentId: string) => {\n if (config?.allowDelete === false) return\n dispatch({ type: 'DELETE_COMMENT', threadId, commentId })\n emitEvent({ type: 'comment-deleted', threadId, commentId })\n }, [config, emitEvent])\n\n /** Add a reaction */\n const addReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\n if (!state.currentUser || config?.allowReactions === false) return\n\n const allowedEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\n if (!allowedEmojis.includes(emoji)) return\n\n dispatch({ type: 'ADD_REACTION', threadId, commentId, emoji, user: state.currentUser })\n emitEvent({ type: 'reaction-added', threadId, commentId, emoji, user: state.currentUser })\n }, [state.currentUser, config, emitEvent])\n\n /** Remove a reaction */\n const removeReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\n if (!state.currentUser) return\n dispatch({ type: 'REMOVE_REACTION', threadId, commentId, emoji, userId: state.currentUser.id })\n emitEvent({ type: 'reaction-removed', threadId, commentId, emoji, userId: state.currentUser.id })\n }, [state.currentUser, emitEvent])\n\n /** Set active thread */\n const setActiveThread = useCallback((threadId: string | null) => {\n dispatch({ type: 'SET_ACTIVE_THREAD', threadId })\n }, [])\n\n /** Toggle panel */\n const togglePanel = useCallback((isOpen?: boolean) => {\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\n }, [])\n\n /** Set filter */\n const setFilter = useCallback((filter: 'all' | 'open' | 'resolved') => {\n dispatch({ type: 'SET_FILTER', filter })\n }, [])\n\n /** Get thread by range */\n const getThreadByRange = useCallback((from: number, to: number) => {\n return state.threads.find(t => t.range.from === from && t.range.to === to)\n }, [state.threads])\n\n /** Get filtered threads */\n const getFilteredThreads = useCallback(() => {\n if (state.filter === 'all') return state.threads\n return state.threads.filter(t => t.status === state.filter)\n }, [state.threads, state.filter])\n\n /** Subscribe to events */\n const subscribe = useCallback((callback: (event: CommentEvent) => void) => {\n subscribersRef.current.add(callback)\n return () => {\n subscribersRef.current.delete(callback)\n }\n }, [])\n\n const value: CommentsContextValue = {\n state,\n config: config ?? null,\n createThread,\n deleteThread,\n resolveThread,\n reopenThread,\n addComment,\n updateComment,\n deleteComment,\n addReaction,\n removeReaction,\n setActiveThread,\n togglePanel,\n setFilter,\n getThreadByRange,\n getFilteredThreads,\n subscribe,\n isEnabled: !!config,\n }\n\n return (\n <CommentsContext.Provider value={value}>\n {children}\n </CommentsContext.Provider>\n )\n}\n\n/** Hook to use comments context */\nexport function useComments() {\n const context = useContext(CommentsContext)\n if (!context) {\n throw new Error('useComments must be used within a CommentsProvider')\n }\n return context\n}\n\n/** Hook to check if comments is available (doesn't throw) */\nexport function useCommentsOptional() {\n return useContext(CommentsContext)\n}\n\nexport default CommentsContext\n","/**\n * Comments Panel Component\n * Displays comment threads with reply functionality\n */\n\nimport { useState } from 'react'\nimport { useCommentsOptional } from './CommentsContext'\nimport type { CommentThread, Comment as CommentType } from './types'\nimport { DEFAULT_REACTION_EMOJIS } from './types'\n\ninterface CommentsPanelProps {\n /** Panel position */\n position?: 'left' | 'right'\n /** Custom class name */\n className?: string\n}\n\n/** Format relative time */\nfunction formatRelativeTime(timestamp: number): string {\n const now = Date.now()\n const diff = now - timestamp\n const minutes = Math.floor(diff / 60000)\n const hours = Math.floor(diff / 3600000)\n const days = Math.floor(diff / 86400000)\n\n if (minutes < 1) return 'Just now'\n if (minutes < 60) return `${minutes}m ago`\n if (hours < 24) return `${hours}h ago`\n if (days < 7) return `${days}d ago`\n\n return new Date(timestamp).toLocaleDateString()\n}\n\n/** Single comment component */\nfunction CommentItem({\n comment,\n threadId,\n isFirst,\n}: {\n comment: CommentType\n threadId: string\n isFirst: boolean\n}) {\n const comments = useCommentsOptional()\n const [isEditing, setIsEditing] = useState(false)\n const [editContent, setEditContent] = useState(comment.content)\n const [showReactions, setShowReactions] = useState(false)\n\n if (!comments) return null\n\n const { config, updateComment, deleteComment, addReaction, removeReaction, state } = comments\n const canEdit = config?.allowEdit !== false && comment.author.id === state.currentUser?.id\n const canDelete = config?.allowDelete !== false && comment.author.id === state.currentUser?.id\n const canReact = config?.allowReactions !== false\n const reactionEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\n\n const handleSaveEdit = () => {\n updateComment(threadId, comment.id, editContent)\n setIsEditing(false)\n }\n\n const handleToggleReaction = (emoji: string) => {\n const reaction = comment.reactions?.find(r => r.emoji === emoji)\n const hasReacted = reaction?.users.some(u => u.id === state.currentUser?.id)\n\n if (hasReacted) {\n removeReaction(threadId, comment.id, emoji)\n } else {\n addReaction(threadId, comment.id, emoji)\n }\n setShowReactions(false)\n }\n\n return (\n <div className={`rte-comment ${isFirst ? 'rte-comment-first' : ''}`}>\n <div className=\"rte-comment-header\">\n <div className=\"rte-comment-author\">\n {comment.author.avatar ? (\n <img src={comment.author.avatar} alt={comment.author.name} className=\"rte-comment-avatar\" />\n ) : (\n <div className=\"rte-comment-avatar-placeholder\">\n {comment.author.name.charAt(0).toUpperCase()}\n </div>\n )}\n <span className=\"rte-comment-author-name\">{comment.author.name}</span>\n </div>\n <span className=\"rte-comment-time\">\n {formatRelativeTime(comment.createdAt)}\n {comment.isEdited && ' (edited)'}\n </span>\n </div>\n\n {isEditing ? (\n <div className=\"rte-comment-edit\">\n <textarea\n value={editContent}\n onChange={e => setEditContent(e.target.value)}\n className=\"rte-comment-edit-input\"\n />\n <div className=\"rte-comment-edit-actions\">\n <button onClick={handleSaveEdit} className=\"rte-comment-btn-save\">Save</button>\n <button onClick={() => setIsEditing(false)} className=\"rte-comment-btn-cancel\">Cancel</button>\n </div>\n </div>\n ) : (\n <div className=\"rte-comment-content\" dangerouslySetInnerHTML={{ __html: comment.content }} />\n )}\n\n {/* Reactions */}\n {comment.reactions && comment.reactions.length > 0 && (\n <div className=\"rte-comment-reactions\">\n {comment.reactions.map(reaction => (\n <button\n key={reaction.emoji}\n className={`rte-comment-reaction ${\n reaction.users.some(u => u.id === state.currentUser?.id) ? 'active' : ''\n }`}\n onClick={() => handleToggleReaction(reaction.emoji)}\n title={reaction.users.map(u => u.name).join(', ')}\n >\n {reaction.emoji} {reaction.users.length}\n </button>\n ))}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"rte-comment-actions\">\n {canReact && (\n <div className=\"rte-comment-reaction-picker\">\n <button\n className=\"rte-comment-action-btn\"\n onClick={() => setShowReactions(!showReactions)}\n >\n ๐Ÿ˜Š\n </button>\n {showReactions && (\n <div className=\"rte-comment-reaction-dropdown\">\n {reactionEmojis.map(emoji => (\n <button key={emoji} onClick={() => handleToggleReaction(emoji)}>\n {emoji}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n {canEdit && (\n <button className=\"rte-comment-action-btn\" onClick={() => setIsEditing(true)}>\n Edit\n </button>\n )}\n {canDelete && !isFirst && (\n <button\n className=\"rte-comment-action-btn rte-comment-action-delete\"\n onClick={() => deleteComment(threadId, comment.id)}\n >\n Delete\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/** Thread component */\nfunction ThreadItem({ thread }: { thread: CommentThread }) {\n const comments = useCommentsOptional()\n const [replyContent, setReplyContent] = useState('')\n const [showReply, setShowReply] = useState(false)\n\n if (!comments) return null\n\n const { state, setActiveThread, addComment, resolveThread, reopenThread, deleteThread, config } = comments\n const isActive = state.activeThreadId === thread.id\n const canResolve = config?.allowResolve !== false\n\n const handleReply = () => {\n if (replyContent.trim()) {\n addComment(thread.id, replyContent)\n setReplyContent('')\n setShowReply(false)\n }\n }\n\n return (\n <div\n className={`rte-thread ${isActive ? 'rte-thread-active' : ''} ${\n thread.status === 'resolved' ? 'rte-thread-resolved' : ''\n }`}\n onClick={() => setActiveThread(thread.id)}\n >\n {/* Thread header */}\n <div className=\"rte-thread-header\">\n <div className=\"rte-thread-quote\">\"{thread.range.text.slice(0, 50)}...\"</div>\n <div className=\"rte-thread-meta\">\n <span className={`rte-thread-status rte-thread-status-${thread.status}`}>\n {thread.status}\n </span>\n <span className=\"rte-thread-count\">{thread.comments.length} comment{thread.comments.length !== 1 ? 's' : ''}</span>\n </div>\n </div>\n\n {/* Comments */}\n <div className=\"rte-thread-comments\">\n {thread.comments.map((comment, index) => (\n <CommentItem\n key={comment.id}\n comment={comment}\n threadId={thread.id}\n isFirst={index === 0}\n />\n ))}\n </div>\n\n {/* Reply form */}\n {thread.status === 'open' && (\n <div className=\"rte-thread-reply\">\n {showReply ? (\n <>\n <textarea\n value={replyContent}\n onChange={e => setReplyContent(e.target.value)}\n placeholder=\"Write a reply...\"\n className=\"rte-thread-reply-input\"\n />\n <div className=\"rte-thread-reply-actions\">\n <button onClick={handleReply} className=\"rte-btn-primary\" disabled={!replyContent.trim()}>\n Reply\n </button>\n <button onClick={() => setShowReply(false)} className=\"rte-btn-secondary\">\n Cancel\n </button>\n </div>\n </>\n ) : (\n <button onClick={() => setShowReply(true)} className=\"rte-thread-reply-btn\">\n Reply\n </button>\n )}\n </div>\n )}\n\n {/* Thread actions */}\n <div className=\"rte-thread-actions\">\n {canResolve && thread.status === 'open' && (\n <button onClick={() => resolveThread(thread.id)} className=\"rte-btn-resolve\">\n โœ“ Resolve\n </button>\n )}\n {thread.status === 'resolved' && (\n <button onClick={() => reopenThread(thread.id)} className=\"rte-btn-reopen\">\n Reopen\n </button>\n )}\n <button\n onClick={e => {\n e.stopPropagation()\n deleteThread(thread.id)\n }}\n className=\"rte-btn-delete-thread\"\n >\n Delete\n </button>\n </div>\n </div>\n )\n}\n\n/** Comments Panel Component */\nexport function CommentsPanel({ position = 'right', className = '' }: CommentsPanelProps) {\n const comments = useCommentsOptional()\n\n if (!comments?.isEnabled || !comments.state.isPanelOpen) {\n return null\n }\n\n const { state, togglePanel, setFilter, getFilteredThreads } = comments\n const filteredThreads = getFilteredThreads()\n\n return (\n <div className={`rte-comments-panel rte-comments-panel-${position} ${className}`}>\n {/* Panel header */}\n <div className=\"rte-comments-panel-header\">\n <h3>Comments</h3>\n <button onClick={() => togglePanel(false)} className=\"rte-comments-close-btn\">ร—</button>\n </div>\n\n {/* Filter tabs */}\n <div className=\"rte-comments-filters\">\n {(['all', 'open', 'resolved'] as const).map(filter => (\n <button\n key={filter}\n className={`rte-comments-filter ${state.filter === filter ? 'active' : ''}`}\n onClick={() => setFilter(filter)}\n >\n {filter.charAt(0).toUpperCase() + filter.slice(1)}\n <span className=\"rte-comments-filter-count\">\n {filter === 'all'\n ? state.threads.length\n : state.threads.filter(t => t.status === filter).length}\n </span>\n </button>\n ))}\n </div>\n\n {/* Threads list */}\n <div className=\"rte-comments-list\">\n {filteredThreads.length === 0 ? (\n <div className=\"rte-comments-empty\">\n {state.filter === 'all'\n ? 'No comments yet. Select text and add a comment.'\n : `No ${state.filter} comments.`}\n </div>\n ) : (\n filteredThreads.map(thread => (\n <ThreadItem key={thread.id} thread={thread} />\n ))\n )}\n </div>\n </div>\n )\n}\n\nexport default CommentsPanel\n","/**\n * Version History Context\n * Provides version history state and methods to child components\n */\n\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\nimport type {\n VersionHistoryState,\n VersionHistoryConfig,\n Version,\n VersionComparison,\n VersionChange,\n VersionHistoryEvent,\n} from './types'\n\n/** Actions for version history reducer */\ntype VersionHistoryAction =\n | { type: 'SET_VERSIONS'; versions: Version[] }\n | { type: 'ADD_VERSION'; version: Version }\n | { type: 'DELETE_VERSION'; versionId: string }\n | { type: 'PIN_VERSION'; versionId: string }\n | { type: 'UNPIN_VERSION'; versionId: string }\n | { type: 'RENAME_VERSION'; versionId: string; title: string }\n | { type: 'SET_VIEWING_VERSION'; versionId: string | null }\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\n | { type: 'START_COMPARE'; fromId: string; toId: string }\n | { type: 'STOP_COMPARE' }\n | { type: 'SET_AUTO_SAVE'; enabled: boolean }\n | { type: 'SET_AUTO_SAVE_INTERVAL'; interval: number }\n\n/** Initial version history state */\nconst initialState: VersionHistoryState = {\n versions: [],\n viewingVersionId: null,\n isPanelOpen: false,\n isComparing: false,\n compareFromId: null,\n compareToId: null,\n autoSaveEnabled: true,\n autoSaveInterval: 60000,\n}\n\n/** Generate unique ID */\nfunction generateId(): string {\n return `v-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/** Version history reducer */\nfunction versionHistoryReducer(state: VersionHistoryState, action: VersionHistoryAction): VersionHistoryState {\n switch (action.type) {\n case 'SET_VERSIONS':\n return { ...state, versions: action.versions }\n\n case 'ADD_VERSION':\n return {\n ...state,\n versions: [action.version, ...state.versions],\n }\n\n case 'DELETE_VERSION':\n return {\n ...state,\n versions: state.versions.filter(v => v.id !== action.versionId),\n viewingVersionId: state.viewingVersionId === action.versionId ? null : state.viewingVersionId,\n }\n\n case 'PIN_VERSION':\n return {\n ...state,\n versions: state.versions.map(v =>\n v.id === action.versionId ? { ...v, isPinned: true } : v\n ),\n }\n\n case 'UNPIN_VERSION':\n return {\n ...state,\n versions: state.versions.map(v =>\n v.id === action.versionId ? { ...v, isPinned: false } : v\n ),\n }\n\n case 'RENAME_VERSION':\n return {\n ...state,\n versions: state.versions.map(v =>\n v.id === action.versionId ? { ...v, title: action.title } : v\n ),\n }\n\n case 'SET_VIEWING_VERSION':\n return { ...state, viewingVersionId: action.versionId }\n\n case 'TOGGLE_PANEL':\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\n\n case 'START_COMPARE':\n return {\n ...state,\n isComparing: true,\n compareFromId: action.fromId,\n compareToId: action.toId,\n }\n\n case 'STOP_COMPARE':\n return {\n ...state,\n isComparing: false,\n compareFromId: null,\n compareToId: null,\n }\n\n case 'SET_AUTO_SAVE':\n return { ...state, autoSaveEnabled: action.enabled }\n\n case 'SET_AUTO_SAVE_INTERVAL':\n return { ...state, autoSaveInterval: action.interval }\n\n default:\n return state\n }\n}\n\n/** Count words in text */\nfunction countWords(text: string): number {\n return text.trim().split(/\\s+/).filter(Boolean).length\n}\n\n/** Simple diff algorithm for version comparison */\nfunction computeDiff(oldText: string, newText: string): VersionChange[] {\n const changes: VersionChange[] = []\n const oldLines = oldText.split('\\n')\n const newLines = newText.split('\\n')\n\n let i = 0\n let j = 0\n\n while (i < oldLines.length || j < newLines.length) {\n if (i >= oldLines.length) {\n // Remaining new lines are additions\n changes.push({\n type: 'addition',\n content: newLines[j],\n position: j,\n })\n j++\n } else if (j >= newLines.length) {\n // Remaining old lines are deletions\n changes.push({\n type: 'deletion',\n content: oldLines[i],\n position: i,\n })\n i++\n } else if (oldLines[i] === newLines[j]) {\n // Lines match, move on\n i++\n j++\n } else {\n // Lines differ - check if it's a modification or add/delete\n const oldLineInNew = newLines.indexOf(oldLines[i], j)\n const newLineInOld = oldLines.indexOf(newLines[j], i)\n\n if (oldLineInNew === -1 && newLineInOld === -1) {\n // Modification\n changes.push({\n type: 'modification',\n content: `${oldLines[i]} -> ${newLines[j]}`,\n position: i,\n })\n i++\n j++\n } else if (oldLineInNew === -1) {\n // Deletion\n changes.push({\n type: 'deletion',\n content: oldLines[i],\n position: i,\n })\n i++\n } else {\n // Addition\n changes.push({\n type: 'addition',\n content: newLines[j],\n position: j,\n })\n j++\n }\n }\n }\n\n return changes\n}\n\n/** Context value type */\ninterface VersionHistoryContextValue {\n state: VersionHistoryState\n config: VersionHistoryConfig | null\n\n // Version operations\n createVersion: (content: string, jsonContent?: unknown, options?: { title?: string; isAutoSave?: boolean }) => Version | null\n deleteVersion: (versionId: string) => void\n restoreVersion: (versionId: string) => string | null\n pinVersion: (versionId: string) => void\n unpinVersion: (versionId: string) => void\n renameVersion: (versionId: string, title: string) => void\n\n // Viewing operations\n viewVersion: (versionId: string | null) => void\n getVersionContent: (versionId: string) => string | null\n\n // Comparison operations\n compareVersions: (fromId: string, toId: string) => VersionComparison | null\n startCompare: (fromId: string, toId: string) => void\n stopCompare: () => void\n\n // UI operations\n togglePanel: (isOpen?: boolean) => void\n setAutoSave: (enabled: boolean) => void\n\n // Getters\n getVersion: (versionId: string) => Version | undefined\n getLatestVersion: () => Version | undefined\n getPinnedVersions: () => Version[]\n\n // Event subscription\n subscribe: (callback: (event: VersionHistoryEvent) => void) => () => void\n\n isEnabled: boolean\n}\n\n/** Create context */\nconst VersionHistoryContext = createContext<VersionHistoryContextValue | null>(null)\n\n/** Provider props */\ninterface VersionHistoryProviderProps {\n children: ReactNode\n config?: VersionHistoryConfig\n initialVersions?: Version[]\n onVersionsChange?: (versions: Version[]) => void\n getCurrentContent?: () => { html: string; json?: unknown; text: string }\n}\n\n/** Version History Provider Component */\nexport function VersionHistoryProvider({\n children,\n config,\n initialVersions = [],\n onVersionsChange,\n getCurrentContent,\n}: VersionHistoryProviderProps) {\n const [state, dispatch] = useReducer(versionHistoryReducer, {\n ...initialState,\n versions: initialVersions,\n autoSaveEnabled: config?.autoSave ?? true,\n autoSaveInterval: config?.autoSaveInterval ?? 60000,\n })\n\n const subscribersRef = useRef(new Set<(event: VersionHistoryEvent) => void>())\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\n const lastContentRef = useRef<string>('')\n const versionNumberRef = useRef(initialVersions.length)\n\n // Load initial versions\n useEffect(() => {\n if (config?.onLoad) {\n config.onLoad().then(versions => {\n dispatch({ type: 'SET_VERSIONS', versions })\n versionNumberRef.current = versions.length\n })\n }\n }, [config])\n\n // Notify on versions change\n useEffect(() => {\n onVersionsChange?.(state.versions)\n if (config?.onSave) {\n config.onSave(state.versions)\n }\n }, [state.versions, onVersionsChange, config])\n\n // Auto-save timer\n useEffect(() => {\n if (!state.autoSaveEnabled || !config || !getCurrentContent) return\n\n autoSaveTimerRef.current = setInterval(() => {\n const { html, json } = getCurrentContent()\n\n // Only save if content changed\n if (html !== lastContentRef.current) {\n lastContentRef.current = html\n createVersion(html, json, { isAutoSave: true })\n }\n }, state.autoSaveInterval)\n\n return () => {\n if (autoSaveTimerRef.current) {\n clearInterval(autoSaveTimerRef.current)\n }\n }\n }, [state.autoSaveEnabled, state.autoSaveInterval, config, getCurrentContent])\n\n /** Emit event to subscribers */\n const emitEvent = useCallback((event: VersionHistoryEvent) => {\n subscribersRef.current.forEach(callback => callback(event))\n }, [])\n\n /** Create a new version */\n const createVersion = useCallback((\n content: string,\n jsonContent?: unknown,\n options?: { title?: string; isAutoSave?: boolean }\n ): Version | null => {\n if (!config?.currentUser) return null\n\n // Check max versions\n const maxVersions = config.maxVersions ?? 100\n let versions = state.versions\n\n if (versions.length >= maxVersions) {\n // Remove oldest non-pinned version\n const oldestUnpinned = [...versions].reverse().find(v => !v.isPinned)\n if (oldestUnpinned) {\n versions = versions.filter(v => v.id !== oldestUnpinned.id)\n }\n }\n\n versionNumberRef.current++\n const textContent = content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n\n const version: Version = {\n id: generateId(),\n number: versionNumberRef.current,\n title: options?.title,\n content,\n jsonContent,\n textContent,\n author: config.currentUser,\n createdAt: Date.now(),\n wordCount: countWords(textContent),\n characterCount: textContent.length,\n isAutoSave: options?.isAutoSave ?? false,\n isPinned: false,\n }\n\n dispatch({ type: 'ADD_VERSION', version })\n emitEvent({ type: 'version-created', version })\n return version\n }, [config, state.versions, emitEvent])\n\n /** Delete a version */\n const deleteVersion = useCallback((versionId: string) => {\n dispatch({ type: 'DELETE_VERSION', versionId })\n emitEvent({ type: 'version-deleted', versionId })\n }, [emitEvent])\n\n /** Restore a version */\n const restoreVersion = useCallback((versionId: string): string | null => {\n const version = state.versions.find(v => v.id === versionId)\n if (!version) return null\n\n config?.onRestore?.(version)\n emitEvent({ type: 'version-restored', versionId })\n return version.content\n }, [state.versions, config, emitEvent])\n\n /** Pin a version */\n const pinVersion = useCallback((versionId: string) => {\n dispatch({ type: 'PIN_VERSION', versionId })\n emitEvent({ type: 'version-pinned', versionId })\n }, [emitEvent])\n\n /** Unpin a version */\n const unpinVersion = useCallback((versionId: string) => {\n dispatch({ type: 'UNPIN_VERSION', versionId })\n emitEvent({ type: 'version-unpinned', versionId })\n }, [emitEvent])\n\n /** Rename a version */\n const renameVersion = useCallback((versionId: string, title: string) => {\n dispatch({ type: 'RENAME_VERSION', versionId, title })\n emitEvent({ type: 'version-renamed', versionId, title })\n }, [emitEvent])\n\n /** View a version */\n const viewVersion = useCallback((versionId: string | null) => {\n dispatch({ type: 'SET_VIEWING_VERSION', versionId })\n }, [])\n\n /** Get version content */\n const getVersionContent = useCallback((versionId: string): string | null => {\n const version = state.versions.find(v => v.id === versionId)\n return version?.content ?? null\n }, [state.versions])\n\n /** Compare two versions */\n const compareVersions = useCallback((fromId: string, toId: string): VersionComparison | null => {\n const fromVersion = state.versions.find(v => v.id === fromId)\n const toVersion = state.versions.find(v => v.id === toId)\n\n if (!fromVersion || !toVersion) return null\n\n const changes = computeDiff(fromVersion.textContent, toVersion.textContent)\n\n return {\n fromVersionId: fromId,\n toVersionId: toId,\n changes,\n stats: {\n additions: changes.filter(c => c.type === 'addition').length,\n deletions: changes.filter(c => c.type === 'deletion').length,\n modifications: changes.filter(c => c.type === 'modification').length,\n },\n }\n }, [state.versions])\n\n /** Start comparing versions */\n const startCompare = useCallback((fromId: string, toId: string) => {\n dispatch({ type: 'START_COMPARE', fromId, toId })\n }, [])\n\n /** Stop comparing versions */\n const stopCompare = useCallback(() => {\n dispatch({ type: 'STOP_COMPARE' })\n }, [])\n\n /** Toggle panel */\n const togglePanel = useCallback((isOpen?: boolean) => {\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\n }, [])\n\n /** Set auto-save */\n const setAutoSave = useCallback((enabled: boolean) => {\n dispatch({ type: 'SET_AUTO_SAVE', enabled })\n emitEvent({ type: 'auto-save-toggled', enabled })\n }, [emitEvent])\n\n /** Get a version by ID */\n const getVersion = useCallback((versionId: string) => {\n return state.versions.find(v => v.id === versionId)\n }, [state.versions])\n\n /** Get latest version */\n const getLatestVersion = useCallback(() => {\n return state.versions[0]\n }, [state.versions])\n\n /** Get pinned versions */\n const getPinnedVersions = useCallback(() => {\n return state.versions.filter(v => v.isPinned)\n }, [state.versions])\n\n /** Subscribe to events */\n const subscribe = useCallback((callback: (event: VersionHistoryEvent) => void) => {\n subscribersRef.current.add(callback)\n return () => {\n subscribersRef.current.delete(callback)\n }\n }, [])\n\n const value: VersionHistoryContextValue = {\n state,\n config: config ?? null,\n createVersion,\n deleteVersion,\n restoreVersion,\n pinVersion,\n unpinVersion,\n renameVersion,\n viewVersion,\n getVersionContent,\n compareVersions,\n startCompare,\n stopCompare,\n togglePanel,\n setAutoSave,\n getVersion,\n getLatestVersion,\n getPinnedVersions,\n subscribe,\n isEnabled: !!config,\n }\n\n return (\n <VersionHistoryContext.Provider value={value}>\n {children}\n </VersionHistoryContext.Provider>\n )\n}\n\n/** Hook to use version history context */\nexport function useVersionHistory() {\n const context = useContext(VersionHistoryContext)\n if (!context) {\n throw new Error('useVersionHistory must be used within a VersionHistoryProvider')\n }\n return context\n}\n\n/** Hook to check if version history is available (doesn't throw) */\nexport function useVersionHistoryOptional() {\n return useContext(VersionHistoryContext)\n}\n\nexport default VersionHistoryContext\n","/**\n * Version History Panel Component\n * Displays version history with restore and compare functionality\n */\n\nimport { useState } from 'react'\nimport { useVersionHistoryOptional } from './VersionHistoryContext'\nimport type { Version } from './types'\n\ninterface VersionHistoryPanelProps {\n /** Panel position */\n position?: 'left' | 'right'\n /** Custom class name */\n className?: string\n}\n\n/** Format date */\nfunction formatDate(timestamp: number): string {\n const date = new Date(timestamp)\n const now = new Date()\n const isToday = date.toDateString() === now.toDateString()\n\n if (isToday) {\n return `Today at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\n }\n\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n if (date.toDateString() === yesterday.toDateString()) {\n return `Yesterday at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\n }\n\n return date.toLocaleDateString([], {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\n/** Single version item */\nfunction VersionItem({\n version,\n isViewing,\n isCompareFrom,\n isCompareTo,\n onView,\n onRestore,\n onPin,\n onRename,\n onDelete,\n onCompareSelect,\n}: {\n version: Version\n isViewing: boolean\n isCompareFrom: boolean\n isCompareTo: boolean\n onView: () => void\n onRestore: () => void\n onPin: () => void\n onRename: (title: string) => void\n onDelete: () => void\n onCompareSelect: () => void\n}) {\n const [isRenaming, setIsRenaming] = useState(false)\n const [newTitle, setNewTitle] = useState(version.title || '')\n\n const handleRename = () => {\n onRename(newTitle)\n setIsRenaming(false)\n }\n\n return (\n <div\n className={`rte-version-item ${isViewing ? 'rte-version-viewing' : ''} ${\n isCompareFrom ? 'rte-version-compare-from' : ''\n } ${isCompareTo ? 'rte-version-compare-to' : ''}`}\n >\n {/* Version header */}\n <div className=\"rte-version-header\" onClick={onView}>\n <div className=\"rte-version-info\">\n {isRenaming ? (\n <input\n type=\"text\"\n value={newTitle}\n onChange={e => setNewTitle(e.target.value)}\n onBlur={handleRename}\n onKeyDown={e => e.key === 'Enter' && handleRename()}\n className=\"rte-version-rename-input\"\n onClick={e => e.stopPropagation()}\n autoFocus\n />\n ) : (\n <span className=\"rte-version-title\">\n {version.title || `Version ${version.number}`}\n {version.isPinned && <span className=\"rte-version-pin-icon\">๐Ÿ“Œ</span>}\n {version.isAutoSave && <span className=\"rte-version-auto-badge\">Auto</span>}\n </span>\n )}\n <span className=\"rte-version-time\">{formatDate(version.createdAt)}</span>\n </div>\n <div className=\"rte-version-author\">\n {version.author.avatar ? (\n <img src={version.author.avatar} alt={version.author.name} className=\"rte-version-avatar\" />\n ) : (\n <div className=\"rte-version-avatar-placeholder\">\n {version.author.name.charAt(0).toUpperCase()}\n </div>\n )}\n <span>{version.author.name}</span>\n </div>\n </div>\n\n {/* Version stats */}\n <div className=\"rte-version-stats\">\n <span>{version.wordCount} words</span>\n <span>{version.characterCount} chars</span>\n </div>\n\n {/* Version actions */}\n <div className=\"rte-version-actions\">\n <button onClick={onRestore} className=\"rte-version-btn\" title=\"Restore this version\">\n โ†บ Restore\n </button>\n <button onClick={onCompareSelect} className=\"rte-version-btn\" title=\"Compare with another version\">\n โ‡„ Compare\n </button>\n <button onClick={onPin} className=\"rte-version-btn\" title={version.isPinned ? 'Unpin' : 'Pin'}>\n {version.isPinned ? '๐Ÿ“Œ Unpin' : '๐Ÿ“Œ Pin'}\n </button>\n <button\n onClick={() => setIsRenaming(true)}\n className=\"rte-version-btn\"\n title=\"Rename version\"\n >\n โœ๏ธ\n </button>\n {!version.isPinned && (\n <button onClick={onDelete} className=\"rte-version-btn rte-version-btn-delete\" title=\"Delete\">\n ๐Ÿ—‘๏ธ\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/** Version comparison view */\nfunction ComparisonView({\n fromVersion,\n toVersion,\n onClose,\n}: {\n fromVersion: Version\n toVersion: Version\n onClose: () => void\n}) {\n const versionHistory = useVersionHistoryOptional()\n if (!versionHistory) return null\n\n const comparison = versionHistory.compareVersions(fromVersion.id, toVersion.id)\n\n return (\n <div className=\"rte-version-comparison\">\n <div className=\"rte-version-comparison-header\">\n <h4>Comparing Versions</h4>\n <button onClick={onClose} className=\"rte-version-comparison-close\">ร—</button>\n </div>\n\n <div className=\"rte-version-comparison-info\">\n <div className=\"rte-version-comparison-from\">\n <span className=\"rte-version-comparison-label\">From:</span>\n {fromVersion.title || `Version ${fromVersion.number}`}\n </div>\n <span className=\"rte-version-comparison-arrow\">โ†’</span>\n <div className=\"rte-version-comparison-to\">\n <span className=\"rte-version-comparison-label\">To:</span>\n {toVersion.title || `Version ${toVersion.number}`}\n </div>\n </div>\n\n {comparison && (\n <div className=\"rte-version-comparison-stats\">\n <span className=\"rte-comparison-stat rte-comparison-additions\">\n +{comparison.stats.additions} additions\n </span>\n <span className=\"rte-comparison-stat rte-comparison-deletions\">\n -{comparison.stats.deletions} deletions\n </span>\n <span className=\"rte-comparison-stat rte-comparison-modifications\">\n ~{comparison.stats.modifications} modifications\n </span>\n </div>\n )}\n\n <div className=\"rte-version-comparison-diff\">\n {comparison?.changes.map((change, index) => (\n <div key={index} className={`rte-diff-line rte-diff-${change.type}`}>\n <span className=\"rte-diff-indicator\">\n {change.type === 'addition' ? '+' : change.type === 'deletion' ? '-' : '~'}\n </span>\n <span className=\"rte-diff-content\">{change.content}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n/** Version History Panel Component */\nexport function VersionHistoryPanel({ position = 'right', className = '' }: VersionHistoryPanelProps) {\n const versionHistory = useVersionHistoryOptional()\n const [compareFromId, setCompareFromId] = useState<string | null>(null)\n\n if (!versionHistory?.isEnabled || !versionHistory.state.isPanelOpen) {\n return null\n }\n\n const {\n state,\n togglePanel,\n viewVersion,\n restoreVersion,\n pinVersion,\n unpinVersion,\n renameVersion,\n deleteVersion,\n setAutoSave,\n getVersion,\n createVersion,\n stopCompare,\n } = versionHistory\n\n const handleRestore = (versionId: string) => {\n const content = restoreVersion(versionId)\n if (content) {\n viewVersion(null) // Go back to current\n }\n }\n\n const handleCompareSelect = (versionId: string) => {\n if (!compareFromId) {\n setCompareFromId(versionId)\n } else {\n versionHistory.startCompare(compareFromId, versionId)\n setCompareFromId(null)\n }\n }\n\n const handleCancelCompare = () => {\n setCompareFromId(null)\n stopCompare()\n }\n\n // Get versions for comparison view\n const compareFromVersion = state.compareFromId ? getVersion(state.compareFromId) : undefined\n const compareToVersion = state.compareToId ? getVersion(state.compareToId) : undefined\n\n return (\n <div className={`rte-version-panel rte-version-panel-${position} ${className}`}>\n {/* Panel header */}\n <div className=\"rte-version-panel-header\">\n <h3>Version History</h3>\n <button onClick={() => togglePanel(false)} className=\"rte-version-close-btn\">ร—</button>\n </div>\n\n {/* Auto-save toggle */}\n <div className=\"rte-version-autosave\">\n <label className=\"rte-version-autosave-label\">\n <input\n type=\"checkbox\"\n checked={state.autoSaveEnabled}\n onChange={e => setAutoSave(e.target.checked)}\n />\n Auto-save versions\n </label>\n <button\n onClick={() => createVersion('', undefined, { isAutoSave: false })}\n className=\"rte-version-save-btn\"\n >\n Save Now\n </button>\n </div>\n\n {/* Compare mode indicator */}\n {compareFromId && !state.isComparing && (\n <div className=\"rte-version-compare-mode\">\n <span>Select another version to compare</span>\n <button onClick={handleCancelCompare}>Cancel</button>\n </div>\n )}\n\n {/* Comparison view */}\n {state.isComparing && compareFromVersion && compareToVersion && (\n <ComparisonView\n fromVersion={compareFromVersion}\n toVersion={compareToVersion}\n onClose={handleCancelCompare}\n />\n )}\n\n {/* Versions list */}\n {!state.isComparing && (\n <div className=\"rte-version-list\">\n {state.versions.length === 0 ? (\n <div className=\"rte-version-empty\">\n No versions saved yet. Changes will be auto-saved periodically.\n </div>\n ) : (\n <>\n {/* Pinned versions */}\n {state.versions.some(v => v.isPinned) && (\n <div className=\"rte-version-section\">\n <div className=\"rte-version-section-title\">๐Ÿ“Œ Pinned</div>\n {state.versions\n .filter(v => v.isPinned)\n .map(version => (\n <VersionItem\n key={version.id}\n version={version}\n isViewing={state.viewingVersionId === version.id}\n isCompareFrom={compareFromId === version.id}\n isCompareTo={false}\n onView={() => viewVersion(version.id)}\n onRestore={() => handleRestore(version.id)}\n onPin={() => unpinVersion(version.id)}\n onRename={title => renameVersion(version.id, title)}\n onDelete={() => deleteVersion(version.id)}\n onCompareSelect={() => handleCompareSelect(version.id)}\n />\n ))}\n </div>\n )}\n\n {/* Recent versions */}\n <div className=\"rte-version-section\">\n <div className=\"rte-version-section-title\">Recent</div>\n {state.versions\n .filter(v => !v.isPinned)\n .map(version => (\n <VersionItem\n key={version.id}\n version={version}\n isViewing={state.viewingVersionId === version.id}\n isCompareFrom={compareFromId === version.id}\n isCompareTo={false}\n onView={() => viewVersion(version.id)}\n onRestore={() => handleRestore(version.id)}\n onPin={() => pinVersion(version.id)}\n onRename={title => renameVersion(version.id, title)}\n onDelete={() => deleteVersion(version.id)}\n onCompareSelect={() => handleCompareSelect(version.id)}\n />\n ))}\n </div>\n </>\n )}\n </div>\n )}\n\n {/* Viewing version indicator */}\n {state.viewingVersionId && (\n <div className=\"rte-version-viewing-indicator\">\n <span>Viewing: {getVersion(state.viewingVersionId)?.title || `Version ${getVersion(state.viewingVersionId)?.number}`}</span>\n <button onClick={() => viewVersion(null)} className=\"rte-version-back-btn\">\n โ† Back to current\n </button>\n </div>\n )}\n </div>\n )\n}\n\nexport default VersionHistoryPanel\n"],"mappings":"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AAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAC1D;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAC1D;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACxD;AAAA,UAAM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ACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,gBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,gBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,iBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAA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","names":["import_core","import_core","import_core","import_core","import_core","import_core","ToolbarButton","import_react","import_jsx_runtime","editor","exports","isHotkey","check","import_react","import_jsx_runtime","toggleMark","toggleBlock","isMarkActive","isBlockActive","SlateElement","import_react","import_slate","import_slate_react","import_jsx_runtime","SlateElement","isHotkey","import_react","import_rich_text","import_lexical","import_jsx_runtime","ToolbarButton","icons","import_react","import_rich_text","import_list","import_link","import_code","import_table","import_LexicalHorizontalRuleNode","import_lexical","import_jsx_runtime","import_react","TipTapEditorComponent","SlateEditorComponent","LexicalEditorComponent","import_jsx_runtime","import_react","import_extension_document","import_extension_paragraph","import_extension_text","import_extension_bold","import_extension_italic","import_extension_underline","import_extension_strike","import_extension_code","import_extension_code_block_lowlight","import_extension_subscript","import_extension_superscript","import_extension_text_style","import_extension_font_family","import_extension_color","import_extension_highlight","import_extension_text_align","import_extension_heading","import_extension_bullet_list","import_extension_ordered_list","import_extension_list_item","import_extension_blockquote","import_extension_horizontal_rule","import_extension_link","import_extension_image","import_extension_table","import_extension_table_row","import_extension_table_cell","import_extension_table_header","import_extension_history","import_extension_placeholder","import_extension_character_count","import_extension_gapcursor","import_extension_dropcursor","import_extension_hard_break","import_lowlight","import_react","import_jsx_runtime","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","EmojiPicker","ToolbarButton","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","import_jsx_runtime","lowlight","toolbarPresets","editor","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","initialState","import_react","import_jsx_runtime","import_react","import_jsx_runtime","initialState","generateId","import_react","import_jsx_runtime"]}