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.css +27 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +897 -365
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +955 -389
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -20
package/dist/index.mjs.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/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/index.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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\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 * 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 * 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 * 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAA1B,IAqBa;AArBb;AAAA;AAAA;AAqBO,IAAM,WAAW,UAAU,OAAwB;AAAA,MACxD,MAAM;AAAA,MAEN,aAAa;AACX,eAAO;AAAA,UACL,OAAO,CAAC,WAAW;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,sBAAsB;AACpB,eAAO;AAAA,UACL;AAAA,YACE,OAAO,KAAK,QAAQ;AAAA,YACpB,YAAY;AAAA,cACV,UAAU;AAAA,gBACR,SAAS;AAAA,gBACT,WAAW,CAAC,YACV,QAAQ,MAAM,UAAU,QAAQ,UAAU,EAAE;AAAA,gBAC9C,YAAY,CAAC,eAAe;AAC1B,sBAAI,CAAC,WAAW,UAAU;AACxB,2BAAO,CAAC;AAAA,kBACV;AAEA,yBAAO;AAAA,oBACL,OAAO,cAAc,WAAW,QAAQ;AAAA,kBAC1C;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,cAAc;AACZ,eAAO;AAAA,UACL,aACE,CAAC,aACD,CAAC,EAAE,MAAM,MAAM;AACb,mBAAO,MAAM,EAAE,QAAQ,aAAa,EAAE,SAAS,CAAC,EAAE,IAAI;AAAA,UACxD;AAAA,UACF,eACE,MACA,CAAC,EAAE,MAAM,MAAM;AACb,mBAAO,MAAM,EACV,QAAQ,aAAa,EAAE,UAAU,KAAK,CAAC,EACvC,qBAAqB,EACrB,IAAI;AAAA,UACT;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA;AAAA;;;ACvED,SAAS,aAAAA,kBAAiB;AAA1B,IAsBa;AAtBb;AAAA;AAAA;AAsBO,IAAM,aAAaA,WAAU,OAA0B;AAAA,MAC5D,MAAM;AAAA,MAEN,aAAa;AACX,eAAO;AAAA,UACL,OAAO,CAAC,aAAa,SAAS;AAAA,UAC9B,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,sBAAsB;AACpB,eAAO;AAAA,UACL;AAAA,YACE,OAAO,KAAK,QAAQ;AAAA,YACpB,YAAY;AAAA,cACV,YAAY;AAAA,gBACV,SAAS;AAAA,gBACT,WAAW,CAAC,YACV,QAAQ,MAAM,cAAc,KAAK,QAAQ;AAAA,gBAC3C,YAAY,CAAC,eAAe;AAC1B,sBAAI,CAAC,WAAW,YAAY;AAC1B,2BAAO,CAAC;AAAA,kBACV;AAEA,yBAAO;AAAA,oBACL,OAAO,gBAAgB,WAAW,UAAU;AAAA,kBAC9C;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,cAAc;AACZ,eAAO;AAAA,UACL,eACE,CAAC,eACD,CAAC,EAAE,SAAS,MAAM;AAChB,mBAAO,KAAK,QAAQ,MAAM;AAAA,cAAM,CAAC,SAC/B,SAAS,iBAAiB,MAAM,EAAE,WAAW,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,UACF,iBACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,mBAAO,KAAK,QAAQ,MAAM;AAAA,cAAM,CAAC,SAC/B,SAAS,gBAAgB,MAAM,YAAY;AAAA,YAC7C;AAAA,UACF;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA;AAAA;;;AC1ED,SAAS,MAAM,uBAAuB;AAAtC,IAmBa;AAnBb;AAAA;AAAA;AAmBO,IAAM,QAAQ,KAAK,OAAqB;AAAA,MAC7C,MAAM;AAAA,MAEN,aAAa;AACX,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,gBAAgB,CAAC;AAAA,QACnB;AAAA,MACF;AAAA,MAEA,SAAS;AACP,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,MAEA,QAAQ;AACN,eAAO,KAAK,QAAQ,SAAS,WAAW;AAAA,MAC1C;AAAA,MAEA,WAAW;AAAA,MAEX,gBAAgB;AACd,eAAO;AAAA,UACL,KAAK;AAAA,YACH,SAAS;AAAA,UACX;AAAA,UACA,KAAK;AAAA,YACH,SAAS;AAAA,UACX;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,UACX;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,UACX;AAAA,UACA,QAAQ;AAAA,YACN,SAAS;AAAA,UACX;AAAA,UACA,UAAU;AAAA,YACR,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,MAEA,YAAY;AACV,eAAO;AAAA,UACL;AAAA,YACE,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW,EAAE,eAAe,GAAG;AAC7B,eAAO;AAAA,UACL;AAAA,UACA,gBAAgB,KAAK,QAAQ,gBAAgB,cAAc;AAAA,UAC3D,CAAC,UAAU,EAAE,KAAK,eAAe,IAAI,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,cAAc;AACZ,eAAO;AAAA,UACL,UACE,CAAC,YACD,CAAC,EAAE,SAAS,MAAM;AAChB,mBAAO,SAAS,cAAc;AAAA,cAC5B,MAAM,KAAK;AAAA,cACX,OAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA;AAAA;;;AC3FD,SAAS,aAAAC,kBAAiB;AAA1B,IAkBa,kBA8IA;AAhKb;AAAA;AAAA;AAkBO,IAAM,mBAAmB;AAAA,MAC9B,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAS;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACzD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,QACxD;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACrD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,QACd;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAS;AAAA,UACzD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,QACxD;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;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,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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;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,UAAM;AAAA,UAAM;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACrD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,QAClD;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACpD;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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;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,UAAO;AAAA,UAAO;AAAA,UACxD;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,UAAM;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,UACN;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAC1D;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UACzD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAK;AAAA,UAAO;AAAA,UAAK;AAAA,UAAK;AAAA,UAAM;AAAA,UAAM;AAAA,UACpD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACxD;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,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;AAA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","names":["Extension","Extension","Extension","Extension","Extension","ToolbarButton","useEffect","jsx","jsxs","editor","isHotkey","check","useCallback","useState","useRef","useEffect","jsx","jsxs","toggleMark","toggleBlock","isMarkActive","isBlockActive","useEffect","useImperativeHandle","forwardRef","useCallback","useState","useRef","Editor","Transforms","Text","SlateElement","Node","ReactEditor","jsx","jsxs","isHotkey","useCallback","useState","useRef","useEffect","jsx","jsxs","ToolbarButton","icons","useEffect","useImperativeHandle","forwardRef","useCallback","useState","useRef","ListNode","TableNode","$getRoot","$getSelection","$isRangeSelection","$createParagraphNode","UNDO_COMMAND","REDO_COMMAND","jsx","jsxs","forwardRef","useImperativeHandle","useRef","useMemo","useState","TipTapEditorComponent","SlateEditorComponent","LexicalEditorComponent","jsx","jsxs","forwardRef","useRef","useState","useMemo","useImperativeHandle","useEffect","useImperativeHandle","forwardRef","useCallback","useEditor","EditorContent","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","CodeBlockLowlight","Subscript","Superscript","TextStyle","FontFamily","Color","Highlight","TextAlign","Heading","BulletList","OrderedList","ListItem","Blockquote","HorizontalRule","Link","Image","Table","TableRow","TableCell","TableHeader","History","Placeholder","CharacterCount","Gapcursor","Dropcursor","HardBreak","common","createLowlight","useState","useRef","useEffect","jsx","jsxs","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","EmojiPicker","useState","useRef","useEffect","jsxs","jsx","ToolbarButton","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","jsx","jsxs","lowlight","createLowlight","common","toolbarPresets","forwardRef","useEditor","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","CodeBlockLowlight","Subscript","Superscript","TextStyle","FontFamily","Color","Highlight","TextAlign","Heading","BulletList","OrderedList","ListItem","Blockquote","HorizontalRule","Link","Image","Table","TableRow","TableCell","TableHeader","History","Placeholder","CharacterCount","Gapcursor","Dropcursor","HardBreak","editor","useEffect","useCallback","useImperativeHandle","EditorContent","useCallback","useEffect","useRef","jsx","jsx","jsxs","createContext","useContext","useReducer","useCallback","useEffect","jsx","initialState","createContext","useReducer","useEffect","useCallback","useContext","useState","Fragment","jsx","jsxs","useState","createContext","useContext","useReducer","useCallback","useEffect","useRef","jsx","initialState","generateId","useState","Fragment","jsx","jsxs","useState"]}
|
|
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/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/index.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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\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 * 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 * 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 * 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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UAAM;AAAA,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;AAA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;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;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,E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","names":["Extension","Extension","Extension","Extension","Extension","ToolbarButton","useEffect","jsx","jsxs","editor","isHotkey","check","useCallback","useState","useRef","useEffect","jsx","jsxs","toggleMark","toggleBlock","isMarkActive","isBlockActive","useEffect","useImperativeHandle","forwardRef","useCallback","useState","useRef","Editor","Transforms","Text","SlateElement","Node","ReactEditor","jsx","jsxs","isHotkey","useCallback","useState","useRef","useEffect","jsx","jsxs","ToolbarButton","icons","useEffect","useImperativeHandle","forwardRef","useCallback","useState","useRef","ListNode","TableNode","$getRoot","$getSelection","$isRangeSelection","$createParagraphNode","UNDO_COMMAND","REDO_COMMAND","jsx","jsxs","forwardRef","useImperativeHandle","useRef","useMemo","useState","TipTapEditorComponent","SlateEditorComponent","LexicalEditorComponent","jsx","jsxs","forwardRef","useRef","useState","useMemo","useImperativeHandle","useEffect","useImperativeHandle","forwardRef","useCallback","useEditor","EditorContent","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","CodeBlockLowlight","Subscript","Superscript","TextStyle","FontFamily","Color","Highlight","TextAlign","Heading","BulletList","OrderedList","ListItem","Blockquote","HorizontalRule","Link","Image","Table","TableRow","TableCell","TableHeader","History","Placeholder","CharacterCount","Gapcursor","Dropcursor","HardBreak","common","createLowlight","useState","useRef","useEffect","Bold","Italic","Underline","Code","Subscript","Superscript","Indent","Heading","Link","Image","Video","Table","jsx","jsxs","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","EmojiPicker","useState","useRef","useEffect","jsxs","jsx","ToolbarButton","Bold","Italic","Underline","Code","Subscript","Superscript","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","Indent","Heading","Link","Image","Video","Table","jsx","jsxs","lowlight","createLowlight","common","toolbarPresets","forwardRef","useEditor","Document","Paragraph","Text","Bold","Italic","Underline","Strike","Code","CodeBlockLowlight","Subscript","Superscript","TextStyle","FontFamily","Color","Highlight","TextAlign","Heading","BulletList","OrderedList","ListItem","Blockquote","HorizontalRule","Link","Image","Table","TableRow","TableCell","TableHeader","History","Placeholder","CharacterCount","Gapcursor","Dropcursor","HardBreak","editor","useEffect","useCallback","useImperativeHandle","EditorContent","useCallback","useEffect","useRef","jsx","jsx","jsxs","createContext","useContext","useReducer","useCallback","useEffect","jsx","initialState","createContext","useReducer","useEffect","useCallback","useContext","useState","Fragment","jsx","jsxs","useState","createContext","useContext","useReducer","useCallback","useEffect","useRef","jsx","initialState","generateId","useState","Fragment","jsx","jsxs","useState"]}
|