rte-builder 2.0.7 โ†’ 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extensions/FontSize.ts","../src/extensions/LineHeight.ts","../src/extensions/Video.ts","../src/extensions/Emoji.ts","../src/extensions/Fullscreen.ts","../src/extensions/Print.ts","../src/extensions/Indent.ts","../src/adapters/tiptap/TipTapToolbar.tsx","../src/adapters/tiptap/TipTapEditorComponent.tsx","../src/adapters/slate/SlateToolbar.tsx","../src/adapters/slate/SlateEditorComponent.tsx","../src/adapters/lexical/LexicalToolbar.tsx","../src/adapters/lexical/LexicalEditorComponent.tsx","../src/index.tsx","../src/components/UnifiedEditor.tsx","../src/core/registry.ts","../src/core/presets.ts","../src/core/types.ts","../src/adapters/tiptap/TipTapAdapter.ts","../src/adapters/tiptap/index.ts","../src/adapters/slate/SlateAdapter.ts","../src/adapters/lexical/LexicalAdapter.ts","../src/components/RichTextEditor.tsx","../src/components/Toolbar.tsx","../src/collaboration/CollaborationContext.tsx","../src/collaboration/PresenceIndicator.tsx","../src/comments/types.ts","../src/comments/CommentsContext.tsx","../src/comments/CommentsPanel.tsx","../src/history/VersionHistoryContext.tsx","../src/history/VersionHistoryPanel.tsx"],"sourcesContent":["import { Extension } from '@tiptap/core'\r\n\r\nexport type FontSizeOptions = {\r\n types: string[]\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n fontSize: {\r\n /**\r\n * Set the font size\r\n */\r\n setFontSize: (size: string) => ReturnType\r\n /**\r\n * Unset the font size\r\n */\r\n unsetFontSize: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const FontSize = Extension.create<FontSizeOptions>({\r\n name: 'fontSize',\r\n\r\n addOptions() {\r\n return {\r\n types: ['textStyle'],\r\n }\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: (element) =>\r\n element.style.fontSize?.replace(/['\"]+/g, ''),\r\n renderHTML: (attributes) => {\r\n if (!attributes.fontSize) {\r\n return {}\r\n }\r\n\r\n return {\r\n style: `font-size: ${attributes.fontSize}`,\r\n }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setFontSize:\r\n (fontSize) =>\r\n ({ chain }) => {\r\n return chain().setMark('textStyle', { fontSize }).run()\r\n },\r\n unsetFontSize:\r\n () =>\r\n ({ chain }) => {\r\n return chain()\r\n .setMark('textStyle', { fontSize: null })\r\n .removeEmptyTextStyle()\r\n .run()\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport type LineHeightOptions = {\r\n types: string[]\r\n defaultLineHeight: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n lineHeight: {\r\n /**\r\n * Set the line height\r\n */\r\n setLineHeight: (lineHeight: string) => ReturnType\r\n /**\r\n * Unset the line height\r\n */\r\n unsetLineHeight: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const LineHeight = Extension.create<LineHeightOptions>({\r\n name: 'lineHeight',\r\n\r\n addOptions() {\r\n return {\r\n types: ['paragraph', 'heading'],\r\n defaultLineHeight: 'normal',\r\n }\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n lineHeight: {\r\n default: null,\r\n parseHTML: (element) =>\r\n element.style.lineHeight || this.options.defaultLineHeight,\r\n renderHTML: (attributes) => {\r\n if (!attributes.lineHeight) {\r\n return {}\r\n }\r\n\r\n return {\r\n style: `line-height: ${attributes.lineHeight}`,\r\n }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setLineHeight:\r\n (lineHeight) =>\r\n ({ commands }) => {\r\n return this.options.types.every((type) =>\r\n commands.updateAttributes(type, { lineHeight }),\r\n )\r\n },\r\n unsetLineHeight:\r\n () =>\r\n ({ commands }) => {\r\n return this.options.types.every((type) =>\r\n commands.resetAttributes(type, 'lineHeight'),\r\n )\r\n },\r\n }\r\n },\r\n})\r\n","import { Node, mergeAttributes } from '@tiptap/core'\r\n\r\nexport interface VideoOptions {\r\n inline: boolean\r\n allowBase64: boolean\r\n HTMLAttributes: Record<string, unknown>\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n video: {\r\n /**\r\n * Insert a video\r\n */\r\n setVideo: (options: { src: string; alt?: string; title?: string }) => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const Video = Node.create<VideoOptions>({\r\n name: 'video',\r\n\r\n addOptions() {\r\n return {\r\n inline: false,\r\n allowBase64: false,\r\n HTMLAttributes: {},\r\n }\r\n },\r\n\r\n inline() {\r\n return this.options.inline\r\n },\r\n\r\n group() {\r\n return this.options.inline ? 'inline' : 'block'\r\n },\r\n\r\n draggable: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n alt: {\r\n default: null,\r\n },\r\n title: {\r\n default: null,\r\n },\r\n width: {\r\n default: null,\r\n },\r\n height: {\r\n default: null,\r\n },\r\n controls: {\r\n default: true,\r\n },\r\n }\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'video',\r\n },\r\n ]\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n 'video',\r\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\r\n ['source', { src: HTMLAttributes.src }],\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setVideo:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n })\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface EmojiOptions {\r\n enableEmoticons: boolean\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n emoji: {\r\n /**\r\n * Insert an emoji at the current position\r\n */\r\n insertEmoji: (emoji: string) => ReturnType\r\n }\r\n }\r\n}\r\n\r\n// Common emoji categories\r\nexport const EMOJI_CATEGORIES = {\r\n smileys: {\r\n label: 'Smileys & People',\r\n emojis: [\r\n '๐Ÿ˜€', '๐Ÿ˜ƒ', '๐Ÿ˜„', '๐Ÿ˜', '๐Ÿ˜†', '๐Ÿ˜…', '๐Ÿคฃ', '๐Ÿ˜‚', '๐Ÿ™‚', '๐Ÿ™ƒ',\r\n '๐Ÿ˜‰', '๐Ÿ˜Š', '๐Ÿ˜‡', '๐Ÿฅฐ', '๐Ÿ˜', '๐Ÿคฉ', '๐Ÿ˜˜', '๐Ÿ˜—', '๐Ÿ˜š', '๐Ÿ˜™',\r\n '๐Ÿฅฒ', '๐Ÿ˜‹', '๐Ÿ˜›', '๐Ÿ˜œ', '๐Ÿคช', '๐Ÿ˜', '๐Ÿค‘', '๐Ÿค—', '๐Ÿคญ', '๐Ÿคซ',\r\n '๐Ÿค”', '๐Ÿค', '๐Ÿคจ', '๐Ÿ˜', '๐Ÿ˜‘', '๐Ÿ˜ถ', '๐Ÿ˜', '๐Ÿ˜’', '๐Ÿ™„', '๐Ÿ˜ฌ',\r\n '๐Ÿ˜ฎโ€๐Ÿ’จ', '๐Ÿคฅ', '๐Ÿ˜Œ', '๐Ÿ˜”', '๐Ÿ˜ช', '๐Ÿคค', '๐Ÿ˜ด', '๐Ÿ˜ท', '๐Ÿค’', '๐Ÿค•',\r\n '๐Ÿคข', '๐Ÿคฎ', '๐Ÿคง', '๐Ÿฅต', '๐Ÿฅถ', '๐Ÿฅด', '๐Ÿ˜ต', '๐Ÿคฏ', '๐Ÿค ', '๐Ÿฅณ',\r\n '๐Ÿฅธ', '๐Ÿ˜Ž', '๐Ÿค“', '๐Ÿง', '๐Ÿ˜•', '๐Ÿ˜Ÿ', '๐Ÿ™', 'โ˜น๏ธ', '๐Ÿ˜ฎ', '๐Ÿ˜ฏ',\r\n '๐Ÿ˜ฒ', '๐Ÿ˜ณ', '๐Ÿฅบ', '๐Ÿ˜ฆ', '๐Ÿ˜ง', '๐Ÿ˜จ', '๐Ÿ˜ฐ', '๐Ÿ˜ฅ', '๐Ÿ˜ข', '๐Ÿ˜ญ',\r\n '๐Ÿ˜ฑ', '๐Ÿ˜–', '๐Ÿ˜ฃ', '๐Ÿ˜ž', '๐Ÿ˜“', '๐Ÿ˜ฉ', '๐Ÿ˜ซ', '๐Ÿฅฑ', '๐Ÿ˜ค', '๐Ÿ˜ก',\r\n '๐Ÿ˜ ', '๐Ÿคฌ', '๐Ÿ˜ˆ', '๐Ÿ‘ฟ', '๐Ÿ’€', 'โ˜ ๏ธ', '๐Ÿ’ฉ', '๐Ÿคก', '๐Ÿ‘น', '๐Ÿ‘บ',\r\n ]\r\n },\r\n gestures: {\r\n label: 'Gestures & Body',\r\n emojis: [\r\n '๐Ÿ‘‹', '๐Ÿคš', '๐Ÿ–๏ธ', 'โœ‹', '๐Ÿ––', '๐Ÿ‘Œ', '๐ŸคŒ', '๐Ÿค', 'โœŒ๏ธ', '๐Ÿคž',\r\n '๐ŸคŸ', '๐Ÿค˜', '๐Ÿค™', '๐Ÿ‘ˆ', '๐Ÿ‘‰', '๐Ÿ‘†', '๐Ÿ–•', '๐Ÿ‘‡', 'โ˜๏ธ', '๐Ÿ‘',\r\n '๐Ÿ‘Ž', 'โœŠ', '๐Ÿ‘Š', '๐Ÿค›', '๐Ÿคœ', '๐Ÿ‘', '๐Ÿ™Œ', '๐Ÿ‘', '๐Ÿคฒ', '๐Ÿค',\r\n '๐Ÿ™', 'โœ๏ธ', '๐Ÿ’…', '๐Ÿคณ', '๐Ÿ’ช', '๐Ÿฆพ', '๐Ÿฆฟ', '๐Ÿฆต', '๐Ÿฆถ', '๐Ÿ‘‚',\r\n '๐Ÿฆป', '๐Ÿ‘ƒ', '๐Ÿง ', '๐Ÿซ€', '๐Ÿซ', '๐Ÿฆท', '๐Ÿฆด', '๐Ÿ‘€', '๐Ÿ‘๏ธ', '๐Ÿ‘…',\r\n '๐Ÿ‘„', '๐Ÿ’‹', '๐Ÿฉธ',\r\n ]\r\n },\r\n animals: {\r\n label: 'Animals & Nature',\r\n emojis: [\r\n '๐Ÿถ', '๐Ÿฑ', '๐Ÿญ', '๐Ÿน', '๐Ÿฐ', '๐ŸฆŠ', '๐Ÿป', '๐Ÿผ', '๐Ÿปโ€โ„๏ธ', '๐Ÿจ',\r\n '๐Ÿฏ', '๐Ÿฆ', '๐Ÿฎ', '๐Ÿท', '๐Ÿธ', '๐Ÿต', '๐Ÿ™ˆ', '๐Ÿ™‰', '๐Ÿ™Š', '๐Ÿ’',\r\n '๐Ÿ”', '๐Ÿง', '๐Ÿฆ', '๐Ÿค', '๐Ÿฃ', '๐Ÿฅ', '๐Ÿฆ†', '๐Ÿฆ…', '๐Ÿฆ‰', '๐Ÿฆ‡',\r\n '๐Ÿบ', '๐Ÿ—', '๐Ÿด', '๐Ÿฆ„', '๐Ÿ', '๐Ÿ›', '๐Ÿฆ‹', '๐ŸŒ', '๐Ÿž', '๐Ÿœ',\r\n '๐ŸฆŸ', '๐Ÿฆ—', '๐Ÿฆ‚', '๐Ÿข', '๐Ÿ', '๐ŸฆŽ', '๐Ÿฆ–', '๐Ÿฆ•', '๐Ÿ™', '๐Ÿฆ‘',\r\n '๐Ÿฆ', '๐Ÿฆž', '๐Ÿฆ€', '๐Ÿก', '๐Ÿ ', '๐ŸŸ', '๐Ÿฌ', '๐Ÿณ', '๐Ÿ‹', '๐Ÿฆˆ',\r\n '๐ŸŠ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฆ“', '๐Ÿฆ', '๐Ÿฆง', '๐Ÿฆฃ', '๐Ÿ˜', '๐Ÿฆ›', '๐Ÿฆ',\r\n '๐ŸŒธ', '๐ŸŒบ', '๐ŸŒป', '๐ŸŒผ', '๐ŸŒท', '๐ŸŒน', '๐Ÿฅ€', '๐ŸŒต', '๐ŸŒฒ', '๐ŸŒณ',\r\n '๐ŸŒด', '๐ŸŒฑ', '๐ŸŒฟ', 'โ˜˜๏ธ', '๐Ÿ€', '๐Ÿ', '๐Ÿ‚', '๐Ÿƒ', '๐Ÿ„', '๐ŸŒพ',\r\n ]\r\n },\r\n food: {\r\n label: 'Food & Drink',\r\n emojis: [\r\n '๐ŸŽ', '๐Ÿ', '๐ŸŠ', '๐Ÿ‹', '๐ŸŒ', '๐Ÿ‰', '๐Ÿ‡', '๐Ÿ“', '๐Ÿซ', '๐Ÿˆ',\r\n '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅญ', '๐Ÿ', '๐Ÿฅฅ', '๐Ÿฅ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฅ‘', '๐Ÿฅฆ',\r\n '๐Ÿฅฌ', '๐Ÿฅ’', '๐ŸŒถ๏ธ', '๐Ÿซ‘', '๐ŸŒฝ', '๐Ÿฅ•', '๐Ÿซ’', '๐Ÿง„', '๐Ÿง…', '๐Ÿฅ”',\r\n '๐Ÿ ', '๐Ÿฅ', '๐Ÿฅฏ', '๐Ÿž', '๐Ÿฅ–', '๐Ÿฅจ', '๐Ÿง€', '๐Ÿฅš', '๐Ÿณ', '๐Ÿงˆ',\r\n '๐Ÿฅž', '๐Ÿง‡', '๐Ÿฅ“', '๐Ÿฅฉ', '๐Ÿ—', '๐Ÿ–', '๐Ÿฆด', '๐ŸŒญ', '๐Ÿ”', '๐ŸŸ',\r\n '๐Ÿ•', '๐Ÿซ“', '๐Ÿฅช', '๐Ÿฅ™', '๐Ÿง†', '๐ŸŒฎ', '๐ŸŒฏ', '๐Ÿซ”', '๐Ÿฅ—', '๐Ÿฅ˜',\r\n '๐Ÿซ•', '๐Ÿ', '๐Ÿœ', '๐Ÿฒ', '๐Ÿ›', '๐Ÿฃ', '๐Ÿฑ', '๐ŸฅŸ', '๐Ÿฆช', '๐Ÿค',\r\n '๐Ÿ™', '๐Ÿš', '๐Ÿ˜', '๐Ÿฅ', '๐Ÿฅ ', '๐Ÿฅฎ', '๐Ÿข', '๐Ÿก', '๐Ÿง', '๐Ÿจ',\r\n '๐Ÿฆ', '๐Ÿฅง', '๐Ÿง', '๐Ÿฐ', '๐ŸŽ‚', '๐Ÿฎ', '๐Ÿญ', '๐Ÿฌ', '๐Ÿซ', '๐Ÿฟ',\r\n '๐Ÿฉ', '๐Ÿช', '๐ŸŒฐ', '๐Ÿฅœ', '๐Ÿฏ', 'โ˜•', '๐Ÿต', '๐Ÿงƒ', '๐Ÿฅค', '๐Ÿถ',\r\n '๐Ÿบ', '๐Ÿป', '๐Ÿฅ‚', '๐Ÿท', '๐Ÿฅƒ', '๐Ÿธ', '๐Ÿน', '๐Ÿง‰', '๐ŸงŠ',\r\n ]\r\n },\r\n activities: {\r\n label: 'Activities',\r\n emojis: [\r\n 'โšฝ', '๐Ÿ€', '๐Ÿˆ', 'โšพ', '๐ŸฅŽ', '๐ŸŽพ', '๐Ÿ', '๐Ÿ‰', '๐Ÿฅ', '๐ŸŽฑ',\r\n '๐Ÿช€', '๐Ÿ“', '๐Ÿธ', '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅ', '๐Ÿ', '๐Ÿชƒ', '๐Ÿฅ…', 'โ›ณ',\r\n '๐Ÿช', '๐Ÿน', '๐ŸŽฃ', '๐Ÿคฟ', '๐ŸฅŠ', '๐Ÿฅ‹', '๐ŸŽฝ', '๐Ÿ›น', '๐Ÿ›ผ', '๐Ÿ›ท',\r\n 'โ›ธ๏ธ', '๐ŸฅŒ', '๐ŸŽฟ', 'โ›ท๏ธ', '๐Ÿ‚', '๐Ÿช‚', '๐Ÿ‹๏ธ', '๐Ÿคผ', '๐Ÿคธ', 'โ›น๏ธ',\r\n '๐Ÿคบ', '๐Ÿคพ', '๐ŸŒ๏ธ', '๐Ÿ‡', '๐Ÿง˜', '๐Ÿ„', '๐ŸŠ', '๐Ÿคฝ', '๐Ÿšฃ', '๐Ÿง—',\r\n '๐Ÿšต', '๐Ÿšด', '๐Ÿ†', '๐Ÿฅ‡', '๐Ÿฅˆ', '๐Ÿฅ‰', '๐Ÿ…', '๐ŸŽ–๏ธ', '๐Ÿต๏ธ', '๐ŸŽ—๏ธ',\r\n '๐ŸŽซ', '๐ŸŽŸ๏ธ', '๐ŸŽช', '๐ŸŽญ', '๐ŸŽจ', '๐ŸŽฌ', '๐ŸŽค', '๐ŸŽง', '๐ŸŽผ', '๐ŸŽน',\r\n '๐Ÿฅ', '๐Ÿช˜', '๐ŸŽท', '๐ŸŽบ', '๐Ÿช—', '๐ŸŽธ', '๐Ÿช•', '๐ŸŽป', '๐ŸŽฒ', 'โ™Ÿ๏ธ',\r\n '๐ŸŽฏ', '๐ŸŽณ', '๐ŸŽฎ', '๐ŸŽฐ', '๐Ÿงฉ',\r\n ]\r\n },\r\n objects: {\r\n label: 'Objects',\r\n emojis: [\r\n 'โŒš', '๐Ÿ“ฑ', '๐Ÿ’ป', 'โŒจ๏ธ', '๐Ÿ–ฅ๏ธ', '๐Ÿ–จ๏ธ', '๐Ÿ–ฑ๏ธ', '๐Ÿ–ฒ๏ธ', '๐Ÿ•น๏ธ', '๐Ÿ—œ๏ธ',\r\n '๐Ÿ’ฝ', '๐Ÿ’พ', '๐Ÿ’ฟ', '๐Ÿ“€', '๐Ÿ“ผ', '๐Ÿ“ท', '๐Ÿ“ธ', '๐Ÿ“น', '๐ŸŽฅ', '๐Ÿ“ฝ๏ธ',\r\n '๐ŸŽž๏ธ', '๐Ÿ“ž', 'โ˜Ž๏ธ', '๐Ÿ“Ÿ', '๐Ÿ“ ', '๐Ÿ“บ', '๐Ÿ“ป', '๐ŸŽ™๏ธ', '๐ŸŽš๏ธ', '๐ŸŽ›๏ธ',\r\n '๐Ÿงญ', 'โฑ๏ธ', 'โฒ๏ธ', 'โฐ', '๐Ÿ•ฐ๏ธ', 'โŒ›', 'โณ', '๐Ÿ“ก', '๐Ÿ”‹', '๐Ÿ”Œ',\r\n '๐Ÿ’ก', '๐Ÿ”ฆ', '๐Ÿ•ฏ๏ธ', '๐Ÿช”', '๐Ÿงฏ', '๐Ÿ›ข๏ธ', '๐Ÿ’ธ', '๐Ÿ’ต', '๐Ÿ’ด', '๐Ÿ’ถ',\r\n '๐Ÿ’ท', '๐Ÿช™', '๐Ÿ’ฐ', '๐Ÿ’ณ', '๐Ÿงพ', '๐Ÿ’Ž', 'โš–๏ธ', '๐Ÿชœ', '๐Ÿงฐ', '๐Ÿช›',\r\n '๐Ÿ”ง', '๐Ÿ”จ', 'โš’๏ธ', '๐Ÿ› ๏ธ', 'โ›๏ธ', '๐Ÿชš', '๐Ÿ”ฉ', 'โš™๏ธ', '๐Ÿชค', '๐Ÿงฑ',\r\n 'โ›“๏ธ', '๐Ÿงฒ', '๐Ÿ”ซ', '๐Ÿ’ฃ', '๐Ÿงจ', '๐Ÿช“', '๐Ÿ”ช', '๐Ÿ—ก๏ธ', 'โš”๏ธ', '๐Ÿ›ก๏ธ',\r\n '๐Ÿšฌ', 'โšฐ๏ธ', '๐Ÿชฆ', 'โšฑ๏ธ', '๐Ÿบ', '๐Ÿ”ฎ', '๐Ÿ“ฟ', '๐Ÿงฟ', '๐Ÿ’ˆ', 'โš—๏ธ',\r\n '๐Ÿ”ญ', '๐Ÿ”ฌ', '๐Ÿ•ณ๏ธ', '๐Ÿฉน', '๐Ÿฉบ', '๐Ÿ’Š', '๐Ÿ’‰', '๐Ÿฉธ', '๐Ÿงฌ', '๐Ÿฆ ',\r\n '๐Ÿงซ', '๐Ÿงช', '๐ŸŒก๏ธ', '๐Ÿงน', '๐Ÿช ', '๐Ÿงบ', '๐Ÿงป', '๐Ÿšฝ', '๐Ÿšฐ', '๐Ÿšฟ',\r\n '๐Ÿ›', '๐Ÿ›€', '๐Ÿงผ', '๐Ÿชฅ', '๐Ÿช’', '๐Ÿงฝ', '๐Ÿชฃ', '๐Ÿงด', '๐Ÿ›Ž๏ธ', '๐Ÿ”‘',\r\n '๐Ÿ—๏ธ', '๐Ÿšช', '๐Ÿช‘', '๐Ÿ›‹๏ธ', '๐Ÿ›๏ธ', '๐Ÿ›Œ', '๐Ÿงธ', '๐Ÿช†', '๐Ÿ–ผ๏ธ', '๐Ÿชž',\r\n '๐ŸชŸ', '๐Ÿ›๏ธ', '๐Ÿ›’', '๐ŸŽ', '๐ŸŽˆ', '๐ŸŽ', '๐ŸŽ€', '๐Ÿช„', '๐Ÿช…', '๐ŸŽŠ',\r\n '๐ŸŽ‰', '๐ŸŽŽ', '๐Ÿฎ', '๐ŸŽ', '๐Ÿงง', 'โœ‰๏ธ', '๐Ÿ“ฉ', '๐Ÿ“จ', '๐Ÿ“ง', '๐Ÿ’Œ',\r\n '๐Ÿ“ฅ', '๐Ÿ“ค', '๐Ÿ“ฆ', '๐Ÿท๏ธ', '๐Ÿ“ช', '๐Ÿ“ซ', '๐Ÿ“ฌ', '๐Ÿ“ญ', '๐Ÿ“ฎ', '๐Ÿ“ฏ',\r\n '๐Ÿ“œ', '๐Ÿ“ƒ', '๐Ÿ“„', '๐Ÿ“‘', '๐Ÿงพ', '๐Ÿ“Š', '๐Ÿ“ˆ', '๐Ÿ“‰', '๐Ÿ—’๏ธ', '๐Ÿ—“๏ธ',\r\n '๐Ÿ“†', '๐Ÿ“…', '๐Ÿ—‘๏ธ', '๐Ÿ“‡', '๐Ÿ—ƒ๏ธ', '๐Ÿ—ณ๏ธ', '๐Ÿ—„๏ธ', '๐Ÿ“‹', '๐Ÿ“', '๐Ÿ“‚',\r\n '๐Ÿ—‚๏ธ', '๐Ÿ—ž๏ธ', '๐Ÿ“ฐ', '๐Ÿ““', '๐Ÿ“”', '๐Ÿ“’', '๐Ÿ“•', '๐Ÿ“—', '๐Ÿ“˜', '๐Ÿ“™',\r\n '๐Ÿ“š', '๐Ÿ“–', '๐Ÿ”–', '๐Ÿงท', '๐Ÿ”—', '๐Ÿ“Ž', '๐Ÿ–‡๏ธ', '๐Ÿ“', '๐Ÿ“', '๐Ÿงฎ',\r\n '๐Ÿ“Œ', '๐Ÿ“', 'โœ‚๏ธ', '๐Ÿ–Š๏ธ', '๐Ÿ–‹๏ธ', 'โœ’๏ธ', '๐Ÿ–Œ๏ธ', '๐Ÿ–๏ธ', '๐Ÿ“', 'โœ๏ธ',\r\n '๐Ÿ”', '๐Ÿ”Ž', '๐Ÿ”', '๐Ÿ”', '๐Ÿ”’', '๐Ÿ”“',\r\n ]\r\n },\r\n symbols: {\r\n label: 'Symbols',\r\n emojis: [\r\n 'โค๏ธ', '๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ', '๐Ÿ’”',\r\n 'โฃ๏ธ', '๐Ÿ’•', '๐Ÿ’ž', '๐Ÿ’“', '๐Ÿ’—', '๐Ÿ’–', '๐Ÿ’˜', '๐Ÿ’', '๐Ÿ’Ÿ', 'โ˜ฎ๏ธ',\r\n 'โœ๏ธ', 'โ˜ช๏ธ', '๐Ÿ•‰๏ธ', 'โ˜ธ๏ธ', 'โœก๏ธ', '๐Ÿ”ฏ', '๐Ÿ•Ž', 'โ˜ฏ๏ธ', 'โ˜ฆ๏ธ', '๐Ÿ›',\r\n 'โ›Ž', 'โ™ˆ', 'โ™‰', 'โ™Š', 'โ™‹', 'โ™Œ', 'โ™', 'โ™Ž', 'โ™', 'โ™',\r\n 'โ™‘', 'โ™’', 'โ™“', '๐Ÿ†”', 'โš›๏ธ', '๐Ÿ‰‘', 'โ˜ข๏ธ', 'โ˜ฃ๏ธ', '๐Ÿ“ด', '๐Ÿ“ณ',\r\n '๐Ÿˆถ', '๐Ÿˆš', '๐Ÿˆธ', '๐Ÿˆบ', '๐Ÿˆท๏ธ', 'โœด๏ธ', '๐Ÿ†š', '๐Ÿ’ฎ', '๐Ÿ‰', 'ใŠ™๏ธ',\r\n 'ใŠ—๏ธ', '๐Ÿˆด', '๐Ÿˆต', '๐Ÿˆน', '๐Ÿˆฒ', '๐Ÿ…ฐ๏ธ', '๐Ÿ…ฑ๏ธ', '๐Ÿ†Ž', '๐Ÿ†‘', '๐Ÿ…พ๏ธ',\r\n '๐Ÿ†˜', 'โŒ', 'โญ•', '๐Ÿ›‘', 'โ›”', '๐Ÿ“›', '๐Ÿšซ', '๐Ÿ’ฏ', '๐Ÿ’ข', 'โ™จ๏ธ',\r\n '๐Ÿšท', '๐Ÿšฏ', '๐Ÿšณ', '๐Ÿšฑ', '๐Ÿ”ž', '๐Ÿ“ต', '๐Ÿšญ', 'โ—', 'โ•', 'โ“',\r\n 'โ”', 'โ€ผ๏ธ', 'โ‰๏ธ', '๐Ÿ”…', '๐Ÿ”†', 'ใ€ฝ๏ธ', 'โš ๏ธ', '๐Ÿšธ', '๐Ÿ”ฑ', 'โšœ๏ธ',\r\n '๐Ÿ”ฐ', 'โ™ป๏ธ', 'โœ…', '๐Ÿˆฏ', '๐Ÿ’น', 'โ‡๏ธ', 'โœณ๏ธ', 'โŽ', '๐ŸŒ', '๐Ÿ’ ',\r\n 'โ“‚๏ธ', '๐ŸŒ€', '๐Ÿ’ค', '๐Ÿง', '๐Ÿšพ', 'โ™ฟ', '๐Ÿ…ฟ๏ธ', '๐Ÿ›—', '๐Ÿˆณ', '๐Ÿˆ‚๏ธ',\r\n '๐Ÿ›‚', '๐Ÿ›ƒ', '๐Ÿ›„', '๐Ÿ›…', '๐Ÿšน', '๐Ÿšบ', '๐Ÿšผ', 'โšง๏ธ', '๐Ÿšป', '๐Ÿšฎ',\r\n '๐ŸŽฆ', '๐Ÿ“ถ', '๐Ÿˆ', '๐Ÿ”ฃ', 'โ„น๏ธ', '๐Ÿ”ค', '๐Ÿ”ก', '๐Ÿ” ', '๐Ÿ†–', '๐Ÿ†—',\r\n '๐Ÿ†™', '๐Ÿ†’', '๐Ÿ†•', '๐Ÿ†“', '0๏ธโƒฃ', '1๏ธโƒฃ', '2๏ธโƒฃ', '3๏ธโƒฃ', '4๏ธโƒฃ', '5๏ธโƒฃ',\r\n '6๏ธโƒฃ', '7๏ธโƒฃ', '8๏ธโƒฃ', '9๏ธโƒฃ', '๐Ÿ”Ÿ', '๐Ÿ”ข', '#๏ธโƒฃ', '*๏ธโƒฃ', 'โ๏ธ', 'โ–ถ๏ธ',\r\n 'โธ๏ธ', 'โฏ๏ธ', 'โน๏ธ', 'โบ๏ธ', 'โญ๏ธ', 'โฎ๏ธ', 'โฉ', 'โช', 'โซ', 'โฌ',\r\n 'โ—€๏ธ', '๐Ÿ”ผ', '๐Ÿ”ฝ', 'โžก๏ธ', 'โฌ…๏ธ', 'โฌ†๏ธ', 'โฌ‡๏ธ', 'โ†—๏ธ', 'โ†˜๏ธ', 'โ†™๏ธ',\r\n 'โ†–๏ธ', 'โ†•๏ธ', 'โ†”๏ธ', 'โ†ช๏ธ', 'โ†ฉ๏ธ', 'โคด๏ธ', 'โคต๏ธ', '๐Ÿ”€', '๐Ÿ”', '๐Ÿ”‚',\r\n '๐Ÿ”„', '๐Ÿ”ƒ', '๐ŸŽต', '๐ŸŽถ', 'โž•', 'โž–', 'โž—', 'โœ–๏ธ', 'โ™พ๏ธ', '๐Ÿ’ฒ',\r\n '๐Ÿ’ฑ', 'โ„ข๏ธ', 'ยฉ๏ธ', 'ยฎ๏ธ', 'ใ€ฐ๏ธ', 'โžฐ', 'โžฟ', '๐Ÿ”š', '๐Ÿ”™', '๐Ÿ”›',\r\n '๐Ÿ”', '๐Ÿ”œ', 'โœ”๏ธ', 'โ˜‘๏ธ', '๐Ÿ”˜', '๐Ÿ”ด', '๐ŸŸ ', '๐ŸŸก', '๐ŸŸข', '๐Ÿ”ต',\r\n '๐ŸŸฃ', 'โšซ', 'โšช', '๐ŸŸค', '๐Ÿ”บ', '๐Ÿ”ป', '๐Ÿ”ธ', '๐Ÿ”น', '๐Ÿ”ถ', '๐Ÿ”ท',\r\n '๐Ÿ”ณ', '๐Ÿ”ฒ', 'โ–ช๏ธ', 'โ–ซ๏ธ', 'โ—พ', 'โ—ฝ', 'โ—ผ๏ธ', 'โ—ป๏ธ', '๐ŸŸฅ', '๐ŸŸง',\r\n '๐ŸŸจ', '๐ŸŸฉ', '๐ŸŸฆ', '๐ŸŸช', 'โฌ›', 'โฌœ', '๐ŸŸซ', '๐Ÿ”ˆ', '๐Ÿ”‡', '๐Ÿ”‰',\r\n '๐Ÿ”Š', '๐Ÿ””', '๐Ÿ”•', '๐Ÿ“ฃ', '๐Ÿ“ข', '๐Ÿ’ฌ', '๐Ÿ’ญ', '๐Ÿ—ฏ๏ธ', 'โ™ ๏ธ', 'โ™ฃ๏ธ',\r\n 'โ™ฅ๏ธ', 'โ™ฆ๏ธ', '๐Ÿƒ', '๐ŸŽด', '๐Ÿ€„', '๐Ÿ•', '๐Ÿ•‘', '๐Ÿ•’', '๐Ÿ•“', '๐Ÿ•”',\r\n '๐Ÿ••', '๐Ÿ•–', '๐Ÿ•—', '๐Ÿ•˜', '๐Ÿ•™', '๐Ÿ•š', '๐Ÿ•›', '๐Ÿ•œ', '๐Ÿ•', '๐Ÿ•ž',\r\n '๐Ÿ•Ÿ', '๐Ÿ• ', '๐Ÿ•ก', '๐Ÿ•ข', '๐Ÿ•ฃ', '๐Ÿ•ค', '๐Ÿ•ฅ', '๐Ÿ•ฆ', '๐Ÿ•ง',\r\n ]\r\n },\r\n flags: {\r\n label: 'Flags',\r\n emojis: [\r\n '๐Ÿณ๏ธ', '๐Ÿด', '๐Ÿดโ€โ˜ ๏ธ', '๐Ÿ', '๐Ÿšฉ', '๐ŸŽŒ', '๐Ÿณ๏ธโ€๐ŸŒˆ', '๐Ÿณ๏ธโ€โšง๏ธ',\r\n '๐Ÿ‡บ๐Ÿ‡ธ', '๐Ÿ‡ฌ๐Ÿ‡ง', '๐Ÿ‡จ๐Ÿ‡ฆ', '๐Ÿ‡ฆ๐Ÿ‡บ', '๐Ÿ‡ฎ๐Ÿ‡ณ', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‡จ๐Ÿ‡ณ', '๐Ÿ‡ฐ๐Ÿ‡ท',\r\n '๐Ÿ‡ฉ๐Ÿ‡ช', '๐Ÿ‡ซ๐Ÿ‡ท', '๐Ÿ‡ฎ๐Ÿ‡น', '๐Ÿ‡ช๐Ÿ‡ธ', '๐Ÿ‡ง๐Ÿ‡ท', '๐Ÿ‡ฒ๐Ÿ‡ฝ', '๐Ÿ‡ท๐Ÿ‡บ', '๐Ÿ‡ฟ๐Ÿ‡ฆ',\r\n ]\r\n }\r\n} as const\r\n\r\nexport const Emoji = Extension.create<EmojiOptions>({\r\n name: 'emoji',\r\n\r\n addOptions() {\r\n return {\r\n enableEmoticons: true,\r\n }\r\n },\r\n\r\n addCommands() {\r\n return {\r\n insertEmoji:\r\n (emoji: string) =>\r\n ({ commands }) => {\r\n return commands.insertContent(emoji)\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface FullscreenOptions {\r\n className: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n fullscreen: {\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen: () => ReturnType\r\n /**\r\n * Enter fullscreen mode\r\n */\r\n enterFullscreen: () => ReturnType\r\n /**\r\n * Exit fullscreen mode\r\n */\r\n exitFullscreen: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const Fullscreen = Extension.create<FullscreenOptions>({\r\n name: 'fullscreen',\r\n\r\n addOptions() {\r\n return {\r\n className: 'rte-builder-fullscreen',\r\n }\r\n },\r\n\r\n addStorage() {\r\n return {\r\n isFullscreen: false,\r\n }\r\n },\r\n\r\n addCommands() {\r\n return {\r\n toggleFullscreen:\r\n () =>\r\n ({ editor }) => {\r\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\r\n if (!wrapper) return false\r\n\r\n this.storage.isFullscreen = !this.storage.isFullscreen\r\n\r\n if (this.storage.isFullscreen) {\r\n wrapper.classList.add(this.options.className)\r\n document.body.style.overflow = 'hidden'\r\n } else {\r\n wrapper.classList.remove(this.options.className)\r\n document.body.style.overflow = ''\r\n }\r\n\r\n // Trigger re-render to update button state\r\n editor.view.dispatch(editor.state.tr)\r\n\r\n return true\r\n },\r\n enterFullscreen:\r\n () =>\r\n ({ editor }) => {\r\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\r\n if (!wrapper) return false\r\n\r\n this.storage.isFullscreen = true\r\n wrapper.classList.add(this.options.className)\r\n document.body.style.overflow = 'hidden'\r\n editor.view.dispatch(editor.state.tr)\r\n\r\n return true\r\n },\r\n exitFullscreen:\r\n () =>\r\n ({ editor }) => {\r\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\r\n if (!wrapper) return false\r\n\r\n this.storage.isFullscreen = false\r\n wrapper.classList.remove(this.options.className)\r\n document.body.style.overflow = ''\r\n editor.view.dispatch(editor.state.tr)\r\n\r\n return true\r\n },\r\n }\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n Escape: () => {\r\n if (this.storage.isFullscreen) {\r\n return this.editor.commands.exitFullscreen()\r\n }\r\n return false\r\n },\r\n 'Mod-Shift-f': () => {\r\n return this.editor.commands.toggleFullscreen()\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface PrintOptions {\r\n title?: string\r\n styles?: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n print: {\r\n /**\r\n * Print the editor content\r\n */\r\n print: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nconst defaultPrintStyles = `\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n font-size: 14px;\r\n line-height: 1.6;\r\n color: #1f2937;\r\n padding: 20px;\r\n max-width: 800px;\r\n margin: 0 auto;\r\n }\r\n\r\n h1 { font-size: 2em; font-weight: 700; margin: 1em 0 0.5em; }\r\n h2 { font-size: 1.5em; font-weight: 700; margin: 0.83em 0 0.5em; }\r\n h3 { font-size: 1.25em; font-weight: 600; margin: 1em 0 0.5em; }\r\n h4 { font-size: 1.1em; font-weight: 600; margin: 1.33em 0 0.5em; }\r\n h5 { font-size: 1em; font-weight: 600; margin: 1.67em 0 0.5em; }\r\n h6 { font-size: 0.875em; font-weight: 600; margin: 2.33em 0 0.5em; }\r\n\r\n p { margin: 0 0 1em; }\r\n\r\n ul, ol { padding-left: 2em; margin: 0 0 1em; }\r\n ul { list-style-type: disc; }\r\n ol { list-style-type: decimal; }\r\n li { margin: 0.25em 0; }\r\n\r\n blockquote {\r\n border-left: 4px solid #3b82f6;\r\n padding-left: 1em;\r\n margin: 1em 0;\r\n color: #6b7280;\r\n font-style: italic;\r\n }\r\n\r\n code {\r\n background: #f3f4f6;\r\n color: #e11d48;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-family: 'Courier New', Courier, monospace;\r\n font-size: 0.9em;\r\n }\r\n\r\n pre {\r\n background: #1f2937;\r\n color: #f9fafb;\r\n padding: 1em;\r\n border-radius: 6px;\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n }\r\n\r\n pre code {\r\n background: transparent;\r\n color: inherit;\r\n padding: 0;\r\n }\r\n\r\n a { color: #3b82f6; text-decoration: underline; }\r\n\r\n img, video {\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 4px;\r\n display: block;\r\n margin: 1em 0;\r\n }\r\n\r\n hr {\r\n border: none;\r\n border-top: 2px solid #e5e7eb;\r\n margin: 2em 0;\r\n }\r\n\r\n table {\r\n border-collapse: collapse;\r\n width: 100%;\r\n margin: 1em 0;\r\n }\r\n\r\n th, td {\r\n border: 1px solid #d1d5db;\r\n padding: 8px 12px;\r\n text-align: left;\r\n }\r\n\r\n th {\r\n background: #f3f4f6;\r\n font-weight: 600;\r\n }\r\n\r\n mark {\r\n background-color: #fef08a;\r\n padding: 2px 0;\r\n }\r\n\r\n @media print {\r\n body {\r\n padding: 0;\r\n margin: 0;\r\n }\r\n\r\n pre {\r\n white-space: pre-wrap;\r\n word-wrap: break-word;\r\n }\r\n\r\n img, video {\r\n page-break-inside: avoid;\r\n }\r\n\r\n h1, h2, h3, h4, h5, h6 {\r\n page-break-after: avoid;\r\n }\r\n }\r\n`\r\n\r\nexport const Print = Extension.create<PrintOptions>({\r\n name: 'print',\r\n\r\n addOptions() {\r\n return {\r\n title: 'Print Document',\r\n styles: defaultPrintStyles,\r\n }\r\n },\r\n\r\n addCommands() {\r\n return {\r\n print:\r\n () =>\r\n ({ editor }) => {\r\n const content = editor.getHTML()\r\n const printWindow = window.open('', '_blank')\r\n\r\n if (!printWindow) {\r\n console.error('Failed to open print window. Please allow popups.')\r\n return false\r\n }\r\n\r\n const title = this.options.title || 'Print Document'\r\n const styles = this.options.styles || defaultPrintStyles\r\n\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n <title>${title}</title>\r\n <style>${styles}</style>\r\n </head>\r\n <body>\r\n ${content}\r\n </body>\r\n </html>\r\n `)\r\n\r\n printWindow.document.close()\r\n\r\n // Wait for content to load, then print\r\n printWindow.onload = () => {\r\n printWindow.focus()\r\n printWindow.print()\r\n // Close window after printing (optional - some browsers close automatically)\r\n // printWindow.close()\r\n }\r\n\r\n // Fallback for browsers that don't trigger onload\r\n setTimeout(() => {\r\n printWindow.focus()\r\n printWindow.print()\r\n }, 500)\r\n\r\n return true\r\n },\r\n }\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-p': () => {\r\n return this.editor.commands.print()\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface IndentOptions {\r\n types: string[]\r\n minIndent: number\r\n maxIndent: number\r\n indentUnit: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n indent: {\r\n /**\r\n * Indent the current block\r\n */\r\n indent: () => ReturnType\r\n /**\r\n * Outdent the current block\r\n */\r\n outdent: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const Indent = Extension.create<IndentOptions>({\r\n name: 'indent',\r\n\r\n addOptions() {\r\n return {\r\n types: ['paragraph', 'heading', 'blockquote'],\r\n minIndent: 0,\r\n maxIndent: 10,\r\n indentUnit: '2em',\r\n }\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n indent: {\r\n default: 0,\r\n parseHTML: (element) => {\r\n const marginLeft = element.style.marginLeft\r\n if (marginLeft) {\r\n const match = marginLeft.match(/^(\\d+)/)\r\n if (match) {\r\n return parseInt(match[1], 10) / 2 // Assuming 2em per level\r\n }\r\n }\r\n return 0\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes.indent || attributes.indent === 0) {\r\n return {}\r\n }\r\n\r\n return {\r\n style: `margin-left: ${attributes.indent * 2}em`,\r\n }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n indent:\r\n () =>\r\n ({ tr, state, dispatch }) => {\r\n const { selection } = state\r\n const { from, to } = selection\r\n\r\n let changed = false\r\n\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (this.options.types.includes(node.type.name)) {\r\n const currentIndent = node.attrs.indent || 0\r\n if (currentIndent < this.options.maxIndent) {\r\n if (dispatch) {\r\n tr.setNodeMarkup(pos, undefined, {\r\n ...node.attrs,\r\n indent: currentIndent + 1,\r\n })\r\n }\r\n changed = true\r\n }\r\n }\r\n })\r\n\r\n return changed\r\n },\r\n\r\n outdent:\r\n () =>\r\n ({ tr, state, dispatch }) => {\r\n const { selection } = state\r\n const { from, to } = selection\r\n\r\n let changed = false\r\n\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (this.options.types.includes(node.type.name)) {\r\n const currentIndent = node.attrs.indent || 0\r\n if (currentIndent > this.options.minIndent) {\r\n if (dispatch) {\r\n tr.setNodeMarkup(pos, undefined, {\r\n ...node.attrs,\r\n indent: currentIndent - 1,\r\n })\r\n }\r\n changed = true\r\n }\r\n }\r\n })\r\n\r\n return changed\r\n },\r\n }\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n Tab: () => {\r\n // If inside a list, let TipTap's built-in list sink handle it\r\n if (this.editor.isActive('listItem')) {\r\n return false\r\n }\r\n return this.editor.commands.indent()\r\n },\r\n 'Shift-Tab': () => {\r\n // If inside a list, let TipTap's built-in list lift handle it\r\n if (this.editor.isActive('listItem')) {\r\n return false\r\n }\r\n return this.editor.commands.outdent()\r\n },\r\n }\r\n },\r\n})\r\n","/**\r\n * TipTap Toolbar Component\r\n *\r\n * Toolbar implementation specific to TipTap editor.\r\n */\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport type { Editor } from \"@tiptap/react\";\r\nimport type { ToolbarButtonType } from \"../../core/types\";\r\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\r\nimport { CodeXml } from \"lucide-react\";\r\n\r\ninterface TipTapToolbarProps {\r\n editor: Editor | null;\r\n buttons: ToolbarButtonType[];\r\n onMediaPickerImage?: () => void;\r\n onMediaPickerVideo?: () => void;\r\n}\r\n\r\nconst FONT_FAMILIES = [\r\n { value: \"Arial\", label: \"Arial\" },\r\n { value: \"Georgia\", label: \"Georgia\" },\r\n { value: \"Times New Roman\", label: \"Times New Roman\" },\r\n { value: \"Courier New\", label: \"Courier New\" },\r\n { value: \"Verdana\", label: \"Verdana\" },\r\n { value: \"Roboto\", label: \"Roboto\" },\r\n { value: \"Open Sans\", label: \"Open Sans\" },\r\n { value: \"Lato\", label: \"Lato\" },\r\n { value: \"Montserrat\", label: \"Montserrat\" },\r\n { value: \"Poppins\", label: \"Poppins\" },\r\n];\r\n\r\nconst FONT_SIZES = [\r\n \"8px\",\r\n \"10px\",\r\n \"12px\",\r\n \"14px\",\r\n \"16px\",\r\n \"18px\",\r\n \"20px\",\r\n \"24px\",\r\n \"30px\",\r\n \"36px\",\r\n \"48px\",\r\n \"60px\",\r\n \"72px\",\r\n];\r\n\r\nconst LINE_HEIGHTS = [\r\n { value: \"1\", label: \"Single\" },\r\n { value: \"1.15\", label: \"1.15\" },\r\n { value: \"1.5\", label: \"1.5\" },\r\n { value: \"1.75\", label: \"1.75\" },\r\n { value: \"2\", label: \"Double\" },\r\n { value: \"2.5\", label: \"2.5\" },\r\n { value: \"3\", label: \"Triple\" },\r\n];\r\n\r\n// Emoji Picker Component\r\nconst EmojiPicker: React.FC<{\r\n onSelect: (emoji: string) => void;\r\n onClose: () => void;\r\n}> = ({ onSelect, onClose }) => {\r\n const [activeCategory, setActiveCategory] =\r\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\r\n const popoverRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [onClose]);\r\n\r\n return (\r\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n type=\"button\"\r\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\r\n onClick={() =>\r\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\r\n }\r\n title={category.label}\r\n >\r\n {category.emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\r\n <button\r\n key={`${emoji}-${i}`}\r\n type=\"button\"\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => {\r\n onSelect(emoji);\r\n onClose();\r\n }}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const TipTapToolbar: React.FC<TipTapToolbarProps> = ({\r\n editor,\r\n buttons,\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n}) => {\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\r\n\r\n if (!editor) return null;\r\n\r\n const ToolbarButton = ({\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n children,\r\n title,\r\n buttonRef,\r\n }: {\r\n onClick: () => void;\r\n active?: boolean;\r\n disabled?: boolean;\r\n children: React.ReactNode;\r\n title?: string;\r\n buttonRef?: React.RefObject<HTMLButtonElement>;\r\n }) => (\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault(); // Prevent editor from losing focus\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n\r\n const renderButton = (button: ToolbarButtonType, index: number) => {\r\n switch (button) {\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key=\"bold\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n active={editor.isActive(\"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key=\"italic\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n active={editor.isActive(\"italic\")}\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key=\"underline\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n active={editor.isActive(\"underline\")}\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key=\"strike\"\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n active={editor.isActive(\"strike\")}\r\n title=\"Strikethrough\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key=\"code\"\r\n onClick={() => editor.chain().focus().toggleCode().run()}\r\n active={editor.isActive(\"code\")}\r\n title=\"Inline Code\"\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"16 18 22 12 16 6\"></polyline>\r\n <polyline points=\"8 6 2 12 8 18\"></polyline>\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key=\"codeBlock\"\r\n onClick={() => {\r\n if (editor.isActive(\"codeBlock\")) {\r\n // Source mode OFF: extract raw HTML from code block, render as rich content\r\n let htmlSource = \"\";\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === \"codeBlock\") {\r\n htmlSource = node.textContent;\r\n return false;\r\n }\r\n });\r\n\r\n htmlSource = htmlSource.trim();\r\n\r\n if (htmlSource) {\r\n // emitUpdate=true so parent onChange gets the rendered HTML\r\n editor.commands.setContent(htmlSource, true, {\r\n preserveWhitespace: false,\r\n });\r\n } else {\r\n editor.commands.clearContent(true);\r\n }\r\n editor.commands.focus();\r\n } else {\r\n // Source mode ON: get current rich content as HTML, show as editable source\r\n const currentHTML = editor.getHTML();\r\n const isEmptyContent =\r\n !currentHTML ||\r\n currentHTML === \"<p></p>\" ||\r\n currentHTML.trim() === \"\";\r\n\r\n const codeBlockContent = isEmptyContent\r\n ? { type: \"doc\", content: [{ type: \"codeBlock\" }] }\r\n : {\r\n type: \"doc\",\r\n content: [\r\n {\r\n type: \"codeBlock\",\r\n content: [{ type: \"text\", text: currentHTML }],\r\n },\r\n ],\r\n };\r\n\r\n // emitUpdate=false so parent onChange does NOT get the code block wrapper\r\n editor.commands.setContent(codeBlockContent, false);\r\n editor.commands.focus();\r\n }\r\n }}\r\n active={editor.isActive(\"codeBlock\")}\r\n title=\"Code Block (HTML Source)\"\r\n >\r\n <CodeXml size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"subscript\"\r\n onClick={() => editor.chain().focus().toggleSubscript().run()}\r\n active={editor.isActive(\"subscript\")}\r\n title=\"Subscript\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"superscript\"\r\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\r\n active={editor.isActive(\"superscript\")}\r\n title=\"Superscript\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key=\"clearFormatting\"\r\n onClick={() =>\r\n editor.chain().focus().clearNodes().unsetAllMarks().run()\r\n }\r\n title=\"Clear Formatting\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"fontFamily\":\r\n return (\r\n <select\r\n key=\"fontFamily\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontFamily().run();\r\n } else {\r\n editor.chain().focus().setFontFamily(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\r\n >\r\n <option value=\"default\">Font Family</option>\r\n {FONT_FAMILIES.map((font) => (\r\n <option key={font.value} value={font.value}>\r\n {font.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"fontSize\":\r\n return (\r\n <select\r\n key=\"fontSize\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontSize().run();\r\n } else {\r\n editor.chain().focus().setFontSize(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\r\n >\r\n <option value=\"default\">Font Size</option>\r\n {FONT_SIZES.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"lineHeight\":\r\n return (\r\n <select\r\n key=\"lineHeight\"\r\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetLineHeight().run();\r\n } else {\r\n editor.chain().focus().setLineHeight(e.target.value).run();\r\n }\r\n }}\r\n value={\r\n editor.getAttributes(\"paragraph\").lineHeight ||\r\n editor.getAttributes(\"heading\").lineHeight ||\r\n \"default\"\r\n }\r\n title=\"Line Height\"\r\n >\r\n <option value=\"default\">Line Height</option>\r\n {LINE_HEIGHTS.map((lh) => (\r\n <option key={lh.value} value={lh.value}>\r\n {lh.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"textColor\":\r\n const textPresetColors = [\"#11a161\", \"#85144b\", \"#ff851b\", \"#b10dc9\"];\r\n return (\r\n <span key=\"textColor\" className=\"rte-builder-toolbar-color-group\">\r\n <button\r\n key=\"text-none\"\r\n className=\"rte-builder-color-preset rte-builder-color-preset-none\"\r\n onClick={() => editor.chain().focus().unsetColor().run()}\r\n title=\"Text Color: None (Reset)\"\r\n type=\"button\"\r\n />\r\n {textPresetColors.map((color) => (\r\n <button\r\n key={`text-${color}`}\r\n className=\"rte-builder-color-preset\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => editor.chain().focus().setColor(color).run()}\r\n title={`Text Color: ${color}`}\r\n type=\"button\"\r\n />\r\n ))}\r\n <span className=\"rte-builder-toolbar-color\">\r\n <label title=\"Custom Text Color\">\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\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\" />\r\n </svg>\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor.chain().focus().setColor(e.target.value).run()\r\n }\r\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\r\n />\r\n </label>\r\n </span>\r\n </span>\r\n );\r\n\r\n case \"backgroundColor\":\r\n const bgPresetColors = [\"#11a161\", \"#85144b\", \"#ff851b\", \"#b10dc9\"];\r\n return (\r\n <span\r\n key=\"backgroundColor\"\r\n className=\"rte-builder-toolbar-color-group\"\r\n >\r\n {bgPresetColors.map((color) => (\r\n <button\r\n key={`bg-${color}`}\r\n className=\"rte-builder-color-preset rte-builder-color-preset-bg\"\r\n style={{ backgroundColor: color }}\r\n onClick={() =>\r\n editor.chain().focus().toggleHighlight({ color }).run()\r\n }\r\n title={`Highlight Color: ${color}`}\r\n type=\"button\"\r\n />\r\n ))}\r\n <span className=\"rte-builder-toolbar-color\">\r\n <label title=\"Custom Background Color\">\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\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\" />\r\n <path d=\"M2 20h20v4H2z\" fillOpacity=\".36\" />\r\n </svg>\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor\r\n .chain()\r\n .focus()\r\n .toggleHighlight({ color: e.target.value })\r\n .run()\r\n }\r\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\r\n />\r\n </label>\r\n </span>\r\n </span>\r\n );\r\n\r\n case \"alignLeft\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignLeft\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\r\n active={editor.isActive({ textAlign: \"left\" })}\r\n title=\"Align Left\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignCenter\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignCenter\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\r\n active={editor.isActive({ textAlign: \"center\" })}\r\n title=\"Align Center\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignRight\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignRight\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\r\n active={editor.isActive({ textAlign: \"right\" })}\r\n title=\"Align Right\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignJustify\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignJustify\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\r\n active={editor.isActive({ textAlign: \"justify\" })}\r\n title=\"Justify\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"indent\":\r\n return (\r\n <ToolbarButton\r\n key=\"indent\"\r\n onClick={() => editor.chain().focus().indent().run()}\r\n title=\"Indent (Tab)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"outdent\":\r\n return (\r\n <ToolbarButton\r\n key=\"outdent\"\r\n onClick={() => editor.chain().focus().outdent().run()}\r\n title=\"Outdent (Shift+Tab)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key=\"bulletList\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n active={editor.isActive(\"bulletList\")}\r\n title=\"Bullet List\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key=\"orderedList\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n active={editor.isActive(\"orderedList\")}\r\n title=\"Numbered List\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"heading1\":\r\n case \"heading2\":\r\n case \"heading3\":\r\n case \"heading4\":\r\n case \"heading5\":\r\n case \"heading6\":\r\n const level = parseInt(button.replace(\"heading\", \"\")) as\r\n | 1\r\n | 2\r\n | 3\r\n | 4\r\n | 5\r\n | 6;\r\n const headingIcons: Record<number, JSX.Element> = {\r\n 1: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 2: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 3: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 4: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 5: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 6: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n };\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.chain().focus().toggleHeading({ level }).run()\r\n }\r\n active={editor.isActive(\"heading\", { level })}\r\n title={`Heading ${level}`}\r\n >\r\n {headingIcons[level]}\r\n </ToolbarButton>\r\n );\r\n\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton\r\n key=\"blockquote\"\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n active={editor.isActive(\"blockquote\")}\r\n title=\"Blockquote\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key=\"horizontalRule\"\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n title=\"Horizontal Rule\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M4 11h16v2H4z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"link\":\r\n return (\r\n <ToolbarButton\r\n key=\"link\"\r\n onClick={() => {\r\n const url = window.prompt(\"Enter URL:\");\r\n if (url) {\r\n editor.chain().focus().setLink({ href: url }).run();\r\n }\r\n }}\r\n active={editor.isActive(\"link\")}\r\n title=\"Insert Link\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton\r\n key=\"unlink\"\r\n onClick={() => editor.chain().focus().unsetLink().run()}\r\n disabled={!editor.isActive(\"link\")}\r\n title=\"Remove Link\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key=\"image\"\r\n onClick={() => {\r\n if (onMediaPickerImage) {\r\n onMediaPickerImage();\r\n } else {\r\n const url = window.prompt(\"Enter image URL:\");\r\n if (url) {\r\n editor.chain().focus().setImage({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Image\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key=\"video\"\r\n onClick={() => {\r\n if (onMediaPickerVideo) {\r\n onMediaPickerVideo();\r\n } else {\r\n const url = window.prompt(\"Enter video URL:\");\r\n if (url) {\r\n editor.chain().focus().setVideo({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Video\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key=\"table\"\r\n onClick={() =>\r\n editor\r\n .chain()\r\n .focus()\r\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\r\n .run()\r\n }\r\n title=\"Insert Table\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"emoji\":\r\n return (\r\n <span key=\"emoji\" style={{ position: \"relative\" }}>\r\n <ToolbarButton\r\n buttonRef={emojiButtonRef}\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n active={showEmojiPicker}\r\n title=\"Insert Emoji\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <EmojiPicker\r\n onSelect={(emoji) =>\r\n editor.chain().focus().insertEmoji(emoji).run()\r\n }\r\n onClose={() => setShowEmojiPicker(false)}\r\n />\r\n )}\r\n </span>\r\n );\r\n\r\n case \"fullscreen\":\r\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\r\n return (\r\n <ToolbarButton\r\n key=\"fullscreen\"\r\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\r\n active={isFullscreen}\r\n title={\r\n isFullscreen\r\n ? \"Exit Fullscreen (Esc)\"\r\n : \"Fullscreen (Ctrl+Shift+F)\"\r\n }\r\n >\r\n {isFullscreen ? (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" />\r\n </svg>\r\n )}\r\n </ToolbarButton>\r\n );\r\n\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key=\"print\"\r\n onClick={() => editor.chain().focus().print().run()}\r\n title=\"Print (Ctrl+P)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key=\"undo\"\r\n onClick={() => editor.chain().focus().undo().run()}\r\n disabled={!editor.can().undo()}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key=\"redo\"\r\n onClick={() => editor.chain().focus().redo().run()}\r\n disabled={!editor.can().redo()}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"separator\":\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const isSourceMode = editor.isActive(\"codeBlock\");\r\n\r\n return <div className={`rte-builder-toolbar${isSourceMode ? \" rte-builder-toolbar-source-mode\" : \"\"}`}>{buttons.map(renderButton)}</div>;\r\n};\r\n\r\nexport default TipTapToolbar;\r\n","/**\r\n * TipTap Editor Component\r\n *\r\n * This is the actual TipTap editor implementation that conforms\r\n * to the adapter interface.\r\n */\r\n\r\nimport { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\r\nimport { useEditor, EditorContent } from \"@tiptap/react\";\r\nimport { Document } from \"@tiptap/extension-document\";\r\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\r\nimport { Text } from \"@tiptap/extension-text\";\r\nimport { Bold } from \"@tiptap/extension-bold\";\r\nimport { Italic } from \"@tiptap/extension-italic\";\r\nimport { Underline } from \"@tiptap/extension-underline\";\r\nimport { Strike } from \"@tiptap/extension-strike\";\r\nimport { Code } from \"@tiptap/extension-code\";\r\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\r\nimport { Subscript } from \"@tiptap/extension-subscript\";\r\nimport { Superscript } from \"@tiptap/extension-superscript\";\r\nimport { TextStyle } from \"@tiptap/extension-text-style\";\r\nimport { FontFamily } from \"@tiptap/extension-font-family\";\r\nimport { Color } from \"@tiptap/extension-color\";\r\nimport { Highlight } from \"@tiptap/extension-highlight\";\r\nimport { TextAlign } from \"@tiptap/extension-text-align\";\r\nimport { Heading } from \"@tiptap/extension-heading\";\r\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\r\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\r\nimport { ListItem } from \"@tiptap/extension-list-item\";\r\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\r\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\r\nimport { Link } from \"@tiptap/extension-link\";\r\nimport { Image } from \"@tiptap/extension-image\";\r\nimport { Table } from \"@tiptap/extension-table\";\r\nimport { TableRow } from \"@tiptap/extension-table-row\";\r\nimport { TableCell } from \"@tiptap/extension-table-cell\";\r\nimport { TableHeader } from \"@tiptap/extension-table-header\";\r\nimport { History } from \"@tiptap/extension-history\";\r\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\r\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\r\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\r\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\r\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\r\nimport { common, createLowlight } from \"lowlight\";\r\n\r\n// Custom extensions\r\nimport { FontSize } from \"../../extensions/FontSize\";\r\nimport { LineHeight } from \"../../extensions/LineHeight\";\r\nimport { Video } from \"../../extensions/Video\";\r\nimport { Emoji } from \"../../extensions/Emoji\";\r\nimport { Fullscreen } from \"../../extensions/Fullscreen\";\r\nimport { Print } from \"../../extensions/Print\";\r\nimport { Indent } from \"../../extensions/Indent\";\r\n\r\n// Toolbar\r\nimport { TipTapToolbar } from \"./TipTapToolbar\";\r\n\r\n// Types\r\nimport type { AdapterComponentProps, AdapterEditorRef } from \"../../core/types\";\r\n\r\n// Create lowlight instance\r\nconst lowlight = createLowlight(common);\r\n\r\ninterface TipTapEditorComponentProps extends AdapterComponentProps {}\r\n\r\nexport const TipTapEditorComponent = forwardRef<\r\n AdapterEditorRef,\r\n TipTapEditorComponentProps\r\n>(\r\n (\r\n {\r\n value = \"\",\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = \"Start typing...\",\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarButtons,\r\n className = \"\",\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = \"javascript\",\r\n editorConfig = {},\r\n },\r\n ref,\r\n ) => {\r\n // Initialize editor\r\n const editor = useEditor({\r\n extensions: [\r\n Document,\r\n Paragraph,\r\n Text,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strike,\r\n Code,\r\n enableCodeHighlight\r\n ? CodeBlockLowlight.configure({\r\n lowlight,\r\n defaultLanguage: defaultCodeLanguage,\r\n })\r\n : CodeBlockLowlight.configure({\r\n lowlight: null as any,\r\n }),\r\n Subscript,\r\n Superscript,\r\n TextStyle,\r\n FontFamily,\r\n FontSize,\r\n Color,\r\n Highlight.configure({ multicolor: true }),\r\n LineHeight,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Heading.configure({\r\n levels: [1, 2, 3, 4, 5, 6],\r\n }),\r\n BulletList,\r\n OrderedList,\r\n ListItem,\r\n Blockquote,\r\n HorizontalRule,\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n target: \"_blank\",\r\n rel: \"noopener noreferrer\",\r\n },\r\n }),\r\n Image.configure({\r\n inline: false,\r\n allowBase64: true,\r\n }),\r\n Video,\r\n Table.configure({\r\n resizable: true,\r\n }),\r\n TableRow,\r\n TableCell,\r\n TableHeader,\r\n History,\r\n Placeholder.configure({\r\n placeholder,\r\n }),\r\n CharacterCount.configure({\r\n limit: charCounterMax > 0 ? charCounterMax : undefined,\r\n }),\r\n Gapcursor,\r\n Dropcursor,\r\n HardBreak,\r\n Emoji,\r\n Fullscreen,\r\n Print,\r\n Indent,\r\n ],\r\n content: value,\r\n editable: !disabled && !readOnly,\r\n onUpdate: ({ editor }) => {\r\n const html = editor.getHTML();\r\n onChange?.(html);\r\n },\r\n onBlur: () => {\r\n onBlur?.();\r\n },\r\n onFocus: () => {\r\n onFocus?.();\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: \"rte-builder-content\",\r\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\r\n },\r\n transformPastedHTML(html) {\r\n return html\r\n // Remove excessive line breaks (3+ consecutive <br>)\r\n .replace(/(<br\\s*\\/?>\\s*){3,}/gi, \"<br><br>\")\r\n // Collapse multiple blank paragraphs into one\r\n .replace(/(<p>\\s*<\\/p>\\s*){2,}/gi, \"<p></p>\")\r\n // Remove excessive whitespace between tags\r\n .replace(/>\\s{2,}</g, \"> <\")\r\n // Normalize multiple &nbsp; sequences to single space\r\n .replace(/(&nbsp;\\s*){2,}/g, \"&nbsp;\")\r\n // Remove zero-width spaces and other invisible chars\r\n .replace(/[\\u200B\\u200C\\u200D\\uFEFF]/g, \"\")\r\n // Clean up pasted inline styles that cause spacing issues\r\n .replace(\r\n /style=\"[^\"]*\"/gi,\r\n (match) =>\r\n match\r\n .replace(/margin(-top|-bottom):\\s*[\\d.]+(px|em|rem|pt)\\s*;?/gi, \"\")\r\n .replace(/padding(-top|-bottom):\\s*[\\d.]+(px|em|rem|pt)\\s*;?/gi, \"\")\r\n .replace(/line-height:\\s*[\\d.]+(px|em|rem|pt|%)?\\s*;?/gi, \"\")\r\n .replace(/style=\"\\s*\"/gi, \"\"),\r\n );\r\n },\r\n },\r\n ...editorConfig,\r\n });\r\n\r\n // Update content when value prop changes\r\n useEffect(() => {\r\n if (editor && value !== editor.getHTML()) {\r\n editor.commands.setContent(value);\r\n }\r\n }, [value, editor]);\r\n\r\n // Update editable state\r\n useEffect(() => {\r\n if (editor) {\r\n editor.setEditable(!disabled && !readOnly);\r\n }\r\n }, [disabled, readOnly, editor]);\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage && editor) {\r\n const file = await onMediaPickerImage();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setImage({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerImage, editor]);\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo && editor) {\r\n const file = await onMediaPickerVideo();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setVideo({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerVideo, editor]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => {\r\n return editor?.getHTML() || \"\";\r\n },\r\n getText: () => {\r\n return editor?.getText() || \"\";\r\n },\r\n getJSON: () => {\r\n return editor?.getJSON();\r\n },\r\n setContent: (html: string) => {\r\n editor?.commands.setContent(html);\r\n },\r\n focus: () => {\r\n editor?.commands.focus();\r\n },\r\n blur: () => {\r\n editor?.commands.blur();\r\n },\r\n insertHTML: (html: string) => {\r\n editor?.commands.insertContent(html);\r\n },\r\n insertText: (text: string) => {\r\n editor?.commands.insertContent(text);\r\n },\r\n clear: () => {\r\n editor?.commands.clearContent();\r\n },\r\n isEmpty: () => {\r\n return editor?.isEmpty ?? true;\r\n },\r\n getCharacterCount: () => {\r\n return editor?.storage.characterCount?.characters() || 0;\r\n },\r\n getWordCount: () => {\r\n return editor?.storage.characterCount?.words() || 0;\r\n },\r\n isFullscreen: () => {\r\n return editor?.storage.fullscreen?.isFullscreen || false;\r\n },\r\n toggleFullscreen: () => {\r\n editor?.commands.toggleFullscreen();\r\n },\r\n print: () => {\r\n editor?.commands.print();\r\n },\r\n undo: () => {\r\n editor?.commands.undo();\r\n },\r\n redo: () => {\r\n editor?.commands.redo();\r\n },\r\n canUndo: () => {\r\n return editor?.can().undo() ?? false;\r\n },\r\n canRedo: () => {\r\n return editor?.can().redo() ?? false;\r\n },\r\n getNativeEditor: () => {\r\n return editor;\r\n },\r\n }));\r\n\r\n if (!editor) {\r\n return null;\r\n }\r\n\r\n const characterCount = editor.storage.characterCount?.characters() || 0;\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\r\n\r\n return (\r\n <div\r\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\r\n >\r\n <TipTapToolbar\r\n editor={editor}\r\n buttons={toolbarButtons}\r\n onMediaPickerImage={\r\n onMediaPickerImage ? handleMediaPickerImage : undefined\r\n }\r\n onMediaPickerVideo={\r\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\r\n }\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{ height: `${height}px` }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\">\r\n {\" \"}\r\n (limit exceeded)\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nTipTapEditorComponent.displayName = \"TipTapEditorComponent\";\r\n\r\nexport default TipTapEditorComponent;\r\n","/**\r\n * Slate.js Toolbar Component\r\n *\r\n * A toolbar component for the Slate.js editor with all standard formatting options.\r\n */\r\n\r\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\r\nimport { Editor, Transforms, Element as SlateElement } from \"slate\";\r\nimport { useSlate, ReactEditor } from \"slate-react\";\r\n\r\nimport type { ToolbarButtonType } from \"../../core/types\";\r\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface SlateToolbarProps {\r\n editor: Editor;\r\n buttons?: ToolbarButtonType[];\r\n onMediaPickerImage?: () => Promise<void>;\r\n onMediaPickerVideo?: () => Promise<void>;\r\n onToggleFullscreen?: () => void;\r\n onPrint?: () => void;\r\n isFullscreen?: boolean;\r\n toggleMark: (editor: Editor, format: string) => void;\r\n toggleBlock: (editor: Editor, format: string) => void;\r\n isMarkActive: (editor: Editor, format: string) => boolean;\r\n isBlockActive: (\r\n editor: Editor,\r\n format: string,\r\n blockType?: \"type\" | \"align\",\r\n ) => boolean;\r\n}\r\n\r\n// ============================================================================\r\n// TOOLBAR BUTTON COMPONENT\r\n// ============================================================================\r\n\r\ninterface ToolbarButtonProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n title: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\r\n active = false,\r\n disabled = false,\r\n onClick,\r\n title,\r\n children,\r\n}) => (\r\n <button\r\n className={`rte-builder-toolbar-button ${active ? \"active\" : \"\"}`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n);\r\n\r\n// ============================================================================\r\n// TOOLBAR ICONS (Simple SVG icons)\r\n// ============================================================================\r\n\r\nconst icons: Record<string, JSX.Element> = {\r\n bold: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n italic: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"\r\n />\r\n </svg>\r\n ),\r\n underline: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n strike: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"\r\n />\r\n </svg>\r\n ),\r\n code: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n codeBlock: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n subscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n superscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n clearFormatting: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fontFamily: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fontSize: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3v-3H3v3z\"\r\n />\r\n </svg>\r\n ),\r\n lineHeight: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M6 7h2.5L5 3.5 1.5 7H4v10H1.5L5 20.5 8.5 17H6V7zm4-2v2h12V5H10zm0 14h12v-2H10v2zm0-6h12v-2H10v2z\"\r\n />\r\n </svg>\r\n ),\r\n textColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"\r\n />\r\n </svg>\r\n ),\r\n backgroundColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n alignLeft: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignCenter: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignRight: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignJustify: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n indent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n outdent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n bulletList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n orderedList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"\r\n />\r\n </svg>\r\n ),\r\n heading1: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading2: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading3: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n blockquote: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\r\n </svg>\r\n ),\r\n horizontalRule: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M4 11h16v2H4z\" />\r\n </svg>\r\n ),\r\n link: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n unlink: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n image: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n video: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n table: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n emoji: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n undo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n redo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fullscreen: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\r\n />\r\n </svg>\r\n ),\r\n print: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n};\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport const SlateToolbar: React.FC<SlateToolbarProps> = ({\r\n editor,\r\n buttons = [],\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n onToggleFullscreen,\r\n onPrint,\r\n isFullscreen = false,\r\n toggleMark,\r\n toggleBlock,\r\n isMarkActive,\r\n isBlockActive,\r\n}) => {\r\n // Emoji picker state\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const [selectedEmojiCategory, setSelectedEmojiCategory] =\r\n useState<string>(\"smileys\");\r\n const emojiPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Link dialog state\r\n const [showLinkDialog, setShowLinkDialog] = useState(false);\r\n const [linkUrl, setLinkUrl] = useState(\"\");\r\n const linkDialogRef = useRef<HTMLDivElement>(null);\r\n\r\n // Color picker state\r\n const [showColorPicker, setShowColorPicker] = useState<\"text\" | \"bg\" | null>(\r\n null,\r\n );\r\n const colorPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close dropdowns when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n emojiPickerRef.current &&\r\n !emojiPickerRef.current.contains(event.target as Node)\r\n ) {\r\n setShowEmojiPicker(false);\r\n }\r\n if (\r\n linkDialogRef.current &&\r\n !linkDialogRef.current.contains(event.target as Node)\r\n ) {\r\n setShowLinkDialog(false);\r\n }\r\n if (\r\n colorPickerRef.current &&\r\n !colorPickerRef.current.contains(event.target as Node)\r\n ) {\r\n setShowColorPicker(null);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n // Insert emoji\r\n const insertEmoji = useCallback(\r\n (emoji: string) => {\r\n Transforms.insertText(editor, emoji);\r\n setShowEmojiPicker(false);\r\n ReactEditor.focus(editor);\r\n },\r\n [editor],\r\n );\r\n\r\n // Insert link\r\n const insertLink = useCallback(() => {\r\n if (linkUrl) {\r\n const link = {\r\n type: \"link\" as const,\r\n url: linkUrl,\r\n children: [{ text: linkUrl }],\r\n };\r\n Transforms.insertNodes(editor, link);\r\n setLinkUrl(\"\");\r\n setShowLinkDialog(false);\r\n ReactEditor.focus(editor);\r\n }\r\n }, [editor, linkUrl]);\r\n\r\n // Remove link\r\n const removeLink = useCallback(() => {\r\n Transforms.unwrapNodes(editor, {\r\n match: (n) =>\r\n !Editor.isEditor(n) && SlateElement.isElement(n) && n.type === \"link\",\r\n });\r\n }, [editor]);\r\n\r\n // Insert horizontal rule\r\n const insertHorizontalRule = useCallback(() => {\r\n const hr = { type: \"horizontal-rule\" as const, children: [{ text: \"\" }] };\r\n Transforms.insertNodes(editor, hr);\r\n Transforms.insertNodes(editor, {\r\n type: \"paragraph\",\r\n children: [{ text: \"\" }],\r\n });\r\n }, [editor]);\r\n\r\n // Insert table\r\n const insertTable = useCallback(() => {\r\n const table = {\r\n type: \"table\" as const,\r\n children: [\r\n {\r\n type: \"table-row\" as const,\r\n children: [\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n ],\r\n },\r\n {\r\n type: \"table-row\" as const,\r\n children: [\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n ],\r\n },\r\n ],\r\n };\r\n Transforms.insertNodes(editor, table);\r\n }, [editor]);\r\n\r\n // Set color\r\n const setColor = useCallback(\r\n (color: string, type: \"text\" | \"bg\") => {\r\n if (type === \"text\") {\r\n Editor.addMark(editor, \"color\", color);\r\n } else {\r\n Editor.addMark(editor, \"backgroundColor\", color);\r\n }\r\n setShowColorPicker(null);\r\n },\r\n [editor],\r\n );\r\n\r\n // Color palette\r\n const colors = [\r\n \"#000000\",\r\n \"#434343\",\r\n \"#666666\",\r\n \"#999999\",\r\n \"#b7b7b7\",\r\n \"#cccccc\",\r\n \"#d9d9d9\",\r\n \"#efefef\",\r\n \"#f3f3f3\",\r\n \"#ffffff\",\r\n \"#980000\",\r\n \"#ff0000\",\r\n \"#ff9900\",\r\n \"#ffff00\",\r\n \"#00ff00\",\r\n \"#00ffff\",\r\n \"#4a86e8\",\r\n \"#0000ff\",\r\n \"#9900ff\",\r\n \"#ff00ff\",\r\n \"#e6b8af\",\r\n \"#f4cccc\",\r\n \"#fce5cd\",\r\n \"#fff2cc\",\r\n \"#d9ead3\",\r\n \"#d0e0e3\",\r\n \"#c9daf8\",\r\n \"#cfe2f3\",\r\n \"#d9d2e9\",\r\n \"#ead1dc\",\r\n ];\r\n\r\n // Render toolbar button based on type\r\n const renderButton = (button: ToolbarButtonType, index: number) => {\r\n if (button === \"separator\") {\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n }\r\n\r\n switch (button) {\r\n // Text formatting\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"bold\")}\r\n onClick={() => toggleMark(editor, \"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n {icons.bold}\r\n </ToolbarButton>\r\n );\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"italic\")}\r\n onClick={() => toggleMark(editor, \"italic\")}\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n {icons.italic}\r\n </ToolbarButton>\r\n );\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"underline\")}\r\n onClick={() => toggleMark(editor, \"underline\")}\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n {icons.underline}\r\n </ToolbarButton>\r\n );\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"strikethrough\")}\r\n onClick={() => toggleMark(editor, \"strikethrough\")}\r\n title=\"Strikethrough\"\r\n >\r\n {icons.strike}\r\n </ToolbarButton>\r\n );\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"code\")}\r\n onClick={() => toggleMark(editor, \"code\")}\r\n title=\"Code\"\r\n >\r\n {icons.code}\r\n </ToolbarButton>\r\n );\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"code-block\")}\r\n onClick={() => toggleBlock(editor, \"code-block\")}\r\n title=\"Code Block\"\r\n >\r\n {icons.codeBlock}\r\n </ToolbarButton>\r\n );\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"subscript\")}\r\n onClick={() => toggleMark(editor, \"subscript\")}\r\n title=\"Subscript\"\r\n >\r\n {icons.subscript}\r\n </ToolbarButton>\r\n );\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"superscript\")}\r\n onClick={() => toggleMark(editor, \"superscript\")}\r\n title=\"Superscript\"\r\n >\r\n {icons.superscript}\r\n </ToolbarButton>\r\n );\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => {\r\n Editor.removeMark(editor, \"bold\");\r\n Editor.removeMark(editor, \"italic\");\r\n Editor.removeMark(editor, \"underline\");\r\n Editor.removeMark(editor, \"strikethrough\");\r\n Editor.removeMark(editor, \"code\");\r\n Editor.removeMark(editor, \"subscript\");\r\n Editor.removeMark(editor, \"superscript\");\r\n Editor.removeMark(editor, \"color\");\r\n Editor.removeMark(editor, \"backgroundColor\");\r\n Editor.removeMark(editor, \"fontSize\");\r\n Editor.removeMark(editor, \"fontFamily\");\r\n }}\r\n title=\"Clear Formatting\"\r\n >\r\n {icons.clearFormatting}\r\n </ToolbarButton>\r\n );\r\n\r\n // Alignment\r\n case \"alignLeft\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"left\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"left\")}\r\n title=\"Align Left\"\r\n >\r\n {icons.alignLeft}\r\n </ToolbarButton>\r\n );\r\n case \"alignCenter\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"center\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"center\")}\r\n title=\"Align Center\"\r\n >\r\n {icons.alignCenter}\r\n </ToolbarButton>\r\n );\r\n case \"alignRight\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"right\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"right\")}\r\n title=\"Align Right\"\r\n >\r\n {icons.alignRight}\r\n </ToolbarButton>\r\n );\r\n case \"alignJustify\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"justify\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"justify\")}\r\n title=\"Justify\"\r\n >\r\n {icons.alignJustify}\r\n </ToolbarButton>\r\n );\r\n\r\n // Lists\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"bulleted-list\")}\r\n onClick={() => toggleBlock(editor, \"bulleted-list\")}\r\n title=\"Bullet List\"\r\n >\r\n {icons.bulletList}\r\n </ToolbarButton>\r\n );\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"numbered-list\")}\r\n onClick={() => toggleBlock(editor, \"numbered-list\")}\r\n title=\"Numbered List\"\r\n >\r\n {icons.orderedList}\r\n </ToolbarButton>\r\n );\r\n\r\n // Headings\r\n case \"heading1\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"heading\")}\r\n onClick={() => {\r\n Transforms.setNodes(editor, { type: \"heading\", level: 1 } as any);\r\n }}\r\n title=\"Heading 1\"\r\n >\r\n {icons.heading1}\r\n </ToolbarButton>\r\n );\r\n case \"heading2\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"heading\")}\r\n onClick={() => {\r\n Transforms.setNodes(editor, { type: \"heading\", level: 2 } as any);\r\n }}\r\n title=\"Heading 2\"\r\n >\r\n {icons.heading2}\r\n </ToolbarButton>\r\n );\r\n case \"heading3\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"heading\")}\r\n onClick={() => {\r\n Transforms.setNodes(editor, { type: \"heading\", level: 3 } as any);\r\n }}\r\n title=\"Heading 3\"\r\n >\r\n {icons.heading3}\r\n </ToolbarButton>\r\n );\r\n\r\n // Blocks\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"blockquote\")}\r\n onClick={() => toggleBlock(editor, \"blockquote\")}\r\n title=\"Blockquote\"\r\n >\r\n {icons.blockquote}\r\n </ToolbarButton>\r\n );\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={insertHorizontalRule}\r\n title=\"Horizontal Rule\"\r\n >\r\n {icons.horizontalRule}\r\n </ToolbarButton>\r\n );\r\n\r\n // Links\r\n case \"link\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={linkDialogRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowLinkDialog(!showLinkDialog)}\r\n title=\"Insert Link\"\r\n >\r\n {icons.link}\r\n </ToolbarButton>\r\n {showLinkDialog && (\r\n <div className=\"rte-builder-toolbar-dropdown-content\">\r\n <input\r\n type=\"url\"\r\n placeholder=\"Enter URL...\"\r\n value={linkUrl}\r\n onChange={(e) => setLinkUrl(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n insertLink();\r\n }\r\n }}\r\n autoFocus\r\n />\r\n <button onClick={insertLink}>Insert</button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton key={button} onClick={removeLink} title=\"Remove Link\">\r\n {icons.unlink}\r\n </ToolbarButton>\r\n );\r\n\r\n // Media\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerImage || (() => {})}\r\n disabled={!onMediaPickerImage}\r\n title=\"Insert Image\"\r\n >\r\n {icons.image}\r\n </ToolbarButton>\r\n );\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerVideo || (() => {})}\r\n disabled={!onMediaPickerVideo}\r\n title=\"Insert Video\"\r\n >\r\n {icons.video}\r\n </ToolbarButton>\r\n );\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={insertTable}\r\n title=\"Insert Table\"\r\n >\r\n {icons.table}\r\n </ToolbarButton>\r\n );\r\n\r\n // Colors\r\n case \"textColor\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={colorPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() =>\r\n setShowColorPicker(showColorPicker === \"text\" ? null : \"text\")\r\n }\r\n title=\"Text Color\"\r\n >\r\n {icons.textColor}\r\n </ToolbarButton>\r\n {showColorPicker === \"text\" && (\r\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\r\n {colors.map((color) => (\r\n <button\r\n key={color}\r\n className=\"rte-builder-color-swatch\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => setColor(color, \"text\")}\r\n title={color}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n case \"backgroundColor\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={colorPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() =>\r\n setShowColorPicker(showColorPicker === \"bg\" ? null : \"bg\")\r\n }\r\n title=\"Background Color\"\r\n >\r\n {icons.backgroundColor}\r\n </ToolbarButton>\r\n {showColorPicker === \"bg\" && (\r\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\r\n {colors.map((color) => (\r\n <button\r\n key={color}\r\n className=\"rte-builder-color-swatch\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => setColor(color, \"bg\")}\r\n title={color}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // Emoji\r\n case \"emoji\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={emojiPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n title=\"Insert Emoji\"\r\n >\r\n {icons.emoji}\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <div className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? \"active\" : \"\"}`}\r\n onClick={() => setSelectedEmojiCategory(key)}\r\n title={(category as any).label}\r\n >\r\n {(category as any).emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {(\r\n EMOJI_CATEGORIES[\r\n selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES\r\n ] as any\r\n )?.emojis.map((emoji: string, idx: number) => (\r\n <button\r\n key={idx}\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => insertEmoji(emoji)}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // Actions\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.undo()}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n {icons.undo}\r\n </ToolbarButton>\r\n );\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.redo()}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n {icons.redo}\r\n </ToolbarButton>\r\n );\r\n case \"fullscreen\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isFullscreen}\r\n onClick={onToggleFullscreen || (() => {})}\r\n title=\"Toggle Fullscreen\"\r\n >\r\n {icons.fullscreen}\r\n </ToolbarButton>\r\n );\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onPrint || (() => {})}\r\n title=\"Print\"\r\n >\r\n {icons.print}\r\n </ToolbarButton>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"rte-builder-toolbar slate-toolbar\">\r\n {buttons.map((button, index) => renderButton(button, index))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default SlateToolbar;\r\n","/**\r\n * Slate.js Editor Component\r\n *\r\n * This is the actual Slate.js editor implementation that conforms\r\n * to the adapter interface.\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useImperativeHandle,\r\n forwardRef,\r\n useCallback,\r\n useMemo,\r\n useState,\r\n useRef,\r\n} from 'react'\r\nimport { createEditor, Descendant, Editor, Transforms, Text, Element as SlateElement, Node } from 'slate'\r\nimport { Slate, Editable, withReact, ReactEditor, useSlate } from 'slate-react'\r\nimport { withHistory, HistoryEditor } from 'slate-history'\r\nimport isHotkey from 'is-hotkey'\r\n\r\n// Toolbar\r\nimport { SlateToolbar } from './SlateToolbar'\r\n\r\n// Types\r\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\r\n\r\n// ============================================================================\r\n// CUSTOM TYPES\r\n// ============================================================================\r\n\r\ntype CustomText = {\r\n text: string\r\n bold?: boolean\r\n italic?: boolean\r\n underline?: boolean\r\n strikethrough?: boolean\r\n code?: boolean\r\n subscript?: boolean\r\n superscript?: boolean\r\n color?: string\r\n backgroundColor?: string\r\n fontSize?: string\r\n fontFamily?: string\r\n}\r\n\r\ntype ParagraphElement = { type: 'paragraph'; align?: string; indent?: number; children: Descendant[] }\r\ntype HeadingElement = { type: 'heading'; level: 1 | 2 | 3 | 4 | 5 | 6; align?: string; children: Descendant[] }\r\ntype BlockquoteElement = { type: 'blockquote'; children: Descendant[] }\r\ntype CodeBlockElement = { type: 'code-block'; language?: string; children: Descendant[] }\r\ntype BulletListElement = { type: 'bulleted-list'; children: Descendant[] }\r\ntype NumberedListElement = { type: 'numbered-list'; children: Descendant[] }\r\ntype ListItemElement = { type: 'list-item'; children: Descendant[] }\r\ntype LinkElement = { type: 'link'; url: string; children: Descendant[] }\r\ntype ImageElement = { type: 'image'; url: string; alt?: string; children: Descendant[] }\r\ntype VideoElement = { type: 'video'; url: string; children: Descendant[] }\r\ntype HorizontalRuleElement = { type: 'horizontal-rule'; children: Descendant[] }\r\ntype TableElement = { type: 'table'; children: Descendant[] }\r\ntype TableRowElement = { type: 'table-row'; children: Descendant[] }\r\ntype TableCellElement = { type: 'table-cell'; children: Descendant[] }\r\n\r\ntype CustomElement =\r\n | ParagraphElement\r\n | HeadingElement\r\n | BlockquoteElement\r\n | CodeBlockElement\r\n | BulletListElement\r\n | NumberedListElement\r\n | ListItemElement\r\n | LinkElement\r\n | ImageElement\r\n | VideoElement\r\n | HorizontalRuleElement\r\n | TableElement\r\n | TableRowElement\r\n | TableCellElement\r\n\r\ndeclare module 'slate' {\r\n interface CustomTypes {\r\n Editor: Editor & ReactEditor & HistoryEditor\r\n Element: CustomElement\r\n Text: CustomText\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// HOTKEYS\r\n// ============================================================================\r\n\r\nconst HOTKEYS: Record<string, string> = {\r\n 'mod+b': 'bold',\r\n 'mod+i': 'italic',\r\n 'mod+u': 'underline',\r\n 'mod+`': 'code',\r\n 'mod+shift+s': 'strikethrough',\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\r\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\r\n\r\nconst isMarkActive = (editor: Editor, format: string) => {\r\n const marks = Editor.marks(editor)\r\n return marks ? (marks as Record<string, unknown>)[format] === true : false\r\n}\r\n\r\nconst isBlockActive = (editor: Editor, format: string, blockType: 'type' | 'align' = 'type') => {\r\n const { selection } = editor\r\n if (!selection) return false\r\n\r\n const [match] = Array.from(\r\n Editor.nodes(editor, {\r\n at: Editor.unhangRange(editor, selection),\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n (blockType === 'type' ? n.type === format : (n as any).align === format),\r\n })\r\n )\r\n\r\n return !!match\r\n}\r\n\r\nconst toggleMark = (editor: Editor, format: string) => {\r\n const isActive = isMarkActive(editor, format)\r\n\r\n if (isActive) {\r\n Editor.removeMark(editor, format)\r\n } else {\r\n Editor.addMark(editor, format, true)\r\n }\r\n}\r\n\r\nconst toggleBlock = (editor: Editor, format: string) => {\r\n const isActive = isBlockActive(\r\n editor,\r\n format,\r\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\r\n )\r\n const isList = LIST_TYPES.includes(format)\r\n\r\n Transforms.unwrapNodes(editor, {\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n LIST_TYPES.includes(n.type) &&\r\n !TEXT_ALIGN_TYPES.includes(format),\r\n split: true,\r\n })\r\n\r\n let newProperties: Partial<CustomElement>\r\n if (TEXT_ALIGN_TYPES.includes(format)) {\r\n newProperties = {\r\n align: isActive ? undefined : format,\r\n } as Partial<CustomElement>\r\n } else {\r\n newProperties = {\r\n type: isActive ? 'paragraph' : isList ? 'list-item' : format,\r\n } as Partial<CustomElement>\r\n }\r\n Transforms.setNodes<CustomElement>(editor, newProperties)\r\n\r\n if (!isActive && isList) {\r\n const block = { type: format, children: [] } as CustomElement\r\n Transforms.wrapNodes(editor, block)\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SERIALIZATION\r\n// ============================================================================\r\n\r\nconst serializeToHtml = (nodes: Descendant[]): string => {\r\n return nodes.map(n => serializeNode(n)).join('')\r\n}\r\n\r\nconst serializeNode = (node: Descendant): string => {\r\n if (Text.isText(node)) {\r\n let string = escapeHtml(node.text)\r\n if (node.bold) string = `<strong>${string}</strong>`\r\n if (node.italic) string = `<em>${string}</em>`\r\n if (node.underline) string = `<u>${string}</u>`\r\n if (node.strikethrough) string = `<s>${string}</s>`\r\n if (node.code) string = `<code>${string}</code>`\r\n if (node.subscript) string = `<sub>${string}</sub>`\r\n if (node.superscript) string = `<sup>${string}</sup>`\r\n if (node.color) string = `<span style=\"color: ${node.color}\">${string}</span>`\r\n if (node.backgroundColor) string = `<span style=\"background-color: ${node.backgroundColor}\">${string}</span>`\r\n if (node.fontSize) string = `<span style=\"font-size: ${node.fontSize}\">${string}</span>`\r\n if (node.fontFamily) string = `<span style=\"font-family: ${node.fontFamily}\">${string}</span>`\r\n return string\r\n }\r\n\r\n const children = (node.children as Descendant[]).map(n => serializeNode(n)).join('')\r\n const element = node as CustomElement\r\n const alignStyle = (element as any).align ? ` style=\"text-align: ${(element as any).align}\"` : ''\r\n\r\n switch (element.type) {\r\n case 'paragraph':\r\n return `<p${alignStyle}>${children}</p>`\r\n case 'heading':\r\n return `<h${element.level}${alignStyle}>${children}</h${element.level}>`\r\n case 'blockquote':\r\n return `<blockquote>${children}</blockquote>`\r\n case 'code-block':\r\n return `<pre><code class=\"language-${element.language || 'plaintext'}\">${children}</code></pre>`\r\n case 'bulleted-list':\r\n return `<ul>${children}</ul>`\r\n case 'numbered-list':\r\n return `<ol>${children}</ol>`\r\n case 'list-item':\r\n return `<li>${children}</li>`\r\n case 'link':\r\n return `<a href=\"${escapeHtml(element.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">${children}</a>`\r\n case 'image':\r\n return `<img src=\"${escapeHtml(element.url)}\" alt=\"${escapeHtml(element.alt || '')}\" />`\r\n case 'video':\r\n return `<video src=\"${escapeHtml(element.url)}\" controls></video>`\r\n case 'horizontal-rule':\r\n return '<hr />'\r\n case 'table':\r\n return `<table>${children}</table>`\r\n case 'table-row':\r\n return `<tr>${children}</tr>`\r\n case 'table-cell':\r\n return `<td>${children}</td>`\r\n default:\r\n return children\r\n }\r\n}\r\n\r\nconst escapeHtml = (str: string): string => {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;')\r\n}\r\n\r\nconst deserializeFromHtml = (html: string): Descendant[] => {\r\n if (!html || html.trim() === '') {\r\n return [{ type: 'paragraph', children: [{ text: '' }] }]\r\n }\r\n\r\n const doc = new DOMParser().parseFromString(html, 'text/html')\r\n return deserializeElement(doc.body)\r\n}\r\n\r\nconst deserializeElement = (el: HTMLElement): Descendant[] => {\r\n if (el.nodeType === 3) {\r\n return [{ text: el.textContent || '' }]\r\n }\r\n\r\n if (el.nodeType !== 1) {\r\n return [{ text: '' }]\r\n }\r\n\r\n const children: Descendant[] = Array.from(el.childNodes)\r\n .flatMap(child => deserializeElement(child as HTMLElement))\r\n\r\n if (children.length === 0) {\r\n children.push({ text: '' })\r\n }\r\n\r\n switch (el.nodeName) {\r\n case 'BODY':\r\n return children\r\n case 'BR':\r\n return [{ text: '\\n' }]\r\n case 'P':\r\n return [{ type: 'paragraph', align: el.style.textAlign || undefined, children }]\r\n case 'H1':\r\n return [{ type: 'heading', level: 1, children }]\r\n case 'H2':\r\n return [{ type: 'heading', level: 2, children }]\r\n case 'H3':\r\n return [{ type: 'heading', level: 3, children }]\r\n case 'H4':\r\n return [{ type: 'heading', level: 4, children }]\r\n case 'H5':\r\n return [{ type: 'heading', level: 5, children }]\r\n case 'H6':\r\n return [{ type: 'heading', level: 6, children }]\r\n case 'BLOCKQUOTE':\r\n return [{ type: 'blockquote', children }]\r\n case 'PRE':\r\n return [{ type: 'code-block', children }]\r\n case 'UL':\r\n return [{ type: 'bulleted-list', children }]\r\n case 'OL':\r\n return [{ type: 'numbered-list', children }]\r\n case 'LI':\r\n return [{ type: 'list-item', children }]\r\n case 'A':\r\n return [{ type: 'link', url: el.getAttribute('href') || '', children }]\r\n case 'IMG':\r\n return [{ type: 'image', url: el.getAttribute('src') || '', alt: el.getAttribute('alt') || '', children: [{ text: '' }] }]\r\n case 'VIDEO':\r\n return [{ type: 'video', url: el.getAttribute('src') || '', children: [{ text: '' }] }]\r\n case 'HR':\r\n return [{ type: 'horizontal-rule', children: [{ text: '' }] }]\r\n case 'TABLE':\r\n return [{ type: 'table', children }]\r\n case 'TR':\r\n return [{ type: 'table-row', children }]\r\n case 'TD':\r\n case 'TH':\r\n return [{ type: 'table-cell', children }]\r\n case 'STRONG':\r\n case 'B':\r\n return children.map(child => ({ ...child, bold: true } as CustomText))\r\n case 'EM':\r\n case 'I':\r\n return children.map(child => ({ ...child, italic: true } as CustomText))\r\n case 'U':\r\n return children.map(child => ({ ...child, underline: true } as CustomText))\r\n case 'S':\r\n case 'STRIKE':\r\n case 'DEL':\r\n return children.map(child => ({ ...child, strikethrough: true } as CustomText))\r\n case 'CODE':\r\n return children.map(child => ({ ...child, code: true } as CustomText))\r\n case 'SUB':\r\n return children.map(child => ({ ...child, subscript: true } as CustomText))\r\n case 'SUP':\r\n return children.map(child => ({ ...child, superscript: true } as CustomText))\r\n default:\r\n return children\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// RENDER ELEMENTS & LEAVES\r\n// ============================================================================\r\n\r\nconst renderElement = (props: { attributes: any; children: React.ReactNode; element: CustomElement }) => {\r\n const { attributes, children, element } = props\r\n const style = { textAlign: (element as any).align }\r\n\r\n switch (element.type) {\r\n case 'heading':\r\n const Tag = `h${element.level}` as keyof JSX.IntrinsicElements\r\n return <Tag style={style} {...attributes}>{children}</Tag>\r\n case 'blockquote':\r\n return <blockquote {...attributes}>{children}</blockquote>\r\n case 'code-block':\r\n return (\r\n <pre {...attributes}>\r\n <code>{children}</code>\r\n </pre>\r\n )\r\n case 'bulleted-list':\r\n return <ul {...attributes}>{children}</ul>\r\n case 'numbered-list':\r\n return <ol {...attributes}>{children}</ol>\r\n case 'list-item':\r\n return <li {...attributes}>{children}</li>\r\n case 'link':\r\n return (\r\n <a href={element.url} target=\"_blank\" rel=\"noopener noreferrer\" {...attributes}>\r\n {children}\r\n </a>\r\n )\r\n case 'image':\r\n return (\r\n <div {...attributes} contentEditable={false}>\r\n <img src={element.url} alt={element.alt || ''} style={{ maxWidth: '100%' }} />\r\n {children}\r\n </div>\r\n )\r\n case 'video':\r\n return (\r\n <div {...attributes} contentEditable={false}>\r\n <video src={element.url} controls style={{ maxWidth: '100%' }} />\r\n {children}\r\n </div>\r\n )\r\n case 'horizontal-rule':\r\n return (\r\n <div {...attributes} contentEditable={false}>\r\n <hr />\r\n {children}\r\n </div>\r\n )\r\n case 'table':\r\n return <table {...attributes}><tbody>{children}</tbody></table>\r\n case 'table-row':\r\n return <tr {...attributes}>{children}</tr>\r\n case 'table-cell':\r\n return <td {...attributes}>{children}</td>\r\n case 'paragraph':\r\n default:\r\n return <p style={style} {...attributes}>{children}</p>\r\n }\r\n}\r\n\r\nconst renderLeaf = (props: { attributes: any; children: React.ReactNode; leaf: CustomText }) => {\r\n const { attributes, leaf } = props\r\n let { children } = props\r\n\r\n if (leaf.bold) {\r\n children = <strong>{children}</strong>\r\n }\r\n if (leaf.italic) {\r\n children = <em>{children}</em>\r\n }\r\n if (leaf.underline) {\r\n children = <u>{children}</u>\r\n }\r\n if (leaf.strikethrough) {\r\n children = <s>{children}</s>\r\n }\r\n if (leaf.code) {\r\n children = <code>{children}</code>\r\n }\r\n if (leaf.subscript) {\r\n children = <sub>{children}</sub>\r\n }\r\n if (leaf.superscript) {\r\n children = <sup>{children}</sup>\r\n }\r\n\r\n const style: React.CSSProperties = {}\r\n if (leaf.color) style.color = leaf.color\r\n if (leaf.backgroundColor) style.backgroundColor = leaf.backgroundColor\r\n if (leaf.fontSize) style.fontSize = leaf.fontSize\r\n if (leaf.fontFamily) style.fontFamily = leaf.fontFamily\r\n\r\n return (\r\n <span {...attributes} style={Object.keys(style).length > 0 ? style : undefined}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\n// ============================================================================\r\n// WITHPLUGINS\r\n// ============================================================================\r\n\r\nconst withInlines = (editor: Editor) => {\r\n const { isInline, isVoid } = editor\r\n\r\n editor.isInline = (element) => {\r\n return element.type === 'link' ? true : isInline(element)\r\n }\r\n\r\n editor.isVoid = (element) => {\r\n return ['image', 'video', 'horizontal-rule'].includes(element.type) ? true : isVoid(element)\r\n }\r\n\r\n return editor\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\ninterface SlateEditorComponentProps extends AdapterComponentProps {}\r\n\r\nexport const SlateEditorComponent = forwardRef<AdapterEditorRef, SlateEditorComponentProps>(\r\n (\r\n {\r\n value = '',\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = 'Start typing...',\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarButtons,\r\n className = '',\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = 'javascript',\r\n editorConfig = {},\r\n },\r\n ref\r\n ) => {\r\n // Create editor instance\r\n const editor = useMemo(\r\n () => withInlines(withHistory(withReact(createEditor()))),\r\n []\r\n )\r\n\r\n // Track fullscreen state\r\n const [isFullscreen, setIsFullscreen] = useState(false)\r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n\r\n // Initial value\r\n const [editorValue, setEditorValue] = useState<Descendant[]>(() => {\r\n return deserializeFromHtml(value)\r\n })\r\n\r\n // Update value when prop changes\r\n useEffect(() => {\r\n const currentHtml = serializeToHtml(editorValue)\r\n if (value !== currentHtml) {\r\n const newValue = deserializeFromHtml(value)\r\n setEditorValue(newValue)\r\n // Reset editor selection\r\n editor.children = newValue\r\n Transforms.select(editor, { anchor: { path: [0, 0], offset: 0 }, focus: { path: [0, 0], offset: 0 } })\r\n }\r\n }, [value])\r\n\r\n // Handle change\r\n const handleChange = useCallback(\r\n (newValue: Descendant[]) => {\r\n setEditorValue(newValue)\r\n const html = serializeToHtml(newValue)\r\n onChange?.(html)\r\n },\r\n [onChange]\r\n )\r\n\r\n // Handle keydown\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n for (const hotkey in HOTKEYS) {\r\n if (isHotkey(hotkey, event as any)) {\r\n event.preventDefault()\r\n const mark = HOTKEYS[hotkey]\r\n toggleMark(editor, mark)\r\n }\r\n }\r\n },\r\n [editor]\r\n )\r\n\r\n // Get text content\r\n const getText = useCallback(() => {\r\n return editorValue.map(n => Node.string(n)).join('\\n')\r\n }, [editorValue])\r\n\r\n // Get character count\r\n const getCharacterCount = useCallback(() => {\r\n return getText().length\r\n }, [getText])\r\n\r\n // Get word count\r\n const getWordCount = useCallback(() => {\r\n const text = getText()\r\n return text.split(/\\s+/).filter(word => word.length > 0).length\r\n }, [getText])\r\n\r\n // Toggle fullscreen\r\n const handleToggleFullscreen = useCallback(() => {\r\n setIsFullscreen(prev => !prev)\r\n }, [])\r\n\r\n // Print\r\n const handlePrint = useCallback(() => {\r\n const html = serializeToHtml(editorValue)\r\n const printWindow = window.open('', '_blank')\r\n if (printWindow) {\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>Print</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; padding: 20px; }\r\n img { max-width: 100%; }\r\n </style>\r\n </head>\r\n <body>${html}</body>\r\n </html>\r\n `)\r\n printWindow.document.close()\r\n printWindow.print()\r\n }\r\n }, [editorValue])\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage) {\r\n const file = await onMediaPickerImage()\r\n if (file) {\r\n const image: ImageElement = {\r\n type: 'image',\r\n url: file.url,\r\n alt: file.alt || file.name,\r\n children: [{ text: '' }],\r\n }\r\n Transforms.insertNodes(editor, image)\r\n }\r\n }\r\n }, [onMediaPickerImage, editor])\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo) {\r\n const file = await onMediaPickerVideo()\r\n if (file) {\r\n const video: VideoElement = {\r\n type: 'video',\r\n url: file.url,\r\n children: [{ text: '' }],\r\n }\r\n Transforms.insertNodes(editor, video)\r\n }\r\n }\r\n }, [onMediaPickerVideo, editor])\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => serializeToHtml(editorValue),\r\n getText,\r\n getJSON: () => editorValue,\r\n setContent: (html: string) => {\r\n const newValue = deserializeFromHtml(html)\r\n setEditorValue(newValue)\r\n editor.children = newValue\r\n },\r\n focus: () => {\r\n ReactEditor.focus(editor)\r\n },\r\n blur: () => {\r\n ReactEditor.blur(editor)\r\n },\r\n insertHTML: (html: string) => {\r\n const fragment = deserializeFromHtml(html)\r\n Transforms.insertFragment(editor, fragment)\r\n },\r\n insertText: (text: string) => {\r\n Transforms.insertText(editor, text)\r\n },\r\n clear: () => {\r\n const emptyValue: Descendant[] = [{ type: 'paragraph', children: [{ text: '' }] }]\r\n setEditorValue(emptyValue)\r\n editor.children = emptyValue\r\n },\r\n isEmpty: () => {\r\n return (\r\n editorValue.length === 1 &&\r\n editorValue[0].type === 'paragraph' &&\r\n (editorValue[0] as ParagraphElement).children.length === 1 &&\r\n ((editorValue[0] as ParagraphElement).children[0] as CustomText).text === ''\r\n )\r\n },\r\n getCharacterCount,\r\n getWordCount,\r\n isFullscreen: () => isFullscreen,\r\n toggleFullscreen: handleToggleFullscreen,\r\n print: handlePrint,\r\n undo: () => {\r\n HistoryEditor.undo(editor)\r\n },\r\n redo: () => {\r\n HistoryEditor.redo(editor)\r\n },\r\n canUndo: () => {\r\n return editor.history.undos.length > 0\r\n },\r\n canRedo: () => {\r\n return editor.history.redos.length > 0\r\n },\r\n getNativeEditor: () => editor,\r\n }))\r\n\r\n const characterCount = getCharacterCount()\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\r\n\r\n return (\r\n <div\r\n ref={wrapperRef}\r\n className={`rte-builder-wrapper slate-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\r\n >\r\n <Slate editor={editor} initialValue={editorValue} onChange={handleChange}>\r\n <SlateToolbar\r\n editor={editor}\r\n buttons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\r\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\r\n onToggleFullscreen={handleToggleFullscreen}\r\n onPrint={handlePrint}\r\n isFullscreen={isFullscreen}\r\n toggleMark={toggleMark}\r\n toggleBlock={toggleBlock}\r\n isMarkActive={isMarkActive}\r\n isBlockActive={isBlockActive}\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{\r\n height: `${height}px`,\r\n minHeight: `${minHeight}px`,\r\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Editable\r\n className=\"rte-builder-content\"\r\n renderElement={renderElement}\r\n renderLeaf={renderLeaf}\r\n placeholder={placeholder}\r\n spellCheck\r\n autoFocus\r\n readOnly={disabled || readOnly}\r\n onKeyDown={handleKeyDown}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </Slate>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nSlateEditorComponent.displayName = 'SlateEditorComponent'\r\n\r\nexport default SlateEditorComponent\r\n","/**\r\n * Lexical Toolbar Component\r\n *\r\n * A toolbar component for the Lexical editor with all standard formatting options.\r\n */\r\n\r\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n FORMAT_TEXT_COMMAND,\r\n UNDO_COMMAND,\r\n REDO_COMMAND,\r\n LexicalEditor,\r\n} from \"lexical\";\r\nimport {\r\n $isHeadingNode,\r\n $createHeadingNode,\r\n HeadingTagType,\r\n} from \"@lexical/rich-text\";\r\nimport {\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n REMOVE_LIST_COMMAND,\r\n $isListNode,\r\n ListNode,\r\n} from \"@lexical/list\";\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\r\nimport { $setBlocksType } from \"@lexical/selection\";\r\nimport { $createQuoteNode } from \"@lexical/rich-text\";\r\nimport { $createCodeNode } from \"@lexical/code\";\r\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\";\r\nimport { INSERT_TABLE_COMMAND, TableNode } from \"@lexical/table\";\r\nimport { $createParagraphNode, $getRoot } from \"lexical\";\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\r\n\r\nimport type { ToolbarButtonType } from \"../../core/types\";\r\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface LexicalToolbarProps {\r\n editor: LexicalEditor;\r\n buttons?: ToolbarButtonType[];\r\n onMediaPickerImage?: () => Promise<void>;\r\n onMediaPickerVideo?: () => Promise<void>;\r\n onToggleFullscreen?: () => void;\r\n onPrint?: () => void;\r\n isFullscreen?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// TOOLBAR BUTTON COMPONENT\r\n// ============================================================================\r\n\r\ninterface ToolbarButtonProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n title: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\r\n active = false,\r\n disabled = false,\r\n onClick,\r\n title,\r\n children,\r\n}) => (\r\n <button\r\n className={`rte-builder-toolbar-button ${active ? \"active\" : \"\"}`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n);\r\n\r\n// ============================================================================\r\n// TOOLBAR ICONS (Simple SVG icons)\r\n// ============================================================================\r\n\r\nconst icons: Record<string, JSX.Element> = {\r\n bold: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n italic: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"\r\n />\r\n </svg>\r\n ),\r\n underline: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n strike: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"\r\n />\r\n </svg>\r\n ),\r\n code: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n codeBlock: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n subscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n superscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n clearFormatting: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n alignLeft: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignCenter: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignRight: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignJustify: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n indent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n outdent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n bulletList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n orderedList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"\r\n />\r\n </svg>\r\n ),\r\n heading1: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading2: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading3: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n blockquote: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\r\n </svg>\r\n ),\r\n horizontalRule: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M4 11h16v2H4z\" />\r\n </svg>\r\n ),\r\n link: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n unlink: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n image: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n video: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n table: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n emoji: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n undo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n redo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fullscreen: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\r\n />\r\n </svg>\r\n ),\r\n print: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n textColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"\r\n />\r\n </svg>\r\n ),\r\n backgroundColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n};\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport const LexicalToolbar: React.FC<LexicalToolbarProps> = ({\r\n editor,\r\n buttons = [],\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n onToggleFullscreen,\r\n onPrint,\r\n isFullscreen = false,\r\n}) => {\r\n // Emoji picker state\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const [selectedEmojiCategory, setSelectedEmojiCategory] =\r\n useState<string>(\"smileys\");\r\n const emojiPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Link dialog state\r\n const [showLinkDialog, setShowLinkDialog] = useState(false);\r\n const [linkUrl, setLinkUrl] = useState(\"\");\r\n const linkDialogRef = useRef<HTMLDivElement>(null);\r\n\r\n // Active states\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isCode, setIsCode] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n\r\n // Update active states on selection change\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n setIsBold(selection.hasFormat(\"bold\"));\r\n setIsItalic(selection.hasFormat(\"italic\"));\r\n setIsUnderline(selection.hasFormat(\"underline\"));\r\n setIsStrikethrough(selection.hasFormat(\"strikethrough\"));\r\n setIsCode(selection.hasFormat(\"code\"));\r\n setIsSubscript(selection.hasFormat(\"subscript\"));\r\n setIsSuperscript(selection.hasFormat(\"superscript\"));\r\n }\r\n });\r\n });\r\n }, [editor]);\r\n\r\n // Close dropdowns when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n emojiPickerRef.current &&\r\n !emojiPickerRef.current.contains(event.target as Node)\r\n ) {\r\n setShowEmojiPicker(false);\r\n }\r\n if (\r\n linkDialogRef.current &&\r\n !linkDialogRef.current.contains(event.target as Node)\r\n ) {\r\n setShowLinkDialog(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n // Insert emoji\r\n const insertEmoji = useCallback(\r\n (emoji: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n selection.insertText(emoji);\r\n }\r\n });\r\n setShowEmojiPicker(false);\r\n },\r\n [editor],\r\n );\r\n\r\n // Insert link\r\n const insertLink = useCallback(() => {\r\n if (linkUrl) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, linkUrl);\r\n setLinkUrl(\"\");\r\n setShowLinkDialog(false);\r\n }\r\n }, [editor, linkUrl]);\r\n\r\n // Remove link\r\n const removeLink = useCallback(() => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }, [editor]);\r\n\r\n // Format heading\r\n const formatHeading = useCallback(\r\n (headingTag: HeadingTagType) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(headingTag));\r\n }\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n // Format paragraph\r\n const formatParagraph = useCallback(() => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n }\r\n });\r\n }, [editor]);\r\n\r\n // Format quote\r\n const formatQuote = useCallback(() => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n }\r\n });\r\n }, [editor]);\r\n\r\n // Format code block\r\n const formatCodeBlock = useCallback(() => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createCodeNode());\r\n }\r\n });\r\n }, [editor]);\r\n\r\n // Insert table\r\n const insertTable = useCallback(() => {\r\n editor.dispatchCommand(INSERT_TABLE_COMMAND, { rows: \"3\", columns: \"3\" });\r\n }, [editor]);\r\n\r\n // Render toolbar button based on type\r\n const renderButton = (button: ToolbarButtonType, index: number) => {\r\n if (button === \"separator\") {\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n }\r\n\r\n switch (button) {\r\n // Text formatting\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBold}\r\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n {icons.bold}\r\n </ToolbarButton>\r\n );\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isItalic}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\r\n }\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n {icons.italic}\r\n </ToolbarButton>\r\n );\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isUnderline}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")\r\n }\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n {icons.underline}\r\n </ToolbarButton>\r\n );\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isStrikethrough}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\r\n }\r\n title=\"Strikethrough\"\r\n >\r\n {icons.strike}\r\n </ToolbarButton>\r\n );\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isCode}\r\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\r\n title=\"Code\"\r\n >\r\n {icons.code}\r\n </ToolbarButton>\r\n );\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={formatCodeBlock}\r\n title=\"Code Block\"\r\n >\r\n {icons.codeBlock}\r\n </ToolbarButton>\r\n );\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isSubscript}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\r\n }\r\n title=\"Subscript\"\r\n >\r\n {icons.subscript}\r\n </ToolbarButton>\r\n );\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isSuperscript}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\r\n }\r\n title=\"Superscript\"\r\n >\r\n {icons.superscript}\r\n </ToolbarButton>\r\n );\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={formatParagraph}\r\n title=\"Clear Formatting\"\r\n >\r\n {icons.clearFormatting}\r\n </ToolbarButton>\r\n );\r\n\r\n // Lists\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n }\r\n title=\"Bullet List\"\r\n >\r\n {icons.bulletList}\r\n </ToolbarButton>\r\n );\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n }\r\n title=\"Numbered List\"\r\n >\r\n {icons.orderedList}\r\n </ToolbarButton>\r\n );\r\n\r\n // Headings\r\n case \"heading1\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => formatHeading(\"h1\")}\r\n title=\"Heading 1\"\r\n >\r\n {icons.heading1}\r\n </ToolbarButton>\r\n );\r\n case \"heading2\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => formatHeading(\"h2\")}\r\n title=\"Heading 2\"\r\n >\r\n {icons.heading2}\r\n </ToolbarButton>\r\n );\r\n case \"heading3\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => formatHeading(\"h3\")}\r\n title=\"Heading 3\"\r\n >\r\n {icons.heading3}\r\n </ToolbarButton>\r\n );\r\n\r\n // Blocks\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton key={button} onClick={formatQuote} title=\"Blockquote\">\r\n {icons.blockquote}\r\n </ToolbarButton>\r\n );\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\r\n }\r\n title=\"Horizontal Rule\"\r\n >\r\n {icons.horizontalRule}\r\n </ToolbarButton>\r\n );\r\n\r\n // Links\r\n case \"link\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={linkDialogRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowLinkDialog(!showLinkDialog)}\r\n title=\"Insert Link\"\r\n >\r\n {icons.link}\r\n </ToolbarButton>\r\n {showLinkDialog && (\r\n <div className=\"rte-builder-toolbar-dropdown-content\">\r\n <input\r\n type=\"url\"\r\n placeholder=\"Enter URL...\"\r\n value={linkUrl}\r\n onChange={(e) => setLinkUrl(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n insertLink();\r\n }\r\n }}\r\n autoFocus\r\n />\r\n <button onClick={insertLink}>Insert</button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton key={button} onClick={removeLink} title=\"Remove Link\">\r\n {icons.unlink}\r\n </ToolbarButton>\r\n );\r\n\r\n // Media\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerImage || (() => {})}\r\n disabled={!onMediaPickerImage}\r\n title=\"Insert Image\"\r\n >\r\n {icons.image}\r\n </ToolbarButton>\r\n );\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerVideo || (() => {})}\r\n disabled={!onMediaPickerVideo}\r\n title=\"Insert Video\"\r\n >\r\n {icons.video}\r\n </ToolbarButton>\r\n );\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={insertTable}\r\n title=\"Insert Table\"\r\n >\r\n {icons.table}\r\n </ToolbarButton>\r\n );\r\n\r\n // Emoji\r\n case \"emoji\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={emojiPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n title=\"Insert Emoji\"\r\n >\r\n {icons.emoji}\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <div className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? \"active\" : \"\"}`}\r\n onClick={() => setSelectedEmojiCategory(key)}\r\n title={(category as any).label}\r\n >\r\n {(category as any).emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {(\r\n EMOJI_CATEGORIES[\r\n selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES\r\n ] as any\r\n )?.emojis.map((emoji: string, idx: number) => (\r\n <button\r\n key={idx}\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => insertEmoji(emoji)}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // Actions\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n {icons.undo}\r\n </ToolbarButton>\r\n );\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n {icons.redo}\r\n </ToolbarButton>\r\n );\r\n case \"fullscreen\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isFullscreen}\r\n onClick={onToggleFullscreen || (() => {})}\r\n title=\"Toggle Fullscreen\"\r\n >\r\n {icons.fullscreen}\r\n </ToolbarButton>\r\n );\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onPrint || (() => {})}\r\n title=\"Print\"\r\n >\r\n {icons.print}\r\n </ToolbarButton>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"rte-builder-toolbar lexical-toolbar\">\r\n {buttons.map((button, index) => renderButton(button, index))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default LexicalToolbar;\r\n","/**\r\n * Lexical Editor Component\r\n *\r\n * This is the actual Lexical editor implementation that conforms\r\n * to the adapter interface.\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useImperativeHandle,\r\n forwardRef,\r\n useCallback,\r\n useState,\r\n useRef,\r\n} from 'react'\r\n\r\n// Lexical core\r\nimport { LexicalComposer } from '@lexical/react/LexicalComposer'\r\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable'\r\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'\r\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'\r\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\r\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'\r\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin'\r\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'\r\nimport { TablePlugin } from '@lexical/react/LexicalTablePlugin'\r\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin'\r\n\r\n// Lexical nodes\r\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text'\r\nimport { ListNode, ListItemNode } from '@lexical/list'\r\nimport { LinkNode, AutoLinkNode } from '@lexical/link'\r\nimport { CodeNode, CodeHighlightNode } from '@lexical/code'\r\nimport { TableNode, TableCellNode, TableRowNode } from '@lexical/table'\r\nimport { HorizontalRuleNode } from '@lexical/react/LexicalHorizontalRuleNode'\r\n\r\n// Lexical utilities\r\nimport {\r\n $getRoot,\r\n $getSelection,\r\n $isRangeSelection,\r\n $createParagraphNode,\r\n $createTextNode,\r\n EditorState,\r\n LexicalEditor,\r\n FORMAT_TEXT_COMMAND,\r\n UNDO_COMMAND,\r\n REDO_COMMAND,\r\n CAN_UNDO_COMMAND,\r\n CAN_REDO_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n} from 'lexical'\r\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html'\r\n\r\n// Toolbar\r\nimport { LexicalToolbar } from './LexicalToolbar'\r\n\r\n// Types\r\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\r\n\r\n// ============================================================================\r\n// THEME\r\n// ============================================================================\r\n\r\nconst theme = {\r\n ltr: 'ltr',\r\n rtl: 'rtl',\r\n paragraph: 'rte-builder-paragraph',\r\n quote: 'rte-builder-blockquote',\r\n heading: {\r\n h1: 'rte-builder-h1',\r\n h2: 'rte-builder-h2',\r\n h3: 'rte-builder-h3',\r\n h4: 'rte-builder-h4',\r\n h5: 'rte-builder-h5',\r\n h6: 'rte-builder-h6',\r\n },\r\n list: {\r\n nested: {\r\n listitem: 'rte-builder-nested-listitem',\r\n },\r\n ol: 'rte-builder-ol',\r\n ul: 'rte-builder-ul',\r\n listitem: 'rte-builder-listitem',\r\n listitemChecked: 'rte-builder-listitem-checked',\r\n listitemUnchecked: 'rte-builder-listitem-unchecked',\r\n },\r\n hashtag: 'rte-builder-hashtag',\r\n image: 'rte-builder-image',\r\n link: 'rte-builder-link',\r\n text: {\r\n bold: 'rte-builder-bold',\r\n code: 'rte-builder-code',\r\n italic: 'rte-builder-italic',\r\n strikethrough: 'rte-builder-strikethrough',\r\n subscript: 'rte-builder-subscript',\r\n superscript: 'rte-builder-superscript',\r\n underline: 'rte-builder-underline',\r\n underlineStrikethrough: 'rte-builder-underline-strikethrough',\r\n },\r\n code: 'rte-builder-code-block',\r\n codeHighlight: {\r\n atrule: 'rte-builder-code-atrule',\r\n attr: 'rte-builder-code-attr',\r\n boolean: 'rte-builder-code-boolean',\r\n builtin: 'rte-builder-code-builtin',\r\n cdata: 'rte-builder-code-cdata',\r\n char: 'rte-builder-code-char',\r\n class: 'rte-builder-code-class',\r\n 'class-name': 'rte-builder-code-class-name',\r\n comment: 'rte-builder-code-comment',\r\n constant: 'rte-builder-code-constant',\r\n deleted: 'rte-builder-code-deleted',\r\n doctype: 'rte-builder-code-doctype',\r\n entity: 'rte-builder-code-entity',\r\n function: 'rte-builder-code-function',\r\n important: 'rte-builder-code-important',\r\n inserted: 'rte-builder-code-inserted',\r\n keyword: 'rte-builder-code-keyword',\r\n namespace: 'rte-builder-code-namespace',\r\n number: 'rte-builder-code-number',\r\n operator: 'rte-builder-code-operator',\r\n prolog: 'rte-builder-code-prolog',\r\n property: 'rte-builder-code-property',\r\n punctuation: 'rte-builder-code-punctuation',\r\n regex: 'rte-builder-code-regex',\r\n selector: 'rte-builder-code-selector',\r\n string: 'rte-builder-code-string',\r\n symbol: 'rte-builder-code-symbol',\r\n tag: 'rte-builder-code-tag',\r\n url: 'rte-builder-code-url',\r\n variable: 'rte-builder-code-variable',\r\n },\r\n table: 'rte-builder-table',\r\n tableCell: 'rte-builder-table-cell',\r\n tableCellHeader: 'rte-builder-table-cell-header',\r\n tableRow: 'rte-builder-table-row',\r\n}\r\n\r\n// ============================================================================\r\n// ERROR HANDLING\r\n// ============================================================================\r\n\r\nfunction onError(error: Error): void {\r\n console.error('Lexical Error:', error)\r\n}\r\n\r\n// ============================================================================\r\n// EDITOR INNER COMPONENT\r\n// ============================================================================\r\n\r\ninterface EditorInnerProps {\r\n value: string\r\n onChange?: (content: string) => void\r\n onBlur?: () => void\r\n onFocus?: () => void\r\n placeholder: string\r\n height: number\r\n minHeight: number\r\n maxHeight?: number\r\n disabled: boolean\r\n readOnly: boolean\r\n charCounterMax: number\r\n showCharCounter: boolean\r\n toolbarButtons?: string[]\r\n onMediaPickerImage?: () => Promise<void>\r\n onMediaPickerVideo?: () => Promise<void>\r\n editorRef: React.Ref<AdapterEditorRef>\r\n isFullscreen: boolean\r\n onToggleFullscreen: () => void\r\n}\r\n\r\nconst EditorInner: React.FC<EditorInnerProps> = ({\r\n value,\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder,\r\n height,\r\n minHeight,\r\n maxHeight,\r\n disabled,\r\n readOnly,\r\n charCounterMax,\r\n showCharCounter,\r\n toolbarButtons,\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n editorRef,\r\n isFullscreen,\r\n onToggleFullscreen,\r\n}) => {\r\n const [editor] = useLexicalComposerContext()\r\n const [characterCount, setCharacterCount] = useState(0)\r\n const [canUndo, setCanUndo] = useState(false)\r\n const [canRedo, setCanRedo] = useState(false)\r\n const initialLoadRef = useRef(true)\r\n\r\n // Load initial value\r\n useEffect(() => {\r\n if (value && initialLoadRef.current) {\r\n initialLoadRef.current = false\r\n editor.update(() => {\r\n const parser = new DOMParser()\r\n const dom = parser.parseFromString(value, 'text/html')\r\n const nodes = $generateNodesFromDOM(editor, dom)\r\n const root = $getRoot()\r\n root.clear()\r\n root.append(...nodes)\r\n })\r\n }\r\n }, [value, editor])\r\n\r\n // Update editable state\r\n useEffect(() => {\r\n editor.setEditable(!disabled && !readOnly)\r\n }, [disabled, readOnly, editor])\r\n\r\n // Track can undo/redo\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n CAN_UNDO_COMMAND,\r\n (payload) => {\r\n setCanUndo(payload)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n }, [editor])\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n CAN_REDO_COMMAND,\r\n (payload) => {\r\n setCanRedo(payload)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n }, [editor])\r\n\r\n // Handle change\r\n const handleChange = useCallback(\r\n (editorState: EditorState) => {\r\n editorState.read(() => {\r\n const root = $getRoot()\r\n const text = root.getTextContent()\r\n setCharacterCount(text.length)\r\n\r\n if (onChange) {\r\n const html = $generateHtmlFromNodes(editor, null)\r\n onChange(html)\r\n }\r\n })\r\n },\r\n [onChange, editor]\r\n )\r\n\r\n // Print function\r\n const handlePrint = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n const html = $generateHtmlFromNodes(editor, null)\r\n const printWindow = window.open('', '_blank')\r\n if (printWindow) {\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>Print</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; padding: 20px; }\r\n img { max-width: 100%; }\r\n </style>\r\n </head>\r\n <body>${html}</body>\r\n </html>\r\n `)\r\n printWindow.document.close()\r\n printWindow.print()\r\n }\r\n })\r\n }, [editor])\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(editorRef, () => ({\r\n getContent: () => {\r\n let html = ''\r\n editor.getEditorState().read(() => {\r\n html = $generateHtmlFromNodes(editor, null)\r\n })\r\n return html\r\n },\r\n getText: () => {\r\n let text = ''\r\n editor.getEditorState().read(() => {\r\n text = $getRoot().getTextContent()\r\n })\r\n return text\r\n },\r\n getJSON: () => {\r\n return editor.getEditorState().toJSON()\r\n },\r\n setContent: (html: string) => {\r\n editor.update(() => {\r\n const parser = new DOMParser()\r\n const dom = parser.parseFromString(html, 'text/html')\r\n const nodes = $generateNodesFromDOM(editor, dom)\r\n const root = $getRoot()\r\n root.clear()\r\n root.append(...nodes)\r\n })\r\n },\r\n focus: () => {\r\n editor.focus()\r\n },\r\n blur: () => {\r\n editor.blur()\r\n },\r\n insertHTML: (html: string) => {\r\n editor.update(() => {\r\n const parser = new DOMParser()\r\n const dom = parser.parseFromString(html, 'text/html')\r\n const nodes = $generateNodesFromDOM(editor, dom)\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n selection.insertNodes(nodes)\r\n }\r\n })\r\n },\r\n insertText: (text: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n selection.insertText(text)\r\n }\r\n })\r\n },\r\n clear: () => {\r\n editor.update(() => {\r\n const root = $getRoot()\r\n root.clear()\r\n root.append($createParagraphNode())\r\n })\r\n },\r\n isEmpty: () => {\r\n let isEmpty = true\r\n editor.getEditorState().read(() => {\r\n const text = $getRoot().getTextContent()\r\n isEmpty = text.trim().length === 0\r\n })\r\n return isEmpty\r\n },\r\n getCharacterCount: () => characterCount,\r\n getWordCount: () => {\r\n let wordCount = 0\r\n editor.getEditorState().read(() => {\r\n const text = $getRoot().getTextContent()\r\n wordCount = text.split(/\\s+/).filter(word => word.length > 0).length\r\n })\r\n return wordCount\r\n },\r\n isFullscreen: () => isFullscreen,\r\n toggleFullscreen: onToggleFullscreen,\r\n print: handlePrint,\r\n undo: () => {\r\n editor.dispatchCommand(UNDO_COMMAND, undefined)\r\n },\r\n redo: () => {\r\n editor.dispatchCommand(REDO_COMMAND, undefined)\r\n },\r\n canUndo: () => canUndo,\r\n canRedo: () => canRedo,\r\n getNativeEditor: () => editor,\r\n }))\r\n\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\r\n\r\n return (\r\n <>\r\n <LexicalToolbar\r\n editor={editor}\r\n buttons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage}\r\n onMediaPickerVideo={onMediaPickerVideo}\r\n onToggleFullscreen={onToggleFullscreen}\r\n onPrint={handlePrint}\r\n isFullscreen={isFullscreen}\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{\r\n height: `${height}px`,\r\n minHeight: `${minHeight}px`,\r\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable\r\n className=\"rte-builder-content\"\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n />\r\n }\r\n placeholder={<div className=\"rte-builder-placeholder\">{placeholder}</div>}\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n <OnChangePlugin onChange={handleChange} />\r\n <HistoryPlugin />\r\n <ListPlugin />\r\n <LinkPlugin />\r\n <TablePlugin />\r\n <CheckListPlugin />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\ninterface LexicalEditorComponentProps extends AdapterComponentProps {}\r\n\r\nexport const LexicalEditorComponent = forwardRef<AdapterEditorRef, LexicalEditorComponentProps>(\r\n (\r\n {\r\n value = '',\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = 'Start typing...',\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarButtons,\r\n className = '',\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = 'javascript',\r\n editorConfig = {},\r\n },\r\n ref\r\n ) => {\r\n const [isFullscreen, setIsFullscreen] = useState(false)\r\n\r\n const handleToggleFullscreen = useCallback(() => {\r\n setIsFullscreen(prev => !prev)\r\n }, [])\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage) {\r\n await onMediaPickerImage()\r\n }\r\n }, [onMediaPickerImage])\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo) {\r\n await onMediaPickerVideo()\r\n }\r\n }, [onMediaPickerVideo])\r\n\r\n const initialConfig = {\r\n namespace: 'RTEBuilder',\r\n theme,\r\n onError,\r\n nodes: [\r\n HeadingNode,\r\n QuoteNode,\r\n ListNode,\r\n ListItemNode,\r\n LinkNode,\r\n AutoLinkNode,\r\n CodeNode,\r\n CodeHighlightNode,\r\n TableNode,\r\n TableCellNode,\r\n TableRowNode,\r\n HorizontalRuleNode,\r\n ],\r\n editable: !disabled && !readOnly,\r\n ...editorConfig,\r\n }\r\n\r\n return (\r\n <div\r\n className={`rte-builder-wrapper lexical-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\r\n >\r\n <LexicalComposer initialConfig={initialConfig}>\r\n <EditorInner\r\n value={value}\r\n onChange={onChange}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n placeholder={placeholder}\r\n height={height}\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n charCounterMax={charCounterMax}\r\n showCharCounter={showCharCounter}\r\n toolbarButtons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\r\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\r\n editorRef={ref}\r\n isFullscreen={isFullscreen}\r\n onToggleFullscreen={handleToggleFullscreen}\r\n />\r\n </LexicalComposer>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nLexicalEditorComponent.displayName = 'LexicalEditorComponent'\r\n\r\nexport default LexicalEditorComponent\r\n","/**\r\n * RTE Builder - Universal Rich Text Editor Library\r\n *\r\n * A generic, adapter-based rich text editor that supports multiple editor backends:\r\n * - TipTap (default, included)\r\n * - Slate.js (included)\r\n * - Lexical (included)\r\n * - Quill (planned)\r\n * - Draft.js (planned)\r\n *\r\n * @example Basic Usage\r\n * ```tsx\r\n * import { RichTextEditor } from 'rte-builder'\r\n *\r\n * function App() {\r\n * const [content, setContent] = useState('')\r\n * return <RichTextEditor value={content} onChange={setContent} />\r\n * }\r\n * ```\r\n *\r\n * @example With Specific Editor\r\n * ```tsx\r\n * <RichTextEditor editor=\"tiptap\" value={content} onChange={setContent} />\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT EXPORTS\r\n// ============================================================================\r\n\r\n// The unified editor (recommended for most use cases)\r\nexport { UnifiedEditor } from \"./components/UnifiedEditor\";\r\n\r\n// Legacy TipTap-specific editor (for backwards compatibility)\r\nexport { RichTextEditor } from \"./components/RichTextEditor\";\r\n\r\n// ============================================================================\r\n// TYPE EXPORTS\r\n// ============================================================================\r\n\r\n// Legacy types (backwards compatibility)\r\nexport type {\r\n EditorProps,\r\n EditorRef,\r\n MediaFile as LegacyMediaFile,\r\n ToolbarButton,\r\n ToolbarConfig as LegacyToolbarConfig,\r\n} from \"./types\";\r\n\r\n// Core types (new unified interface)\r\nexport type {\r\n EditorType,\r\n BaseEditorConfig,\r\n MediaFile,\r\n ToolbarButtonType,\r\n ToolbarPreset,\r\n ToolbarConfig,\r\n UnifiedEditorProps,\r\n UnifiedEditorRef,\r\n EditorAdapter,\r\n AdapterComponentProps,\r\n AdapterEditorRef,\r\n EditorFeatures,\r\n} from \"./core/types\";\r\n\r\nexport { DEFAULT_FEATURES } from \"./core/types\";\r\n\r\n// ============================================================================\r\n// REGISTRY EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n registerAdapter,\r\n unregisterAdapter,\r\n getAdapter,\r\n getAllAdapters,\r\n getAvailableAdapters,\r\n isEditorAvailable,\r\n getBestAvailableEditor,\r\n getDefaultEditorType,\r\n getEditorFeatures,\r\n compareEditorFeatures,\r\n getRegistryStats,\r\n EditorRegistry,\r\n} from \"./core/registry\";\r\n\r\n// ============================================================================\r\n// TOOLBAR PRESET EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n fullToolbar,\r\n mediumToolbar,\r\n simpleToolbar,\r\n minimalToolbar,\r\n codeToolbar,\r\n blogToolbar,\r\n emailToolbar,\r\n toolbarPresets,\r\n getToolbarPreset,\r\n customizeToolbar,\r\n} from \"./core/presets\";\r\n\r\nexport type { ToolbarPresetName } from \"./core/presets\";\r\n\r\n// ============================================================================\r\n// ADAPTER EXPORTS\r\n// ============================================================================\r\n\r\n// TipTap adapter (included by default)\r\nexport { TipTapAdapter } from \"./adapters/tiptap\";\r\nexport { TipTapEditorComponent } from \"./adapters/tiptap/TipTapEditorComponent\";\r\nexport { TipTapToolbar } from \"./adapters/tiptap/TipTapToolbar\";\r\n\r\n// Note: Slate.js and Lexical adapters are available but require additional\r\n// dependencies to be installed. They are not exported by default to avoid\r\n// bundling issues. Import them directly from their paths if needed:\r\n// import { SlateAdapter } from 'rte-builder/adapters/slate/SlateAdapter'\r\n// import { LexicalAdapter } from 'rte-builder/adapters/lexical/LexicalAdapter'\r\n\r\n// ============================================================================\r\n// EXTENSION EXPORTS\r\n// ============================================================================\r\n\r\n// Custom TipTap extensions (can be used independently)\r\nexport { FontSize } from \"./extensions/FontSize\";\r\nexport { LineHeight } from \"./extensions/LineHeight\";\r\nexport { Video } from \"./extensions/Video\";\r\nexport { Emoji, EMOJI_CATEGORIES } from \"./extensions/Emoji\";\r\nexport { Fullscreen } from \"./extensions/Fullscreen\";\r\nexport { Print } from \"./extensions/Print\";\r\nexport { Indent } from \"./extensions/Indent\";\r\n\r\n// ============================================================================\r\n// COLLABORATION EXPORTS (v2.0)\r\n// ============================================================================\r\n\r\nexport {\r\n CollaborationProvider,\r\n useCollaboration,\r\n useCollaborationOptional,\r\n} from \"./collaboration\";\r\n\r\nexport type {\r\n CollaborationUser,\r\n CollaborationConfig,\r\n CollaborationState,\r\n CollaborationStatus,\r\n CollaborationEvent,\r\n CollaborationProps,\r\n CursorPosition,\r\n} from \"./collaboration\";\r\n\r\nexport { PresenceIndicator } from \"./collaboration/PresenceIndicator\";\r\n\r\n// ============================================================================\r\n// COMMENTS EXPORTS (v2.1)\r\n// ============================================================================\r\n\r\nexport {\r\n CommentsProvider,\r\n useComments,\r\n useCommentsOptional,\r\n DEFAULT_REACTION_EMOJIS,\r\n} from \"./comments\";\r\n\r\nexport type {\r\n Comment,\r\n CommentThread,\r\n CommentAuthor,\r\n CommentRange,\r\n CommentsConfig,\r\n CommentsState,\r\n CommentEvent,\r\n CommentsProps,\r\n} from \"./comments\";\r\n\r\nexport { CommentsPanel } from \"./comments/CommentsPanel\";\r\n\r\n// ============================================================================\r\n// VERSION HISTORY EXPORTS (v2.2)\r\n// ============================================================================\r\n\r\nexport {\r\n VersionHistoryProvider,\r\n useVersionHistory,\r\n useVersionHistoryOptional,\r\n} from \"./history\";\r\n\r\nexport type {\r\n Version,\r\n VersionAuthor,\r\n VersionHistoryConfig,\r\n VersionHistoryState,\r\n VersionHistoryEvent,\r\n VersionHistoryProps,\r\n VersionComparison,\r\n VersionChange,\r\n} from \"./history\";\r\n\r\nexport { VersionHistoryPanel } from \"./history/VersionHistoryPanel\";\r\n\r\n// ============================================================================\r\n// STYLES\r\n// ============================================================================\r\n\r\n// Import styles (they will be bundled with the library)\r\nimport \"./styles/editor.css\";\r\nimport \"./styles/collaboration.css\";\r\nimport \"./styles/comments.css\";\r\nimport \"./styles/version-history.css\";\r\n","/**\r\n * Unified Rich Text Editor Component\r\n *\r\n * This is the main entry point for the rte-builder library.\r\n * It provides a unified interface that works with any registered editor adapter.\r\n */\r\n\r\nimport { forwardRef, useImperativeHandle, useRef, useMemo, useState } from \"react\";\r\nimport type {\r\n UnifiedEditorProps,\r\n UnifiedEditorRef,\r\n EditorType,\r\n ToolbarButtonType,\r\n AdapterEditorRef,\r\n} from \"../core/types\";\r\nimport {\r\n getAdapter,\r\n getBestAvailableEditor,\r\n getAvailableAdapters,\r\n registerAdapter,\r\n} from \"../core/registry\";\r\nimport { getToolbarPreset, toolbarPresets } from \"../core/presets\";\r\n\r\n// Import and register all adapters\r\nimport { TipTapAdapter } from \"../adapters/tiptap\";\r\nimport { SlateAdapter } from \"../adapters/slate/SlateAdapter\";\r\nimport { LexicalAdapter } from \"../adapters/lexical/LexicalAdapter\";\r\n\r\n// Register adapters on module load (only if available)\r\nregisterAdapter(TipTapAdapter);\r\nif (SlateAdapter.isAvailable()) {\r\n registerAdapter(SlateAdapter);\r\n}\r\nif (LexicalAdapter.isAvailable()) {\r\n registerAdapter(LexicalAdapter);\r\n}\r\n\r\nexport const UnifiedEditor = forwardRef<UnifiedEditorRef, UnifiedEditorProps>(\r\n (\r\n {\r\n editor: editorType,\r\n showEditorSwitcher = false,\r\n onEditorChange,\r\n value = \"\",\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = \"Start typing...\",\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbar = \"full\",\r\n toolbarButtons: customToolbarButtons,\r\n className = \"\",\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = \"javascript\",\r\n editorConfig,\r\n },\r\n ref,\r\n ) => {\r\n const adapterRef = useRef<AdapterEditorRef>(null);\r\n const [internalEditorType, setInternalEditorType] = useState<EditorType | undefined>(editorType);\r\n\r\n // Get available adapters for the switcher\r\n const availableAdapters = useMemo(() => getAvailableAdapters(), []);\r\n\r\n // Determine which editor to use (controlled or internal state)\r\n const currentEditorType = editorType !== undefined ? editorType : internalEditorType;\r\n\r\n // Determine which editor to use\r\n const selectedAdapter = useMemo(() => {\r\n if (currentEditorType) {\r\n const adapter = getAdapter(currentEditorType);\r\n if (adapter?.isAvailable()) {\r\n return adapter;\r\n }\r\n console.warn(\r\n `Editor \"${currentEditorType}\" is not available. Falling back to best available.`,\r\n );\r\n }\r\n return getBestAvailableEditor();\r\n }, [currentEditorType]);\r\n\r\n // Handle editor switch\r\n const handleEditorSwitch = (newEditorType: EditorType) => {\r\n if (onEditorChange) {\r\n onEditorChange(newEditorType);\r\n } else {\r\n setInternalEditorType(newEditorType);\r\n }\r\n };\r\n\r\n // Determine toolbar buttons\r\n const toolbarButtons = useMemo((): ToolbarButtonType[] => {\r\n if (customToolbarButtons) {\r\n return customToolbarButtons;\r\n }\r\n\r\n if (typeof toolbar === \"string\") {\r\n return getToolbarPreset(toolbar as keyof typeof toolbarPresets);\r\n }\r\n\r\n if (toolbar.buttons) {\r\n return toolbar.buttons;\r\n }\r\n\r\n if (toolbar.preset) {\r\n return getToolbarPreset(toolbar.preset as keyof typeof toolbarPresets);\r\n }\r\n\r\n return getToolbarPreset(\"full\");\r\n }, [toolbar, customToolbarButtons]);\r\n\r\n // Expose unified methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => adapterRef.current?.getContent() || \"\",\r\n getText: () => adapterRef.current?.getText() || \"\",\r\n getJSON: () => adapterRef.current?.getJSON(),\r\n setContent: (content: string) => adapterRef.current?.setContent(content),\r\n focus: () => adapterRef.current?.focus(),\r\n blur: () => adapterRef.current?.blur(),\r\n insertHTML: (html: string) => adapterRef.current?.insertHTML(html),\r\n insertText: (text: string) => adapterRef.current?.insertText(text),\r\n clear: () => adapterRef.current?.clear(),\r\n isEmpty: () => adapterRef.current?.isEmpty() ?? true,\r\n getCharacterCount: () => adapterRef.current?.getCharacterCount() || 0,\r\n getWordCount: () => adapterRef.current?.getWordCount() || 0,\r\n isFullscreen: () => adapterRef.current?.isFullscreen() || false,\r\n toggleFullscreen: () => adapterRef.current?.toggleFullscreen(),\r\n print: () => adapterRef.current?.print(),\r\n undo: () => adapterRef.current?.undo(),\r\n redo: () => adapterRef.current?.redo(),\r\n canUndo: () => adapterRef.current?.canUndo() ?? false,\r\n canRedo: () => adapterRef.current?.canRedo() ?? false,\r\n getNativeEditor: () => adapterRef.current?.getNativeEditor(),\r\n getEditorType: () => selectedAdapter?.type || (\"tiptap\" as EditorType),\r\n }));\r\n\r\n // Handle case where no editor is available\r\n if (!selectedAdapter) {\r\n return (\r\n <div className={`rte-builder-wrapper rte-builder-error ${className}`}>\r\n <div className=\"rte-builder-error-message\">\r\n No editor available. Please install an editor package:\r\n <br />\r\n <code>npm install @tiptap/react @tiptap/starter-kit</code>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Get the editor component from the adapter\r\n const EditorComponent = selectedAdapter.getComponent();\r\n\r\n // Handle onChange to ensure it's always called\r\n const handleChange = (content: string) => {\r\n onChange?.(content);\r\n };\r\n\r\n return (\r\n <div className={`rte-builder-unified-wrapper ${className}`}>\r\n {showEditorSwitcher && availableAdapters.length > 1 && (\r\n <div className=\"rte-builder-editor-switcher\">\r\n <label className=\"rte-builder-editor-switcher-label\">Editor:</label>\r\n <select\r\n className=\"rte-builder-editor-switcher-select\"\r\n value={selectedAdapter.type}\r\n onChange={(e) => handleEditorSwitch(e.target.value as EditorType)}\r\n disabled={disabled}\r\n >\r\n {availableAdapters.map((adapter) => (\r\n <option key={adapter.type} value={adapter.type}>\r\n {adapter.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n <EditorComponent\r\n key={selectedAdapter.type}\r\n editorRef={adapterRef}\r\n value={value}\r\n onChange={handleChange}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n placeholder={placeholder}\r\n height={height}\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n charCounterMax={charCounterMax}\r\n showCharCounter={showCharCounter}\r\n toolbarButtons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage}\r\n onMediaPickerVideo={onMediaPickerVideo}\r\n enableCodeHighlight={enableCodeHighlight}\r\n defaultCodeLanguage={defaultCodeLanguage}\r\n editorConfig={editorConfig}\r\n />\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nUnifiedEditor.displayName = \"UnifiedEditor\";\r\n\r\nexport default UnifiedEditor;\r\n","/**\r\n * Editor Registry - Manages available editor adapters\r\n *\r\n * This module provides a central registry for editor adapters.\r\n * It allows dynamic registration of editors and automatic selection\r\n * based on availability.\r\n */\r\n\r\nimport type { EditorAdapter, EditorType, EditorFeatures } from './types'\r\n\r\n// Registry to store all registered adapters\r\nconst adapters = new Map<EditorType, EditorAdapter>()\r\n\r\n// Default editor preference order\r\nconst defaultPreferenceOrder: EditorType[] = ['tiptap', 'slate', 'lexical', 'quill', 'draft']\r\n\r\n/**\r\n * Register an editor adapter\r\n * @param adapter The adapter to register\r\n */\r\nexport function registerAdapter(adapter: EditorAdapter): void {\r\n adapters.set(adapter.type, adapter)\r\n}\r\n\r\n/**\r\n * Unregister an editor adapter\r\n * @param type The editor type to unregister\r\n */\r\nexport function unregisterAdapter(type: EditorType): void {\r\n adapters.delete(type)\r\n}\r\n\r\n/**\r\n * Get an adapter by type\r\n * @param type The editor type\r\n * @returns The adapter or undefined\r\n */\r\nexport function getAdapter(type: EditorType): EditorAdapter | undefined {\r\n return adapters.get(type)\r\n}\r\n\r\n/**\r\n * Get all registered adapters\r\n * @returns Array of all registered adapters\r\n */\r\nexport function getAllAdapters(): EditorAdapter[] {\r\n return Array.from(adapters.values())\r\n}\r\n\r\n/**\r\n * Get all available adapters (ones with dependencies installed)\r\n * @returns Array of available adapters\r\n */\r\nexport function getAvailableAdapters(): EditorAdapter[] {\r\n return getAllAdapters().filter(adapter => adapter.isAvailable())\r\n}\r\n\r\n/**\r\n * Check if an editor type is available\r\n * @param type The editor type to check\r\n * @returns Whether the editor is available\r\n */\r\nexport function isEditorAvailable(type: EditorType): boolean {\r\n const adapter = adapters.get(type)\r\n return adapter?.isAvailable() ?? false\r\n}\r\n\r\n/**\r\n * Get the best available editor based on preference order\r\n * @param preferenceOrder Custom preference order (optional)\r\n * @returns The best available adapter or undefined\r\n */\r\nexport function getBestAvailableEditor(\r\n preferenceOrder: EditorType[] = defaultPreferenceOrder\r\n): EditorAdapter | undefined {\r\n for (const type of preferenceOrder) {\r\n const adapter = adapters.get(type)\r\n if (adapter?.isAvailable()) {\r\n return adapter\r\n }\r\n }\r\n\r\n // Fallback: return any available adapter\r\n return getAvailableAdapters()[0]\r\n}\r\n\r\n/**\r\n * Get the default editor (first available in preference order)\r\n * @returns The default editor type or undefined\r\n */\r\nexport function getDefaultEditorType(): EditorType | undefined {\r\n const adapter = getBestAvailableEditor()\r\n return adapter?.type\r\n}\r\n\r\n/**\r\n * Get features supported by an editor\r\n * @param type The editor type\r\n * @returns The features object or undefined\r\n */\r\nexport function getEditorFeatures(type: EditorType): EditorFeatures | undefined {\r\n const adapter = adapters.get(type)\r\n return adapter?.getSupportedFeatures()\r\n}\r\n\r\n/**\r\n * Compare features between two editors\r\n * @param type1 First editor type\r\n * @param type2 Second editor type\r\n * @returns Object with features and their support status\r\n */\r\nexport function compareEditorFeatures(\r\n type1: EditorType,\r\n type2: EditorType\r\n): Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> | undefined {\r\n const features1 = getEditorFeatures(type1)\r\n const features2 = getEditorFeatures(type2)\r\n\r\n if (!features1 || !features2) return undefined\r\n\r\n const result: Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> = {} as any\r\n\r\n for (const key of Object.keys(features1) as (keyof EditorFeatures)[]) {\r\n result[key] = {\r\n [type1]: features1[key],\r\n [type2]: features2[key],\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Get registry statistics\r\n * @returns Statistics about registered adapters\r\n */\r\nexport function getRegistryStats(): {\r\n total: number\r\n available: number\r\n unavailable: number\r\n editors: { type: EditorType; available: boolean; name: string }[]\r\n} {\r\n const allAdapters = getAllAdapters()\r\n const availableAdapters = getAvailableAdapters()\r\n\r\n return {\r\n total: allAdapters.length,\r\n available: availableAdapters.length,\r\n unavailable: allAdapters.length - availableAdapters.length,\r\n editors: allAdapters.map(adapter => ({\r\n type: adapter.type,\r\n available: adapter.isAvailable(),\r\n name: adapter.name,\r\n })),\r\n }\r\n}\r\n\r\n// Export the registry for advanced use cases\r\nexport const EditorRegistry = {\r\n register: registerAdapter,\r\n unregister: unregisterAdapter,\r\n get: getAdapter,\r\n getAll: getAllAdapters,\r\n getAvailable: getAvailableAdapters,\r\n isAvailable: isEditorAvailable,\r\n getBest: getBestAvailableEditor,\r\n getDefault: getDefaultEditorType,\r\n getFeatures: getEditorFeatures,\r\n compareFeatures: compareEditorFeatures,\r\n getStats: getRegistryStats,\r\n}\r\n\r\nexport default EditorRegistry\r\n","/**\r\n * Toolbar Presets - Predefined toolbar configurations\r\n */\r\n\r\nimport type { ToolbarButtonType } from './types'\r\n\r\n/** Full toolbar with all features */\r\nexport const fullToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'code',\r\n 'separator',\r\n 'subscript',\r\n 'superscript',\r\n 'clearFormatting',\r\n 'separator',\r\n 'fontFamily',\r\n 'fontSize',\r\n 'lineHeight',\r\n 'textColor',\r\n 'backgroundColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'alignJustify',\r\n 'separator',\r\n 'indent',\r\n 'outdent',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'heading4',\r\n 'heading5',\r\n 'heading6',\r\n 'blockquote',\r\n 'separator',\r\n 'link',\r\n 'unlink',\r\n 'image',\r\n 'video',\r\n 'table',\r\n 'emoji',\r\n 'separator',\r\n 'codeBlock',\r\n 'horizontalRule',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n 'separator',\r\n 'fullscreen',\r\n 'print',\r\n]\r\n\r\n/** Medium toolbar for standard editing */\r\nexport const mediumToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'separator',\r\n 'fontFamily',\r\n 'fontSize',\r\n 'textColor',\r\n 'backgroundColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'table',\r\n 'emoji',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n 'fullscreen',\r\n]\r\n\r\n/** Simple toolbar for basic editing */\r\nexport const simpleToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** Minimal toolbar for comments/notes */\r\nexport const minimalToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'separator',\r\n 'link',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** Code-focused toolbar for technical documentation */\r\nexport const codeToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'code',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'separator',\r\n 'codeBlock',\r\n 'blockquote',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** Blog/Article toolbar */\r\nexport const blogToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'separator',\r\n 'fontSize',\r\n 'textColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'blockquote',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'video',\r\n 'separator',\r\n 'horizontalRule',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n 'fullscreen',\r\n]\r\n\r\n/** Email composition toolbar */\r\nexport const emailToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'separator',\r\n 'fontFamily',\r\n 'fontSize',\r\n 'textColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** All preset configurations */\r\nexport const toolbarPresets = {\r\n full: fullToolbar,\r\n medium: mediumToolbar,\r\n simple: simpleToolbar,\r\n minimal: minimalToolbar,\r\n code: codeToolbar,\r\n blog: blogToolbar,\r\n email: emailToolbar,\r\n} as const\r\n\r\nexport type ToolbarPresetName = keyof typeof toolbarPresets\r\n\r\n/**\r\n * Get a toolbar preset by name\r\n * @param name The preset name\r\n * @returns The toolbar buttons array\r\n */\r\nexport function getToolbarPreset(name: ToolbarPresetName): ToolbarButtonType[] {\r\n return toolbarPresets[name] || toolbarPresets.full\r\n}\r\n\r\n/**\r\n * Create a custom toolbar from a preset with modifications\r\n * @param base Base preset name\r\n * @param options Modification options\r\n * @returns Modified toolbar buttons array\r\n */\r\nexport function customizeToolbar(\r\n base: ToolbarPresetName,\r\n options: {\r\n add?: ToolbarButtonType[]\r\n remove?: ToolbarButtonType[]\r\n insertBefore?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\r\n insertAfter?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\r\n }\r\n): ToolbarButtonType[] {\r\n let toolbar = [...getToolbarPreset(base)]\r\n\r\n // Remove buttons\r\n if (options.remove) {\r\n toolbar = toolbar.filter(btn => !options.remove!.includes(btn))\r\n }\r\n\r\n // Insert before\r\n if (options.insertBefore) {\r\n const index = toolbar.indexOf(options.insertBefore.button)\r\n if (index !== -1) {\r\n toolbar.splice(index, 0, ...options.insertBefore.items)\r\n }\r\n }\r\n\r\n // Insert after\r\n if (options.insertAfter) {\r\n const index = toolbar.indexOf(options.insertAfter.button)\r\n if (index !== -1) {\r\n toolbar.splice(index + 1, 0, ...options.insertAfter.items)\r\n }\r\n }\r\n\r\n // Add at end\r\n if (options.add) {\r\n toolbar.push('separator', ...options.add)\r\n }\r\n\r\n return toolbar\r\n}\r\n\r\nexport default toolbarPresets\r\n","/**\r\n * Core types for the RTE Builder - Editor Agnostic\r\n * These types define the common interface that all editor adapters must implement\r\n */\r\n\r\n// ============================================================================\r\n// EDITOR TYPES\r\n// ============================================================================\r\n\r\n/** Supported editor types */\r\nexport type EditorType = 'tiptap' | 'slate' | 'lexical' | 'quill' | 'draft'\r\n\r\n/** Editor configuration that applies to all editors */\r\nexport interface BaseEditorConfig {\r\n /** Initial HTML content */\r\n initialContent?: string\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Whether the editor is editable */\r\n editable?: boolean\r\n /** Auto-focus on mount */\r\n autoFocus?: boolean\r\n /** Custom attributes for the editor element */\r\n attributes?: Record<string, string>\r\n}\r\n\r\n/** Media file for image/video insertion */\r\nexport interface MediaFile {\r\n /** File URL */\r\n url: string\r\n /** File name */\r\n name?: string\r\n /** File type/MIME type */\r\n type?: string\r\n /** Alt text for images */\r\n alt?: string\r\n /** Title attribute */\r\n title?: string\r\n /** Width */\r\n width?: number\r\n /** Height */\r\n height?: number\r\n}\r\n\r\n// ============================================================================\r\n// TOOLBAR TYPES\r\n// ============================================================================\r\n\r\n/** All available toolbar button types */\r\nexport type ToolbarButtonType =\r\n // Text formatting\r\n | 'bold'\r\n | 'italic'\r\n | 'underline'\r\n | 'strike'\r\n | 'code'\r\n | 'codeBlock'\r\n | 'subscript'\r\n | 'superscript'\r\n | 'clearFormatting'\r\n // Font & Colors\r\n | 'fontFamily'\r\n | 'fontSize'\r\n | 'lineHeight'\r\n | 'textColor'\r\n | 'backgroundColor'\r\n // Alignment & Indentation\r\n | 'alignLeft'\r\n | 'alignCenter'\r\n | 'alignRight'\r\n | 'alignJustify'\r\n | 'indent'\r\n | 'outdent'\r\n // Lists\r\n | 'bulletList'\r\n | 'orderedList'\r\n // Headings\r\n | 'heading1'\r\n | 'heading2'\r\n | 'heading3'\r\n | 'heading4'\r\n | 'heading5'\r\n | 'heading6'\r\n // Blocks\r\n | 'blockquote'\r\n | 'horizontalRule'\r\n // Links & Media\r\n | 'link'\r\n | 'unlink'\r\n | 'image'\r\n | 'video'\r\n | 'table'\r\n | 'emoji'\r\n // Actions\r\n | 'undo'\r\n | 'redo'\r\n | 'fullscreen'\r\n | 'print'\r\n // Special\r\n | 'separator'\r\n\r\n/** Toolbar preset names */\r\nexport type ToolbarPreset = 'full' | 'medium' | 'simple' | 'minimal'\r\n\r\n/** Toolbar configuration */\r\nexport interface ToolbarConfig {\r\n /** Preset to use, or custom buttons array */\r\n preset?: ToolbarPreset\r\n /** Custom buttons array (overrides preset) */\r\n buttons?: ToolbarButtonType[]\r\n /** Whether toolbar is sticky */\r\n sticky?: boolean\r\n /** Sticky offset in pixels */\r\n stickyOffset?: number\r\n}\r\n\r\n// ============================================================================\r\n// EDITOR PROPS & REF TYPES\r\n// ============================================================================\r\n\r\n/** Props for the unified RichTextEditor component */\r\nexport interface UnifiedEditorProps {\r\n /** Which editor to use */\r\n editor?: EditorType\r\n /** Show editor switcher dropdown in toolbar */\r\n showEditorSwitcher?: boolean\r\n /** Callback when editor type changes via switcher */\r\n onEditorChange?: (editorType: EditorType) => void\r\n /** Initial content (HTML string) */\r\n value?: string\r\n /** Callback when content changes */\r\n onChange?: (content: string) => void\r\n /** Callback when editor loses focus */\r\n onBlur?: () => void\r\n /** Callback when editor gains focus */\r\n onFocus?: () => void\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Editor height in pixels */\r\n height?: number\r\n /** Minimum height in pixels */\r\n minHeight?: number\r\n /** Maximum height in pixels */\r\n maxHeight?: number\r\n /** Whether the editor is disabled */\r\n disabled?: boolean\r\n /** Whether the editor is read-only */\r\n readOnly?: boolean\r\n /** Character limit (-1 for no limit) */\r\n charCounterMax?: number\r\n /** Show character counter */\r\n showCharCounter?: boolean\r\n /** Toolbar preset or custom config */\r\n toolbar?: ToolbarPreset | ToolbarConfig\r\n /** Custom toolbar buttons (shorthand for toolbar.buttons) */\r\n toolbarButtons?: ToolbarButtonType[]\r\n /** Additional className */\r\n className?: string\r\n /** Callback for custom image picker */\r\n onMediaPickerImage?: () => Promise<MediaFile | null>\r\n /** Callback for custom video picker */\r\n onMediaPickerVideo?: () => Promise<MediaFile | null>\r\n /** Enable syntax highlighting for code blocks */\r\n enableCodeHighlight?: boolean\r\n /** Default language for code blocks */\r\n defaultCodeLanguage?: string\r\n /** Additional editor-specific config */\r\n editorConfig?: Record<string, unknown>\r\n}\r\n\r\n/** Methods exposed via ref */\r\nexport interface UnifiedEditorRef {\r\n /** Get the current HTML content */\r\n getContent: () => string\r\n /** Get content as plain text */\r\n getText: () => string\r\n /** Get content as JSON (if supported) */\r\n getJSON: () => unknown\r\n /** Set the HTML content */\r\n setContent: (content: string) => void\r\n /** Focus the editor */\r\n focus: () => void\r\n /** Blur the editor */\r\n blur: () => void\r\n /** Insert HTML at cursor position */\r\n insertHTML: (html: string) => void\r\n /** Insert text at cursor position */\r\n insertText: (text: string) => void\r\n /** Clear all content */\r\n clear: () => void\r\n /** Check if content is empty */\r\n isEmpty: () => boolean\r\n /** Get character count */\r\n getCharacterCount: () => number\r\n /** Get word count */\r\n getWordCount: () => number\r\n /** Check if editor is in fullscreen mode */\r\n isFullscreen: () => boolean\r\n /** Toggle fullscreen mode */\r\n toggleFullscreen: () => void\r\n /** Print the content */\r\n print: () => void\r\n /** Undo last action */\r\n undo: () => void\r\n /** Redo last undone action */\r\n redo: () => void\r\n /** Check if can undo */\r\n canUndo: () => boolean\r\n /** Check if can redo */\r\n canRedo: () => boolean\r\n /** Get the native editor instance */\r\n getNativeEditor: () => unknown\r\n /** Get the editor type */\r\n getEditorType: () => EditorType\r\n}\r\n\r\n// ============================================================================\r\n// EDITOR ADAPTER INTERFACE\r\n// ============================================================================\r\n\r\n/**\r\n * Abstract interface that all editor adapters must implement.\r\n * This ensures consistency across different editor implementations.\r\n */\r\nexport interface EditorAdapter {\r\n /** The type of editor this adapter handles */\r\n readonly type: EditorType\r\n\r\n /** Human-readable name */\r\n readonly name: string\r\n\r\n /** Description of the editor */\r\n readonly description: string\r\n\r\n /** Whether this adapter is available (dependencies installed) */\r\n isAvailable: () => boolean\r\n\r\n /** Get the React component for this editor */\r\n getComponent: () => React.ComponentType<AdapterComponentProps>\r\n\r\n /** Get supported features */\r\n getSupportedFeatures: () => EditorFeatures\r\n}\r\n\r\n/** Props passed to adapter components */\r\nexport interface AdapterComponentProps {\r\n value: string\r\n onChange: (content: string) => void\r\n onBlur?: () => void\r\n onFocus?: () => void\r\n placeholder?: string\r\n height?: number\r\n minHeight?: number\r\n maxHeight?: number\r\n disabled?: boolean\r\n readOnly?: boolean\r\n charCounterMax?: number\r\n showCharCounter?: boolean\r\n toolbarButtons: ToolbarButtonType[]\r\n className?: string\r\n onMediaPickerImage?: () => Promise<MediaFile | null>\r\n onMediaPickerVideo?: () => Promise<MediaFile | null>\r\n enableCodeHighlight?: boolean\r\n defaultCodeLanguage?: string\r\n editorConfig?: Record<string, unknown>\r\n /** Ref forwarding */\r\n editorRef?: React.Ref<AdapterEditorRef>\r\n}\r\n\r\n/** Ref methods that adapters must expose */\r\nexport interface AdapterEditorRef {\r\n getContent: () => string\r\n getText: () => string\r\n getJSON: () => unknown\r\n setContent: (content: string) => void\r\n focus: () => void\r\n blur: () => void\r\n insertHTML: (html: string) => void\r\n insertText: (text: string) => void\r\n clear: () => void\r\n isEmpty: () => boolean\r\n getCharacterCount: () => number\r\n getWordCount: () => number\r\n isFullscreen: () => boolean\r\n toggleFullscreen: () => void\r\n print: () => void\r\n undo: () => void\r\n redo: () => void\r\n canUndo: () => boolean\r\n canRedo: () => boolean\r\n getNativeEditor: () => unknown\r\n}\r\n\r\n// ============================================================================\r\n// FEATURE FLAGS\r\n// ============================================================================\r\n\r\n/** Features that an editor may or may not support */\r\nexport interface EditorFeatures {\r\n // Text formatting\r\n bold: boolean\r\n italic: boolean\r\n underline: boolean\r\n strikethrough: boolean\r\n subscript: boolean\r\n superscript: boolean\r\n code: boolean\r\n codeBlock: boolean\r\n codeHighlighting: boolean\r\n\r\n // Font styling\r\n fontFamily: boolean\r\n fontSize: boolean\r\n textColor: boolean\r\n backgroundColor: boolean\r\n lineHeight: boolean\r\n\r\n // Alignment & Structure\r\n textAlign: boolean\r\n indent: boolean\r\n headings: boolean\r\n blockquote: boolean\r\n horizontalRule: boolean\r\n\r\n // Lists\r\n bulletList: boolean\r\n orderedList: boolean\r\n nestedLists: boolean\r\n\r\n // Links & Media\r\n links: boolean\r\n images: boolean\r\n videos: boolean\r\n embeds: boolean\r\n\r\n // Tables\r\n tables: boolean\r\n tableResize: boolean\r\n\r\n // Advanced\r\n emoji: boolean\r\n mentions: boolean\r\n hashtags: boolean\r\n markdown: boolean\r\n\r\n // UI\r\n fullscreen: boolean\r\n print: boolean\r\n characterCount: boolean\r\n\r\n // History\r\n undoRedo: boolean\r\n\r\n // Collaboration\r\n collaboration: boolean\r\n comments: boolean\r\n}\r\n\r\n/** Default feature set - all false */\r\nexport const DEFAULT_FEATURES: EditorFeatures = {\r\n bold: false,\r\n italic: false,\r\n underline: false,\r\n strikethrough: false,\r\n subscript: false,\r\n superscript: false,\r\n code: false,\r\n codeBlock: false,\r\n codeHighlighting: false,\r\n fontFamily: false,\r\n fontSize: false,\r\n textColor: false,\r\n backgroundColor: false,\r\n lineHeight: false,\r\n textAlign: false,\r\n indent: false,\r\n headings: false,\r\n blockquote: false,\r\n horizontalRule: false,\r\n bulletList: false,\r\n orderedList: false,\r\n nestedLists: false,\r\n links: false,\r\n images: false,\r\n videos: false,\r\n embeds: false,\r\n tables: false,\r\n tableResize: false,\r\n emoji: false,\r\n mentions: false,\r\n hashtags: false,\r\n markdown: false,\r\n fullscreen: false,\r\n print: false,\r\n characterCount: false,\r\n undoRedo: false,\r\n collaboration: false,\r\n comments: false,\r\n}\r\n","/**\r\n * TipTap Editor Adapter\r\n *\r\n * This adapter wraps the TipTap editor to conform to the unified editor interface.\r\n */\r\n\r\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\r\nimport { DEFAULT_FEATURES } from \"../../core/types\";\r\n\r\n// Check if TipTap is available\r\n// Since TipTap is bundled with rte-builder, it's always available\r\nfunction checkTipTapAvailable(): boolean {\r\n return true;\r\n}\r\n\r\n// TipTap features\r\nconst TIPTAP_FEATURES: EditorFeatures = {\r\n ...DEFAULT_FEATURES,\r\n // Text formatting\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strikethrough: true,\r\n subscript: true,\r\n superscript: true,\r\n code: true,\r\n codeBlock: true,\r\n codeHighlighting: true,\r\n // Font styling\r\n fontFamily: true,\r\n fontSize: true,\r\n textColor: true,\r\n backgroundColor: true,\r\n lineHeight: true,\r\n // Alignment & Structure\r\n textAlign: true,\r\n indent: true,\r\n headings: true,\r\n blockquote: true,\r\n horizontalRule: true,\r\n // Lists\r\n bulletList: true,\r\n orderedList: true,\r\n nestedLists: true,\r\n // Links & Media\r\n links: true,\r\n images: true,\r\n videos: true,\r\n embeds: false,\r\n // Tables\r\n tables: true,\r\n tableResize: true,\r\n // Advanced\r\n emoji: true,\r\n mentions: false, // Can be added with extension\r\n hashtags: false, // Can be added with extension\r\n markdown: false, // Can be added with extension\r\n // UI\r\n fullscreen: true,\r\n print: true,\r\n characterCount: true,\r\n // History\r\n undoRedo: true,\r\n // Collaboration\r\n collaboration: false, // Requires Y.js integration\r\n comments: false,\r\n};\r\n\r\n/**\r\n * TipTap Editor Adapter\r\n */\r\nexport const TipTapAdapter: EditorAdapter = {\r\n type: \"tiptap\",\r\n name: \"TipTap\",\r\n description:\r\n \"A headless, framework-agnostic rich text editor built on ProseMirror. Highly customizable with excellent TypeScript support.\",\r\n\r\n isAvailable: checkTipTapAvailable,\r\n\r\n getComponent: () => {\r\n // Dynamic import to avoid bundling if not used\r\n const { TipTapEditorComponent } = require(\"./TipTapEditorComponent\");\r\n return TipTapEditorComponent;\r\n },\r\n\r\n getSupportedFeatures: () => TIPTAP_FEATURES,\r\n};\r\n\r\nexport default TipTapAdapter;\r\n","/**\r\n * TipTap Adapter Exports\r\n */\r\n\r\nexport { TipTapAdapter, default } from './TipTapAdapter'\r\nexport { TipTapEditorComponent } from './TipTapEditorComponent'\r\nexport { TipTapToolbar } from './TipTapToolbar'\r\n","/**\r\n * Slate.js Editor Adapter\r\n *\r\n * This adapter wraps the Slate.js editor to conform to the unified editor interface.\r\n * Slate is a completely customizable framework for building rich text editors.\r\n */\r\n\r\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\r\nimport { DEFAULT_FEATURES } from \"../../core/types\";\r\n\r\n// Check if Slate is available\r\nfunction checkSlateAvailable(): boolean {\r\n try {\r\n require(\"slate\");\r\n require(\"slate-react\");\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// Slate.js features\r\nconst SLATE_FEATURES: EditorFeatures = {\r\n ...DEFAULT_FEATURES,\r\n // Text formatting\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strikethrough: true,\r\n subscript: true,\r\n superscript: true,\r\n code: true,\r\n codeBlock: true,\r\n codeHighlighting: true,\r\n // Font styling\r\n fontFamily: true,\r\n fontSize: true,\r\n textColor: true,\r\n backgroundColor: true,\r\n lineHeight: true,\r\n // Alignment & Structure\r\n textAlign: true,\r\n indent: true,\r\n headings: true,\r\n blockquote: true,\r\n horizontalRule: true,\r\n // Lists\r\n bulletList: true,\r\n orderedList: true,\r\n nestedLists: true,\r\n // Links & Media\r\n links: true,\r\n images: true,\r\n videos: true,\r\n embeds: true,\r\n // Tables\r\n tables: true,\r\n tableResize: false, // Requires custom implementation\r\n // Advanced\r\n emoji: true,\r\n mentions: true, // Slate has good mention support\r\n hashtags: true,\r\n markdown: true, // Can be added with plugins\r\n // UI\r\n fullscreen: true,\r\n print: true,\r\n characterCount: true,\r\n // History\r\n undoRedo: true,\r\n // Collaboration\r\n collaboration: false, // Can be added with plugins\r\n comments: false,\r\n};\r\n\r\n/**\r\n * Slate.js Editor Adapter\r\n */\r\nexport const SlateAdapter: EditorAdapter = {\r\n type: \"slate\",\r\n name: \"Slate.js\",\r\n description:\r\n \"A completely customizable framework for building rich text editors. Provides full control over rendering and behavior.\",\r\n\r\n isAvailable: checkSlateAvailable,\r\n\r\n getComponent: () => {\r\n // Dynamic import to avoid bundling if not used\r\n const { SlateEditorComponent } = require(\"./SlateEditorComponent\");\r\n return SlateEditorComponent;\r\n },\r\n\r\n getSupportedFeatures: () => SLATE_FEATURES,\r\n};\r\n\r\nexport default SlateAdapter;\r\n","/**\r\n * Lexical Editor Adapter\r\n *\r\n * This adapter wraps Meta's Lexical editor to conform to the unified editor interface.\r\n * Lexical is a modern, extensible text editor framework with excellent performance.\r\n */\r\n\r\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\r\nimport { DEFAULT_FEATURES } from \"../../core/types\";\r\n\r\n// Check if Lexical is available\r\nfunction checkLexicalAvailable(): boolean {\r\n try {\r\n require(\"lexical\");\r\n require(\"@lexical/react/LexicalComposer\");\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// Lexical features\r\nconst LEXICAL_FEATURES: EditorFeatures = {\r\n ...DEFAULT_FEATURES,\r\n // Text formatting\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strikethrough: true,\r\n subscript: true,\r\n superscript: true,\r\n code: true,\r\n codeBlock: true,\r\n codeHighlighting: true,\r\n // Font styling\r\n fontFamily: true,\r\n fontSize: true,\r\n textColor: true,\r\n backgroundColor: true,\r\n lineHeight: false, // Requires custom plugin\r\n // Alignment & Structure\r\n textAlign: true,\r\n indent: true,\r\n headings: true,\r\n blockquote: true,\r\n horizontalRule: true,\r\n // Lists\r\n bulletList: true,\r\n orderedList: true,\r\n nestedLists: true,\r\n // Links & Media\r\n links: true,\r\n images: true,\r\n videos: true,\r\n embeds: true,\r\n // Tables\r\n tables: true,\r\n tableResize: false, // Requires custom implementation\r\n // Advanced\r\n emoji: true,\r\n mentions: true, // Excellent mention support\r\n hashtags: true,\r\n markdown: true, // Native markdown support\r\n // UI\r\n fullscreen: true,\r\n print: true,\r\n characterCount: true,\r\n // History\r\n undoRedo: true,\r\n // Collaboration\r\n collaboration: true, // Built-in Yjs support\r\n comments: false,\r\n};\r\n\r\n/**\r\n * Lexical Editor Adapter\r\n */\r\nexport const LexicalAdapter: EditorAdapter = {\r\n type: \"lexical\",\r\n name: \"Lexical\",\r\n description:\r\n \"Meta's modern, extensible text editor framework with excellent performance and built-in collaboration support.\",\r\n\r\n isAvailable: checkLexicalAvailable,\r\n\r\n getComponent: () => {\r\n // Dynamic import to avoid bundling if not used\r\n const { LexicalEditorComponent } = require(\"./LexicalEditorComponent\");\r\n return LexicalEditorComponent;\r\n },\r\n\r\n getSupportedFeatures: () => LEXICAL_FEATURES,\r\n};\r\n\r\nexport default LexicalAdapter;\r\n","import { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\r\nimport { useEditor, EditorContent } from \"@tiptap/react\";\r\nimport { Document } from \"@tiptap/extension-document\";\r\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\r\nimport { Text } from \"@tiptap/extension-text\";\r\nimport { Bold } from \"@tiptap/extension-bold\";\r\nimport { Italic } from \"@tiptap/extension-italic\";\r\nimport { Underline } from \"@tiptap/extension-underline\";\r\nimport { Strike } from \"@tiptap/extension-strike\";\r\nimport { Code } from \"@tiptap/extension-code\";\r\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\r\nimport { Subscript } from \"@tiptap/extension-subscript\";\r\nimport { Superscript } from \"@tiptap/extension-superscript\";\r\nimport { TextStyle } from \"@tiptap/extension-text-style\";\r\nimport { FontFamily } from \"@tiptap/extension-font-family\";\r\nimport { Color } from \"@tiptap/extension-color\";\r\nimport { Highlight } from \"@tiptap/extension-highlight\";\r\nimport { TextAlign } from \"@tiptap/extension-text-align\";\r\nimport { Heading } from \"@tiptap/extension-heading\";\r\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\r\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\r\nimport { ListItem } from \"@tiptap/extension-list-item\";\r\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\r\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\r\nimport { Link } from \"@tiptap/extension-link\";\r\nimport { Image } from \"@tiptap/extension-image\";\r\nimport { Table } from \"@tiptap/extension-table\";\r\nimport { TableRow } from \"@tiptap/extension-table-row\";\r\nimport { TableCell } from \"@tiptap/extension-table-cell\";\r\nimport { TableHeader } from \"@tiptap/extension-table-header\";\r\nimport { History } from \"@tiptap/extension-history\";\r\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\r\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\r\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\r\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\r\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\r\n\r\n// Lowlight for syntax highlighting\r\nimport { common, createLowlight } from \"lowlight\";\r\n\r\n// Custom extensions\r\nimport { FontSize } from \"../extensions/FontSize\";\r\nimport { LineHeight } from \"../extensions/LineHeight\";\r\nimport { Video } from \"../extensions/Video\";\r\nimport { Emoji } from \"../extensions/Emoji\";\r\nimport { Fullscreen } from \"../extensions/Fullscreen\";\r\nimport { Print } from \"../extensions/Print\";\r\nimport { Indent } from \"../extensions/Indent\";\r\n\r\n// Components\r\nimport { Toolbar } from \"./Toolbar\";\r\n\r\n// Types\r\nimport type { EditorProps, EditorRef, ToolbarButton } from \"../types\";\r\n\r\n// Create lowlight instance\r\nconst lowlight = createLowlight(common);\r\n\r\n// Toolbar presets\r\nconst toolbarPresets: Record<\"full\" | \"medium\" | \"simple\", ToolbarButton[]> = {\r\n full: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"code\",\r\n \"separator\",\r\n \"subscript\",\r\n \"superscript\",\r\n \"clearFormatting\",\r\n \"separator\",\r\n \"fontFamily\",\r\n \"fontSize\",\r\n \"lineHeight\",\r\n \"textColor\",\r\n \"backgroundColor\",\r\n \"separator\",\r\n \"alignLeft\",\r\n \"alignCenter\",\r\n \"alignRight\",\r\n \"alignJustify\",\r\n \"separator\",\r\n \"indent\",\r\n \"outdent\",\r\n \"separator\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"separator\",\r\n \"heading1\",\r\n \"heading2\",\r\n \"heading3\",\r\n \"blockquote\",\r\n \"separator\",\r\n \"link\",\r\n \"unlink\",\r\n \"image\",\r\n \"video\",\r\n \"table\",\r\n \"emoji\",\r\n \"separator\",\r\n \"codeBlock\",\r\n \"horizontalRule\",\r\n \"separator\",\r\n \"undo\",\r\n \"redo\",\r\n \"separator\",\r\n \"fullscreen\",\r\n \"print\",\r\n ],\r\n medium: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"separator\",\r\n \"fontFamily\",\r\n \"fontSize\",\r\n \"textColor\",\r\n \"backgroundColor\",\r\n \"separator\",\r\n \"alignLeft\",\r\n \"alignCenter\",\r\n \"alignRight\",\r\n \"separator\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"separator\",\r\n \"heading1\",\r\n \"heading2\",\r\n \"heading3\",\r\n \"separator\",\r\n \"link\",\r\n \"image\",\r\n \"table\",\r\n \"emoji\",\r\n \"separator\",\r\n \"undo\",\r\n \"redo\",\r\n \"fullscreen\",\r\n ],\r\n simple: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"separator\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"separator\",\r\n \"link\",\r\n \"image\",\r\n \"separator\",\r\n \"undo\",\r\n \"redo\",\r\n ],\r\n};\r\n\r\nexport const RichTextEditor = forwardRef<EditorRef, EditorProps>(\r\n (\r\n {\r\n value = \"\",\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = \"Start typing...\",\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarPreset = \"full\",\r\n toolbarButtons,\r\n className = \"\",\r\n config = {},\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = \"javascript\",\r\n },\r\n ref,\r\n ) => {\r\n // Determine which toolbar buttons to use\r\n const activeToolbarButtons =\r\n toolbarButtons || toolbarPresets[toolbarPreset];\r\n\r\n // Initialize editor\r\n const editor = useEditor({\r\n extensions: [\r\n Document,\r\n Paragraph,\r\n Text,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strike,\r\n Code,\r\n enableCodeHighlight\r\n ? CodeBlockLowlight.configure({\r\n lowlight,\r\n defaultLanguage: defaultCodeLanguage,\r\n })\r\n : CodeBlockLowlight.configure({\r\n lowlight: null as any,\r\n }),\r\n Subscript,\r\n Superscript,\r\n TextStyle,\r\n FontFamily,\r\n FontSize,\r\n Color,\r\n Highlight.configure({ multicolor: true }),\r\n LineHeight,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Heading.configure({\r\n levels: [1, 2, 3, 4, 5, 6],\r\n }),\r\n BulletList,\r\n OrderedList,\r\n ListItem,\r\n Blockquote,\r\n HorizontalRule,\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n target: \"_blank\",\r\n rel: \"noopener noreferrer\",\r\n },\r\n }),\r\n Image.configure({\r\n inline: false,\r\n allowBase64: true,\r\n }),\r\n Video,\r\n Table.configure({\r\n resizable: true,\r\n }),\r\n TableRow,\r\n TableCell,\r\n TableHeader,\r\n History,\r\n Placeholder.configure({\r\n placeholder,\r\n }),\r\n CharacterCount.configure({\r\n limit: charCounterMax > 0 ? charCounterMax : undefined,\r\n }),\r\n Gapcursor,\r\n Dropcursor,\r\n HardBreak,\r\n // New extensions\r\n Emoji,\r\n Fullscreen,\r\n Print,\r\n Indent,\r\n ],\r\n content: value,\r\n editable: !disabled && !readOnly,\r\n onUpdate: ({ editor }) => {\r\n const html = editor.getHTML();\r\n onChange?.(html);\r\n },\r\n onBlur: () => {\r\n onBlur?.();\r\n },\r\n onFocus: () => {\r\n onFocus?.();\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: \"rte-builder-content\",\r\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\r\n },\r\n },\r\n ...config,\r\n });\r\n\r\n // Update content when value prop changes\r\n useEffect(() => {\r\n if (editor && value !== editor.getHTML()) {\r\n editor.commands.setContent(value);\r\n }\r\n }, [value, editor]);\r\n\r\n // Update editable state\r\n useEffect(() => {\r\n if (editor) {\r\n editor.setEditable(!disabled && !readOnly);\r\n }\r\n }, [disabled, readOnly, editor]);\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage && editor) {\r\n const file = await onMediaPickerImage();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setImage({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerImage, editor]);\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo && editor) {\r\n const file = await onMediaPickerVideo();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setVideo({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerVideo, editor]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => {\r\n return editor?.getHTML() || \"\";\r\n },\r\n setContent: (html: string) => {\r\n editor?.commands.setContent(html);\r\n },\r\n focus: () => {\r\n editor?.commands.focus();\r\n },\r\n getEditor: () => {\r\n return editor;\r\n },\r\n insertHTML: (html: string) => {\r\n editor?.commands.insertContent(html);\r\n },\r\n clear: () => {\r\n editor?.commands.clearContent();\r\n },\r\n isFullscreen: () => {\r\n return editor?.storage.fullscreen?.isFullscreen || false;\r\n },\r\n toggleFullscreen: () => {\r\n editor?.commands.toggleFullscreen();\r\n },\r\n print: () => {\r\n editor?.commands.print();\r\n },\r\n }));\r\n\r\n if (!editor) {\r\n return null;\r\n }\r\n\r\n const characterCount = editor.storage.characterCount.characters();\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\r\n\r\n return (\r\n <div\r\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\r\n >\r\n <Toolbar\r\n editor={editor}\r\n buttons={activeToolbarButtons}\r\n onMediaPickerImage={\r\n onMediaPickerImage ? handleMediaPickerImage : undefined\r\n }\r\n onMediaPickerVideo={\r\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\r\n }\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{ height: `${height}px` }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\">\r\n {\" \"}\r\n (limit exceeded)\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nRichTextEditor.displayName = \"RichTextEditor\";\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport type { Editor } from \"@tiptap/react\";\r\nimport type { ToolbarButton } from \"../types\";\r\nimport { EMOJI_CATEGORIES } from \"../extensions/Emoji\";\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strikethrough,\r\n Code,\r\n Subscript,\r\n Superscript,\r\n RemoveFormatting,\r\n Type,\r\n Highlighter,\r\n AlignLeft,\r\n AlignCenter,\r\n AlignRight,\r\n AlignJustify,\r\n Indent,\r\n Outdent,\r\n List,\r\n ListOrdered,\r\n Heading,\r\n Quote,\r\n Minus,\r\n Link,\r\n Unlink,\r\n Image,\r\n Video,\r\n Table,\r\n Smile,\r\n Maximize,\r\n Minimize,\r\n Printer,\r\n Undo,\r\n Redo,\r\n CodeXml,\r\n} from \"lucide-react\";\r\n\r\ninterface ToolbarProps {\r\n editor: Editor | null;\r\n buttons: ToolbarButton[];\r\n onMediaPickerImage?: () => void;\r\n onMediaPickerVideo?: () => void;\r\n}\r\n\r\nconst FONT_FAMILIES = [\r\n { value: \"Arial\", label: \"Arial\" },\r\n { value: \"Georgia\", label: \"Georgia\" },\r\n { value: \"Times New Roman\", label: \"Times New Roman\" },\r\n { value: \"Courier New\", label: \"Courier New\" },\r\n { value: \"Verdana\", label: \"Verdana\" },\r\n { value: \"Roboto\", label: \"Roboto\" },\r\n { value: \"Open Sans\", label: \"Open Sans\" },\r\n { value: \"Lato\", label: \"Lato\" },\r\n { value: \"Montserrat\", label: \"Montserrat\" },\r\n { value: \"Poppins\", label: \"Poppins\" },\r\n];\r\n\r\nconst FONT_SIZES = [\r\n \"8px\",\r\n \"10px\",\r\n \"12px\",\r\n \"14px\",\r\n \"16px\",\r\n \"18px\",\r\n \"20px\",\r\n \"24px\",\r\n \"30px\",\r\n \"36px\",\r\n \"48px\",\r\n \"60px\",\r\n \"72px\",\r\n];\r\n\r\nconst LINE_HEIGHTS = [\r\n { value: \"1\", label: \"Single\" },\r\n { value: \"1.15\", label: \"1.15\" },\r\n { value: \"1.5\", label: \"1.5\" },\r\n { value: \"1.75\", label: \"1.75\" },\r\n { value: \"2\", label: \"Double\" },\r\n { value: \"2.5\", label: \"2.5\" },\r\n { value: \"3\", label: \"Triple\" },\r\n];\r\n\r\n// const CODE_LANGUAGES = [\r\n// { value: \"javascript\", label: \"JavaScript\" },\r\n// { value: \"typescript\", label: \"TypeScript\" },\r\n// { value: \"python\", label: \"Python\" },\r\n// { value: \"java\", label: \"Java\" },\r\n// { value: \"cpp\", label: \"C++\" },\r\n// { value: \"csharp\", label: \"C#\" },\r\n// { value: \"php\", label: \"PHP\" },\r\n// { value: \"ruby\", label: \"Ruby\" },\r\n// { value: \"go\", label: \"Go\" },\r\n// { value: \"rust\", label: \"Rust\" },\r\n// { value: \"html\", label: \"HTML\" },\r\n// { value: \"css\", label: \"CSS\" },\r\n// { value: \"sql\", label: \"SQL\" },\r\n// { value: \"bash\", label: \"Bash\" },\r\n// { value: \"json\", label: \"JSON\" },\r\n// { value: \"yaml\", label: \"YAML\" },\r\n// { value: \"markdown\", label: \"Markdown\" },\r\n// { value: \"xml\", label: \"XML\" },\r\n// ];\r\n\r\n// Emoji Picker Popover Component\r\nconst EmojiPicker: React.FC<{\r\n onSelect: (emoji: string) => void;\r\n onClose: () => void;\r\n}> = ({ onSelect, onClose }) => {\r\n const [activeCategory, setActiveCategory] =\r\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\r\n const popoverRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [onClose]);\r\n\r\n return (\r\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n type=\"button\"\r\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\r\n onClick={() =>\r\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\r\n }\r\n title={category.label}\r\n >\r\n {category.emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\r\n <button\r\n key={`${emoji}-${i}`}\r\n type=\"button\"\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => {\r\n onSelect(emoji);\r\n onClose();\r\n }}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const Toolbar: React.FC<ToolbarProps> = ({\r\n editor,\r\n buttons,\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n}) => {\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\r\n\r\n if (!editor) return null;\r\n\r\n const ToolbarButton = ({\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n children,\r\n title,\r\n buttonRef,\r\n }: {\r\n onClick: () => void;\r\n active?: boolean;\r\n disabled?: boolean;\r\n children: React.ReactNode;\r\n title?: string;\r\n buttonRef?: React.RefObject<HTMLButtonElement>;\r\n }) => (\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault(); // Prevent editor from losing focus\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n\r\n const renderButton = (button: ToolbarButton, index: number) => {\r\n switch (button) {\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key=\"bold\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n active={editor.isActive(\"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n <Bold size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key=\"italic\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n active={editor.isActive(\"italic\")}\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n <Italic size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key=\"underline\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n active={editor.isActive(\"underline\")}\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n <Underline size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key=\"strike\"\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n active={editor.isActive(\"strike\")}\r\n title=\"Strikethrough\"\r\n >\r\n <Strikethrough size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key=\"code\"\r\n onClick={() => editor.chain().focus().toggleCode().run()}\r\n active={editor.isActive(\"code\")}\r\n title=\"Inline Code\"\r\n >\r\n <Code size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key=\"codeBlock\"\r\n onClick={() => {\r\n if (editor.isActive(\"codeBlock\")) {\r\n // Source mode OFF: extract raw HTML from code block, render as rich content\r\n let htmlSource = \"\";\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === \"codeBlock\") {\r\n htmlSource = node.textContent;\r\n return false;\r\n }\r\n });\r\n\r\n htmlSource = htmlSource.trim();\r\n\r\n if (htmlSource) {\r\n editor.commands.setContent(htmlSource, true, {\r\n preserveWhitespace: false,\r\n });\r\n } else {\r\n editor.commands.clearContent(true);\r\n }\r\n editor.commands.focus();\r\n } else {\r\n // Source mode ON: get current rich content as HTML, show as editable source\r\n const currentHTML = editor.getHTML();\r\n const isEmptyContent =\r\n !currentHTML ||\r\n currentHTML === \"<p></p>\" ||\r\n currentHTML.trim() === \"\";\r\n\r\n const codeBlockContent = isEmptyContent\r\n ? { type: \"doc\", content: [{ type: \"codeBlock\" }] }\r\n : {\r\n type: \"doc\",\r\n content: [\r\n {\r\n type: \"codeBlock\",\r\n content: [{ type: \"text\", text: currentHTML }],\r\n },\r\n ],\r\n };\r\n\r\n editor.commands.setContent(codeBlockContent, false);\r\n editor.commands.focus();\r\n }\r\n }}\r\n active={editor.isActive(\"codeBlock\")}\r\n title=\"Code Block (HTML Source)\"\r\n >\r\n <CodeXml size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"subscript\"\r\n onClick={() => editor.chain().focus().toggleSubscript().run()}\r\n active={editor.isActive(\"subscript\")}\r\n title=\"Subscript\"\r\n >\r\n <Subscript size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"superscript\"\r\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\r\n active={editor.isActive(\"superscript\")}\r\n title=\"Superscript\"\r\n >\r\n <Superscript size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key=\"clearFormatting\"\r\n onClick={() =>\r\n editor.chain().focus().clearNodes().unsetAllMarks().run()\r\n }\r\n title=\"Clear Formatting\"\r\n >\r\n <RemoveFormatting size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"fontFamily\":\r\n return (\r\n <select\r\n key=\"fontFamily\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontFamily().run();\r\n } else {\r\n editor.chain().focus().setFontFamily(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\r\n >\r\n <option value=\"default\">Font Family</option>\r\n {FONT_FAMILIES.map((font) => (\r\n <option key={font.value} value={font.value}>\r\n {font.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"fontSize\":\r\n return (\r\n <select\r\n key=\"fontSize\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontSize().run();\r\n } else {\r\n editor.chain().focus().setFontSize(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\r\n >\r\n <option value=\"default\">Font Size</option>\r\n {FONT_SIZES.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"lineHeight\":\r\n return (\r\n <select\r\n key=\"lineHeight\"\r\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetLineHeight().run();\r\n } else {\r\n editor.chain().focus().setLineHeight(e.target.value).run();\r\n }\r\n }}\r\n value={\r\n editor.getAttributes(\"paragraph\").lineHeight ||\r\n editor.getAttributes(\"heading\").lineHeight ||\r\n \"default\"\r\n }\r\n title=\"Line Height\"\r\n >\r\n <option value=\"default\">Line Height</option>\r\n {LINE_HEIGHTS.map((lh) => (\r\n <option key={lh.value} value={lh.value}>\r\n {lh.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"textColor\":\r\n return (\r\n <span key=\"textColor\" className=\"rte-builder-toolbar-color-group\">\r\n <button\r\n key=\"text-none\"\r\n className=\"rte-builder-color-preset rte-builder-color-preset-none\"\r\n onClick={() => editor.chain().focus().unsetColor().run()}\r\n title=\"Text Color: None (Reset)\"\r\n type=\"button\"\r\n />\r\n <span className=\"rte-builder-toolbar-color\">\r\n <label title=\"Text Color\">\r\n <Type size={18} />\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor.chain().focus().setColor(e.target.value).run()\r\n }\r\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\r\n />\r\n </label>\r\n </span>\r\n </span>\r\n );\r\n\r\n case \"backgroundColor\":\r\n return (\r\n <span key=\"backgroundColor\" className=\"rte-builder-toolbar-color\">\r\n <label title=\"Background Color\">\r\n <Highlighter size={18} />\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor\r\n .chain()\r\n .focus()\r\n .toggleHighlight({ color: e.target.value })\r\n .run()\r\n }\r\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\r\n />\r\n </label>\r\n </span>\r\n );\r\n\r\n case \"alignLeft\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignLeft\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\r\n active={editor.isActive({ textAlign: \"left\" })}\r\n title=\"Align Left\"\r\n >\r\n <AlignLeft size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignCenter\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignCenter\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\r\n active={editor.isActive({ textAlign: \"center\" })}\r\n title=\"Align Center\"\r\n >\r\n <AlignCenter size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignRight\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignRight\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\r\n active={editor.isActive({ textAlign: \"right\" })}\r\n title=\"Align Right\"\r\n >\r\n <AlignRight size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignJustify\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignJustify\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\r\n active={editor.isActive({ textAlign: \"justify\" })}\r\n title=\"Justify\"\r\n >\r\n <AlignJustify size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"indent\":\r\n return (\r\n <ToolbarButton\r\n key=\"indent\"\r\n onClick={() => editor.chain().focus().indent().run()}\r\n title=\"Indent (Tab)\"\r\n >\r\n <Indent size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"outdent\":\r\n return (\r\n <ToolbarButton\r\n key=\"outdent\"\r\n onClick={() => editor.chain().focus().outdent().run()}\r\n title=\"Outdent (Shift+Tab)\"\r\n >\r\n <Outdent size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key=\"bulletList\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n active={editor.isActive(\"bulletList\")}\r\n title=\"Bullet List\"\r\n >\r\n <List size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key=\"orderedList\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n active={editor.isActive(\"orderedList\")}\r\n title=\"Numbered List\"\r\n >\r\n <ListOrdered size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"heading1\":\r\n case \"heading2\":\r\n case \"heading3\":\r\n case \"heading4\":\r\n case \"heading5\":\r\n case \"heading6\":\r\n const level = parseInt(button.replace(\"heading\", \"\")) as\r\n | 1\r\n | 2\r\n | 3\r\n | 4\r\n | 5\r\n | 6;\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.chain().focus().toggleHeading({ level }).run()\r\n }\r\n active={editor.isActive(\"heading\", { level })}\r\n title={`Heading ${level}`}\r\n >\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"2px\" }}>\r\n <Heading size={18} />\r\n <span style={{ fontSize: \"11px\", fontWeight: \"bold\" }}>\r\n {level}\r\n </span>\r\n </span>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton\r\n key=\"blockquote\"\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n active={editor.isActive(\"blockquote\")}\r\n title=\"Blockquote\"\r\n >\r\n <Quote size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key=\"horizontalRule\"\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n title=\"Horizontal Rule\"\r\n >\r\n <Minus size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"link\":\r\n return (\r\n <ToolbarButton\r\n key=\"link\"\r\n onClick={() => {\r\n const url = window.prompt(\"Enter URL:\");\r\n if (url) {\r\n editor.chain().focus().setLink({ href: url }).run();\r\n }\r\n }}\r\n active={editor.isActive(\"link\")}\r\n title=\"Insert Link\"\r\n >\r\n <Link size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton\r\n key=\"unlink\"\r\n onClick={() => editor.chain().focus().unsetLink().run()}\r\n disabled={!editor.isActive(\"link\")}\r\n title=\"Remove Link\"\r\n >\r\n <Unlink size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key=\"image\"\r\n onClick={() => {\r\n if (onMediaPickerImage) {\r\n onMediaPickerImage();\r\n } else {\r\n const url = window.prompt(\"Enter image URL:\");\r\n if (url) {\r\n editor.chain().focus().setImage({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Image\"\r\n >\r\n <Image size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key=\"video\"\r\n onClick={() => {\r\n if (onMediaPickerVideo) {\r\n onMediaPickerVideo();\r\n } else {\r\n const url = window.prompt(\"Enter video URL:\");\r\n if (url) {\r\n editor.chain().focus().setVideo({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Video\"\r\n >\r\n <Video size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key=\"table\"\r\n onClick={() =>\r\n editor\r\n .chain()\r\n .focus()\r\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\r\n .run()\r\n }\r\n title=\"Insert Table\"\r\n >\r\n <Table size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"emoji\":\r\n return (\r\n <span key=\"emoji\" style={{ position: \"relative\" }}>\r\n <ToolbarButton\r\n buttonRef={emojiButtonRef}\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n active={showEmojiPicker}\r\n title=\"Insert Emoji\"\r\n >\r\n <Smile size={18} />\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <EmojiPicker\r\n onSelect={(emoji) =>\r\n editor.chain().focus().insertEmoji(emoji).run()\r\n }\r\n onClose={() => setShowEmojiPicker(false)}\r\n />\r\n )}\r\n </span>\r\n );\r\n\r\n case \"fullscreen\":\r\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\r\n return (\r\n <ToolbarButton\r\n key=\"fullscreen\"\r\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\r\n active={isFullscreen}\r\n title={\r\n isFullscreen\r\n ? \"Exit Fullscreen (Esc)\"\r\n : \"Fullscreen (Ctrl+Shift+F)\"\r\n }\r\n >\r\n {isFullscreen ? <Minimize size={18} /> : <Maximize size={18} />}\r\n </ToolbarButton>\r\n );\r\n\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key=\"print\"\r\n onClick={() => editor.chain().focus().print().run()}\r\n title=\"Print (Ctrl+P)\"\r\n >\r\n <Printer size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key=\"undo\"\r\n onClick={() => editor.chain().focus().undo().run()}\r\n disabled={!editor.can().undo()}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n <Undo size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key=\"redo\"\r\n onClick={() => editor.chain().focus().redo().run()}\r\n disabled={!editor.can().redo()}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n <Redo size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"separator\":\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const isSourceMode = editor.isActive(\"codeBlock\");\r\n\r\n return <div className={`rte-builder-toolbar${isSourceMode ? \" rte-builder-toolbar-source-mode\" : \"\"}`}>{buttons.map(renderButton)}</div>;\r\n};\r\n","/**\r\n * Collaboration Context\r\n * Provides real-time collaboration state and methods to child components\r\n */\r\n\r\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\r\nimport type {\r\n CollaborationState,\r\n CollaborationConfig,\r\n CollaborationUser,\r\n CollaborationStatus,\r\n CollaborationEvent,\r\n CursorPosition,\r\n} from './types'\r\n\r\n/** Actions for collaboration reducer */\r\ntype CollaborationAction =\r\n | { type: 'SET_STATUS'; status: CollaborationStatus }\r\n | { type: 'SET_USERS'; users: CollaborationUser[] }\r\n | { type: 'ADD_USER'; user: CollaborationUser }\r\n | { type: 'REMOVE_USER'; userId: string }\r\n | { type: 'UPDATE_CURSOR'; userId: string; cursor: CursorPosition }\r\n | { type: 'SET_ERROR'; error: string }\r\n | { type: 'CLEAR_ERROR' }\r\n | { type: 'SET_HOST'; isHost: boolean }\r\n\r\n/** Initial collaboration state */\r\nconst initialState: CollaborationState = {\r\n status: 'disconnected',\r\n users: [],\r\n error: undefined,\r\n isHost: false,\r\n}\r\n\r\n/** Collaboration reducer */\r\nfunction collaborationReducer(state: CollaborationState, action: CollaborationAction): CollaborationState {\r\n switch (action.type) {\r\n case 'SET_STATUS':\r\n return { ...state, status: action.status, error: action.status === 'error' ? state.error : undefined }\r\n case 'SET_USERS':\r\n return { ...state, users: action.users }\r\n case 'ADD_USER':\r\n if (state.users.find(u => u.id === action.user.id)) {\r\n return {\r\n ...state,\r\n users: state.users.map(u => u.id === action.user.id ? action.user : u),\r\n }\r\n }\r\n return { ...state, users: [...state.users, action.user] }\r\n case 'REMOVE_USER':\r\n return { ...state, users: state.users.filter(u => u.id !== action.userId) }\r\n case 'UPDATE_CURSOR':\r\n return {\r\n ...state,\r\n users: state.users.map(u =>\r\n u.id === action.userId ? { ...u, cursor: action.cursor, lastActive: Date.now() } : u\r\n ),\r\n }\r\n case 'SET_ERROR':\r\n return { ...state, status: 'error', error: action.error }\r\n case 'CLEAR_ERROR':\r\n return { ...state, error: undefined }\r\n case 'SET_HOST':\r\n return { ...state, isHost: action.isHost }\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n/** Context value type */\r\ninterface CollaborationContextValue {\r\n state: CollaborationState\r\n config: CollaborationConfig | null\r\n connect: () => Promise<void>\r\n disconnect: () => void\r\n updateCursor: (cursor: CursorPosition) => void\r\n isEnabled: boolean\r\n}\r\n\r\n/** Create context */\r\nconst CollaborationContext = createContext<CollaborationContextValue | null>(null)\r\n\r\n/** Provider props */\r\ninterface CollaborationProviderProps {\r\n children: ReactNode\r\n config?: CollaborationConfig\r\n onStatusChange?: (status: CollaborationStatus) => void\r\n onUsersChange?: (users: CollaborationUser[]) => void\r\n}\r\n\r\n/** Generate a random color for user */\r\nfunction generateUserColor(): string {\r\n const colors = [\r\n '#f87171', '#fb923c', '#fbbf24', '#a3e635', '#4ade80',\r\n '#2dd4bf', '#22d3ee', '#60a5fa', '#a78bfa', '#e879f9',\r\n ]\r\n return colors[Math.floor(Math.random() * colors.length)]\r\n}\r\n\r\n/** Collaboration Provider Component */\r\nexport function CollaborationProvider({\r\n children,\r\n config,\r\n onStatusChange,\r\n onUsersChange,\r\n}: CollaborationProviderProps) {\r\n const [state, dispatch] = useReducer(collaborationReducer, initialState)\r\n const wsRef = useRef<WebSocket | null>(null)\r\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null)\r\n const reconnectAttemptsRef = useRef(0)\r\n\r\n // Notify on status change\r\n useEffect(() => {\r\n onStatusChange?.(state.status)\r\n }, [state.status, onStatusChange])\r\n\r\n // Notify on users change\r\n useEffect(() => {\r\n onUsersChange?.(state.users)\r\n }, [state.users, onUsersChange])\r\n\r\n /** Connect to collaboration server */\r\n const connect = useCallback(async () => {\r\n if (!config) return\r\n\r\n dispatch({ type: 'SET_STATUS', status: 'connecting' })\r\n\r\n try {\r\n if (config.provider === 'websocket' && config.serverUrl) {\r\n const url = new URL(config.serverUrl)\r\n url.searchParams.set('room', config.roomId)\r\n if (config.token) {\r\n url.searchParams.set('token', config.token)\r\n }\r\n\r\n const ws = new WebSocket(url.toString())\r\n wsRef.current = ws\r\n\r\n ws.onopen = () => {\r\n dispatch({ type: 'SET_STATUS', status: 'connected' })\r\n reconnectAttemptsRef.current = 0\r\n\r\n // Send join message\r\n ws.send(JSON.stringify({\r\n type: 'join',\r\n user: {\r\n id: config.user.id,\r\n name: config.user.name,\r\n avatar: config.user.avatar,\r\n color: config.user.color || generateUserColor(),\r\n },\r\n }))\r\n }\r\n\r\n ws.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as CollaborationEvent\r\n handleCollaborationEvent(message)\r\n } catch {\r\n console.error('Failed to parse collaboration message')\r\n }\r\n }\r\n\r\n ws.onclose = () => {\r\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\r\n handleReconnect()\r\n }\r\n\r\n ws.onerror = () => {\r\n dispatch({ type: 'SET_ERROR', error: 'Connection error' })\r\n }\r\n } else if (config.provider === 'webrtc') {\r\n // WebRTC implementation would go here\r\n dispatch({ type: 'SET_ERROR', error: 'WebRTC provider not yet implemented' })\r\n } else if (config.provider === 'custom') {\r\n // Custom provider - user handles connection\r\n dispatch({ type: 'SET_STATUS', status: 'connected' })\r\n }\r\n } catch (error) {\r\n dispatch({ type: 'SET_ERROR', error: error instanceof Error ? error.message : 'Connection failed' })\r\n }\r\n }, [config])\r\n\r\n /** Handle collaboration events */\r\n const handleCollaborationEvent = useCallback((event: CollaborationEvent) => {\r\n switch (event.type) {\r\n case 'user-joined':\r\n dispatch({ type: 'ADD_USER', user: event.user })\r\n break\r\n case 'user-left':\r\n dispatch({ type: 'REMOVE_USER', userId: event.userId })\r\n break\r\n case 'cursor-moved':\r\n dispatch({ type: 'UPDATE_CURSOR', userId: event.userId, cursor: event.cursor })\r\n break\r\n case 'status-changed':\r\n dispatch({ type: 'SET_STATUS', status: event.status })\r\n break\r\n case 'error':\r\n dispatch({ type: 'SET_ERROR', error: event.message })\r\n break\r\n }\r\n }, [])\r\n\r\n /** Handle reconnection */\r\n const handleReconnect = useCallback(() => {\r\n if (!config?.autoReconnect) return\r\n\r\n const maxAttempts = config.maxReconnectAttempts ?? 5\r\n const interval = config.reconnectInterval ?? 3000\r\n\r\n if (reconnectAttemptsRef.current >= maxAttempts) {\r\n dispatch({ type: 'SET_ERROR', error: 'Max reconnection attempts reached' })\r\n return\r\n }\r\n\r\n dispatch({ type: 'SET_STATUS', status: 'reconnecting' })\r\n reconnectAttemptsRef.current++\r\n\r\n reconnectTimeoutRef.current = setTimeout(() => {\r\n connect()\r\n }, interval)\r\n }, [config, connect])\r\n\r\n /** Disconnect from collaboration server */\r\n const disconnect = useCallback(() => {\r\n if (reconnectTimeoutRef.current) {\r\n clearTimeout(reconnectTimeoutRef.current)\r\n }\r\n\r\n if (wsRef.current) {\r\n wsRef.current.close()\r\n wsRef.current = null\r\n }\r\n\r\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\r\n dispatch({ type: 'SET_USERS', users: [] })\r\n }, [])\r\n\r\n /** Update cursor position */\r\n const updateCursor = useCallback((cursor: CursorPosition) => {\r\n if (!config || !wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) return\r\n\r\n wsRef.current.send(JSON.stringify({\r\n type: 'cursor',\r\n userId: config.user.id,\r\n cursor,\r\n }))\r\n }, [config])\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n disconnect()\r\n }\r\n }, [disconnect])\r\n\r\n const value: CollaborationContextValue = {\r\n state,\r\n config: config ?? null,\r\n connect,\r\n disconnect,\r\n updateCursor,\r\n isEnabled: !!config,\r\n }\r\n\r\n return (\r\n <CollaborationContext.Provider value={value}>\r\n {children}\r\n </CollaborationContext.Provider>\r\n )\r\n}\r\n\r\n/** Hook to use collaboration context */\r\nexport function useCollaboration() {\r\n const context = useContext(CollaborationContext)\r\n if (!context) {\r\n throw new Error('useCollaboration must be used within a CollaborationProvider')\r\n }\r\n return context\r\n}\r\n\r\n/** Hook to check if collaboration is available (doesn't throw) */\r\nexport function useCollaborationOptional() {\r\n return useContext(CollaborationContext)\r\n}\r\n\r\nexport default CollaborationContext\r\n","/**\r\n * Presence Indicator Component\r\n * Shows connected users with avatars and status\r\n */\r\n\r\nimport { useCollaborationOptional } from './CollaborationContext'\r\nimport type { CollaborationUser } from './types'\r\n\r\ninterface PresenceIndicatorProps {\r\n /** Maximum avatars to show before \"+N\" */\r\n maxAvatars?: number\r\n /** Show user names on hover */\r\n showNames?: boolean\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n/** Get initials from name */\r\nfunction getInitials(name: string): string {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2)\r\n}\r\n\r\n/** Single user avatar */\r\nfunction UserAvatar({ user, showName }: { user: CollaborationUser; showName?: boolean }) {\r\n return (\r\n <div\r\n className=\"rte-presence-avatar\"\r\n style={{ borderColor: user.color }}\r\n title={user.name}\r\n >\r\n {user.avatar ? (\r\n <img src={user.avatar} alt={user.name} />\r\n ) : (\r\n <span style={{ backgroundColor: user.color }}>\r\n {getInitials(user.name)}\r\n </span>\r\n )}\r\n {user.isActive && <div className=\"rte-presence-active-dot\" />}\r\n {showName && <div className=\"rte-presence-name\">{user.name}</div>}\r\n </div>\r\n )\r\n}\r\n\r\n/** Connection status badge */\r\nfunction StatusBadge({ status }: { status: string }) {\r\n const statusConfig: Record<string, { label: string; color: string }> = {\r\n connected: { label: 'Connected', color: '#22c55e' },\r\n connecting: { label: 'Connecting...', color: '#eab308' },\r\n reconnecting: { label: 'Reconnecting...', color: '#f97316' },\r\n disconnected: { label: 'Disconnected', color: '#6b7280' },\r\n error: { label: 'Error', color: '#ef4444' },\r\n }\r\n\r\n const config = statusConfig[status] || statusConfig.disconnected\r\n\r\n return (\r\n <div className=\"rte-presence-status\" style={{ color: config.color }}>\r\n <div className=\"rte-presence-status-dot\" style={{ backgroundColor: config.color }} />\r\n {config.label}\r\n </div>\r\n )\r\n}\r\n\r\n/** Presence Indicator Component */\r\nexport function PresenceIndicator({\r\n maxAvatars = 5,\r\n showNames = false,\r\n className = '',\r\n}: PresenceIndicatorProps) {\r\n const collaboration = useCollaborationOptional()\r\n\r\n if (!collaboration?.isEnabled) {\r\n return null\r\n }\r\n\r\n const { state } = collaboration\r\n const visibleUsers = state.users.slice(0, maxAvatars)\r\n const remainingCount = Math.max(0, state.users.length - maxAvatars)\r\n\r\n return (\r\n <div className={`rte-presence-indicator ${className}`}>\r\n <StatusBadge status={state.status} />\r\n\r\n {state.users.length > 0 && (\r\n <div className=\"rte-presence-avatars\">\r\n {visibleUsers.map(user => (\r\n <UserAvatar key={user.id} user={user} showName={showNames} />\r\n ))}\r\n {remainingCount > 0 && (\r\n <div className=\"rte-presence-avatar rte-presence-more\">\r\n +{remainingCount}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {state.error && (\r\n <div className=\"rte-presence-error\" title={state.error}>\r\n !\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default PresenceIndicator\r\n","/**\r\n * Comments & Annotations Types\r\n * Types for inline comments and annotation features\r\n */\r\n\r\n/** Comment author information */\r\nexport interface CommentAuthor {\r\n /** Unique user identifier */\r\n id: string\r\n /** Display name */\r\n name: string\r\n /** Avatar URL (optional) */\r\n avatar?: string\r\n}\r\n\r\n/** Text range for comment anchor */\r\nexport interface CommentRange {\r\n /** Start position in document */\r\n from: number\r\n /** End position in document */\r\n to: number\r\n /** Selected text content */\r\n text: string\r\n}\r\n\r\n/** Single comment in a thread */\r\nexport interface Comment {\r\n /** Unique comment identifier */\r\n id: string\r\n /** Thread this comment belongs to */\r\n threadId: string\r\n /** Comment content (can be HTML) */\r\n content: string\r\n /** Comment author */\r\n author: CommentAuthor\r\n /** Creation timestamp */\r\n createdAt: number\r\n /** Last update timestamp */\r\n updatedAt?: number\r\n /** Is this comment edited */\r\n isEdited: boolean\r\n /** Reactions on this comment */\r\n reactions?: CommentReaction[]\r\n}\r\n\r\n/** Reaction on a comment */\r\nexport interface CommentReaction {\r\n /** Emoji reaction */\r\n emoji: string\r\n /** Users who reacted */\r\n users: CommentAuthor[]\r\n}\r\n\r\n/** Comment thread (group of comments on a text range) */\r\nexport interface CommentThread {\r\n /** Unique thread identifier */\r\n id: string\r\n /** Text range this thread is attached to */\r\n range: CommentRange\r\n /** Comments in this thread */\r\n comments: Comment[]\r\n /** Thread status */\r\n status: 'open' | 'resolved'\r\n /** Thread creation timestamp */\r\n createdAt: number\r\n /** Thread resolution timestamp */\r\n resolvedAt?: number\r\n /** User who resolved the thread */\r\n resolvedBy?: CommentAuthor\r\n}\r\n\r\n/** Comment highlight type */\r\nexport type CommentHighlightType = 'active' | 'hover' | 'resolved' | 'default'\r\n\r\n/** Comments state */\r\nexport interface CommentsState {\r\n /** All comment threads */\r\n threads: CommentThread[]\r\n /** Currently active/selected thread ID */\r\n activeThreadId: string | null\r\n /** Is comment panel open */\r\n isPanelOpen: boolean\r\n /** Filter for threads */\r\n filter: 'all' | 'open' | 'resolved'\r\n /** Current user (for adding comments) */\r\n currentUser: CommentAuthor | null\r\n}\r\n\r\n/** Comment event types */\r\nexport type CommentEvent =\r\n | { type: 'thread-created'; thread: CommentThread }\r\n | { type: 'thread-deleted'; threadId: string }\r\n | { type: 'thread-resolved'; threadId: string; resolvedBy: CommentAuthor }\r\n | { type: 'thread-reopened'; threadId: string }\r\n | { type: 'comment-added'; threadId: string; comment: Comment }\r\n | { type: 'comment-updated'; threadId: string; comment: Comment }\r\n | { type: 'comment-deleted'; threadId: string; commentId: string }\r\n | { type: 'reaction-added'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\r\n | { type: 'reaction-removed'; threadId: string; commentId: string; emoji: string; userId: string }\r\n\r\n/** Comments configuration */\r\nexport interface CommentsConfig {\r\n /** Current user for adding comments */\r\n currentUser: CommentAuthor\r\n /** Allow resolving threads */\r\n allowResolve?: boolean\r\n /** Allow deleting comments */\r\n allowDelete?: boolean\r\n /** Allow editing comments */\r\n allowEdit?: boolean\r\n /** Allow reactions */\r\n allowReactions?: boolean\r\n /** Available reaction emojis */\r\n reactionEmojis?: string[]\r\n /** Callback to persist comments */\r\n onSave?: (threads: CommentThread[]) => Promise<void>\r\n /** Callback to load comments */\r\n onLoad?: () => Promise<CommentThread[]>\r\n}\r\n\r\n/** Props for comments-enabled editor */\r\nexport interface CommentsProps {\r\n /** Enable comments features */\r\n comments?: CommentsConfig\r\n /** Initial comment threads */\r\n initialThreads?: CommentThread[]\r\n /** Callback when threads change */\r\n onThreadsChange?: (threads: CommentThread[]) => void\r\n /** Show comment highlights in editor */\r\n showCommentHighlights?: boolean\r\n /** Show comment panel */\r\n showCommentPanel?: boolean\r\n /** Comment panel position */\r\n commentPanelPosition?: 'left' | 'right'\r\n}\r\n\r\n/** Default reaction emojis */\r\nexport const DEFAULT_REACTION_EMOJIS = ['๐Ÿ‘', '๐Ÿ‘Ž', 'โค๏ธ', '๐ŸŽ‰', '๐Ÿ˜„', '๐Ÿ˜•', '๐Ÿ‘€', '๐Ÿš€']\r\n","/**\r\n * Comments Context\r\n * Provides comments and annotations state and methods to child components\r\n */\r\n\r\nimport { createContext, useContext, useReducer, useCallback, useEffect, ReactNode } from 'react'\r\nimport type {\r\n CommentsState,\r\n CommentsConfig,\r\n CommentThread,\r\n Comment,\r\n CommentAuthor,\r\n CommentRange,\r\n CommentEvent,\r\n} from './types'\r\nimport { DEFAULT_REACTION_EMOJIS } from './types'\r\n\r\n/** Actions for comments reducer */\r\ntype CommentsAction =\r\n | { type: 'SET_THREADS'; threads: CommentThread[] }\r\n | { type: 'ADD_THREAD'; thread: CommentThread }\r\n | { type: 'DELETE_THREAD'; threadId: string }\r\n | { type: 'RESOLVE_THREAD'; threadId: string; resolvedBy: CommentAuthor }\r\n | { type: 'REOPEN_THREAD'; threadId: string }\r\n | { type: 'ADD_COMMENT'; threadId: string; comment: Comment }\r\n | { type: 'UPDATE_COMMENT'; threadId: string; comment: Comment }\r\n | { type: 'DELETE_COMMENT'; threadId: string; commentId: string }\r\n | { type: 'ADD_REACTION'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\r\n | { type: 'REMOVE_REACTION'; threadId: string; commentId: string; emoji: string; userId: string }\r\n | { type: 'SET_ACTIVE_THREAD'; threadId: string | null }\r\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\r\n | { type: 'SET_FILTER'; filter: 'all' | 'open' | 'resolved' }\r\n | { type: 'SET_CURRENT_USER'; user: CommentAuthor | null }\r\n\r\n/** Initial comments state */\r\nconst initialState: CommentsState = {\r\n threads: [],\r\n activeThreadId: null,\r\n isPanelOpen: false,\r\n filter: 'all',\r\n currentUser: null,\r\n}\r\n\r\n/** Generate unique ID */\r\nfunction generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n}\r\n\r\n/** Comments reducer */\r\nfunction commentsReducer(state: CommentsState, action: CommentsAction): CommentsState {\r\n switch (action.type) {\r\n case 'SET_THREADS':\r\n return { ...state, threads: action.threads }\r\n\r\n case 'ADD_THREAD':\r\n return { ...state, threads: [...state.threads, action.thread] }\r\n\r\n case 'DELETE_THREAD':\r\n return {\r\n ...state,\r\n threads: state.threads.filter(t => t.id !== action.threadId),\r\n activeThreadId: state.activeThreadId === action.threadId ? null : state.activeThreadId,\r\n }\r\n\r\n case 'RESOLVE_THREAD':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, status: 'resolved' as const, resolvedAt: Date.now(), resolvedBy: action.resolvedBy }\r\n : t\r\n ),\r\n }\r\n\r\n case 'REOPEN_THREAD':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, status: 'open' as const, resolvedAt: undefined, resolvedBy: undefined }\r\n : t\r\n ),\r\n }\r\n\r\n case 'ADD_COMMENT':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, comments: [...t.comments, action.comment] }\r\n : t\r\n ),\r\n }\r\n\r\n case 'UPDATE_COMMENT':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? {\r\n ...t,\r\n comments: t.comments.map(c =>\r\n c.id === action.comment.id ? action.comment : c\r\n ),\r\n }\r\n : t\r\n ),\r\n }\r\n\r\n case 'DELETE_COMMENT':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, comments: t.comments.filter(c => c.id !== action.commentId) }\r\n : t\r\n ),\r\n }\r\n\r\n case 'ADD_REACTION':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? {\r\n ...t,\r\n comments: t.comments.map(c => {\r\n if (c.id !== action.commentId) return c\r\n const reactions = c.reactions || []\r\n const existingReaction = reactions.find(r => r.emoji === action.emoji)\r\n if (existingReaction) {\r\n return {\r\n ...c,\r\n reactions: reactions.map(r =>\r\n r.emoji === action.emoji\r\n ? { ...r, users: [...r.users, action.user] }\r\n : r\r\n ),\r\n }\r\n }\r\n return {\r\n ...c,\r\n reactions: [...reactions, { emoji: action.emoji, users: [action.user] }],\r\n }\r\n }),\r\n }\r\n : t\r\n ),\r\n }\r\n\r\n case 'REMOVE_REACTION':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? {\r\n ...t,\r\n comments: t.comments.map(c => {\r\n if (c.id !== action.commentId) return c\r\n return {\r\n ...c,\r\n reactions: (c.reactions || [])\r\n .map(r =>\r\n r.emoji === action.emoji\r\n ? { ...r, users: r.users.filter(u => u.id !== action.userId) }\r\n : r\r\n )\r\n .filter(r => r.users.length > 0),\r\n }\r\n }),\r\n }\r\n : t\r\n ),\r\n }\r\n\r\n case 'SET_ACTIVE_THREAD':\r\n return { ...state, activeThreadId: action.threadId }\r\n\r\n case 'TOGGLE_PANEL':\r\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\r\n\r\n case 'SET_FILTER':\r\n return { ...state, filter: action.filter }\r\n\r\n case 'SET_CURRENT_USER':\r\n return { ...state, currentUser: action.user }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n/** Context value type */\r\ninterface CommentsContextValue {\r\n state: CommentsState\r\n config: CommentsConfig | null\r\n\r\n // Thread operations\r\n createThread: (range: CommentRange, initialComment: string) => CommentThread | null\r\n deleteThread: (threadId: string) => void\r\n resolveThread: (threadId: string) => void\r\n reopenThread: (threadId: string) => void\r\n\r\n // Comment operations\r\n addComment: (threadId: string, content: string) => Comment | null\r\n updateComment: (threadId: string, commentId: string, content: string) => void\r\n deleteComment: (threadId: string, commentId: string) => void\r\n\r\n // Reaction operations\r\n addReaction: (threadId: string, commentId: string, emoji: string) => void\r\n removeReaction: (threadId: string, commentId: string, emoji: string) => void\r\n\r\n // UI operations\r\n setActiveThread: (threadId: string | null) => void\r\n togglePanel: (isOpen?: boolean) => void\r\n setFilter: (filter: 'all' | 'open' | 'resolved') => void\r\n\r\n // Getters\r\n getThreadByRange: (from: number, to: number) => CommentThread | undefined\r\n getFilteredThreads: () => CommentThread[]\r\n\r\n // Event subscription\r\n subscribe: (callback: (event: CommentEvent) => void) => () => void\r\n\r\n isEnabled: boolean\r\n}\r\n\r\n/** Create context */\r\nconst CommentsContext = createContext<CommentsContextValue | null>(null)\r\n\r\n/** Provider props */\r\ninterface CommentsProviderProps {\r\n children: ReactNode\r\n config?: CommentsConfig\r\n initialThreads?: CommentThread[]\r\n onThreadsChange?: (threads: CommentThread[]) => void\r\n}\r\n\r\n/** Comments Provider Component */\r\nexport function CommentsProvider({\r\n children,\r\n config,\r\n initialThreads = [],\r\n onThreadsChange,\r\n}: CommentsProviderProps) {\r\n const [state, dispatch] = useReducer(commentsReducer, {\r\n ...initialState,\r\n threads: initialThreads,\r\n currentUser: config?.currentUser ?? null,\r\n })\r\n\r\n const subscribersRef = { current: new Set<(event: CommentEvent) => void>() }\r\n\r\n // Load initial threads\r\n useEffect(() => {\r\n if (config?.onLoad) {\r\n config.onLoad().then(threads => {\r\n dispatch({ type: 'SET_THREADS', threads })\r\n })\r\n }\r\n }, [config])\r\n\r\n // Notify on threads change\r\n useEffect(() => {\r\n onThreadsChange?.(state.threads)\r\n if (config?.onSave) {\r\n config.onSave(state.threads)\r\n }\r\n }, [state.threads, onThreadsChange, config])\r\n\r\n // Update current user when config changes\r\n useEffect(() => {\r\n if (config?.currentUser) {\r\n dispatch({ type: 'SET_CURRENT_USER', user: config.currentUser })\r\n }\r\n }, [config?.currentUser])\r\n\r\n /** Emit event to subscribers */\r\n const emitEvent = useCallback((event: CommentEvent) => {\r\n subscribersRef.current.forEach(callback => callback(event))\r\n }, [])\r\n\r\n /** Create a new thread */\r\n const createThread = useCallback((range: CommentRange, initialComment: string): CommentThread | null => {\r\n if (!state.currentUser) return null\r\n\r\n const threadId = generateId()\r\n const commentId = generateId()\r\n const now = Date.now()\r\n\r\n const comment: Comment = {\r\n id: commentId,\r\n threadId,\r\n content: initialComment,\r\n author: state.currentUser,\r\n createdAt: now,\r\n isEdited: false,\r\n }\r\n\r\n const thread: CommentThread = {\r\n id: threadId,\r\n range,\r\n comments: [comment],\r\n status: 'open',\r\n createdAt: now,\r\n }\r\n\r\n dispatch({ type: 'ADD_THREAD', thread })\r\n emitEvent({ type: 'thread-created', thread })\r\n return thread\r\n }, [state.currentUser, emitEvent])\r\n\r\n /** Delete a thread */\r\n const deleteThread = useCallback((threadId: string) => {\r\n if (config?.allowDelete === false) return\r\n dispatch({ type: 'DELETE_THREAD', threadId })\r\n emitEvent({ type: 'thread-deleted', threadId })\r\n }, [config, emitEvent])\r\n\r\n /** Resolve a thread */\r\n const resolveThread = useCallback((threadId: string) => {\r\n if (!state.currentUser || config?.allowResolve === false) return\r\n dispatch({ type: 'RESOLVE_THREAD', threadId, resolvedBy: state.currentUser })\r\n emitEvent({ type: 'thread-resolved', threadId, resolvedBy: state.currentUser })\r\n }, [state.currentUser, config, emitEvent])\r\n\r\n /** Reopen a thread */\r\n const reopenThread = useCallback((threadId: string) => {\r\n dispatch({ type: 'REOPEN_THREAD', threadId })\r\n emitEvent({ type: 'thread-reopened', threadId })\r\n }, [emitEvent])\r\n\r\n /** Add a comment to a thread */\r\n const addComment = useCallback((threadId: string, content: string): Comment | null => {\r\n if (!state.currentUser) return null\r\n\r\n const comment: Comment = {\r\n id: generateId(),\r\n threadId,\r\n content,\r\n author: state.currentUser,\r\n createdAt: Date.now(),\r\n isEdited: false,\r\n }\r\n\r\n dispatch({ type: 'ADD_COMMENT', threadId, comment })\r\n emitEvent({ type: 'comment-added', threadId, comment })\r\n return comment\r\n }, [state.currentUser, emitEvent])\r\n\r\n /** Update a comment */\r\n const updateComment = useCallback((threadId: string, commentId: string, content: string) => {\r\n if (config?.allowEdit === false) return\r\n\r\n const thread = state.threads.find(t => t.id === threadId)\r\n const existingComment = thread?.comments.find(c => c.id === commentId)\r\n if (!existingComment) return\r\n\r\n const updatedComment: Comment = {\r\n ...existingComment,\r\n content,\r\n updatedAt: Date.now(),\r\n isEdited: true,\r\n }\r\n\r\n dispatch({ type: 'UPDATE_COMMENT', threadId, comment: updatedComment })\r\n emitEvent({ type: 'comment-updated', threadId, comment: updatedComment })\r\n }, [state.threads, config, emitEvent])\r\n\r\n /** Delete a comment */\r\n const deleteComment = useCallback((threadId: string, commentId: string) => {\r\n if (config?.allowDelete === false) return\r\n dispatch({ type: 'DELETE_COMMENT', threadId, commentId })\r\n emitEvent({ type: 'comment-deleted', threadId, commentId })\r\n }, [config, emitEvent])\r\n\r\n /** Add a reaction */\r\n const addReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\r\n if (!state.currentUser || config?.allowReactions === false) return\r\n\r\n const allowedEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\r\n if (!allowedEmojis.includes(emoji)) return\r\n\r\n dispatch({ type: 'ADD_REACTION', threadId, commentId, emoji, user: state.currentUser })\r\n emitEvent({ type: 'reaction-added', threadId, commentId, emoji, user: state.currentUser })\r\n }, [state.currentUser, config, emitEvent])\r\n\r\n /** Remove a reaction */\r\n const removeReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\r\n if (!state.currentUser) return\r\n dispatch({ type: 'REMOVE_REACTION', threadId, commentId, emoji, userId: state.currentUser.id })\r\n emitEvent({ type: 'reaction-removed', threadId, commentId, emoji, userId: state.currentUser.id })\r\n }, [state.currentUser, emitEvent])\r\n\r\n /** Set active thread */\r\n const setActiveThread = useCallback((threadId: string | null) => {\r\n dispatch({ type: 'SET_ACTIVE_THREAD', threadId })\r\n }, [])\r\n\r\n /** Toggle panel */\r\n const togglePanel = useCallback((isOpen?: boolean) => {\r\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\r\n }, [])\r\n\r\n /** Set filter */\r\n const setFilter = useCallback((filter: 'all' | 'open' | 'resolved') => {\r\n dispatch({ type: 'SET_FILTER', filter })\r\n }, [])\r\n\r\n /** Get thread by range */\r\n const getThreadByRange = useCallback((from: number, to: number) => {\r\n return state.threads.find(t => t.range.from === from && t.range.to === to)\r\n }, [state.threads])\r\n\r\n /** Get filtered threads */\r\n const getFilteredThreads = useCallback(() => {\r\n if (state.filter === 'all') return state.threads\r\n return state.threads.filter(t => t.status === state.filter)\r\n }, [state.threads, state.filter])\r\n\r\n /** Subscribe to events */\r\n const subscribe = useCallback((callback: (event: CommentEvent) => void) => {\r\n subscribersRef.current.add(callback)\r\n return () => {\r\n subscribersRef.current.delete(callback)\r\n }\r\n }, [])\r\n\r\n const value: CommentsContextValue = {\r\n state,\r\n config: config ?? null,\r\n createThread,\r\n deleteThread,\r\n resolveThread,\r\n reopenThread,\r\n addComment,\r\n updateComment,\r\n deleteComment,\r\n addReaction,\r\n removeReaction,\r\n setActiveThread,\r\n togglePanel,\r\n setFilter,\r\n getThreadByRange,\r\n getFilteredThreads,\r\n subscribe,\r\n isEnabled: !!config,\r\n }\r\n\r\n return (\r\n <CommentsContext.Provider value={value}>\r\n {children}\r\n </CommentsContext.Provider>\r\n )\r\n}\r\n\r\n/** Hook to use comments context */\r\nexport function useComments() {\r\n const context = useContext(CommentsContext)\r\n if (!context) {\r\n throw new Error('useComments must be used within a CommentsProvider')\r\n }\r\n return context\r\n}\r\n\r\n/** Hook to check if comments is available (doesn't throw) */\r\nexport function useCommentsOptional() {\r\n return useContext(CommentsContext)\r\n}\r\n\r\nexport default CommentsContext\r\n","/**\r\n * Comments Panel Component\r\n * Displays comment threads with reply functionality\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { useCommentsOptional } from './CommentsContext'\r\nimport type { CommentThread, Comment as CommentType } from './types'\r\nimport { DEFAULT_REACTION_EMOJIS } from './types'\r\n\r\ninterface CommentsPanelProps {\r\n /** Panel position */\r\n position?: 'left' | 'right'\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n/** Format relative time */\r\nfunction formatRelativeTime(timestamp: number): string {\r\n const now = Date.now()\r\n const diff = now - timestamp\r\n const minutes = Math.floor(diff / 60000)\r\n const hours = Math.floor(diff / 3600000)\r\n const days = Math.floor(diff / 86400000)\r\n\r\n if (minutes < 1) return 'Just now'\r\n if (minutes < 60) return `${minutes}m ago`\r\n if (hours < 24) return `${hours}h ago`\r\n if (days < 7) return `${days}d ago`\r\n\r\n return new Date(timestamp).toLocaleDateString()\r\n}\r\n\r\n/** Single comment component */\r\nfunction CommentItem({\r\n comment,\r\n threadId,\r\n isFirst,\r\n}: {\r\n comment: CommentType\r\n threadId: string\r\n isFirst: boolean\r\n}) {\r\n const comments = useCommentsOptional()\r\n const [isEditing, setIsEditing] = useState(false)\r\n const [editContent, setEditContent] = useState(comment.content)\r\n const [showReactions, setShowReactions] = useState(false)\r\n\r\n if (!comments) return null\r\n\r\n const { config, updateComment, deleteComment, addReaction, removeReaction, state } = comments\r\n const canEdit = config?.allowEdit !== false && comment.author.id === state.currentUser?.id\r\n const canDelete = config?.allowDelete !== false && comment.author.id === state.currentUser?.id\r\n const canReact = config?.allowReactions !== false\r\n const reactionEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\r\n\r\n const handleSaveEdit = () => {\r\n updateComment(threadId, comment.id, editContent)\r\n setIsEditing(false)\r\n }\r\n\r\n const handleToggleReaction = (emoji: string) => {\r\n const reaction = comment.reactions?.find(r => r.emoji === emoji)\r\n const hasReacted = reaction?.users.some(u => u.id === state.currentUser?.id)\r\n\r\n if (hasReacted) {\r\n removeReaction(threadId, comment.id, emoji)\r\n } else {\r\n addReaction(threadId, comment.id, emoji)\r\n }\r\n setShowReactions(false)\r\n }\r\n\r\n return (\r\n <div className={`rte-comment ${isFirst ? 'rte-comment-first' : ''}`}>\r\n <div className=\"rte-comment-header\">\r\n <div className=\"rte-comment-author\">\r\n {comment.author.avatar ? (\r\n <img src={comment.author.avatar} alt={comment.author.name} className=\"rte-comment-avatar\" />\r\n ) : (\r\n <div className=\"rte-comment-avatar-placeholder\">\r\n {comment.author.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n <span className=\"rte-comment-author-name\">{comment.author.name}</span>\r\n </div>\r\n <span className=\"rte-comment-time\">\r\n {formatRelativeTime(comment.createdAt)}\r\n {comment.isEdited && ' (edited)'}\r\n </span>\r\n </div>\r\n\r\n {isEditing ? (\r\n <div className=\"rte-comment-edit\">\r\n <textarea\r\n value={editContent}\r\n onChange={e => setEditContent(e.target.value)}\r\n className=\"rte-comment-edit-input\"\r\n />\r\n <div className=\"rte-comment-edit-actions\">\r\n <button onClick={handleSaveEdit} className=\"rte-comment-btn-save\">Save</button>\r\n <button onClick={() => setIsEditing(false)} className=\"rte-comment-btn-cancel\">Cancel</button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"rte-comment-content\" dangerouslySetInnerHTML={{ __html: comment.content }} />\r\n )}\r\n\r\n {/* Reactions */}\r\n {comment.reactions && comment.reactions.length > 0 && (\r\n <div className=\"rte-comment-reactions\">\r\n {comment.reactions.map(reaction => (\r\n <button\r\n key={reaction.emoji}\r\n className={`rte-comment-reaction ${\r\n reaction.users.some(u => u.id === state.currentUser?.id) ? 'active' : ''\r\n }`}\r\n onClick={() => handleToggleReaction(reaction.emoji)}\r\n title={reaction.users.map(u => u.name).join(', ')}\r\n >\r\n {reaction.emoji} {reaction.users.length}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"rte-comment-actions\">\r\n {canReact && (\r\n <div className=\"rte-comment-reaction-picker\">\r\n <button\r\n className=\"rte-comment-action-btn\"\r\n onClick={() => setShowReactions(!showReactions)}\r\n >\r\n ๐Ÿ˜Š\r\n </button>\r\n {showReactions && (\r\n <div className=\"rte-comment-reaction-dropdown\">\r\n {reactionEmojis.map(emoji => (\r\n <button key={emoji} onClick={() => handleToggleReaction(emoji)}>\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {canEdit && (\r\n <button className=\"rte-comment-action-btn\" onClick={() => setIsEditing(true)}>\r\n Edit\r\n </button>\r\n )}\r\n {canDelete && !isFirst && (\r\n <button\r\n className=\"rte-comment-action-btn rte-comment-action-delete\"\r\n onClick={() => deleteComment(threadId, comment.id)}\r\n >\r\n Delete\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Thread component */\r\nfunction ThreadItem({ thread }: { thread: CommentThread }) {\r\n const comments = useCommentsOptional()\r\n const [replyContent, setReplyContent] = useState('')\r\n const [showReply, setShowReply] = useState(false)\r\n\r\n if (!comments) return null\r\n\r\n const { state, setActiveThread, addComment, resolveThread, reopenThread, deleteThread, config } = comments\r\n const isActive = state.activeThreadId === thread.id\r\n const canResolve = config?.allowResolve !== false\r\n\r\n const handleReply = () => {\r\n if (replyContent.trim()) {\r\n addComment(thread.id, replyContent)\r\n setReplyContent('')\r\n setShowReply(false)\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={`rte-thread ${isActive ? 'rte-thread-active' : ''} ${\r\n thread.status === 'resolved' ? 'rte-thread-resolved' : ''\r\n }`}\r\n onClick={() => setActiveThread(thread.id)}\r\n >\r\n {/* Thread header */}\r\n <div className=\"rte-thread-header\">\r\n <div className=\"rte-thread-quote\">\"{thread.range.text.slice(0, 50)}...\"</div>\r\n <div className=\"rte-thread-meta\">\r\n <span className={`rte-thread-status rte-thread-status-${thread.status}`}>\r\n {thread.status}\r\n </span>\r\n <span className=\"rte-thread-count\">{thread.comments.length} comment{thread.comments.length !== 1 ? 's' : ''}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Comments */}\r\n <div className=\"rte-thread-comments\">\r\n {thread.comments.map((comment, index) => (\r\n <CommentItem\r\n key={comment.id}\r\n comment={comment}\r\n threadId={thread.id}\r\n isFirst={index === 0}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Reply form */}\r\n {thread.status === 'open' && (\r\n <div className=\"rte-thread-reply\">\r\n {showReply ? (\r\n <>\r\n <textarea\r\n value={replyContent}\r\n onChange={e => setReplyContent(e.target.value)}\r\n placeholder=\"Write a reply...\"\r\n className=\"rte-thread-reply-input\"\r\n />\r\n <div className=\"rte-thread-reply-actions\">\r\n <button onClick={handleReply} className=\"rte-btn-primary\" disabled={!replyContent.trim()}>\r\n Reply\r\n </button>\r\n <button onClick={() => setShowReply(false)} className=\"rte-btn-secondary\">\r\n Cancel\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <button onClick={() => setShowReply(true)} className=\"rte-thread-reply-btn\">\r\n Reply\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Thread actions */}\r\n <div className=\"rte-thread-actions\">\r\n {canResolve && thread.status === 'open' && (\r\n <button onClick={() => resolveThread(thread.id)} className=\"rte-btn-resolve\">\r\n โœ“ Resolve\r\n </button>\r\n )}\r\n {thread.status === 'resolved' && (\r\n <button onClick={() => reopenThread(thread.id)} className=\"rte-btn-reopen\">\r\n Reopen\r\n </button>\r\n )}\r\n <button\r\n onClick={e => {\r\n e.stopPropagation()\r\n deleteThread(thread.id)\r\n }}\r\n className=\"rte-btn-delete-thread\"\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Comments Panel Component */\r\nexport function CommentsPanel({ position = 'right', className = '' }: CommentsPanelProps) {\r\n const comments = useCommentsOptional()\r\n\r\n if (!comments?.isEnabled || !comments.state.isPanelOpen) {\r\n return null\r\n }\r\n\r\n const { state, togglePanel, setFilter, getFilteredThreads } = comments\r\n const filteredThreads = getFilteredThreads()\r\n\r\n return (\r\n <div className={`rte-comments-panel rte-comments-panel-${position} ${className}`}>\r\n {/* Panel header */}\r\n <div className=\"rte-comments-panel-header\">\r\n <h3>Comments</h3>\r\n <button onClick={() => togglePanel(false)} className=\"rte-comments-close-btn\">ร—</button>\r\n </div>\r\n\r\n {/* Filter tabs */}\r\n <div className=\"rte-comments-filters\">\r\n {(['all', 'open', 'resolved'] as const).map(filter => (\r\n <button\r\n key={filter}\r\n className={`rte-comments-filter ${state.filter === filter ? 'active' : ''}`}\r\n onClick={() => setFilter(filter)}\r\n >\r\n {filter.charAt(0).toUpperCase() + filter.slice(1)}\r\n <span className=\"rte-comments-filter-count\">\r\n {filter === 'all'\r\n ? state.threads.length\r\n : state.threads.filter(t => t.status === filter).length}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Threads list */}\r\n <div className=\"rte-comments-list\">\r\n {filteredThreads.length === 0 ? (\r\n <div className=\"rte-comments-empty\">\r\n {state.filter === 'all'\r\n ? 'No comments yet. Select text and add a comment.'\r\n : `No ${state.filter} comments.`}\r\n </div>\r\n ) : (\r\n filteredThreads.map(thread => (\r\n <ThreadItem key={thread.id} thread={thread} />\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default CommentsPanel\r\n","/**\r\n * Version History Context\r\n * Provides version history state and methods to child components\r\n */\r\n\r\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\r\nimport type {\r\n VersionHistoryState,\r\n VersionHistoryConfig,\r\n Version,\r\n VersionComparison,\r\n VersionChange,\r\n VersionHistoryEvent,\r\n} from './types'\r\n\r\n/** Actions for version history reducer */\r\ntype VersionHistoryAction =\r\n | { type: 'SET_VERSIONS'; versions: Version[] }\r\n | { type: 'ADD_VERSION'; version: Version }\r\n | { type: 'DELETE_VERSION'; versionId: string }\r\n | { type: 'PIN_VERSION'; versionId: string }\r\n | { type: 'UNPIN_VERSION'; versionId: string }\r\n | { type: 'RENAME_VERSION'; versionId: string; title: string }\r\n | { type: 'SET_VIEWING_VERSION'; versionId: string | null }\r\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\r\n | { type: 'START_COMPARE'; fromId: string; toId: string }\r\n | { type: 'STOP_COMPARE' }\r\n | { type: 'SET_AUTO_SAVE'; enabled: boolean }\r\n | { type: 'SET_AUTO_SAVE_INTERVAL'; interval: number }\r\n\r\n/** Initial version history state */\r\nconst initialState: VersionHistoryState = {\r\n versions: [],\r\n viewingVersionId: null,\r\n isPanelOpen: false,\r\n isComparing: false,\r\n compareFromId: null,\r\n compareToId: null,\r\n autoSaveEnabled: true,\r\n autoSaveInterval: 60000,\r\n}\r\n\r\n/** Generate unique ID */\r\nfunction generateId(): string {\r\n return `v-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n}\r\n\r\n/** Version history reducer */\r\nfunction versionHistoryReducer(state: VersionHistoryState, action: VersionHistoryAction): VersionHistoryState {\r\n switch (action.type) {\r\n case 'SET_VERSIONS':\r\n return { ...state, versions: action.versions }\r\n\r\n case 'ADD_VERSION':\r\n return {\r\n ...state,\r\n versions: [action.version, ...state.versions],\r\n }\r\n\r\n case 'DELETE_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.filter(v => v.id !== action.versionId),\r\n viewingVersionId: state.viewingVersionId === action.versionId ? null : state.viewingVersionId,\r\n }\r\n\r\n case 'PIN_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.map(v =>\r\n v.id === action.versionId ? { ...v, isPinned: true } : v\r\n ),\r\n }\r\n\r\n case 'UNPIN_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.map(v =>\r\n v.id === action.versionId ? { ...v, isPinned: false } : v\r\n ),\r\n }\r\n\r\n case 'RENAME_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.map(v =>\r\n v.id === action.versionId ? { ...v, title: action.title } : v\r\n ),\r\n }\r\n\r\n case 'SET_VIEWING_VERSION':\r\n return { ...state, viewingVersionId: action.versionId }\r\n\r\n case 'TOGGLE_PANEL':\r\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\r\n\r\n case 'START_COMPARE':\r\n return {\r\n ...state,\r\n isComparing: true,\r\n compareFromId: action.fromId,\r\n compareToId: action.toId,\r\n }\r\n\r\n case 'STOP_COMPARE':\r\n return {\r\n ...state,\r\n isComparing: false,\r\n compareFromId: null,\r\n compareToId: null,\r\n }\r\n\r\n case 'SET_AUTO_SAVE':\r\n return { ...state, autoSaveEnabled: action.enabled }\r\n\r\n case 'SET_AUTO_SAVE_INTERVAL':\r\n return { ...state, autoSaveInterval: action.interval }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n/** Count words in text */\r\nfunction countWords(text: string): number {\r\n return text.trim().split(/\\s+/).filter(Boolean).length\r\n}\r\n\r\n/** Simple diff algorithm for version comparison */\r\nfunction computeDiff(oldText: string, newText: string): VersionChange[] {\r\n const changes: VersionChange[] = []\r\n const oldLines = oldText.split('\\n')\r\n const newLines = newText.split('\\n')\r\n\r\n let i = 0\r\n let j = 0\r\n\r\n while (i < oldLines.length || j < newLines.length) {\r\n if (i >= oldLines.length) {\r\n // Remaining new lines are additions\r\n changes.push({\r\n type: 'addition',\r\n content: newLines[j],\r\n position: j,\r\n })\r\n j++\r\n } else if (j >= newLines.length) {\r\n // Remaining old lines are deletions\r\n changes.push({\r\n type: 'deletion',\r\n content: oldLines[i],\r\n position: i,\r\n })\r\n i++\r\n } else if (oldLines[i] === newLines[j]) {\r\n // Lines match, move on\r\n i++\r\n j++\r\n } else {\r\n // Lines differ - check if it's a modification or add/delete\r\n const oldLineInNew = newLines.indexOf(oldLines[i], j)\r\n const newLineInOld = oldLines.indexOf(newLines[j], i)\r\n\r\n if (oldLineInNew === -1 && newLineInOld === -1) {\r\n // Modification\r\n changes.push({\r\n type: 'modification',\r\n content: `${oldLines[i]} -> ${newLines[j]}`,\r\n position: i,\r\n })\r\n i++\r\n j++\r\n } else if (oldLineInNew === -1) {\r\n // Deletion\r\n changes.push({\r\n type: 'deletion',\r\n content: oldLines[i],\r\n position: i,\r\n })\r\n i++\r\n } else {\r\n // Addition\r\n changes.push({\r\n type: 'addition',\r\n content: newLines[j],\r\n position: j,\r\n })\r\n j++\r\n }\r\n }\r\n }\r\n\r\n return changes\r\n}\r\n\r\n/** Context value type */\r\ninterface VersionHistoryContextValue {\r\n state: VersionHistoryState\r\n config: VersionHistoryConfig | null\r\n\r\n // Version operations\r\n createVersion: (content: string, jsonContent?: unknown, options?: { title?: string; isAutoSave?: boolean }) => Version | null\r\n deleteVersion: (versionId: string) => void\r\n restoreVersion: (versionId: string) => string | null\r\n pinVersion: (versionId: string) => void\r\n unpinVersion: (versionId: string) => void\r\n renameVersion: (versionId: string, title: string) => void\r\n\r\n // Viewing operations\r\n viewVersion: (versionId: string | null) => void\r\n getVersionContent: (versionId: string) => string | null\r\n\r\n // Comparison operations\r\n compareVersions: (fromId: string, toId: string) => VersionComparison | null\r\n startCompare: (fromId: string, toId: string) => void\r\n stopCompare: () => void\r\n\r\n // UI operations\r\n togglePanel: (isOpen?: boolean) => void\r\n setAutoSave: (enabled: boolean) => void\r\n\r\n // Getters\r\n getVersion: (versionId: string) => Version | undefined\r\n getLatestVersion: () => Version | undefined\r\n getPinnedVersions: () => Version[]\r\n\r\n // Event subscription\r\n subscribe: (callback: (event: VersionHistoryEvent) => void) => () => void\r\n\r\n isEnabled: boolean\r\n}\r\n\r\n/** Create context */\r\nconst VersionHistoryContext = createContext<VersionHistoryContextValue | null>(null)\r\n\r\n/** Provider props */\r\ninterface VersionHistoryProviderProps {\r\n children: ReactNode\r\n config?: VersionHistoryConfig\r\n initialVersions?: Version[]\r\n onVersionsChange?: (versions: Version[]) => void\r\n getCurrentContent?: () => { html: string; json?: unknown; text: string }\r\n}\r\n\r\n/** Version History Provider Component */\r\nexport function VersionHistoryProvider({\r\n children,\r\n config,\r\n initialVersions = [],\r\n onVersionsChange,\r\n getCurrentContent,\r\n}: VersionHistoryProviderProps) {\r\n const [state, dispatch] = useReducer(versionHistoryReducer, {\r\n ...initialState,\r\n versions: initialVersions,\r\n autoSaveEnabled: config?.autoSave ?? true,\r\n autoSaveInterval: config?.autoSaveInterval ?? 60000,\r\n })\r\n\r\n const subscribersRef = useRef(new Set<(event: VersionHistoryEvent) => void>())\r\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\r\n const lastContentRef = useRef<string>('')\r\n const versionNumberRef = useRef(initialVersions.length)\r\n\r\n // Load initial versions\r\n useEffect(() => {\r\n if (config?.onLoad) {\r\n config.onLoad().then(versions => {\r\n dispatch({ type: 'SET_VERSIONS', versions })\r\n versionNumberRef.current = versions.length\r\n })\r\n }\r\n }, [config])\r\n\r\n // Notify on versions change\r\n useEffect(() => {\r\n onVersionsChange?.(state.versions)\r\n if (config?.onSave) {\r\n config.onSave(state.versions)\r\n }\r\n }, [state.versions, onVersionsChange, config])\r\n\r\n // Auto-save timer\r\n useEffect(() => {\r\n if (!state.autoSaveEnabled || !config || !getCurrentContent) return\r\n\r\n autoSaveTimerRef.current = setInterval(() => {\r\n const { html, json } = getCurrentContent()\r\n\r\n // Only save if content changed\r\n if (html !== lastContentRef.current) {\r\n lastContentRef.current = html\r\n createVersion(html, json, { isAutoSave: true })\r\n }\r\n }, state.autoSaveInterval)\r\n\r\n return () => {\r\n if (autoSaveTimerRef.current) {\r\n clearInterval(autoSaveTimerRef.current)\r\n }\r\n }\r\n }, [state.autoSaveEnabled, state.autoSaveInterval, config, getCurrentContent])\r\n\r\n /** Emit event to subscribers */\r\n const emitEvent = useCallback((event: VersionHistoryEvent) => {\r\n subscribersRef.current.forEach(callback => callback(event))\r\n }, [])\r\n\r\n /** Create a new version */\r\n const createVersion = useCallback((\r\n content: string,\r\n jsonContent?: unknown,\r\n options?: { title?: string; isAutoSave?: boolean }\r\n ): Version | null => {\r\n if (!config?.currentUser) return null\r\n\r\n // Check max versions\r\n const maxVersions = config.maxVersions ?? 100\r\n let versions = state.versions\r\n\r\n if (versions.length >= maxVersions) {\r\n // Remove oldest non-pinned version\r\n const oldestUnpinned = [...versions].reverse().find(v => !v.isPinned)\r\n if (oldestUnpinned) {\r\n versions = versions.filter(v => v.id !== oldestUnpinned.id)\r\n }\r\n }\r\n\r\n versionNumberRef.current++\r\n const textContent = content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\r\n\r\n const version: Version = {\r\n id: generateId(),\r\n number: versionNumberRef.current,\r\n title: options?.title,\r\n content,\r\n jsonContent,\r\n textContent,\r\n author: config.currentUser,\r\n createdAt: Date.now(),\r\n wordCount: countWords(textContent),\r\n characterCount: textContent.length,\r\n isAutoSave: options?.isAutoSave ?? false,\r\n isPinned: false,\r\n }\r\n\r\n dispatch({ type: 'ADD_VERSION', version })\r\n emitEvent({ type: 'version-created', version })\r\n return version\r\n }, [config, state.versions, emitEvent])\r\n\r\n /** Delete a version */\r\n const deleteVersion = useCallback((versionId: string) => {\r\n dispatch({ type: 'DELETE_VERSION', versionId })\r\n emitEvent({ type: 'version-deleted', versionId })\r\n }, [emitEvent])\r\n\r\n /** Restore a version */\r\n const restoreVersion = useCallback((versionId: string): string | null => {\r\n const version = state.versions.find(v => v.id === versionId)\r\n if (!version) return null\r\n\r\n config?.onRestore?.(version)\r\n emitEvent({ type: 'version-restored', versionId })\r\n return version.content\r\n }, [state.versions, config, emitEvent])\r\n\r\n /** Pin a version */\r\n const pinVersion = useCallback((versionId: string) => {\r\n dispatch({ type: 'PIN_VERSION', versionId })\r\n emitEvent({ type: 'version-pinned', versionId })\r\n }, [emitEvent])\r\n\r\n /** Unpin a version */\r\n const unpinVersion = useCallback((versionId: string) => {\r\n dispatch({ type: 'UNPIN_VERSION', versionId })\r\n emitEvent({ type: 'version-unpinned', versionId })\r\n }, [emitEvent])\r\n\r\n /** Rename a version */\r\n const renameVersion = useCallback((versionId: string, title: string) => {\r\n dispatch({ type: 'RENAME_VERSION', versionId, title })\r\n emitEvent({ type: 'version-renamed', versionId, title })\r\n }, [emitEvent])\r\n\r\n /** View a version */\r\n const viewVersion = useCallback((versionId: string | null) => {\r\n dispatch({ type: 'SET_VIEWING_VERSION', versionId })\r\n }, [])\r\n\r\n /** Get version content */\r\n const getVersionContent = useCallback((versionId: string): string | null => {\r\n const version = state.versions.find(v => v.id === versionId)\r\n return version?.content ?? null\r\n }, [state.versions])\r\n\r\n /** Compare two versions */\r\n const compareVersions = useCallback((fromId: string, toId: string): VersionComparison | null => {\r\n const fromVersion = state.versions.find(v => v.id === fromId)\r\n const toVersion = state.versions.find(v => v.id === toId)\r\n\r\n if (!fromVersion || !toVersion) return null\r\n\r\n const changes = computeDiff(fromVersion.textContent, toVersion.textContent)\r\n\r\n return {\r\n fromVersionId: fromId,\r\n toVersionId: toId,\r\n changes,\r\n stats: {\r\n additions: changes.filter(c => c.type === 'addition').length,\r\n deletions: changes.filter(c => c.type === 'deletion').length,\r\n modifications: changes.filter(c => c.type === 'modification').length,\r\n },\r\n }\r\n }, [state.versions])\r\n\r\n /** Start comparing versions */\r\n const startCompare = useCallback((fromId: string, toId: string) => {\r\n dispatch({ type: 'START_COMPARE', fromId, toId })\r\n }, [])\r\n\r\n /** Stop comparing versions */\r\n const stopCompare = useCallback(() => {\r\n dispatch({ type: 'STOP_COMPARE' })\r\n }, [])\r\n\r\n /** Toggle panel */\r\n const togglePanel = useCallback((isOpen?: boolean) => {\r\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\r\n }, [])\r\n\r\n /** Set auto-save */\r\n const setAutoSave = useCallback((enabled: boolean) => {\r\n dispatch({ type: 'SET_AUTO_SAVE', enabled })\r\n emitEvent({ type: 'auto-save-toggled', enabled })\r\n }, [emitEvent])\r\n\r\n /** Get a version by ID */\r\n const getVersion = useCallback((versionId: string) => {\r\n return state.versions.find(v => v.id === versionId)\r\n }, [state.versions])\r\n\r\n /** Get latest version */\r\n const getLatestVersion = useCallback(() => {\r\n return state.versions[0]\r\n }, [state.versions])\r\n\r\n /** Get pinned versions */\r\n const getPinnedVersions = useCallback(() => {\r\n return state.versions.filter(v => v.isPinned)\r\n }, [state.versions])\r\n\r\n /** Subscribe to events */\r\n const subscribe = useCallback((callback: (event: VersionHistoryEvent) => void) => {\r\n subscribersRef.current.add(callback)\r\n return () => {\r\n subscribersRef.current.delete(callback)\r\n }\r\n }, [])\r\n\r\n const value: VersionHistoryContextValue = {\r\n state,\r\n config: config ?? null,\r\n createVersion,\r\n deleteVersion,\r\n restoreVersion,\r\n pinVersion,\r\n unpinVersion,\r\n renameVersion,\r\n viewVersion,\r\n getVersionContent,\r\n compareVersions,\r\n startCompare,\r\n stopCompare,\r\n togglePanel,\r\n setAutoSave,\r\n getVersion,\r\n getLatestVersion,\r\n getPinnedVersions,\r\n subscribe,\r\n isEnabled: !!config,\r\n }\r\n\r\n return (\r\n <VersionHistoryContext.Provider value={value}>\r\n {children}\r\n </VersionHistoryContext.Provider>\r\n )\r\n}\r\n\r\n/** Hook to use version history context */\r\nexport function useVersionHistory() {\r\n const context = useContext(VersionHistoryContext)\r\n if (!context) {\r\n throw new Error('useVersionHistory must be used within a VersionHistoryProvider')\r\n }\r\n return context\r\n}\r\n\r\n/** Hook to check if version history is available (doesn't throw) */\r\nexport function useVersionHistoryOptional() {\r\n return useContext(VersionHistoryContext)\r\n}\r\n\r\nexport default VersionHistoryContext\r\n","/**\r\n * Version History Panel Component\r\n * Displays version history with restore and compare functionality\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { useVersionHistoryOptional } from './VersionHistoryContext'\r\nimport type { Version } from './types'\r\n\r\ninterface VersionHistoryPanelProps {\r\n /** Panel position */\r\n position?: 'left' | 'right'\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n/** Format date */\r\nfunction formatDate(timestamp: number): string {\r\n const date = new Date(timestamp)\r\n const now = new Date()\r\n const isToday = date.toDateString() === now.toDateString()\r\n\r\n if (isToday) {\r\n return `Today at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\r\n }\r\n\r\n const yesterday = new Date(now)\r\n yesterday.setDate(yesterday.getDate() - 1)\r\n if (date.toDateString() === yesterday.toDateString()) {\r\n return `Yesterday at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\r\n }\r\n\r\n return date.toLocaleDateString([], {\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })\r\n}\r\n\r\n/** Single version item */\r\nfunction VersionItem({\r\n version,\r\n isViewing,\r\n isCompareFrom,\r\n isCompareTo,\r\n onView,\r\n onRestore,\r\n onPin,\r\n onRename,\r\n onDelete,\r\n onCompareSelect,\r\n}: {\r\n version: Version\r\n isViewing: boolean\r\n isCompareFrom: boolean\r\n isCompareTo: boolean\r\n onView: () => void\r\n onRestore: () => void\r\n onPin: () => void\r\n onRename: (title: string) => void\r\n onDelete: () => void\r\n onCompareSelect: () => void\r\n}) {\r\n const [isRenaming, setIsRenaming] = useState(false)\r\n const [newTitle, setNewTitle] = useState(version.title || '')\r\n\r\n const handleRename = () => {\r\n onRename(newTitle)\r\n setIsRenaming(false)\r\n }\r\n\r\n return (\r\n <div\r\n className={`rte-version-item ${isViewing ? 'rte-version-viewing' : ''} ${\r\n isCompareFrom ? 'rte-version-compare-from' : ''\r\n } ${isCompareTo ? 'rte-version-compare-to' : ''}`}\r\n >\r\n {/* Version header */}\r\n <div className=\"rte-version-header\" onClick={onView}>\r\n <div className=\"rte-version-info\">\r\n {isRenaming ? (\r\n <input\r\n type=\"text\"\r\n value={newTitle}\r\n onChange={e => setNewTitle(e.target.value)}\r\n onBlur={handleRename}\r\n onKeyDown={e => e.key === 'Enter' && handleRename()}\r\n className=\"rte-version-rename-input\"\r\n onClick={e => e.stopPropagation()}\r\n autoFocus\r\n />\r\n ) : (\r\n <span className=\"rte-version-title\">\r\n {version.title || `Version ${version.number}`}\r\n {version.isPinned && <span className=\"rte-version-pin-icon\">๐Ÿ“Œ</span>}\r\n {version.isAutoSave && <span className=\"rte-version-auto-badge\">Auto</span>}\r\n </span>\r\n )}\r\n <span className=\"rte-version-time\">{formatDate(version.createdAt)}</span>\r\n </div>\r\n <div className=\"rte-version-author\">\r\n {version.author.avatar ? (\r\n <img src={version.author.avatar} alt={version.author.name} className=\"rte-version-avatar\" />\r\n ) : (\r\n <div className=\"rte-version-avatar-placeholder\">\r\n {version.author.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n <span>{version.author.name}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Version stats */}\r\n <div className=\"rte-version-stats\">\r\n <span>{version.wordCount} words</span>\r\n <span>{version.characterCount} chars</span>\r\n </div>\r\n\r\n {/* Version actions */}\r\n <div className=\"rte-version-actions\">\r\n <button onClick={onRestore} className=\"rte-version-btn\" title=\"Restore this version\">\r\n โ†บ Restore\r\n </button>\r\n <button onClick={onCompareSelect} className=\"rte-version-btn\" title=\"Compare with another version\">\r\n โ‡„ Compare\r\n </button>\r\n <button onClick={onPin} className=\"rte-version-btn\" title={version.isPinned ? 'Unpin' : 'Pin'}>\r\n {version.isPinned ? '๐Ÿ“Œ Unpin' : '๐Ÿ“Œ Pin'}\r\n </button>\r\n <button\r\n onClick={() => setIsRenaming(true)}\r\n className=\"rte-version-btn\"\r\n title=\"Rename version\"\r\n >\r\n โœ๏ธ\r\n </button>\r\n {!version.isPinned && (\r\n <button onClick={onDelete} className=\"rte-version-btn rte-version-btn-delete\" title=\"Delete\">\r\n ๐Ÿ—‘๏ธ\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Version comparison view */\r\nfunction ComparisonView({\r\n fromVersion,\r\n toVersion,\r\n onClose,\r\n}: {\r\n fromVersion: Version\r\n toVersion: Version\r\n onClose: () => void\r\n}) {\r\n const versionHistory = useVersionHistoryOptional()\r\n if (!versionHistory) return null\r\n\r\n const comparison = versionHistory.compareVersions(fromVersion.id, toVersion.id)\r\n\r\n return (\r\n <div className=\"rte-version-comparison\">\r\n <div className=\"rte-version-comparison-header\">\r\n <h4>Comparing Versions</h4>\r\n <button onClick={onClose} className=\"rte-version-comparison-close\">ร—</button>\r\n </div>\r\n\r\n <div className=\"rte-version-comparison-info\">\r\n <div className=\"rte-version-comparison-from\">\r\n <span className=\"rte-version-comparison-label\">From:</span>\r\n {fromVersion.title || `Version ${fromVersion.number}`}\r\n </div>\r\n <span className=\"rte-version-comparison-arrow\">โ†’</span>\r\n <div className=\"rte-version-comparison-to\">\r\n <span className=\"rte-version-comparison-label\">To:</span>\r\n {toVersion.title || `Version ${toVersion.number}`}\r\n </div>\r\n </div>\r\n\r\n {comparison && (\r\n <div className=\"rte-version-comparison-stats\">\r\n <span className=\"rte-comparison-stat rte-comparison-additions\">\r\n +{comparison.stats.additions} additions\r\n </span>\r\n <span className=\"rte-comparison-stat rte-comparison-deletions\">\r\n -{comparison.stats.deletions} deletions\r\n </span>\r\n <span className=\"rte-comparison-stat rte-comparison-modifications\">\r\n ~{comparison.stats.modifications} modifications\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div className=\"rte-version-comparison-diff\">\r\n {comparison?.changes.map((change, index) => (\r\n <div key={index} className={`rte-diff-line rte-diff-${change.type}`}>\r\n <span className=\"rte-diff-indicator\">\r\n {change.type === 'addition' ? '+' : change.type === 'deletion' ? '-' : '~'}\r\n </span>\r\n <span className=\"rte-diff-content\">{change.content}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Version History Panel Component */\r\nexport function VersionHistoryPanel({ position = 'right', className = '' }: VersionHistoryPanelProps) {\r\n const versionHistory = useVersionHistoryOptional()\r\n const [compareFromId, setCompareFromId] = useState<string | null>(null)\r\n\r\n if (!versionHistory?.isEnabled || !versionHistory.state.isPanelOpen) {\r\n return null\r\n }\r\n\r\n const {\r\n state,\r\n togglePanel,\r\n viewVersion,\r\n restoreVersion,\r\n pinVersion,\r\n unpinVersion,\r\n renameVersion,\r\n deleteVersion,\r\n setAutoSave,\r\n getVersion,\r\n createVersion,\r\n stopCompare,\r\n } = versionHistory\r\n\r\n const handleRestore = (versionId: string) => {\r\n const content = restoreVersion(versionId)\r\n if (content) {\r\n viewVersion(null) // Go back to current\r\n }\r\n }\r\n\r\n const handleCompareSelect = (versionId: string) => {\r\n if (!compareFromId) {\r\n setCompareFromId(versionId)\r\n } else {\r\n versionHistory.startCompare(compareFromId, versionId)\r\n setCompareFromId(null)\r\n }\r\n }\r\n\r\n const handleCancelCompare = () => {\r\n setCompareFromId(null)\r\n stopCompare()\r\n }\r\n\r\n // Get versions for comparison view\r\n const compareFromVersion = state.compareFromId ? getVersion(state.compareFromId) : undefined\r\n const compareToVersion = state.compareToId ? getVersion(state.compareToId) : undefined\r\n\r\n return (\r\n <div className={`rte-version-panel rte-version-panel-${position} ${className}`}>\r\n {/* Panel header */}\r\n <div className=\"rte-version-panel-header\">\r\n <h3>Version History</h3>\r\n <button onClick={() => togglePanel(false)} className=\"rte-version-close-btn\">ร—</button>\r\n </div>\r\n\r\n {/* Auto-save toggle */}\r\n <div className=\"rte-version-autosave\">\r\n <label className=\"rte-version-autosave-label\">\r\n <input\r\n type=\"checkbox\"\r\n checked={state.autoSaveEnabled}\r\n onChange={e => setAutoSave(e.target.checked)}\r\n />\r\n Auto-save versions\r\n </label>\r\n <button\r\n onClick={() => createVersion('', undefined, { isAutoSave: false })}\r\n className=\"rte-version-save-btn\"\r\n >\r\n Save Now\r\n </button>\r\n </div>\r\n\r\n {/* Compare mode indicator */}\r\n {compareFromId && !state.isComparing && (\r\n <div className=\"rte-version-compare-mode\">\r\n <span>Select another version to compare</span>\r\n <button onClick={handleCancelCompare}>Cancel</button>\r\n </div>\r\n )}\r\n\r\n {/* Comparison view */}\r\n {state.isComparing && compareFromVersion && compareToVersion && (\r\n <ComparisonView\r\n fromVersion={compareFromVersion}\r\n toVersion={compareToVersion}\r\n onClose={handleCancelCompare}\r\n />\r\n )}\r\n\r\n {/* Versions list */}\r\n {!state.isComparing && (\r\n <div className=\"rte-version-list\">\r\n {state.versions.length === 0 ? (\r\n <div className=\"rte-version-empty\">\r\n No versions saved yet. Changes will be auto-saved periodically.\r\n </div>\r\n ) : (\r\n <>\r\n {/* Pinned versions */}\r\n {state.versions.some(v => v.isPinned) && (\r\n <div className=\"rte-version-section\">\r\n <div className=\"rte-version-section-title\">๐Ÿ“Œ Pinned</div>\r\n {state.versions\r\n .filter(v => v.isPinned)\r\n .map(version => (\r\n <VersionItem\r\n key={version.id}\r\n version={version}\r\n isViewing={state.viewingVersionId === version.id}\r\n isCompareFrom={compareFromId === version.id}\r\n isCompareTo={false}\r\n onView={() => viewVersion(version.id)}\r\n onRestore={() => handleRestore(version.id)}\r\n onPin={() => unpinVersion(version.id)}\r\n onRename={title => renameVersion(version.id, title)}\r\n onDelete={() => deleteVersion(version.id)}\r\n onCompareSelect={() => handleCompareSelect(version.id)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Recent versions */}\r\n <div className=\"rte-version-section\">\r\n <div className=\"rte-version-section-title\">Recent</div>\r\n {state.versions\r\n .filter(v => !v.isPinned)\r\n .map(version => (\r\n <VersionItem\r\n key={version.id}\r\n version={version}\r\n isViewing={state.viewingVersionId === version.id}\r\n isCompareFrom={compareFromId === version.id}\r\n isCompareTo={false}\r\n onView={() => viewVersion(version.id)}\r\n onRestore={() => handleRestore(version.id)}\r\n onPin={() => pinVersion(version.id)}\r\n onRename={title => renameVersion(version.id, title)}\r\n onDelete={() => deleteVersion(version.id)}\r\n onCompareSelect={() => handleCompareSelect(version.id)}\r\n />\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Viewing version indicator */}\r\n {state.viewingVersionId && (\r\n <div className=\"rte-version-viewing-indicator\">\r\n <span>Viewing: {getVersion(state.viewingVersionId)?.title || `Version ${getVersion(state.viewingVersionId)?.number}`}</span>\r\n <button onClick={() => viewVersion(null)} className=\"rte-version-back-btn\">\r\n โ† Back to current\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default VersionHistoryPanel\r\n"],"mappings":"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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAC1D;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAC1D;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACxD;AAAA,UAAM;AA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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,gBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,gBAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,iBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,cAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,eAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AASO,SAAS,iBAAiB,MAA8C;AAC7E,SAAO,eAAe,IAAI,KAAK,eAAe;AAChD;AAQO,SAAS,iBACd,MACA,SAMqB;AACrB,MAAI,UAAU,CAAC,GAAG,iBAAiB,IAAI,CAAC;AAGxC,MAAI,QAAQ,QAAQ;AAClB,cAAU,QAAQ,OAAO,SAAO,CAAC,QAAQ,OAAQ,SAAS,GAAG,CAAC;AAAA,EAChE;AAGA,MAAI,QAAQ,cAAc;AACxB,UAAM,QAAQ,QAAQ,QAAQ,QAAQ,aAAa,MAAM;AACzD,QAAI,UAAU,IAAI;AAChB,cAAQ,OAAO,OAAO,GAAG,GAAG,QAAQ,aAAa,KAAK;AAAA,IACxD;AAAA,EACF;AAGA,MAAI,QAAQ,aAAa;AACvB,UAAM,QAAQ,QAAQ,QAAQ,QAAQ,YAAY,MAAM;AACxD,QAAI,UAAU,IAAI;AAChB,cAAQ,OAAO,QAAQ,GAAG,GAAG,GAAG,QAAQ,YAAY,KAAK;AAAA,IAC3D;AAAA,EACF;AAGA,MAAI,QAAQ,KAAK;AACf,YAAQ,KAAK,aAAa,GAAG,QAAQ,GAAG;AAAA,EAC1C;AAEA,SAAO;AACT;;;AC6FO,IAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AACZ;;;ACnYA,SAAS,uBAAgC;AACvC,SAAO;AACT;AAGA,IAAM,kBAAkC;AAAA,EACtC,GAAG;AAAA;AAAA,EAEH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAElB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EACV,UAAU;AAAA;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA;AAAA,EACf,UAAU;AACZ;AAKO,IAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,EAEb,cAAc,MAAM;AAElB,UAAM,EAAE,uBAAAC,uBAAsB,IAAI;AAClC,WAAOA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAM;AAC9B;;;ACjFA;AACA;;;ACKA,SAAS,sBAA+B;AACtC,MAAI;AACF,YAAQ,OAAO;AACf,YAAQ,aAAa;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,iBAAiC;AAAA,EACrC,GAAG;AAAA;AAAA,EAEH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAElB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA;AAAA,EACf,UAAU;AACZ;AAKO,IAAM,eAA8B;AAAA,EACzC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,EAEb,cAAc,MAAM;AAElB,UAAM,EAAE,sBAAAC,sBAAqB,IAAI;AACjC,WAAOA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAM;AAC9B;;;ACjFA,SAAS,wBAAiC;AACxC,MAAI;AACF,YAAQ,SAAS;AACjB,YAAQ,gCAAgC;AACxC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,mBAAmC;AAAA,EACvC,GAAG;AAAA;AAAA,EAEH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAElB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA;AAAA,EACf,UAAU;AACZ;AAKO,IAAM,iBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,EAEb,cAAc,MAAM;AAElB,UAAM,EAAE,wBAAAC,wBAAuB,IAAI;AACnC,WAAOA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAM;AAC9B;;;APwDU,IAAAC,sBAAA;AAvHV,gBAAgB,aAAa;AAC7B,IAAI,aAAa,YAAY,GAAG;AAC9B,kBAAgB,YAAY;AAC9B;AACA,IAAI,eAAe,YAAY,GAAG;AAChC,kBAAgB,cAAc;AAChC;AAEO,IAAM,oBAAgB;AAAA,EAC3B,CACE;AAAA,IACE,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB;AAAA,EACF,GACA,QACG;AACH,UAAM,iBAAa,sBAAyB,IAAI;AAChD,UAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAiC,UAAU;AAG/F,UAAM,wBAAoB,uBAAQ,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAGlE,UAAM,oBAAoB,eAAe,SAAY,aAAa;AAGlE,UAAM,sBAAkB,uBAAQ,MAAM;AACpC,UAAI,mBAAmB;AACrB,cAAM,UAAU,WAAW,iBAAiB;AAC5C,YAAI,SAAS,YAAY,GAAG;AAC1B,iBAAO;AAAA,QACT;AACA,gBAAQ;AAAA,UACN,WAAW,iBAAiB;AAAA,QAC9B;AAAA,MACF;AACA,aAAO,uBAAuB;AAAA,IAChC,GAAG,CAAC,iBAAiB,CAAC;AAGtB,UAAM,qBAAqB,CAAC,kBAA8B;AACxD,UAAI,gBAAgB;AAClB,uBAAe,aAAa;AAAA,MAC9B,OAAO;AACL,8BAAsB,aAAa;AAAA,MACrC;AAAA,IACF;AAGA,UAAM,qBAAiB,uBAAQ,MAA2B;AACxD,UAAI,sBAAsB;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,YAAY,UAAU;AAC/B,eAAO,iBAAiB,OAAsC;AAAA,MAChE;AAEA,UAAI,QAAQ,SAAS;AACnB,eAAO,QAAQ;AAAA,MACjB;AAEA,UAAI,QAAQ,QAAQ;AAClB,eAAO,iBAAiB,QAAQ,MAAqC;AAAA,MACvE;AAEA,aAAO,iBAAiB,MAAM;AAAA,IAChC,GAAG,CAAC,SAAS,oBAAoB,CAAC;AAGlC,2CAAoB,KAAK,OAAO;AAAA,MAC9B,YAAY,MAAM,WAAW,SAAS,WAAW,KAAK;AAAA,MACtD,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,SAAS,MAAM,WAAW,SAAS,QAAQ;AAAA,MAC3C,YAAY,CAAC,YAAoB,WAAW,SAAS,WAAW,OAAO;AAAA,MACvE,OAAO,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,MAAM,MAAM,WAAW,SAAS,KAAK;AAAA,MACrC,YAAY,CAAC,SAAiB,WAAW,SAAS,WAAW,IAAI;AAAA,MACjE,YAAY,CAAC,SAAiB,WAAW,SAAS,WAAW,IAAI;AAAA,MACjE,OAAO,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,mBAAmB,MAAM,WAAW,SAAS,kBAAkB,KAAK;AAAA,MACpE,cAAc,MAAM,WAAW,SAAS,aAAa,KAAK;AAAA,MAC1D,cAAc,MAAM,WAAW,SAAS,aAAa,KAAK;AAAA,MAC1D,kBAAkB,MAAM,WAAW,SAAS,iBAAiB;AAAA,MAC7D,OAAO,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,MAAM,MAAM,WAAW,SAAS,KAAK;AAAA,MACrC,MAAM,MAAM,WAAW,SAAS,KAAK;AAAA,MACrC,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,iBAAiB,MAAM,WAAW,SAAS,gBAAgB;AAAA,MAC3D,eAAe,MAAM,iBAAiB,QAAS;AAAA,IACjD,EAAE;AAGF,QAAI,CAAC,iBAAiB;AACpB,aACE,6CAAC,SAAI,WAAW,yCAAyC,SAAS,IAChE,wDAAC,SAAI,WAAU,6BAA4B;AAAA;AAAA,QAEzC,6CAAC,QAAG;AAAA,QACJ,6CAAC,UAAK,2DAA6C;AAAA,SACrD,GACF;AAAA,IAEJ;AAGA,UAAM,kBAAkB,gBAAgB,aAAa;AAGrD,UAAM,eAAe,CAAC,YAAoB;AACxC,iBAAW,OAAO;AAAA,IACpB;AAEA,WACE,8CAAC,SAAI,WAAW,+BAA+B,SAAS,IACrD;AAAA,4BAAsB,kBAAkB,SAAS,KAChD,8CAAC,SAAI,WAAU,+BACb;AAAA,qDAAC,WAAM,WAAU,qCAAoC,qBAAO;AAAA,QAC5D;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,gBAAgB;AAAA,YACvB,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAmB;AAAA,YAChE;AAAA,YAEC,4BAAkB,IAAI,CAAC,YACtB,6CAAC,YAA0B,OAAO,QAAQ,MACvC,kBAAQ,QADE,QAAQ,IAErB,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,UACX;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAnBK,gBAAgB;AAAA,MAoBvB;AAAA,OACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;;;AQnN5B,IAAAC,iBAAwE;AACxE,IAAAA,iBAAyC;AACzC,IAAAC,6BAAyB;AACzB,IAAAC,8BAA0B;AAC1B,IAAAC,yBAAqB;AACrB,IAAAC,yBAAqB;AACrB,IAAAC,2BAAuB;AACvB,IAAAC,8BAA0B;AAC1B,IAAAC,2BAAuB;AACvB,IAAAC,yBAAqB;AACrB,IAAAC,wCAAkC;AAClC,IAAAC,8BAA0B;AAC1B,IAAAC,gCAA4B;AAC5B,IAAAC,+BAA0B;AAC1B,IAAAC,gCAA2B;AAC3B,IAAAC,0BAAsB;AACtB,IAAAC,8BAA0B;AAC1B,IAAAC,+BAA0B;AAC1B,IAAAC,4BAAwB;AACxB,IAAAC,gCAA2B;AAC3B,IAAAC,iCAA4B;AAC5B,IAAAC,8BAAyB;AACzB,IAAAC,+BAA2B;AAC3B,IAAAC,oCAA+B;AAC/B,IAAAC,yBAAqB;AACrB,IAAAC,0BAAsB;AACtB,IAAAC,0BAAsB;AACtB,IAAAC,8BAAyB;AACzB,IAAAC,+BAA0B;AAC1B,IAAAC,iCAA4B;AAC5B,IAAAC,4BAAwB;AACxB,IAAAC,gCAA4B;AAC5B,IAAAC,oCAA+B;AAC/B,IAAAC,8BAA0B;AAC1B,IAAAC,+BAA2B;AAC3B,IAAAC,+BAA0B;AAG1B,IAAAC,mBAAuC;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/CA,IAAAC,gBAAmD;AAGnD;AACA,IAAAC,uBAkCO;AA4FH,IAAAC,sBAAA;AAnFJ,IAAMC,iBAAgB;AAAA,EACpB,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,EACrD,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,EACzC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,WAAW,OAAO,UAAU;AACvC;AAEA,IAAMC,cAAa;AAAA,EACjB;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;AAEA,IAAMC,gBAAe;AAAA,EACnB,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,EAC9B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,EAC9B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,KAAK,OAAO,SAAS;AAChC;AAwBA,IAAMC,eAGD,CAAC,EAAE,UAAU,QAAQ,MAAM;AAC9B,QAAM,CAAC,gBAAgB,iBAAiB,QACtC,wBAAwC,SAAS;AACnD,QAAM,iBAAa,sBAAuB,IAAI;AAE9C,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,UACE,WAAW,WACX,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAC7C;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,8CAAC,SAAI,KAAK,YAAY,WAAU,4BAC9B;AAAA,iDAAC,SAAI,WAAU,gCACZ,iBAAO,QAAQ,gBAAgB,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MACnD;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,kCAAkC,mBAAmB,MAAM,WAAW,EAAE;AAAA,QACnF,SAAS,MACP,kBAAkB,GAAoC;AAAA,QAExD,OAAO,SAAS;AAAA,QAEf,mBAAS,OAAO,CAAC;AAAA;AAAA,MARb;AAAA,IASP,CACD,GACH;AAAA,IACA,6CAAC,SAAI,WAAU,0BACZ,2BAAiB,cAAc,EAAE,OAAO,IAAI,CAAC,OAAO,MACnD;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,mBAAS,KAAK;AACd,kBAAQ;AAAA,QACV;AAAA,QAEC;AAAA;AAAA,MARI,GAAG,KAAK,IAAI,CAAC;AAAA,IASpB,CACD,GACH;AAAA,KACF;AAEJ;AAEO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS,KAAK;AAC5D,QAAM,qBAAiB,sBAA0B,IAAI;AAErD,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAMC,iBAAgB,CAAC;AAAA,IACrB;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAQE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,aAAa,CAAC,MAAM;AAClB,UAAE,eAAe;AACjB,gBAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,2BAA2B,SAAS,WAAW,EAAE,IAAI,WAAW,aAAa,EAAE;AAAA,MAEzF;AAAA;AAAA,EACH;AAGF,QAAM,eAAe,CAAC,QAAuB,UAAkB;AAC7D,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,YACvD,QAAQ,OAAO,SAAS,MAAM;AAAA,YAC9B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,YACzD,QAAQ,OAAO,SAAS,QAAQ;AAAA,YAChC,OAAM;AAAA,YAEN,uDAAC,+BAAO,MAAM,IAAI;AAAA;AAAA,UALd;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,YAC5D,QAAQ,OAAO,SAAS,WAAW;AAAA,YACnC,OAAM;AAAA,YAEN,uDAAC,kCAAU,MAAM,IAAI;AAAA;AAAA,UALjB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,YACzD,QAAQ,OAAO,SAAS,QAAQ;AAAA,YAChC,OAAM;AAAA,YAEN,uDAAC,sCAAc,MAAM,IAAI;AAAA;AAAA,UALrB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,YACvD,QAAQ,OAAO,SAAS,MAAM;AAAA,YAC9B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,OAAO,SAAS,WAAW,GAAG;AAEhC,oBAAI,aAAa;AACjB,uBAAO,MAAM,IAAI,YAAY,CAAC,SAAS;AACrC,sBAAI,KAAK,KAAK,SAAS,aAAa;AAClC,iCAAa,KAAK;AAClB,2BAAO;AAAA,kBACT;AAAA,gBACF,CAAC;AAED,6BAAa,WAAW,KAAK;AAE7B,oBAAI,YAAY;AACd,yBAAO,SAAS,WAAW,YAAY,MAAM;AAAA,oBAC3C,oBAAoB;AAAA,kBACtB,CAAC;AAAA,gBACH,OAAO;AACL,yBAAO,SAAS,aAAa,IAAI;AAAA,gBACnC;AACA,uBAAO,SAAS,MAAM;AAAA,cACxB,OAAO;AAEL,sBAAM,cAAc,OAAO,QAAQ;AACnC,sBAAM,iBACJ,CAAC,eACD,gBAAgB,aAChB,YAAY,KAAK,MAAM;AAEzB,sBAAM,mBAAmB,iBACrB,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC,EAAE,IAChD;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,oBACP;AAAA,sBACE,MAAM;AAAA,sBACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,oBAC/C;AAAA,kBACF;AAAA,gBACF;AAEJ,uBAAO,SAAS,WAAW,kBAAkB,KAAK;AAClD,uBAAO,SAAS,MAAM;AAAA,cACxB;AAAA,YACF;AAAA,YACA,QAAQ,OAAO,SAAS,WAAW;AAAA,YACnC,OAAM;AAAA,YAEN,uDAAC,gCAAQ,MAAM,IAAI;AAAA;AAAA,UAjDf;AAAA,QAkDN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,YAC5D,QAAQ,OAAO,SAAS,WAAW;AAAA,YACnC,OAAM;AAAA,YAEN,uDAAC,kCAAU,MAAM,IAAI;AAAA;AAAA,UALjB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,YAC9D,QAAQ,OAAO,SAAS,aAAa;AAAA,YACrC,OAAM;AAAA,YAEN,uDAAC,oCAAY,MAAM,IAAI;AAAA;AAAA,UALnB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MACP,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI;AAAA,YAE1D,OAAM;AAAA,YAEN,uDAAC,yCAAiB,MAAM,IAAI;AAAA;AAAA,UANxB;AAAA,QAON;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,kBAAI,EAAE,OAAO,UAAU,WAAW;AAChC,uBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,cAC/C,OAAO;AACL,uBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cAC3D;AAAA,YACF;AAAA,YACA,OAAO,OAAO,cAAc,WAAW,EAAE,cAAc;AAAA,YAEvD;AAAA,2DAAC,YAAO,OAAM,WAAU,yBAAW;AAAA,cAClCJ,eAAc,IAAI,CAAC,SAClB,6CAAC,YAAwB,OAAO,KAAK,OAClC,eAAK,SADK,KAAK,KAElB,CACD;AAAA;AAAA;AAAA,UAhBG;AAAA,QAiBN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,kBAAI,EAAE,OAAO,UAAU,WAAW;AAChC,uBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;AAAA,cAC7C,OAAO;AACL,uBAAO,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cACzD;AAAA,YACF;AAAA,YACA,OAAO,OAAO,cAAc,WAAW,EAAE,YAAY;AAAA,YAErD;AAAA,2DAAC,YAAO,OAAM,WAAU,uBAAS;AAAA,cAChCC,YAAW,IAAI,CAAC,SACf,6CAAC,YAAkB,OAAO,MACvB,kBADU,IAEb,CACD;AAAA;AAAA;AAAA,UAhBG;AAAA,QAiBN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,kBAAI,EAAE,OAAO,UAAU,WAAW;AAChC,uBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,cAC/C,OAAO;AACL,uBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cAC3D;AAAA,YACF;AAAA,YACA,OACE,OAAO,cAAc,WAAW,EAAE,cAClC,OAAO,cAAc,SAAS,EAAE,cAChC;AAAA,YAEF,OAAM;AAAA,YAEN;AAAA,2DAAC,YAAO,OAAM,WAAU,yBAAW;AAAA,cAClCC,cAAa,IAAI,CAAC,OACjB,6CAAC,YAAsB,OAAO,GAAG,OAC9B,aAAG,SADO,GAAG,KAEhB,CACD;AAAA;AAAA;AAAA,UArBG;AAAA,QAsBN;AAAA,MAGJ,KAAK;AACH,eACE,8CAAC,UAAqB,WAAU,mCAC9B;AAAA;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,cACvD,OAAM;AAAA,cACN,MAAK;AAAA;AAAA,YAJD;AAAA,UAKN;AAAA,UACA,6CAAC,UAAK,WAAU,6BACd,wDAAC,WAAM,OAAM,cACX;AAAA,yDAAC,6BAAK,MAAM,IAAI;AAAA,YAChB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,CAAC,MACT,OAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,gBAEtD,OAAO,OAAO,cAAc,WAAW,EAAE,SAAS;AAAA;AAAA,YACpD;AAAA,aACF,GACF;AAAA,aAnBQ,WAoBV;AAAA,MAGJ,KAAK;AACH,eACE,6CAAC,UAA2B,WAAU,6BACpC,wDAAC,WAAM,OAAM,oBACX;AAAA,uDAAC,oCAAY,MAAM,IAAI;AAAA,UACvB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,CAAC,MACT,OACG,MAAM,EACN,MAAM,EACN,gBAAgB,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,EACzC,IAAI;AAAA,cAET,OAAO,OAAO,cAAc,WAAW,EAAE,SAAS;AAAA;AAAA,UACpD;AAAA,WACF,KAdQ,iBAeV;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACE;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI;AAAA,YAC/D,QAAQ,OAAO,SAAS,EAAE,WAAW,OAAO,CAAC;AAAA,YAC7C,OAAM;AAAA,YAEN,uDAAC,kCAAU,MAAM,IAAI;AAAA;AAAA,UALjB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,QAAQ,EAAE,IAAI;AAAA,YACjE,QAAQ,OAAO,SAAS,EAAE,WAAW,SAAS,CAAC;AAAA,YAC/C,OAAM;AAAA,YAEN,uDAAC,oCAAY,MAAM,IAAI;AAAA;AAAA,UALnB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,OAAO,EAAE,IAAI;AAAA,YAChE,QAAQ,OAAO,SAAS,EAAE,WAAW,QAAQ,CAAC;AAAA,YAC9C,OAAM;AAAA,YAEN,uDAAC,mCAAW,MAAM,IAAI;AAAA;AAAA,UALlB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,SAAS,EAAE,IAAI;AAAA,YAClE,QAAQ,OAAO,SAAS,EAAE,WAAW,UAAU,CAAC;AAAA,YAChD,OAAM;AAAA,YAEN,uDAAC,qCAAa,MAAM,IAAI;AAAA;AAAA,UALpB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA,YACnD,OAAM;AAAA,YAEN,uDAAC,+BAAO,MAAM,IAAI;AAAA;AAAA,UAJd;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI;AAAA,YACpD,OAAM;AAAA,YAEN,uDAAC,gCAAQ,MAAM,IAAI;AAAA;AAAA,UAJf;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,YAC7D,QAAQ,OAAO,SAAS,YAAY;AAAA,YACpC,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,YAC9D,QAAQ,OAAO,SAAS,aAAa;AAAA,YACrC,OAAM;AAAA,YAEN,uDAAC,oCAAY,MAAM,IAAI;AAAA;AAAA,UALnB;AAAA,QAMN;AAAA,MAGJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,QAAQ,SAAS,OAAO,QAAQ,WAAW,EAAE,CAAC;AAOpD,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MACP,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI;AAAA,YAEtD,QAAQ,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC;AAAA,YAC5C,OAAO,WAAW,KAAK;AAAA,YAEvB,wDAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC/D;AAAA,2DAAC,gCAAQ,MAAM,IAAI;AAAA,cACnB,6CAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,OAAO,GACjD,iBACH;AAAA,eACF;AAAA;AAAA,UAZK;AAAA,QAaP;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,YAC7D,QAAQ,OAAO,SAAS,YAAY;AAAA,YACpC,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UALb;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,YAC9D,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAJb;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,oBAAM,MAAM,OAAO,OAAO,YAAY;AACtC,kBAAI,KAAK;AACP,uBAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA,cACpD;AAAA,YACF;AAAA,YACA,QAAQ,OAAO,SAAS,MAAM;AAAA,YAC9B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UAVZ;AAAA,QAWN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI;AAAA,YACtD,UAAU,CAAC,OAAO,SAAS,MAAM;AAAA,YACjC,OAAM;AAAA,YAEN,uDAAC,+BAAO,MAAM,IAAI;AAAA;AAAA,UALd;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,oBAAoB;AACtB,mCAAmB;AAAA,cACrB,OAAO;AACL,sBAAM,MAAM,OAAO,OAAO,kBAAkB;AAC5C,oBAAI,KAAK;AACP,yBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAbb;AAAA,QAcN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,oBAAoB;AACtB,mCAAmB;AAAA,cACrB,OAAO;AACL,sBAAM,MAAM,OAAO,OAAO,kBAAkB;AAC5C,oBAAI,KAAK;AACP,yBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAbb;AAAA,QAcN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MACP,OACG,MAAM,EACN,MAAM,EACN,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,KAAK,CAAC,EACrD,IAAI;AAAA,YAET,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAVb;AAAA,QAWN;AAAA,MAGJ,KAAK;AACH,eACE,8CAAC,UAAiB,OAAO,EAAE,UAAU,WAAW,GAC9C;AAAA;AAAA,YAACA;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,cACX,SAAS,MAAM,mBAAmB,CAAC,eAAe;AAAA,cAClD,QAAQ;AAAA,cACR,OAAM;AAAA,cAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UACnB;AAAA,UACC,mBACC;AAAA,YAACD;AAAA,YAAA;AAAA,cACC,UAAU,CAAC,UACT,OAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,IAAI;AAAA,cAEhD,SAAS,MAAM,mBAAmB,KAAK;AAAA;AAAA,UACzC;AAAA,aAfM,OAiBV;AAAA,MAGJ,KAAK;AACH,cAAM,eAAe,OAAO,QAAQ,YAAY,gBAAgB;AAChE,eACE;AAAA,UAACC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,YAC7D,QAAQ;AAAA,YACR,OACE,eACI,0BACA;AAAA,YAGL,yBAAe,6CAAC,iCAAS,MAAM,IAAI,IAAK,6CAAC,iCAAS,MAAM,IAAI;AAAA;AAAA,UATzD;AAAA,QAUN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI;AAAA,YAClD,OAAM;AAAA,YAEN,uDAAC,gCAAQ,MAAM,IAAI;AAAA;AAAA,UAJf;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,YACjD,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,YAC7B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,YACjD,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,YAC7B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE,6CAAC,SAAyB,WAAU,mCAA1B,OAAO,KAAK,EAA8C;AAAA,MAGxE;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,SAAS,WAAW;AAEhD,SAAO,6CAAC,SAAI,WAAW,sBAAsB,eAAe,qCAAqC,EAAE,IAAK,kBAAQ,IAAI,YAAY,GAAE;AACpI;;;ADtbQ,IAAAC,sBAAA;AAnTR,IAAMC,gBAAW,iCAAe,uBAAM;AAGtC,IAAMC,kBAAwE;AAAA,EAC5E,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,qBAAiB;AAAA,EAC5B,CACE;AAAA,IACE,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,IACZ,SAAS,CAAC;AAAA,IACV;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,EACxB,GACA,QACG;AAEH,UAAM,uBACJ,kBAAkBA,gBAAe,aAAa;AAGhD,UAAM,aAAS,0BAAU;AAAA,MACvB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBACI,wDAAkB,UAAU;AAAA,UAC1B,UAAAD;AAAA,UACA,iBAAiB;AAAA,QACnB,CAAC,IACD,wDAAkB,UAAU;AAAA,UAC1B,UAAU;AAAA,QACZ,CAAC;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sCAAU,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,QACxC;AAAA,QACA,uCAAU,UAAU;AAAA,UAClB,OAAO,CAAC,WAAW,WAAW;AAAA,QAChC,CAAC;AAAA,QACD,kCAAQ,UAAU;AAAA,UAChB,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,QAC3B,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,4BAAK,UAAU;AAAA,UACb,aAAa;AAAA,UACb,gBAAgB;AAAA,YACd,QAAQ;AAAA,YACR,KAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,QACD,8BAAM,UAAU;AAAA,UACd,QAAQ;AAAA,UACR,aAAa;AAAA,QACf,CAAC;AAAA,QACD;AAAA,QACA,8BAAM,UAAU;AAAA,UACd,WAAW;AAAA,QACb,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,0CAAY,UAAU;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,QACD,iDAAe,UAAU;AAAA,UACvB,OAAO,iBAAiB,IAAI,iBAAiB;AAAA,QAC/C,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,MACT,UAAU,CAAC,YAAY,CAAC;AAAA,MACxB,UAAU,CAAC,EAAE,QAAAE,QAAO,MAAM;AACxB,cAAM,OAAOA,QAAO,QAAQ;AAC5B,mBAAW,IAAI;AAAA,MACjB;AAAA,MACA,QAAQ,MAAM;AACZ,iBAAS;AAAA,MACX;AAAA,MACA,SAAS,MAAM;AACb,kBAAU;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,QACX,YAAY;AAAA,UACV,OAAO;AAAA,UACP,OAAO,eAAe,SAAS,OAAO,YAAY,eAAe,SAAS,QAAQ,EAAE;AAAA,QACtF;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAGD,kCAAU,MAAM;AACd,UAAI,UAAU,UAAU,OAAO,QAAQ,GAAG;AACxC,eAAO,SAAS,WAAW,KAAK;AAAA,MAClC;AAAA,IACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAGlB,kCAAU,MAAM;AACd,UAAI,QAAQ;AACV,eAAO,YAAY,CAAC,YAAY,CAAC,QAAQ;AAAA,MAC3C;AAAA,IACF,GAAG,CAAC,UAAU,UAAU,MAAM,CAAC;AAG/B,UAAM,6BAAyB,4BAAY,YAAY;AACrD,UAAI,sBAAsB,QAAQ;AAChC,cAAM,OAAO,MAAM,mBAAmB;AACtC,YAAI,MAAM;AACR,iBACG,MAAM,EACN,MAAM,EACN,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC,EACtD,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF,GAAG,CAAC,oBAAoB,MAAM,CAAC;AAG/B,UAAM,6BAAyB,4BAAY,YAAY;AACrD,UAAI,sBAAsB,QAAQ;AAChC,cAAM,OAAO,MAAM,mBAAmB;AACtC,YAAI,MAAM;AACR,iBACG,MAAM,EACN,MAAM,EACN,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC,EACtD,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF,GAAG,CAAC,oBAAoB,MAAM,CAAC;AAG/B,4CAAoB,KAAK,OAAO;AAAA,MAC9B,YAAY,MAAM;AAChB,eAAO,QAAQ,QAAQ,KAAK;AAAA,MAC9B;AAAA,MACA,YAAY,CAAC,SAAiB;AAC5B,gBAAQ,SAAS,WAAW,IAAI;AAAA,MAClC;AAAA,MACA,OAAO,MAAM;AACX,gBAAQ,SAAS,MAAM;AAAA,MACzB;AAAA,MACA,WAAW,MAAM;AACf,eAAO;AAAA,MACT;AAAA,MACA,YAAY,CAAC,SAAiB;AAC5B,gBAAQ,SAAS,cAAc,IAAI;AAAA,MACrC;AAAA,MACA,OAAO,MAAM;AACX,gBAAQ,SAAS,aAAa;AAAA,MAChC;AAAA,MACA,cAAc,MAAM;AAClB,eAAO,QAAQ,QAAQ,YAAY,gBAAgB;AAAA,MACrD;AAAA,MACA,kBAAkB,MAAM;AACtB,gBAAQ,SAAS,iBAAiB;AAAA,MACpC;AAAA,MACA,OAAO,MAAM;AACX,gBAAQ,SAAS,MAAM;AAAA,MACzB;AAAA,IACF,EAAE;AAEF,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,OAAO,QAAQ,eAAe,WAAW;AAChE,UAAM,iBAAiB,iBAAiB,IAAI,iBAAiB;AAE7D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,uBAAuB,WAAW,aAAa,EAAE,IAAI,WAAW,aAAa,EAAE,IAAI,SAAS;AAAA,QAEvG;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,SAAS;AAAA,cACT,oBACE,qBAAqB,yBAAyB;AAAA,cAEhD,oBACE,qBAAqB,yBAAyB;AAAA;AAAA,UAElD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,GAAG,MAAM,KAAK;AAAA,cAE/B,uDAAC,gCAAc,QAAgB;AAAA;AAAA,UACjC;AAAA,UACC,mBACC,6CAAC,SAAI,WAAU,sBACb,wDAAC,SAAI,WAAU,4BACZ;AAAA;AAAA,YACA,kBAAkB,MAAM,cAAc;AAAA,YACtC,kBAAkB,iBAAiB,kBAClC,8CAAC,UAAK,WAAU,qCACb;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,aAEJ,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;;AT/R7B;AACA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;;;AW9HA,IAAAC,iBAAiG;AAsQ7F,IAAAC,uBAAA;AAhPJ,IAAM,eAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,OAAO,CAAC;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAGA,SAAS,qBAAqB,OAA2B,QAAiD;AACxG,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,OAAO,QAAQ,OAAO,OAAO,WAAW,UAAU,MAAM,QAAQ,OAAU;AAAA,IACvG,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,IACzC,KAAK;AACH,UAAI,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,KAAK,EAAE,GAAG;AAClD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,QACvE;AAAA,MACF;AACA,aAAO,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,OAAO,IAAI,EAAE;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,OAAO,MAAM,EAAE;AAAA,IAC5E,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,MAAM,MAAM;AAAA,UAAI,OACrB,EAAE,OAAO,OAAO,SAAS,EAAE,GAAG,GAAG,QAAQ,OAAO,QAAQ,YAAY,KAAK,IAAI,EAAE,IAAI;AAAA,QACrF;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,OAAO,OAAO,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAU;AAAA,IACtC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,OAAO,OAAO;AAAA,IAC3C;AACE,aAAO;AAAA,EACX;AACF;AAaA,IAAM,2BAAuB,8BAAgD,IAAI;AAWjF,SAAS,oBAA4B;AACnC,QAAM,SAAS;AAAA,IACb;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAC5C;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,EAC9C;AACA,SAAO,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AACzD;AAGO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,CAAC,OAAO,QAAQ,QAAI,2BAAW,sBAAsB,YAAY;AACvE,QAAM,YAAQ,uBAAyB,IAAI;AAC3C,QAAM,0BAAsB,uBAA8B,IAAI;AAC9D,QAAM,2BAAuB,uBAAO,CAAC;AAGrC,gCAAU,MAAM;AACd,qBAAiB,MAAM,MAAM;AAAA,EAC/B,GAAG,CAAC,MAAM,QAAQ,cAAc,CAAC;AAGjC,gCAAU,MAAM;AACd,oBAAgB,MAAM,KAAK;AAAA,EAC7B,GAAG,CAAC,MAAM,OAAO,aAAa,CAAC;AAG/B,QAAM,cAAU,4BAAY,YAAY;AACtC,QAAI,CAAC,OAAQ;AAEb,aAAS,EAAE,MAAM,cAAc,QAAQ,aAAa,CAAC;AAErD,QAAI;AACF,UAAI,OAAO,aAAa,eAAe,OAAO,WAAW;AACvD,cAAM,MAAM,IAAI,IAAI,OAAO,SAAS;AACpC,YAAI,aAAa,IAAI,QAAQ,OAAO,MAAM;AAC1C,YAAI,OAAO,OAAO;AAChB,cAAI,aAAa,IAAI,SAAS,OAAO,KAAK;AAAA,QAC5C;AAEA,cAAM,KAAK,IAAI,UAAU,IAAI,SAAS,CAAC;AACvC,cAAM,UAAU;AAEhB,WAAG,SAAS,MAAM;AAChB,mBAAS,EAAE,MAAM,cAAc,QAAQ,YAAY,CAAC;AACpD,+BAAqB,UAAU;AAG/B,aAAG,KAAK,KAAK,UAAU;AAAA,YACrB,MAAM;AAAA,YACN,MAAM;AAAA,cACJ,IAAI,OAAO,KAAK;AAAA,cAChB,MAAM,OAAO,KAAK;AAAA,cAClB,QAAQ,OAAO,KAAK;AAAA,cACpB,OAAO,OAAO,KAAK,SAAS,kBAAkB;AAAA,YAChD;AAAA,UACF,CAAC,CAAC;AAAA,QACJ;AAEA,WAAG,YAAY,CAAC,UAAU;AACxB,cAAI;AACF,kBAAM,UAAU,KAAK,MAAM,MAAM,IAAI;AACrC,qCAAyB,OAAO;AAAA,UAClC,QAAQ;AACN,oBAAQ,MAAM,uCAAuC;AAAA,UACvD;AAAA,QACF;AAEA,WAAG,UAAU,MAAM;AACjB,mBAAS,EAAE,MAAM,cAAc,QAAQ,eAAe,CAAC;AACvD,0BAAgB;AAAA,QAClB;AAEA,WAAG,UAAU,MAAM;AACjB,mBAAS,EAAE,MAAM,aAAa,OAAO,mBAAmB,CAAC;AAAA,QAC3D;AAAA,MACF,WAAW,OAAO,aAAa,UAAU;AAEvC,iBAAS,EAAE,MAAM,aAAa,OAAO,sCAAsC,CAAC;AAAA,MAC9E,WAAW,OAAO,aAAa,UAAU;AAEvC,iBAAS,EAAE,MAAM,cAAc,QAAQ,YAAY,CAAC;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AACd,eAAS,EAAE,MAAM,aAAa,OAAO,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,CAAC;AAAA,IACrG;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,+BAA2B,4BAAY,CAAC,UAA8B;AAC1E,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,iBAAS,EAAE,MAAM,YAAY,MAAM,MAAM,KAAK,CAAC;AAC/C;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,eAAe,QAAQ,MAAM,OAAO,CAAC;AACtD;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,cAAc,QAAQ,MAAM,OAAO,CAAC;AACrD;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,aAAa,OAAO,MAAM,QAAQ,CAAC;AACpD;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAkB,4BAAY,MAAM;AACxC,QAAI,CAAC,QAAQ,cAAe;AAE5B,UAAM,cAAc,OAAO,wBAAwB;AACnD,UAAM,WAAW,OAAO,qBAAqB;AAE7C,QAAI,qBAAqB,WAAW,aAAa;AAC/C,eAAS,EAAE,MAAM,aAAa,OAAO,oCAAoC,CAAC;AAC1E;AAAA,IACF;AAEA,aAAS,EAAE,MAAM,cAAc,QAAQ,eAAe,CAAC;AACvD,yBAAqB;AAErB,wBAAoB,UAAU,WAAW,MAAM;AAC7C,cAAQ;AAAA,IACV,GAAG,QAAQ;AAAA,EACb,GAAG,CAAC,QAAQ,OAAO,CAAC;AAGpB,QAAM,iBAAa,4BAAY,MAAM;AACnC,QAAI,oBAAoB,SAAS;AAC/B,mBAAa,oBAAoB,OAAO;AAAA,IAC1C;AAEA,QAAI,MAAM,SAAS;AACjB,YAAM,QAAQ,MAAM;AACpB,YAAM,UAAU;AAAA,IAClB;AAEA,aAAS,EAAE,MAAM,cAAc,QAAQ,eAAe,CAAC;AACvD,aAAS,EAAE,MAAM,aAAa,OAAO,CAAC,EAAE,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAGL,QAAM,mBAAe,4BAAY,CAAC,WAA2B;AAC3D,QAAI,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,QAAQ,eAAe,UAAU,KAAM;AAE9E,UAAM,QAAQ,KAAK,KAAK,UAAU;AAAA,MAChC,MAAM;AAAA,MACN,QAAQ,OAAO,KAAK;AAAA,MACpB;AAAA,IACF,CAAC,CAAC;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM;AACd,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,QAAmC;AAAA,IACvC;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EACf;AAEA,SACE,8CAAC,qBAAqB,UAArB,EAA8B,OAC5B,UACH;AAEJ;AAGO,SAAS,mBAAmB;AACjC,QAAM,cAAU,2BAAW,oBAAoB;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO;AACT;AAGO,SAAS,2BAA2B;AACzC,aAAO,2BAAW,oBAAoB;AACxC;;;AC/PI,IAAAC,uBAAA;AAZJ,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,CAAC,CAAC,EACb,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AACf;AAGA,SAAS,WAAW,EAAE,MAAM,SAAS,GAAoD;AACvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,aAAa,KAAK,MAAM;AAAA,MACjC,OAAO,KAAK;AAAA,MAEX;AAAA,aAAK,SACJ,8CAAC,SAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,IAEvC,8CAAC,UAAK,OAAO,EAAE,iBAAiB,KAAK,MAAM,GACxC,sBAAY,KAAK,IAAI,GACxB;AAAA,QAED,KAAK,YAAY,8CAAC,SAAI,WAAU,2BAA0B;AAAA,QAC1D,YAAY,8CAAC,SAAI,WAAU,qBAAqB,eAAK,MAAK;AAAA;AAAA;AAAA,EAC7D;AAEJ;AAGA,SAAS,YAAY,EAAE,OAAO,GAAuB;AACnD,QAAM,eAAiE;AAAA,IACrE,WAAW,EAAE,OAAO,aAAa,OAAO,UAAU;AAAA,IAClD,YAAY,EAAE,OAAO,iBAAiB,OAAO,UAAU;AAAA,IACvD,cAAc,EAAE,OAAO,mBAAmB,OAAO,UAAU;AAAA,IAC3D,cAAc,EAAE,OAAO,gBAAgB,OAAO,UAAU;AAAA,IACxD,OAAO,EAAE,OAAO,SAAS,OAAO,UAAU;AAAA,EAC5C;AAEA,QAAM,SAAS,aAAa,MAAM,KAAK,aAAa;AAEpD,SACE,+CAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,OAAO,OAAO,MAAM,GAChE;AAAA,kDAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,iBAAiB,OAAO,MAAM,GAAG;AAAA,IAClF,OAAO;AAAA,KACV;AAEJ;AAGO,SAAS,kBAAkB;AAAA,EAChC,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AACd,GAA2B;AACzB,QAAM,gBAAgB,yBAAyB;AAE/C,MAAI,CAAC,eAAe,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,eAAe,MAAM,MAAM,MAAM,GAAG,UAAU;AACpD,QAAM,iBAAiB,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,UAAU;AAElE,SACE,+CAAC,SAAI,WAAW,0BAA0B,SAAS,IACjD;AAAA,kDAAC,eAAY,QAAQ,MAAM,QAAQ;AAAA,IAElC,MAAM,MAAM,SAAS,KACpB,+CAAC,SAAI,WAAU,wBACZ;AAAA,mBAAa,IAAI,UAChB,8CAAC,cAAyB,MAAY,UAAU,aAA/B,KAAK,EAAqC,CAC5D;AAAA,MACA,iBAAiB,KAChB,+CAAC,SAAI,WAAU,yCAAwC;AAAA;AAAA,QACnD;AAAA,SACJ;AAAA,OAEJ;AAAA,IAGD,MAAM,SACL,8CAAC,SAAI,WAAU,sBAAqB,OAAO,MAAM,OAAO,eAExD;AAAA,KAEJ;AAEJ;;;AC6BO,IAAM,0BAA0B,CAAC,aAAM,aAAM,gBAAM,aAAM,aAAM,aAAM,aAAM,WAAI;;;ACpItF,IAAAC,iBAAyF;AA6brF,IAAAC,uBAAA;AA/ZJ,IAAMC,gBAA8B;AAAA,EAClC,SAAS,CAAC;AAAA,EACV,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AACf;AAGA,SAAS,aAAqB;AAC5B,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACjE;AAGA,SAAS,gBAAgB,OAAsB,QAAuC;AACpF,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,SAAS,OAAO,QAAQ;AAAA,IAE7C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,SAAS,CAAC,GAAG,MAAM,SAAS,OAAO,MAAM,EAAE;AAAA,IAEhE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ,OAAO,OAAK,EAAE,OAAO,OAAO,QAAQ;AAAA,QAC3D,gBAAgB,MAAM,mBAAmB,OAAO,WAAW,OAAO,MAAM;AAAA,MAC1E;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,QAAQ,YAAqB,YAAY,KAAK,IAAI,GAAG,YAAY,OAAO,WAAW,IAC3F;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,QAAQ,QAAiB,YAAY,QAAW,YAAY,OAAU,IAC9E;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,UAAU,OAAO,OAAO,EAAE,IAClD;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ;AAAA,YACE,GAAG;AAAA,YACH,UAAU,EAAE,SAAS;AAAA,cAAI,OACvB,EAAE,OAAO,OAAO,QAAQ,KAAK,OAAO,UAAU;AAAA,YAChD;AAAA,UACF,IACA;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,UAAU,EAAE,SAAS,OAAO,OAAK,EAAE,OAAO,OAAO,SAAS,EAAE,IACpE;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ;AAAA,YACE,GAAG;AAAA,YACH,UAAU,EAAE,SAAS,IAAI,OAAK;AAC5B,kBAAI,EAAE,OAAO,OAAO,UAAW,QAAO;AACtC,oBAAM,YAAY,EAAE,aAAa,CAAC;AAClC,oBAAM,mBAAmB,UAAU,KAAK,OAAK,EAAE,UAAU,OAAO,KAAK;AACrE,kBAAI,kBAAkB;AACpB,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,WAAW,UAAU;AAAA,oBAAI,OACvB,EAAE,UAAU,OAAO,QACf,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,OAAO,IAAI,EAAE,IACzC;AAAA,kBACN;AAAA,gBACF;AAAA,cACF;AACA,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,WAAW,CAAC,GAAG,WAAW,EAAE,OAAO,OAAO,OAAO,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AAAA,cACzE;AAAA,YACF,CAAC;AAAA,UACH,IACA;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ;AAAA,YACE,GAAG;AAAA,YACH,UAAU,EAAE,SAAS,IAAI,OAAK;AAC5B,kBAAI,EAAE,OAAO,OAAO,UAAW,QAAO;AACtC,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,YAAY,EAAE,aAAa,CAAC,GACzB;AAAA,kBAAI,OACH,EAAE,UAAU,OAAO,QACf,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,OAAO,OAAK,EAAE,OAAO,OAAO,MAAM,EAAE,IAC3D;AAAA,gBACN,EACC,OAAO,OAAK,EAAE,MAAM,SAAS,CAAC;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,UACH,IACA;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,gBAAgB,OAAO,SAAS;AAAA,IAErD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,UAAU,CAAC,MAAM,YAAY;AAAA,IAEtE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,OAAO,OAAO;AAAA,IAE3C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,KAAK;AAAA,IAE9C;AACE,aAAO;AAAA,EACX;AACF;AAsCA,IAAM,sBAAkB,8BAA2C,IAAI;AAWhE,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB;AACF,GAA0B;AACxB,QAAM,CAAC,OAAO,QAAQ,QAAI,2BAAW,iBAAiB;AAAA,IACpD,GAAGA;AAAA,IACH,SAAS;AAAA,IACT,aAAa,QAAQ,eAAe;AAAA,EACtC,CAAC;AAED,QAAM,iBAAiB,EAAE,SAAS,oBAAI,IAAmC,EAAE;AAG3E,gCAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,EAAE,KAAK,aAAW;AAC9B,iBAAS,EAAE,MAAM,eAAe,QAAQ,CAAC;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM;AACd,sBAAkB,MAAM,OAAO;AAC/B,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,MAAM,OAAO;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,iBAAiB,MAAM,CAAC;AAG3C,gCAAU,MAAM;AACd,QAAI,QAAQ,aAAa;AACvB,eAAS,EAAE,MAAM,oBAAoB,MAAM,OAAO,YAAY,CAAC;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,CAAC;AAGxB,QAAM,gBAAY,4BAAY,CAAC,UAAwB;AACrD,mBAAe,QAAQ,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,EAC5D,GAAG,CAAC,CAAC;AAGL,QAAM,mBAAe,4BAAY,CAAC,OAAqB,mBAAiD;AACtG,QAAI,CAAC,MAAM,YAAa,QAAO;AAE/B,UAAM,WAAW,WAAW;AAC5B,UAAM,YAAY,WAAW;AAC7B,UAAM,MAAM,KAAK,IAAI;AAErB,UAAM,UAAmB;AAAA,MACvB,IAAI;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,MAAM;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,IACZ;AAEA,UAAM,SAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,WAAW;AAAA,IACb;AAEA,aAAS,EAAE,MAAM,cAAc,OAAO,CAAC;AACvC,cAAU,EAAE,MAAM,kBAAkB,OAAO,CAAC;AAC5C,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,aAAa,SAAS,CAAC;AAGjC,QAAM,mBAAe,4BAAY,CAAC,aAAqB;AACrD,QAAI,QAAQ,gBAAgB,MAAO;AACnC,aAAS,EAAE,MAAM,iBAAiB,SAAS,CAAC;AAC5C,cAAU,EAAE,MAAM,kBAAkB,SAAS,CAAC;AAAA,EAChD,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,QAAM,oBAAgB,4BAAY,CAAC,aAAqB;AACtD,QAAI,CAAC,MAAM,eAAe,QAAQ,iBAAiB,MAAO;AAC1D,aAAS,EAAE,MAAM,kBAAkB,UAAU,YAAY,MAAM,YAAY,CAAC;AAC5E,cAAU,EAAE,MAAM,mBAAmB,UAAU,YAAY,MAAM,YAAY,CAAC;AAAA,EAChF,GAAG,CAAC,MAAM,aAAa,QAAQ,SAAS,CAAC;AAGzC,QAAM,mBAAe,4BAAY,CAAC,aAAqB;AACrD,aAAS,EAAE,MAAM,iBAAiB,SAAS,CAAC;AAC5C,cAAU,EAAE,MAAM,mBAAmB,SAAS,CAAC;AAAA,EACjD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,iBAAa,4BAAY,CAAC,UAAkB,YAAoC;AACpF,QAAI,CAAC,MAAM,YAAa,QAAO;AAE/B,UAAM,UAAmB;AAAA,MACvB,IAAI,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU;AAAA,IACZ;AAEA,aAAS,EAAE,MAAM,eAAe,UAAU,QAAQ,CAAC;AACnD,cAAU,EAAE,MAAM,iBAAiB,UAAU,QAAQ,CAAC;AACtD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,aAAa,SAAS,CAAC;AAGjC,QAAM,oBAAgB,4BAAY,CAAC,UAAkB,WAAmB,YAAoB;AAC1F,QAAI,QAAQ,cAAc,MAAO;AAEjC,UAAM,SAAS,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,QAAQ;AACxD,UAAM,kBAAkB,QAAQ,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AACrE,QAAI,CAAC,gBAAiB;AAEtB,UAAM,iBAA0B;AAAA,MAC9B,GAAG;AAAA,MACH;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU;AAAA,IACZ;AAEA,aAAS,EAAE,MAAM,kBAAkB,UAAU,SAAS,eAAe,CAAC;AACtE,cAAU,EAAE,MAAM,mBAAmB,UAAU,SAAS,eAAe,CAAC;AAAA,EAC1E,GAAG,CAAC,MAAM,SAAS,QAAQ,SAAS,CAAC;AAGrC,QAAM,oBAAgB,4BAAY,CAAC,UAAkB,cAAsB;AACzE,QAAI,QAAQ,gBAAgB,MAAO;AACnC,aAAS,EAAE,MAAM,kBAAkB,UAAU,UAAU,CAAC;AACxD,cAAU,EAAE,MAAM,mBAAmB,UAAU,UAAU,CAAC;AAAA,EAC5D,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,QAAM,kBAAc,4BAAY,CAAC,UAAkB,WAAmB,UAAkB;AACtF,QAAI,CAAC,MAAM,eAAe,QAAQ,mBAAmB,MAAO;AAE5D,UAAM,gBAAgB,QAAQ,kBAAkB;AAChD,QAAI,CAAC,cAAc,SAAS,KAAK,EAAG;AAEpC,aAAS,EAAE,MAAM,gBAAgB,UAAU,WAAW,OAAO,MAAM,MAAM,YAAY,CAAC;AACtF,cAAU,EAAE,MAAM,kBAAkB,UAAU,WAAW,OAAO,MAAM,MAAM,YAAY,CAAC;AAAA,EAC3F,GAAG,CAAC,MAAM,aAAa,QAAQ,SAAS,CAAC;AAGzC,QAAM,qBAAiB,4BAAY,CAAC,UAAkB,WAAmB,UAAkB;AACzF,QAAI,CAAC,MAAM,YAAa;AACxB,aAAS,EAAE,MAAM,mBAAmB,UAAU,WAAW,OAAO,QAAQ,MAAM,YAAY,GAAG,CAAC;AAC9F,cAAU,EAAE,MAAM,oBAAoB,UAAU,WAAW,OAAO,QAAQ,MAAM,YAAY,GAAG,CAAC;AAAA,EAClG,GAAG,CAAC,MAAM,aAAa,SAAS,CAAC;AAGjC,QAAM,sBAAkB,4BAAY,CAAC,aAA4B;AAC/D,aAAS,EAAE,MAAM,qBAAqB,SAAS,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,CAAC,WAAqB;AACpD,aAAS,EAAE,MAAM,gBAAgB,OAAO,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAGL,QAAM,gBAAY,4BAAY,CAAC,WAAwC;AACrE,aAAS,EAAE,MAAM,cAAc,OAAO,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAGL,QAAM,uBAAmB,4BAAY,CAAC,MAAc,OAAe;AACjE,WAAO,MAAM,QAAQ,KAAK,OAAK,EAAE,MAAM,SAAS,QAAQ,EAAE,MAAM,OAAO,EAAE;AAAA,EAC3E,GAAG,CAAC,MAAM,OAAO,CAAC;AAGlB,QAAM,yBAAqB,4BAAY,MAAM;AAC3C,QAAI,MAAM,WAAW,MAAO,QAAO,MAAM;AACzC,WAAO,MAAM,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,MAAM;AAAA,EAC5D,GAAG,CAAC,MAAM,SAAS,MAAM,MAAM,CAAC;AAGhC,QAAM,gBAAY,4BAAY,CAAC,aAA4C;AACzE,mBAAe,QAAQ,IAAI,QAAQ;AACnC,WAAO,MAAM;AACX,qBAAe,QAAQ,OAAO,QAAQ;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAA8B;AAAA,IAClC;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EACf;AAEA,SACE,8CAAC,gBAAgB,UAAhB,EAAyB,OACvB,UACH;AAEJ;AAGO,SAAS,cAAc;AAC5B,QAAM,cAAU,2BAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO;AACT;AAGO,SAAS,sBAAsB;AACpC,aAAO,2BAAW,eAAe;AACnC;;;AC/cA,IAAAC,iBAAyB;AAuEjB,IAAAC,uBAAA;AA1DR,SAAS,mBAAmB,WAA2B;AACrD,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,QAAM,QAAQ,KAAK,MAAM,OAAO,IAAO;AACvC,QAAM,OAAO,KAAK,MAAM,OAAO,KAAQ;AAEvC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI;AAE5B,SAAO,IAAI,KAAK,SAAS,EAAE,mBAAmB;AAChD;AAGA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,oBAAoB;AACrC,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,QAAQ,OAAO;AAC9D,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AAExD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,EAAE,QAAQ,eAAe,eAAe,aAAa,gBAAgB,MAAM,IAAI;AACrF,QAAM,UAAU,QAAQ,cAAc,SAAS,QAAQ,OAAO,OAAO,MAAM,aAAa;AACxF,QAAM,YAAY,QAAQ,gBAAgB,SAAS,QAAQ,OAAO,OAAO,MAAM,aAAa;AAC5F,QAAM,WAAW,QAAQ,mBAAmB;AAC5C,QAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,QAAM,iBAAiB,MAAM;AAC3B,kBAAc,UAAU,QAAQ,IAAI,WAAW;AAC/C,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,uBAAuB,CAAC,UAAkB;AAC9C,UAAM,WAAW,QAAQ,WAAW,KAAK,OAAK,EAAE,UAAU,KAAK;AAC/D,UAAM,aAAa,UAAU,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,aAAa,EAAE;AAE3E,QAAI,YAAY;AACd,qBAAe,UAAU,QAAQ,IAAI,KAAK;AAAA,IAC5C,OAAO;AACL,kBAAY,UAAU,QAAQ,IAAI,KAAK;AAAA,IACzC;AACA,qBAAiB,KAAK;AAAA,EACxB;AAEA,SACE,+CAAC,SAAI,WAAW,eAAe,UAAU,sBAAsB,EAAE,IAC/D;AAAA,mDAAC,SAAI,WAAU,sBACb;AAAA,qDAAC,SAAI,WAAU,sBACZ;AAAA,gBAAQ,OAAO,SACd,8CAAC,SAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK,QAAQ,OAAO,MAAM,WAAU,sBAAqB,IAE1F,8CAAC,SAAI,WAAU,kCACZ,kBAAQ,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,GAC7C;AAAA,QAEF,8CAAC,UAAK,WAAU,2BAA2B,kBAAQ,OAAO,MAAK;AAAA,SACjE;AAAA,MACA,+CAAC,UAAK,WAAU,oBACb;AAAA,2BAAmB,QAAQ,SAAS;AAAA,QACpC,QAAQ,YAAY;AAAA,SACvB;AAAA,OACF;AAAA,IAEC,YACC,+CAAC,SAAI,WAAU,oBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA,UAC5C,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,+CAAC,SAAI,WAAU,4BACb;AAAA,sDAAC,YAAO,SAAS,gBAAgB,WAAU,wBAAuB,kBAAI;AAAA,QACtE,8CAAC,YAAO,SAAS,MAAM,aAAa,KAAK,GAAG,WAAU,0BAAyB,oBAAM;AAAA,SACvF;AAAA,OACF,IAEA,8CAAC,SAAI,WAAU,uBAAsB,yBAAyB,EAAE,QAAQ,QAAQ,QAAQ,GAAG;AAAA,IAI5F,QAAQ,aAAa,QAAQ,UAAU,SAAS,KAC/C,8CAAC,SAAI,WAAU,yBACZ,kBAAQ,UAAU,IAAI,cACrB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,wBACT,SAAS,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,aAAa,EAAE,IAAI,WAAW,EACxE;AAAA,QACA,SAAS,MAAM,qBAAqB,SAAS,KAAK;AAAA,QAClD,OAAO,SAAS,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,QAE/C;AAAA,mBAAS;AAAA,UAAM;AAAA,UAAE,SAAS,MAAM;AAAA;AAAA;AAAA,MAP5B,SAAS;AAAA,IAQhB,CACD,GACH;AAAA,IAIF,+CAAC,SAAI,WAAU,uBACZ;AAAA,kBACC,+CAAC,SAAI,WAAU,+BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,CAAC,aAAa;AAAA,YAC/C;AAAA;AAAA,QAED;AAAA,QACC,iBACC,8CAAC,SAAI,WAAU,iCACZ,yBAAe,IAAI,WAClB,8CAAC,YAAmB,SAAS,MAAM,qBAAqB,KAAK,GAC1D,mBADU,KAEb,CACD,GACH;AAAA,SAEJ;AAAA,MAED,WACC,8CAAC,YAAO,WAAU,0BAAyB,SAAS,MAAM,aAAa,IAAI,GAAG,kBAE9E;AAAA,MAED,aAAa,CAAC,WACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,cAAc,UAAU,QAAQ,EAAE;AAAA,UAClD;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,KACF;AAEJ;AAGA,SAAS,WAAW,EAAE,OAAO,GAA8B;AACzD,QAAM,WAAW,oBAAoB;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,EAAE;AACnD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,EAAE,OAAO,iBAAiB,YAAY,eAAe,cAAc,cAAc,OAAO,IAAI;AAClG,QAAM,WAAW,MAAM,mBAAmB,OAAO;AACjD,QAAM,aAAa,QAAQ,iBAAiB;AAE5C,QAAM,cAAc,MAAM;AACxB,QAAI,aAAa,KAAK,GAAG;AACvB,iBAAW,OAAO,IAAI,YAAY;AAClC,sBAAgB,EAAE;AAClB,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,cAAc,WAAW,sBAAsB,EAAE,IAC1D,OAAO,WAAW,aAAa,wBAAwB,EACzD;AAAA,MACA,SAAS,MAAM,gBAAgB,OAAO,EAAE;AAAA,MAGxC;AAAA,uDAAC,SAAI,WAAU,qBACb;AAAA,yDAAC,SAAI,WAAU,oBAAmB;AAAA;AAAA,YAAE,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE;AAAA,YAAE;AAAA,aAAI;AAAA,UACvE,+CAAC,SAAI,WAAU,mBACb;AAAA,0DAAC,UAAK,WAAW,uCAAuC,OAAO,MAAM,IAClE,iBAAO,QACV;AAAA,YACA,+CAAC,UAAK,WAAU,oBAAoB;AAAA,qBAAO,SAAS;AAAA,cAAO;AAAA,cAAS,OAAO,SAAS,WAAW,IAAI,MAAM;AAAA,eAAG;AAAA,aAC9G;AAAA,WACF;AAAA,QAGA,8CAAC,SAAI,WAAU,uBACZ,iBAAO,SAAS,IAAI,CAAC,SAAS,UAC7B;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,UAAU,OAAO;AAAA,YACjB,SAAS,UAAU;AAAA;AAAA,UAHd,QAAQ;AAAA,QAIf,CACD,GACH;AAAA,QAGC,OAAO,WAAW,UACjB,8CAAC,SAAI,WAAU,oBACZ,sBACC,gFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,OAAK,gBAAgB,EAAE,OAAO,KAAK;AAAA,cAC7C,aAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,+CAAC,SAAI,WAAU,4BACb;AAAA,0DAAC,YAAO,SAAS,aAAa,WAAU,mBAAkB,UAAU,CAAC,aAAa,KAAK,GAAG,mBAE1F;AAAA,YACA,8CAAC,YAAO,SAAS,MAAM,aAAa,KAAK,GAAG,WAAU,qBAAoB,oBAE1E;AAAA,aACF;AAAA,WACF,IAEA,8CAAC,YAAO,SAAS,MAAM,aAAa,IAAI,GAAG,WAAU,wBAAuB,mBAE5E,GAEJ;AAAA,QAIF,+CAAC,SAAI,WAAU,sBACZ;AAAA,wBAAc,OAAO,WAAW,UAC/B,8CAAC,YAAO,SAAS,MAAM,cAAc,OAAO,EAAE,GAAG,WAAU,mBAAkB,4BAE7E;AAAA,UAED,OAAO,WAAW,cACjB,8CAAC,YAAO,SAAS,MAAM,aAAa,OAAO,EAAE,GAAG,WAAU,kBAAiB,oBAE3E;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,OAAK;AACZ,kBAAE,gBAAgB;AAClB,6BAAa,OAAO,EAAE;AAAA,cACxB;AAAA,cACA,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGO,SAAS,cAAc,EAAE,WAAW,SAAS,YAAY,GAAG,GAAuB;AACxF,QAAM,WAAW,oBAAoB;AAErC,MAAI,CAAC,UAAU,aAAa,CAAC,SAAS,MAAM,aAAa;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,aAAa,WAAW,mBAAmB,IAAI;AAC9D,QAAM,kBAAkB,mBAAmB;AAE3C,SACE,+CAAC,SAAI,WAAW,yCAAyC,QAAQ,IAAI,SAAS,IAE5E;AAAA,mDAAC,SAAI,WAAU,6BACb;AAAA,oDAAC,QAAG,sBAAQ;AAAA,MACZ,8CAAC,YAAO,SAAS,MAAM,YAAY,KAAK,GAAG,WAAU,0BAAyB,kBAAC;AAAA,OACjF;AAAA,IAGA,8CAAC,SAAI,WAAU,wBACX,WAAC,OAAO,QAAQ,UAAU,EAAY,IAAI,YAC1C;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,uBAAuB,MAAM,WAAW,SAAS,WAAW,EAAE;AAAA,QACzE,SAAS,MAAM,UAAU,MAAM;AAAA,QAE9B;AAAA,iBAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAAA,UAChD,8CAAC,UAAK,WAAU,6BACb,qBAAW,QACR,MAAM,QAAQ,SACd,MAAM,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE,QACrD;AAAA;AAAA;AAAA,MATK;AAAA,IAUP,CACD,GACH;AAAA,IAGA,8CAAC,SAAI,WAAU,qBACZ,0BAAgB,WAAW,IAC1B,8CAAC,SAAI,WAAU,sBACZ,gBAAM,WAAW,QACd,oDACA,MAAM,MAAM,MAAM,cACxB,IAEA,gBAAgB,IAAI,YAClB,8CAAC,cAA2B,UAAX,OAAO,EAAoB,CAC7C,GAEL;AAAA,KACF;AAEJ;;;AC7TA,IAAAC,iBAAiG;AAge7F,IAAAC,uBAAA;AAtcJ,IAAMC,gBAAoC;AAAA,EACxC,UAAU,CAAC;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,kBAAkB;AACpB;AAGA,SAASC,cAAqB;AAC5B,SAAO,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACnE;AAGA,SAAS,sBAAsB,OAA4B,QAAmD;AAC5G,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,UAAU,OAAO,SAAS;AAAA,IAE/C,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,CAAC,OAAO,SAAS,GAAG,MAAM,QAAQ;AAAA,MAC9C;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS,OAAO,OAAK,EAAE,OAAO,OAAO,SAAS;AAAA,QAC9D,kBAAkB,MAAM,qBAAqB,OAAO,YAAY,OAAO,MAAM;AAAA,MAC/E;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS;AAAA,UAAI,OAC3B,EAAE,OAAO,OAAO,YAAY,EAAE,GAAG,GAAG,UAAU,KAAK,IAAI;AAAA,QACzD;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS;AAAA,UAAI,OAC3B,EAAE,OAAO,OAAO,YAAY,EAAE,GAAG,GAAG,UAAU,MAAM,IAAI;AAAA,QAC1D;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS;AAAA,UAAI,OAC3B,EAAE,OAAO,OAAO,YAAY,EAAE,GAAG,GAAG,OAAO,OAAO,MAAM,IAAI;AAAA,QAC9D;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,UAAU;AAAA,IAExD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,UAAU,CAAC,MAAM,YAAY;AAAA,IAEtE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa;AAAA,QACb,eAAe,OAAO;AAAA,QACtB,aAAa,OAAO;AAAA,MACtB;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,MACf;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,iBAAiB,OAAO,QAAQ;AAAA,IAErD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,SAAS;AAAA,IAEvD;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,WAAW,MAAsB;AACxC,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE;AAClD;AAGA,SAAS,YAAY,SAAiB,SAAkC;AACtE,QAAM,UAA2B,CAAC;AAClC,QAAM,WAAW,QAAQ,MAAM,IAAI;AACnC,QAAM,WAAW,QAAQ,MAAM,IAAI;AAEnC,MAAI,IAAI;AACR,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,UAAU,IAAI,SAAS,QAAQ;AACjD,QAAI,KAAK,SAAS,QAAQ;AAExB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,SAAS,CAAC;AAAA,QACnB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF,WAAW,KAAK,SAAS,QAAQ;AAE/B,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,SAAS,CAAC;AAAA,QACnB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF,WAAW,SAAS,CAAC,MAAM,SAAS,CAAC,GAAG;AAEtC;AACA;AAAA,IACF,OAAO;AAEL,YAAM,eAAe,SAAS,QAAQ,SAAS,CAAC,GAAG,CAAC;AACpD,YAAM,eAAe,SAAS,QAAQ,SAAS,CAAC,GAAG,CAAC;AAEpD,UAAI,iBAAiB,MAAM,iBAAiB,IAAI;AAE9C,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC;AAAA,UACzC,UAAU;AAAA,QACZ,CAAC;AACD;AACA;AAAA,MACF,WAAW,iBAAiB,IAAI;AAE9B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,SAAS,CAAC;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AACD;AAAA,MACF,OAAO;AAEL,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,SAAS,CAAC;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAwCA,IAAM,4BAAwB,8BAAiD,IAAI;AAY5E,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,kBAAkB,CAAC;AAAA,EACnB;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,CAAC,OAAO,QAAQ,QAAI,2BAAW,uBAAuB;AAAA,IAC1D,GAAGD;AAAA,IACH,UAAU;AAAA,IACV,iBAAiB,QAAQ,YAAY;AAAA,IACrC,kBAAkB,QAAQ,oBAAoB;AAAA,EAChD,CAAC;AAED,QAAM,qBAAiB,uBAAO,oBAAI,IAA0C,CAAC;AAC7E,QAAM,uBAAmB,uBAA8B,IAAI;AAC3D,QAAM,qBAAiB,uBAAe,EAAE;AACxC,QAAM,uBAAmB,uBAAO,gBAAgB,MAAM;AAGtD,gCAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,EAAE,KAAK,cAAY;AAC/B,iBAAS,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAC3C,yBAAiB,UAAU,SAAS;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM;AACd,uBAAmB,MAAM,QAAQ;AACjC,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,MAAM,QAAQ;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,kBAAkB,MAAM,CAAC;AAG7C,gCAAU,MAAM;AACd,QAAI,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,kBAAmB;AAE7D,qBAAiB,UAAU,YAAY,MAAM;AAC3C,YAAM,EAAE,MAAM,KAAK,IAAI,kBAAkB;AAGzC,UAAI,SAAS,eAAe,SAAS;AACnC,uBAAe,UAAU;AACzB,sBAAc,MAAM,MAAM,EAAE,YAAY,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,GAAG,MAAM,gBAAgB;AAEzB,WAAO,MAAM;AACX,UAAI,iBAAiB,SAAS;AAC5B,sBAAc,iBAAiB,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,iBAAiB,MAAM,kBAAkB,QAAQ,iBAAiB,CAAC;AAG7E,QAAM,gBAAY,4BAAY,CAAC,UAA+B;AAC5D,mBAAe,QAAQ,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,EAC5D,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAgB,4BAAY,CAChC,SACA,aACA,YACmB;AACnB,QAAI,CAAC,QAAQ,YAAa,QAAO;AAGjC,UAAM,cAAc,OAAO,eAAe;AAC1C,QAAI,WAAW,MAAM;AAErB,QAAI,SAAS,UAAU,aAAa;AAElC,YAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,OAAK,CAAC,EAAE,QAAQ;AACpE,UAAI,gBAAgB;AAClB,mBAAW,SAAS,OAAO,OAAK,EAAE,OAAO,eAAe,EAAE;AAAA,MAC5D;AAAA,IACF;AAEA,qBAAiB;AACjB,UAAM,cAAc,QAAQ,QAAQ,YAAY,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAE/E,UAAM,UAAmB;AAAA,MACvB,IAAIC,YAAW;AAAA,MACf,QAAQ,iBAAiB;AAAA,MACzB,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,WAAW,WAAW;AAAA,MACjC,gBAAgB,YAAY;AAAA,MAC5B,YAAY,SAAS,cAAc;AAAA,MACnC,UAAU;AAAA,IACZ;AAEA,aAAS,EAAE,MAAM,eAAe,QAAQ,CAAC;AACzC,cAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAC9C,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,MAAM,UAAU,SAAS,CAAC;AAGtC,QAAM,oBAAgB,4BAAY,CAAC,cAAsB;AACvD,aAAS,EAAE,MAAM,kBAAkB,UAAU,CAAC;AAC9C,cAAU,EAAE,MAAM,mBAAmB,UAAU,CAAC;AAAA,EAClD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,qBAAiB,4BAAY,CAAC,cAAqC;AACvE,UAAM,UAAU,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AAC3D,QAAI,CAAC,QAAS,QAAO;AAErB,YAAQ,YAAY,OAAO;AAC3B,cAAU,EAAE,MAAM,oBAAoB,UAAU,CAAC;AACjD,WAAO,QAAQ;AAAA,EACjB,GAAG,CAAC,MAAM,UAAU,QAAQ,SAAS,CAAC;AAGtC,QAAM,iBAAa,4BAAY,CAAC,cAAsB;AACpD,aAAS,EAAE,MAAM,eAAe,UAAU,CAAC;AAC3C,cAAU,EAAE,MAAM,kBAAkB,UAAU,CAAC;AAAA,EACjD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,mBAAe,4BAAY,CAAC,cAAsB;AACtD,aAAS,EAAE,MAAM,iBAAiB,UAAU,CAAC;AAC7C,cAAU,EAAE,MAAM,oBAAoB,UAAU,CAAC;AAAA,EACnD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,oBAAgB,4BAAY,CAAC,WAAmB,UAAkB;AACtE,aAAS,EAAE,MAAM,kBAAkB,WAAW,MAAM,CAAC;AACrD,cAAU,EAAE,MAAM,mBAAmB,WAAW,MAAM,CAAC;AAAA,EACzD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,kBAAc,4BAAY,CAAC,cAA6B;AAC5D,aAAS,EAAE,MAAM,uBAAuB,UAAU,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAoB,4BAAY,CAAC,cAAqC;AAC1E,UAAM,UAAU,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AAC3D,WAAO,SAAS,WAAW;AAAA,EAC7B,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,sBAAkB,4BAAY,CAAC,QAAgB,SAA2C;AAC9F,UAAM,cAAc,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,MAAM;AAC5D,UAAM,YAAY,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,IAAI;AAExD,QAAI,CAAC,eAAe,CAAC,UAAW,QAAO;AAEvC,UAAM,UAAU,YAAY,YAAY,aAAa,UAAU,WAAW;AAE1E,WAAO;AAAA,MACL,eAAe;AAAA,MACf,aAAa;AAAA,MACb;AAAA,MACA,OAAO;AAAA,QACL,WAAW,QAAQ,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE;AAAA,QACtD,WAAW,QAAQ,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE;AAAA,QACtD,eAAe,QAAQ,OAAO,OAAK,EAAE,SAAS,cAAc,EAAE;AAAA,MAChE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,mBAAe,4BAAY,CAAC,QAAgB,SAAiB;AACjE,aAAS,EAAE,MAAM,iBAAiB,QAAQ,KAAK,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,MAAM;AACpC,aAAS,EAAE,MAAM,eAAe,CAAC;AAAA,EACnC,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,CAAC,WAAqB;AACpD,aAAS,EAAE,MAAM,gBAAgB,OAAO,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,CAAC,YAAqB;AACpD,aAAS,EAAE,MAAM,iBAAiB,QAAQ,CAAC;AAC3C,cAAU,EAAE,MAAM,qBAAqB,QAAQ,CAAC;AAAA,EAClD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,iBAAa,4BAAY,CAAC,cAAsB;AACpD,WAAO,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AAAA,EACpD,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,uBAAmB,4BAAY,MAAM;AACzC,WAAO,MAAM,SAAS,CAAC;AAAA,EACzB,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,WAAO,MAAM,SAAS,OAAO,OAAK,EAAE,QAAQ;AAAA,EAC9C,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,gBAAY,4BAAY,CAAC,aAAmD;AAChF,mBAAe,QAAQ,IAAI,QAAQ;AACnC,WAAO,MAAM;AACX,qBAAe,QAAQ,OAAO,QAAQ;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAoC;AAAA,IACxC;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EACf;AAEA,SACE,8CAAC,sBAAsB,UAAtB,EAA+B,OAC7B,UACH;AAEJ;AAGO,SAAS,oBAAoB;AAClC,QAAM,cAAU,2BAAW,qBAAqB;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AACA,SAAO;AACT;AAGO,SAAS,4BAA4B;AAC1C,aAAO,2BAAW,qBAAqB;AACzC;;;AClfA,IAAAC,iBAAyB;AA6Eb,IAAAC,uBAAA;AAjEZ,SAAS,WAAW,WAA2B;AAC7C,QAAM,OAAO,IAAI,KAAK,SAAS;AAC/B,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAAU,KAAK,aAAa,MAAM,IAAI,aAAa;AAEzD,MAAI,SAAS;AACX,WAAO,YAAY,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,EACxF;AAEA,QAAM,YAAY,IAAI,KAAK,GAAG;AAC9B,YAAU,QAAQ,UAAU,QAAQ,IAAI,CAAC;AACzC,MAAI,KAAK,aAAa,MAAM,UAAU,aAAa,GAAG;AACpD,WAAO,gBAAgB,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,EAC5F;AAEA,SAAO,KAAK,mBAAmB,CAAC,GAAG;AAAA,IACjC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;AAGA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAWG;AACD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,QAAQ,SAAS,EAAE;AAE5D,QAAM,eAAe,MAAM;AACzB,aAAS,QAAQ;AACjB,kBAAc,KAAK;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oBAAoB,YAAY,wBAAwB,EAAE,IACnE,gBAAgB,6BAA6B,EAC/C,IAAI,cAAc,2BAA2B,EAAE;AAAA,MAG/C;AAAA,uDAAC,SAAI,WAAU,sBAAqB,SAAS,QAC3C;AAAA,yDAAC,SAAI,WAAU,oBACZ;AAAA,yBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,OAAK,YAAY,EAAE,OAAO,KAAK;AAAA,gBACzC,QAAQ;AAAA,gBACR,WAAW,OAAK,EAAE,QAAQ,WAAW,aAAa;AAAA,gBAClD,WAAU;AAAA,gBACV,SAAS,OAAK,EAAE,gBAAgB;AAAA,gBAChC,WAAS;AAAA;AAAA,YACX,IAEA,+CAAC,UAAK,WAAU,qBACb;AAAA,sBAAQ,SAAS,WAAW,QAAQ,MAAM;AAAA,cAC1C,QAAQ,YAAY,8CAAC,UAAK,WAAU,wBAAuB,uBAAE;AAAA,cAC7D,QAAQ,cAAc,8CAAC,UAAK,WAAU,0BAAyB,kBAAI;AAAA,eACtE;AAAA,YAEF,8CAAC,UAAK,WAAU,oBAAoB,qBAAW,QAAQ,SAAS,GAAE;AAAA,aACpE;AAAA,UACA,+CAAC,SAAI,WAAU,sBACZ;AAAA,oBAAQ,OAAO,SACd,8CAAC,SAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK,QAAQ,OAAO,MAAM,WAAU,sBAAqB,IAE1F,8CAAC,SAAI,WAAU,kCACZ,kBAAQ,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,GAC7C;AAAA,YAEF,8CAAC,UAAM,kBAAQ,OAAO,MAAK;AAAA,aAC7B;AAAA,WACF;AAAA,QAGA,+CAAC,SAAI,WAAU,qBACb;AAAA,yDAAC,UAAM;AAAA,oBAAQ;AAAA,YAAU;AAAA,aAAM;AAAA,UAC/B,+CAAC,UAAM;AAAA,oBAAQ;AAAA,YAAe;AAAA,aAAM;AAAA,WACtC;AAAA,QAGA,+CAAC,SAAI,WAAU,uBACb;AAAA,wDAAC,YAAO,SAAS,WAAW,WAAU,mBAAkB,OAAM,wBAAuB,4BAErF;AAAA,UACA,8CAAC,YAAO,SAAS,iBAAiB,WAAU,mBAAkB,OAAM,gCAA+B,4BAEnG;AAAA,UACA,8CAAC,YAAO,SAAS,OAAO,WAAU,mBAAkB,OAAO,QAAQ,WAAW,UAAU,OACrF,kBAAQ,WAAW,oBAAa,iBACnC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,cAAc,IAAI;AAAA,cACjC,WAAU;AAAA,cACV,OAAM;AAAA,cACP;AAAA;AAAA,UAED;AAAA,UACC,CAAC,QAAQ,YACR,8CAAC,YAAO,SAAS,UAAU,WAAU,0CAAyC,OAAM,UAAS,6BAE7F;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,iBAAiB,0BAA0B;AACjD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,aAAa,eAAe,gBAAgB,YAAY,IAAI,UAAU,EAAE;AAE9E,SACE,+CAAC,SAAI,WAAU,0BACb;AAAA,mDAAC,SAAI,WAAU,iCACb;AAAA,oDAAC,QAAG,gCAAkB;AAAA,MACtB,8CAAC,YAAO,SAAS,SAAS,WAAU,gCAA+B,kBAAC;AAAA,OACtE;AAAA,IAEA,+CAAC,SAAI,WAAU,+BACb;AAAA,qDAAC,SAAI,WAAU,+BACb;AAAA,sDAAC,UAAK,WAAU,gCAA+B,mBAAK;AAAA,QACnD,YAAY,SAAS,WAAW,YAAY,MAAM;AAAA,SACrD;AAAA,MACA,8CAAC,UAAK,WAAU,gCAA+B,oBAAC;AAAA,MAChD,+CAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,UAAK,WAAU,gCAA+B,iBAAG;AAAA,QACjD,UAAU,SAAS,WAAW,UAAU,MAAM;AAAA,SACjD;AAAA,OACF;AAAA,IAEC,cACC,+CAAC,SAAI,WAAU,gCACb;AAAA,qDAAC,UAAK,WAAU,gDAA+C;AAAA;AAAA,QAC3D,WAAW,MAAM;AAAA,QAAU;AAAA,SAC/B;AAAA,MACA,+CAAC,UAAK,WAAU,gDAA+C;AAAA;AAAA,QAC3D,WAAW,MAAM;AAAA,QAAU;AAAA,SAC/B;AAAA,MACA,+CAAC,UAAK,WAAU,oDAAmD;AAAA;AAAA,QAC/D,WAAW,MAAM;AAAA,QAAc;AAAA,SACnC;AAAA,OACF;AAAA,IAGF,8CAAC,SAAI,WAAU,+BACZ,sBAAY,QAAQ,IAAI,CAAC,QAAQ,UAChC,+CAAC,SAAgB,WAAW,0BAA0B,OAAO,IAAI,IAC/D;AAAA,oDAAC,UAAK,WAAU,sBACb,iBAAO,SAAS,aAAa,MAAM,OAAO,SAAS,aAAa,MAAM,KACzE;AAAA,MACA,8CAAC,UAAK,WAAU,oBAAoB,iBAAO,SAAQ;AAAA,SAJ3C,KAKV,CACD,GACH;AAAA,KACF;AAEJ;AAGO,SAAS,oBAAoB,EAAE,WAAW,SAAS,YAAY,GAAG,GAA6B;AACpG,QAAM,iBAAiB,0BAA0B;AACjD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAwB,IAAI;AAEtE,MAAI,CAAC,gBAAgB,aAAa,CAAC,eAAe,MAAM,aAAa;AACnE,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,gBAAgB,CAAC,cAAsB;AAC3C,UAAM,UAAU,eAAe,SAAS;AACxC,QAAI,SAAS;AACX,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,cAAsB;AACjD,QAAI,CAAC,eAAe;AAClB,uBAAiB,SAAS;AAAA,IAC5B,OAAO;AACL,qBAAe,aAAa,eAAe,SAAS;AACpD,uBAAiB,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,qBAAiB,IAAI;AACrB,gBAAY;AAAA,EACd;AAGA,QAAM,qBAAqB,MAAM,gBAAgB,WAAW,MAAM,aAAa,IAAI;AACnF,QAAM,mBAAmB,MAAM,cAAc,WAAW,MAAM,WAAW,IAAI;AAE7E,SACE,+CAAC,SAAI,WAAW,uCAAuC,QAAQ,IAAI,SAAS,IAE1E;AAAA,mDAAC,SAAI,WAAU,4BACb;AAAA,oDAAC,QAAG,6BAAe;AAAA,MACnB,8CAAC,YAAO,SAAS,MAAM,YAAY,KAAK,GAAG,WAAU,yBAAwB,kBAAC;AAAA,OAChF;AAAA,IAGA,+CAAC,SAAI,WAAU,wBACb;AAAA,qDAAC,WAAM,WAAU,8BACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAAA,YACf,UAAU,OAAK,YAAY,EAAE,OAAO,OAAO;AAAA;AAAA,QAC7C;AAAA,QAAE;AAAA,SAEJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,cAAc,IAAI,QAAW,EAAE,YAAY,MAAM,CAAC;AAAA,UACjE,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAGC,iBAAiB,CAAC,MAAM,eACvB,+CAAC,SAAI,WAAU,4BACb;AAAA,oDAAC,UAAK,+CAAiC;AAAA,MACvC,8CAAC,YAAO,SAAS,qBAAqB,oBAAM;AAAA,OAC9C;AAAA,IAID,MAAM,eAAe,sBAAsB,oBAC1C;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,QACb,WAAW;AAAA,QACX,SAAS;AAAA;AAAA,IACX;AAAA,IAID,CAAC,MAAM,eACN,8CAAC,SAAI,WAAU,oBACZ,gBAAM,SAAS,WAAW,IACzB,8CAAC,SAAI,WAAU,qBAAoB,6EAEnC,IAEA,gFAEG;AAAA,YAAM,SAAS,KAAK,OAAK,EAAE,QAAQ,KAClC,+CAAC,SAAI,WAAU,uBACb;AAAA,sDAAC,SAAI,WAAU,6BAA4B,8BAAS;AAAA,QACnD,MAAM,SACJ,OAAO,OAAK,EAAE,QAAQ,EACtB,IAAI,aACH;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,MAAM,qBAAqB,QAAQ;AAAA,YAC9C,eAAe,kBAAkB,QAAQ;AAAA,YACzC,aAAa;AAAA,YACb,QAAQ,MAAM,YAAY,QAAQ,EAAE;AAAA,YACpC,WAAW,MAAM,cAAc,QAAQ,EAAE;AAAA,YACzC,OAAO,MAAM,aAAa,QAAQ,EAAE;AAAA,YACpC,UAAU,WAAS,cAAc,QAAQ,IAAI,KAAK;AAAA,YAClD,UAAU,MAAM,cAAc,QAAQ,EAAE;AAAA,YACxC,iBAAiB,MAAM,oBAAoB,QAAQ,EAAE;AAAA;AAAA,UAVhD,QAAQ;AAAA,QAWf,CACD;AAAA,SACL;AAAA,MAIF,+CAAC,SAAI,WAAU,uBACb;AAAA,sDAAC,SAAI,WAAU,6BAA4B,oBAAM;AAAA,QAChD,MAAM,SACJ,OAAO,OAAK,CAAC,EAAE,QAAQ,EACvB,IAAI,aACH;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,MAAM,qBAAqB,QAAQ;AAAA,YAC9C,eAAe,kBAAkB,QAAQ;AAAA,YACzC,aAAa;AAAA,YACb,QAAQ,MAAM,YAAY,QAAQ,EAAE;AAAA,YACpC,WAAW,MAAM,cAAc,QAAQ,EAAE;AAAA,YACzC,OAAO,MAAM,WAAW,QAAQ,EAAE;AAAA,YAClC,UAAU,WAAS,cAAc,QAAQ,IAAI,KAAK;AAAA,YAClD,UAAU,MAAM,cAAc,QAAQ,EAAE;AAAA,YACxC,iBAAiB,MAAM,oBAAoB,QAAQ,EAAE;AAAA;AAAA,UAVhD,QAAQ;AAAA,QAWf,CACD;AAAA,SACL;AAAA,OACF,GAEJ;AAAA,IAID,MAAM,oBACL,+CAAC,SAAI,WAAU,iCACb;AAAA,qDAAC,UAAK;AAAA;AAAA,QAAU,WAAW,MAAM,gBAAgB,GAAG,SAAS,WAAW,WAAW,MAAM,gBAAgB,GAAG,MAAM;AAAA,SAAG;AAAA,MACrH,8CAAC,YAAO,SAAS,MAAM,YAAY,IAAI,GAAG,WAAU,wBAAuB,oCAE3E;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":["import_core","import_core","import_core","import_core","import_core","import_core","ToolbarButton","import_react","import_jsx_runtime","editor","import_react","import_jsx_runtime","toggleMark","toggleBlock","isMarkActive","isBlockActive","SlateElement","import_react","import_slate","import_slate_react","import_jsx_runtime","SlateElement","isHotkey","import_react","import_rich_text","import_lexical","import_jsx_runtime","ToolbarButton","icons","import_react","import_rich_text","import_list","import_link","import_code","import_table","import_LexicalHorizontalRuleNode","import_lexical","import_jsx_runtime","import_react","TipTapEditorComponent","SlateEditorComponent","LexicalEditorComponent","import_jsx_runtime","import_react","import_extension_document","import_extension_paragraph","import_extension_text","import_extension_bold","import_extension_italic","import_extension_underline","import_extension_strike","import_extension_code","import_extension_code_block_lowlight","import_extension_subscript","import_extension_superscript","import_extension_text_style","import_extension_font_family","import_extension_color","import_extension_highlight","import_extension_text_align","import_extension_heading","import_extension_bullet_list","import_extension_ordered_list","import_extension_list_item","import_extension_blockquote","import_extension_horizontal_rule","import_extension_link","import_extension_image","import_extension_table","import_extension_table_row","import_extension_table_cell","import_extension_table_header","import_extension_history","import_extension_placeholder","import_extension_character_count","import_extension_gapcursor","import_extension_dropcursor","import_extension_hard_break","import_lowlight","import_react","import_lucide_react","import_jsx_runtime","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","EmojiPicker","ToolbarButton","import_jsx_runtime","lowlight","toolbarPresets","editor","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","initialState","import_react","import_jsx_runtime","import_react","import_jsx_runtime","initialState","generateId","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/extensions/FontSize.ts","../src/extensions/LineHeight.ts","../src/extensions/Video.ts","../src/extensions/Emoji.ts","../src/extensions/Fullscreen.ts","../src/extensions/Print.ts","../src/extensions/Indent.ts","../src/adapters/tiptap/TipTapToolbar.tsx","../src/adapters/tiptap/TipTapEditorComponent.tsx","../src/adapters/slate/SlateToolbar.tsx","../src/adapters/slate/SlateEditorComponent.tsx","../src/adapters/lexical/LexicalToolbar.tsx","../src/adapters/lexical/LexicalEditorComponent.tsx","../src/index.tsx","../src/components/UnifiedEditor.tsx","../src/core/registry.ts","../src/core/presets.ts","../src/core/types.ts","../src/adapters/tiptap/TipTapAdapter.ts","../src/adapters/tiptap/index.ts","../src/adapters/slate/SlateAdapter.ts","../src/adapters/lexical/LexicalAdapter.ts","../src/components/RichTextEditor.tsx","../src/components/Toolbar.tsx","../src/collaboration/CollaborationContext.tsx","../src/collaboration/PresenceIndicator.tsx","../src/comments/types.ts","../src/comments/CommentsContext.tsx","../src/comments/CommentsPanel.tsx","../src/history/VersionHistoryContext.tsx","../src/history/VersionHistoryPanel.tsx"],"sourcesContent":["import { Extension } from '@tiptap/core'\r\n\r\nexport type FontSizeOptions = {\r\n types: string[]\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n fontSize: {\r\n /**\r\n * Set the font size\r\n */\r\n setFontSize: (size: string) => ReturnType\r\n /**\r\n * Unset the font size\r\n */\r\n unsetFontSize: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const FontSize = Extension.create<FontSizeOptions>({\r\n name: 'fontSize',\r\n\r\n addOptions() {\r\n return {\r\n types: ['textStyle'],\r\n }\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: (element) =>\r\n element.style.fontSize?.replace(/['\"]+/g, ''),\r\n renderHTML: (attributes) => {\r\n if (!attributes.fontSize) {\r\n return {}\r\n }\r\n\r\n return {\r\n style: `font-size: ${attributes.fontSize}`,\r\n }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setFontSize:\r\n (fontSize) =>\r\n ({ chain }) => {\r\n return chain().setMark('textStyle', { fontSize }).run()\r\n },\r\n unsetFontSize:\r\n () =>\r\n ({ chain }) => {\r\n return chain()\r\n .setMark('textStyle', { fontSize: null })\r\n .removeEmptyTextStyle()\r\n .run()\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport type LineHeightOptions = {\r\n types: string[]\r\n defaultLineHeight: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n lineHeight: {\r\n /**\r\n * Set the line height\r\n */\r\n setLineHeight: (lineHeight: string) => ReturnType\r\n /**\r\n * Unset the line height\r\n */\r\n unsetLineHeight: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const LineHeight = Extension.create<LineHeightOptions>({\r\n name: 'lineHeight',\r\n\r\n addOptions() {\r\n return {\r\n types: ['paragraph', 'heading'],\r\n defaultLineHeight: 'normal',\r\n }\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n lineHeight: {\r\n default: null,\r\n parseHTML: (element) =>\r\n element.style.lineHeight || this.options.defaultLineHeight,\r\n renderHTML: (attributes) => {\r\n if (!attributes.lineHeight) {\r\n return {}\r\n }\r\n\r\n return {\r\n style: `line-height: ${attributes.lineHeight}`,\r\n }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setLineHeight:\r\n (lineHeight) =>\r\n ({ commands }) => {\r\n return this.options.types.every((type) =>\r\n commands.updateAttributes(type, { lineHeight }),\r\n )\r\n },\r\n unsetLineHeight:\r\n () =>\r\n ({ commands }) => {\r\n return this.options.types.every((type) =>\r\n commands.resetAttributes(type, 'lineHeight'),\r\n )\r\n },\r\n }\r\n },\r\n})\r\n","import { Node, mergeAttributes } from '@tiptap/core'\r\n\r\nexport interface VideoOptions {\r\n inline: boolean\r\n allowBase64: boolean\r\n HTMLAttributes: Record<string, unknown>\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n video: {\r\n /**\r\n * Insert a video\r\n */\r\n setVideo: (options: { src: string; alt?: string; title?: string }) => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const Video = Node.create<VideoOptions>({\r\n name: 'video',\r\n\r\n addOptions() {\r\n return {\r\n inline: false,\r\n allowBase64: false,\r\n HTMLAttributes: {},\r\n }\r\n },\r\n\r\n inline() {\r\n return this.options.inline\r\n },\r\n\r\n group() {\r\n return this.options.inline ? 'inline' : 'block'\r\n },\r\n\r\n draggable: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n alt: {\r\n default: null,\r\n },\r\n title: {\r\n default: null,\r\n },\r\n width: {\r\n default: null,\r\n },\r\n height: {\r\n default: null,\r\n },\r\n controls: {\r\n default: true,\r\n },\r\n }\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'video',\r\n },\r\n ]\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n 'video',\r\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\r\n ['source', { src: HTMLAttributes.src }],\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setVideo:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n })\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface EmojiOptions {\r\n enableEmoticons: boolean\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n emoji: {\r\n /**\r\n * Insert an emoji at the current position\r\n */\r\n insertEmoji: (emoji: string) => ReturnType\r\n }\r\n }\r\n}\r\n\r\n// Common emoji categories\r\nexport const EMOJI_CATEGORIES = {\r\n smileys: {\r\n label: 'Smileys & People',\r\n emojis: [\r\n '๐Ÿ˜€', '๐Ÿ˜ƒ', '๐Ÿ˜„', '๐Ÿ˜', '๐Ÿ˜†', '๐Ÿ˜…', '๐Ÿคฃ', '๐Ÿ˜‚', '๐Ÿ™‚', '๐Ÿ™ƒ',\r\n '๐Ÿ˜‰', '๐Ÿ˜Š', '๐Ÿ˜‡', '๐Ÿฅฐ', '๐Ÿ˜', '๐Ÿคฉ', '๐Ÿ˜˜', '๐Ÿ˜—', '๐Ÿ˜š', '๐Ÿ˜™',\r\n '๐Ÿฅฒ', '๐Ÿ˜‹', '๐Ÿ˜›', '๐Ÿ˜œ', '๐Ÿคช', '๐Ÿ˜', '๐Ÿค‘', '๐Ÿค—', '๐Ÿคญ', '๐Ÿคซ',\r\n '๐Ÿค”', '๐Ÿค', '๐Ÿคจ', '๐Ÿ˜', '๐Ÿ˜‘', '๐Ÿ˜ถ', '๐Ÿ˜', '๐Ÿ˜’', '๐Ÿ™„', '๐Ÿ˜ฌ',\r\n '๐Ÿ˜ฎโ€๐Ÿ’จ', '๐Ÿคฅ', '๐Ÿ˜Œ', '๐Ÿ˜”', '๐Ÿ˜ช', '๐Ÿคค', '๐Ÿ˜ด', '๐Ÿ˜ท', '๐Ÿค’', '๐Ÿค•',\r\n '๐Ÿคข', '๐Ÿคฎ', '๐Ÿคง', '๐Ÿฅต', '๐Ÿฅถ', '๐Ÿฅด', '๐Ÿ˜ต', '๐Ÿคฏ', '๐Ÿค ', '๐Ÿฅณ',\r\n '๐Ÿฅธ', '๐Ÿ˜Ž', '๐Ÿค“', '๐Ÿง', '๐Ÿ˜•', '๐Ÿ˜Ÿ', '๐Ÿ™', 'โ˜น๏ธ', '๐Ÿ˜ฎ', '๐Ÿ˜ฏ',\r\n '๐Ÿ˜ฒ', '๐Ÿ˜ณ', '๐Ÿฅบ', '๐Ÿ˜ฆ', '๐Ÿ˜ง', '๐Ÿ˜จ', '๐Ÿ˜ฐ', '๐Ÿ˜ฅ', '๐Ÿ˜ข', '๐Ÿ˜ญ',\r\n '๐Ÿ˜ฑ', '๐Ÿ˜–', '๐Ÿ˜ฃ', '๐Ÿ˜ž', '๐Ÿ˜“', '๐Ÿ˜ฉ', '๐Ÿ˜ซ', '๐Ÿฅฑ', '๐Ÿ˜ค', '๐Ÿ˜ก',\r\n '๐Ÿ˜ ', '๐Ÿคฌ', '๐Ÿ˜ˆ', '๐Ÿ‘ฟ', '๐Ÿ’€', 'โ˜ ๏ธ', '๐Ÿ’ฉ', '๐Ÿคก', '๐Ÿ‘น', '๐Ÿ‘บ',\r\n ]\r\n },\r\n gestures: {\r\n label: 'Gestures & Body',\r\n emojis: [\r\n '๐Ÿ‘‹', '๐Ÿคš', '๐Ÿ–๏ธ', 'โœ‹', '๐Ÿ––', '๐Ÿ‘Œ', '๐ŸคŒ', '๐Ÿค', 'โœŒ๏ธ', '๐Ÿคž',\r\n '๐ŸคŸ', '๐Ÿค˜', '๐Ÿค™', '๐Ÿ‘ˆ', '๐Ÿ‘‰', '๐Ÿ‘†', '๐Ÿ–•', '๐Ÿ‘‡', 'โ˜๏ธ', '๐Ÿ‘',\r\n '๐Ÿ‘Ž', 'โœŠ', '๐Ÿ‘Š', '๐Ÿค›', '๐Ÿคœ', '๐Ÿ‘', '๐Ÿ™Œ', '๐Ÿ‘', '๐Ÿคฒ', '๐Ÿค',\r\n '๐Ÿ™', 'โœ๏ธ', '๐Ÿ’…', '๐Ÿคณ', '๐Ÿ’ช', '๐Ÿฆพ', '๐Ÿฆฟ', '๐Ÿฆต', '๐Ÿฆถ', '๐Ÿ‘‚',\r\n '๐Ÿฆป', '๐Ÿ‘ƒ', '๐Ÿง ', '๐Ÿซ€', '๐Ÿซ', '๐Ÿฆท', '๐Ÿฆด', '๐Ÿ‘€', '๐Ÿ‘๏ธ', '๐Ÿ‘…',\r\n '๐Ÿ‘„', '๐Ÿ’‹', '๐Ÿฉธ',\r\n ]\r\n },\r\n animals: {\r\n label: 'Animals & Nature',\r\n emojis: [\r\n '๐Ÿถ', '๐Ÿฑ', '๐Ÿญ', '๐Ÿน', '๐Ÿฐ', '๐ŸฆŠ', '๐Ÿป', '๐Ÿผ', '๐Ÿปโ€โ„๏ธ', '๐Ÿจ',\r\n '๐Ÿฏ', '๐Ÿฆ', '๐Ÿฎ', '๐Ÿท', '๐Ÿธ', '๐Ÿต', '๐Ÿ™ˆ', '๐Ÿ™‰', '๐Ÿ™Š', '๐Ÿ’',\r\n '๐Ÿ”', '๐Ÿง', '๐Ÿฆ', '๐Ÿค', '๐Ÿฃ', '๐Ÿฅ', '๐Ÿฆ†', '๐Ÿฆ…', '๐Ÿฆ‰', '๐Ÿฆ‡',\r\n '๐Ÿบ', '๐Ÿ—', '๐Ÿด', '๐Ÿฆ„', '๐Ÿ', '๐Ÿ›', '๐Ÿฆ‹', '๐ŸŒ', '๐Ÿž', '๐Ÿœ',\r\n '๐ŸฆŸ', '๐Ÿฆ—', '๐Ÿฆ‚', '๐Ÿข', '๐Ÿ', '๐ŸฆŽ', '๐Ÿฆ–', '๐Ÿฆ•', '๐Ÿ™', '๐Ÿฆ‘',\r\n '๐Ÿฆ', '๐Ÿฆž', '๐Ÿฆ€', '๐Ÿก', '๐Ÿ ', '๐ŸŸ', '๐Ÿฌ', '๐Ÿณ', '๐Ÿ‹', '๐Ÿฆˆ',\r\n '๐ŸŠ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฆ“', '๐Ÿฆ', '๐Ÿฆง', '๐Ÿฆฃ', '๐Ÿ˜', '๐Ÿฆ›', '๐Ÿฆ',\r\n '๐ŸŒธ', '๐ŸŒบ', '๐ŸŒป', '๐ŸŒผ', '๐ŸŒท', '๐ŸŒน', '๐Ÿฅ€', '๐ŸŒต', '๐ŸŒฒ', '๐ŸŒณ',\r\n '๐ŸŒด', '๐ŸŒฑ', '๐ŸŒฟ', 'โ˜˜๏ธ', '๐Ÿ€', '๐Ÿ', '๐Ÿ‚', '๐Ÿƒ', '๐Ÿ„', '๐ŸŒพ',\r\n ]\r\n },\r\n food: {\r\n label: 'Food & Drink',\r\n emojis: [\r\n '๐ŸŽ', '๐Ÿ', '๐ŸŠ', '๐Ÿ‹', '๐ŸŒ', '๐Ÿ‰', '๐Ÿ‡', '๐Ÿ“', '๐Ÿซ', '๐Ÿˆ',\r\n '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅญ', '๐Ÿ', '๐Ÿฅฅ', '๐Ÿฅ', '๐Ÿ…', '๐Ÿ†', '๐Ÿฅ‘', '๐Ÿฅฆ',\r\n '๐Ÿฅฌ', '๐Ÿฅ’', '๐ŸŒถ๏ธ', '๐Ÿซ‘', '๐ŸŒฝ', '๐Ÿฅ•', '๐Ÿซ’', '๐Ÿง„', '๐Ÿง…', '๐Ÿฅ”',\r\n '๐Ÿ ', '๐Ÿฅ', '๐Ÿฅฏ', '๐Ÿž', '๐Ÿฅ–', '๐Ÿฅจ', '๐Ÿง€', '๐Ÿฅš', '๐Ÿณ', '๐Ÿงˆ',\r\n '๐Ÿฅž', '๐Ÿง‡', '๐Ÿฅ“', '๐Ÿฅฉ', '๐Ÿ—', '๐Ÿ–', '๐Ÿฆด', '๐ŸŒญ', '๐Ÿ”', '๐ŸŸ',\r\n '๐Ÿ•', '๐Ÿซ“', '๐Ÿฅช', '๐Ÿฅ™', '๐Ÿง†', '๐ŸŒฎ', '๐ŸŒฏ', '๐Ÿซ”', '๐Ÿฅ—', '๐Ÿฅ˜',\r\n '๐Ÿซ•', '๐Ÿ', '๐Ÿœ', '๐Ÿฒ', '๐Ÿ›', '๐Ÿฃ', '๐Ÿฑ', '๐ŸฅŸ', '๐Ÿฆช', '๐Ÿค',\r\n '๐Ÿ™', '๐Ÿš', '๐Ÿ˜', '๐Ÿฅ', '๐Ÿฅ ', '๐Ÿฅฎ', '๐Ÿข', '๐Ÿก', '๐Ÿง', '๐Ÿจ',\r\n '๐Ÿฆ', '๐Ÿฅง', '๐Ÿง', '๐Ÿฐ', '๐ŸŽ‚', '๐Ÿฎ', '๐Ÿญ', '๐Ÿฌ', '๐Ÿซ', '๐Ÿฟ',\r\n '๐Ÿฉ', '๐Ÿช', '๐ŸŒฐ', '๐Ÿฅœ', '๐Ÿฏ', 'โ˜•', '๐Ÿต', '๐Ÿงƒ', '๐Ÿฅค', '๐Ÿถ',\r\n '๐Ÿบ', '๐Ÿป', '๐Ÿฅ‚', '๐Ÿท', '๐Ÿฅƒ', '๐Ÿธ', '๐Ÿน', '๐Ÿง‰', '๐ŸงŠ',\r\n ]\r\n },\r\n activities: {\r\n label: 'Activities',\r\n emojis: [\r\n 'โšฝ', '๐Ÿ€', '๐Ÿˆ', 'โšพ', '๐ŸฅŽ', '๐ŸŽพ', '๐Ÿ', '๐Ÿ‰', '๐Ÿฅ', '๐ŸŽฑ',\r\n '๐Ÿช€', '๐Ÿ“', '๐Ÿธ', '๐Ÿ’', '๐Ÿ‘', '๐Ÿฅ', '๐Ÿ', '๐Ÿชƒ', '๐Ÿฅ…', 'โ›ณ',\r\n '๐Ÿช', '๐Ÿน', '๐ŸŽฃ', '๐Ÿคฟ', '๐ŸฅŠ', '๐Ÿฅ‹', '๐ŸŽฝ', '๐Ÿ›น', '๐Ÿ›ผ', '๐Ÿ›ท',\r\n 'โ›ธ๏ธ', '๐ŸฅŒ', '๐ŸŽฟ', 'โ›ท๏ธ', '๐Ÿ‚', '๐Ÿช‚', '๐Ÿ‹๏ธ', '๐Ÿคผ', '๐Ÿคธ', 'โ›น๏ธ',\r\n '๐Ÿคบ', '๐Ÿคพ', '๐ŸŒ๏ธ', '๐Ÿ‡', '๐Ÿง˜', '๐Ÿ„', '๐ŸŠ', '๐Ÿคฝ', '๐Ÿšฃ', '๐Ÿง—',\r\n '๐Ÿšต', '๐Ÿšด', '๐Ÿ†', '๐Ÿฅ‡', '๐Ÿฅˆ', '๐Ÿฅ‰', '๐Ÿ…', '๐ŸŽ–๏ธ', '๐Ÿต๏ธ', '๐ŸŽ—๏ธ',\r\n '๐ŸŽซ', '๐ŸŽŸ๏ธ', '๐ŸŽช', '๐ŸŽญ', '๐ŸŽจ', '๐ŸŽฌ', '๐ŸŽค', '๐ŸŽง', '๐ŸŽผ', '๐ŸŽน',\r\n '๐Ÿฅ', '๐Ÿช˜', '๐ŸŽท', '๐ŸŽบ', '๐Ÿช—', '๐ŸŽธ', '๐Ÿช•', '๐ŸŽป', '๐ŸŽฒ', 'โ™Ÿ๏ธ',\r\n '๐ŸŽฏ', '๐ŸŽณ', '๐ŸŽฎ', '๐ŸŽฐ', '๐Ÿงฉ',\r\n ]\r\n },\r\n objects: {\r\n label: 'Objects',\r\n emojis: [\r\n 'โŒš', '๐Ÿ“ฑ', '๐Ÿ’ป', 'โŒจ๏ธ', '๐Ÿ–ฅ๏ธ', '๐Ÿ–จ๏ธ', '๐Ÿ–ฑ๏ธ', '๐Ÿ–ฒ๏ธ', '๐Ÿ•น๏ธ', '๐Ÿ—œ๏ธ',\r\n '๐Ÿ’ฝ', '๐Ÿ’พ', '๐Ÿ’ฟ', '๐Ÿ“€', '๐Ÿ“ผ', '๐Ÿ“ท', '๐Ÿ“ธ', '๐Ÿ“น', '๐ŸŽฅ', '๐Ÿ“ฝ๏ธ',\r\n '๐ŸŽž๏ธ', '๐Ÿ“ž', 'โ˜Ž๏ธ', '๐Ÿ“Ÿ', '๐Ÿ“ ', '๐Ÿ“บ', '๐Ÿ“ป', '๐ŸŽ™๏ธ', '๐ŸŽš๏ธ', '๐ŸŽ›๏ธ',\r\n '๐Ÿงญ', 'โฑ๏ธ', 'โฒ๏ธ', 'โฐ', '๐Ÿ•ฐ๏ธ', 'โŒ›', 'โณ', '๐Ÿ“ก', '๐Ÿ”‹', '๐Ÿ”Œ',\r\n '๐Ÿ’ก', '๐Ÿ”ฆ', '๐Ÿ•ฏ๏ธ', '๐Ÿช”', '๐Ÿงฏ', '๐Ÿ›ข๏ธ', '๐Ÿ’ธ', '๐Ÿ’ต', '๐Ÿ’ด', '๐Ÿ’ถ',\r\n '๐Ÿ’ท', '๐Ÿช™', '๐Ÿ’ฐ', '๐Ÿ’ณ', '๐Ÿงพ', '๐Ÿ’Ž', 'โš–๏ธ', '๐Ÿชœ', '๐Ÿงฐ', '๐Ÿช›',\r\n '๐Ÿ”ง', '๐Ÿ”จ', 'โš’๏ธ', '๐Ÿ› ๏ธ', 'โ›๏ธ', '๐Ÿชš', '๐Ÿ”ฉ', 'โš™๏ธ', '๐Ÿชค', '๐Ÿงฑ',\r\n 'โ›“๏ธ', '๐Ÿงฒ', '๐Ÿ”ซ', '๐Ÿ’ฃ', '๐Ÿงจ', '๐Ÿช“', '๐Ÿ”ช', '๐Ÿ—ก๏ธ', 'โš”๏ธ', '๐Ÿ›ก๏ธ',\r\n '๐Ÿšฌ', 'โšฐ๏ธ', '๐Ÿชฆ', 'โšฑ๏ธ', '๐Ÿบ', '๐Ÿ”ฎ', '๐Ÿ“ฟ', '๐Ÿงฟ', '๐Ÿ’ˆ', 'โš—๏ธ',\r\n '๐Ÿ”ญ', '๐Ÿ”ฌ', '๐Ÿ•ณ๏ธ', '๐Ÿฉน', '๐Ÿฉบ', '๐Ÿ’Š', '๐Ÿ’‰', '๐Ÿฉธ', '๐Ÿงฌ', '๐Ÿฆ ',\r\n '๐Ÿงซ', '๐Ÿงช', '๐ŸŒก๏ธ', '๐Ÿงน', '๐Ÿช ', '๐Ÿงบ', '๐Ÿงป', '๐Ÿšฝ', '๐Ÿšฐ', '๐Ÿšฟ',\r\n '๐Ÿ›', '๐Ÿ›€', '๐Ÿงผ', '๐Ÿชฅ', '๐Ÿช’', '๐Ÿงฝ', '๐Ÿชฃ', '๐Ÿงด', '๐Ÿ›Ž๏ธ', '๐Ÿ”‘',\r\n '๐Ÿ—๏ธ', '๐Ÿšช', '๐Ÿช‘', '๐Ÿ›‹๏ธ', '๐Ÿ›๏ธ', '๐Ÿ›Œ', '๐Ÿงธ', '๐Ÿช†', '๐Ÿ–ผ๏ธ', '๐Ÿชž',\r\n '๐ŸชŸ', '๐Ÿ›๏ธ', '๐Ÿ›’', '๐ŸŽ', '๐ŸŽˆ', '๐ŸŽ', '๐ŸŽ€', '๐Ÿช„', '๐Ÿช…', '๐ŸŽŠ',\r\n '๐ŸŽ‰', '๐ŸŽŽ', '๐Ÿฎ', '๐ŸŽ', '๐Ÿงง', 'โœ‰๏ธ', '๐Ÿ“ฉ', '๐Ÿ“จ', '๐Ÿ“ง', '๐Ÿ’Œ',\r\n '๐Ÿ“ฅ', '๐Ÿ“ค', '๐Ÿ“ฆ', '๐Ÿท๏ธ', '๐Ÿ“ช', '๐Ÿ“ซ', '๐Ÿ“ฌ', '๐Ÿ“ญ', '๐Ÿ“ฎ', '๐Ÿ“ฏ',\r\n '๐Ÿ“œ', '๐Ÿ“ƒ', '๐Ÿ“„', '๐Ÿ“‘', '๐Ÿงพ', '๐Ÿ“Š', '๐Ÿ“ˆ', '๐Ÿ“‰', '๐Ÿ—’๏ธ', '๐Ÿ—“๏ธ',\r\n '๐Ÿ“†', '๐Ÿ“…', '๐Ÿ—‘๏ธ', '๐Ÿ“‡', '๐Ÿ—ƒ๏ธ', '๐Ÿ—ณ๏ธ', '๐Ÿ—„๏ธ', '๐Ÿ“‹', '๐Ÿ“', '๐Ÿ“‚',\r\n '๐Ÿ—‚๏ธ', '๐Ÿ—ž๏ธ', '๐Ÿ“ฐ', '๐Ÿ““', '๐Ÿ“”', '๐Ÿ“’', '๐Ÿ“•', '๐Ÿ“—', '๐Ÿ“˜', '๐Ÿ“™',\r\n '๐Ÿ“š', '๐Ÿ“–', '๐Ÿ”–', '๐Ÿงท', '๐Ÿ”—', '๐Ÿ“Ž', '๐Ÿ–‡๏ธ', '๐Ÿ“', '๐Ÿ“', '๐Ÿงฎ',\r\n '๐Ÿ“Œ', '๐Ÿ“', 'โœ‚๏ธ', '๐Ÿ–Š๏ธ', '๐Ÿ–‹๏ธ', 'โœ’๏ธ', '๐Ÿ–Œ๏ธ', '๐Ÿ–๏ธ', '๐Ÿ“', 'โœ๏ธ',\r\n '๐Ÿ”', '๐Ÿ”Ž', '๐Ÿ”', '๐Ÿ”', '๐Ÿ”’', '๐Ÿ”“',\r\n ]\r\n },\r\n symbols: {\r\n label: 'Symbols',\r\n emojis: [\r\n 'โค๏ธ', '๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ', '๐Ÿ’”',\r\n 'โฃ๏ธ', '๐Ÿ’•', '๐Ÿ’ž', '๐Ÿ’“', '๐Ÿ’—', '๐Ÿ’–', '๐Ÿ’˜', '๐Ÿ’', '๐Ÿ’Ÿ', 'โ˜ฎ๏ธ',\r\n 'โœ๏ธ', 'โ˜ช๏ธ', '๐Ÿ•‰๏ธ', 'โ˜ธ๏ธ', 'โœก๏ธ', '๐Ÿ”ฏ', '๐Ÿ•Ž', 'โ˜ฏ๏ธ', 'โ˜ฆ๏ธ', '๐Ÿ›',\r\n 'โ›Ž', 'โ™ˆ', 'โ™‰', 'โ™Š', 'โ™‹', 'โ™Œ', 'โ™', 'โ™Ž', 'โ™', 'โ™',\r\n 'โ™‘', 'โ™’', 'โ™“', '๐Ÿ†”', 'โš›๏ธ', '๐Ÿ‰‘', 'โ˜ข๏ธ', 'โ˜ฃ๏ธ', '๐Ÿ“ด', '๐Ÿ“ณ',\r\n '๐Ÿˆถ', '๐Ÿˆš', '๐Ÿˆธ', '๐Ÿˆบ', '๐Ÿˆท๏ธ', 'โœด๏ธ', '๐Ÿ†š', '๐Ÿ’ฎ', '๐Ÿ‰', 'ใŠ™๏ธ',\r\n 'ใŠ—๏ธ', '๐Ÿˆด', '๐Ÿˆต', '๐Ÿˆน', '๐Ÿˆฒ', '๐Ÿ…ฐ๏ธ', '๐Ÿ…ฑ๏ธ', '๐Ÿ†Ž', '๐Ÿ†‘', '๐Ÿ…พ๏ธ',\r\n '๐Ÿ†˜', 'โŒ', 'โญ•', '๐Ÿ›‘', 'โ›”', '๐Ÿ“›', '๐Ÿšซ', '๐Ÿ’ฏ', '๐Ÿ’ข', 'โ™จ๏ธ',\r\n '๐Ÿšท', '๐Ÿšฏ', '๐Ÿšณ', '๐Ÿšฑ', '๐Ÿ”ž', '๐Ÿ“ต', '๐Ÿšญ', 'โ—', 'โ•', 'โ“',\r\n 'โ”', 'โ€ผ๏ธ', 'โ‰๏ธ', '๐Ÿ”…', '๐Ÿ”†', 'ใ€ฝ๏ธ', 'โš ๏ธ', '๐Ÿšธ', '๐Ÿ”ฑ', 'โšœ๏ธ',\r\n '๐Ÿ”ฐ', 'โ™ป๏ธ', 'โœ…', '๐Ÿˆฏ', '๐Ÿ’น', 'โ‡๏ธ', 'โœณ๏ธ', 'โŽ', '๐ŸŒ', '๐Ÿ’ ',\r\n 'โ“‚๏ธ', '๐ŸŒ€', '๐Ÿ’ค', '๐Ÿง', '๐Ÿšพ', 'โ™ฟ', '๐Ÿ…ฟ๏ธ', '๐Ÿ›—', '๐Ÿˆณ', '๐Ÿˆ‚๏ธ',\r\n '๐Ÿ›‚', '๐Ÿ›ƒ', '๐Ÿ›„', '๐Ÿ›…', '๐Ÿšน', '๐Ÿšบ', '๐Ÿšผ', 'โšง๏ธ', '๐Ÿšป', '๐Ÿšฎ',\r\n '๐ŸŽฆ', '๐Ÿ“ถ', '๐Ÿˆ', '๐Ÿ”ฃ', 'โ„น๏ธ', '๐Ÿ”ค', '๐Ÿ”ก', '๐Ÿ” ', '๐Ÿ†–', '๐Ÿ†—',\r\n '๐Ÿ†™', '๐Ÿ†’', '๐Ÿ†•', '๐Ÿ†“', '0๏ธโƒฃ', '1๏ธโƒฃ', '2๏ธโƒฃ', '3๏ธโƒฃ', '4๏ธโƒฃ', '5๏ธโƒฃ',\r\n '6๏ธโƒฃ', '7๏ธโƒฃ', '8๏ธโƒฃ', '9๏ธโƒฃ', '๐Ÿ”Ÿ', '๐Ÿ”ข', '#๏ธโƒฃ', '*๏ธโƒฃ', 'โ๏ธ', 'โ–ถ๏ธ',\r\n 'โธ๏ธ', 'โฏ๏ธ', 'โน๏ธ', 'โบ๏ธ', 'โญ๏ธ', 'โฎ๏ธ', 'โฉ', 'โช', 'โซ', 'โฌ',\r\n 'โ—€๏ธ', '๐Ÿ”ผ', '๐Ÿ”ฝ', 'โžก๏ธ', 'โฌ…๏ธ', 'โฌ†๏ธ', 'โฌ‡๏ธ', 'โ†—๏ธ', 'โ†˜๏ธ', 'โ†™๏ธ',\r\n 'โ†–๏ธ', 'โ†•๏ธ', 'โ†”๏ธ', 'โ†ช๏ธ', 'โ†ฉ๏ธ', 'โคด๏ธ', 'โคต๏ธ', '๐Ÿ”€', '๐Ÿ”', '๐Ÿ”‚',\r\n '๐Ÿ”„', '๐Ÿ”ƒ', '๐ŸŽต', '๐ŸŽถ', 'โž•', 'โž–', 'โž—', 'โœ–๏ธ', 'โ™พ๏ธ', '๐Ÿ’ฒ',\r\n '๐Ÿ’ฑ', 'โ„ข๏ธ', 'ยฉ๏ธ', 'ยฎ๏ธ', 'ใ€ฐ๏ธ', 'โžฐ', 'โžฟ', '๐Ÿ”š', '๐Ÿ”™', '๐Ÿ”›',\r\n '๐Ÿ”', '๐Ÿ”œ', 'โœ”๏ธ', 'โ˜‘๏ธ', '๐Ÿ”˜', '๐Ÿ”ด', '๐ŸŸ ', '๐ŸŸก', '๐ŸŸข', '๐Ÿ”ต',\r\n '๐ŸŸฃ', 'โšซ', 'โšช', '๐ŸŸค', '๐Ÿ”บ', '๐Ÿ”ป', '๐Ÿ”ธ', '๐Ÿ”น', '๐Ÿ”ถ', '๐Ÿ”ท',\r\n '๐Ÿ”ณ', '๐Ÿ”ฒ', 'โ–ช๏ธ', 'โ–ซ๏ธ', 'โ—พ', 'โ—ฝ', 'โ—ผ๏ธ', 'โ—ป๏ธ', '๐ŸŸฅ', '๐ŸŸง',\r\n '๐ŸŸจ', '๐ŸŸฉ', '๐ŸŸฆ', '๐ŸŸช', 'โฌ›', 'โฌœ', '๐ŸŸซ', '๐Ÿ”ˆ', '๐Ÿ”‡', '๐Ÿ”‰',\r\n '๐Ÿ”Š', '๐Ÿ””', '๐Ÿ”•', '๐Ÿ“ฃ', '๐Ÿ“ข', '๐Ÿ’ฌ', '๐Ÿ’ญ', '๐Ÿ—ฏ๏ธ', 'โ™ ๏ธ', 'โ™ฃ๏ธ',\r\n 'โ™ฅ๏ธ', 'โ™ฆ๏ธ', '๐Ÿƒ', '๐ŸŽด', '๐Ÿ€„', '๐Ÿ•', '๐Ÿ•‘', '๐Ÿ•’', '๐Ÿ•“', '๐Ÿ•”',\r\n '๐Ÿ••', '๐Ÿ•–', '๐Ÿ•—', '๐Ÿ•˜', '๐Ÿ•™', '๐Ÿ•š', '๐Ÿ•›', '๐Ÿ•œ', '๐Ÿ•', '๐Ÿ•ž',\r\n '๐Ÿ•Ÿ', '๐Ÿ• ', '๐Ÿ•ก', '๐Ÿ•ข', '๐Ÿ•ฃ', '๐Ÿ•ค', '๐Ÿ•ฅ', '๐Ÿ•ฆ', '๐Ÿ•ง',\r\n ]\r\n },\r\n flags: {\r\n label: 'Flags',\r\n emojis: [\r\n '๐Ÿณ๏ธ', '๐Ÿด', '๐Ÿดโ€โ˜ ๏ธ', '๐Ÿ', '๐Ÿšฉ', '๐ŸŽŒ', '๐Ÿณ๏ธโ€๐ŸŒˆ', '๐Ÿณ๏ธโ€โšง๏ธ',\r\n '๐Ÿ‡บ๐Ÿ‡ธ', '๐Ÿ‡ฌ๐Ÿ‡ง', '๐Ÿ‡จ๐Ÿ‡ฆ', '๐Ÿ‡ฆ๐Ÿ‡บ', '๐Ÿ‡ฎ๐Ÿ‡ณ', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‡จ๐Ÿ‡ณ', '๐Ÿ‡ฐ๐Ÿ‡ท',\r\n '๐Ÿ‡ฉ๐Ÿ‡ช', '๐Ÿ‡ซ๐Ÿ‡ท', '๐Ÿ‡ฎ๐Ÿ‡น', '๐Ÿ‡ช๐Ÿ‡ธ', '๐Ÿ‡ง๐Ÿ‡ท', '๐Ÿ‡ฒ๐Ÿ‡ฝ', '๐Ÿ‡ท๐Ÿ‡บ', '๐Ÿ‡ฟ๐Ÿ‡ฆ',\r\n ]\r\n }\r\n} as const\r\n\r\nexport const Emoji = Extension.create<EmojiOptions>({\r\n name: 'emoji',\r\n\r\n addOptions() {\r\n return {\r\n enableEmoticons: true,\r\n }\r\n },\r\n\r\n addCommands() {\r\n return {\r\n insertEmoji:\r\n (emoji: string) =>\r\n ({ commands }) => {\r\n return commands.insertContent(emoji)\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface FullscreenOptions {\r\n className: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n fullscreen: {\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen: () => ReturnType\r\n /**\r\n * Enter fullscreen mode\r\n */\r\n enterFullscreen: () => ReturnType\r\n /**\r\n * Exit fullscreen mode\r\n */\r\n exitFullscreen: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const Fullscreen = Extension.create<FullscreenOptions>({\r\n name: 'fullscreen',\r\n\r\n addOptions() {\r\n return {\r\n className: 'rte-builder-fullscreen',\r\n }\r\n },\r\n\r\n addStorage() {\r\n return {\r\n isFullscreen: false,\r\n }\r\n },\r\n\r\n addCommands() {\r\n return {\r\n toggleFullscreen:\r\n () =>\r\n ({ editor }) => {\r\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\r\n if (!wrapper) return false\r\n\r\n this.storage.isFullscreen = !this.storage.isFullscreen\r\n\r\n if (this.storage.isFullscreen) {\r\n wrapper.classList.add(this.options.className)\r\n document.body.style.overflow = 'hidden'\r\n } else {\r\n wrapper.classList.remove(this.options.className)\r\n document.body.style.overflow = ''\r\n }\r\n\r\n // Trigger re-render to update button state\r\n editor.view.dispatch(editor.state.tr)\r\n\r\n return true\r\n },\r\n enterFullscreen:\r\n () =>\r\n ({ editor }) => {\r\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\r\n if (!wrapper) return false\r\n\r\n this.storage.isFullscreen = true\r\n wrapper.classList.add(this.options.className)\r\n document.body.style.overflow = 'hidden'\r\n editor.view.dispatch(editor.state.tr)\r\n\r\n return true\r\n },\r\n exitFullscreen:\r\n () =>\r\n ({ editor }) => {\r\n const wrapper = editor.view.dom.closest('.rte-builder-wrapper') as HTMLElement\r\n if (!wrapper) return false\r\n\r\n this.storage.isFullscreen = false\r\n wrapper.classList.remove(this.options.className)\r\n document.body.style.overflow = ''\r\n editor.view.dispatch(editor.state.tr)\r\n\r\n return true\r\n },\r\n }\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n Escape: () => {\r\n if (this.storage.isFullscreen) {\r\n return this.editor.commands.exitFullscreen()\r\n }\r\n return false\r\n },\r\n 'Mod-Shift-f': () => {\r\n return this.editor.commands.toggleFullscreen()\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface PrintOptions {\r\n title?: string\r\n styles?: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n print: {\r\n /**\r\n * Print the editor content\r\n */\r\n print: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nconst defaultPrintStyles = `\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n font-size: 14px;\r\n line-height: 1.6;\r\n color: #1f2937;\r\n padding: 20px;\r\n max-width: 800px;\r\n margin: 0 auto;\r\n }\r\n\r\n h1 { font-size: 2em; font-weight: 700; margin: 1em 0 0.5em; }\r\n h2 { font-size: 1.5em; font-weight: 700; margin: 0.83em 0 0.5em; }\r\n h3 { font-size: 1.25em; font-weight: 600; margin: 1em 0 0.5em; }\r\n h4 { font-size: 1.1em; font-weight: 600; margin: 1.33em 0 0.5em; }\r\n h5 { font-size: 1em; font-weight: 600; margin: 1.67em 0 0.5em; }\r\n h6 { font-size: 0.875em; font-weight: 600; margin: 2.33em 0 0.5em; }\r\n\r\n p { margin: 0 0 1em; }\r\n\r\n ul, ol { padding-left: 2em; margin: 0 0 1em; }\r\n ul { list-style-type: disc; }\r\n ol { list-style-type: decimal; }\r\n li { margin: 0.25em 0; }\r\n\r\n blockquote {\r\n border-left: 4px solid #3b82f6;\r\n padding-left: 1em;\r\n margin: 1em 0;\r\n color: #6b7280;\r\n font-style: italic;\r\n }\r\n\r\n code {\r\n background: #f3f4f6;\r\n color: #e11d48;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-family: 'Courier New', Courier, monospace;\r\n font-size: 0.9em;\r\n }\r\n\r\n pre {\r\n background: #1f2937;\r\n color: #f9fafb;\r\n padding: 1em;\r\n border-radius: 6px;\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n }\r\n\r\n pre code {\r\n background: transparent;\r\n color: inherit;\r\n padding: 0;\r\n }\r\n\r\n a { color: #3b82f6; text-decoration: underline; }\r\n\r\n img, video {\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 4px;\r\n display: block;\r\n margin: 1em 0;\r\n }\r\n\r\n hr {\r\n border: none;\r\n border-top: 2px solid #e5e7eb;\r\n margin: 2em 0;\r\n }\r\n\r\n table {\r\n border-collapse: collapse;\r\n width: 100%;\r\n margin: 1em 0;\r\n }\r\n\r\n th, td {\r\n border: 1px solid #d1d5db;\r\n padding: 8px 12px;\r\n text-align: left;\r\n }\r\n\r\n th {\r\n background: #f3f4f6;\r\n font-weight: 600;\r\n }\r\n\r\n mark {\r\n background-color: #fef08a;\r\n padding: 2px 0;\r\n }\r\n\r\n @media print {\r\n body {\r\n padding: 0;\r\n margin: 0;\r\n }\r\n\r\n pre {\r\n white-space: pre-wrap;\r\n word-wrap: break-word;\r\n }\r\n\r\n img, video {\r\n page-break-inside: avoid;\r\n }\r\n\r\n h1, h2, h3, h4, h5, h6 {\r\n page-break-after: avoid;\r\n }\r\n }\r\n`\r\n\r\nexport const Print = Extension.create<PrintOptions>({\r\n name: 'print',\r\n\r\n addOptions() {\r\n return {\r\n title: 'Print Document',\r\n styles: defaultPrintStyles,\r\n }\r\n },\r\n\r\n addCommands() {\r\n return {\r\n print:\r\n () =>\r\n ({ editor }) => {\r\n const content = editor.getHTML()\r\n const printWindow = window.open('', '_blank')\r\n\r\n if (!printWindow) {\r\n console.error('Failed to open print window. Please allow popups.')\r\n return false\r\n }\r\n\r\n const title = this.options.title || 'Print Document'\r\n const styles = this.options.styles || defaultPrintStyles\r\n\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n <title>${title}</title>\r\n <style>${styles}</style>\r\n </head>\r\n <body>\r\n ${content}\r\n </body>\r\n </html>\r\n `)\r\n\r\n printWindow.document.close()\r\n\r\n // Wait for content to load, then print\r\n printWindow.onload = () => {\r\n printWindow.focus()\r\n printWindow.print()\r\n // Close window after printing (optional - some browsers close automatically)\r\n // printWindow.close()\r\n }\r\n\r\n // Fallback for browsers that don't trigger onload\r\n setTimeout(() => {\r\n printWindow.focus()\r\n printWindow.print()\r\n }, 500)\r\n\r\n return true\r\n },\r\n }\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-p': () => {\r\n return this.editor.commands.print()\r\n },\r\n }\r\n },\r\n})\r\n","import { Extension } from '@tiptap/core'\r\n\r\nexport interface IndentOptions {\r\n types: string[]\r\n minIndent: number\r\n maxIndent: number\r\n indentUnit: string\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n indent: {\r\n /**\r\n * Indent the current block (or sink list item if inside a list)\r\n */\r\n indent: () => ReturnType\r\n /**\r\n * Outdent the current block (or lift list item if inside a list)\r\n */\r\n outdent: () => ReturnType\r\n }\r\n }\r\n}\r\n\r\nexport const Indent = Extension.create<IndentOptions>({\r\n name: 'indent',\r\n\r\n addOptions() {\r\n return {\r\n types: ['paragraph', 'heading', 'blockquote'],\r\n minIndent: 0,\r\n maxIndent: 10,\r\n indentUnit: '2em',\r\n }\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n indent: {\r\n default: 0,\r\n parseHTML: (element) => {\r\n const marginLeft = element.style.marginLeft\r\n if (marginLeft) {\r\n const match = marginLeft.match(/^(\\d+)/)\r\n if (match) {\r\n return parseInt(match[1], 10) / 2 // Assuming 2em per level\r\n }\r\n }\r\n return 0\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes.indent || attributes.indent === 0) {\r\n return {}\r\n }\r\n\r\n return {\r\n style: `margin-left: ${attributes.indent * 2}em`,\r\n }\r\n },\r\n },\r\n },\r\n },\r\n ]\r\n },\r\n\r\n addCommands() {\r\n return {\r\n indent:\r\n () =>\r\n ({ tr, state, dispatch, editor }) => {\r\n // If inside a list item, sink it to create a sub-list\r\n if (editor.isActive('listItem')) {\r\n return editor.chain().sinkListItem('listItem').run()\r\n }\r\n\r\n const { selection } = state\r\n const { from, to } = selection\r\n\r\n let changed = false\r\n\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (this.options.types.includes(node.type.name)) {\r\n const currentIndent = node.attrs.indent || 0\r\n if (currentIndent < this.options.maxIndent) {\r\n if (dispatch) {\r\n tr.setNodeMarkup(pos, undefined, {\r\n ...node.attrs,\r\n indent: currentIndent + 1,\r\n })\r\n }\r\n changed = true\r\n }\r\n }\r\n })\r\n\r\n return changed\r\n },\r\n\r\n outdent:\r\n () =>\r\n ({ tr, state, dispatch, editor }) => {\r\n // If inside a list item, lift it out of a sub-list\r\n if (editor.isActive('listItem')) {\r\n return editor.chain().liftListItem('listItem').run()\r\n }\r\n\r\n const { selection } = state\r\n const { from, to } = selection\r\n\r\n let changed = false\r\n\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (this.options.types.includes(node.type.name)) {\r\n const currentIndent = node.attrs.indent || 0\r\n if (currentIndent > this.options.minIndent) {\r\n if (dispatch) {\r\n tr.setNodeMarkup(pos, undefined, {\r\n ...node.attrs,\r\n indent: currentIndent - 1,\r\n })\r\n }\r\n changed = true\r\n }\r\n }\r\n })\r\n\r\n return changed\r\n },\r\n }\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n Tab: () => {\r\n // If inside a list, sink the list item to create a sub-list\r\n if (this.editor.isActive('listItem')) {\r\n return this.editor.commands.sinkListItem('listItem')\r\n }\r\n return this.editor.commands.indent()\r\n },\r\n 'Shift-Tab': () => {\r\n // If inside a list, lift the list item out of a sub-list\r\n if (this.editor.isActive('listItem')) {\r\n return this.editor.commands.liftListItem('listItem')\r\n }\r\n return this.editor.commands.outdent()\r\n },\r\n }\r\n },\r\n})\r\n","/**\r\n * TipTap Toolbar Component\r\n *\r\n * Toolbar implementation specific to TipTap editor.\r\n */\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport type { Editor } from \"@tiptap/react\";\r\nimport type { ToolbarButtonType } from \"../../core/types\";\r\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\r\nimport { CodeXml } from \"lucide-react\";\r\n\r\ninterface TipTapToolbarProps {\r\n editor: Editor | null;\r\n buttons: ToolbarButtonType[];\r\n onMediaPickerImage?: () => void;\r\n onMediaPickerVideo?: () => void;\r\n}\r\n\r\nconst FONT_FAMILIES = [\r\n { value: \"Arial\", label: \"Arial\" },\r\n { value: \"Georgia\", label: \"Georgia\" },\r\n { value: \"Times New Roman\", label: \"Times New Roman\" },\r\n { value: \"Courier New\", label: \"Courier New\" },\r\n { value: \"Verdana\", label: \"Verdana\" },\r\n { value: \"Roboto\", label: \"Roboto\" },\r\n { value: \"Open Sans\", label: \"Open Sans\" },\r\n { value: \"Lato\", label: \"Lato\" },\r\n { value: \"Montserrat\", label: \"Montserrat\" },\r\n { value: \"Poppins\", label: \"Poppins\" },\r\n];\r\n\r\nconst FONT_SIZES = [\r\n \"8px\",\r\n \"10px\",\r\n \"12px\",\r\n \"14px\",\r\n \"16px\",\r\n \"18px\",\r\n \"20px\",\r\n \"24px\",\r\n \"30px\",\r\n \"36px\",\r\n \"48px\",\r\n \"60px\",\r\n \"72px\",\r\n];\r\n\r\nconst LINE_HEIGHTS = [\r\n { value: \"1\", label: \"Single\" },\r\n { value: \"1.15\", label: \"1.15\" },\r\n { value: \"1.5\", label: \"1.5\" },\r\n { value: \"1.75\", label: \"1.75\" },\r\n { value: \"2\", label: \"Double\" },\r\n { value: \"2.5\", label: \"2.5\" },\r\n { value: \"3\", label: \"Triple\" },\r\n];\r\n\r\n// Emoji Picker Component\r\nconst EmojiPicker: React.FC<{\r\n onSelect: (emoji: string) => void;\r\n onClose: () => void;\r\n}> = ({ onSelect, onClose }) => {\r\n const [activeCategory, setActiveCategory] =\r\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\r\n const popoverRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [onClose]);\r\n\r\n return (\r\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n type=\"button\"\r\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\r\n onClick={() =>\r\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\r\n }\r\n title={category.label}\r\n >\r\n {category.emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\r\n <button\r\n key={`${emoji}-${i}`}\r\n type=\"button\"\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => {\r\n onSelect(emoji);\r\n onClose();\r\n }}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const TipTapToolbar: React.FC<TipTapToolbarProps> = ({\r\n editor,\r\n buttons,\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n}) => {\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\r\n\r\n if (!editor) return null;\r\n\r\n const ToolbarButton = ({\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n children,\r\n title,\r\n buttonRef,\r\n }: {\r\n onClick: () => void;\r\n active?: boolean;\r\n disabled?: boolean;\r\n children: React.ReactNode;\r\n title?: string;\r\n buttonRef?: React.RefObject<HTMLButtonElement>;\r\n }) => (\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault(); // Prevent editor from losing focus\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n\r\n const renderButton = (button: ToolbarButtonType, index: number) => {\r\n switch (button) {\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key=\"bold\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n active={editor.isActive(\"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key=\"italic\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n active={editor.isActive(\"italic\")}\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key=\"underline\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n active={editor.isActive(\"underline\")}\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key=\"strike\"\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n active={editor.isActive(\"strike\")}\r\n title=\"Strikethrough\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key=\"code\"\r\n onClick={() => editor.chain().focus().toggleCode().run()}\r\n active={editor.isActive(\"code\")}\r\n title=\"Inline Code\"\r\n >\r\n <svg\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"16 18 22 12 16 6\"></polyline>\r\n <polyline points=\"8 6 2 12 8 18\"></polyline>\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key=\"codeBlock\"\r\n onClick={() => {\r\n if (editor.isActive(\"codeBlock\")) {\r\n // Source mode OFF: extract raw HTML from code block, render as rich content\r\n let htmlSource = \"\";\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === \"codeBlock\") {\r\n htmlSource = node.textContent;\r\n return false;\r\n }\r\n });\r\n\r\n htmlSource = htmlSource.trim();\r\n\r\n if (htmlSource) {\r\n // emitUpdate=true so parent onChange gets the rendered HTML\r\n editor.commands.setContent(htmlSource, true, {\r\n preserveWhitespace: false,\r\n });\r\n } else {\r\n editor.commands.clearContent(true);\r\n }\r\n editor.commands.focus();\r\n } else {\r\n // Source mode ON: get current rich content as HTML, show as editable source\r\n const currentHTML = editor.getHTML();\r\n const isEmptyContent =\r\n !currentHTML ||\r\n currentHTML === \"<p></p>\" ||\r\n currentHTML.trim() === \"\";\r\n\r\n const codeBlockContent = isEmptyContent\r\n ? { type: \"doc\", content: [{ type: \"codeBlock\" }] }\r\n : {\r\n type: \"doc\",\r\n content: [\r\n {\r\n type: \"codeBlock\",\r\n content: [{ type: \"text\", text: currentHTML }],\r\n },\r\n ],\r\n };\r\n\r\n // emitUpdate=false so parent onChange does NOT get the code block wrapper\r\n editor.commands.setContent(codeBlockContent, false);\r\n editor.commands.focus();\r\n }\r\n }}\r\n active={editor.isActive(\"codeBlock\")}\r\n title=\"Code Block (HTML Source)\"\r\n >\r\n <CodeXml size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"subscript\"\r\n onClick={() => editor.chain().focus().toggleSubscript().run()}\r\n active={editor.isActive(\"subscript\")}\r\n title=\"Subscript\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"superscript\"\r\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\r\n active={editor.isActive(\"superscript\")}\r\n title=\"Superscript\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key=\"clearFormatting\"\r\n onClick={() =>\r\n editor.chain().focus().clearNodes().unsetAllMarks().run()\r\n }\r\n title=\"Clear Formatting\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"fontFamily\":\r\n return (\r\n <select\r\n key=\"fontFamily\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontFamily().run();\r\n } else {\r\n editor.chain().focus().setFontFamily(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\r\n >\r\n <option value=\"default\">Font Family</option>\r\n {FONT_FAMILIES.map((font) => (\r\n <option key={font.value} value={font.value}>\r\n {font.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"fontSize\":\r\n return (\r\n <select\r\n key=\"fontSize\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontSize().run();\r\n } else {\r\n editor.chain().focus().setFontSize(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\r\n >\r\n <option value=\"default\">Font Size</option>\r\n {FONT_SIZES.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"lineHeight\":\r\n return (\r\n <select\r\n key=\"lineHeight\"\r\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetLineHeight().run();\r\n } else {\r\n editor.chain().focus().setLineHeight(e.target.value).run();\r\n }\r\n }}\r\n value={\r\n editor.getAttributes(\"paragraph\").lineHeight ||\r\n editor.getAttributes(\"heading\").lineHeight ||\r\n \"default\"\r\n }\r\n title=\"Line Height\"\r\n >\r\n <option value=\"default\">Line Height</option>\r\n {LINE_HEIGHTS.map((lh) => (\r\n <option key={lh.value} value={lh.value}>\r\n {lh.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"textColor\":\r\n const textPresetColors = [\"#11a161\", \"#85144b\", \"#ff851b\", \"#b10dc9\"];\r\n return (\r\n <span key=\"textColor\" className=\"rte-builder-toolbar-color-group\">\r\n <button\r\n key=\"text-none\"\r\n className=\"rte-builder-color-preset rte-builder-color-preset-none\"\r\n onClick={() => editor.chain().focus().unsetColor().run()}\r\n title=\"Text Color: None (Reset)\"\r\n type=\"button\"\r\n />\r\n {textPresetColors.map((color) => (\r\n <button\r\n key={`text-${color}`}\r\n className=\"rte-builder-color-preset\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => editor.chain().focus().setColor(color).run()}\r\n title={`Text Color: ${color}`}\r\n type=\"button\"\r\n />\r\n ))}\r\n <span className=\"rte-builder-toolbar-color\">\r\n <label title=\"Custom Text Color\">\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\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\" />\r\n </svg>\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor.chain().focus().setColor(e.target.value).run()\r\n }\r\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\r\n />\r\n </label>\r\n </span>\r\n </span>\r\n );\r\n\r\n case \"backgroundColor\":\r\n const bgPresetColors = [\"#11a161\", \"#85144b\", \"#ff851b\", \"#b10dc9\"];\r\n return (\r\n <span\r\n key=\"backgroundColor\"\r\n className=\"rte-builder-toolbar-color-group\"\r\n >\r\n {bgPresetColors.map((color) => (\r\n <button\r\n key={`bg-${color}`}\r\n className=\"rte-builder-color-preset rte-builder-color-preset-bg\"\r\n style={{ backgroundColor: color }}\r\n onClick={() =>\r\n editor.chain().focus().toggleHighlight({ color }).run()\r\n }\r\n title={`Highlight Color: ${color}`}\r\n type=\"button\"\r\n />\r\n ))}\r\n <span className=\"rte-builder-toolbar-color\">\r\n <label title=\"Custom Background Color\">\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\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\" />\r\n <path d=\"M2 20h20v4H2z\" fillOpacity=\".36\" />\r\n </svg>\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor\r\n .chain()\r\n .focus()\r\n .toggleHighlight({ color: e.target.value })\r\n .run()\r\n }\r\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\r\n />\r\n </label>\r\n </span>\r\n </span>\r\n );\r\n\r\n case \"alignLeft\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignLeft\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\r\n active={editor.isActive({ textAlign: \"left\" })}\r\n title=\"Align Left\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignCenter\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignCenter\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\r\n active={editor.isActive({ textAlign: \"center\" })}\r\n title=\"Align Center\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignRight\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignRight\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\r\n active={editor.isActive({ textAlign: \"right\" })}\r\n title=\"Align Right\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignJustify\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignJustify\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\r\n active={editor.isActive({ textAlign: \"justify\" })}\r\n title=\"Justify\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zM3 3v2h18V3H3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"indent\":\r\n return (\r\n <ToolbarButton\r\n key=\"indent\"\r\n onClick={() => editor.chain().focus().indent().run()}\r\n title=\"Indent (Tab)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"outdent\":\r\n return (\r\n <ToolbarButton\r\n key=\"outdent\"\r\n onClick={() => editor.chain().focus().outdent().run()}\r\n title=\"Outdent (Shift+Tab)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key=\"bulletList\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n active={editor.isActive(\"bulletList\")}\r\n title=\"Bullet List\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key=\"orderedList\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n active={editor.isActive(\"orderedList\")}\r\n title=\"Numbered List\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"heading1\":\r\n case \"heading2\":\r\n case \"heading3\":\r\n case \"heading4\":\r\n case \"heading5\":\r\n case \"heading6\":\r\n const level = parseInt(button.replace(\"heading\", \"\")) as\r\n | 1\r\n | 2\r\n | 3\r\n | 4\r\n | 5\r\n | 6;\r\n const headingIcons: Record<number, JSX.Element> = {\r\n 1: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 2: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 3: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 4: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 5: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n 6: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n ),\r\n };\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.chain().focus().toggleHeading({ level }).run()\r\n }\r\n active={editor.isActive(\"heading\", { level })}\r\n title={`Heading ${level}`}\r\n >\r\n {headingIcons[level]}\r\n </ToolbarButton>\r\n );\r\n\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton\r\n key=\"blockquote\"\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n active={editor.isActive(\"blockquote\")}\r\n title=\"Blockquote\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key=\"horizontalRule\"\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n title=\"Horizontal Rule\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M4 11h16v2H4z\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"link\":\r\n return (\r\n <ToolbarButton\r\n key=\"link\"\r\n onClick={() => {\r\n const url = window.prompt(\"Enter URL:\");\r\n if (url) {\r\n editor.chain().focus().setLink({ href: url }).run();\r\n }\r\n }}\r\n active={editor.isActive(\"link\")}\r\n title=\"Insert Link\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton\r\n key=\"unlink\"\r\n onClick={() => editor.chain().focus().unsetLink().run()}\r\n disabled={!editor.isActive(\"link\")}\r\n title=\"Remove Link\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key=\"image\"\r\n onClick={() => {\r\n if (onMediaPickerImage) {\r\n onMediaPickerImage();\r\n } else {\r\n const url = window.prompt(\"Enter image URL:\");\r\n if (url) {\r\n editor.chain().focus().setImage({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Image\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key=\"video\"\r\n onClick={() => {\r\n if (onMediaPickerVideo) {\r\n onMediaPickerVideo();\r\n } else {\r\n const url = window.prompt(\"Enter video URL:\");\r\n if (url) {\r\n editor.chain().focus().setVideo({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Video\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key=\"table\"\r\n onClick={() =>\r\n editor\r\n .chain()\r\n .focus()\r\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\r\n .run()\r\n }\r\n title=\"Insert Table\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"emoji\":\r\n return (\r\n <span key=\"emoji\" style={{ position: \"relative\" }}>\r\n <ToolbarButton\r\n buttonRef={emojiButtonRef}\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n active={showEmojiPicker}\r\n title=\"Insert Emoji\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <EmojiPicker\r\n onSelect={(emoji) =>\r\n editor.chain().focus().insertEmoji(emoji).run()\r\n }\r\n onClose={() => setShowEmojiPicker(false)}\r\n />\r\n )}\r\n </span>\r\n );\r\n\r\n case \"fullscreen\":\r\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\r\n return (\r\n <ToolbarButton\r\n key=\"fullscreen\"\r\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\r\n active={isFullscreen}\r\n title={\r\n isFullscreen\r\n ? \"Exit Fullscreen (Esc)\"\r\n : \"Fullscreen (Ctrl+Shift+F)\"\r\n }\r\n >\r\n {isFullscreen ? (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" />\r\n </svg>\r\n )}\r\n </ToolbarButton>\r\n );\r\n\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key=\"print\"\r\n onClick={() => editor.chain().focus().print().run()}\r\n title=\"Print (Ctrl+P)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key=\"undo\"\r\n onClick={() => editor.chain().focus().undo().run()}\r\n disabled={!editor.can().undo()}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key=\"redo\"\r\n onClick={() => editor.chain().focus().redo().run()}\r\n disabled={!editor.can().redo()}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\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\" />\r\n </svg>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"separator\":\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const isSourceMode = editor.isActive(\"codeBlock\");\r\n\r\n return <div className={`rte-builder-toolbar${isSourceMode ? \" rte-builder-toolbar-source-mode\" : \"\"}`}>{buttons.map(renderButton)}</div>;\r\n};\r\n\r\nexport default TipTapToolbar;\r\n","/**\r\n * TipTap Editor Component\r\n *\r\n * This is the actual TipTap editor implementation that conforms\r\n * to the adapter interface.\r\n */\r\n\r\nimport { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\r\nimport { useEditor, EditorContent } from \"@tiptap/react\";\r\nimport { Document } from \"@tiptap/extension-document\";\r\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\r\nimport { Text } from \"@tiptap/extension-text\";\r\nimport { Bold } from \"@tiptap/extension-bold\";\r\nimport { Italic } from \"@tiptap/extension-italic\";\r\nimport { Underline } from \"@tiptap/extension-underline\";\r\nimport { Strike } from \"@tiptap/extension-strike\";\r\nimport { Code } from \"@tiptap/extension-code\";\r\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\r\nimport { Subscript } from \"@tiptap/extension-subscript\";\r\nimport { Superscript } from \"@tiptap/extension-superscript\";\r\nimport { TextStyle } from \"@tiptap/extension-text-style\";\r\nimport { FontFamily } from \"@tiptap/extension-font-family\";\r\nimport { Color } from \"@tiptap/extension-color\";\r\nimport { Highlight } from \"@tiptap/extension-highlight\";\r\nimport { TextAlign } from \"@tiptap/extension-text-align\";\r\nimport { Heading } from \"@tiptap/extension-heading\";\r\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\r\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\r\nimport { ListItem } from \"@tiptap/extension-list-item\";\r\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\r\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\r\nimport { Link } from \"@tiptap/extension-link\";\r\nimport { Image } from \"@tiptap/extension-image\";\r\nimport { Table } from \"@tiptap/extension-table\";\r\nimport { TableRow } from \"@tiptap/extension-table-row\";\r\nimport { TableCell } from \"@tiptap/extension-table-cell\";\r\nimport { TableHeader } from \"@tiptap/extension-table-header\";\r\nimport { History } from \"@tiptap/extension-history\";\r\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\r\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\r\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\r\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\r\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\r\nimport { common, createLowlight } from \"lowlight\";\r\n\r\n// Custom extensions\r\nimport { FontSize } from \"../../extensions/FontSize\";\r\nimport { LineHeight } from \"../../extensions/LineHeight\";\r\nimport { Video } from \"../../extensions/Video\";\r\nimport { Emoji } from \"../../extensions/Emoji\";\r\nimport { Fullscreen } from \"../../extensions/Fullscreen\";\r\nimport { Print } from \"../../extensions/Print\";\r\nimport { Indent } from \"../../extensions/Indent\";\r\n\r\n// Toolbar\r\nimport { TipTapToolbar } from \"./TipTapToolbar\";\r\n\r\n// Types\r\nimport type { AdapterComponentProps, AdapterEditorRef } from \"../../core/types\";\r\n\r\n// Create lowlight instance\r\nconst lowlight = createLowlight(common);\r\n\r\ninterface TipTapEditorComponentProps extends AdapterComponentProps {}\r\n\r\nexport const TipTapEditorComponent = forwardRef<\r\n AdapterEditorRef,\r\n TipTapEditorComponentProps\r\n>(\r\n (\r\n {\r\n value = \"\",\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = \"Start typing...\",\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarButtons,\r\n className = \"\",\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = \"javascript\",\r\n editorConfig = {},\r\n },\r\n ref,\r\n ) => {\r\n // Initialize editor\r\n const editor = useEditor({\r\n extensions: [\r\n Document,\r\n Paragraph,\r\n Text,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strike,\r\n Code,\r\n enableCodeHighlight\r\n ? CodeBlockLowlight.configure({\r\n lowlight,\r\n defaultLanguage: defaultCodeLanguage,\r\n })\r\n : CodeBlockLowlight.configure({\r\n lowlight: null as any,\r\n }),\r\n Subscript,\r\n Superscript,\r\n TextStyle,\r\n FontFamily,\r\n FontSize,\r\n Color,\r\n Highlight.configure({ multicolor: true }),\r\n LineHeight,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Heading.configure({\r\n levels: [1, 2, 3, 4, 5, 6],\r\n }),\r\n BulletList,\r\n OrderedList,\r\n ListItem,\r\n Blockquote,\r\n HorizontalRule,\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n target: \"_blank\",\r\n rel: \"noopener noreferrer\",\r\n },\r\n }),\r\n Image.configure({\r\n inline: false,\r\n allowBase64: true,\r\n }),\r\n Video,\r\n Table.configure({\r\n resizable: true,\r\n }),\r\n TableRow,\r\n TableCell,\r\n TableHeader,\r\n History,\r\n Placeholder.configure({\r\n placeholder,\r\n }),\r\n CharacterCount.configure({\r\n limit: charCounterMax > 0 ? charCounterMax : undefined,\r\n }),\r\n Gapcursor,\r\n Dropcursor,\r\n HardBreak,\r\n Emoji,\r\n Fullscreen,\r\n Print,\r\n Indent,\r\n ],\r\n content: value,\r\n editable: !disabled && !readOnly,\r\n onUpdate: ({ editor }) => {\r\n const html = editor.getHTML();\r\n onChange?.(html);\r\n },\r\n onBlur: () => {\r\n onBlur?.();\r\n },\r\n onFocus: () => {\r\n onFocus?.();\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: \"rte-builder-content\",\r\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\r\n },\r\n transformPastedHTML(html) {\r\n return html\r\n // Remove excessive line breaks (3+ consecutive <br>)\r\n .replace(/(<br\\s*\\/?>\\s*){3,}/gi, \"<br><br>\")\r\n // Collapse multiple blank paragraphs into one\r\n .replace(/(<p>\\s*<\\/p>\\s*){2,}/gi, \"<p></p>\")\r\n // Remove excessive whitespace between tags\r\n .replace(/>\\s{2,}</g, \"> <\")\r\n // Normalize multiple &nbsp; sequences to single space\r\n .replace(/(&nbsp;\\s*){2,}/g, \"&nbsp;\")\r\n // Remove zero-width spaces and other invisible chars\r\n .replace(/[\\u200B\\u200C\\u200D\\uFEFF]/g, \"\")\r\n // Clean up pasted inline styles that cause spacing issues\r\n .replace(\r\n /style=\"[^\"]*\"/gi,\r\n (match) =>\r\n match\r\n .replace(/margin(-top|-bottom):\\s*[\\d.]+(px|em|rem|pt)\\s*;?/gi, \"\")\r\n .replace(/padding(-top|-bottom):\\s*[\\d.]+(px|em|rem|pt)\\s*;?/gi, \"\")\r\n .replace(/line-height:\\s*[\\d.]+(px|em|rem|pt|%)?\\s*;?/gi, \"\")\r\n .replace(/style=\"\\s*\"/gi, \"\"),\r\n );\r\n },\r\n },\r\n ...editorConfig,\r\n });\r\n\r\n // Update content when value prop changes\r\n useEffect(() => {\r\n if (editor && value !== editor.getHTML()) {\r\n editor.commands.setContent(value);\r\n }\r\n }, [value, editor]);\r\n\r\n // Update editable state\r\n useEffect(() => {\r\n if (editor) {\r\n editor.setEditable(!disabled && !readOnly);\r\n }\r\n }, [disabled, readOnly, editor]);\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage && editor) {\r\n const file = await onMediaPickerImage();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setImage({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerImage, editor]);\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo && editor) {\r\n const file = await onMediaPickerVideo();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setVideo({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerVideo, editor]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => {\r\n return editor?.getHTML() || \"\";\r\n },\r\n getText: () => {\r\n return editor?.getText() || \"\";\r\n },\r\n getJSON: () => {\r\n return editor?.getJSON();\r\n },\r\n setContent: (html: string) => {\r\n editor?.commands.setContent(html);\r\n },\r\n focus: () => {\r\n editor?.commands.focus();\r\n },\r\n blur: () => {\r\n editor?.commands.blur();\r\n },\r\n insertHTML: (html: string) => {\r\n editor?.commands.insertContent(html);\r\n },\r\n insertText: (text: string) => {\r\n editor?.commands.insertContent(text);\r\n },\r\n clear: () => {\r\n editor?.commands.clearContent();\r\n },\r\n isEmpty: () => {\r\n return editor?.isEmpty ?? true;\r\n },\r\n getCharacterCount: () => {\r\n return editor?.storage.characterCount?.characters() || 0;\r\n },\r\n getWordCount: () => {\r\n return editor?.storage.characterCount?.words() || 0;\r\n },\r\n isFullscreen: () => {\r\n return editor?.storage.fullscreen?.isFullscreen || false;\r\n },\r\n toggleFullscreen: () => {\r\n editor?.commands.toggleFullscreen();\r\n },\r\n print: () => {\r\n editor?.commands.print();\r\n },\r\n undo: () => {\r\n editor?.commands.undo();\r\n },\r\n redo: () => {\r\n editor?.commands.redo();\r\n },\r\n canUndo: () => {\r\n return editor?.can().undo() ?? false;\r\n },\r\n canRedo: () => {\r\n return editor?.can().redo() ?? false;\r\n },\r\n getNativeEditor: () => {\r\n return editor;\r\n },\r\n }));\r\n\r\n if (!editor) {\r\n return null;\r\n }\r\n\r\n const characterCount = editor.storage.characterCount?.characters() || 0;\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\r\n\r\n return (\r\n <div\r\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\r\n >\r\n <TipTapToolbar\r\n editor={editor}\r\n buttons={toolbarButtons}\r\n onMediaPickerImage={\r\n onMediaPickerImage ? handleMediaPickerImage : undefined\r\n }\r\n onMediaPickerVideo={\r\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\r\n }\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{ height: `${height}px` }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\">\r\n {\" \"}\r\n (limit exceeded)\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nTipTapEditorComponent.displayName = \"TipTapEditorComponent\";\r\n\r\nexport default TipTapEditorComponent;\r\n","/**\r\n * Slate.js Toolbar Component\r\n *\r\n * A toolbar component for the Slate.js editor with all standard formatting options.\r\n */\r\n\r\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\r\nimport { Editor, Transforms, Element as SlateElement } from \"slate\";\r\nimport { useSlate, ReactEditor } from \"slate-react\";\r\n\r\nimport type { ToolbarButtonType } from \"../../core/types\";\r\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface SlateToolbarProps {\r\n editor: Editor;\r\n buttons?: ToolbarButtonType[];\r\n onMediaPickerImage?: () => Promise<void>;\r\n onMediaPickerVideo?: () => Promise<void>;\r\n onToggleFullscreen?: () => void;\r\n onPrint?: () => void;\r\n isFullscreen?: boolean;\r\n toggleMark: (editor: Editor, format: string) => void;\r\n toggleBlock: (editor: Editor, format: string) => void;\r\n isMarkActive: (editor: Editor, format: string) => boolean;\r\n isBlockActive: (\r\n editor: Editor,\r\n format: string,\r\n blockType?: \"type\" | \"align\",\r\n ) => boolean;\r\n}\r\n\r\n// ============================================================================\r\n// TOOLBAR BUTTON COMPONENT\r\n// ============================================================================\r\n\r\ninterface ToolbarButtonProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n title: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\r\n active = false,\r\n disabled = false,\r\n onClick,\r\n title,\r\n children,\r\n}) => (\r\n <button\r\n className={`rte-builder-toolbar-button ${active ? \"active\" : \"\"}`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n);\r\n\r\n// ============================================================================\r\n// TOOLBAR ICONS (Simple SVG icons)\r\n// ============================================================================\r\n\r\nconst icons: Record<string, JSX.Element> = {\r\n bold: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n italic: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"\r\n />\r\n </svg>\r\n ),\r\n underline: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n strike: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"\r\n />\r\n </svg>\r\n ),\r\n code: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n codeBlock: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n subscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n superscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n clearFormatting: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fontFamily: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fontSize: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3v-3H3v3z\"\r\n />\r\n </svg>\r\n ),\r\n lineHeight: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M6 7h2.5L5 3.5 1.5 7H4v10H1.5L5 20.5 8.5 17H6V7zm4-2v2h12V5H10zm0 14h12v-2H10v2zm0-6h12v-2H10v2z\"\r\n />\r\n </svg>\r\n ),\r\n textColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"\r\n />\r\n </svg>\r\n ),\r\n backgroundColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n alignLeft: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignCenter: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignRight: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignJustify: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n indent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n outdent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n bulletList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n orderedList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"\r\n />\r\n </svg>\r\n ),\r\n heading1: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading2: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading3: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n blockquote: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\r\n </svg>\r\n ),\r\n horizontalRule: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M4 11h16v2H4z\" />\r\n </svg>\r\n ),\r\n link: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n unlink: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n image: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n video: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n table: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n emoji: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n undo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n redo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fullscreen: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\r\n />\r\n </svg>\r\n ),\r\n print: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n};\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport const SlateToolbar: React.FC<SlateToolbarProps> = ({\r\n editor,\r\n buttons = [],\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n onToggleFullscreen,\r\n onPrint,\r\n isFullscreen = false,\r\n toggleMark,\r\n toggleBlock,\r\n isMarkActive,\r\n isBlockActive,\r\n}) => {\r\n // Emoji picker state\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const [selectedEmojiCategory, setSelectedEmojiCategory] =\r\n useState<string>(\"smileys\");\r\n const emojiPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Link dialog state\r\n const [showLinkDialog, setShowLinkDialog] = useState(false);\r\n const [linkUrl, setLinkUrl] = useState(\"\");\r\n const linkDialogRef = useRef<HTMLDivElement>(null);\r\n\r\n // Color picker state\r\n const [showColorPicker, setShowColorPicker] = useState<\"text\" | \"bg\" | null>(\r\n null,\r\n );\r\n const colorPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close dropdowns when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n emojiPickerRef.current &&\r\n !emojiPickerRef.current.contains(event.target as Node)\r\n ) {\r\n setShowEmojiPicker(false);\r\n }\r\n if (\r\n linkDialogRef.current &&\r\n !linkDialogRef.current.contains(event.target as Node)\r\n ) {\r\n setShowLinkDialog(false);\r\n }\r\n if (\r\n colorPickerRef.current &&\r\n !colorPickerRef.current.contains(event.target as Node)\r\n ) {\r\n setShowColorPicker(null);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n // Insert emoji\r\n const insertEmoji = useCallback(\r\n (emoji: string) => {\r\n Transforms.insertText(editor, emoji);\r\n setShowEmojiPicker(false);\r\n ReactEditor.focus(editor);\r\n },\r\n [editor],\r\n );\r\n\r\n // Insert link\r\n const insertLink = useCallback(() => {\r\n if (linkUrl) {\r\n const link = {\r\n type: \"link\" as const,\r\n url: linkUrl,\r\n children: [{ text: linkUrl }],\r\n };\r\n Transforms.insertNodes(editor, link);\r\n setLinkUrl(\"\");\r\n setShowLinkDialog(false);\r\n ReactEditor.focus(editor);\r\n }\r\n }, [editor, linkUrl]);\r\n\r\n // Remove link\r\n const removeLink = useCallback(() => {\r\n Transforms.unwrapNodes(editor, {\r\n match: (n) =>\r\n !Editor.isEditor(n) && SlateElement.isElement(n) && n.type === \"link\",\r\n });\r\n }, [editor]);\r\n\r\n // Insert horizontal rule\r\n const insertHorizontalRule = useCallback(() => {\r\n const hr = { type: \"horizontal-rule\" as const, children: [{ text: \"\" }] };\r\n Transforms.insertNodes(editor, hr);\r\n Transforms.insertNodes(editor, {\r\n type: \"paragraph\",\r\n children: [{ text: \"\" }],\r\n });\r\n }, [editor]);\r\n\r\n // Insert table\r\n const insertTable = useCallback(() => {\r\n const table = {\r\n type: \"table\" as const,\r\n children: [\r\n {\r\n type: \"table-row\" as const,\r\n children: [\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n ],\r\n },\r\n {\r\n type: \"table-row\" as const,\r\n children: [\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n { type: \"table-cell\" as const, children: [{ text: \"\" }] },\r\n ],\r\n },\r\n ],\r\n };\r\n Transforms.insertNodes(editor, table);\r\n }, [editor]);\r\n\r\n // Set color\r\n const setColor = useCallback(\r\n (color: string, type: \"text\" | \"bg\") => {\r\n if (type === \"text\") {\r\n Editor.addMark(editor, \"color\", color);\r\n } else {\r\n Editor.addMark(editor, \"backgroundColor\", color);\r\n }\r\n setShowColorPicker(null);\r\n },\r\n [editor],\r\n );\r\n\r\n // Color palette\r\n const colors = [\r\n \"#000000\",\r\n \"#434343\",\r\n \"#666666\",\r\n \"#999999\",\r\n \"#b7b7b7\",\r\n \"#cccccc\",\r\n \"#d9d9d9\",\r\n \"#efefef\",\r\n \"#f3f3f3\",\r\n \"#ffffff\",\r\n \"#980000\",\r\n \"#ff0000\",\r\n \"#ff9900\",\r\n \"#ffff00\",\r\n \"#00ff00\",\r\n \"#00ffff\",\r\n \"#4a86e8\",\r\n \"#0000ff\",\r\n \"#9900ff\",\r\n \"#ff00ff\",\r\n \"#e6b8af\",\r\n \"#f4cccc\",\r\n \"#fce5cd\",\r\n \"#fff2cc\",\r\n \"#d9ead3\",\r\n \"#d0e0e3\",\r\n \"#c9daf8\",\r\n \"#cfe2f3\",\r\n \"#d9d2e9\",\r\n \"#ead1dc\",\r\n ];\r\n\r\n // Render toolbar button based on type\r\n const renderButton = (button: ToolbarButtonType, index: number) => {\r\n if (button === \"separator\") {\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n }\r\n\r\n switch (button) {\r\n // Text formatting\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"bold\")}\r\n onClick={() => toggleMark(editor, \"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n {icons.bold}\r\n </ToolbarButton>\r\n );\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"italic\")}\r\n onClick={() => toggleMark(editor, \"italic\")}\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n {icons.italic}\r\n </ToolbarButton>\r\n );\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"underline\")}\r\n onClick={() => toggleMark(editor, \"underline\")}\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n {icons.underline}\r\n </ToolbarButton>\r\n );\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"strikethrough\")}\r\n onClick={() => toggleMark(editor, \"strikethrough\")}\r\n title=\"Strikethrough\"\r\n >\r\n {icons.strike}\r\n </ToolbarButton>\r\n );\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"code\")}\r\n onClick={() => toggleMark(editor, \"code\")}\r\n title=\"Code\"\r\n >\r\n {icons.code}\r\n </ToolbarButton>\r\n );\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"code-block\")}\r\n onClick={() => toggleBlock(editor, \"code-block\")}\r\n title=\"Code Block\"\r\n >\r\n {icons.codeBlock}\r\n </ToolbarButton>\r\n );\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"subscript\")}\r\n onClick={() => toggleMark(editor, \"subscript\")}\r\n title=\"Subscript\"\r\n >\r\n {icons.subscript}\r\n </ToolbarButton>\r\n );\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isMarkActive(editor, \"superscript\")}\r\n onClick={() => toggleMark(editor, \"superscript\")}\r\n title=\"Superscript\"\r\n >\r\n {icons.superscript}\r\n </ToolbarButton>\r\n );\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => {\r\n Editor.removeMark(editor, \"bold\");\r\n Editor.removeMark(editor, \"italic\");\r\n Editor.removeMark(editor, \"underline\");\r\n Editor.removeMark(editor, \"strikethrough\");\r\n Editor.removeMark(editor, \"code\");\r\n Editor.removeMark(editor, \"subscript\");\r\n Editor.removeMark(editor, \"superscript\");\r\n Editor.removeMark(editor, \"color\");\r\n Editor.removeMark(editor, \"backgroundColor\");\r\n Editor.removeMark(editor, \"fontSize\");\r\n Editor.removeMark(editor, \"fontFamily\");\r\n }}\r\n title=\"Clear Formatting\"\r\n >\r\n {icons.clearFormatting}\r\n </ToolbarButton>\r\n );\r\n\r\n // Alignment\r\n case \"alignLeft\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"left\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"left\")}\r\n title=\"Align Left\"\r\n >\r\n {icons.alignLeft}\r\n </ToolbarButton>\r\n );\r\n case \"alignCenter\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"center\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"center\")}\r\n title=\"Align Center\"\r\n >\r\n {icons.alignCenter}\r\n </ToolbarButton>\r\n );\r\n case \"alignRight\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"right\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"right\")}\r\n title=\"Align Right\"\r\n >\r\n {icons.alignRight}\r\n </ToolbarButton>\r\n );\r\n case \"alignJustify\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"justify\", \"align\")}\r\n onClick={() => toggleBlock(editor, \"justify\")}\r\n title=\"Justify\"\r\n >\r\n {icons.alignJustify}\r\n </ToolbarButton>\r\n );\r\n\r\n // Lists\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"bulleted-list\")}\r\n onClick={() => toggleBlock(editor, \"bulleted-list\")}\r\n title=\"Bullet List\"\r\n >\r\n {icons.bulletList}\r\n </ToolbarButton>\r\n );\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"numbered-list\")}\r\n onClick={() => toggleBlock(editor, \"numbered-list\")}\r\n title=\"Numbered List\"\r\n >\r\n {icons.orderedList}\r\n </ToolbarButton>\r\n );\r\n\r\n // Headings\r\n case \"heading1\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"heading\")}\r\n onClick={() => {\r\n Transforms.setNodes(editor, { type: \"heading\", level: 1 } as any);\r\n }}\r\n title=\"Heading 1\"\r\n >\r\n {icons.heading1}\r\n </ToolbarButton>\r\n );\r\n case \"heading2\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"heading\")}\r\n onClick={() => {\r\n Transforms.setNodes(editor, { type: \"heading\", level: 2 } as any);\r\n }}\r\n title=\"Heading 2\"\r\n >\r\n {icons.heading2}\r\n </ToolbarButton>\r\n );\r\n case \"heading3\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"heading\")}\r\n onClick={() => {\r\n Transforms.setNodes(editor, { type: \"heading\", level: 3 } as any);\r\n }}\r\n title=\"Heading 3\"\r\n >\r\n {icons.heading3}\r\n </ToolbarButton>\r\n );\r\n\r\n // Blocks\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBlockActive(editor, \"blockquote\")}\r\n onClick={() => toggleBlock(editor, \"blockquote\")}\r\n title=\"Blockquote\"\r\n >\r\n {icons.blockquote}\r\n </ToolbarButton>\r\n );\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={insertHorizontalRule}\r\n title=\"Horizontal Rule\"\r\n >\r\n {icons.horizontalRule}\r\n </ToolbarButton>\r\n );\r\n\r\n // Links\r\n case \"link\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={linkDialogRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowLinkDialog(!showLinkDialog)}\r\n title=\"Insert Link\"\r\n >\r\n {icons.link}\r\n </ToolbarButton>\r\n {showLinkDialog && (\r\n <div className=\"rte-builder-toolbar-dropdown-content\">\r\n <input\r\n type=\"url\"\r\n placeholder=\"Enter URL...\"\r\n value={linkUrl}\r\n onChange={(e) => setLinkUrl(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n insertLink();\r\n }\r\n }}\r\n autoFocus\r\n />\r\n <button onClick={insertLink}>Insert</button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton key={button} onClick={removeLink} title=\"Remove Link\">\r\n {icons.unlink}\r\n </ToolbarButton>\r\n );\r\n\r\n // Media\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerImage || (() => {})}\r\n disabled={!onMediaPickerImage}\r\n title=\"Insert Image\"\r\n >\r\n {icons.image}\r\n </ToolbarButton>\r\n );\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerVideo || (() => {})}\r\n disabled={!onMediaPickerVideo}\r\n title=\"Insert Video\"\r\n >\r\n {icons.video}\r\n </ToolbarButton>\r\n );\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={insertTable}\r\n title=\"Insert Table\"\r\n >\r\n {icons.table}\r\n </ToolbarButton>\r\n );\r\n\r\n // Colors\r\n case \"textColor\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={colorPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() =>\r\n setShowColorPicker(showColorPicker === \"text\" ? null : \"text\")\r\n }\r\n title=\"Text Color\"\r\n >\r\n {icons.textColor}\r\n </ToolbarButton>\r\n {showColorPicker === \"text\" && (\r\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\r\n {colors.map((color) => (\r\n <button\r\n key={color}\r\n className=\"rte-builder-color-swatch\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => setColor(color, \"text\")}\r\n title={color}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n case \"backgroundColor\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={colorPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() =>\r\n setShowColorPicker(showColorPicker === \"bg\" ? null : \"bg\")\r\n }\r\n title=\"Background Color\"\r\n >\r\n {icons.backgroundColor}\r\n </ToolbarButton>\r\n {showColorPicker === \"bg\" && (\r\n <div className=\"rte-builder-toolbar-dropdown-content rte-builder-color-picker\">\r\n {colors.map((color) => (\r\n <button\r\n key={color}\r\n className=\"rte-builder-color-swatch\"\r\n style={{ backgroundColor: color }}\r\n onClick={() => setColor(color, \"bg\")}\r\n title={color}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // Emoji\r\n case \"emoji\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={emojiPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n title=\"Insert Emoji\"\r\n >\r\n {icons.emoji}\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <div className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? \"active\" : \"\"}`}\r\n onClick={() => setSelectedEmojiCategory(key)}\r\n title={(category as any).label}\r\n >\r\n {(category as any).emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {(\r\n EMOJI_CATEGORIES[\r\n selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES\r\n ] as any\r\n )?.emojis.map((emoji: string, idx: number) => (\r\n <button\r\n key={idx}\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => insertEmoji(emoji)}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // Actions\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.undo()}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n {icons.undo}\r\n </ToolbarButton>\r\n );\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.redo()}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n {icons.redo}\r\n </ToolbarButton>\r\n );\r\n case \"fullscreen\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isFullscreen}\r\n onClick={onToggleFullscreen || (() => {})}\r\n title=\"Toggle Fullscreen\"\r\n >\r\n {icons.fullscreen}\r\n </ToolbarButton>\r\n );\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onPrint || (() => {})}\r\n title=\"Print\"\r\n >\r\n {icons.print}\r\n </ToolbarButton>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"rte-builder-toolbar slate-toolbar\">\r\n {buttons.map((button, index) => renderButton(button, index))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default SlateToolbar;\r\n","/**\r\n * Slate.js Editor Component\r\n *\r\n * This is the actual Slate.js editor implementation that conforms\r\n * to the adapter interface.\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useImperativeHandle,\r\n forwardRef,\r\n useCallback,\r\n useMemo,\r\n useState,\r\n useRef,\r\n} from 'react'\r\nimport { createEditor, Descendant, Editor, Transforms, Text, Element as SlateElement, Node } from 'slate'\r\nimport { Slate, Editable, withReact, ReactEditor, useSlate } from 'slate-react'\r\nimport { withHistory, HistoryEditor } from 'slate-history'\r\nimport isHotkey from 'is-hotkey'\r\n\r\n// Toolbar\r\nimport { SlateToolbar } from './SlateToolbar'\r\n\r\n// Types\r\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\r\n\r\n// ============================================================================\r\n// CUSTOM TYPES\r\n// ============================================================================\r\n\r\ntype CustomText = {\r\n text: string\r\n bold?: boolean\r\n italic?: boolean\r\n underline?: boolean\r\n strikethrough?: boolean\r\n code?: boolean\r\n subscript?: boolean\r\n superscript?: boolean\r\n color?: string\r\n backgroundColor?: string\r\n fontSize?: string\r\n fontFamily?: string\r\n}\r\n\r\ntype ParagraphElement = { type: 'paragraph'; align?: string; indent?: number; children: Descendant[] }\r\ntype HeadingElement = { type: 'heading'; level: 1 | 2 | 3 | 4 | 5 | 6; align?: string; children: Descendant[] }\r\ntype BlockquoteElement = { type: 'blockquote'; children: Descendant[] }\r\ntype CodeBlockElement = { type: 'code-block'; language?: string; children: Descendant[] }\r\ntype BulletListElement = { type: 'bulleted-list'; children: Descendant[] }\r\ntype NumberedListElement = { type: 'numbered-list'; children: Descendant[] }\r\ntype ListItemElement = { type: 'list-item'; children: Descendant[] }\r\ntype LinkElement = { type: 'link'; url: string; children: Descendant[] }\r\ntype ImageElement = { type: 'image'; url: string; alt?: string; children: Descendant[] }\r\ntype VideoElement = { type: 'video'; url: string; children: Descendant[] }\r\ntype HorizontalRuleElement = { type: 'horizontal-rule'; children: Descendant[] }\r\ntype TableElement = { type: 'table'; children: Descendant[] }\r\ntype TableRowElement = { type: 'table-row'; children: Descendant[] }\r\ntype TableCellElement = { type: 'table-cell'; children: Descendant[] }\r\n\r\ntype CustomElement =\r\n | ParagraphElement\r\n | HeadingElement\r\n | BlockquoteElement\r\n | CodeBlockElement\r\n | BulletListElement\r\n | NumberedListElement\r\n | ListItemElement\r\n | LinkElement\r\n | ImageElement\r\n | VideoElement\r\n | HorizontalRuleElement\r\n | TableElement\r\n | TableRowElement\r\n | TableCellElement\r\n\r\ndeclare module 'slate' {\r\n interface CustomTypes {\r\n Editor: Editor & ReactEditor & HistoryEditor\r\n Element: CustomElement\r\n Text: CustomText\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// HOTKEYS\r\n// ============================================================================\r\n\r\nconst HOTKEYS: Record<string, string> = {\r\n 'mod+b': 'bold',\r\n 'mod+i': 'italic',\r\n 'mod+u': 'underline',\r\n 'mod+`': 'code',\r\n 'mod+shift+s': 'strikethrough',\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS\r\n// ============================================================================\r\n\r\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\r\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\r\n\r\nconst isMarkActive = (editor: Editor, format: string) => {\r\n const marks = Editor.marks(editor)\r\n return marks ? (marks as Record<string, unknown>)[format] === true : false\r\n}\r\n\r\nconst isBlockActive = (editor: Editor, format: string, blockType: 'type' | 'align' = 'type') => {\r\n const { selection } = editor\r\n if (!selection) return false\r\n\r\n const [match] = Array.from(\r\n Editor.nodes(editor, {\r\n at: Editor.unhangRange(editor, selection),\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n (blockType === 'type' ? n.type === format : (n as any).align === format),\r\n })\r\n )\r\n\r\n return !!match\r\n}\r\n\r\nconst toggleMark = (editor: Editor, format: string) => {\r\n const isActive = isMarkActive(editor, format)\r\n\r\n if (isActive) {\r\n Editor.removeMark(editor, format)\r\n } else {\r\n Editor.addMark(editor, format, true)\r\n }\r\n}\r\n\r\nconst toggleBlock = (editor: Editor, format: string) => {\r\n const isActive = isBlockActive(\r\n editor,\r\n format,\r\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\r\n )\r\n const isList = LIST_TYPES.includes(format)\r\n\r\n Transforms.unwrapNodes(editor, {\r\n match: n =>\r\n !Editor.isEditor(n) &&\r\n SlateElement.isElement(n) &&\r\n LIST_TYPES.includes(n.type) &&\r\n !TEXT_ALIGN_TYPES.includes(format),\r\n split: true,\r\n })\r\n\r\n let newProperties: Partial<CustomElement>\r\n if (TEXT_ALIGN_TYPES.includes(format)) {\r\n newProperties = {\r\n align: isActive ? undefined : format,\r\n } as Partial<CustomElement>\r\n } else {\r\n newProperties = {\r\n type: isActive ? 'paragraph' : isList ? 'list-item' : format,\r\n } as Partial<CustomElement>\r\n }\r\n Transforms.setNodes<CustomElement>(editor, newProperties)\r\n\r\n if (!isActive && isList) {\r\n const block = { type: format, children: [] } as CustomElement\r\n Transforms.wrapNodes(editor, block)\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SERIALIZATION\r\n// ============================================================================\r\n\r\nconst serializeToHtml = (nodes: Descendant[]): string => {\r\n return nodes.map(n => serializeNode(n)).join('')\r\n}\r\n\r\nconst serializeNode = (node: Descendant): string => {\r\n if (Text.isText(node)) {\r\n let string = escapeHtml(node.text)\r\n if (node.bold) string = `<strong>${string}</strong>`\r\n if (node.italic) string = `<em>${string}</em>`\r\n if (node.underline) string = `<u>${string}</u>`\r\n if (node.strikethrough) string = `<s>${string}</s>`\r\n if (node.code) string = `<code>${string}</code>`\r\n if (node.subscript) string = `<sub>${string}</sub>`\r\n if (node.superscript) string = `<sup>${string}</sup>`\r\n if (node.color) string = `<span style=\"color: ${node.color}\">${string}</span>`\r\n if (node.backgroundColor) string = `<span style=\"background-color: ${node.backgroundColor}\">${string}</span>`\r\n if (node.fontSize) string = `<span style=\"font-size: ${node.fontSize}\">${string}</span>`\r\n if (node.fontFamily) string = `<span style=\"font-family: ${node.fontFamily}\">${string}</span>`\r\n return string\r\n }\r\n\r\n const children = (node.children as Descendant[]).map(n => serializeNode(n)).join('')\r\n const element = node as CustomElement\r\n const alignStyle = (element as any).align ? ` style=\"text-align: ${(element as any).align}\"` : ''\r\n\r\n switch (element.type) {\r\n case 'paragraph':\r\n return `<p${alignStyle}>${children}</p>`\r\n case 'heading':\r\n return `<h${element.level}${alignStyle}>${children}</h${element.level}>`\r\n case 'blockquote':\r\n return `<blockquote>${children}</blockquote>`\r\n case 'code-block':\r\n return `<pre><code class=\"language-${element.language || 'plaintext'}\">${children}</code></pre>`\r\n case 'bulleted-list':\r\n return `<ul>${children}</ul>`\r\n case 'numbered-list':\r\n return `<ol>${children}</ol>`\r\n case 'list-item':\r\n return `<li>${children}</li>`\r\n case 'link':\r\n return `<a href=\"${escapeHtml(element.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">${children}</a>`\r\n case 'image':\r\n return `<img src=\"${escapeHtml(element.url)}\" alt=\"${escapeHtml(element.alt || '')}\" />`\r\n case 'video':\r\n return `<video src=\"${escapeHtml(element.url)}\" controls></video>`\r\n case 'horizontal-rule':\r\n return '<hr />'\r\n case 'table':\r\n return `<table>${children}</table>`\r\n case 'table-row':\r\n return `<tr>${children}</tr>`\r\n case 'table-cell':\r\n return `<td>${children}</td>`\r\n default:\r\n return children\r\n }\r\n}\r\n\r\nconst escapeHtml = (str: string): string => {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;')\r\n}\r\n\r\nconst deserializeFromHtml = (html: string): Descendant[] => {\r\n if (!html || html.trim() === '') {\r\n return [{ type: 'paragraph', children: [{ text: '' }] }]\r\n }\r\n\r\n const doc = new DOMParser().parseFromString(html, 'text/html')\r\n return deserializeElement(doc.body)\r\n}\r\n\r\nconst deserializeElement = (el: HTMLElement): Descendant[] => {\r\n if (el.nodeType === 3) {\r\n return [{ text: el.textContent || '' }]\r\n }\r\n\r\n if (el.nodeType !== 1) {\r\n return [{ text: '' }]\r\n }\r\n\r\n const children: Descendant[] = Array.from(el.childNodes)\r\n .flatMap(child => deserializeElement(child as HTMLElement))\r\n\r\n if (children.length === 0) {\r\n children.push({ text: '' })\r\n }\r\n\r\n switch (el.nodeName) {\r\n case 'BODY':\r\n return children\r\n case 'BR':\r\n return [{ text: '\\n' }]\r\n case 'P':\r\n return [{ type: 'paragraph', align: el.style.textAlign || undefined, children }]\r\n case 'H1':\r\n return [{ type: 'heading', level: 1, children }]\r\n case 'H2':\r\n return [{ type: 'heading', level: 2, children }]\r\n case 'H3':\r\n return [{ type: 'heading', level: 3, children }]\r\n case 'H4':\r\n return [{ type: 'heading', level: 4, children }]\r\n case 'H5':\r\n return [{ type: 'heading', level: 5, children }]\r\n case 'H6':\r\n return [{ type: 'heading', level: 6, children }]\r\n case 'BLOCKQUOTE':\r\n return [{ type: 'blockquote', children }]\r\n case 'PRE':\r\n return [{ type: 'code-block', children }]\r\n case 'UL':\r\n return [{ type: 'bulleted-list', children }]\r\n case 'OL':\r\n return [{ type: 'numbered-list', children }]\r\n case 'LI':\r\n return [{ type: 'list-item', children }]\r\n case 'A':\r\n return [{ type: 'link', url: el.getAttribute('href') || '', children }]\r\n case 'IMG':\r\n return [{ type: 'image', url: el.getAttribute('src') || '', alt: el.getAttribute('alt') || '', children: [{ text: '' }] }]\r\n case 'VIDEO':\r\n return [{ type: 'video', url: el.getAttribute('src') || '', children: [{ text: '' }] }]\r\n case 'HR':\r\n return [{ type: 'horizontal-rule', children: [{ text: '' }] }]\r\n case 'TABLE':\r\n return [{ type: 'table', children }]\r\n case 'TR':\r\n return [{ type: 'table-row', children }]\r\n case 'TD':\r\n case 'TH':\r\n return [{ type: 'table-cell', children }]\r\n case 'STRONG':\r\n case 'B':\r\n return children.map(child => ({ ...child, bold: true } as CustomText))\r\n case 'EM':\r\n case 'I':\r\n return children.map(child => ({ ...child, italic: true } as CustomText))\r\n case 'U':\r\n return children.map(child => ({ ...child, underline: true } as CustomText))\r\n case 'S':\r\n case 'STRIKE':\r\n case 'DEL':\r\n return children.map(child => ({ ...child, strikethrough: true } as CustomText))\r\n case 'CODE':\r\n return children.map(child => ({ ...child, code: true } as CustomText))\r\n case 'SUB':\r\n return children.map(child => ({ ...child, subscript: true } as CustomText))\r\n case 'SUP':\r\n return children.map(child => ({ ...child, superscript: true } as CustomText))\r\n default:\r\n return children\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// RENDER ELEMENTS & LEAVES\r\n// ============================================================================\r\n\r\nconst renderElement = (props: { attributes: any; children: React.ReactNode; element: CustomElement }) => {\r\n const { attributes, children, element } = props\r\n const style = { textAlign: (element as any).align }\r\n\r\n switch (element.type) {\r\n case 'heading':\r\n const Tag = `h${element.level}` as keyof JSX.IntrinsicElements\r\n return <Tag style={style} {...attributes}>{children}</Tag>\r\n case 'blockquote':\r\n return <blockquote {...attributes}>{children}</blockquote>\r\n case 'code-block':\r\n return (\r\n <pre {...attributes}>\r\n <code>{children}</code>\r\n </pre>\r\n )\r\n case 'bulleted-list':\r\n return <ul {...attributes}>{children}</ul>\r\n case 'numbered-list':\r\n return <ol {...attributes}>{children}</ol>\r\n case 'list-item':\r\n return <li {...attributes}>{children}</li>\r\n case 'link':\r\n return (\r\n <a href={element.url} target=\"_blank\" rel=\"noopener noreferrer\" {...attributes}>\r\n {children}\r\n </a>\r\n )\r\n case 'image':\r\n return (\r\n <div {...attributes} contentEditable={false}>\r\n <img src={element.url} alt={element.alt || ''} style={{ maxWidth: '100%' }} />\r\n {children}\r\n </div>\r\n )\r\n case 'video':\r\n return (\r\n <div {...attributes} contentEditable={false}>\r\n <video src={element.url} controls style={{ maxWidth: '100%' }} />\r\n {children}\r\n </div>\r\n )\r\n case 'horizontal-rule':\r\n return (\r\n <div {...attributes} contentEditable={false}>\r\n <hr />\r\n {children}\r\n </div>\r\n )\r\n case 'table':\r\n return <table {...attributes}><tbody>{children}</tbody></table>\r\n case 'table-row':\r\n return <tr {...attributes}>{children}</tr>\r\n case 'table-cell':\r\n return <td {...attributes}>{children}</td>\r\n case 'paragraph':\r\n default:\r\n return <p style={style} {...attributes}>{children}</p>\r\n }\r\n}\r\n\r\nconst renderLeaf = (props: { attributes: any; children: React.ReactNode; leaf: CustomText }) => {\r\n const { attributes, leaf } = props\r\n let { children } = props\r\n\r\n if (leaf.bold) {\r\n children = <strong>{children}</strong>\r\n }\r\n if (leaf.italic) {\r\n children = <em>{children}</em>\r\n }\r\n if (leaf.underline) {\r\n children = <u>{children}</u>\r\n }\r\n if (leaf.strikethrough) {\r\n children = <s>{children}</s>\r\n }\r\n if (leaf.code) {\r\n children = <code>{children}</code>\r\n }\r\n if (leaf.subscript) {\r\n children = <sub>{children}</sub>\r\n }\r\n if (leaf.superscript) {\r\n children = <sup>{children}</sup>\r\n }\r\n\r\n const style: React.CSSProperties = {}\r\n if (leaf.color) style.color = leaf.color\r\n if (leaf.backgroundColor) style.backgroundColor = leaf.backgroundColor\r\n if (leaf.fontSize) style.fontSize = leaf.fontSize\r\n if (leaf.fontFamily) style.fontFamily = leaf.fontFamily\r\n\r\n return (\r\n <span {...attributes} style={Object.keys(style).length > 0 ? style : undefined}>\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\n// ============================================================================\r\n// WITHPLUGINS\r\n// ============================================================================\r\n\r\nconst withInlines = (editor: Editor) => {\r\n const { isInline, isVoid } = editor\r\n\r\n editor.isInline = (element) => {\r\n return element.type === 'link' ? true : isInline(element)\r\n }\r\n\r\n editor.isVoid = (element) => {\r\n return ['image', 'video', 'horizontal-rule'].includes(element.type) ? true : isVoid(element)\r\n }\r\n\r\n return editor\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\ninterface SlateEditorComponentProps extends AdapterComponentProps {}\r\n\r\nexport const SlateEditorComponent = forwardRef<AdapterEditorRef, SlateEditorComponentProps>(\r\n (\r\n {\r\n value = '',\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = 'Start typing...',\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarButtons,\r\n className = '',\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = 'javascript',\r\n editorConfig = {},\r\n },\r\n ref\r\n ) => {\r\n // Create editor instance\r\n const editor = useMemo(\r\n () => withInlines(withHistory(withReact(createEditor()))),\r\n []\r\n )\r\n\r\n // Track fullscreen state\r\n const [isFullscreen, setIsFullscreen] = useState(false)\r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n\r\n // Initial value\r\n const [editorValue, setEditorValue] = useState<Descendant[]>(() => {\r\n return deserializeFromHtml(value)\r\n })\r\n\r\n // Update value when prop changes\r\n useEffect(() => {\r\n const currentHtml = serializeToHtml(editorValue)\r\n if (value !== currentHtml) {\r\n const newValue = deserializeFromHtml(value)\r\n setEditorValue(newValue)\r\n // Reset editor selection\r\n editor.children = newValue\r\n Transforms.select(editor, { anchor: { path: [0, 0], offset: 0 }, focus: { path: [0, 0], offset: 0 } })\r\n }\r\n }, [value])\r\n\r\n // Handle change\r\n const handleChange = useCallback(\r\n (newValue: Descendant[]) => {\r\n setEditorValue(newValue)\r\n const html = serializeToHtml(newValue)\r\n onChange?.(html)\r\n },\r\n [onChange]\r\n )\r\n\r\n // Handle keydown\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n for (const hotkey in HOTKEYS) {\r\n if (isHotkey(hotkey, event as any)) {\r\n event.preventDefault()\r\n const mark = HOTKEYS[hotkey]\r\n toggleMark(editor, mark)\r\n }\r\n }\r\n },\r\n [editor]\r\n )\r\n\r\n // Get text content\r\n const getText = useCallback(() => {\r\n return editorValue.map(n => Node.string(n)).join('\\n')\r\n }, [editorValue])\r\n\r\n // Get character count\r\n const getCharacterCount = useCallback(() => {\r\n return getText().length\r\n }, [getText])\r\n\r\n // Get word count\r\n const getWordCount = useCallback(() => {\r\n const text = getText()\r\n return text.split(/\\s+/).filter(word => word.length > 0).length\r\n }, [getText])\r\n\r\n // Toggle fullscreen\r\n const handleToggleFullscreen = useCallback(() => {\r\n setIsFullscreen(prev => !prev)\r\n }, [])\r\n\r\n // Print\r\n const handlePrint = useCallback(() => {\r\n const html = serializeToHtml(editorValue)\r\n const printWindow = window.open('', '_blank')\r\n if (printWindow) {\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>Print</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; padding: 20px; }\r\n img { max-width: 100%; }\r\n </style>\r\n </head>\r\n <body>${html}</body>\r\n </html>\r\n `)\r\n printWindow.document.close()\r\n printWindow.print()\r\n }\r\n }, [editorValue])\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage) {\r\n const file = await onMediaPickerImage()\r\n if (file) {\r\n const image: ImageElement = {\r\n type: 'image',\r\n url: file.url,\r\n alt: file.alt || file.name,\r\n children: [{ text: '' }],\r\n }\r\n Transforms.insertNodes(editor, image)\r\n }\r\n }\r\n }, [onMediaPickerImage, editor])\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo) {\r\n const file = await onMediaPickerVideo()\r\n if (file) {\r\n const video: VideoElement = {\r\n type: 'video',\r\n url: file.url,\r\n children: [{ text: '' }],\r\n }\r\n Transforms.insertNodes(editor, video)\r\n }\r\n }\r\n }, [onMediaPickerVideo, editor])\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => serializeToHtml(editorValue),\r\n getText,\r\n getJSON: () => editorValue,\r\n setContent: (html: string) => {\r\n const newValue = deserializeFromHtml(html)\r\n setEditorValue(newValue)\r\n editor.children = newValue\r\n },\r\n focus: () => {\r\n ReactEditor.focus(editor)\r\n },\r\n blur: () => {\r\n ReactEditor.blur(editor)\r\n },\r\n insertHTML: (html: string) => {\r\n const fragment = deserializeFromHtml(html)\r\n Transforms.insertFragment(editor, fragment)\r\n },\r\n insertText: (text: string) => {\r\n Transforms.insertText(editor, text)\r\n },\r\n clear: () => {\r\n const emptyValue: Descendant[] = [{ type: 'paragraph', children: [{ text: '' }] }]\r\n setEditorValue(emptyValue)\r\n editor.children = emptyValue\r\n },\r\n isEmpty: () => {\r\n return (\r\n editorValue.length === 1 &&\r\n editorValue[0].type === 'paragraph' &&\r\n (editorValue[0] as ParagraphElement).children.length === 1 &&\r\n ((editorValue[0] as ParagraphElement).children[0] as CustomText).text === ''\r\n )\r\n },\r\n getCharacterCount,\r\n getWordCount,\r\n isFullscreen: () => isFullscreen,\r\n toggleFullscreen: handleToggleFullscreen,\r\n print: handlePrint,\r\n undo: () => {\r\n HistoryEditor.undo(editor)\r\n },\r\n redo: () => {\r\n HistoryEditor.redo(editor)\r\n },\r\n canUndo: () => {\r\n return editor.history.undos.length > 0\r\n },\r\n canRedo: () => {\r\n return editor.history.redos.length > 0\r\n },\r\n getNativeEditor: () => editor,\r\n }))\r\n\r\n const characterCount = getCharacterCount()\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\r\n\r\n return (\r\n <div\r\n ref={wrapperRef}\r\n className={`rte-builder-wrapper slate-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\r\n >\r\n <Slate editor={editor} initialValue={editorValue} onChange={handleChange}>\r\n <SlateToolbar\r\n editor={editor}\r\n buttons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\r\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\r\n onToggleFullscreen={handleToggleFullscreen}\r\n onPrint={handlePrint}\r\n isFullscreen={isFullscreen}\r\n toggleMark={toggleMark}\r\n toggleBlock={toggleBlock}\r\n isMarkActive={isMarkActive}\r\n isBlockActive={isBlockActive}\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{\r\n height: `${height}px`,\r\n minHeight: `${minHeight}px`,\r\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <Editable\r\n className=\"rte-builder-content\"\r\n renderElement={renderElement}\r\n renderLeaf={renderLeaf}\r\n placeholder={placeholder}\r\n spellCheck\r\n autoFocus\r\n readOnly={disabled || readOnly}\r\n onKeyDown={handleKeyDown}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </Slate>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nSlateEditorComponent.displayName = 'SlateEditorComponent'\r\n\r\nexport default SlateEditorComponent\r\n","/**\r\n * Lexical Toolbar Component\r\n *\r\n * A toolbar component for the Lexical editor with all standard formatting options.\r\n */\r\n\r\nimport React, { useCallback, useState, useRef, useEffect } from \"react\";\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n FORMAT_TEXT_COMMAND,\r\n UNDO_COMMAND,\r\n REDO_COMMAND,\r\n LexicalEditor,\r\n} from \"lexical\";\r\nimport {\r\n $isHeadingNode,\r\n $createHeadingNode,\r\n HeadingTagType,\r\n} from \"@lexical/rich-text\";\r\nimport {\r\n INSERT_ORDERED_LIST_COMMAND,\r\n INSERT_UNORDERED_LIST_COMMAND,\r\n REMOVE_LIST_COMMAND,\r\n $isListNode,\r\n ListNode,\r\n} from \"@lexical/list\";\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\r\nimport { $setBlocksType } from \"@lexical/selection\";\r\nimport { $createQuoteNode } from \"@lexical/rich-text\";\r\nimport { $createCodeNode } from \"@lexical/code\";\r\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"@lexical/react/LexicalHorizontalRuleNode\";\r\nimport { INSERT_TABLE_COMMAND, TableNode } from \"@lexical/table\";\r\nimport { $createParagraphNode, $getRoot } from \"lexical\";\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\r\n\r\nimport type { ToolbarButtonType } from \"../../core/types\";\r\nimport { EMOJI_CATEGORIES } from \"../../extensions/Emoji\";\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\ninterface LexicalToolbarProps {\r\n editor: LexicalEditor;\r\n buttons?: ToolbarButtonType[];\r\n onMediaPickerImage?: () => Promise<void>;\r\n onMediaPickerVideo?: () => Promise<void>;\r\n onToggleFullscreen?: () => void;\r\n onPrint?: () => void;\r\n isFullscreen?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// TOOLBAR BUTTON COMPONENT\r\n// ============================================================================\r\n\r\ninterface ToolbarButtonProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n title: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst ToolbarButton: React.FC<ToolbarButtonProps> = ({\r\n active = false,\r\n disabled = false,\r\n onClick,\r\n title,\r\n children,\r\n}) => (\r\n <button\r\n className={`rte-builder-toolbar-button ${active ? \"active\" : \"\"}`}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n);\r\n\r\n// ============================================================================\r\n// TOOLBAR ICONS (Simple SVG icons)\r\n// ============================================================================\r\n\r\nconst icons: Record<string, JSX.Element> = {\r\n bold: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n italic: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"\r\n />\r\n </svg>\r\n ),\r\n underline: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n strike: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"\r\n />\r\n </svg>\r\n ),\r\n code: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n codeBlock: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n subscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n superscript: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n clearFormatting: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n alignLeft: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignCenter: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignRight: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n alignJustify: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\"\r\n />\r\n </svg>\r\n ),\r\n indent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n outdent: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\"\r\n />\r\n </svg>\r\n ),\r\n bulletList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n orderedList: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"\r\n />\r\n </svg>\r\n ),\r\n heading1: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading2: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n heading3: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n blockquote: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\r\n </svg>\r\n ),\r\n horizontalRule: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path fill=\"currentColor\" d=\"M4 11h16v2H4z\" />\r\n </svg>\r\n ),\r\n link: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n unlink: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n image: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n video: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n table: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n emoji: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n undo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n redo: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n fullscreen: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\r\n />\r\n </svg>\r\n ),\r\n print: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n textColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z\"\r\n />\r\n </svg>\r\n ),\r\n backgroundColor: (\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">\r\n <path\r\n fill=\"currentColor\"\r\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\"\r\n />\r\n </svg>\r\n ),\r\n};\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\nexport const LexicalToolbar: React.FC<LexicalToolbarProps> = ({\r\n editor,\r\n buttons = [],\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n onToggleFullscreen,\r\n onPrint,\r\n isFullscreen = false,\r\n}) => {\r\n // Emoji picker state\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const [selectedEmojiCategory, setSelectedEmojiCategory] =\r\n useState<string>(\"smileys\");\r\n const emojiPickerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Link dialog state\r\n const [showLinkDialog, setShowLinkDialog] = useState(false);\r\n const [linkUrl, setLinkUrl] = useState(\"\");\r\n const linkDialogRef = useRef<HTMLDivElement>(null);\r\n\r\n // Active states\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isCode, setIsCode] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n\r\n // Update active states on selection change\r\n useEffect(() => {\r\n return editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n setIsBold(selection.hasFormat(\"bold\"));\r\n setIsItalic(selection.hasFormat(\"italic\"));\r\n setIsUnderline(selection.hasFormat(\"underline\"));\r\n setIsStrikethrough(selection.hasFormat(\"strikethrough\"));\r\n setIsCode(selection.hasFormat(\"code\"));\r\n setIsSubscript(selection.hasFormat(\"subscript\"));\r\n setIsSuperscript(selection.hasFormat(\"superscript\"));\r\n }\r\n });\r\n });\r\n }, [editor]);\r\n\r\n // Close dropdowns when clicking outside\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n emojiPickerRef.current &&\r\n !emojiPickerRef.current.contains(event.target as Node)\r\n ) {\r\n setShowEmojiPicker(false);\r\n }\r\n if (\r\n linkDialogRef.current &&\r\n !linkDialogRef.current.contains(event.target as Node)\r\n ) {\r\n setShowLinkDialog(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n // Insert emoji\r\n const insertEmoji = useCallback(\r\n (emoji: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n selection.insertText(emoji);\r\n }\r\n });\r\n setShowEmojiPicker(false);\r\n },\r\n [editor],\r\n );\r\n\r\n // Insert link\r\n const insertLink = useCallback(() => {\r\n if (linkUrl) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, linkUrl);\r\n setLinkUrl(\"\");\r\n setShowLinkDialog(false);\r\n }\r\n }, [editor, linkUrl]);\r\n\r\n // Remove link\r\n const removeLink = useCallback(() => {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }, [editor]);\r\n\r\n // Format heading\r\n const formatHeading = useCallback(\r\n (headingTag: HeadingTagType) => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createHeadingNode(headingTag));\r\n }\r\n });\r\n },\r\n [editor],\r\n );\r\n\r\n // Format paragraph\r\n const formatParagraph = useCallback(() => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n }\r\n });\r\n }, [editor]);\r\n\r\n // Format quote\r\n const formatQuote = useCallback(() => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createQuoteNode());\r\n }\r\n });\r\n }, [editor]);\r\n\r\n // Format code block\r\n const formatCodeBlock = useCallback(() => {\r\n editor.update(() => {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n $setBlocksType(selection, () => $createCodeNode());\r\n }\r\n });\r\n }, [editor]);\r\n\r\n // Insert table\r\n const insertTable = useCallback(() => {\r\n editor.dispatchCommand(INSERT_TABLE_COMMAND, { rows: \"3\", columns: \"3\" });\r\n }, [editor]);\r\n\r\n // Render toolbar button based on type\r\n const renderButton = (button: ToolbarButtonType, index: number) => {\r\n if (button === \"separator\") {\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n }\r\n\r\n switch (button) {\r\n // Text formatting\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isBold}\r\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n {icons.bold}\r\n </ToolbarButton>\r\n );\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isItalic}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")\r\n }\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n {icons.italic}\r\n </ToolbarButton>\r\n );\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isUnderline}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")\r\n }\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n {icons.underline}\r\n </ToolbarButton>\r\n );\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isStrikethrough}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\r\n }\r\n title=\"Strikethrough\"\r\n >\r\n {icons.strike}\r\n </ToolbarButton>\r\n );\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isCode}\r\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\r\n title=\"Code\"\r\n >\r\n {icons.code}\r\n </ToolbarButton>\r\n );\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={formatCodeBlock}\r\n title=\"Code Block\"\r\n >\r\n {icons.codeBlock}\r\n </ToolbarButton>\r\n );\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isSubscript}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\r\n }\r\n title=\"Subscript\"\r\n >\r\n {icons.subscript}\r\n </ToolbarButton>\r\n );\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isSuperscript}\r\n onClick={() =>\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\r\n }\r\n title=\"Superscript\"\r\n >\r\n {icons.superscript}\r\n </ToolbarButton>\r\n );\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={formatParagraph}\r\n title=\"Clear Formatting\"\r\n >\r\n {icons.clearFormatting}\r\n </ToolbarButton>\r\n );\r\n\r\n // Lists\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n }\r\n title=\"Bullet List\"\r\n >\r\n {icons.bulletList}\r\n </ToolbarButton>\r\n );\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n }\r\n title=\"Numbered List\"\r\n >\r\n {icons.orderedList}\r\n </ToolbarButton>\r\n );\r\n\r\n // Headings\r\n case \"heading1\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => formatHeading(\"h1\")}\r\n title=\"Heading 1\"\r\n >\r\n {icons.heading1}\r\n </ToolbarButton>\r\n );\r\n case \"heading2\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => formatHeading(\"h2\")}\r\n title=\"Heading 2\"\r\n >\r\n {icons.heading2}\r\n </ToolbarButton>\r\n );\r\n case \"heading3\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => formatHeading(\"h3\")}\r\n title=\"Heading 3\"\r\n >\r\n {icons.heading3}\r\n </ToolbarButton>\r\n );\r\n\r\n // Blocks\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton key={button} onClick={formatQuote} title=\"Blockquote\">\r\n {icons.blockquote}\r\n </ToolbarButton>\r\n );\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\r\n }\r\n title=\"Horizontal Rule\"\r\n >\r\n {icons.horizontalRule}\r\n </ToolbarButton>\r\n );\r\n\r\n // Links\r\n case \"link\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={linkDialogRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowLinkDialog(!showLinkDialog)}\r\n title=\"Insert Link\"\r\n >\r\n {icons.link}\r\n </ToolbarButton>\r\n {showLinkDialog && (\r\n <div className=\"rte-builder-toolbar-dropdown-content\">\r\n <input\r\n type=\"url\"\r\n placeholder=\"Enter URL...\"\r\n value={linkUrl}\r\n onChange={(e) => setLinkUrl(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n insertLink();\r\n }\r\n }}\r\n autoFocus\r\n />\r\n <button onClick={insertLink}>Insert</button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton key={button} onClick={removeLink} title=\"Remove Link\">\r\n {icons.unlink}\r\n </ToolbarButton>\r\n );\r\n\r\n // Media\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerImage || (() => {})}\r\n disabled={!onMediaPickerImage}\r\n title=\"Insert Image\"\r\n >\r\n {icons.image}\r\n </ToolbarButton>\r\n );\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onMediaPickerVideo || (() => {})}\r\n disabled={!onMediaPickerVideo}\r\n title=\"Insert Video\"\r\n >\r\n {icons.video}\r\n </ToolbarButton>\r\n );\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={insertTable}\r\n title=\"Insert Table\"\r\n >\r\n {icons.table}\r\n </ToolbarButton>\r\n );\r\n\r\n // Emoji\r\n case \"emoji\":\r\n return (\r\n <div\r\n key={button}\r\n className=\"rte-builder-toolbar-dropdown\"\r\n ref={emojiPickerRef}\r\n >\r\n <ToolbarButton\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n title=\"Insert Emoji\"\r\n >\r\n {icons.emoji}\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <div className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n className={`rte-builder-emoji-category-btn ${selectedEmojiCategory === key ? \"active\" : \"\"}`}\r\n onClick={() => setSelectedEmojiCategory(key)}\r\n title={(category as any).label}\r\n >\r\n {(category as any).emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {(\r\n EMOJI_CATEGORIES[\r\n selectedEmojiCategory as keyof typeof EMOJI_CATEGORIES\r\n ] as any\r\n )?.emojis.map((emoji: string, idx: number) => (\r\n <button\r\n key={idx}\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => insertEmoji(emoji)}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // Actions\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n {icons.undo}\r\n </ToolbarButton>\r\n );\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n {icons.redo}\r\n </ToolbarButton>\r\n );\r\n case \"fullscreen\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n active={isFullscreen}\r\n onClick={onToggleFullscreen || (() => {})}\r\n title=\"Toggle Fullscreen\"\r\n >\r\n {icons.fullscreen}\r\n </ToolbarButton>\r\n );\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={onPrint || (() => {})}\r\n title=\"Print\"\r\n >\r\n {icons.print}\r\n </ToolbarButton>\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"rte-builder-toolbar lexical-toolbar\">\r\n {buttons.map((button, index) => renderButton(button, index))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default LexicalToolbar;\r\n","/**\r\n * Lexical Editor Component\r\n *\r\n * This is the actual Lexical editor implementation that conforms\r\n * to the adapter interface.\r\n */\r\n\r\nimport React, {\r\n useEffect,\r\n useImperativeHandle,\r\n forwardRef,\r\n useCallback,\r\n useState,\r\n useRef,\r\n} from 'react'\r\n\r\n// Lexical core\r\nimport { LexicalComposer } from '@lexical/react/LexicalComposer'\r\nimport { ContentEditable } from '@lexical/react/LexicalContentEditable'\r\nimport { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'\r\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'\r\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'\r\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\r\nimport { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'\r\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin'\r\nimport { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'\r\nimport { TablePlugin } from '@lexical/react/LexicalTablePlugin'\r\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin'\r\n\r\n// Lexical nodes\r\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text'\r\nimport { ListNode, ListItemNode } from '@lexical/list'\r\nimport { LinkNode, AutoLinkNode } from '@lexical/link'\r\nimport { CodeNode, CodeHighlightNode } from '@lexical/code'\r\nimport { TableNode, TableCellNode, TableRowNode } from '@lexical/table'\r\nimport { HorizontalRuleNode } from '@lexical/react/LexicalHorizontalRuleNode'\r\n\r\n// Lexical utilities\r\nimport {\r\n $getRoot,\r\n $getSelection,\r\n $isRangeSelection,\r\n $createParagraphNode,\r\n $createTextNode,\r\n EditorState,\r\n LexicalEditor,\r\n FORMAT_TEXT_COMMAND,\r\n UNDO_COMMAND,\r\n REDO_COMMAND,\r\n CAN_UNDO_COMMAND,\r\n CAN_REDO_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n} from 'lexical'\r\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html'\r\n\r\n// Toolbar\r\nimport { LexicalToolbar } from './LexicalToolbar'\r\n\r\n// Types\r\nimport type { AdapterComponentProps, AdapterEditorRef } from '../../core/types'\r\n\r\n// ============================================================================\r\n// THEME\r\n// ============================================================================\r\n\r\nconst theme = {\r\n ltr: 'ltr',\r\n rtl: 'rtl',\r\n paragraph: 'rte-builder-paragraph',\r\n quote: 'rte-builder-blockquote',\r\n heading: {\r\n h1: 'rte-builder-h1',\r\n h2: 'rte-builder-h2',\r\n h3: 'rte-builder-h3',\r\n h4: 'rte-builder-h4',\r\n h5: 'rte-builder-h5',\r\n h6: 'rte-builder-h6',\r\n },\r\n list: {\r\n nested: {\r\n listitem: 'rte-builder-nested-listitem',\r\n },\r\n ol: 'rte-builder-ol',\r\n ul: 'rte-builder-ul',\r\n listitem: 'rte-builder-listitem',\r\n listitemChecked: 'rte-builder-listitem-checked',\r\n listitemUnchecked: 'rte-builder-listitem-unchecked',\r\n },\r\n hashtag: 'rte-builder-hashtag',\r\n image: 'rte-builder-image',\r\n link: 'rte-builder-link',\r\n text: {\r\n bold: 'rte-builder-bold',\r\n code: 'rte-builder-code',\r\n italic: 'rte-builder-italic',\r\n strikethrough: 'rte-builder-strikethrough',\r\n subscript: 'rte-builder-subscript',\r\n superscript: 'rte-builder-superscript',\r\n underline: 'rte-builder-underline',\r\n underlineStrikethrough: 'rte-builder-underline-strikethrough',\r\n },\r\n code: 'rte-builder-code-block',\r\n codeHighlight: {\r\n atrule: 'rte-builder-code-atrule',\r\n attr: 'rte-builder-code-attr',\r\n boolean: 'rte-builder-code-boolean',\r\n builtin: 'rte-builder-code-builtin',\r\n cdata: 'rte-builder-code-cdata',\r\n char: 'rte-builder-code-char',\r\n class: 'rte-builder-code-class',\r\n 'class-name': 'rte-builder-code-class-name',\r\n comment: 'rte-builder-code-comment',\r\n constant: 'rte-builder-code-constant',\r\n deleted: 'rte-builder-code-deleted',\r\n doctype: 'rte-builder-code-doctype',\r\n entity: 'rte-builder-code-entity',\r\n function: 'rte-builder-code-function',\r\n important: 'rte-builder-code-important',\r\n inserted: 'rte-builder-code-inserted',\r\n keyword: 'rte-builder-code-keyword',\r\n namespace: 'rte-builder-code-namespace',\r\n number: 'rte-builder-code-number',\r\n operator: 'rte-builder-code-operator',\r\n prolog: 'rte-builder-code-prolog',\r\n property: 'rte-builder-code-property',\r\n punctuation: 'rte-builder-code-punctuation',\r\n regex: 'rte-builder-code-regex',\r\n selector: 'rte-builder-code-selector',\r\n string: 'rte-builder-code-string',\r\n symbol: 'rte-builder-code-symbol',\r\n tag: 'rte-builder-code-tag',\r\n url: 'rte-builder-code-url',\r\n variable: 'rte-builder-code-variable',\r\n },\r\n table: 'rte-builder-table',\r\n tableCell: 'rte-builder-table-cell',\r\n tableCellHeader: 'rte-builder-table-cell-header',\r\n tableRow: 'rte-builder-table-row',\r\n}\r\n\r\n// ============================================================================\r\n// ERROR HANDLING\r\n// ============================================================================\r\n\r\nfunction onError(error: Error): void {\r\n console.error('Lexical Error:', error)\r\n}\r\n\r\n// ============================================================================\r\n// EDITOR INNER COMPONENT\r\n// ============================================================================\r\n\r\ninterface EditorInnerProps {\r\n value: string\r\n onChange?: (content: string) => void\r\n onBlur?: () => void\r\n onFocus?: () => void\r\n placeholder: string\r\n height: number\r\n minHeight: number\r\n maxHeight?: number\r\n disabled: boolean\r\n readOnly: boolean\r\n charCounterMax: number\r\n showCharCounter: boolean\r\n toolbarButtons?: string[]\r\n onMediaPickerImage?: () => Promise<void>\r\n onMediaPickerVideo?: () => Promise<void>\r\n editorRef: React.Ref<AdapterEditorRef>\r\n isFullscreen: boolean\r\n onToggleFullscreen: () => void\r\n}\r\n\r\nconst EditorInner: React.FC<EditorInnerProps> = ({\r\n value,\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder,\r\n height,\r\n minHeight,\r\n maxHeight,\r\n disabled,\r\n readOnly,\r\n charCounterMax,\r\n showCharCounter,\r\n toolbarButtons,\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n editorRef,\r\n isFullscreen,\r\n onToggleFullscreen,\r\n}) => {\r\n const [editor] = useLexicalComposerContext()\r\n const [characterCount, setCharacterCount] = useState(0)\r\n const [canUndo, setCanUndo] = useState(false)\r\n const [canRedo, setCanRedo] = useState(false)\r\n const initialLoadRef = useRef(true)\r\n\r\n // Load initial value\r\n useEffect(() => {\r\n if (value && initialLoadRef.current) {\r\n initialLoadRef.current = false\r\n editor.update(() => {\r\n const parser = new DOMParser()\r\n const dom = parser.parseFromString(value, 'text/html')\r\n const nodes = $generateNodesFromDOM(editor, dom)\r\n const root = $getRoot()\r\n root.clear()\r\n root.append(...nodes)\r\n })\r\n }\r\n }, [value, editor])\r\n\r\n // Update editable state\r\n useEffect(() => {\r\n editor.setEditable(!disabled && !readOnly)\r\n }, [disabled, readOnly, editor])\r\n\r\n // Track can undo/redo\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n CAN_UNDO_COMMAND,\r\n (payload) => {\r\n setCanUndo(payload)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n }, [editor])\r\n\r\n useEffect(() => {\r\n return editor.registerCommand(\r\n CAN_REDO_COMMAND,\r\n (payload) => {\r\n setCanRedo(payload)\r\n return false\r\n },\r\n COMMAND_PRIORITY_CRITICAL\r\n )\r\n }, [editor])\r\n\r\n // Handle change\r\n const handleChange = useCallback(\r\n (editorState: EditorState) => {\r\n editorState.read(() => {\r\n const root = $getRoot()\r\n const text = root.getTextContent()\r\n setCharacterCount(text.length)\r\n\r\n if (onChange) {\r\n const html = $generateHtmlFromNodes(editor, null)\r\n onChange(html)\r\n }\r\n })\r\n },\r\n [onChange, editor]\r\n )\r\n\r\n // Print function\r\n const handlePrint = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n const html = $generateHtmlFromNodes(editor, null)\r\n const printWindow = window.open('', '_blank')\r\n if (printWindow) {\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>Print</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; padding: 20px; }\r\n img { max-width: 100%; }\r\n </style>\r\n </head>\r\n <body>${html}</body>\r\n </html>\r\n `)\r\n printWindow.document.close()\r\n printWindow.print()\r\n }\r\n })\r\n }, [editor])\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(editorRef, () => ({\r\n getContent: () => {\r\n let html = ''\r\n editor.getEditorState().read(() => {\r\n html = $generateHtmlFromNodes(editor, null)\r\n })\r\n return html\r\n },\r\n getText: () => {\r\n let text = ''\r\n editor.getEditorState().read(() => {\r\n text = $getRoot().getTextContent()\r\n })\r\n return text\r\n },\r\n getJSON: () => {\r\n return editor.getEditorState().toJSON()\r\n },\r\n setContent: (html: string) => {\r\n editor.update(() => {\r\n const parser = new DOMParser()\r\n const dom = parser.parseFromString(html, 'text/html')\r\n const nodes = $generateNodesFromDOM(editor, dom)\r\n const root = $getRoot()\r\n root.clear()\r\n root.append(...nodes)\r\n })\r\n },\r\n focus: () => {\r\n editor.focus()\r\n },\r\n blur: () => {\r\n editor.blur()\r\n },\r\n insertHTML: (html: string) => {\r\n editor.update(() => {\r\n const parser = new DOMParser()\r\n const dom = parser.parseFromString(html, 'text/html')\r\n const nodes = $generateNodesFromDOM(editor, dom)\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n selection.insertNodes(nodes)\r\n }\r\n })\r\n },\r\n insertText: (text: string) => {\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if ($isRangeSelection(selection)) {\r\n selection.insertText(text)\r\n }\r\n })\r\n },\r\n clear: () => {\r\n editor.update(() => {\r\n const root = $getRoot()\r\n root.clear()\r\n root.append($createParagraphNode())\r\n })\r\n },\r\n isEmpty: () => {\r\n let isEmpty = true\r\n editor.getEditorState().read(() => {\r\n const text = $getRoot().getTextContent()\r\n isEmpty = text.trim().length === 0\r\n })\r\n return isEmpty\r\n },\r\n getCharacterCount: () => characterCount,\r\n getWordCount: () => {\r\n let wordCount = 0\r\n editor.getEditorState().read(() => {\r\n const text = $getRoot().getTextContent()\r\n wordCount = text.split(/\\s+/).filter(word => word.length > 0).length\r\n })\r\n return wordCount\r\n },\r\n isFullscreen: () => isFullscreen,\r\n toggleFullscreen: onToggleFullscreen,\r\n print: handlePrint,\r\n undo: () => {\r\n editor.dispatchCommand(UNDO_COMMAND, undefined)\r\n },\r\n redo: () => {\r\n editor.dispatchCommand(REDO_COMMAND, undefined)\r\n },\r\n canUndo: () => canUndo,\r\n canRedo: () => canRedo,\r\n getNativeEditor: () => editor,\r\n }))\r\n\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null\r\n\r\n return (\r\n <>\r\n <LexicalToolbar\r\n editor={editor}\r\n buttons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage}\r\n onMediaPickerVideo={onMediaPickerVideo}\r\n onToggleFullscreen={onToggleFullscreen}\r\n onPrint={handlePrint}\r\n isFullscreen={isFullscreen}\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{\r\n height: `${height}px`,\r\n minHeight: `${minHeight}px`,\r\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable\r\n className=\"rte-builder-content\"\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n />\r\n }\r\n placeholder={<div className=\"rte-builder-placeholder\">{placeholder}</div>}\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n <OnChangePlugin onChange={handleChange} />\r\n <HistoryPlugin />\r\n <ListPlugin />\r\n <LinkPlugin />\r\n <TablePlugin />\r\n <CheckListPlugin />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\"> (limit exceeded)</span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\ninterface LexicalEditorComponentProps extends AdapterComponentProps {}\r\n\r\nexport const LexicalEditorComponent = forwardRef<AdapterEditorRef, LexicalEditorComponentProps>(\r\n (\r\n {\r\n value = '',\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = 'Start typing...',\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarButtons,\r\n className = '',\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = 'javascript',\r\n editorConfig = {},\r\n },\r\n ref\r\n ) => {\r\n const [isFullscreen, setIsFullscreen] = useState(false)\r\n\r\n const handleToggleFullscreen = useCallback(() => {\r\n setIsFullscreen(prev => !prev)\r\n }, [])\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage) {\r\n await onMediaPickerImage()\r\n }\r\n }, [onMediaPickerImage])\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo) {\r\n await onMediaPickerVideo()\r\n }\r\n }, [onMediaPickerVideo])\r\n\r\n const initialConfig = {\r\n namespace: 'RTEBuilder',\r\n theme,\r\n onError,\r\n nodes: [\r\n HeadingNode,\r\n QuoteNode,\r\n ListNode,\r\n ListItemNode,\r\n LinkNode,\r\n AutoLinkNode,\r\n CodeNode,\r\n CodeHighlightNode,\r\n TableNode,\r\n TableCellNode,\r\n TableRowNode,\r\n HorizontalRuleNode,\r\n ],\r\n editable: !disabled && !readOnly,\r\n ...editorConfig,\r\n }\r\n\r\n return (\r\n <div\r\n className={`rte-builder-wrapper lexical-editor ${disabled ? 'disabled' : ''} ${readOnly ? 'readonly' : ''} ${isFullscreen ? 'fullscreen' : ''} ${className}`}\r\n >\r\n <LexicalComposer initialConfig={initialConfig}>\r\n <EditorInner\r\n value={value}\r\n onChange={onChange}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n placeholder={placeholder}\r\n height={height}\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n charCounterMax={charCounterMax}\r\n showCharCounter={showCharCounter}\r\n toolbarButtons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage ? handleMediaPickerImage : undefined}\r\n onMediaPickerVideo={onMediaPickerVideo ? handleMediaPickerVideo : undefined}\r\n editorRef={ref}\r\n isFullscreen={isFullscreen}\r\n onToggleFullscreen={handleToggleFullscreen}\r\n />\r\n </LexicalComposer>\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nLexicalEditorComponent.displayName = 'LexicalEditorComponent'\r\n\r\nexport default LexicalEditorComponent\r\n","/**\r\n * RTE Builder - Universal Rich Text Editor Library\r\n *\r\n * A generic, adapter-based rich text editor that supports multiple editor backends:\r\n * - TipTap (default, included)\r\n * - Slate.js (included)\r\n * - Lexical (included)\r\n * - Quill (planned)\r\n * - Draft.js (planned)\r\n *\r\n * @example Basic Usage\r\n * ```tsx\r\n * import { RichTextEditor } from 'rte-builder'\r\n *\r\n * function App() {\r\n * const [content, setContent] = useState('')\r\n * return <RichTextEditor value={content} onChange={setContent} />\r\n * }\r\n * ```\r\n *\r\n * @example With Specific Editor\r\n * ```tsx\r\n * <RichTextEditor editor=\"tiptap\" value={content} onChange={setContent} />\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT EXPORTS\r\n// ============================================================================\r\n\r\n// The unified editor (recommended for most use cases)\r\nexport { UnifiedEditor } from \"./components/UnifiedEditor\";\r\n\r\n// Legacy TipTap-specific editor (for backwards compatibility)\r\nexport { RichTextEditor } from \"./components/RichTextEditor\";\r\n\r\n// ============================================================================\r\n// TYPE EXPORTS\r\n// ============================================================================\r\n\r\n// Legacy types (backwards compatibility)\r\nexport type {\r\n EditorProps,\r\n EditorRef,\r\n MediaFile as LegacyMediaFile,\r\n ToolbarButton,\r\n ToolbarConfig as LegacyToolbarConfig,\r\n} from \"./types\";\r\n\r\n// Core types (new unified interface)\r\nexport type {\r\n EditorType,\r\n BaseEditorConfig,\r\n MediaFile,\r\n ToolbarButtonType,\r\n ToolbarPreset,\r\n ToolbarConfig,\r\n UnifiedEditorProps,\r\n UnifiedEditorRef,\r\n EditorAdapter,\r\n AdapterComponentProps,\r\n AdapterEditorRef,\r\n EditorFeatures,\r\n} from \"./core/types\";\r\n\r\nexport { DEFAULT_FEATURES } from \"./core/types\";\r\n\r\n// ============================================================================\r\n// REGISTRY EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n registerAdapter,\r\n unregisterAdapter,\r\n getAdapter,\r\n getAllAdapters,\r\n getAvailableAdapters,\r\n isEditorAvailable,\r\n getBestAvailableEditor,\r\n getDefaultEditorType,\r\n getEditorFeatures,\r\n compareEditorFeatures,\r\n getRegistryStats,\r\n EditorRegistry,\r\n} from \"./core/registry\";\r\n\r\n// ============================================================================\r\n// TOOLBAR PRESET EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n fullToolbar,\r\n mediumToolbar,\r\n simpleToolbar,\r\n minimalToolbar,\r\n codeToolbar,\r\n blogToolbar,\r\n emailToolbar,\r\n toolbarPresets,\r\n getToolbarPreset,\r\n customizeToolbar,\r\n} from \"./core/presets\";\r\n\r\nexport type { ToolbarPresetName } from \"./core/presets\";\r\n\r\n// ============================================================================\r\n// ADAPTER EXPORTS\r\n// ============================================================================\r\n\r\n// TipTap adapter (included by default)\r\nexport { TipTapAdapter } from \"./adapters/tiptap\";\r\nexport { TipTapEditorComponent } from \"./adapters/tiptap/TipTapEditorComponent\";\r\nexport { TipTapToolbar } from \"./adapters/tiptap/TipTapToolbar\";\r\n\r\n// Note: Slate.js and Lexical adapters are available but require additional\r\n// dependencies to be installed. They are not exported by default to avoid\r\n// bundling issues. Import them directly from their paths if needed:\r\n// import { SlateAdapter } from 'rte-builder/adapters/slate/SlateAdapter'\r\n// import { LexicalAdapter } from 'rte-builder/adapters/lexical/LexicalAdapter'\r\n\r\n// ============================================================================\r\n// EXTENSION EXPORTS\r\n// ============================================================================\r\n\r\n// Custom TipTap extensions (can be used independently)\r\nexport { FontSize } from \"./extensions/FontSize\";\r\nexport { LineHeight } from \"./extensions/LineHeight\";\r\nexport { Video } from \"./extensions/Video\";\r\nexport { Emoji, EMOJI_CATEGORIES } from \"./extensions/Emoji\";\r\nexport { Fullscreen } from \"./extensions/Fullscreen\";\r\nexport { Print } from \"./extensions/Print\";\r\nexport { Indent } from \"./extensions/Indent\";\r\n\r\n// ============================================================================\r\n// COLLABORATION EXPORTS (v2.0)\r\n// ============================================================================\r\n\r\nexport {\r\n CollaborationProvider,\r\n useCollaboration,\r\n useCollaborationOptional,\r\n} from \"./collaboration\";\r\n\r\nexport type {\r\n CollaborationUser,\r\n CollaborationConfig,\r\n CollaborationState,\r\n CollaborationStatus,\r\n CollaborationEvent,\r\n CollaborationProps,\r\n CursorPosition,\r\n} from \"./collaboration\";\r\n\r\nexport { PresenceIndicator } from \"./collaboration/PresenceIndicator\";\r\n\r\n// ============================================================================\r\n// COMMENTS EXPORTS (v2.1)\r\n// ============================================================================\r\n\r\nexport {\r\n CommentsProvider,\r\n useComments,\r\n useCommentsOptional,\r\n DEFAULT_REACTION_EMOJIS,\r\n} from \"./comments\";\r\n\r\nexport type {\r\n Comment,\r\n CommentThread,\r\n CommentAuthor,\r\n CommentRange,\r\n CommentsConfig,\r\n CommentsState,\r\n CommentEvent,\r\n CommentsProps,\r\n} from \"./comments\";\r\n\r\nexport { CommentsPanel } from \"./comments/CommentsPanel\";\r\n\r\n// ============================================================================\r\n// VERSION HISTORY EXPORTS (v2.2)\r\n// ============================================================================\r\n\r\nexport {\r\n VersionHistoryProvider,\r\n useVersionHistory,\r\n useVersionHistoryOptional,\r\n} from \"./history\";\r\n\r\nexport type {\r\n Version,\r\n VersionAuthor,\r\n VersionHistoryConfig,\r\n VersionHistoryState,\r\n VersionHistoryEvent,\r\n VersionHistoryProps,\r\n VersionComparison,\r\n VersionChange,\r\n} from \"./history\";\r\n\r\nexport { VersionHistoryPanel } from \"./history/VersionHistoryPanel\";\r\n\r\n// ============================================================================\r\n// STYLES\r\n// ============================================================================\r\n\r\n// Import styles (they will be bundled with the library)\r\nimport \"./styles/editor.css\";\r\nimport \"./styles/collaboration.css\";\r\nimport \"./styles/comments.css\";\r\nimport \"./styles/version-history.css\";\r\n","/**\r\n * Unified Rich Text Editor Component\r\n *\r\n * This is the main entry point for the rte-builder library.\r\n * It provides a unified interface that works with any registered editor adapter.\r\n */\r\n\r\nimport { forwardRef, useImperativeHandle, useRef, useMemo, useState } from \"react\";\r\nimport type {\r\n UnifiedEditorProps,\r\n UnifiedEditorRef,\r\n EditorType,\r\n ToolbarButtonType,\r\n AdapterEditorRef,\r\n} from \"../core/types\";\r\nimport {\r\n getAdapter,\r\n getBestAvailableEditor,\r\n getAvailableAdapters,\r\n registerAdapter,\r\n} from \"../core/registry\";\r\nimport { getToolbarPreset, toolbarPresets } from \"../core/presets\";\r\n\r\n// Import and register all adapters\r\nimport { TipTapAdapter } from \"../adapters/tiptap\";\r\nimport { SlateAdapter } from \"../adapters/slate/SlateAdapter\";\r\nimport { LexicalAdapter } from \"../adapters/lexical/LexicalAdapter\";\r\n\r\n// Register adapters on module load (only if available)\r\nregisterAdapter(TipTapAdapter);\r\nif (SlateAdapter.isAvailable()) {\r\n registerAdapter(SlateAdapter);\r\n}\r\nif (LexicalAdapter.isAvailable()) {\r\n registerAdapter(LexicalAdapter);\r\n}\r\n\r\nexport const UnifiedEditor = forwardRef<UnifiedEditorRef, UnifiedEditorProps>(\r\n (\r\n {\r\n editor: editorType,\r\n showEditorSwitcher = false,\r\n onEditorChange,\r\n value = \"\",\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = \"Start typing...\",\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbar = \"full\",\r\n toolbarButtons: customToolbarButtons,\r\n className = \"\",\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = \"javascript\",\r\n editorConfig,\r\n },\r\n ref,\r\n ) => {\r\n const adapterRef = useRef<AdapterEditorRef>(null);\r\n const [internalEditorType, setInternalEditorType] = useState<EditorType | undefined>(editorType);\r\n\r\n // Get available adapters for the switcher\r\n const availableAdapters = useMemo(() => getAvailableAdapters(), []);\r\n\r\n // Determine which editor to use (controlled or internal state)\r\n const currentEditorType = editorType !== undefined ? editorType : internalEditorType;\r\n\r\n // Determine which editor to use\r\n const selectedAdapter = useMemo(() => {\r\n if (currentEditorType) {\r\n const adapter = getAdapter(currentEditorType);\r\n if (adapter?.isAvailable()) {\r\n return adapter;\r\n }\r\n console.warn(\r\n `Editor \"${currentEditorType}\" is not available. Falling back to best available.`,\r\n );\r\n }\r\n return getBestAvailableEditor();\r\n }, [currentEditorType]);\r\n\r\n // Handle editor switch\r\n const handleEditorSwitch = (newEditorType: EditorType) => {\r\n if (onEditorChange) {\r\n onEditorChange(newEditorType);\r\n } else {\r\n setInternalEditorType(newEditorType);\r\n }\r\n };\r\n\r\n // Determine toolbar buttons\r\n const toolbarButtons = useMemo((): ToolbarButtonType[] => {\r\n if (customToolbarButtons) {\r\n return customToolbarButtons;\r\n }\r\n\r\n if (typeof toolbar === \"string\") {\r\n return getToolbarPreset(toolbar as keyof typeof toolbarPresets);\r\n }\r\n\r\n if (toolbar.buttons) {\r\n return toolbar.buttons;\r\n }\r\n\r\n if (toolbar.preset) {\r\n return getToolbarPreset(toolbar.preset as keyof typeof toolbarPresets);\r\n }\r\n\r\n return getToolbarPreset(\"full\");\r\n }, [toolbar, customToolbarButtons]);\r\n\r\n // Expose unified methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => adapterRef.current?.getContent() || \"\",\r\n getText: () => adapterRef.current?.getText() || \"\",\r\n getJSON: () => adapterRef.current?.getJSON(),\r\n setContent: (content: string) => adapterRef.current?.setContent(content),\r\n focus: () => adapterRef.current?.focus(),\r\n blur: () => adapterRef.current?.blur(),\r\n insertHTML: (html: string) => adapterRef.current?.insertHTML(html),\r\n insertText: (text: string) => adapterRef.current?.insertText(text),\r\n clear: () => adapterRef.current?.clear(),\r\n isEmpty: () => adapterRef.current?.isEmpty() ?? true,\r\n getCharacterCount: () => adapterRef.current?.getCharacterCount() || 0,\r\n getWordCount: () => adapterRef.current?.getWordCount() || 0,\r\n isFullscreen: () => adapterRef.current?.isFullscreen() || false,\r\n toggleFullscreen: () => adapterRef.current?.toggleFullscreen(),\r\n print: () => adapterRef.current?.print(),\r\n undo: () => adapterRef.current?.undo(),\r\n redo: () => adapterRef.current?.redo(),\r\n canUndo: () => adapterRef.current?.canUndo() ?? false,\r\n canRedo: () => adapterRef.current?.canRedo() ?? false,\r\n getNativeEditor: () => adapterRef.current?.getNativeEditor(),\r\n getEditorType: () => selectedAdapter?.type || (\"tiptap\" as EditorType),\r\n }));\r\n\r\n // Handle case where no editor is available\r\n if (!selectedAdapter) {\r\n return (\r\n <div className={`rte-builder-wrapper rte-builder-error ${className}`}>\r\n <div className=\"rte-builder-error-message\">\r\n No editor available. Please install an editor package:\r\n <br />\r\n <code>npm install @tiptap/react @tiptap/starter-kit</code>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Get the editor component from the adapter\r\n const EditorComponent = selectedAdapter.getComponent();\r\n\r\n // Handle onChange to ensure it's always called\r\n const handleChange = (content: string) => {\r\n onChange?.(content);\r\n };\r\n\r\n return (\r\n <div className={`rte-builder-unified-wrapper ${className}`}>\r\n {showEditorSwitcher && availableAdapters.length > 1 && (\r\n <div className=\"rte-builder-editor-switcher\">\r\n <label className=\"rte-builder-editor-switcher-label\">Editor:</label>\r\n <select\r\n className=\"rte-builder-editor-switcher-select\"\r\n value={selectedAdapter.type}\r\n onChange={(e) => handleEditorSwitch(e.target.value as EditorType)}\r\n disabled={disabled}\r\n >\r\n {availableAdapters.map((adapter) => (\r\n <option key={adapter.type} value={adapter.type}>\r\n {adapter.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n <EditorComponent\r\n key={selectedAdapter.type}\r\n editorRef={adapterRef}\r\n value={value}\r\n onChange={handleChange}\r\n onBlur={onBlur}\r\n onFocus={onFocus}\r\n placeholder={placeholder}\r\n height={height}\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n charCounterMax={charCounterMax}\r\n showCharCounter={showCharCounter}\r\n toolbarButtons={toolbarButtons}\r\n onMediaPickerImage={onMediaPickerImage}\r\n onMediaPickerVideo={onMediaPickerVideo}\r\n enableCodeHighlight={enableCodeHighlight}\r\n defaultCodeLanguage={defaultCodeLanguage}\r\n editorConfig={editorConfig}\r\n />\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nUnifiedEditor.displayName = \"UnifiedEditor\";\r\n\r\nexport default UnifiedEditor;\r\n","/**\r\n * Editor Registry - Manages available editor adapters\r\n *\r\n * This module provides a central registry for editor adapters.\r\n * It allows dynamic registration of editors and automatic selection\r\n * based on availability.\r\n */\r\n\r\nimport type { EditorAdapter, EditorType, EditorFeatures } from './types'\r\n\r\n// Registry to store all registered adapters\r\nconst adapters = new Map<EditorType, EditorAdapter>()\r\n\r\n// Default editor preference order\r\nconst defaultPreferenceOrder: EditorType[] = ['tiptap', 'slate', 'lexical', 'quill', 'draft']\r\n\r\n/**\r\n * Register an editor adapter\r\n * @param adapter The adapter to register\r\n */\r\nexport function registerAdapter(adapter: EditorAdapter): void {\r\n adapters.set(adapter.type, adapter)\r\n}\r\n\r\n/**\r\n * Unregister an editor adapter\r\n * @param type The editor type to unregister\r\n */\r\nexport function unregisterAdapter(type: EditorType): void {\r\n adapters.delete(type)\r\n}\r\n\r\n/**\r\n * Get an adapter by type\r\n * @param type The editor type\r\n * @returns The adapter or undefined\r\n */\r\nexport function getAdapter(type: EditorType): EditorAdapter | undefined {\r\n return adapters.get(type)\r\n}\r\n\r\n/**\r\n * Get all registered adapters\r\n * @returns Array of all registered adapters\r\n */\r\nexport function getAllAdapters(): EditorAdapter[] {\r\n return Array.from(adapters.values())\r\n}\r\n\r\n/**\r\n * Get all available adapters (ones with dependencies installed)\r\n * @returns Array of available adapters\r\n */\r\nexport function getAvailableAdapters(): EditorAdapter[] {\r\n return getAllAdapters().filter(adapter => adapter.isAvailable())\r\n}\r\n\r\n/**\r\n * Check if an editor type is available\r\n * @param type The editor type to check\r\n * @returns Whether the editor is available\r\n */\r\nexport function isEditorAvailable(type: EditorType): boolean {\r\n const adapter = adapters.get(type)\r\n return adapter?.isAvailable() ?? false\r\n}\r\n\r\n/**\r\n * Get the best available editor based on preference order\r\n * @param preferenceOrder Custom preference order (optional)\r\n * @returns The best available adapter or undefined\r\n */\r\nexport function getBestAvailableEditor(\r\n preferenceOrder: EditorType[] = defaultPreferenceOrder\r\n): EditorAdapter | undefined {\r\n for (const type of preferenceOrder) {\r\n const adapter = adapters.get(type)\r\n if (adapter?.isAvailable()) {\r\n return adapter\r\n }\r\n }\r\n\r\n // Fallback: return any available adapter\r\n return getAvailableAdapters()[0]\r\n}\r\n\r\n/**\r\n * Get the default editor (first available in preference order)\r\n * @returns The default editor type or undefined\r\n */\r\nexport function getDefaultEditorType(): EditorType | undefined {\r\n const adapter = getBestAvailableEditor()\r\n return adapter?.type\r\n}\r\n\r\n/**\r\n * Get features supported by an editor\r\n * @param type The editor type\r\n * @returns The features object or undefined\r\n */\r\nexport function getEditorFeatures(type: EditorType): EditorFeatures | undefined {\r\n const adapter = adapters.get(type)\r\n return adapter?.getSupportedFeatures()\r\n}\r\n\r\n/**\r\n * Compare features between two editors\r\n * @param type1 First editor type\r\n * @param type2 Second editor type\r\n * @returns Object with features and their support status\r\n */\r\nexport function compareEditorFeatures(\r\n type1: EditorType,\r\n type2: EditorType\r\n): Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> | undefined {\r\n const features1 = getEditorFeatures(type1)\r\n const features2 = getEditorFeatures(type2)\r\n\r\n if (!features1 || !features2) return undefined\r\n\r\n const result: Record<keyof EditorFeatures, { [key in EditorType]?: boolean }> = {} as any\r\n\r\n for (const key of Object.keys(features1) as (keyof EditorFeatures)[]) {\r\n result[key] = {\r\n [type1]: features1[key],\r\n [type2]: features2[key],\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * Get registry statistics\r\n * @returns Statistics about registered adapters\r\n */\r\nexport function getRegistryStats(): {\r\n total: number\r\n available: number\r\n unavailable: number\r\n editors: { type: EditorType; available: boolean; name: string }[]\r\n} {\r\n const allAdapters = getAllAdapters()\r\n const availableAdapters = getAvailableAdapters()\r\n\r\n return {\r\n total: allAdapters.length,\r\n available: availableAdapters.length,\r\n unavailable: allAdapters.length - availableAdapters.length,\r\n editors: allAdapters.map(adapter => ({\r\n type: adapter.type,\r\n available: adapter.isAvailable(),\r\n name: adapter.name,\r\n })),\r\n }\r\n}\r\n\r\n// Export the registry for advanced use cases\r\nexport const EditorRegistry = {\r\n register: registerAdapter,\r\n unregister: unregisterAdapter,\r\n get: getAdapter,\r\n getAll: getAllAdapters,\r\n getAvailable: getAvailableAdapters,\r\n isAvailable: isEditorAvailable,\r\n getBest: getBestAvailableEditor,\r\n getDefault: getDefaultEditorType,\r\n getFeatures: getEditorFeatures,\r\n compareFeatures: compareEditorFeatures,\r\n getStats: getRegistryStats,\r\n}\r\n\r\nexport default EditorRegistry\r\n","/**\r\n * Toolbar Presets - Predefined toolbar configurations\r\n */\r\n\r\nimport type { ToolbarButtonType } from './types'\r\n\r\n/** Full toolbar with all features */\r\nexport const fullToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'code',\r\n 'separator',\r\n 'subscript',\r\n 'superscript',\r\n 'clearFormatting',\r\n 'separator',\r\n 'fontFamily',\r\n 'fontSize',\r\n 'lineHeight',\r\n 'textColor',\r\n 'backgroundColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'alignJustify',\r\n 'separator',\r\n 'indent',\r\n 'outdent',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'heading4',\r\n 'heading5',\r\n 'heading6',\r\n 'blockquote',\r\n 'separator',\r\n 'link',\r\n 'unlink',\r\n 'image',\r\n 'video',\r\n 'table',\r\n 'emoji',\r\n 'separator',\r\n 'codeBlock',\r\n 'horizontalRule',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n 'separator',\r\n 'fullscreen',\r\n 'print',\r\n]\r\n\r\n/** Medium toolbar for standard editing */\r\nexport const mediumToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'separator',\r\n 'fontFamily',\r\n 'fontSize',\r\n 'textColor',\r\n 'backgroundColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'table',\r\n 'emoji',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n 'fullscreen',\r\n]\r\n\r\n/** Simple toolbar for basic editing */\r\nexport const simpleToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** Minimal toolbar for comments/notes */\r\nexport const minimalToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'separator',\r\n 'link',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** Code-focused toolbar for technical documentation */\r\nexport const codeToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'code',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'separator',\r\n 'codeBlock',\r\n 'blockquote',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** Blog/Article toolbar */\r\nexport const blogToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'separator',\r\n 'fontSize',\r\n 'textColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'heading1',\r\n 'heading2',\r\n 'heading3',\r\n 'blockquote',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'video',\r\n 'separator',\r\n 'horizontalRule',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n 'fullscreen',\r\n]\r\n\r\n/** Email composition toolbar */\r\nexport const emailToolbar: ToolbarButtonType[] = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'separator',\r\n 'fontFamily',\r\n 'fontSize',\r\n 'textColor',\r\n 'separator',\r\n 'alignLeft',\r\n 'alignCenter',\r\n 'alignRight',\r\n 'separator',\r\n 'bulletList',\r\n 'orderedList',\r\n 'separator',\r\n 'link',\r\n 'image',\r\n 'separator',\r\n 'undo',\r\n 'redo',\r\n]\r\n\r\n/** All preset configurations */\r\nexport const toolbarPresets = {\r\n full: fullToolbar,\r\n medium: mediumToolbar,\r\n simple: simpleToolbar,\r\n minimal: minimalToolbar,\r\n code: codeToolbar,\r\n blog: blogToolbar,\r\n email: emailToolbar,\r\n} as const\r\n\r\nexport type ToolbarPresetName = keyof typeof toolbarPresets\r\n\r\n/**\r\n * Get a toolbar preset by name\r\n * @param name The preset name\r\n * @returns The toolbar buttons array\r\n */\r\nexport function getToolbarPreset(name: ToolbarPresetName): ToolbarButtonType[] {\r\n return toolbarPresets[name] || toolbarPresets.full\r\n}\r\n\r\n/**\r\n * Create a custom toolbar from a preset with modifications\r\n * @param base Base preset name\r\n * @param options Modification options\r\n * @returns Modified toolbar buttons array\r\n */\r\nexport function customizeToolbar(\r\n base: ToolbarPresetName,\r\n options: {\r\n add?: ToolbarButtonType[]\r\n remove?: ToolbarButtonType[]\r\n insertBefore?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\r\n insertAfter?: { button: ToolbarButtonType; items: ToolbarButtonType[] }\r\n }\r\n): ToolbarButtonType[] {\r\n let toolbar = [...getToolbarPreset(base)]\r\n\r\n // Remove buttons\r\n if (options.remove) {\r\n toolbar = toolbar.filter(btn => !options.remove!.includes(btn))\r\n }\r\n\r\n // Insert before\r\n if (options.insertBefore) {\r\n const index = toolbar.indexOf(options.insertBefore.button)\r\n if (index !== -1) {\r\n toolbar.splice(index, 0, ...options.insertBefore.items)\r\n }\r\n }\r\n\r\n // Insert after\r\n if (options.insertAfter) {\r\n const index = toolbar.indexOf(options.insertAfter.button)\r\n if (index !== -1) {\r\n toolbar.splice(index + 1, 0, ...options.insertAfter.items)\r\n }\r\n }\r\n\r\n // Add at end\r\n if (options.add) {\r\n toolbar.push('separator', ...options.add)\r\n }\r\n\r\n return toolbar\r\n}\r\n\r\nexport default toolbarPresets\r\n","/**\r\n * Core types for the RTE Builder - Editor Agnostic\r\n * These types define the common interface that all editor adapters must implement\r\n */\r\n\r\n// ============================================================================\r\n// EDITOR TYPES\r\n// ============================================================================\r\n\r\n/** Supported editor types */\r\nexport type EditorType = 'tiptap' | 'slate' | 'lexical' | 'quill' | 'draft'\r\n\r\n/** Editor configuration that applies to all editors */\r\nexport interface BaseEditorConfig {\r\n /** Initial HTML content */\r\n initialContent?: string\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Whether the editor is editable */\r\n editable?: boolean\r\n /** Auto-focus on mount */\r\n autoFocus?: boolean\r\n /** Custom attributes for the editor element */\r\n attributes?: Record<string, string>\r\n}\r\n\r\n/** Media file for image/video insertion */\r\nexport interface MediaFile {\r\n /** File URL */\r\n url: string\r\n /** File name */\r\n name?: string\r\n /** File type/MIME type */\r\n type?: string\r\n /** Alt text for images */\r\n alt?: string\r\n /** Title attribute */\r\n title?: string\r\n /** Width */\r\n width?: number\r\n /** Height */\r\n height?: number\r\n}\r\n\r\n// ============================================================================\r\n// TOOLBAR TYPES\r\n// ============================================================================\r\n\r\n/** All available toolbar button types */\r\nexport type ToolbarButtonType =\r\n // Text formatting\r\n | 'bold'\r\n | 'italic'\r\n | 'underline'\r\n | 'strike'\r\n | 'code'\r\n | 'codeBlock'\r\n | 'subscript'\r\n | 'superscript'\r\n | 'clearFormatting'\r\n // Font & Colors\r\n | 'fontFamily'\r\n | 'fontSize'\r\n | 'lineHeight'\r\n | 'textColor'\r\n | 'backgroundColor'\r\n // Alignment & Indentation\r\n | 'alignLeft'\r\n | 'alignCenter'\r\n | 'alignRight'\r\n | 'alignJustify'\r\n | 'indent'\r\n | 'outdent'\r\n // Lists\r\n | 'bulletList'\r\n | 'orderedList'\r\n // Headings\r\n | 'heading1'\r\n | 'heading2'\r\n | 'heading3'\r\n | 'heading4'\r\n | 'heading5'\r\n | 'heading6'\r\n // Blocks\r\n | 'blockquote'\r\n | 'horizontalRule'\r\n // Links & Media\r\n | 'link'\r\n | 'unlink'\r\n | 'image'\r\n | 'video'\r\n | 'table'\r\n | 'emoji'\r\n // Actions\r\n | 'undo'\r\n | 'redo'\r\n | 'fullscreen'\r\n | 'print'\r\n // Special\r\n | 'separator'\r\n\r\n/** Toolbar preset names */\r\nexport type ToolbarPreset = 'full' | 'medium' | 'simple' | 'minimal'\r\n\r\n/** Toolbar configuration */\r\nexport interface ToolbarConfig {\r\n /** Preset to use, or custom buttons array */\r\n preset?: ToolbarPreset\r\n /** Custom buttons array (overrides preset) */\r\n buttons?: ToolbarButtonType[]\r\n /** Whether toolbar is sticky */\r\n sticky?: boolean\r\n /** Sticky offset in pixels */\r\n stickyOffset?: number\r\n}\r\n\r\n// ============================================================================\r\n// EDITOR PROPS & REF TYPES\r\n// ============================================================================\r\n\r\n/** Props for the unified RichTextEditor component */\r\nexport interface UnifiedEditorProps {\r\n /** Which editor to use */\r\n editor?: EditorType\r\n /** Show editor switcher dropdown in toolbar */\r\n showEditorSwitcher?: boolean\r\n /** Callback when editor type changes via switcher */\r\n onEditorChange?: (editorType: EditorType) => void\r\n /** Initial content (HTML string) */\r\n value?: string\r\n /** Callback when content changes */\r\n onChange?: (content: string) => void\r\n /** Callback when editor loses focus */\r\n onBlur?: () => void\r\n /** Callback when editor gains focus */\r\n onFocus?: () => void\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Editor height in pixels */\r\n height?: number\r\n /** Minimum height in pixels */\r\n minHeight?: number\r\n /** Maximum height in pixels */\r\n maxHeight?: number\r\n /** Whether the editor is disabled */\r\n disabled?: boolean\r\n /** Whether the editor is read-only */\r\n readOnly?: boolean\r\n /** Character limit (-1 for no limit) */\r\n charCounterMax?: number\r\n /** Show character counter */\r\n showCharCounter?: boolean\r\n /** Toolbar preset or custom config */\r\n toolbar?: ToolbarPreset | ToolbarConfig\r\n /** Custom toolbar buttons (shorthand for toolbar.buttons) */\r\n toolbarButtons?: ToolbarButtonType[]\r\n /** Additional className */\r\n className?: string\r\n /** Callback for custom image picker */\r\n onMediaPickerImage?: () => Promise<MediaFile | null>\r\n /** Callback for custom video picker */\r\n onMediaPickerVideo?: () => Promise<MediaFile | null>\r\n /** Enable syntax highlighting for code blocks */\r\n enableCodeHighlight?: boolean\r\n /** Default language for code blocks */\r\n defaultCodeLanguage?: string\r\n /** Additional editor-specific config */\r\n editorConfig?: Record<string, unknown>\r\n}\r\n\r\n/** Methods exposed via ref */\r\nexport interface UnifiedEditorRef {\r\n /** Get the current HTML content */\r\n getContent: () => string\r\n /** Get content as plain text */\r\n getText: () => string\r\n /** Get content as JSON (if supported) */\r\n getJSON: () => unknown\r\n /** Set the HTML content */\r\n setContent: (content: string) => void\r\n /** Focus the editor */\r\n focus: () => void\r\n /** Blur the editor */\r\n blur: () => void\r\n /** Insert HTML at cursor position */\r\n insertHTML: (html: string) => void\r\n /** Insert text at cursor position */\r\n insertText: (text: string) => void\r\n /** Clear all content */\r\n clear: () => void\r\n /** Check if content is empty */\r\n isEmpty: () => boolean\r\n /** Get character count */\r\n getCharacterCount: () => number\r\n /** Get word count */\r\n getWordCount: () => number\r\n /** Check if editor is in fullscreen mode */\r\n isFullscreen: () => boolean\r\n /** Toggle fullscreen mode */\r\n toggleFullscreen: () => void\r\n /** Print the content */\r\n print: () => void\r\n /** Undo last action */\r\n undo: () => void\r\n /** Redo last undone action */\r\n redo: () => void\r\n /** Check if can undo */\r\n canUndo: () => boolean\r\n /** Check if can redo */\r\n canRedo: () => boolean\r\n /** Get the native editor instance */\r\n getNativeEditor: () => unknown\r\n /** Get the editor type */\r\n getEditorType: () => EditorType\r\n}\r\n\r\n// ============================================================================\r\n// EDITOR ADAPTER INTERFACE\r\n// ============================================================================\r\n\r\n/**\r\n * Abstract interface that all editor adapters must implement.\r\n * This ensures consistency across different editor implementations.\r\n */\r\nexport interface EditorAdapter {\r\n /** The type of editor this adapter handles */\r\n readonly type: EditorType\r\n\r\n /** Human-readable name */\r\n readonly name: string\r\n\r\n /** Description of the editor */\r\n readonly description: string\r\n\r\n /** Whether this adapter is available (dependencies installed) */\r\n isAvailable: () => boolean\r\n\r\n /** Get the React component for this editor */\r\n getComponent: () => React.ComponentType<AdapterComponentProps>\r\n\r\n /** Get supported features */\r\n getSupportedFeatures: () => EditorFeatures\r\n}\r\n\r\n/** Props passed to adapter components */\r\nexport interface AdapterComponentProps {\r\n value: string\r\n onChange: (content: string) => void\r\n onBlur?: () => void\r\n onFocus?: () => void\r\n placeholder?: string\r\n height?: number\r\n minHeight?: number\r\n maxHeight?: number\r\n disabled?: boolean\r\n readOnly?: boolean\r\n charCounterMax?: number\r\n showCharCounter?: boolean\r\n toolbarButtons: ToolbarButtonType[]\r\n className?: string\r\n onMediaPickerImage?: () => Promise<MediaFile | null>\r\n onMediaPickerVideo?: () => Promise<MediaFile | null>\r\n enableCodeHighlight?: boolean\r\n defaultCodeLanguage?: string\r\n editorConfig?: Record<string, unknown>\r\n /** Ref forwarding */\r\n editorRef?: React.Ref<AdapterEditorRef>\r\n}\r\n\r\n/** Ref methods that adapters must expose */\r\nexport interface AdapterEditorRef {\r\n getContent: () => string\r\n getText: () => string\r\n getJSON: () => unknown\r\n setContent: (content: string) => void\r\n focus: () => void\r\n blur: () => void\r\n insertHTML: (html: string) => void\r\n insertText: (text: string) => void\r\n clear: () => void\r\n isEmpty: () => boolean\r\n getCharacterCount: () => number\r\n getWordCount: () => number\r\n isFullscreen: () => boolean\r\n toggleFullscreen: () => void\r\n print: () => void\r\n undo: () => void\r\n redo: () => void\r\n canUndo: () => boolean\r\n canRedo: () => boolean\r\n getNativeEditor: () => unknown\r\n}\r\n\r\n// ============================================================================\r\n// FEATURE FLAGS\r\n// ============================================================================\r\n\r\n/** Features that an editor may or may not support */\r\nexport interface EditorFeatures {\r\n // Text formatting\r\n bold: boolean\r\n italic: boolean\r\n underline: boolean\r\n strikethrough: boolean\r\n subscript: boolean\r\n superscript: boolean\r\n code: boolean\r\n codeBlock: boolean\r\n codeHighlighting: boolean\r\n\r\n // Font styling\r\n fontFamily: boolean\r\n fontSize: boolean\r\n textColor: boolean\r\n backgroundColor: boolean\r\n lineHeight: boolean\r\n\r\n // Alignment & Structure\r\n textAlign: boolean\r\n indent: boolean\r\n headings: boolean\r\n blockquote: boolean\r\n horizontalRule: boolean\r\n\r\n // Lists\r\n bulletList: boolean\r\n orderedList: boolean\r\n nestedLists: boolean\r\n\r\n // Links & Media\r\n links: boolean\r\n images: boolean\r\n videos: boolean\r\n embeds: boolean\r\n\r\n // Tables\r\n tables: boolean\r\n tableResize: boolean\r\n\r\n // Advanced\r\n emoji: boolean\r\n mentions: boolean\r\n hashtags: boolean\r\n markdown: boolean\r\n\r\n // UI\r\n fullscreen: boolean\r\n print: boolean\r\n characterCount: boolean\r\n\r\n // History\r\n undoRedo: boolean\r\n\r\n // Collaboration\r\n collaboration: boolean\r\n comments: boolean\r\n}\r\n\r\n/** Default feature set - all false */\r\nexport const DEFAULT_FEATURES: EditorFeatures = {\r\n bold: false,\r\n italic: false,\r\n underline: false,\r\n strikethrough: false,\r\n subscript: false,\r\n superscript: false,\r\n code: false,\r\n codeBlock: false,\r\n codeHighlighting: false,\r\n fontFamily: false,\r\n fontSize: false,\r\n textColor: false,\r\n backgroundColor: false,\r\n lineHeight: false,\r\n textAlign: false,\r\n indent: false,\r\n headings: false,\r\n blockquote: false,\r\n horizontalRule: false,\r\n bulletList: false,\r\n orderedList: false,\r\n nestedLists: false,\r\n links: false,\r\n images: false,\r\n videos: false,\r\n embeds: false,\r\n tables: false,\r\n tableResize: false,\r\n emoji: false,\r\n mentions: false,\r\n hashtags: false,\r\n markdown: false,\r\n fullscreen: false,\r\n print: false,\r\n characterCount: false,\r\n undoRedo: false,\r\n collaboration: false,\r\n comments: false,\r\n}\r\n","/**\r\n * TipTap Editor Adapter\r\n *\r\n * This adapter wraps the TipTap editor to conform to the unified editor interface.\r\n */\r\n\r\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\r\nimport { DEFAULT_FEATURES } from \"../../core/types\";\r\n\r\n// Check if TipTap is available\r\n// Since TipTap is bundled with rte-builder, it's always available\r\nfunction checkTipTapAvailable(): boolean {\r\n return true;\r\n}\r\n\r\n// TipTap features\r\nconst TIPTAP_FEATURES: EditorFeatures = {\r\n ...DEFAULT_FEATURES,\r\n // Text formatting\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strikethrough: true,\r\n subscript: true,\r\n superscript: true,\r\n code: true,\r\n codeBlock: true,\r\n codeHighlighting: true,\r\n // Font styling\r\n fontFamily: true,\r\n fontSize: true,\r\n textColor: true,\r\n backgroundColor: true,\r\n lineHeight: true,\r\n // Alignment & Structure\r\n textAlign: true,\r\n indent: true,\r\n headings: true,\r\n blockquote: true,\r\n horizontalRule: true,\r\n // Lists\r\n bulletList: true,\r\n orderedList: true,\r\n nestedLists: true,\r\n // Links & Media\r\n links: true,\r\n images: true,\r\n videos: true,\r\n embeds: false,\r\n // Tables\r\n tables: true,\r\n tableResize: true,\r\n // Advanced\r\n emoji: true,\r\n mentions: false, // Can be added with extension\r\n hashtags: false, // Can be added with extension\r\n markdown: false, // Can be added with extension\r\n // UI\r\n fullscreen: true,\r\n print: true,\r\n characterCount: true,\r\n // History\r\n undoRedo: true,\r\n // Collaboration\r\n collaboration: false, // Requires Y.js integration\r\n comments: false,\r\n};\r\n\r\n/**\r\n * TipTap Editor Adapter\r\n */\r\nexport const TipTapAdapter: EditorAdapter = {\r\n type: \"tiptap\",\r\n name: \"TipTap\",\r\n description:\r\n \"A headless, framework-agnostic rich text editor built on ProseMirror. Highly customizable with excellent TypeScript support.\",\r\n\r\n isAvailable: checkTipTapAvailable,\r\n\r\n getComponent: () => {\r\n // Dynamic import to avoid bundling if not used\r\n const { TipTapEditorComponent } = require(\"./TipTapEditorComponent\");\r\n return TipTapEditorComponent;\r\n },\r\n\r\n getSupportedFeatures: () => TIPTAP_FEATURES,\r\n};\r\n\r\nexport default TipTapAdapter;\r\n","/**\r\n * TipTap Adapter Exports\r\n */\r\n\r\nexport { TipTapAdapter, default } from './TipTapAdapter'\r\nexport { TipTapEditorComponent } from './TipTapEditorComponent'\r\nexport { TipTapToolbar } from './TipTapToolbar'\r\n","/**\r\n * Slate.js Editor Adapter\r\n *\r\n * This adapter wraps the Slate.js editor to conform to the unified editor interface.\r\n * Slate is a completely customizable framework for building rich text editors.\r\n */\r\n\r\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\r\nimport { DEFAULT_FEATURES } from \"../../core/types\";\r\n\r\n// Check if Slate is available\r\nfunction checkSlateAvailable(): boolean {\r\n try {\r\n require(\"slate\");\r\n require(\"slate-react\");\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// Slate.js features\r\nconst SLATE_FEATURES: EditorFeatures = {\r\n ...DEFAULT_FEATURES,\r\n // Text formatting\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strikethrough: true,\r\n subscript: true,\r\n superscript: true,\r\n code: true,\r\n codeBlock: true,\r\n codeHighlighting: true,\r\n // Font styling\r\n fontFamily: true,\r\n fontSize: true,\r\n textColor: true,\r\n backgroundColor: true,\r\n lineHeight: true,\r\n // Alignment & Structure\r\n textAlign: true,\r\n indent: true,\r\n headings: true,\r\n blockquote: true,\r\n horizontalRule: true,\r\n // Lists\r\n bulletList: true,\r\n orderedList: true,\r\n nestedLists: true,\r\n // Links & Media\r\n links: true,\r\n images: true,\r\n videos: true,\r\n embeds: true,\r\n // Tables\r\n tables: true,\r\n tableResize: false, // Requires custom implementation\r\n // Advanced\r\n emoji: true,\r\n mentions: true, // Slate has good mention support\r\n hashtags: true,\r\n markdown: true, // Can be added with plugins\r\n // UI\r\n fullscreen: true,\r\n print: true,\r\n characterCount: true,\r\n // History\r\n undoRedo: true,\r\n // Collaboration\r\n collaboration: false, // Can be added with plugins\r\n comments: false,\r\n};\r\n\r\n/**\r\n * Slate.js Editor Adapter\r\n */\r\nexport const SlateAdapter: EditorAdapter = {\r\n type: \"slate\",\r\n name: \"Slate.js\",\r\n description:\r\n \"A completely customizable framework for building rich text editors. Provides full control over rendering and behavior.\",\r\n\r\n isAvailable: checkSlateAvailable,\r\n\r\n getComponent: () => {\r\n // Dynamic import to avoid bundling if not used\r\n const { SlateEditorComponent } = require(\"./SlateEditorComponent\");\r\n return SlateEditorComponent;\r\n },\r\n\r\n getSupportedFeatures: () => SLATE_FEATURES,\r\n};\r\n\r\nexport default SlateAdapter;\r\n","/**\r\n * Lexical Editor Adapter\r\n *\r\n * This adapter wraps Meta's Lexical editor to conform to the unified editor interface.\r\n * Lexical is a modern, extensible text editor framework with excellent performance.\r\n */\r\n\r\nimport type { EditorAdapter, EditorFeatures } from \"../../core/types\";\r\nimport { DEFAULT_FEATURES } from \"../../core/types\";\r\n\r\n// Check if Lexical is available\r\nfunction checkLexicalAvailable(): boolean {\r\n try {\r\n require(\"lexical\");\r\n require(\"@lexical/react/LexicalComposer\");\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// Lexical features\r\nconst LEXICAL_FEATURES: EditorFeatures = {\r\n ...DEFAULT_FEATURES,\r\n // Text formatting\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strikethrough: true,\r\n subscript: true,\r\n superscript: true,\r\n code: true,\r\n codeBlock: true,\r\n codeHighlighting: true,\r\n // Font styling\r\n fontFamily: true,\r\n fontSize: true,\r\n textColor: true,\r\n backgroundColor: true,\r\n lineHeight: false, // Requires custom plugin\r\n // Alignment & Structure\r\n textAlign: true,\r\n indent: true,\r\n headings: true,\r\n blockquote: true,\r\n horizontalRule: true,\r\n // Lists\r\n bulletList: true,\r\n orderedList: true,\r\n nestedLists: true,\r\n // Links & Media\r\n links: true,\r\n images: true,\r\n videos: true,\r\n embeds: true,\r\n // Tables\r\n tables: true,\r\n tableResize: false, // Requires custom implementation\r\n // Advanced\r\n emoji: true,\r\n mentions: true, // Excellent mention support\r\n hashtags: true,\r\n markdown: true, // Native markdown support\r\n // UI\r\n fullscreen: true,\r\n print: true,\r\n characterCount: true,\r\n // History\r\n undoRedo: true,\r\n // Collaboration\r\n collaboration: true, // Built-in Yjs support\r\n comments: false,\r\n};\r\n\r\n/**\r\n * Lexical Editor Adapter\r\n */\r\nexport const LexicalAdapter: EditorAdapter = {\r\n type: \"lexical\",\r\n name: \"Lexical\",\r\n description:\r\n \"Meta's modern, extensible text editor framework with excellent performance and built-in collaboration support.\",\r\n\r\n isAvailable: checkLexicalAvailable,\r\n\r\n getComponent: () => {\r\n // Dynamic import to avoid bundling if not used\r\n const { LexicalEditorComponent } = require(\"./LexicalEditorComponent\");\r\n return LexicalEditorComponent;\r\n },\r\n\r\n getSupportedFeatures: () => LEXICAL_FEATURES,\r\n};\r\n\r\nexport default LexicalAdapter;\r\n","import { useEffect, useImperativeHandle, forwardRef, useCallback } from \"react\";\r\nimport { useEditor, EditorContent } from \"@tiptap/react\";\r\nimport { Document } from \"@tiptap/extension-document\";\r\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\r\nimport { Text } from \"@tiptap/extension-text\";\r\nimport { Bold } from \"@tiptap/extension-bold\";\r\nimport { Italic } from \"@tiptap/extension-italic\";\r\nimport { Underline } from \"@tiptap/extension-underline\";\r\nimport { Strike } from \"@tiptap/extension-strike\";\r\nimport { Code } from \"@tiptap/extension-code\";\r\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\r\nimport { Subscript } from \"@tiptap/extension-subscript\";\r\nimport { Superscript } from \"@tiptap/extension-superscript\";\r\nimport { TextStyle } from \"@tiptap/extension-text-style\";\r\nimport { FontFamily } from \"@tiptap/extension-font-family\";\r\nimport { Color } from \"@tiptap/extension-color\";\r\nimport { Highlight } from \"@tiptap/extension-highlight\";\r\nimport { TextAlign } from \"@tiptap/extension-text-align\";\r\nimport { Heading } from \"@tiptap/extension-heading\";\r\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\r\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\r\nimport { ListItem } from \"@tiptap/extension-list-item\";\r\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\r\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\r\nimport { Link } from \"@tiptap/extension-link\";\r\nimport { Image } from \"@tiptap/extension-image\";\r\nimport { Table } from \"@tiptap/extension-table\";\r\nimport { TableRow } from \"@tiptap/extension-table-row\";\r\nimport { TableCell } from \"@tiptap/extension-table-cell\";\r\nimport { TableHeader } from \"@tiptap/extension-table-header\";\r\nimport { History } from \"@tiptap/extension-history\";\r\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\r\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\r\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\r\nimport { Dropcursor } from \"@tiptap/extension-dropcursor\";\r\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\r\n\r\n// Lowlight for syntax highlighting\r\nimport { common, createLowlight } from \"lowlight\";\r\n\r\n// Custom extensions\r\nimport { FontSize } from \"../extensions/FontSize\";\r\nimport { LineHeight } from \"../extensions/LineHeight\";\r\nimport { Video } from \"../extensions/Video\";\r\nimport { Emoji } from \"../extensions/Emoji\";\r\nimport { Fullscreen } from \"../extensions/Fullscreen\";\r\nimport { Print } from \"../extensions/Print\";\r\nimport { Indent } from \"../extensions/Indent\";\r\n\r\n// Components\r\nimport { Toolbar } from \"./Toolbar\";\r\n\r\n// Types\r\nimport type { EditorProps, EditorRef, ToolbarButton } from \"../types\";\r\n\r\n// Create lowlight instance\r\nconst lowlight = createLowlight(common);\r\n\r\n// Toolbar presets\r\nconst toolbarPresets: Record<\"full\" | \"medium\" | \"simple\", ToolbarButton[]> = {\r\n full: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"code\",\r\n \"separator\",\r\n \"subscript\",\r\n \"superscript\",\r\n \"clearFormatting\",\r\n \"separator\",\r\n \"fontFamily\",\r\n \"fontSize\",\r\n \"lineHeight\",\r\n \"textColor\",\r\n \"backgroundColor\",\r\n \"separator\",\r\n \"alignLeft\",\r\n \"alignCenter\",\r\n \"alignRight\",\r\n \"alignJustify\",\r\n \"separator\",\r\n \"indent\",\r\n \"outdent\",\r\n \"separator\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"separator\",\r\n \"heading1\",\r\n \"heading2\",\r\n \"heading3\",\r\n \"blockquote\",\r\n \"separator\",\r\n \"link\",\r\n \"unlink\",\r\n \"image\",\r\n \"video\",\r\n \"table\",\r\n \"emoji\",\r\n \"separator\",\r\n \"codeBlock\",\r\n \"horizontalRule\",\r\n \"separator\",\r\n \"undo\",\r\n \"redo\",\r\n \"separator\",\r\n \"fullscreen\",\r\n \"print\",\r\n ],\r\n medium: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"separator\",\r\n \"fontFamily\",\r\n \"fontSize\",\r\n \"textColor\",\r\n \"backgroundColor\",\r\n \"separator\",\r\n \"alignLeft\",\r\n \"alignCenter\",\r\n \"alignRight\",\r\n \"separator\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"separator\",\r\n \"heading1\",\r\n \"heading2\",\r\n \"heading3\",\r\n \"separator\",\r\n \"link\",\r\n \"image\",\r\n \"table\",\r\n \"emoji\",\r\n \"separator\",\r\n \"undo\",\r\n \"redo\",\r\n \"fullscreen\",\r\n ],\r\n simple: [\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"separator\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"separator\",\r\n \"link\",\r\n \"image\",\r\n \"separator\",\r\n \"undo\",\r\n \"redo\",\r\n ],\r\n};\r\n\r\nexport const RichTextEditor = forwardRef<EditorRef, EditorProps>(\r\n (\r\n {\r\n value = \"\",\r\n onChange,\r\n onBlur,\r\n onFocus,\r\n placeholder = \"Start typing...\",\r\n height = 400,\r\n minHeight = 300,\r\n maxHeight,\r\n disabled = false,\r\n readOnly = false,\r\n charCounterMax = -1,\r\n showCharCounter = false,\r\n toolbarPreset = \"full\",\r\n toolbarButtons,\r\n className = \"\",\r\n config = {},\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n enableCodeHighlight = true,\r\n defaultCodeLanguage = \"javascript\",\r\n },\r\n ref,\r\n ) => {\r\n // Determine which toolbar buttons to use\r\n const activeToolbarButtons =\r\n toolbarButtons || toolbarPresets[toolbarPreset];\r\n\r\n // Initialize editor\r\n const editor = useEditor({\r\n extensions: [\r\n Document,\r\n Paragraph,\r\n Text,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strike,\r\n Code,\r\n enableCodeHighlight\r\n ? CodeBlockLowlight.configure({\r\n lowlight,\r\n defaultLanguage: defaultCodeLanguage,\r\n })\r\n : CodeBlockLowlight.configure({\r\n lowlight: null as any,\r\n }),\r\n Subscript,\r\n Superscript,\r\n TextStyle,\r\n FontFamily,\r\n FontSize,\r\n Color,\r\n Highlight.configure({ multicolor: true }),\r\n LineHeight,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Heading.configure({\r\n levels: [1, 2, 3, 4, 5, 6],\r\n }),\r\n BulletList,\r\n OrderedList,\r\n ListItem,\r\n Blockquote,\r\n HorizontalRule,\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n target: \"_blank\",\r\n rel: \"noopener noreferrer\",\r\n },\r\n }),\r\n Image.configure({\r\n inline: false,\r\n allowBase64: true,\r\n }),\r\n Video,\r\n Table.configure({\r\n resizable: true,\r\n }),\r\n TableRow,\r\n TableCell,\r\n TableHeader,\r\n History,\r\n Placeholder.configure({\r\n placeholder,\r\n }),\r\n CharacterCount.configure({\r\n limit: charCounterMax > 0 ? charCounterMax : undefined,\r\n }),\r\n Gapcursor,\r\n Dropcursor,\r\n HardBreak,\r\n // New extensions\r\n Emoji,\r\n Fullscreen,\r\n Print,\r\n Indent,\r\n ],\r\n content: value,\r\n editable: !disabled && !readOnly,\r\n onUpdate: ({ editor }) => {\r\n const html = editor.getHTML();\r\n onChange?.(html);\r\n },\r\n onBlur: () => {\r\n onBlur?.();\r\n },\r\n onFocus: () => {\r\n onFocus?.();\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: \"rte-builder-content\",\r\n style: `min-height: ${minHeight}px; ${maxHeight ? `max-height: ${maxHeight}px;` : \"\"}`,\r\n },\r\n },\r\n ...config,\r\n });\r\n\r\n // Update content when value prop changes\r\n useEffect(() => {\r\n if (editor && value !== editor.getHTML()) {\r\n editor.commands.setContent(value);\r\n }\r\n }, [value, editor]);\r\n\r\n // Update editable state\r\n useEffect(() => {\r\n if (editor) {\r\n editor.setEditable(!disabled && !readOnly);\r\n }\r\n }, [disabled, readOnly, editor]);\r\n\r\n // Handle media picker for images\r\n const handleMediaPickerImage = useCallback(async () => {\r\n if (onMediaPickerImage && editor) {\r\n const file = await onMediaPickerImage();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setImage({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerImage, editor]);\r\n\r\n // Handle media picker for videos\r\n const handleMediaPickerVideo = useCallback(async () => {\r\n if (onMediaPickerVideo && editor) {\r\n const file = await onMediaPickerVideo();\r\n if (file) {\r\n editor\r\n .chain()\r\n .focus()\r\n .setVideo({ src: file.url, alt: file.alt || file.name })\r\n .run();\r\n }\r\n }\r\n }, [onMediaPickerVideo, editor]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n getContent: () => {\r\n return editor?.getHTML() || \"\";\r\n },\r\n setContent: (html: string) => {\r\n editor?.commands.setContent(html);\r\n },\r\n focus: () => {\r\n editor?.commands.focus();\r\n },\r\n getEditor: () => {\r\n return editor;\r\n },\r\n insertHTML: (html: string) => {\r\n editor?.commands.insertContent(html);\r\n },\r\n clear: () => {\r\n editor?.commands.clearContent();\r\n },\r\n isFullscreen: () => {\r\n return editor?.storage.fullscreen?.isFullscreen || false;\r\n },\r\n toggleFullscreen: () => {\r\n editor?.commands.toggleFullscreen();\r\n },\r\n print: () => {\r\n editor?.commands.print();\r\n },\r\n }));\r\n\r\n if (!editor) {\r\n return null;\r\n }\r\n\r\n const characterCount = editor.storage.characterCount.characters();\r\n const characterLimit = charCounterMax > 0 ? charCounterMax : null;\r\n\r\n return (\r\n <div\r\n className={`rte-builder-wrapper ${disabled ? \"disabled\" : \"\"} ${readOnly ? \"readonly\" : \"\"} ${className}`}\r\n >\r\n <Toolbar\r\n editor={editor}\r\n buttons={activeToolbarButtons}\r\n onMediaPickerImage={\r\n onMediaPickerImage ? handleMediaPickerImage : undefined\r\n }\r\n onMediaPickerVideo={\r\n onMediaPickerVideo ? handleMediaPickerVideo : undefined\r\n }\r\n />\r\n <div\r\n className=\"rte-builder-container\"\r\n style={{ height: `${height}px` }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n {showCharCounter && (\r\n <div className=\"rte-builder-footer\">\r\n <div className=\"rte-builder-char-counter\">\r\n {characterCount}\r\n {characterLimit && ` / ${characterLimit}`}\r\n {characterLimit && characterCount > characterLimit && (\r\n <span className=\"rte-builder-char-counter-exceeded\">\r\n {\" \"}\r\n (limit exceeded)\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nRichTextEditor.displayName = \"RichTextEditor\";\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport type { Editor } from \"@tiptap/react\";\r\nimport type { ToolbarButton } from \"../types\";\r\nimport { EMOJI_CATEGORIES } from \"../extensions/Emoji\";\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline,\r\n Strikethrough,\r\n Code,\r\n Subscript,\r\n Superscript,\r\n RemoveFormatting,\r\n Type,\r\n Highlighter,\r\n AlignLeft,\r\n AlignCenter,\r\n AlignRight,\r\n AlignJustify,\r\n Indent,\r\n Outdent,\r\n List,\r\n ListOrdered,\r\n Heading,\r\n Quote,\r\n Minus,\r\n Link,\r\n Unlink,\r\n Image,\r\n Video,\r\n Table,\r\n Smile,\r\n Maximize,\r\n Minimize,\r\n Printer,\r\n Undo,\r\n Redo,\r\n CodeXml,\r\n} from \"lucide-react\";\r\n\r\ninterface ToolbarProps {\r\n editor: Editor | null;\r\n buttons: ToolbarButton[];\r\n onMediaPickerImage?: () => void;\r\n onMediaPickerVideo?: () => void;\r\n}\r\n\r\nconst FONT_FAMILIES = [\r\n { value: \"Arial\", label: \"Arial\" },\r\n { value: \"Georgia\", label: \"Georgia\" },\r\n { value: \"Times New Roman\", label: \"Times New Roman\" },\r\n { value: \"Courier New\", label: \"Courier New\" },\r\n { value: \"Verdana\", label: \"Verdana\" },\r\n { value: \"Roboto\", label: \"Roboto\" },\r\n { value: \"Open Sans\", label: \"Open Sans\" },\r\n { value: \"Lato\", label: \"Lato\" },\r\n { value: \"Montserrat\", label: \"Montserrat\" },\r\n { value: \"Poppins\", label: \"Poppins\" },\r\n];\r\n\r\nconst FONT_SIZES = [\r\n \"8px\",\r\n \"10px\",\r\n \"12px\",\r\n \"14px\",\r\n \"16px\",\r\n \"18px\",\r\n \"20px\",\r\n \"24px\",\r\n \"30px\",\r\n \"36px\",\r\n \"48px\",\r\n \"60px\",\r\n \"72px\",\r\n];\r\n\r\nconst LINE_HEIGHTS = [\r\n { value: \"1\", label: \"Single\" },\r\n { value: \"1.15\", label: \"1.15\" },\r\n { value: \"1.5\", label: \"1.5\" },\r\n { value: \"1.75\", label: \"1.75\" },\r\n { value: \"2\", label: \"Double\" },\r\n { value: \"2.5\", label: \"2.5\" },\r\n { value: \"3\", label: \"Triple\" },\r\n];\r\n\r\n// const CODE_LANGUAGES = [\r\n// { value: \"javascript\", label: \"JavaScript\" },\r\n// { value: \"typescript\", label: \"TypeScript\" },\r\n// { value: \"python\", label: \"Python\" },\r\n// { value: \"java\", label: \"Java\" },\r\n// { value: \"cpp\", label: \"C++\" },\r\n// { value: \"csharp\", label: \"C#\" },\r\n// { value: \"php\", label: \"PHP\" },\r\n// { value: \"ruby\", label: \"Ruby\" },\r\n// { value: \"go\", label: \"Go\" },\r\n// { value: \"rust\", label: \"Rust\" },\r\n// { value: \"html\", label: \"HTML\" },\r\n// { value: \"css\", label: \"CSS\" },\r\n// { value: \"sql\", label: \"SQL\" },\r\n// { value: \"bash\", label: \"Bash\" },\r\n// { value: \"json\", label: \"JSON\" },\r\n// { value: \"yaml\", label: \"YAML\" },\r\n// { value: \"markdown\", label: \"Markdown\" },\r\n// { value: \"xml\", label: \"XML\" },\r\n// ];\r\n\r\n// Emoji Picker Popover Component\r\nconst EmojiPicker: React.FC<{\r\n onSelect: (emoji: string) => void;\r\n onClose: () => void;\r\n}> = ({ onSelect, onClose }) => {\r\n const [activeCategory, setActiveCategory] =\r\n useState<keyof typeof EMOJI_CATEGORIES>(\"smileys\");\r\n const popoverRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [onClose]);\r\n\r\n return (\r\n <div ref={popoverRef} className=\"rte-builder-emoji-picker\">\r\n <div className=\"rte-builder-emoji-categories\">\r\n {Object.entries(EMOJI_CATEGORIES).map(([key, category]) => (\r\n <button\r\n key={key}\r\n type=\"button\"\r\n className={`rte-builder-emoji-category-btn ${activeCategory === key ? \"active\" : \"\"}`}\r\n onClick={() =>\r\n setActiveCategory(key as keyof typeof EMOJI_CATEGORIES)\r\n }\r\n title={category.label}\r\n >\r\n {category.emojis[0]}\r\n </button>\r\n ))}\r\n </div>\r\n <div className=\"rte-builder-emoji-grid\">\r\n {EMOJI_CATEGORIES[activeCategory].emojis.map((emoji, i) => (\r\n <button\r\n key={`${emoji}-${i}`}\r\n type=\"button\"\r\n className=\"rte-builder-emoji-btn\"\r\n onClick={() => {\r\n onSelect(emoji);\r\n onClose();\r\n }}\r\n >\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const Toolbar: React.FC<ToolbarProps> = ({\r\n editor,\r\n buttons,\r\n onMediaPickerImage,\r\n onMediaPickerVideo,\r\n}) => {\r\n const [showEmojiPicker, setShowEmojiPicker] = useState(false);\r\n const emojiButtonRef = useRef<HTMLButtonElement>(null);\r\n\r\n if (!editor) return null;\r\n\r\n const ToolbarButton = ({\r\n onClick,\r\n active = false,\r\n disabled = false,\r\n children,\r\n title,\r\n buttonRef,\r\n }: {\r\n onClick: () => void;\r\n active?: boolean;\r\n disabled?: boolean;\r\n children: React.ReactNode;\r\n title?: string;\r\n buttonRef?: React.RefObject<HTMLButtonElement>;\r\n }) => (\r\n <button\r\n ref={buttonRef}\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault(); // Prevent editor from losing focus\r\n onClick();\r\n }}\r\n disabled={disabled}\r\n title={title}\r\n className={`rte-builder-toolbar-btn ${active ? \"active\" : \"\"} ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n\r\n const renderButton = (button: ToolbarButton, index: number) => {\r\n switch (button) {\r\n case \"bold\":\r\n return (\r\n <ToolbarButton\r\n key=\"bold\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n active={editor.isActive(\"bold\")}\r\n title=\"Bold (Ctrl+B)\"\r\n >\r\n <Bold size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"italic\":\r\n return (\r\n <ToolbarButton\r\n key=\"italic\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n active={editor.isActive(\"italic\")}\r\n title=\"Italic (Ctrl+I)\"\r\n >\r\n <Italic size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"underline\":\r\n return (\r\n <ToolbarButton\r\n key=\"underline\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n active={editor.isActive(\"underline\")}\r\n title=\"Underline (Ctrl+U)\"\r\n >\r\n <Underline size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"strike\":\r\n return (\r\n <ToolbarButton\r\n key=\"strike\"\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n active={editor.isActive(\"strike\")}\r\n title=\"Strikethrough\"\r\n >\r\n <Strikethrough size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"code\":\r\n return (\r\n <ToolbarButton\r\n key=\"code\"\r\n onClick={() => editor.chain().focus().toggleCode().run()}\r\n active={editor.isActive(\"code\")}\r\n title=\"Inline Code\"\r\n >\r\n <Code size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"codeBlock\":\r\n return (\r\n <ToolbarButton\r\n key=\"codeBlock\"\r\n onClick={() => {\r\n if (editor.isActive(\"codeBlock\")) {\r\n // Source mode OFF: extract raw HTML from code block, render as rich content\r\n let htmlSource = \"\";\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === \"codeBlock\") {\r\n htmlSource = node.textContent;\r\n return false;\r\n }\r\n });\r\n\r\n htmlSource = htmlSource.trim();\r\n\r\n if (htmlSource) {\r\n editor.commands.setContent(htmlSource, true, {\r\n preserveWhitespace: false,\r\n });\r\n } else {\r\n editor.commands.clearContent(true);\r\n }\r\n editor.commands.focus();\r\n } else {\r\n // Source mode ON: get current rich content as HTML, show as editable source\r\n const currentHTML = editor.getHTML();\r\n const isEmptyContent =\r\n !currentHTML ||\r\n currentHTML === \"<p></p>\" ||\r\n currentHTML.trim() === \"\";\r\n\r\n const codeBlockContent = isEmptyContent\r\n ? { type: \"doc\", content: [{ type: \"codeBlock\" }] }\r\n : {\r\n type: \"doc\",\r\n content: [\r\n {\r\n type: \"codeBlock\",\r\n content: [{ type: \"text\", text: currentHTML }],\r\n },\r\n ],\r\n };\r\n\r\n editor.commands.setContent(codeBlockContent, false);\r\n editor.commands.focus();\r\n }\r\n }}\r\n active={editor.isActive(\"codeBlock\")}\r\n title=\"Code Block (HTML Source)\"\r\n >\r\n <CodeXml size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"subscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"subscript\"\r\n onClick={() => editor.chain().focus().toggleSubscript().run()}\r\n active={editor.isActive(\"subscript\")}\r\n title=\"Subscript\"\r\n >\r\n <Subscript size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"superscript\":\r\n return (\r\n <ToolbarButton\r\n key=\"superscript\"\r\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\r\n active={editor.isActive(\"superscript\")}\r\n title=\"Superscript\"\r\n >\r\n <Superscript size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"clearFormatting\":\r\n return (\r\n <ToolbarButton\r\n key=\"clearFormatting\"\r\n onClick={() =>\r\n editor.chain().focus().clearNodes().unsetAllMarks().run()\r\n }\r\n title=\"Clear Formatting\"\r\n >\r\n <RemoveFormatting size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"fontFamily\":\r\n return (\r\n <select\r\n key=\"fontFamily\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontFamily().run();\r\n } else {\r\n editor.chain().focus().setFontFamily(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontFamily || \"default\"}\r\n >\r\n <option value=\"default\">Font Family</option>\r\n {FONT_FAMILIES.map((font) => (\r\n <option key={font.value} value={font.value}>\r\n {font.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"fontSize\":\r\n return (\r\n <select\r\n key=\"fontSize\"\r\n className=\"rte-builder-toolbar-select\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetFontSize().run();\r\n } else {\r\n editor.chain().focus().setFontSize(e.target.value).run();\r\n }\r\n }}\r\n value={editor.getAttributes(\"textStyle\").fontSize || \"default\"}\r\n >\r\n <option value=\"default\">Font Size</option>\r\n {FONT_SIZES.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"lineHeight\":\r\n return (\r\n <select\r\n key=\"lineHeight\"\r\n className=\"rte-builder-toolbar-select rte-builder-toolbar-select-sm\"\r\n onChange={(e) => {\r\n if (e.target.value === \"default\") {\r\n editor.chain().focus().unsetLineHeight().run();\r\n } else {\r\n editor.chain().focus().setLineHeight(e.target.value).run();\r\n }\r\n }}\r\n value={\r\n editor.getAttributes(\"paragraph\").lineHeight ||\r\n editor.getAttributes(\"heading\").lineHeight ||\r\n \"default\"\r\n }\r\n title=\"Line Height\"\r\n >\r\n <option value=\"default\">Line Height</option>\r\n {LINE_HEIGHTS.map((lh) => (\r\n <option key={lh.value} value={lh.value}>\r\n {lh.label}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n\r\n case \"textColor\":\r\n return (\r\n <span key=\"textColor\" className=\"rte-builder-toolbar-color-group\">\r\n <button\r\n key=\"text-none\"\r\n className=\"rte-builder-color-preset rte-builder-color-preset-none\"\r\n onClick={() => editor.chain().focus().unsetColor().run()}\r\n title=\"Text Color: None (Reset)\"\r\n type=\"button\"\r\n />\r\n <span className=\"rte-builder-toolbar-color\">\r\n <label title=\"Text Color\">\r\n <Type size={18} />\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor.chain().focus().setColor(e.target.value).run()\r\n }\r\n value={editor.getAttributes(\"textStyle\").color || \"#000000\"}\r\n />\r\n </label>\r\n </span>\r\n </span>\r\n );\r\n\r\n case \"backgroundColor\":\r\n return (\r\n <span key=\"backgroundColor\" className=\"rte-builder-toolbar-color\">\r\n <label title=\"Background Color\">\r\n <Highlighter size={18} />\r\n <input\r\n type=\"color\"\r\n onChange={(e) =>\r\n editor\r\n .chain()\r\n .focus()\r\n .toggleHighlight({ color: e.target.value })\r\n .run()\r\n }\r\n value={editor.getAttributes(\"highlight\").color || \"#ffff00\"}\r\n />\r\n </label>\r\n </span>\r\n );\r\n\r\n case \"alignLeft\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignLeft\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"left\").run()}\r\n active={editor.isActive({ textAlign: \"left\" })}\r\n title=\"Align Left\"\r\n >\r\n <AlignLeft size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignCenter\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignCenter\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"center\").run()}\r\n active={editor.isActive({ textAlign: \"center\" })}\r\n title=\"Align Center\"\r\n >\r\n <AlignCenter size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignRight\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignRight\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"right\").run()}\r\n active={editor.isActive({ textAlign: \"right\" })}\r\n title=\"Align Right\"\r\n >\r\n <AlignRight size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"alignJustify\":\r\n return (\r\n <ToolbarButton\r\n key=\"alignJustify\"\r\n onClick={() => editor.chain().focus().setTextAlign(\"justify\").run()}\r\n active={editor.isActive({ textAlign: \"justify\" })}\r\n title=\"Justify\"\r\n >\r\n <AlignJustify size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"indent\":\r\n return (\r\n <ToolbarButton\r\n key=\"indent\"\r\n onClick={() => editor.chain().focus().indent().run()}\r\n title=\"Indent (Tab)\"\r\n >\r\n <Indent size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"outdent\":\r\n return (\r\n <ToolbarButton\r\n key=\"outdent\"\r\n onClick={() => editor.chain().focus().outdent().run()}\r\n title=\"Outdent (Shift+Tab)\"\r\n >\r\n <Outdent size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"bulletList\":\r\n return (\r\n <ToolbarButton\r\n key=\"bulletList\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n active={editor.isActive(\"bulletList\")}\r\n title=\"Bullet List\"\r\n >\r\n <List size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"orderedList\":\r\n return (\r\n <ToolbarButton\r\n key=\"orderedList\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n active={editor.isActive(\"orderedList\")}\r\n title=\"Numbered List\"\r\n >\r\n <ListOrdered size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"heading1\":\r\n case \"heading2\":\r\n case \"heading3\":\r\n case \"heading4\":\r\n case \"heading5\":\r\n case \"heading6\":\r\n const level = parseInt(button.replace(\"heading\", \"\")) as\r\n | 1\r\n | 2\r\n | 3\r\n | 4\r\n | 5\r\n | 6;\r\n return (\r\n <ToolbarButton\r\n key={button}\r\n onClick={() =>\r\n editor.chain().focus().toggleHeading({ level }).run()\r\n }\r\n active={editor.isActive(\"heading\", { level })}\r\n title={`Heading ${level}`}\r\n >\r\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"2px\" }}>\r\n <Heading size={18} />\r\n <span style={{ fontSize: \"11px\", fontWeight: \"bold\" }}>\r\n {level}\r\n </span>\r\n </span>\r\n </ToolbarButton>\r\n );\r\n\r\n case \"blockquote\":\r\n return (\r\n <ToolbarButton\r\n key=\"blockquote\"\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n active={editor.isActive(\"blockquote\")}\r\n title=\"Blockquote\"\r\n >\r\n <Quote size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"horizontalRule\":\r\n return (\r\n <ToolbarButton\r\n key=\"horizontalRule\"\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n title=\"Horizontal Rule\"\r\n >\r\n <Minus size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"link\":\r\n return (\r\n <ToolbarButton\r\n key=\"link\"\r\n onClick={() => {\r\n const url = window.prompt(\"Enter URL:\");\r\n if (url) {\r\n editor.chain().focus().setLink({ href: url }).run();\r\n }\r\n }}\r\n active={editor.isActive(\"link\")}\r\n title=\"Insert Link\"\r\n >\r\n <Link size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"unlink\":\r\n return (\r\n <ToolbarButton\r\n key=\"unlink\"\r\n onClick={() => editor.chain().focus().unsetLink().run()}\r\n disabled={!editor.isActive(\"link\")}\r\n title=\"Remove Link\"\r\n >\r\n <Unlink size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"image\":\r\n return (\r\n <ToolbarButton\r\n key=\"image\"\r\n onClick={() => {\r\n if (onMediaPickerImage) {\r\n onMediaPickerImage();\r\n } else {\r\n const url = window.prompt(\"Enter image URL:\");\r\n if (url) {\r\n editor.chain().focus().setImage({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Image\"\r\n >\r\n <Image size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"video\":\r\n return (\r\n <ToolbarButton\r\n key=\"video\"\r\n onClick={() => {\r\n if (onMediaPickerVideo) {\r\n onMediaPickerVideo();\r\n } else {\r\n const url = window.prompt(\"Enter video URL:\");\r\n if (url) {\r\n editor.chain().focus().setVideo({ src: url }).run();\r\n }\r\n }\r\n }}\r\n title=\"Insert Video\"\r\n >\r\n <Video size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"table\":\r\n return (\r\n <ToolbarButton\r\n key=\"table\"\r\n onClick={() =>\r\n editor\r\n .chain()\r\n .focus()\r\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\r\n .run()\r\n }\r\n title=\"Insert Table\"\r\n >\r\n <Table size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"emoji\":\r\n return (\r\n <span key=\"emoji\" style={{ position: \"relative\" }}>\r\n <ToolbarButton\r\n buttonRef={emojiButtonRef}\r\n onClick={() => setShowEmojiPicker(!showEmojiPicker)}\r\n active={showEmojiPicker}\r\n title=\"Insert Emoji\"\r\n >\r\n <Smile size={18} />\r\n </ToolbarButton>\r\n {showEmojiPicker && (\r\n <EmojiPicker\r\n onSelect={(emoji) =>\r\n editor.chain().focus().insertEmoji(emoji).run()\r\n }\r\n onClose={() => setShowEmojiPicker(false)}\r\n />\r\n )}\r\n </span>\r\n );\r\n\r\n case \"fullscreen\":\r\n const isFullscreen = editor.storage.fullscreen?.isFullscreen || false;\r\n return (\r\n <ToolbarButton\r\n key=\"fullscreen\"\r\n onClick={() => editor.chain().focus().toggleFullscreen().run()}\r\n active={isFullscreen}\r\n title={\r\n isFullscreen\r\n ? \"Exit Fullscreen (Esc)\"\r\n : \"Fullscreen (Ctrl+Shift+F)\"\r\n }\r\n >\r\n {isFullscreen ? <Minimize size={18} /> : <Maximize size={18} />}\r\n </ToolbarButton>\r\n );\r\n\r\n case \"print\":\r\n return (\r\n <ToolbarButton\r\n key=\"print\"\r\n onClick={() => editor.chain().focus().print().run()}\r\n title=\"Print (Ctrl+P)\"\r\n >\r\n <Printer size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"undo\":\r\n return (\r\n <ToolbarButton\r\n key=\"undo\"\r\n onClick={() => editor.chain().focus().undo().run()}\r\n disabled={!editor.can().undo()}\r\n title=\"Undo (Ctrl+Z)\"\r\n >\r\n <Undo size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"redo\":\r\n return (\r\n <ToolbarButton\r\n key=\"redo\"\r\n onClick={() => editor.chain().focus().redo().run()}\r\n disabled={!editor.can().redo()}\r\n title=\"Redo (Ctrl+Y)\"\r\n >\r\n <Redo size={18} />\r\n </ToolbarButton>\r\n );\r\n\r\n case \"separator\":\r\n return (\r\n <div key={`sep-${index}`} className=\"rte-builder-toolbar-separator\" />\r\n );\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n const isSourceMode = editor.isActive(\"codeBlock\");\r\n\r\n return <div className={`rte-builder-toolbar${isSourceMode ? \" rte-builder-toolbar-source-mode\" : \"\"}`}>{buttons.map(renderButton)}</div>;\r\n};\r\n","/**\r\n * Collaboration Context\r\n * Provides real-time collaboration state and methods to child components\r\n */\r\n\r\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\r\nimport type {\r\n CollaborationState,\r\n CollaborationConfig,\r\n CollaborationUser,\r\n CollaborationStatus,\r\n CollaborationEvent,\r\n CursorPosition,\r\n} from './types'\r\n\r\n/** Actions for collaboration reducer */\r\ntype CollaborationAction =\r\n | { type: 'SET_STATUS'; status: CollaborationStatus }\r\n | { type: 'SET_USERS'; users: CollaborationUser[] }\r\n | { type: 'ADD_USER'; user: CollaborationUser }\r\n | { type: 'REMOVE_USER'; userId: string }\r\n | { type: 'UPDATE_CURSOR'; userId: string; cursor: CursorPosition }\r\n | { type: 'SET_ERROR'; error: string }\r\n | { type: 'CLEAR_ERROR' }\r\n | { type: 'SET_HOST'; isHost: boolean }\r\n\r\n/** Initial collaboration state */\r\nconst initialState: CollaborationState = {\r\n status: 'disconnected',\r\n users: [],\r\n error: undefined,\r\n isHost: false,\r\n}\r\n\r\n/** Collaboration reducer */\r\nfunction collaborationReducer(state: CollaborationState, action: CollaborationAction): CollaborationState {\r\n switch (action.type) {\r\n case 'SET_STATUS':\r\n return { ...state, status: action.status, error: action.status === 'error' ? state.error : undefined }\r\n case 'SET_USERS':\r\n return { ...state, users: action.users }\r\n case 'ADD_USER':\r\n if (state.users.find(u => u.id === action.user.id)) {\r\n return {\r\n ...state,\r\n users: state.users.map(u => u.id === action.user.id ? action.user : u),\r\n }\r\n }\r\n return { ...state, users: [...state.users, action.user] }\r\n case 'REMOVE_USER':\r\n return { ...state, users: state.users.filter(u => u.id !== action.userId) }\r\n case 'UPDATE_CURSOR':\r\n return {\r\n ...state,\r\n users: state.users.map(u =>\r\n u.id === action.userId ? { ...u, cursor: action.cursor, lastActive: Date.now() } : u\r\n ),\r\n }\r\n case 'SET_ERROR':\r\n return { ...state, status: 'error', error: action.error }\r\n case 'CLEAR_ERROR':\r\n return { ...state, error: undefined }\r\n case 'SET_HOST':\r\n return { ...state, isHost: action.isHost }\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n/** Context value type */\r\ninterface CollaborationContextValue {\r\n state: CollaborationState\r\n config: CollaborationConfig | null\r\n connect: () => Promise<void>\r\n disconnect: () => void\r\n updateCursor: (cursor: CursorPosition) => void\r\n isEnabled: boolean\r\n}\r\n\r\n/** Create context */\r\nconst CollaborationContext = createContext<CollaborationContextValue | null>(null)\r\n\r\n/** Provider props */\r\ninterface CollaborationProviderProps {\r\n children: ReactNode\r\n config?: CollaborationConfig\r\n onStatusChange?: (status: CollaborationStatus) => void\r\n onUsersChange?: (users: CollaborationUser[]) => void\r\n}\r\n\r\n/** Generate a random color for user */\r\nfunction generateUserColor(): string {\r\n const colors = [\r\n '#f87171', '#fb923c', '#fbbf24', '#a3e635', '#4ade80',\r\n '#2dd4bf', '#22d3ee', '#60a5fa', '#a78bfa', '#e879f9',\r\n ]\r\n return colors[Math.floor(Math.random() * colors.length)]\r\n}\r\n\r\n/** Collaboration Provider Component */\r\nexport function CollaborationProvider({\r\n children,\r\n config,\r\n onStatusChange,\r\n onUsersChange,\r\n}: CollaborationProviderProps) {\r\n const [state, dispatch] = useReducer(collaborationReducer, initialState)\r\n const wsRef = useRef<WebSocket | null>(null)\r\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null)\r\n const reconnectAttemptsRef = useRef(0)\r\n\r\n // Notify on status change\r\n useEffect(() => {\r\n onStatusChange?.(state.status)\r\n }, [state.status, onStatusChange])\r\n\r\n // Notify on users change\r\n useEffect(() => {\r\n onUsersChange?.(state.users)\r\n }, [state.users, onUsersChange])\r\n\r\n /** Connect to collaboration server */\r\n const connect = useCallback(async () => {\r\n if (!config) return\r\n\r\n dispatch({ type: 'SET_STATUS', status: 'connecting' })\r\n\r\n try {\r\n if (config.provider === 'websocket' && config.serverUrl) {\r\n const url = new URL(config.serverUrl)\r\n url.searchParams.set('room', config.roomId)\r\n if (config.token) {\r\n url.searchParams.set('token', config.token)\r\n }\r\n\r\n const ws = new WebSocket(url.toString())\r\n wsRef.current = ws\r\n\r\n ws.onopen = () => {\r\n dispatch({ type: 'SET_STATUS', status: 'connected' })\r\n reconnectAttemptsRef.current = 0\r\n\r\n // Send join message\r\n ws.send(JSON.stringify({\r\n type: 'join',\r\n user: {\r\n id: config.user.id,\r\n name: config.user.name,\r\n avatar: config.user.avatar,\r\n color: config.user.color || generateUserColor(),\r\n },\r\n }))\r\n }\r\n\r\n ws.onmessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data) as CollaborationEvent\r\n handleCollaborationEvent(message)\r\n } catch {\r\n console.error('Failed to parse collaboration message')\r\n }\r\n }\r\n\r\n ws.onclose = () => {\r\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\r\n handleReconnect()\r\n }\r\n\r\n ws.onerror = () => {\r\n dispatch({ type: 'SET_ERROR', error: 'Connection error' })\r\n }\r\n } else if (config.provider === 'webrtc') {\r\n // WebRTC implementation would go here\r\n dispatch({ type: 'SET_ERROR', error: 'WebRTC provider not yet implemented' })\r\n } else if (config.provider === 'custom') {\r\n // Custom provider - user handles connection\r\n dispatch({ type: 'SET_STATUS', status: 'connected' })\r\n }\r\n } catch (error) {\r\n dispatch({ type: 'SET_ERROR', error: error instanceof Error ? error.message : 'Connection failed' })\r\n }\r\n }, [config])\r\n\r\n /** Handle collaboration events */\r\n const handleCollaborationEvent = useCallback((event: CollaborationEvent) => {\r\n switch (event.type) {\r\n case 'user-joined':\r\n dispatch({ type: 'ADD_USER', user: event.user })\r\n break\r\n case 'user-left':\r\n dispatch({ type: 'REMOVE_USER', userId: event.userId })\r\n break\r\n case 'cursor-moved':\r\n dispatch({ type: 'UPDATE_CURSOR', userId: event.userId, cursor: event.cursor })\r\n break\r\n case 'status-changed':\r\n dispatch({ type: 'SET_STATUS', status: event.status })\r\n break\r\n case 'error':\r\n dispatch({ type: 'SET_ERROR', error: event.message })\r\n break\r\n }\r\n }, [])\r\n\r\n /** Handle reconnection */\r\n const handleReconnect = useCallback(() => {\r\n if (!config?.autoReconnect) return\r\n\r\n const maxAttempts = config.maxReconnectAttempts ?? 5\r\n const interval = config.reconnectInterval ?? 3000\r\n\r\n if (reconnectAttemptsRef.current >= maxAttempts) {\r\n dispatch({ type: 'SET_ERROR', error: 'Max reconnection attempts reached' })\r\n return\r\n }\r\n\r\n dispatch({ type: 'SET_STATUS', status: 'reconnecting' })\r\n reconnectAttemptsRef.current++\r\n\r\n reconnectTimeoutRef.current = setTimeout(() => {\r\n connect()\r\n }, interval)\r\n }, [config, connect])\r\n\r\n /** Disconnect from collaboration server */\r\n const disconnect = useCallback(() => {\r\n if (reconnectTimeoutRef.current) {\r\n clearTimeout(reconnectTimeoutRef.current)\r\n }\r\n\r\n if (wsRef.current) {\r\n wsRef.current.close()\r\n wsRef.current = null\r\n }\r\n\r\n dispatch({ type: 'SET_STATUS', status: 'disconnected' })\r\n dispatch({ type: 'SET_USERS', users: [] })\r\n }, [])\r\n\r\n /** Update cursor position */\r\n const updateCursor = useCallback((cursor: CursorPosition) => {\r\n if (!config || !wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) return\r\n\r\n wsRef.current.send(JSON.stringify({\r\n type: 'cursor',\r\n userId: config.user.id,\r\n cursor,\r\n }))\r\n }, [config])\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n disconnect()\r\n }\r\n }, [disconnect])\r\n\r\n const value: CollaborationContextValue = {\r\n state,\r\n config: config ?? null,\r\n connect,\r\n disconnect,\r\n updateCursor,\r\n isEnabled: !!config,\r\n }\r\n\r\n return (\r\n <CollaborationContext.Provider value={value}>\r\n {children}\r\n </CollaborationContext.Provider>\r\n )\r\n}\r\n\r\n/** Hook to use collaboration context */\r\nexport function useCollaboration() {\r\n const context = useContext(CollaborationContext)\r\n if (!context) {\r\n throw new Error('useCollaboration must be used within a CollaborationProvider')\r\n }\r\n return context\r\n}\r\n\r\n/** Hook to check if collaboration is available (doesn't throw) */\r\nexport function useCollaborationOptional() {\r\n return useContext(CollaborationContext)\r\n}\r\n\r\nexport default CollaborationContext\r\n","/**\r\n * Presence Indicator Component\r\n * Shows connected users with avatars and status\r\n */\r\n\r\nimport { useCollaborationOptional } from './CollaborationContext'\r\nimport type { CollaborationUser } from './types'\r\n\r\ninterface PresenceIndicatorProps {\r\n /** Maximum avatars to show before \"+N\" */\r\n maxAvatars?: number\r\n /** Show user names on hover */\r\n showNames?: boolean\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n/** Get initials from name */\r\nfunction getInitials(name: string): string {\r\n return name\r\n .split(' ')\r\n .map(n => n[0])\r\n .join('')\r\n .toUpperCase()\r\n .slice(0, 2)\r\n}\r\n\r\n/** Single user avatar */\r\nfunction UserAvatar({ user, showName }: { user: CollaborationUser; showName?: boolean }) {\r\n return (\r\n <div\r\n className=\"rte-presence-avatar\"\r\n style={{ borderColor: user.color }}\r\n title={user.name}\r\n >\r\n {user.avatar ? (\r\n <img src={user.avatar} alt={user.name} />\r\n ) : (\r\n <span style={{ backgroundColor: user.color }}>\r\n {getInitials(user.name)}\r\n </span>\r\n )}\r\n {user.isActive && <div className=\"rte-presence-active-dot\" />}\r\n {showName && <div className=\"rte-presence-name\">{user.name}</div>}\r\n </div>\r\n )\r\n}\r\n\r\n/** Connection status badge */\r\nfunction StatusBadge({ status }: { status: string }) {\r\n const statusConfig: Record<string, { label: string; color: string }> = {\r\n connected: { label: 'Connected', color: '#22c55e' },\r\n connecting: { label: 'Connecting...', color: '#eab308' },\r\n reconnecting: { label: 'Reconnecting...', color: '#f97316' },\r\n disconnected: { label: 'Disconnected', color: '#6b7280' },\r\n error: { label: 'Error', color: '#ef4444' },\r\n }\r\n\r\n const config = statusConfig[status] || statusConfig.disconnected\r\n\r\n return (\r\n <div className=\"rte-presence-status\" style={{ color: config.color }}>\r\n <div className=\"rte-presence-status-dot\" style={{ backgroundColor: config.color }} />\r\n {config.label}\r\n </div>\r\n )\r\n}\r\n\r\n/** Presence Indicator Component */\r\nexport function PresenceIndicator({\r\n maxAvatars = 5,\r\n showNames = false,\r\n className = '',\r\n}: PresenceIndicatorProps) {\r\n const collaboration = useCollaborationOptional()\r\n\r\n if (!collaboration?.isEnabled) {\r\n return null\r\n }\r\n\r\n const { state } = collaboration\r\n const visibleUsers = state.users.slice(0, maxAvatars)\r\n const remainingCount = Math.max(0, state.users.length - maxAvatars)\r\n\r\n return (\r\n <div className={`rte-presence-indicator ${className}`}>\r\n <StatusBadge status={state.status} />\r\n\r\n {state.users.length > 0 && (\r\n <div className=\"rte-presence-avatars\">\r\n {visibleUsers.map(user => (\r\n <UserAvatar key={user.id} user={user} showName={showNames} />\r\n ))}\r\n {remainingCount > 0 && (\r\n <div className=\"rte-presence-avatar rte-presence-more\">\r\n +{remainingCount}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {state.error && (\r\n <div className=\"rte-presence-error\" title={state.error}>\r\n !\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default PresenceIndicator\r\n","/**\r\n * Comments & Annotations Types\r\n * Types for inline comments and annotation features\r\n */\r\n\r\n/** Comment author information */\r\nexport interface CommentAuthor {\r\n /** Unique user identifier */\r\n id: string\r\n /** Display name */\r\n name: string\r\n /** Avatar URL (optional) */\r\n avatar?: string\r\n}\r\n\r\n/** Text range for comment anchor */\r\nexport interface CommentRange {\r\n /** Start position in document */\r\n from: number\r\n /** End position in document */\r\n to: number\r\n /** Selected text content */\r\n text: string\r\n}\r\n\r\n/** Single comment in a thread */\r\nexport interface Comment {\r\n /** Unique comment identifier */\r\n id: string\r\n /** Thread this comment belongs to */\r\n threadId: string\r\n /** Comment content (can be HTML) */\r\n content: string\r\n /** Comment author */\r\n author: CommentAuthor\r\n /** Creation timestamp */\r\n createdAt: number\r\n /** Last update timestamp */\r\n updatedAt?: number\r\n /** Is this comment edited */\r\n isEdited: boolean\r\n /** Reactions on this comment */\r\n reactions?: CommentReaction[]\r\n}\r\n\r\n/** Reaction on a comment */\r\nexport interface CommentReaction {\r\n /** Emoji reaction */\r\n emoji: string\r\n /** Users who reacted */\r\n users: CommentAuthor[]\r\n}\r\n\r\n/** Comment thread (group of comments on a text range) */\r\nexport interface CommentThread {\r\n /** Unique thread identifier */\r\n id: string\r\n /** Text range this thread is attached to */\r\n range: CommentRange\r\n /** Comments in this thread */\r\n comments: Comment[]\r\n /** Thread status */\r\n status: 'open' | 'resolved'\r\n /** Thread creation timestamp */\r\n createdAt: number\r\n /** Thread resolution timestamp */\r\n resolvedAt?: number\r\n /** User who resolved the thread */\r\n resolvedBy?: CommentAuthor\r\n}\r\n\r\n/** Comment highlight type */\r\nexport type CommentHighlightType = 'active' | 'hover' | 'resolved' | 'default'\r\n\r\n/** Comments state */\r\nexport interface CommentsState {\r\n /** All comment threads */\r\n threads: CommentThread[]\r\n /** Currently active/selected thread ID */\r\n activeThreadId: string | null\r\n /** Is comment panel open */\r\n isPanelOpen: boolean\r\n /** Filter for threads */\r\n filter: 'all' | 'open' | 'resolved'\r\n /** Current user (for adding comments) */\r\n currentUser: CommentAuthor | null\r\n}\r\n\r\n/** Comment event types */\r\nexport type CommentEvent =\r\n | { type: 'thread-created'; thread: CommentThread }\r\n | { type: 'thread-deleted'; threadId: string }\r\n | { type: 'thread-resolved'; threadId: string; resolvedBy: CommentAuthor }\r\n | { type: 'thread-reopened'; threadId: string }\r\n | { type: 'comment-added'; threadId: string; comment: Comment }\r\n | { type: 'comment-updated'; threadId: string; comment: Comment }\r\n | { type: 'comment-deleted'; threadId: string; commentId: string }\r\n | { type: 'reaction-added'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\r\n | { type: 'reaction-removed'; threadId: string; commentId: string; emoji: string; userId: string }\r\n\r\n/** Comments configuration */\r\nexport interface CommentsConfig {\r\n /** Current user for adding comments */\r\n currentUser: CommentAuthor\r\n /** Allow resolving threads */\r\n allowResolve?: boolean\r\n /** Allow deleting comments */\r\n allowDelete?: boolean\r\n /** Allow editing comments */\r\n allowEdit?: boolean\r\n /** Allow reactions */\r\n allowReactions?: boolean\r\n /** Available reaction emojis */\r\n reactionEmojis?: string[]\r\n /** Callback to persist comments */\r\n onSave?: (threads: CommentThread[]) => Promise<void>\r\n /** Callback to load comments */\r\n onLoad?: () => Promise<CommentThread[]>\r\n}\r\n\r\n/** Props for comments-enabled editor */\r\nexport interface CommentsProps {\r\n /** Enable comments features */\r\n comments?: CommentsConfig\r\n /** Initial comment threads */\r\n initialThreads?: CommentThread[]\r\n /** Callback when threads change */\r\n onThreadsChange?: (threads: CommentThread[]) => void\r\n /** Show comment highlights in editor */\r\n showCommentHighlights?: boolean\r\n /** Show comment panel */\r\n showCommentPanel?: boolean\r\n /** Comment panel position */\r\n commentPanelPosition?: 'left' | 'right'\r\n}\r\n\r\n/** Default reaction emojis */\r\nexport const DEFAULT_REACTION_EMOJIS = ['๐Ÿ‘', '๐Ÿ‘Ž', 'โค๏ธ', '๐ŸŽ‰', '๐Ÿ˜„', '๐Ÿ˜•', '๐Ÿ‘€', '๐Ÿš€']\r\n","/**\r\n * Comments Context\r\n * Provides comments and annotations state and methods to child components\r\n */\r\n\r\nimport { createContext, useContext, useReducer, useCallback, useEffect, ReactNode } from 'react'\r\nimport type {\r\n CommentsState,\r\n CommentsConfig,\r\n CommentThread,\r\n Comment,\r\n CommentAuthor,\r\n CommentRange,\r\n CommentEvent,\r\n} from './types'\r\nimport { DEFAULT_REACTION_EMOJIS } from './types'\r\n\r\n/** Actions for comments reducer */\r\ntype CommentsAction =\r\n | { type: 'SET_THREADS'; threads: CommentThread[] }\r\n | { type: 'ADD_THREAD'; thread: CommentThread }\r\n | { type: 'DELETE_THREAD'; threadId: string }\r\n | { type: 'RESOLVE_THREAD'; threadId: string; resolvedBy: CommentAuthor }\r\n | { type: 'REOPEN_THREAD'; threadId: string }\r\n | { type: 'ADD_COMMENT'; threadId: string; comment: Comment }\r\n | { type: 'UPDATE_COMMENT'; threadId: string; comment: Comment }\r\n | { type: 'DELETE_COMMENT'; threadId: string; commentId: string }\r\n | { type: 'ADD_REACTION'; threadId: string; commentId: string; emoji: string; user: CommentAuthor }\r\n | { type: 'REMOVE_REACTION'; threadId: string; commentId: string; emoji: string; userId: string }\r\n | { type: 'SET_ACTIVE_THREAD'; threadId: string | null }\r\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\r\n | { type: 'SET_FILTER'; filter: 'all' | 'open' | 'resolved' }\r\n | { type: 'SET_CURRENT_USER'; user: CommentAuthor | null }\r\n\r\n/** Initial comments state */\r\nconst initialState: CommentsState = {\r\n threads: [],\r\n activeThreadId: null,\r\n isPanelOpen: false,\r\n filter: 'all',\r\n currentUser: null,\r\n}\r\n\r\n/** Generate unique ID */\r\nfunction generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n}\r\n\r\n/** Comments reducer */\r\nfunction commentsReducer(state: CommentsState, action: CommentsAction): CommentsState {\r\n switch (action.type) {\r\n case 'SET_THREADS':\r\n return { ...state, threads: action.threads }\r\n\r\n case 'ADD_THREAD':\r\n return { ...state, threads: [...state.threads, action.thread] }\r\n\r\n case 'DELETE_THREAD':\r\n return {\r\n ...state,\r\n threads: state.threads.filter(t => t.id !== action.threadId),\r\n activeThreadId: state.activeThreadId === action.threadId ? null : state.activeThreadId,\r\n }\r\n\r\n case 'RESOLVE_THREAD':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, status: 'resolved' as const, resolvedAt: Date.now(), resolvedBy: action.resolvedBy }\r\n : t\r\n ),\r\n }\r\n\r\n case 'REOPEN_THREAD':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, status: 'open' as const, resolvedAt: undefined, resolvedBy: undefined }\r\n : t\r\n ),\r\n }\r\n\r\n case 'ADD_COMMENT':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, comments: [...t.comments, action.comment] }\r\n : t\r\n ),\r\n }\r\n\r\n case 'UPDATE_COMMENT':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? {\r\n ...t,\r\n comments: t.comments.map(c =>\r\n c.id === action.comment.id ? action.comment : c\r\n ),\r\n }\r\n : t\r\n ),\r\n }\r\n\r\n case 'DELETE_COMMENT':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? { ...t, comments: t.comments.filter(c => c.id !== action.commentId) }\r\n : t\r\n ),\r\n }\r\n\r\n case 'ADD_REACTION':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? {\r\n ...t,\r\n comments: t.comments.map(c => {\r\n if (c.id !== action.commentId) return c\r\n const reactions = c.reactions || []\r\n const existingReaction = reactions.find(r => r.emoji === action.emoji)\r\n if (existingReaction) {\r\n return {\r\n ...c,\r\n reactions: reactions.map(r =>\r\n r.emoji === action.emoji\r\n ? { ...r, users: [...r.users, action.user] }\r\n : r\r\n ),\r\n }\r\n }\r\n return {\r\n ...c,\r\n reactions: [...reactions, { emoji: action.emoji, users: [action.user] }],\r\n }\r\n }),\r\n }\r\n : t\r\n ),\r\n }\r\n\r\n case 'REMOVE_REACTION':\r\n return {\r\n ...state,\r\n threads: state.threads.map(t =>\r\n t.id === action.threadId\r\n ? {\r\n ...t,\r\n comments: t.comments.map(c => {\r\n if (c.id !== action.commentId) return c\r\n return {\r\n ...c,\r\n reactions: (c.reactions || [])\r\n .map(r =>\r\n r.emoji === action.emoji\r\n ? { ...r, users: r.users.filter(u => u.id !== action.userId) }\r\n : r\r\n )\r\n .filter(r => r.users.length > 0),\r\n }\r\n }),\r\n }\r\n : t\r\n ),\r\n }\r\n\r\n case 'SET_ACTIVE_THREAD':\r\n return { ...state, activeThreadId: action.threadId }\r\n\r\n case 'TOGGLE_PANEL':\r\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\r\n\r\n case 'SET_FILTER':\r\n return { ...state, filter: action.filter }\r\n\r\n case 'SET_CURRENT_USER':\r\n return { ...state, currentUser: action.user }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n/** Context value type */\r\ninterface CommentsContextValue {\r\n state: CommentsState\r\n config: CommentsConfig | null\r\n\r\n // Thread operations\r\n createThread: (range: CommentRange, initialComment: string) => CommentThread | null\r\n deleteThread: (threadId: string) => void\r\n resolveThread: (threadId: string) => void\r\n reopenThread: (threadId: string) => void\r\n\r\n // Comment operations\r\n addComment: (threadId: string, content: string) => Comment | null\r\n updateComment: (threadId: string, commentId: string, content: string) => void\r\n deleteComment: (threadId: string, commentId: string) => void\r\n\r\n // Reaction operations\r\n addReaction: (threadId: string, commentId: string, emoji: string) => void\r\n removeReaction: (threadId: string, commentId: string, emoji: string) => void\r\n\r\n // UI operations\r\n setActiveThread: (threadId: string | null) => void\r\n togglePanel: (isOpen?: boolean) => void\r\n setFilter: (filter: 'all' | 'open' | 'resolved') => void\r\n\r\n // Getters\r\n getThreadByRange: (from: number, to: number) => CommentThread | undefined\r\n getFilteredThreads: () => CommentThread[]\r\n\r\n // Event subscription\r\n subscribe: (callback: (event: CommentEvent) => void) => () => void\r\n\r\n isEnabled: boolean\r\n}\r\n\r\n/** Create context */\r\nconst CommentsContext = createContext<CommentsContextValue | null>(null)\r\n\r\n/** Provider props */\r\ninterface CommentsProviderProps {\r\n children: ReactNode\r\n config?: CommentsConfig\r\n initialThreads?: CommentThread[]\r\n onThreadsChange?: (threads: CommentThread[]) => void\r\n}\r\n\r\n/** Comments Provider Component */\r\nexport function CommentsProvider({\r\n children,\r\n config,\r\n initialThreads = [],\r\n onThreadsChange,\r\n}: CommentsProviderProps) {\r\n const [state, dispatch] = useReducer(commentsReducer, {\r\n ...initialState,\r\n threads: initialThreads,\r\n currentUser: config?.currentUser ?? null,\r\n })\r\n\r\n const subscribersRef = { current: new Set<(event: CommentEvent) => void>() }\r\n\r\n // Load initial threads\r\n useEffect(() => {\r\n if (config?.onLoad) {\r\n config.onLoad().then(threads => {\r\n dispatch({ type: 'SET_THREADS', threads })\r\n })\r\n }\r\n }, [config])\r\n\r\n // Notify on threads change\r\n useEffect(() => {\r\n onThreadsChange?.(state.threads)\r\n if (config?.onSave) {\r\n config.onSave(state.threads)\r\n }\r\n }, [state.threads, onThreadsChange, config])\r\n\r\n // Update current user when config changes\r\n useEffect(() => {\r\n if (config?.currentUser) {\r\n dispatch({ type: 'SET_CURRENT_USER', user: config.currentUser })\r\n }\r\n }, [config?.currentUser])\r\n\r\n /** Emit event to subscribers */\r\n const emitEvent = useCallback((event: CommentEvent) => {\r\n subscribersRef.current.forEach(callback => callback(event))\r\n }, [])\r\n\r\n /** Create a new thread */\r\n const createThread = useCallback((range: CommentRange, initialComment: string): CommentThread | null => {\r\n if (!state.currentUser) return null\r\n\r\n const threadId = generateId()\r\n const commentId = generateId()\r\n const now = Date.now()\r\n\r\n const comment: Comment = {\r\n id: commentId,\r\n threadId,\r\n content: initialComment,\r\n author: state.currentUser,\r\n createdAt: now,\r\n isEdited: false,\r\n }\r\n\r\n const thread: CommentThread = {\r\n id: threadId,\r\n range,\r\n comments: [comment],\r\n status: 'open',\r\n createdAt: now,\r\n }\r\n\r\n dispatch({ type: 'ADD_THREAD', thread })\r\n emitEvent({ type: 'thread-created', thread })\r\n return thread\r\n }, [state.currentUser, emitEvent])\r\n\r\n /** Delete a thread */\r\n const deleteThread = useCallback((threadId: string) => {\r\n if (config?.allowDelete === false) return\r\n dispatch({ type: 'DELETE_THREAD', threadId })\r\n emitEvent({ type: 'thread-deleted', threadId })\r\n }, [config, emitEvent])\r\n\r\n /** Resolve a thread */\r\n const resolveThread = useCallback((threadId: string) => {\r\n if (!state.currentUser || config?.allowResolve === false) return\r\n dispatch({ type: 'RESOLVE_THREAD', threadId, resolvedBy: state.currentUser })\r\n emitEvent({ type: 'thread-resolved', threadId, resolvedBy: state.currentUser })\r\n }, [state.currentUser, config, emitEvent])\r\n\r\n /** Reopen a thread */\r\n const reopenThread = useCallback((threadId: string) => {\r\n dispatch({ type: 'REOPEN_THREAD', threadId })\r\n emitEvent({ type: 'thread-reopened', threadId })\r\n }, [emitEvent])\r\n\r\n /** Add a comment to a thread */\r\n const addComment = useCallback((threadId: string, content: string): Comment | null => {\r\n if (!state.currentUser) return null\r\n\r\n const comment: Comment = {\r\n id: generateId(),\r\n threadId,\r\n content,\r\n author: state.currentUser,\r\n createdAt: Date.now(),\r\n isEdited: false,\r\n }\r\n\r\n dispatch({ type: 'ADD_COMMENT', threadId, comment })\r\n emitEvent({ type: 'comment-added', threadId, comment })\r\n return comment\r\n }, [state.currentUser, emitEvent])\r\n\r\n /** Update a comment */\r\n const updateComment = useCallback((threadId: string, commentId: string, content: string) => {\r\n if (config?.allowEdit === false) return\r\n\r\n const thread = state.threads.find(t => t.id === threadId)\r\n const existingComment = thread?.comments.find(c => c.id === commentId)\r\n if (!existingComment) return\r\n\r\n const updatedComment: Comment = {\r\n ...existingComment,\r\n content,\r\n updatedAt: Date.now(),\r\n isEdited: true,\r\n }\r\n\r\n dispatch({ type: 'UPDATE_COMMENT', threadId, comment: updatedComment })\r\n emitEvent({ type: 'comment-updated', threadId, comment: updatedComment })\r\n }, [state.threads, config, emitEvent])\r\n\r\n /** Delete a comment */\r\n const deleteComment = useCallback((threadId: string, commentId: string) => {\r\n if (config?.allowDelete === false) return\r\n dispatch({ type: 'DELETE_COMMENT', threadId, commentId })\r\n emitEvent({ type: 'comment-deleted', threadId, commentId })\r\n }, [config, emitEvent])\r\n\r\n /** Add a reaction */\r\n const addReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\r\n if (!state.currentUser || config?.allowReactions === false) return\r\n\r\n const allowedEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\r\n if (!allowedEmojis.includes(emoji)) return\r\n\r\n dispatch({ type: 'ADD_REACTION', threadId, commentId, emoji, user: state.currentUser })\r\n emitEvent({ type: 'reaction-added', threadId, commentId, emoji, user: state.currentUser })\r\n }, [state.currentUser, config, emitEvent])\r\n\r\n /** Remove a reaction */\r\n const removeReaction = useCallback((threadId: string, commentId: string, emoji: string) => {\r\n if (!state.currentUser) return\r\n dispatch({ type: 'REMOVE_REACTION', threadId, commentId, emoji, userId: state.currentUser.id })\r\n emitEvent({ type: 'reaction-removed', threadId, commentId, emoji, userId: state.currentUser.id })\r\n }, [state.currentUser, emitEvent])\r\n\r\n /** Set active thread */\r\n const setActiveThread = useCallback((threadId: string | null) => {\r\n dispatch({ type: 'SET_ACTIVE_THREAD', threadId })\r\n }, [])\r\n\r\n /** Toggle panel */\r\n const togglePanel = useCallback((isOpen?: boolean) => {\r\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\r\n }, [])\r\n\r\n /** Set filter */\r\n const setFilter = useCallback((filter: 'all' | 'open' | 'resolved') => {\r\n dispatch({ type: 'SET_FILTER', filter })\r\n }, [])\r\n\r\n /** Get thread by range */\r\n const getThreadByRange = useCallback((from: number, to: number) => {\r\n return state.threads.find(t => t.range.from === from && t.range.to === to)\r\n }, [state.threads])\r\n\r\n /** Get filtered threads */\r\n const getFilteredThreads = useCallback(() => {\r\n if (state.filter === 'all') return state.threads\r\n return state.threads.filter(t => t.status === state.filter)\r\n }, [state.threads, state.filter])\r\n\r\n /** Subscribe to events */\r\n const subscribe = useCallback((callback: (event: CommentEvent) => void) => {\r\n subscribersRef.current.add(callback)\r\n return () => {\r\n subscribersRef.current.delete(callback)\r\n }\r\n }, [])\r\n\r\n const value: CommentsContextValue = {\r\n state,\r\n config: config ?? null,\r\n createThread,\r\n deleteThread,\r\n resolveThread,\r\n reopenThread,\r\n addComment,\r\n updateComment,\r\n deleteComment,\r\n addReaction,\r\n removeReaction,\r\n setActiveThread,\r\n togglePanel,\r\n setFilter,\r\n getThreadByRange,\r\n getFilteredThreads,\r\n subscribe,\r\n isEnabled: !!config,\r\n }\r\n\r\n return (\r\n <CommentsContext.Provider value={value}>\r\n {children}\r\n </CommentsContext.Provider>\r\n )\r\n}\r\n\r\n/** Hook to use comments context */\r\nexport function useComments() {\r\n const context = useContext(CommentsContext)\r\n if (!context) {\r\n throw new Error('useComments must be used within a CommentsProvider')\r\n }\r\n return context\r\n}\r\n\r\n/** Hook to check if comments is available (doesn't throw) */\r\nexport function useCommentsOptional() {\r\n return useContext(CommentsContext)\r\n}\r\n\r\nexport default CommentsContext\r\n","/**\r\n * Comments Panel Component\r\n * Displays comment threads with reply functionality\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { useCommentsOptional } from './CommentsContext'\r\nimport type { CommentThread, Comment as CommentType } from './types'\r\nimport { DEFAULT_REACTION_EMOJIS } from './types'\r\n\r\ninterface CommentsPanelProps {\r\n /** Panel position */\r\n position?: 'left' | 'right'\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n/** Format relative time */\r\nfunction formatRelativeTime(timestamp: number): string {\r\n const now = Date.now()\r\n const diff = now - timestamp\r\n const minutes = Math.floor(diff / 60000)\r\n const hours = Math.floor(diff / 3600000)\r\n const days = Math.floor(diff / 86400000)\r\n\r\n if (minutes < 1) return 'Just now'\r\n if (minutes < 60) return `${minutes}m ago`\r\n if (hours < 24) return `${hours}h ago`\r\n if (days < 7) return `${days}d ago`\r\n\r\n return new Date(timestamp).toLocaleDateString()\r\n}\r\n\r\n/** Single comment component */\r\nfunction CommentItem({\r\n comment,\r\n threadId,\r\n isFirst,\r\n}: {\r\n comment: CommentType\r\n threadId: string\r\n isFirst: boolean\r\n}) {\r\n const comments = useCommentsOptional()\r\n const [isEditing, setIsEditing] = useState(false)\r\n const [editContent, setEditContent] = useState(comment.content)\r\n const [showReactions, setShowReactions] = useState(false)\r\n\r\n if (!comments) return null\r\n\r\n const { config, updateComment, deleteComment, addReaction, removeReaction, state } = comments\r\n const canEdit = config?.allowEdit !== false && comment.author.id === state.currentUser?.id\r\n const canDelete = config?.allowDelete !== false && comment.author.id === state.currentUser?.id\r\n const canReact = config?.allowReactions !== false\r\n const reactionEmojis = config?.reactionEmojis ?? DEFAULT_REACTION_EMOJIS\r\n\r\n const handleSaveEdit = () => {\r\n updateComment(threadId, comment.id, editContent)\r\n setIsEditing(false)\r\n }\r\n\r\n const handleToggleReaction = (emoji: string) => {\r\n const reaction = comment.reactions?.find(r => r.emoji === emoji)\r\n const hasReacted = reaction?.users.some(u => u.id === state.currentUser?.id)\r\n\r\n if (hasReacted) {\r\n removeReaction(threadId, comment.id, emoji)\r\n } else {\r\n addReaction(threadId, comment.id, emoji)\r\n }\r\n setShowReactions(false)\r\n }\r\n\r\n return (\r\n <div className={`rte-comment ${isFirst ? 'rte-comment-first' : ''}`}>\r\n <div className=\"rte-comment-header\">\r\n <div className=\"rte-comment-author\">\r\n {comment.author.avatar ? (\r\n <img src={comment.author.avatar} alt={comment.author.name} className=\"rte-comment-avatar\" />\r\n ) : (\r\n <div className=\"rte-comment-avatar-placeholder\">\r\n {comment.author.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n <span className=\"rte-comment-author-name\">{comment.author.name}</span>\r\n </div>\r\n <span className=\"rte-comment-time\">\r\n {formatRelativeTime(comment.createdAt)}\r\n {comment.isEdited && ' (edited)'}\r\n </span>\r\n </div>\r\n\r\n {isEditing ? (\r\n <div className=\"rte-comment-edit\">\r\n <textarea\r\n value={editContent}\r\n onChange={e => setEditContent(e.target.value)}\r\n className=\"rte-comment-edit-input\"\r\n />\r\n <div className=\"rte-comment-edit-actions\">\r\n <button onClick={handleSaveEdit} className=\"rte-comment-btn-save\">Save</button>\r\n <button onClick={() => setIsEditing(false)} className=\"rte-comment-btn-cancel\">Cancel</button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"rte-comment-content\" dangerouslySetInnerHTML={{ __html: comment.content }} />\r\n )}\r\n\r\n {/* Reactions */}\r\n {comment.reactions && comment.reactions.length > 0 && (\r\n <div className=\"rte-comment-reactions\">\r\n {comment.reactions.map(reaction => (\r\n <button\r\n key={reaction.emoji}\r\n className={`rte-comment-reaction ${\r\n reaction.users.some(u => u.id === state.currentUser?.id) ? 'active' : ''\r\n }`}\r\n onClick={() => handleToggleReaction(reaction.emoji)}\r\n title={reaction.users.map(u => u.name).join(', ')}\r\n >\r\n {reaction.emoji} {reaction.users.length}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"rte-comment-actions\">\r\n {canReact && (\r\n <div className=\"rte-comment-reaction-picker\">\r\n <button\r\n className=\"rte-comment-action-btn\"\r\n onClick={() => setShowReactions(!showReactions)}\r\n >\r\n ๐Ÿ˜Š\r\n </button>\r\n {showReactions && (\r\n <div className=\"rte-comment-reaction-dropdown\">\r\n {reactionEmojis.map(emoji => (\r\n <button key={emoji} onClick={() => handleToggleReaction(emoji)}>\r\n {emoji}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {canEdit && (\r\n <button className=\"rte-comment-action-btn\" onClick={() => setIsEditing(true)}>\r\n Edit\r\n </button>\r\n )}\r\n {canDelete && !isFirst && (\r\n <button\r\n className=\"rte-comment-action-btn rte-comment-action-delete\"\r\n onClick={() => deleteComment(threadId, comment.id)}\r\n >\r\n Delete\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Thread component */\r\nfunction ThreadItem({ thread }: { thread: CommentThread }) {\r\n const comments = useCommentsOptional()\r\n const [replyContent, setReplyContent] = useState('')\r\n const [showReply, setShowReply] = useState(false)\r\n\r\n if (!comments) return null\r\n\r\n const { state, setActiveThread, addComment, resolveThread, reopenThread, deleteThread, config } = comments\r\n const isActive = state.activeThreadId === thread.id\r\n const canResolve = config?.allowResolve !== false\r\n\r\n const handleReply = () => {\r\n if (replyContent.trim()) {\r\n addComment(thread.id, replyContent)\r\n setReplyContent('')\r\n setShowReply(false)\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={`rte-thread ${isActive ? 'rte-thread-active' : ''} ${\r\n thread.status === 'resolved' ? 'rte-thread-resolved' : ''\r\n }`}\r\n onClick={() => setActiveThread(thread.id)}\r\n >\r\n {/* Thread header */}\r\n <div className=\"rte-thread-header\">\r\n <div className=\"rte-thread-quote\">\"{thread.range.text.slice(0, 50)}...\"</div>\r\n <div className=\"rte-thread-meta\">\r\n <span className={`rte-thread-status rte-thread-status-${thread.status}`}>\r\n {thread.status}\r\n </span>\r\n <span className=\"rte-thread-count\">{thread.comments.length} comment{thread.comments.length !== 1 ? 's' : ''}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Comments */}\r\n <div className=\"rte-thread-comments\">\r\n {thread.comments.map((comment, index) => (\r\n <CommentItem\r\n key={comment.id}\r\n comment={comment}\r\n threadId={thread.id}\r\n isFirst={index === 0}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Reply form */}\r\n {thread.status === 'open' && (\r\n <div className=\"rte-thread-reply\">\r\n {showReply ? (\r\n <>\r\n <textarea\r\n value={replyContent}\r\n onChange={e => setReplyContent(e.target.value)}\r\n placeholder=\"Write a reply...\"\r\n className=\"rte-thread-reply-input\"\r\n />\r\n <div className=\"rte-thread-reply-actions\">\r\n <button onClick={handleReply} className=\"rte-btn-primary\" disabled={!replyContent.trim()}>\r\n Reply\r\n </button>\r\n <button onClick={() => setShowReply(false)} className=\"rte-btn-secondary\">\r\n Cancel\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <button onClick={() => setShowReply(true)} className=\"rte-thread-reply-btn\">\r\n Reply\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Thread actions */}\r\n <div className=\"rte-thread-actions\">\r\n {canResolve && thread.status === 'open' && (\r\n <button onClick={() => resolveThread(thread.id)} className=\"rte-btn-resolve\">\r\n โœ“ Resolve\r\n </button>\r\n )}\r\n {thread.status === 'resolved' && (\r\n <button onClick={() => reopenThread(thread.id)} className=\"rte-btn-reopen\">\r\n Reopen\r\n </button>\r\n )}\r\n <button\r\n onClick={e => {\r\n e.stopPropagation()\r\n deleteThread(thread.id)\r\n }}\r\n className=\"rte-btn-delete-thread\"\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Comments Panel Component */\r\nexport function CommentsPanel({ position = 'right', className = '' }: CommentsPanelProps) {\r\n const comments = useCommentsOptional()\r\n\r\n if (!comments?.isEnabled || !comments.state.isPanelOpen) {\r\n return null\r\n }\r\n\r\n const { state, togglePanel, setFilter, getFilteredThreads } = comments\r\n const filteredThreads = getFilteredThreads()\r\n\r\n return (\r\n <div className={`rte-comments-panel rte-comments-panel-${position} ${className}`}>\r\n {/* Panel header */}\r\n <div className=\"rte-comments-panel-header\">\r\n <h3>Comments</h3>\r\n <button onClick={() => togglePanel(false)} className=\"rte-comments-close-btn\">ร—</button>\r\n </div>\r\n\r\n {/* Filter tabs */}\r\n <div className=\"rte-comments-filters\">\r\n {(['all', 'open', 'resolved'] as const).map(filter => (\r\n <button\r\n key={filter}\r\n className={`rte-comments-filter ${state.filter === filter ? 'active' : ''}`}\r\n onClick={() => setFilter(filter)}\r\n >\r\n {filter.charAt(0).toUpperCase() + filter.slice(1)}\r\n <span className=\"rte-comments-filter-count\">\r\n {filter === 'all'\r\n ? state.threads.length\r\n : state.threads.filter(t => t.status === filter).length}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Threads list */}\r\n <div className=\"rte-comments-list\">\r\n {filteredThreads.length === 0 ? (\r\n <div className=\"rte-comments-empty\">\r\n {state.filter === 'all'\r\n ? 'No comments yet. Select text and add a comment.'\r\n : `No ${state.filter} comments.`}\r\n </div>\r\n ) : (\r\n filteredThreads.map(thread => (\r\n <ThreadItem key={thread.id} thread={thread} />\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default CommentsPanel\r\n","/**\r\n * Version History Context\r\n * Provides version history state and methods to child components\r\n */\r\n\r\nimport { createContext, useContext, useReducer, useCallback, useEffect, useRef, ReactNode } from 'react'\r\nimport type {\r\n VersionHistoryState,\r\n VersionHistoryConfig,\r\n Version,\r\n VersionComparison,\r\n VersionChange,\r\n VersionHistoryEvent,\r\n} from './types'\r\n\r\n/** Actions for version history reducer */\r\ntype VersionHistoryAction =\r\n | { type: 'SET_VERSIONS'; versions: Version[] }\r\n | { type: 'ADD_VERSION'; version: Version }\r\n | { type: 'DELETE_VERSION'; versionId: string }\r\n | { type: 'PIN_VERSION'; versionId: string }\r\n | { type: 'UNPIN_VERSION'; versionId: string }\r\n | { type: 'RENAME_VERSION'; versionId: string; title: string }\r\n | { type: 'SET_VIEWING_VERSION'; versionId: string | null }\r\n | { type: 'TOGGLE_PANEL'; isOpen?: boolean }\r\n | { type: 'START_COMPARE'; fromId: string; toId: string }\r\n | { type: 'STOP_COMPARE' }\r\n | { type: 'SET_AUTO_SAVE'; enabled: boolean }\r\n | { type: 'SET_AUTO_SAVE_INTERVAL'; interval: number }\r\n\r\n/** Initial version history state */\r\nconst initialState: VersionHistoryState = {\r\n versions: [],\r\n viewingVersionId: null,\r\n isPanelOpen: false,\r\n isComparing: false,\r\n compareFromId: null,\r\n compareToId: null,\r\n autoSaveEnabled: true,\r\n autoSaveInterval: 60000,\r\n}\r\n\r\n/** Generate unique ID */\r\nfunction generateId(): string {\r\n return `v-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n}\r\n\r\n/** Version history reducer */\r\nfunction versionHistoryReducer(state: VersionHistoryState, action: VersionHistoryAction): VersionHistoryState {\r\n switch (action.type) {\r\n case 'SET_VERSIONS':\r\n return { ...state, versions: action.versions }\r\n\r\n case 'ADD_VERSION':\r\n return {\r\n ...state,\r\n versions: [action.version, ...state.versions],\r\n }\r\n\r\n case 'DELETE_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.filter(v => v.id !== action.versionId),\r\n viewingVersionId: state.viewingVersionId === action.versionId ? null : state.viewingVersionId,\r\n }\r\n\r\n case 'PIN_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.map(v =>\r\n v.id === action.versionId ? { ...v, isPinned: true } : v\r\n ),\r\n }\r\n\r\n case 'UNPIN_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.map(v =>\r\n v.id === action.versionId ? { ...v, isPinned: false } : v\r\n ),\r\n }\r\n\r\n case 'RENAME_VERSION':\r\n return {\r\n ...state,\r\n versions: state.versions.map(v =>\r\n v.id === action.versionId ? { ...v, title: action.title } : v\r\n ),\r\n }\r\n\r\n case 'SET_VIEWING_VERSION':\r\n return { ...state, viewingVersionId: action.versionId }\r\n\r\n case 'TOGGLE_PANEL':\r\n return { ...state, isPanelOpen: action.isOpen ?? !state.isPanelOpen }\r\n\r\n case 'START_COMPARE':\r\n return {\r\n ...state,\r\n isComparing: true,\r\n compareFromId: action.fromId,\r\n compareToId: action.toId,\r\n }\r\n\r\n case 'STOP_COMPARE':\r\n return {\r\n ...state,\r\n isComparing: false,\r\n compareFromId: null,\r\n compareToId: null,\r\n }\r\n\r\n case 'SET_AUTO_SAVE':\r\n return { ...state, autoSaveEnabled: action.enabled }\r\n\r\n case 'SET_AUTO_SAVE_INTERVAL':\r\n return { ...state, autoSaveInterval: action.interval }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n/** Count words in text */\r\nfunction countWords(text: string): number {\r\n return text.trim().split(/\\s+/).filter(Boolean).length\r\n}\r\n\r\n/** Simple diff algorithm for version comparison */\r\nfunction computeDiff(oldText: string, newText: string): VersionChange[] {\r\n const changes: VersionChange[] = []\r\n const oldLines = oldText.split('\\n')\r\n const newLines = newText.split('\\n')\r\n\r\n let i = 0\r\n let j = 0\r\n\r\n while (i < oldLines.length || j < newLines.length) {\r\n if (i >= oldLines.length) {\r\n // Remaining new lines are additions\r\n changes.push({\r\n type: 'addition',\r\n content: newLines[j],\r\n position: j,\r\n })\r\n j++\r\n } else if (j >= newLines.length) {\r\n // Remaining old lines are deletions\r\n changes.push({\r\n type: 'deletion',\r\n content: oldLines[i],\r\n position: i,\r\n })\r\n i++\r\n } else if (oldLines[i] === newLines[j]) {\r\n // Lines match, move on\r\n i++\r\n j++\r\n } else {\r\n // Lines differ - check if it's a modification or add/delete\r\n const oldLineInNew = newLines.indexOf(oldLines[i], j)\r\n const newLineInOld = oldLines.indexOf(newLines[j], i)\r\n\r\n if (oldLineInNew === -1 && newLineInOld === -1) {\r\n // Modification\r\n changes.push({\r\n type: 'modification',\r\n content: `${oldLines[i]} -> ${newLines[j]}`,\r\n position: i,\r\n })\r\n i++\r\n j++\r\n } else if (oldLineInNew === -1) {\r\n // Deletion\r\n changes.push({\r\n type: 'deletion',\r\n content: oldLines[i],\r\n position: i,\r\n })\r\n i++\r\n } else {\r\n // Addition\r\n changes.push({\r\n type: 'addition',\r\n content: newLines[j],\r\n position: j,\r\n })\r\n j++\r\n }\r\n }\r\n }\r\n\r\n return changes\r\n}\r\n\r\n/** Context value type */\r\ninterface VersionHistoryContextValue {\r\n state: VersionHistoryState\r\n config: VersionHistoryConfig | null\r\n\r\n // Version operations\r\n createVersion: (content: string, jsonContent?: unknown, options?: { title?: string; isAutoSave?: boolean }) => Version | null\r\n deleteVersion: (versionId: string) => void\r\n restoreVersion: (versionId: string) => string | null\r\n pinVersion: (versionId: string) => void\r\n unpinVersion: (versionId: string) => void\r\n renameVersion: (versionId: string, title: string) => void\r\n\r\n // Viewing operations\r\n viewVersion: (versionId: string | null) => void\r\n getVersionContent: (versionId: string) => string | null\r\n\r\n // Comparison operations\r\n compareVersions: (fromId: string, toId: string) => VersionComparison | null\r\n startCompare: (fromId: string, toId: string) => void\r\n stopCompare: () => void\r\n\r\n // UI operations\r\n togglePanel: (isOpen?: boolean) => void\r\n setAutoSave: (enabled: boolean) => void\r\n\r\n // Getters\r\n getVersion: (versionId: string) => Version | undefined\r\n getLatestVersion: () => Version | undefined\r\n getPinnedVersions: () => Version[]\r\n\r\n // Event subscription\r\n subscribe: (callback: (event: VersionHistoryEvent) => void) => () => void\r\n\r\n isEnabled: boolean\r\n}\r\n\r\n/** Create context */\r\nconst VersionHistoryContext = createContext<VersionHistoryContextValue | null>(null)\r\n\r\n/** Provider props */\r\ninterface VersionHistoryProviderProps {\r\n children: ReactNode\r\n config?: VersionHistoryConfig\r\n initialVersions?: Version[]\r\n onVersionsChange?: (versions: Version[]) => void\r\n getCurrentContent?: () => { html: string; json?: unknown; text: string }\r\n}\r\n\r\n/** Version History Provider Component */\r\nexport function VersionHistoryProvider({\r\n children,\r\n config,\r\n initialVersions = [],\r\n onVersionsChange,\r\n getCurrentContent,\r\n}: VersionHistoryProviderProps) {\r\n const [state, dispatch] = useReducer(versionHistoryReducer, {\r\n ...initialState,\r\n versions: initialVersions,\r\n autoSaveEnabled: config?.autoSave ?? true,\r\n autoSaveInterval: config?.autoSaveInterval ?? 60000,\r\n })\r\n\r\n const subscribersRef = useRef(new Set<(event: VersionHistoryEvent) => void>())\r\n const autoSaveTimerRef = useRef<NodeJS.Timeout | null>(null)\r\n const lastContentRef = useRef<string>('')\r\n const versionNumberRef = useRef(initialVersions.length)\r\n\r\n // Load initial versions\r\n useEffect(() => {\r\n if (config?.onLoad) {\r\n config.onLoad().then(versions => {\r\n dispatch({ type: 'SET_VERSIONS', versions })\r\n versionNumberRef.current = versions.length\r\n })\r\n }\r\n }, [config])\r\n\r\n // Notify on versions change\r\n useEffect(() => {\r\n onVersionsChange?.(state.versions)\r\n if (config?.onSave) {\r\n config.onSave(state.versions)\r\n }\r\n }, [state.versions, onVersionsChange, config])\r\n\r\n // Auto-save timer\r\n useEffect(() => {\r\n if (!state.autoSaveEnabled || !config || !getCurrentContent) return\r\n\r\n autoSaveTimerRef.current = setInterval(() => {\r\n const { html, json } = getCurrentContent()\r\n\r\n // Only save if content changed\r\n if (html !== lastContentRef.current) {\r\n lastContentRef.current = html\r\n createVersion(html, json, { isAutoSave: true })\r\n }\r\n }, state.autoSaveInterval)\r\n\r\n return () => {\r\n if (autoSaveTimerRef.current) {\r\n clearInterval(autoSaveTimerRef.current)\r\n }\r\n }\r\n }, [state.autoSaveEnabled, state.autoSaveInterval, config, getCurrentContent])\r\n\r\n /** Emit event to subscribers */\r\n const emitEvent = useCallback((event: VersionHistoryEvent) => {\r\n subscribersRef.current.forEach(callback => callback(event))\r\n }, [])\r\n\r\n /** Create a new version */\r\n const createVersion = useCallback((\r\n content: string,\r\n jsonContent?: unknown,\r\n options?: { title?: string; isAutoSave?: boolean }\r\n ): Version | null => {\r\n if (!config?.currentUser) return null\r\n\r\n // Check max versions\r\n const maxVersions = config.maxVersions ?? 100\r\n let versions = state.versions\r\n\r\n if (versions.length >= maxVersions) {\r\n // Remove oldest non-pinned version\r\n const oldestUnpinned = [...versions].reverse().find(v => !v.isPinned)\r\n if (oldestUnpinned) {\r\n versions = versions.filter(v => v.id !== oldestUnpinned.id)\r\n }\r\n }\r\n\r\n versionNumberRef.current++\r\n const textContent = content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\r\n\r\n const version: Version = {\r\n id: generateId(),\r\n number: versionNumberRef.current,\r\n title: options?.title,\r\n content,\r\n jsonContent,\r\n textContent,\r\n author: config.currentUser,\r\n createdAt: Date.now(),\r\n wordCount: countWords(textContent),\r\n characterCount: textContent.length,\r\n isAutoSave: options?.isAutoSave ?? false,\r\n isPinned: false,\r\n }\r\n\r\n dispatch({ type: 'ADD_VERSION', version })\r\n emitEvent({ type: 'version-created', version })\r\n return version\r\n }, [config, state.versions, emitEvent])\r\n\r\n /** Delete a version */\r\n const deleteVersion = useCallback((versionId: string) => {\r\n dispatch({ type: 'DELETE_VERSION', versionId })\r\n emitEvent({ type: 'version-deleted', versionId })\r\n }, [emitEvent])\r\n\r\n /** Restore a version */\r\n const restoreVersion = useCallback((versionId: string): string | null => {\r\n const version = state.versions.find(v => v.id === versionId)\r\n if (!version) return null\r\n\r\n config?.onRestore?.(version)\r\n emitEvent({ type: 'version-restored', versionId })\r\n return version.content\r\n }, [state.versions, config, emitEvent])\r\n\r\n /** Pin a version */\r\n const pinVersion = useCallback((versionId: string) => {\r\n dispatch({ type: 'PIN_VERSION', versionId })\r\n emitEvent({ type: 'version-pinned', versionId })\r\n }, [emitEvent])\r\n\r\n /** Unpin a version */\r\n const unpinVersion = useCallback((versionId: string) => {\r\n dispatch({ type: 'UNPIN_VERSION', versionId })\r\n emitEvent({ type: 'version-unpinned', versionId })\r\n }, [emitEvent])\r\n\r\n /** Rename a version */\r\n const renameVersion = useCallback((versionId: string, title: string) => {\r\n dispatch({ type: 'RENAME_VERSION', versionId, title })\r\n emitEvent({ type: 'version-renamed', versionId, title })\r\n }, [emitEvent])\r\n\r\n /** View a version */\r\n const viewVersion = useCallback((versionId: string | null) => {\r\n dispatch({ type: 'SET_VIEWING_VERSION', versionId })\r\n }, [])\r\n\r\n /** Get version content */\r\n const getVersionContent = useCallback((versionId: string): string | null => {\r\n const version = state.versions.find(v => v.id === versionId)\r\n return version?.content ?? null\r\n }, [state.versions])\r\n\r\n /** Compare two versions */\r\n const compareVersions = useCallback((fromId: string, toId: string): VersionComparison | null => {\r\n const fromVersion = state.versions.find(v => v.id === fromId)\r\n const toVersion = state.versions.find(v => v.id === toId)\r\n\r\n if (!fromVersion || !toVersion) return null\r\n\r\n const changes = computeDiff(fromVersion.textContent, toVersion.textContent)\r\n\r\n return {\r\n fromVersionId: fromId,\r\n toVersionId: toId,\r\n changes,\r\n stats: {\r\n additions: changes.filter(c => c.type === 'addition').length,\r\n deletions: changes.filter(c => c.type === 'deletion').length,\r\n modifications: changes.filter(c => c.type === 'modification').length,\r\n },\r\n }\r\n }, [state.versions])\r\n\r\n /** Start comparing versions */\r\n const startCompare = useCallback((fromId: string, toId: string) => {\r\n dispatch({ type: 'START_COMPARE', fromId, toId })\r\n }, [])\r\n\r\n /** Stop comparing versions */\r\n const stopCompare = useCallback(() => {\r\n dispatch({ type: 'STOP_COMPARE' })\r\n }, [])\r\n\r\n /** Toggle panel */\r\n const togglePanel = useCallback((isOpen?: boolean) => {\r\n dispatch({ type: 'TOGGLE_PANEL', isOpen })\r\n }, [])\r\n\r\n /** Set auto-save */\r\n const setAutoSave = useCallback((enabled: boolean) => {\r\n dispatch({ type: 'SET_AUTO_SAVE', enabled })\r\n emitEvent({ type: 'auto-save-toggled', enabled })\r\n }, [emitEvent])\r\n\r\n /** Get a version by ID */\r\n const getVersion = useCallback((versionId: string) => {\r\n return state.versions.find(v => v.id === versionId)\r\n }, [state.versions])\r\n\r\n /** Get latest version */\r\n const getLatestVersion = useCallback(() => {\r\n return state.versions[0]\r\n }, [state.versions])\r\n\r\n /** Get pinned versions */\r\n const getPinnedVersions = useCallback(() => {\r\n return state.versions.filter(v => v.isPinned)\r\n }, [state.versions])\r\n\r\n /** Subscribe to events */\r\n const subscribe = useCallback((callback: (event: VersionHistoryEvent) => void) => {\r\n subscribersRef.current.add(callback)\r\n return () => {\r\n subscribersRef.current.delete(callback)\r\n }\r\n }, [])\r\n\r\n const value: VersionHistoryContextValue = {\r\n state,\r\n config: config ?? null,\r\n createVersion,\r\n deleteVersion,\r\n restoreVersion,\r\n pinVersion,\r\n unpinVersion,\r\n renameVersion,\r\n viewVersion,\r\n getVersionContent,\r\n compareVersions,\r\n startCompare,\r\n stopCompare,\r\n togglePanel,\r\n setAutoSave,\r\n getVersion,\r\n getLatestVersion,\r\n getPinnedVersions,\r\n subscribe,\r\n isEnabled: !!config,\r\n }\r\n\r\n return (\r\n <VersionHistoryContext.Provider value={value}>\r\n {children}\r\n </VersionHistoryContext.Provider>\r\n )\r\n}\r\n\r\n/** Hook to use version history context */\r\nexport function useVersionHistory() {\r\n const context = useContext(VersionHistoryContext)\r\n if (!context) {\r\n throw new Error('useVersionHistory must be used within a VersionHistoryProvider')\r\n }\r\n return context\r\n}\r\n\r\n/** Hook to check if version history is available (doesn't throw) */\r\nexport function useVersionHistoryOptional() {\r\n return useContext(VersionHistoryContext)\r\n}\r\n\r\nexport default VersionHistoryContext\r\n","/**\r\n * Version History Panel Component\r\n * Displays version history with restore and compare functionality\r\n */\r\n\r\nimport { useState } from 'react'\r\nimport { useVersionHistoryOptional } from './VersionHistoryContext'\r\nimport type { Version } from './types'\r\n\r\ninterface VersionHistoryPanelProps {\r\n /** Panel position */\r\n position?: 'left' | 'right'\r\n /** Custom class name */\r\n className?: string\r\n}\r\n\r\n/** Format date */\r\nfunction formatDate(timestamp: number): string {\r\n const date = new Date(timestamp)\r\n const now = new Date()\r\n const isToday = date.toDateString() === now.toDateString()\r\n\r\n if (isToday) {\r\n return `Today at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\r\n }\r\n\r\n const yesterday = new Date(now)\r\n yesterday.setDate(yesterday.getDate() - 1)\r\n if (date.toDateString() === yesterday.toDateString()) {\r\n return `Yesterday at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`\r\n }\r\n\r\n return date.toLocaleDateString([], {\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n })\r\n}\r\n\r\n/** Single version item */\r\nfunction VersionItem({\r\n version,\r\n isViewing,\r\n isCompareFrom,\r\n isCompareTo,\r\n onView,\r\n onRestore,\r\n onPin,\r\n onRename,\r\n onDelete,\r\n onCompareSelect,\r\n}: {\r\n version: Version\r\n isViewing: boolean\r\n isCompareFrom: boolean\r\n isCompareTo: boolean\r\n onView: () => void\r\n onRestore: () => void\r\n onPin: () => void\r\n onRename: (title: string) => void\r\n onDelete: () => void\r\n onCompareSelect: () => void\r\n}) {\r\n const [isRenaming, setIsRenaming] = useState(false)\r\n const [newTitle, setNewTitle] = useState(version.title || '')\r\n\r\n const handleRename = () => {\r\n onRename(newTitle)\r\n setIsRenaming(false)\r\n }\r\n\r\n return (\r\n <div\r\n className={`rte-version-item ${isViewing ? 'rte-version-viewing' : ''} ${\r\n isCompareFrom ? 'rte-version-compare-from' : ''\r\n } ${isCompareTo ? 'rte-version-compare-to' : ''}`}\r\n >\r\n {/* Version header */}\r\n <div className=\"rte-version-header\" onClick={onView}>\r\n <div className=\"rte-version-info\">\r\n {isRenaming ? (\r\n <input\r\n type=\"text\"\r\n value={newTitle}\r\n onChange={e => setNewTitle(e.target.value)}\r\n onBlur={handleRename}\r\n onKeyDown={e => e.key === 'Enter' && handleRename()}\r\n className=\"rte-version-rename-input\"\r\n onClick={e => e.stopPropagation()}\r\n autoFocus\r\n />\r\n ) : (\r\n <span className=\"rte-version-title\">\r\n {version.title || `Version ${version.number}`}\r\n {version.isPinned && <span className=\"rte-version-pin-icon\">๐Ÿ“Œ</span>}\r\n {version.isAutoSave && <span className=\"rte-version-auto-badge\">Auto</span>}\r\n </span>\r\n )}\r\n <span className=\"rte-version-time\">{formatDate(version.createdAt)}</span>\r\n </div>\r\n <div className=\"rte-version-author\">\r\n {version.author.avatar ? (\r\n <img src={version.author.avatar} alt={version.author.name} className=\"rte-version-avatar\" />\r\n ) : (\r\n <div className=\"rte-version-avatar-placeholder\">\r\n {version.author.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n <span>{version.author.name}</span>\r\n </div>\r\n </div>\r\n\r\n {/* Version stats */}\r\n <div className=\"rte-version-stats\">\r\n <span>{version.wordCount} words</span>\r\n <span>{version.characterCount} chars</span>\r\n </div>\r\n\r\n {/* Version actions */}\r\n <div className=\"rte-version-actions\">\r\n <button onClick={onRestore} className=\"rte-version-btn\" title=\"Restore this version\">\r\n โ†บ Restore\r\n </button>\r\n <button onClick={onCompareSelect} className=\"rte-version-btn\" title=\"Compare with another version\">\r\n โ‡„ Compare\r\n </button>\r\n <button onClick={onPin} className=\"rte-version-btn\" title={version.isPinned ? 'Unpin' : 'Pin'}>\r\n {version.isPinned ? '๐Ÿ“Œ Unpin' : '๐Ÿ“Œ Pin'}\r\n </button>\r\n <button\r\n onClick={() => setIsRenaming(true)}\r\n className=\"rte-version-btn\"\r\n title=\"Rename version\"\r\n >\r\n โœ๏ธ\r\n </button>\r\n {!version.isPinned && (\r\n <button onClick={onDelete} className=\"rte-version-btn rte-version-btn-delete\" title=\"Delete\">\r\n ๐Ÿ—‘๏ธ\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Version comparison view */\r\nfunction ComparisonView({\r\n fromVersion,\r\n toVersion,\r\n onClose,\r\n}: {\r\n fromVersion: Version\r\n toVersion: Version\r\n onClose: () => void\r\n}) {\r\n const versionHistory = useVersionHistoryOptional()\r\n if (!versionHistory) return null\r\n\r\n const comparison = versionHistory.compareVersions(fromVersion.id, toVersion.id)\r\n\r\n return (\r\n <div className=\"rte-version-comparison\">\r\n <div className=\"rte-version-comparison-header\">\r\n <h4>Comparing Versions</h4>\r\n <button onClick={onClose} className=\"rte-version-comparison-close\">ร—</button>\r\n </div>\r\n\r\n <div className=\"rte-version-comparison-info\">\r\n <div className=\"rte-version-comparison-from\">\r\n <span className=\"rte-version-comparison-label\">From:</span>\r\n {fromVersion.title || `Version ${fromVersion.number}`}\r\n </div>\r\n <span className=\"rte-version-comparison-arrow\">โ†’</span>\r\n <div className=\"rte-version-comparison-to\">\r\n <span className=\"rte-version-comparison-label\">To:</span>\r\n {toVersion.title || `Version ${toVersion.number}`}\r\n </div>\r\n </div>\r\n\r\n {comparison && (\r\n <div className=\"rte-version-comparison-stats\">\r\n <span className=\"rte-comparison-stat rte-comparison-additions\">\r\n +{comparison.stats.additions} additions\r\n </span>\r\n <span className=\"rte-comparison-stat rte-comparison-deletions\">\r\n -{comparison.stats.deletions} deletions\r\n </span>\r\n <span className=\"rte-comparison-stat rte-comparison-modifications\">\r\n ~{comparison.stats.modifications} modifications\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div className=\"rte-version-comparison-diff\">\r\n {comparison?.changes.map((change, index) => (\r\n <div key={index} className={`rte-diff-line rte-diff-${change.type}`}>\r\n <span className=\"rte-diff-indicator\">\r\n {change.type === 'addition' ? '+' : change.type === 'deletion' ? '-' : '~'}\r\n </span>\r\n <span className=\"rte-diff-content\">{change.content}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n/** Version History Panel Component */\r\nexport function VersionHistoryPanel({ position = 'right', className = '' }: VersionHistoryPanelProps) {\r\n const versionHistory = useVersionHistoryOptional()\r\n const [compareFromId, setCompareFromId] = useState<string | null>(null)\r\n\r\n if (!versionHistory?.isEnabled || !versionHistory.state.isPanelOpen) {\r\n return null\r\n }\r\n\r\n const {\r\n state,\r\n togglePanel,\r\n viewVersion,\r\n restoreVersion,\r\n pinVersion,\r\n unpinVersion,\r\n renameVersion,\r\n deleteVersion,\r\n setAutoSave,\r\n getVersion,\r\n createVersion,\r\n stopCompare,\r\n } = versionHistory\r\n\r\n const handleRestore = (versionId: string) => {\r\n const content = restoreVersion(versionId)\r\n if (content) {\r\n viewVersion(null) // Go back to current\r\n }\r\n }\r\n\r\n const handleCompareSelect = (versionId: string) => {\r\n if (!compareFromId) {\r\n setCompareFromId(versionId)\r\n } else {\r\n versionHistory.startCompare(compareFromId, versionId)\r\n setCompareFromId(null)\r\n }\r\n }\r\n\r\n const handleCancelCompare = () => {\r\n setCompareFromId(null)\r\n stopCompare()\r\n }\r\n\r\n // Get versions for comparison view\r\n const compareFromVersion = state.compareFromId ? getVersion(state.compareFromId) : undefined\r\n const compareToVersion = state.compareToId ? getVersion(state.compareToId) : undefined\r\n\r\n return (\r\n <div className={`rte-version-panel rte-version-panel-${position} ${className}`}>\r\n {/* Panel header */}\r\n <div className=\"rte-version-panel-header\">\r\n <h3>Version History</h3>\r\n <button onClick={() => togglePanel(false)} className=\"rte-version-close-btn\">ร—</button>\r\n </div>\r\n\r\n {/* Auto-save toggle */}\r\n <div className=\"rte-version-autosave\">\r\n <label className=\"rte-version-autosave-label\">\r\n <input\r\n type=\"checkbox\"\r\n checked={state.autoSaveEnabled}\r\n onChange={e => setAutoSave(e.target.checked)}\r\n />\r\n Auto-save versions\r\n </label>\r\n <button\r\n onClick={() => createVersion('', undefined, { isAutoSave: false })}\r\n className=\"rte-version-save-btn\"\r\n >\r\n Save Now\r\n </button>\r\n </div>\r\n\r\n {/* Compare mode indicator */}\r\n {compareFromId && !state.isComparing && (\r\n <div className=\"rte-version-compare-mode\">\r\n <span>Select another version to compare</span>\r\n <button onClick={handleCancelCompare}>Cancel</button>\r\n </div>\r\n )}\r\n\r\n {/* Comparison view */}\r\n {state.isComparing && compareFromVersion && compareToVersion && (\r\n <ComparisonView\r\n fromVersion={compareFromVersion}\r\n toVersion={compareToVersion}\r\n onClose={handleCancelCompare}\r\n />\r\n )}\r\n\r\n {/* Versions list */}\r\n {!state.isComparing && (\r\n <div className=\"rte-version-list\">\r\n {state.versions.length === 0 ? (\r\n <div className=\"rte-version-empty\">\r\n No versions saved yet. Changes will be auto-saved periodically.\r\n </div>\r\n ) : (\r\n <>\r\n {/* Pinned versions */}\r\n {state.versions.some(v => v.isPinned) && (\r\n <div className=\"rte-version-section\">\r\n <div className=\"rte-version-section-title\">๐Ÿ“Œ Pinned</div>\r\n {state.versions\r\n .filter(v => v.isPinned)\r\n .map(version => (\r\n <VersionItem\r\n key={version.id}\r\n version={version}\r\n isViewing={state.viewingVersionId === version.id}\r\n isCompareFrom={compareFromId === version.id}\r\n isCompareTo={false}\r\n onView={() => viewVersion(version.id)}\r\n onRestore={() => handleRestore(version.id)}\r\n onPin={() => unpinVersion(version.id)}\r\n onRename={title => renameVersion(version.id, title)}\r\n onDelete={() => deleteVersion(version.id)}\r\n onCompareSelect={() => handleCompareSelect(version.id)}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Recent versions */}\r\n <div className=\"rte-version-section\">\r\n <div className=\"rte-version-section-title\">Recent</div>\r\n {state.versions\r\n .filter(v => !v.isPinned)\r\n .map(version => (\r\n <VersionItem\r\n key={version.id}\r\n version={version}\r\n isViewing={state.viewingVersionId === version.id}\r\n isCompareFrom={compareFromId === version.id}\r\n isCompareTo={false}\r\n onView={() => viewVersion(version.id)}\r\n onRestore={() => handleRestore(version.id)}\r\n onPin={() => pinVersion(version.id)}\r\n onRename={title => renameVersion(version.id, title)}\r\n onDelete={() => deleteVersion(version.id)}\r\n onCompareSelect={() => handleCompareSelect(version.id)}\r\n />\r\n ))}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Viewing version indicator */}\r\n {state.viewingVersionId && (\r\n <div className=\"rte-version-viewing-indicator\">\r\n <span>Viewing: {getVersion(state.viewingVersionId)?.title || `Version ${getVersion(state.viewingVersionId)?.number}`}</span>\r\n <button onClick={() => viewVersion(null)} className=\"rte-version-back-btn\">\r\n โ† Back to current\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default VersionHistoryPanel\r\n"],"mappings":"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,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAC1D;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACtD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UACvD;AAAA,UAAM;AAAA,UAAM;AAAA,UAAO;AAAA,UAAM;AAAA,UAAO;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAC1D;AAAA,UAAO;AAAA,UAAO;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UAAM;AAAA,UACxD;AAAA,UAAM;AA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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,eAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACT;AASO,SAAS,iBAAiB,MAA8C;AAC7E,SAAO,eAAe,IAAI,KAAK,eAAe;AAChD;AAQO,SAAS,iBACd,MACA,SAMqB;AACrB,MAAI,UAAU,CAAC,GAAG,iBAAiB,IAAI,CAAC;AAGxC,MAAI,QAAQ,QAAQ;AAClB,cAAU,QAAQ,OAAO,SAAO,CAAC,QAAQ,OAAQ,SAAS,GAAG,CAAC;AAAA,EAChE;AAGA,MAAI,QAAQ,cAAc;AACxB,UAAM,QAAQ,QAAQ,QAAQ,QAAQ,aAAa,MAAM;AACzD,QAAI,UAAU,IAAI;AAChB,cAAQ,OAAO,OAAO,GAAG,GAAG,QAAQ,aAAa,KAAK;AAAA,IACxD;AAAA,EACF;AAGA,MAAI,QAAQ,aAAa;AACvB,UAAM,QAAQ,QAAQ,QAAQ,QAAQ,YAAY,MAAM;AACxD,QAAI,UAAU,IAAI;AAChB,cAAQ,OAAO,QAAQ,GAAG,GAAG,GAAG,QAAQ,YAAY,KAAK;AAAA,IAC3D;AAAA,EACF;AAGA,MAAI,QAAQ,KAAK;AACf,YAAQ,KAAK,aAAa,GAAG,QAAQ,GAAG;AAAA,EAC1C;AAEA,SAAO;AACT;;;AC6FO,IAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,UAAU;AACZ;;;ACnYA,SAAS,uBAAgC;AACvC,SAAO;AACT;AAGA,IAAM,kBAAkC;AAAA,EACtC,GAAG;AAAA;AAAA,EAEH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAElB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EACV,UAAU;AAAA;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA;AAAA,EACf,UAAU;AACZ;AAKO,IAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,EAEb,cAAc,MAAM;AAElB,UAAM,EAAE,uBAAAC,uBAAsB,IAAI;AAClC,WAAOA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAM;AAC9B;;;ACjFA;AACA;;;ACKA,SAAS,sBAA+B;AACtC,MAAI;AACF,YAAQ,OAAO;AACf,YAAQ,aAAa;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,iBAAiC;AAAA,EACrC,GAAG;AAAA;AAAA,EAEH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAElB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA;AAAA,EACf,UAAU;AACZ;AAKO,IAAM,eAA8B;AAAA,EACzC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,EAEb,cAAc,MAAM;AAElB,UAAM,EAAE,sBAAAC,sBAAqB,IAAI;AACjC,WAAOA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAM;AAC9B;;;ACjFA,SAAS,wBAAiC;AACxC,MAAI;AACF,YAAQ,SAAS;AACjB,YAAQ,gCAAgC;AACxC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,mBAAmC;AAAA,EACvC,GAAG;AAAA;AAAA,EAEH,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAElB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA;AAAA;AAAA,EAEZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA;AAAA;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,gBAAgB;AAAA;AAAA,EAEhB,UAAU;AAAA;AAAA,EAEV,eAAe;AAAA;AAAA,EACf,UAAU;AACZ;AAKO,IAAM,iBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,EAEb,cAAc,MAAM;AAElB,UAAM,EAAE,wBAAAC,wBAAuB,IAAI;AACnC,WAAOA;AAAA,EACT;AAAA,EAEA,sBAAsB,MAAM;AAC9B;;;APwDU,IAAAC,sBAAA;AAvHV,gBAAgB,aAAa;AAC7B,IAAI,aAAa,YAAY,GAAG;AAC9B,kBAAgB,YAAY;AAC9B;AACA,IAAI,eAAe,YAAY,GAAG;AAChC,kBAAgB,cAAc;AAChC;AAEO,IAAM,oBAAgB;AAAA,EAC3B,CACE;AAAA,IACE,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB;AAAA,EACF,GACA,QACG;AACH,UAAM,iBAAa,sBAAyB,IAAI;AAChD,UAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAiC,UAAU;AAG/F,UAAM,wBAAoB,uBAAQ,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAGlE,UAAM,oBAAoB,eAAe,SAAY,aAAa;AAGlE,UAAM,sBAAkB,uBAAQ,MAAM;AACpC,UAAI,mBAAmB;AACrB,cAAM,UAAU,WAAW,iBAAiB;AAC5C,YAAI,SAAS,YAAY,GAAG;AAC1B,iBAAO;AAAA,QACT;AACA,gBAAQ;AAAA,UACN,WAAW,iBAAiB;AAAA,QAC9B;AAAA,MACF;AACA,aAAO,uBAAuB;AAAA,IAChC,GAAG,CAAC,iBAAiB,CAAC;AAGtB,UAAM,qBAAqB,CAAC,kBAA8B;AACxD,UAAI,gBAAgB;AAClB,uBAAe,aAAa;AAAA,MAC9B,OAAO;AACL,8BAAsB,aAAa;AAAA,MACrC;AAAA,IACF;AAGA,UAAM,qBAAiB,uBAAQ,MAA2B;AACxD,UAAI,sBAAsB;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,YAAY,UAAU;AAC/B,eAAO,iBAAiB,OAAsC;AAAA,MAChE;AAEA,UAAI,QAAQ,SAAS;AACnB,eAAO,QAAQ;AAAA,MACjB;AAEA,UAAI,QAAQ,QAAQ;AAClB,eAAO,iBAAiB,QAAQ,MAAqC;AAAA,MACvE;AAEA,aAAO,iBAAiB,MAAM;AAAA,IAChC,GAAG,CAAC,SAAS,oBAAoB,CAAC;AAGlC,2CAAoB,KAAK,OAAO;AAAA,MAC9B,YAAY,MAAM,WAAW,SAAS,WAAW,KAAK;AAAA,MACtD,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,SAAS,MAAM,WAAW,SAAS,QAAQ;AAAA,MAC3C,YAAY,CAAC,YAAoB,WAAW,SAAS,WAAW,OAAO;AAAA,MACvE,OAAO,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,MAAM,MAAM,WAAW,SAAS,KAAK;AAAA,MACrC,YAAY,CAAC,SAAiB,WAAW,SAAS,WAAW,IAAI;AAAA,MACjE,YAAY,CAAC,SAAiB,WAAW,SAAS,WAAW,IAAI;AAAA,MACjE,OAAO,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,mBAAmB,MAAM,WAAW,SAAS,kBAAkB,KAAK;AAAA,MACpE,cAAc,MAAM,WAAW,SAAS,aAAa,KAAK;AAAA,MAC1D,cAAc,MAAM,WAAW,SAAS,aAAa,KAAK;AAAA,MAC1D,kBAAkB,MAAM,WAAW,SAAS,iBAAiB;AAAA,MAC7D,OAAO,MAAM,WAAW,SAAS,MAAM;AAAA,MACvC,MAAM,MAAM,WAAW,SAAS,KAAK;AAAA,MACrC,MAAM,MAAM,WAAW,SAAS,KAAK;AAAA,MACrC,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,SAAS,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,MAChD,iBAAiB,MAAM,WAAW,SAAS,gBAAgB;AAAA,MAC3D,eAAe,MAAM,iBAAiB,QAAS;AAAA,IACjD,EAAE;AAGF,QAAI,CAAC,iBAAiB;AACpB,aACE,6CAAC,SAAI,WAAW,yCAAyC,SAAS,IAChE,wDAAC,SAAI,WAAU,6BAA4B;AAAA;AAAA,QAEzC,6CAAC,QAAG;AAAA,QACJ,6CAAC,UAAK,2DAA6C;AAAA,SACrD,GACF;AAAA,IAEJ;AAGA,UAAM,kBAAkB,gBAAgB,aAAa;AAGrD,UAAM,eAAe,CAAC,YAAoB;AACxC,iBAAW,OAAO;AAAA,IACpB;AAEA,WACE,8CAAC,SAAI,WAAW,+BAA+B,SAAS,IACrD;AAAA,4BAAsB,kBAAkB,SAAS,KAChD,8CAAC,SAAI,WAAU,+BACb;AAAA,qDAAC,WAAM,WAAU,qCAAoC,qBAAO;AAAA,QAC5D;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,gBAAgB;AAAA,YACvB,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAmB;AAAA,YAChE;AAAA,YAEC,4BAAkB,IAAI,CAAC,YACtB,6CAAC,YAA0B,OAAO,QAAQ,MACvC,kBAAQ,QADE,QAAQ,IAErB,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,UACX;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAnBK,gBAAgB;AAAA,MAoBvB;AAAA,OACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;;;AQnN5B,IAAAC,iBAAwE;AACxE,IAAAA,iBAAyC;AACzC,IAAAC,6BAAyB;AACzB,IAAAC,8BAA0B;AAC1B,IAAAC,yBAAqB;AACrB,IAAAC,yBAAqB;AACrB,IAAAC,2BAAuB;AACvB,IAAAC,8BAA0B;AAC1B,IAAAC,2BAAuB;AACvB,IAAAC,yBAAqB;AACrB,IAAAC,wCAAkC;AAClC,IAAAC,8BAA0B;AAC1B,IAAAC,gCAA4B;AAC5B,IAAAC,+BAA0B;AAC1B,IAAAC,gCAA2B;AAC3B,IAAAC,0BAAsB;AACtB,IAAAC,8BAA0B;AAC1B,IAAAC,+BAA0B;AAC1B,IAAAC,4BAAwB;AACxB,IAAAC,gCAA2B;AAC3B,IAAAC,iCAA4B;AAC5B,IAAAC,8BAAyB;AACzB,IAAAC,+BAA2B;AAC3B,IAAAC,oCAA+B;AAC/B,IAAAC,yBAAqB;AACrB,IAAAC,0BAAsB;AACtB,IAAAC,0BAAsB;AACtB,IAAAC,8BAAyB;AACzB,IAAAC,+BAA0B;AAC1B,IAAAC,iCAA4B;AAC5B,IAAAC,4BAAwB;AACxB,IAAAC,gCAA4B;AAC5B,IAAAC,oCAA+B;AAC/B,IAAAC,8BAA0B;AAC1B,IAAAC,+BAA2B;AAC3B,IAAAC,+BAA0B;AAG1B,IAAAC,mBAAuC;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;;;AC/CA,IAAAC,gBAAmD;AAGnD;AACA,IAAAC,uBAkCO;AA4FH,IAAAC,sBAAA;AAnFJ,IAAMC,iBAAgB;AAAA,EACpB,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,EACrD,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,EACzC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,WAAW,OAAO,UAAU;AACvC;AAEA,IAAMC,cAAa;AAAA,EACjB;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;AAEA,IAAMC,gBAAe;AAAA,EACnB,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,EAC9B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,KAAK,OAAO,SAAS;AAAA,EAC9B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,KAAK,OAAO,SAAS;AAChC;AAwBA,IAAMC,eAGD,CAAC,EAAE,UAAU,QAAQ,MAAM;AAC9B,QAAM,CAAC,gBAAgB,iBAAiB,QACtC,wBAAwC,SAAS;AACnD,QAAM,iBAAa,sBAAuB,IAAI;AAE9C,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,UACE,WAAW,WACX,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAC7C;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,8CAAC,SAAI,KAAK,YAAY,WAAU,4BAC9B;AAAA,iDAAC,SAAI,WAAU,gCACZ,iBAAO,QAAQ,gBAAgB,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MACnD;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,kCAAkC,mBAAmB,MAAM,WAAW,EAAE;AAAA,QACnF,SAAS,MACP,kBAAkB,GAAoC;AAAA,QAExD,OAAO,SAAS;AAAA,QAEf,mBAAS,OAAO,CAAC;AAAA;AAAA,MARb;AAAA,IASP,CACD,GACH;AAAA,IACA,6CAAC,SAAI,WAAU,0BACZ,2BAAiB,cAAc,EAAE,OAAO,IAAI,CAAC,OAAO,MACnD;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,mBAAS,KAAK;AACd,kBAAQ;AAAA,QACV;AAAA,QAEC;AAAA;AAAA,MARI,GAAG,KAAK,IAAI,CAAC;AAAA,IASpB,CACD,GACH;AAAA,KACF;AAEJ;AAEO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS,KAAK;AAC5D,QAAM,qBAAiB,sBAA0B,IAAI;AAErD,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAMC,iBAAgB,CAAC;AAAA,IACrB;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAQE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,aAAa,CAAC,MAAM;AAClB,UAAE,eAAe;AACjB,gBAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,2BAA2B,SAAS,WAAW,EAAE,IAAI,WAAW,aAAa,EAAE;AAAA,MAEzF;AAAA;AAAA,EACH;AAGF,QAAM,eAAe,CAAC,QAAuB,UAAkB;AAC7D,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,YACvD,QAAQ,OAAO,SAAS,MAAM;AAAA,YAC9B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,YACzD,QAAQ,OAAO,SAAS,QAAQ;AAAA,YAChC,OAAM;AAAA,YAEN,uDAAC,+BAAO,MAAM,IAAI;AAAA;AAAA,UALd;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,YAC5D,QAAQ,OAAO,SAAS,WAAW;AAAA,YACnC,OAAM;AAAA,YAEN,uDAAC,kCAAU,MAAM,IAAI;AAAA;AAAA,UALjB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,YACzD,QAAQ,OAAO,SAAS,QAAQ;AAAA,YAChC,OAAM;AAAA,YAEN,uDAAC,sCAAc,MAAM,IAAI;AAAA;AAAA,UALrB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,YACvD,QAAQ,OAAO,SAAS,MAAM;AAAA,YAC9B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,OAAO,SAAS,WAAW,GAAG;AAEhC,oBAAI,aAAa;AACjB,uBAAO,MAAM,IAAI,YAAY,CAAC,SAAS;AACrC,sBAAI,KAAK,KAAK,SAAS,aAAa;AAClC,iCAAa,KAAK;AAClB,2BAAO;AAAA,kBACT;AAAA,gBACF,CAAC;AAED,6BAAa,WAAW,KAAK;AAE7B,oBAAI,YAAY;AACd,yBAAO,SAAS,WAAW,YAAY,MAAM;AAAA,oBAC3C,oBAAoB;AAAA,kBACtB,CAAC;AAAA,gBACH,OAAO;AACL,yBAAO,SAAS,aAAa,IAAI;AAAA,gBACnC;AACA,uBAAO,SAAS,MAAM;AAAA,cACxB,OAAO;AAEL,sBAAM,cAAc,OAAO,QAAQ;AACnC,sBAAM,iBACJ,CAAC,eACD,gBAAgB,aAChB,YAAY,KAAK,MAAM;AAEzB,sBAAM,mBAAmB,iBACrB,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC,EAAE,IAChD;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,oBACP;AAAA,sBACE,MAAM;AAAA,sBACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC;AAAA,oBAC/C;AAAA,kBACF;AAAA,gBACF;AAEJ,uBAAO,SAAS,WAAW,kBAAkB,KAAK;AAClD,uBAAO,SAAS,MAAM;AAAA,cACxB;AAAA,YACF;AAAA,YACA,QAAQ,OAAO,SAAS,WAAW;AAAA,YACnC,OAAM;AAAA,YAEN,uDAAC,gCAAQ,MAAM,IAAI;AAAA;AAAA,UAjDf;AAAA,QAkDN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,YAC5D,QAAQ,OAAO,SAAS,WAAW;AAAA,YACnC,OAAM;AAAA,YAEN,uDAAC,kCAAU,MAAM,IAAI;AAAA;AAAA,UALjB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,YAC9D,QAAQ,OAAO,SAAS,aAAa;AAAA,YACrC,OAAM;AAAA,YAEN,uDAAC,oCAAY,MAAM,IAAI;AAAA;AAAA,UALnB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MACP,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI;AAAA,YAE1D,OAAM;AAAA,YAEN,uDAAC,yCAAiB,MAAM,IAAI;AAAA;AAAA,UANxB;AAAA,QAON;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,kBAAI,EAAE,OAAO,UAAU,WAAW;AAChC,uBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,cAC/C,OAAO;AACL,uBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cAC3D;AAAA,YACF;AAAA,YACA,OAAO,OAAO,cAAc,WAAW,EAAE,cAAc;AAAA,YAEvD;AAAA,2DAAC,YAAO,OAAM,WAAU,yBAAW;AAAA,cAClCJ,eAAc,IAAI,CAAC,SAClB,6CAAC,YAAwB,OAAO,KAAK,OAClC,eAAK,SADK,KAAK,KAElB,CACD;AAAA;AAAA;AAAA,UAhBG;AAAA,QAiBN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,kBAAI,EAAE,OAAO,UAAU,WAAW;AAChC,uBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI;AAAA,cAC7C,OAAO;AACL,uBAAO,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cACzD;AAAA,YACF;AAAA,YACA,OAAO,OAAO,cAAc,WAAW,EAAE,YAAY;AAAA,YAErD;AAAA,2DAAC,YAAO,OAAM,WAAU,uBAAS;AAAA,cAChCC,YAAW,IAAI,CAAC,SACf,6CAAC,YAAkB,OAAO,MACvB,kBADU,IAEb,CACD;AAAA;AAAA;AAAA,UAhBG;AAAA,QAiBN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,kBAAI,EAAE,OAAO,UAAU,WAAW;AAChC,uBAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,cAC/C,OAAO;AACL,uBAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,cAC3D;AAAA,YACF;AAAA,YACA,OACE,OAAO,cAAc,WAAW,EAAE,cAClC,OAAO,cAAc,SAAS,EAAE,cAChC;AAAA,YAEF,OAAM;AAAA,YAEN;AAAA,2DAAC,YAAO,OAAM,WAAU,yBAAW;AAAA,cAClCC,cAAa,IAAI,CAAC,OACjB,6CAAC,YAAsB,OAAO,GAAG,OAC9B,aAAG,SADO,GAAG,KAEhB,CACD;AAAA;AAAA;AAAA,UArBG;AAAA,QAsBN;AAAA,MAGJ,KAAK;AACH,eACE,8CAAC,UAAqB,WAAU,mCAC9B;AAAA;AAAA,YAAC;AAAA;AAAA,cAEC,WAAU;AAAA,cACV,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,cACvD,OAAM;AAAA,cACN,MAAK;AAAA;AAAA,YAJD;AAAA,UAKN;AAAA,UACA,6CAAC,UAAK,WAAU,6BACd,wDAAC,WAAM,OAAM,cACX;AAAA,yDAAC,6BAAK,MAAM,IAAI;AAAA,YAChB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,CAAC,MACT,OAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,EAAE,IAAI;AAAA,gBAEtD,OAAO,OAAO,cAAc,WAAW,EAAE,SAAS;AAAA;AAAA,YACpD;AAAA,aACF,GACF;AAAA,aAnBQ,WAoBV;AAAA,MAGJ,KAAK;AACH,eACE,6CAAC,UAA2B,WAAU,6BACpC,wDAAC,WAAM,OAAM,oBACX;AAAA,uDAAC,oCAAY,MAAM,IAAI;AAAA,UACvB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,CAAC,MACT,OACG,MAAM,EACN,MAAM,EACN,gBAAgB,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,EACzC,IAAI;AAAA,cAET,OAAO,OAAO,cAAc,WAAW,EAAE,SAAS;AAAA;AAAA,UACpD;AAAA,WACF,KAdQ,iBAeV;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACE;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,MAAM,EAAE,IAAI;AAAA,YAC/D,QAAQ,OAAO,SAAS,EAAE,WAAW,OAAO,CAAC;AAAA,YAC7C,OAAM;AAAA,YAEN,uDAAC,kCAAU,MAAM,IAAI;AAAA;AAAA,UALjB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,QAAQ,EAAE,IAAI;AAAA,YACjE,QAAQ,OAAO,SAAS,EAAE,WAAW,SAAS,CAAC;AAAA,YAC/C,OAAM;AAAA,YAEN,uDAAC,oCAAY,MAAM,IAAI;AAAA;AAAA,UALnB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,OAAO,EAAE,IAAI;AAAA,YAChE,QAAQ,OAAO,SAAS,EAAE,WAAW,QAAQ,CAAC;AAAA,YAC9C,OAAM;AAAA,YAEN,uDAAC,mCAAW,MAAM,IAAI;AAAA;AAAA,UALlB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,aAAa,SAAS,EAAE,IAAI;AAAA,YAClE,QAAQ,OAAO,SAAS,EAAE,WAAW,UAAU,CAAC;AAAA,YAChD,OAAM;AAAA,YAEN,uDAAC,qCAAa,MAAM,IAAI;AAAA;AAAA,UALpB;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA,YACnD,OAAM;AAAA,YAEN,uDAAC,+BAAO,MAAM,IAAI;AAAA;AAAA,UAJd;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI;AAAA,YACpD,OAAM;AAAA,YAEN,uDAAC,gCAAQ,MAAM,IAAI;AAAA;AAAA,UAJf;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,YAC7D,QAAQ,OAAO,SAAS,YAAY;AAAA,YACpC,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,YAC9D,QAAQ,OAAO,SAAS,aAAa;AAAA,YACrC,OAAM;AAAA,YAEN,uDAAC,oCAAY,MAAM,IAAI;AAAA;AAAA,UALnB;AAAA,QAMN;AAAA,MAGJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,QAAQ,SAAS,OAAO,QAAQ,WAAW,EAAE,CAAC;AAOpD,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MACP,OAAO,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI;AAAA,YAEtD,QAAQ,OAAO,SAAS,WAAW,EAAE,MAAM,CAAC;AAAA,YAC5C,OAAO,WAAW,KAAK;AAAA,YAEvB,wDAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC/D;AAAA,2DAAC,gCAAQ,MAAM,IAAI;AAAA,cACnB,6CAAC,UAAK,OAAO,EAAE,UAAU,QAAQ,YAAY,OAAO,GACjD,iBACH;AAAA,eACF;AAAA;AAAA,UAZK;AAAA,QAaP;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,YAC7D,QAAQ,OAAO,SAAS,YAAY;AAAA,YACpC,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UALb;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,YAC9D,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAJb;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,oBAAM,MAAM,OAAO,OAAO,YAAY;AACtC,kBAAI,KAAK;AACP,uBAAO,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA,cACpD;AAAA,YACF;AAAA,YACA,QAAQ,OAAO,SAAS,MAAM;AAAA,YAC9B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UAVZ;AAAA,QAWN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI;AAAA,YACtD,UAAU,CAAC,OAAO,SAAS,MAAM;AAAA,YACjC,OAAM;AAAA,YAEN,uDAAC,+BAAO,MAAM,IAAI;AAAA;AAAA,UALd;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,oBAAoB;AACtB,mCAAmB;AAAA,cACrB,OAAO;AACL,sBAAM,MAAM,OAAO,OAAO,kBAAkB;AAC5C,oBAAI,KAAK;AACP,yBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAbb;AAAA,QAcN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AACb,kBAAI,oBAAoB;AACtB,mCAAmB;AAAA,cACrB,OAAO;AACL,sBAAM,MAAM,OAAO,OAAO,kBAAkB;AAC5C,oBAAI,KAAK;AACP,yBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,gBACpD;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAbb;AAAA,QAcN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MACP,OACG,MAAM,EACN,MAAM,EACN,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,KAAK,CAAC,EACrD,IAAI;AAAA,YAET,OAAM;AAAA,YAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UAVb;AAAA,QAWN;AAAA,MAGJ,KAAK;AACH,eACE,8CAAC,UAAiB,OAAO,EAAE,UAAU,WAAW,GAC9C;AAAA;AAAA,YAACA;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,cACX,SAAS,MAAM,mBAAmB,CAAC,eAAe;AAAA,cAClD,QAAQ;AAAA,cACR,OAAM;AAAA,cAEN,uDAAC,8BAAM,MAAM,IAAI;AAAA;AAAA,UACnB;AAAA,UACC,mBACC;AAAA,YAACD;AAAA,YAAA;AAAA,cACC,UAAU,CAAC,UACT,OAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,IAAI;AAAA,cAEhD,SAAS,MAAM,mBAAmB,KAAK;AAAA;AAAA,UACzC;AAAA,aAfM,OAiBV;AAAA,MAGJ,KAAK;AACH,cAAM,eAAe,OAAO,QAAQ,YAAY,gBAAgB;AAChE,eACE;AAAA,UAACC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,YAC7D,QAAQ;AAAA,YACR,OACE,eACI,0BACA;AAAA,YAGL,yBAAe,6CAAC,iCAAS,MAAM,IAAI,IAAK,6CAAC,iCAAS,MAAM,IAAI;AAAA;AAAA,UATzD;AAAA,QAUN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI;AAAA,YAClD,OAAM;AAAA,YAEN,uDAAC,gCAAQ,MAAM,IAAI;AAAA;AAAA,UAJf;AAAA,QAKN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,YACjD,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,YAC7B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,YACjD,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK;AAAA,YAC7B,OAAM;AAAA,YAEN,uDAAC,6BAAK,MAAM,IAAI;AAAA;AAAA,UALZ;AAAA,QAMN;AAAA,MAGJ,KAAK;AACH,eACE,6CAAC,SAAyB,WAAU,mCAA1B,OAAO,KAAK,EAA8C;AAAA,MAGxE;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,SAAS,WAAW;AAEhD,SAAO,6CAAC,SAAI,WAAW,sBAAsB,eAAe,qCAAqC,EAAE,IAAK,kBAAQ,IAAI,YAAY,GAAE;AACpI;;;ADtbQ,IAAAC,sBAAA;AAnTR,IAAMC,gBAAW,iCAAe,uBAAM;AAGtC,IAAMC,kBAAwE;AAAA,EAC5E,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,qBAAiB;AAAA,EAC5B,CACE;AAAA,IACE,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,IACZ,SAAS,CAAC;AAAA,IACV;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,EACxB,GACA,QACG;AAEH,UAAM,uBACJ,kBAAkBA,gBAAe,aAAa;AAGhD,UAAM,aAAS,0BAAU;AAAA,MACvB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBACI,wDAAkB,UAAU;AAAA,UAC1B,UAAAD;AAAA,UACA,iBAAiB;AAAA,QACnB,CAAC,IACD,wDAAkB,UAAU;AAAA,UAC1B,UAAU;AAAA,QACZ,CAAC;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sCAAU,UAAU,EAAE,YAAY,KAAK,CAAC;AAAA,QACxC;AAAA,QACA,uCAAU,UAAU;AAAA,UAClB,OAAO,CAAC,WAAW,WAAW;AAAA,QAChC,CAAC;AAAA,QACD,kCAAQ,UAAU;AAAA,UAChB,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,QAC3B,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,4BAAK,UAAU;AAAA,UACb,aAAa;AAAA,UACb,gBAAgB;AAAA,YACd,QAAQ;AAAA,YACR,KAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,QACD,8BAAM,UAAU;AAAA,UACd,QAAQ;AAAA,UACR,aAAa;AAAA,QACf,CAAC;AAAA,QACD;AAAA,QACA,8BAAM,UAAU;AAAA,UACd,WAAW;AAAA,QACb,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,0CAAY,UAAU;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,QACD,iDAAe,UAAU;AAAA,UACvB,OAAO,iBAAiB,IAAI,iBAAiB;AAAA,QAC/C,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,MACT,UAAU,CAAC,YAAY,CAAC;AAAA,MACxB,UAAU,CAAC,EAAE,QAAAE,QAAO,MAAM;AACxB,cAAM,OAAOA,QAAO,QAAQ;AAC5B,mBAAW,IAAI;AAAA,MACjB;AAAA,MACA,QAAQ,MAAM;AACZ,iBAAS;AAAA,MACX;AAAA,MACA,SAAS,MAAM;AACb,kBAAU;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,QACX,YAAY;AAAA,UACV,OAAO;AAAA,UACP,OAAO,eAAe,SAAS,OAAO,YAAY,eAAe,SAAS,QAAQ,EAAE;AAAA,QACtF;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAGD,kCAAU,MAAM;AACd,UAAI,UAAU,UAAU,OAAO,QAAQ,GAAG;AACxC,eAAO,SAAS,WAAW,KAAK;AAAA,MAClC;AAAA,IACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAGlB,kCAAU,MAAM;AACd,UAAI,QAAQ;AACV,eAAO,YAAY,CAAC,YAAY,CAAC,QAAQ;AAAA,MAC3C;AAAA,IACF,GAAG,CAAC,UAAU,UAAU,MAAM,CAAC;AAG/B,UAAM,6BAAyB,4BAAY,YAAY;AACrD,UAAI,sBAAsB,QAAQ;AAChC,cAAM,OAAO,MAAM,mBAAmB;AACtC,YAAI,MAAM;AACR,iBACG,MAAM,EACN,MAAM,EACN,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC,EACtD,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF,GAAG,CAAC,oBAAoB,MAAM,CAAC;AAG/B,UAAM,6BAAyB,4BAAY,YAAY;AACrD,UAAI,sBAAsB,QAAQ;AAChC,cAAM,OAAO,MAAM,mBAAmB;AACtC,YAAI,MAAM;AACR,iBACG,MAAM,EACN,MAAM,EACN,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC,EACtD,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF,GAAG,CAAC,oBAAoB,MAAM,CAAC;AAG/B,4CAAoB,KAAK,OAAO;AAAA,MAC9B,YAAY,MAAM;AAChB,eAAO,QAAQ,QAAQ,KAAK;AAAA,MAC9B;AAAA,MACA,YAAY,CAAC,SAAiB;AAC5B,gBAAQ,SAAS,WAAW,IAAI;AAAA,MAClC;AAAA,MACA,OAAO,MAAM;AACX,gBAAQ,SAAS,MAAM;AAAA,MACzB;AAAA,MACA,WAAW,MAAM;AACf,eAAO;AAAA,MACT;AAAA,MACA,YAAY,CAAC,SAAiB;AAC5B,gBAAQ,SAAS,cAAc,IAAI;AAAA,MACrC;AAAA,MACA,OAAO,MAAM;AACX,gBAAQ,SAAS,aAAa;AAAA,MAChC;AAAA,MACA,cAAc,MAAM;AAClB,eAAO,QAAQ,QAAQ,YAAY,gBAAgB;AAAA,MACrD;AAAA,MACA,kBAAkB,MAAM;AACtB,gBAAQ,SAAS,iBAAiB;AAAA,MACpC;AAAA,MACA,OAAO,MAAM;AACX,gBAAQ,SAAS,MAAM;AAAA,MACzB;AAAA,IACF,EAAE;AAEF,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,OAAO,QAAQ,eAAe,WAAW;AAChE,UAAM,iBAAiB,iBAAiB,IAAI,iBAAiB;AAE7D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,uBAAuB,WAAW,aAAa,EAAE,IAAI,WAAW,aAAa,EAAE,IAAI,SAAS;AAAA,QAEvG;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,SAAS;AAAA,cACT,oBACE,qBAAqB,yBAAyB;AAAA,cAEhD,oBACE,qBAAqB,yBAAyB;AAAA;AAAA,UAElD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,GAAG,MAAM,KAAK;AAAA,cAE/B,uDAAC,gCAAc,QAAgB;AAAA;AAAA,UACjC;AAAA,UACC,mBACC,6CAAC,SAAI,WAAU,sBACb,wDAAC,SAAI,WAAU,4BACZ;AAAA;AAAA,YACA,kBAAkB,MAAM,cAAc;AAAA,YACtC,kBAAkB,iBAAiB,kBAClC,8CAAC,UAAK,WAAU,qCACb;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,aAEJ,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;;AT/R7B;AACA;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;;;AW9HA,IAAAC,iBAAiG;AAsQ7F,IAAAC,uBAAA;AAhPJ,IAAM,eAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,OAAO,CAAC;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;AAGA,SAAS,qBAAqB,OAA2B,QAAiD;AACxG,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,OAAO,QAAQ,OAAO,OAAO,WAAW,UAAU,MAAM,QAAQ,OAAU;AAAA,IACvG,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,IACzC,KAAK;AACH,UAAI,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,KAAK,EAAE,GAAG;AAClD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO,MAAM,MAAM,IAAI,OAAK,EAAE,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,QACvE;AAAA,MACF;AACA,aAAO,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,MAAM,OAAO,OAAO,IAAI,EAAE;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,MAAM,MAAM,OAAO,OAAK,EAAE,OAAO,OAAO,MAAM,EAAE;AAAA,IAC5E,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,MAAM,MAAM;AAAA,UAAI,OACrB,EAAE,OAAO,OAAO,SAAS,EAAE,GAAG,GAAG,QAAQ,OAAO,QAAQ,YAAY,KAAK,IAAI,EAAE,IAAI;AAAA,QACrF;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,OAAO,OAAO,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,OAAU;AAAA,IACtC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,OAAO,OAAO;AAAA,IAC3C;AACE,aAAO;AAAA,EACX;AACF;AAaA,IAAM,2BAAuB,8BAAgD,IAAI;AAWjF,SAAS,oBAA4B;AACnC,QAAM,SAAS;AAAA,IACb;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAC5C;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,IAAW;AAAA,EAC9C;AACA,SAAO,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AACzD;AAGO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+B;AAC7B,QAAM,CAAC,OAAO,QAAQ,QAAI,2BAAW,sBAAsB,YAAY;AACvE,QAAM,YAAQ,uBAAyB,IAAI;AAC3C,QAAM,0BAAsB,uBAA8B,IAAI;AAC9D,QAAM,2BAAuB,uBAAO,CAAC;AAGrC,gCAAU,MAAM;AACd,qBAAiB,MAAM,MAAM;AAAA,EAC/B,GAAG,CAAC,MAAM,QAAQ,cAAc,CAAC;AAGjC,gCAAU,MAAM;AACd,oBAAgB,MAAM,KAAK;AAAA,EAC7B,GAAG,CAAC,MAAM,OAAO,aAAa,CAAC;AAG/B,QAAM,cAAU,4BAAY,YAAY;AACtC,QAAI,CAAC,OAAQ;AAEb,aAAS,EAAE,MAAM,cAAc,QAAQ,aAAa,CAAC;AAErD,QAAI;AACF,UAAI,OAAO,aAAa,eAAe,OAAO,WAAW;AACvD,cAAM,MAAM,IAAI,IAAI,OAAO,SAAS;AACpC,YAAI,aAAa,IAAI,QAAQ,OAAO,MAAM;AAC1C,YAAI,OAAO,OAAO;AAChB,cAAI,aAAa,IAAI,SAAS,OAAO,KAAK;AAAA,QAC5C;AAEA,cAAM,KAAK,IAAI,UAAU,IAAI,SAAS,CAAC;AACvC,cAAM,UAAU;AAEhB,WAAG,SAAS,MAAM;AAChB,mBAAS,EAAE,MAAM,cAAc,QAAQ,YAAY,CAAC;AACpD,+BAAqB,UAAU;AAG/B,aAAG,KAAK,KAAK,UAAU;AAAA,YACrB,MAAM;AAAA,YACN,MAAM;AAAA,cACJ,IAAI,OAAO,KAAK;AAAA,cAChB,MAAM,OAAO,KAAK;AAAA,cAClB,QAAQ,OAAO,KAAK;AAAA,cACpB,OAAO,OAAO,KAAK,SAAS,kBAAkB;AAAA,YAChD;AAAA,UACF,CAAC,CAAC;AAAA,QACJ;AAEA,WAAG,YAAY,CAAC,UAAU;AACxB,cAAI;AACF,kBAAM,UAAU,KAAK,MAAM,MAAM,IAAI;AACrC,qCAAyB,OAAO;AAAA,UAClC,QAAQ;AACN,oBAAQ,MAAM,uCAAuC;AAAA,UACvD;AAAA,QACF;AAEA,WAAG,UAAU,MAAM;AACjB,mBAAS,EAAE,MAAM,cAAc,QAAQ,eAAe,CAAC;AACvD,0BAAgB;AAAA,QAClB;AAEA,WAAG,UAAU,MAAM;AACjB,mBAAS,EAAE,MAAM,aAAa,OAAO,mBAAmB,CAAC;AAAA,QAC3D;AAAA,MACF,WAAW,OAAO,aAAa,UAAU;AAEvC,iBAAS,EAAE,MAAM,aAAa,OAAO,sCAAsC,CAAC;AAAA,MAC9E,WAAW,OAAO,aAAa,UAAU;AAEvC,iBAAS,EAAE,MAAM,cAAc,QAAQ,YAAY,CAAC;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AACd,eAAS,EAAE,MAAM,aAAa,OAAO,iBAAiB,QAAQ,MAAM,UAAU,oBAAoB,CAAC;AAAA,IACrG;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,+BAA2B,4BAAY,CAAC,UAA8B;AAC1E,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,iBAAS,EAAE,MAAM,YAAY,MAAM,MAAM,KAAK,CAAC;AAC/C;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,eAAe,QAAQ,MAAM,OAAO,CAAC;AACtD;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,cAAc,QAAQ,MAAM,OAAO,CAAC;AACrD;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,aAAa,OAAO,MAAM,QAAQ,CAAC;AACpD;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAkB,4BAAY,MAAM;AACxC,QAAI,CAAC,QAAQ,cAAe;AAE5B,UAAM,cAAc,OAAO,wBAAwB;AACnD,UAAM,WAAW,OAAO,qBAAqB;AAE7C,QAAI,qBAAqB,WAAW,aAAa;AAC/C,eAAS,EAAE,MAAM,aAAa,OAAO,oCAAoC,CAAC;AAC1E;AAAA,IACF;AAEA,aAAS,EAAE,MAAM,cAAc,QAAQ,eAAe,CAAC;AACvD,yBAAqB;AAErB,wBAAoB,UAAU,WAAW,MAAM;AAC7C,cAAQ;AAAA,IACV,GAAG,QAAQ;AAAA,EACb,GAAG,CAAC,QAAQ,OAAO,CAAC;AAGpB,QAAM,iBAAa,4BAAY,MAAM;AACnC,QAAI,oBAAoB,SAAS;AAC/B,mBAAa,oBAAoB,OAAO;AAAA,IAC1C;AAEA,QAAI,MAAM,SAAS;AACjB,YAAM,QAAQ,MAAM;AACpB,YAAM,UAAU;AAAA,IAClB;AAEA,aAAS,EAAE,MAAM,cAAc,QAAQ,eAAe,CAAC;AACvD,aAAS,EAAE,MAAM,aAAa,OAAO,CAAC,EAAE,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAGL,QAAM,mBAAe,4BAAY,CAAC,WAA2B;AAC3D,QAAI,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,QAAQ,eAAe,UAAU,KAAM;AAE9E,UAAM,QAAQ,KAAK,KAAK,UAAU;AAAA,MAChC,MAAM;AAAA,MACN,QAAQ,OAAO,KAAK;AAAA,MACpB;AAAA,IACF,CAAC,CAAC;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM;AACd,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,QAAmC;AAAA,IACvC;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EACf;AAEA,SACE,8CAAC,qBAAqB,UAArB,EAA8B,OAC5B,UACH;AAEJ;AAGO,SAAS,mBAAmB;AACjC,QAAM,cAAU,2BAAW,oBAAoB;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO;AACT;AAGO,SAAS,2BAA2B;AACzC,aAAO,2BAAW,oBAAoB;AACxC;;;AC/PI,IAAAC,uBAAA;AAZJ,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,CAAC,CAAC,EACb,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AACf;AAGA,SAAS,WAAW,EAAE,MAAM,SAAS,GAAoD;AACvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,aAAa,KAAK,MAAM;AAAA,MACjC,OAAO,KAAK;AAAA,MAEX;AAAA,aAAK,SACJ,8CAAC,SAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,IAEvC,8CAAC,UAAK,OAAO,EAAE,iBAAiB,KAAK,MAAM,GACxC,sBAAY,KAAK,IAAI,GACxB;AAAA,QAED,KAAK,YAAY,8CAAC,SAAI,WAAU,2BAA0B;AAAA,QAC1D,YAAY,8CAAC,SAAI,WAAU,qBAAqB,eAAK,MAAK;AAAA;AAAA;AAAA,EAC7D;AAEJ;AAGA,SAAS,YAAY,EAAE,OAAO,GAAuB;AACnD,QAAM,eAAiE;AAAA,IACrE,WAAW,EAAE,OAAO,aAAa,OAAO,UAAU;AAAA,IAClD,YAAY,EAAE,OAAO,iBAAiB,OAAO,UAAU;AAAA,IACvD,cAAc,EAAE,OAAO,mBAAmB,OAAO,UAAU;AAAA,IAC3D,cAAc,EAAE,OAAO,gBAAgB,OAAO,UAAU;AAAA,IACxD,OAAO,EAAE,OAAO,SAAS,OAAO,UAAU;AAAA,EAC5C;AAEA,QAAM,SAAS,aAAa,MAAM,KAAK,aAAa;AAEpD,SACE,+CAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,OAAO,OAAO,MAAM,GAChE;AAAA,kDAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,iBAAiB,OAAO,MAAM,GAAG;AAAA,IAClF,OAAO;AAAA,KACV;AAEJ;AAGO,SAAS,kBAAkB;AAAA,EAChC,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AACd,GAA2B;AACzB,QAAM,gBAAgB,yBAAyB;AAE/C,MAAI,CAAC,eAAe,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,eAAe,MAAM,MAAM,MAAM,GAAG,UAAU;AACpD,QAAM,iBAAiB,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,UAAU;AAElE,SACE,+CAAC,SAAI,WAAW,0BAA0B,SAAS,IACjD;AAAA,kDAAC,eAAY,QAAQ,MAAM,QAAQ;AAAA,IAElC,MAAM,MAAM,SAAS,KACpB,+CAAC,SAAI,WAAU,wBACZ;AAAA,mBAAa,IAAI,UAChB,8CAAC,cAAyB,MAAY,UAAU,aAA/B,KAAK,EAAqC,CAC5D;AAAA,MACA,iBAAiB,KAChB,+CAAC,SAAI,WAAU,yCAAwC;AAAA;AAAA,QACnD;AAAA,SACJ;AAAA,OAEJ;AAAA,IAGD,MAAM,SACL,8CAAC,SAAI,WAAU,sBAAqB,OAAO,MAAM,OAAO,eAExD;AAAA,KAEJ;AAEJ;;;AC6BO,IAAM,0BAA0B,CAAC,aAAM,aAAM,gBAAM,aAAM,aAAM,aAAM,aAAM,WAAI;;;ACpItF,IAAAC,iBAAyF;AA6brF,IAAAC,uBAAA;AA/ZJ,IAAMC,gBAA8B;AAAA,EAClC,SAAS,CAAC;AAAA,EACV,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AACf;AAGA,SAAS,aAAqB;AAC5B,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACjE;AAGA,SAAS,gBAAgB,OAAsB,QAAuC;AACpF,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,SAAS,OAAO,QAAQ;AAAA,IAE7C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,SAAS,CAAC,GAAG,MAAM,SAAS,OAAO,MAAM,EAAE;AAAA,IAEhE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ,OAAO,OAAK,EAAE,OAAO,OAAO,QAAQ;AAAA,QAC3D,gBAAgB,MAAM,mBAAmB,OAAO,WAAW,OAAO,MAAM;AAAA,MAC1E;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,QAAQ,YAAqB,YAAY,KAAK,IAAI,GAAG,YAAY,OAAO,WAAW,IAC3F;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,QAAQ,QAAiB,YAAY,QAAW,YAAY,OAAU,IAC9E;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,UAAU,OAAO,OAAO,EAAE,IAClD;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ;AAAA,YACE,GAAG;AAAA,YACH,UAAU,EAAE,SAAS;AAAA,cAAI,OACvB,EAAE,OAAO,OAAO,QAAQ,KAAK,OAAO,UAAU;AAAA,YAChD;AAAA,UACF,IACA;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ,EAAE,GAAG,GAAG,UAAU,EAAE,SAAS,OAAO,OAAK,EAAE,OAAO,OAAO,SAAS,EAAE,IACpE;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ;AAAA,YACE,GAAG;AAAA,YACH,UAAU,EAAE,SAAS,IAAI,OAAK;AAC5B,kBAAI,EAAE,OAAO,OAAO,UAAW,QAAO;AACtC,oBAAM,YAAY,EAAE,aAAa,CAAC;AAClC,oBAAM,mBAAmB,UAAU,KAAK,OAAK,EAAE,UAAU,OAAO,KAAK;AACrE,kBAAI,kBAAkB;AACpB,uBAAO;AAAA,kBACL,GAAG;AAAA,kBACH,WAAW,UAAU;AAAA,oBAAI,OACvB,EAAE,UAAU,OAAO,QACf,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,OAAO,IAAI,EAAE,IACzC;AAAA,kBACN;AAAA,gBACF;AAAA,cACF;AACA,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,WAAW,CAAC,GAAG,WAAW,EAAE,OAAO,OAAO,OAAO,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AAAA,cACzE;AAAA,YACF,CAAC;AAAA,UACH,IACA;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,UAAI,OACzB,EAAE,OAAO,OAAO,WACZ;AAAA,YACE,GAAG;AAAA,YACH,UAAU,EAAE,SAAS,IAAI,OAAK;AAC5B,kBAAI,EAAE,OAAO,OAAO,UAAW,QAAO;AACtC,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,YAAY,EAAE,aAAa,CAAC,GACzB;AAAA,kBAAI,OACH,EAAE,UAAU,OAAO,QACf,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,OAAO,OAAK,EAAE,OAAO,OAAO,MAAM,EAAE,IAC3D;AAAA,gBACN,EACC,OAAO,OAAK,EAAE,MAAM,SAAS,CAAC;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,UACH,IACA;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,gBAAgB,OAAO,SAAS;AAAA,IAErD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,UAAU,CAAC,MAAM,YAAY;AAAA,IAEtE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,OAAO,OAAO;AAAA,IAE3C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,KAAK;AAAA,IAE9C;AACE,aAAO;AAAA,EACX;AACF;AAsCA,IAAM,sBAAkB,8BAA2C,IAAI;AAWhE,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB;AACF,GAA0B;AACxB,QAAM,CAAC,OAAO,QAAQ,QAAI,2BAAW,iBAAiB;AAAA,IACpD,GAAGA;AAAA,IACH,SAAS;AAAA,IACT,aAAa,QAAQ,eAAe;AAAA,EACtC,CAAC;AAED,QAAM,iBAAiB,EAAE,SAAS,oBAAI,IAAmC,EAAE;AAG3E,gCAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,EAAE,KAAK,aAAW;AAC9B,iBAAS,EAAE,MAAM,eAAe,QAAQ,CAAC;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM;AACd,sBAAkB,MAAM,OAAO;AAC/B,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,MAAM,OAAO;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,iBAAiB,MAAM,CAAC;AAG3C,gCAAU,MAAM;AACd,QAAI,QAAQ,aAAa;AACvB,eAAS,EAAE,MAAM,oBAAoB,MAAM,OAAO,YAAY,CAAC;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,CAAC;AAGxB,QAAM,gBAAY,4BAAY,CAAC,UAAwB;AACrD,mBAAe,QAAQ,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,EAC5D,GAAG,CAAC,CAAC;AAGL,QAAM,mBAAe,4BAAY,CAAC,OAAqB,mBAAiD;AACtG,QAAI,CAAC,MAAM,YAAa,QAAO;AAE/B,UAAM,WAAW,WAAW;AAC5B,UAAM,YAAY,WAAW;AAC7B,UAAM,MAAM,KAAK,IAAI;AAErB,UAAM,UAAmB;AAAA,MACvB,IAAI;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,MAAM;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,IACZ;AAEA,UAAM,SAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,WAAW;AAAA,IACb;AAEA,aAAS,EAAE,MAAM,cAAc,OAAO,CAAC;AACvC,cAAU,EAAE,MAAM,kBAAkB,OAAO,CAAC;AAC5C,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,aAAa,SAAS,CAAC;AAGjC,QAAM,mBAAe,4BAAY,CAAC,aAAqB;AACrD,QAAI,QAAQ,gBAAgB,MAAO;AACnC,aAAS,EAAE,MAAM,iBAAiB,SAAS,CAAC;AAC5C,cAAU,EAAE,MAAM,kBAAkB,SAAS,CAAC;AAAA,EAChD,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,QAAM,oBAAgB,4BAAY,CAAC,aAAqB;AACtD,QAAI,CAAC,MAAM,eAAe,QAAQ,iBAAiB,MAAO;AAC1D,aAAS,EAAE,MAAM,kBAAkB,UAAU,YAAY,MAAM,YAAY,CAAC;AAC5E,cAAU,EAAE,MAAM,mBAAmB,UAAU,YAAY,MAAM,YAAY,CAAC;AAAA,EAChF,GAAG,CAAC,MAAM,aAAa,QAAQ,SAAS,CAAC;AAGzC,QAAM,mBAAe,4BAAY,CAAC,aAAqB;AACrD,aAAS,EAAE,MAAM,iBAAiB,SAAS,CAAC;AAC5C,cAAU,EAAE,MAAM,mBAAmB,SAAS,CAAC;AAAA,EACjD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,iBAAa,4BAAY,CAAC,UAAkB,YAAoC;AACpF,QAAI,CAAC,MAAM,YAAa,QAAO;AAE/B,UAAM,UAAmB;AAAA,MACvB,IAAI,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU;AAAA,IACZ;AAEA,aAAS,EAAE,MAAM,eAAe,UAAU,QAAQ,CAAC;AACnD,cAAU,EAAE,MAAM,iBAAiB,UAAU,QAAQ,CAAC;AACtD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,aAAa,SAAS,CAAC;AAGjC,QAAM,oBAAgB,4BAAY,CAAC,UAAkB,WAAmB,YAAoB;AAC1F,QAAI,QAAQ,cAAc,MAAO;AAEjC,UAAM,SAAS,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,QAAQ;AACxD,UAAM,kBAAkB,QAAQ,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AACrE,QAAI,CAAC,gBAAiB;AAEtB,UAAM,iBAA0B;AAAA,MAC9B,GAAG;AAAA,MACH;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,UAAU;AAAA,IACZ;AAEA,aAAS,EAAE,MAAM,kBAAkB,UAAU,SAAS,eAAe,CAAC;AACtE,cAAU,EAAE,MAAM,mBAAmB,UAAU,SAAS,eAAe,CAAC;AAAA,EAC1E,GAAG,CAAC,MAAM,SAAS,QAAQ,SAAS,CAAC;AAGrC,QAAM,oBAAgB,4BAAY,CAAC,UAAkB,cAAsB;AACzE,QAAI,QAAQ,gBAAgB,MAAO;AACnC,aAAS,EAAE,MAAM,kBAAkB,UAAU,UAAU,CAAC;AACxD,cAAU,EAAE,MAAM,mBAAmB,UAAU,UAAU,CAAC;AAAA,EAC5D,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,QAAM,kBAAc,4BAAY,CAAC,UAAkB,WAAmB,UAAkB;AACtF,QAAI,CAAC,MAAM,eAAe,QAAQ,mBAAmB,MAAO;AAE5D,UAAM,gBAAgB,QAAQ,kBAAkB;AAChD,QAAI,CAAC,cAAc,SAAS,KAAK,EAAG;AAEpC,aAAS,EAAE,MAAM,gBAAgB,UAAU,WAAW,OAAO,MAAM,MAAM,YAAY,CAAC;AACtF,cAAU,EAAE,MAAM,kBAAkB,UAAU,WAAW,OAAO,MAAM,MAAM,YAAY,CAAC;AAAA,EAC3F,GAAG,CAAC,MAAM,aAAa,QAAQ,SAAS,CAAC;AAGzC,QAAM,qBAAiB,4BAAY,CAAC,UAAkB,WAAmB,UAAkB;AACzF,QAAI,CAAC,MAAM,YAAa;AACxB,aAAS,EAAE,MAAM,mBAAmB,UAAU,WAAW,OAAO,QAAQ,MAAM,YAAY,GAAG,CAAC;AAC9F,cAAU,EAAE,MAAM,oBAAoB,UAAU,WAAW,OAAO,QAAQ,MAAM,YAAY,GAAG,CAAC;AAAA,EAClG,GAAG,CAAC,MAAM,aAAa,SAAS,CAAC;AAGjC,QAAM,sBAAkB,4BAAY,CAAC,aAA4B;AAC/D,aAAS,EAAE,MAAM,qBAAqB,SAAS,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,CAAC,WAAqB;AACpD,aAAS,EAAE,MAAM,gBAAgB,OAAO,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAGL,QAAM,gBAAY,4BAAY,CAAC,WAAwC;AACrE,aAAS,EAAE,MAAM,cAAc,OAAO,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAGL,QAAM,uBAAmB,4BAAY,CAAC,MAAc,OAAe;AACjE,WAAO,MAAM,QAAQ,KAAK,OAAK,EAAE,MAAM,SAAS,QAAQ,EAAE,MAAM,OAAO,EAAE;AAAA,EAC3E,GAAG,CAAC,MAAM,OAAO,CAAC;AAGlB,QAAM,yBAAqB,4BAAY,MAAM;AAC3C,QAAI,MAAM,WAAW,MAAO,QAAO,MAAM;AACzC,WAAO,MAAM,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,MAAM;AAAA,EAC5D,GAAG,CAAC,MAAM,SAAS,MAAM,MAAM,CAAC;AAGhC,QAAM,gBAAY,4BAAY,CAAC,aAA4C;AACzE,mBAAe,QAAQ,IAAI,QAAQ;AACnC,WAAO,MAAM;AACX,qBAAe,QAAQ,OAAO,QAAQ;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAA8B;AAAA,IAClC;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EACf;AAEA,SACE,8CAAC,gBAAgB,UAAhB,EAAyB,OACvB,UACH;AAEJ;AAGO,SAAS,cAAc;AAC5B,QAAM,cAAU,2BAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO;AACT;AAGO,SAAS,sBAAsB;AACpC,aAAO,2BAAW,eAAe;AACnC;;;AC/cA,IAAAC,iBAAyB;AAuEjB,IAAAC,uBAAA;AA1DR,SAAS,mBAAmB,WAA2B;AACrD,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,QAAM,QAAQ,KAAK,MAAM,OAAO,IAAO;AACvC,QAAM,OAAO,KAAK,MAAM,OAAO,KAAQ;AAEvC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI;AAE5B,SAAO,IAAI,KAAK,SAAS,EAAE,mBAAmB;AAChD;AAGA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,WAAW,oBAAoB;AACrC,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,QAAQ,OAAO;AAC9D,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AAExD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,EAAE,QAAQ,eAAe,eAAe,aAAa,gBAAgB,MAAM,IAAI;AACrF,QAAM,UAAU,QAAQ,cAAc,SAAS,QAAQ,OAAO,OAAO,MAAM,aAAa;AACxF,QAAM,YAAY,QAAQ,gBAAgB,SAAS,QAAQ,OAAO,OAAO,MAAM,aAAa;AAC5F,QAAM,WAAW,QAAQ,mBAAmB;AAC5C,QAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,QAAM,iBAAiB,MAAM;AAC3B,kBAAc,UAAU,QAAQ,IAAI,WAAW;AAC/C,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,uBAAuB,CAAC,UAAkB;AAC9C,UAAM,WAAW,QAAQ,WAAW,KAAK,OAAK,EAAE,UAAU,KAAK;AAC/D,UAAM,aAAa,UAAU,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,aAAa,EAAE;AAE3E,QAAI,YAAY;AACd,qBAAe,UAAU,QAAQ,IAAI,KAAK;AAAA,IAC5C,OAAO;AACL,kBAAY,UAAU,QAAQ,IAAI,KAAK;AAAA,IACzC;AACA,qBAAiB,KAAK;AAAA,EACxB;AAEA,SACE,+CAAC,SAAI,WAAW,eAAe,UAAU,sBAAsB,EAAE,IAC/D;AAAA,mDAAC,SAAI,WAAU,sBACb;AAAA,qDAAC,SAAI,WAAU,sBACZ;AAAA,gBAAQ,OAAO,SACd,8CAAC,SAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK,QAAQ,OAAO,MAAM,WAAU,sBAAqB,IAE1F,8CAAC,SAAI,WAAU,kCACZ,kBAAQ,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,GAC7C;AAAA,QAEF,8CAAC,UAAK,WAAU,2BAA2B,kBAAQ,OAAO,MAAK;AAAA,SACjE;AAAA,MACA,+CAAC,UAAK,WAAU,oBACb;AAAA,2BAAmB,QAAQ,SAAS;AAAA,QACpC,QAAQ,YAAY;AAAA,SACvB;AAAA,OACF;AAAA,IAEC,YACC,+CAAC,SAAI,WAAU,oBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA,UAC5C,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,+CAAC,SAAI,WAAU,4BACb;AAAA,sDAAC,YAAO,SAAS,gBAAgB,WAAU,wBAAuB,kBAAI;AAAA,QACtE,8CAAC,YAAO,SAAS,MAAM,aAAa,KAAK,GAAG,WAAU,0BAAyB,oBAAM;AAAA,SACvF;AAAA,OACF,IAEA,8CAAC,SAAI,WAAU,uBAAsB,yBAAyB,EAAE,QAAQ,QAAQ,QAAQ,GAAG;AAAA,IAI5F,QAAQ,aAAa,QAAQ,UAAU,SAAS,KAC/C,8CAAC,SAAI,WAAU,yBACZ,kBAAQ,UAAU,IAAI,cACrB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,wBACT,SAAS,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,aAAa,EAAE,IAAI,WAAW,EACxE;AAAA,QACA,SAAS,MAAM,qBAAqB,SAAS,KAAK;AAAA,QAClD,OAAO,SAAS,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,QAE/C;AAAA,mBAAS;AAAA,UAAM;AAAA,UAAE,SAAS,MAAM;AAAA;AAAA;AAAA,MAP5B,SAAS;AAAA,IAQhB,CACD,GACH;AAAA,IAIF,+CAAC,SAAI,WAAU,uBACZ;AAAA,kBACC,+CAAC,SAAI,WAAU,+BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,CAAC,aAAa;AAAA,YAC/C;AAAA;AAAA,QAED;AAAA,QACC,iBACC,8CAAC,SAAI,WAAU,iCACZ,yBAAe,IAAI,WAClB,8CAAC,YAAmB,SAAS,MAAM,qBAAqB,KAAK,GAC1D,mBADU,KAEb,CACD,GACH;AAAA,SAEJ;AAAA,MAED,WACC,8CAAC,YAAO,WAAU,0BAAyB,SAAS,MAAM,aAAa,IAAI,GAAG,kBAE9E;AAAA,MAED,aAAa,CAAC,WACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,cAAc,UAAU,QAAQ,EAAE;AAAA,UAClD;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,KACF;AAEJ;AAGA,SAAS,WAAW,EAAE,OAAO,GAA8B;AACzD,QAAM,WAAW,oBAAoB;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,EAAE;AACnD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,EAAE,OAAO,iBAAiB,YAAY,eAAe,cAAc,cAAc,OAAO,IAAI;AAClG,QAAM,WAAW,MAAM,mBAAmB,OAAO;AACjD,QAAM,aAAa,QAAQ,iBAAiB;AAE5C,QAAM,cAAc,MAAM;AACxB,QAAI,aAAa,KAAK,GAAG;AACvB,iBAAW,OAAO,IAAI,YAAY;AAClC,sBAAgB,EAAE;AAClB,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,cAAc,WAAW,sBAAsB,EAAE,IAC1D,OAAO,WAAW,aAAa,wBAAwB,EACzD;AAAA,MACA,SAAS,MAAM,gBAAgB,OAAO,EAAE;AAAA,MAGxC;AAAA,uDAAC,SAAI,WAAU,qBACb;AAAA,yDAAC,SAAI,WAAU,oBAAmB;AAAA;AAAA,YAAE,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE;AAAA,YAAE;AAAA,aAAI;AAAA,UACvE,+CAAC,SAAI,WAAU,mBACb;AAAA,0DAAC,UAAK,WAAW,uCAAuC,OAAO,MAAM,IAClE,iBAAO,QACV;AAAA,YACA,+CAAC,UAAK,WAAU,oBAAoB;AAAA,qBAAO,SAAS;AAAA,cAAO;AAAA,cAAS,OAAO,SAAS,WAAW,IAAI,MAAM;AAAA,eAAG;AAAA,aAC9G;AAAA,WACF;AAAA,QAGA,8CAAC,SAAI,WAAU,uBACZ,iBAAO,SAAS,IAAI,CAAC,SAAS,UAC7B;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,UAAU,OAAO;AAAA,YACjB,SAAS,UAAU;AAAA;AAAA,UAHd,QAAQ;AAAA,QAIf,CACD,GACH;AAAA,QAGC,OAAO,WAAW,UACjB,8CAAC,SAAI,WAAU,oBACZ,sBACC,gFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,OAAK,gBAAgB,EAAE,OAAO,KAAK;AAAA,cAC7C,aAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,+CAAC,SAAI,WAAU,4BACb;AAAA,0DAAC,YAAO,SAAS,aAAa,WAAU,mBAAkB,UAAU,CAAC,aAAa,KAAK,GAAG,mBAE1F;AAAA,YACA,8CAAC,YAAO,SAAS,MAAM,aAAa,KAAK,GAAG,WAAU,qBAAoB,oBAE1E;AAAA,aACF;AAAA,WACF,IAEA,8CAAC,YAAO,SAAS,MAAM,aAAa,IAAI,GAAG,WAAU,wBAAuB,mBAE5E,GAEJ;AAAA,QAIF,+CAAC,SAAI,WAAU,sBACZ;AAAA,wBAAc,OAAO,WAAW,UAC/B,8CAAC,YAAO,SAAS,MAAM,cAAc,OAAO,EAAE,GAAG,WAAU,mBAAkB,4BAE7E;AAAA,UAED,OAAO,WAAW,cACjB,8CAAC,YAAO,SAAS,MAAM,aAAa,OAAO,EAAE,GAAG,WAAU,kBAAiB,oBAE3E;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,OAAK;AACZ,kBAAE,gBAAgB;AAClB,6BAAa,OAAO,EAAE;AAAA,cACxB;AAAA,cACA,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGO,SAAS,cAAc,EAAE,WAAW,SAAS,YAAY,GAAG,GAAuB;AACxF,QAAM,WAAW,oBAAoB;AAErC,MAAI,CAAC,UAAU,aAAa,CAAC,SAAS,MAAM,aAAa;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,aAAa,WAAW,mBAAmB,IAAI;AAC9D,QAAM,kBAAkB,mBAAmB;AAE3C,SACE,+CAAC,SAAI,WAAW,yCAAyC,QAAQ,IAAI,SAAS,IAE5E;AAAA,mDAAC,SAAI,WAAU,6BACb;AAAA,oDAAC,QAAG,sBAAQ;AAAA,MACZ,8CAAC,YAAO,SAAS,MAAM,YAAY,KAAK,GAAG,WAAU,0BAAyB,kBAAC;AAAA,OACjF;AAAA,IAGA,8CAAC,SAAI,WAAU,wBACX,WAAC,OAAO,QAAQ,UAAU,EAAY,IAAI,YAC1C;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,uBAAuB,MAAM,WAAW,SAAS,WAAW,EAAE;AAAA,QACzE,SAAS,MAAM,UAAU,MAAM;AAAA,QAE9B;AAAA,iBAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAAA,UAChD,8CAAC,UAAK,WAAU,6BACb,qBAAW,QACR,MAAM,QAAQ,SACd,MAAM,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE,QACrD;AAAA;AAAA;AAAA,MATK;AAAA,IAUP,CACD,GACH;AAAA,IAGA,8CAAC,SAAI,WAAU,qBACZ,0BAAgB,WAAW,IAC1B,8CAAC,SAAI,WAAU,sBACZ,gBAAM,WAAW,QACd,oDACA,MAAM,MAAM,MAAM,cACxB,IAEA,gBAAgB,IAAI,YAClB,8CAAC,cAA2B,UAAX,OAAO,EAAoB,CAC7C,GAEL;AAAA,KACF;AAEJ;;;AC7TA,IAAAC,iBAAiG;AAge7F,IAAAC,uBAAA;AAtcJ,IAAMC,gBAAoC;AAAA,EACxC,UAAU,CAAC;AAAA,EACX,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,kBAAkB;AACpB;AAGA,SAASC,cAAqB;AAC5B,SAAO,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACnE;AAGA,SAAS,sBAAsB,OAA4B,QAAmD;AAC5G,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,UAAU,OAAO,SAAS;AAAA,IAE/C,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,CAAC,OAAO,SAAS,GAAG,MAAM,QAAQ;AAAA,MAC9C;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS,OAAO,OAAK,EAAE,OAAO,OAAO,SAAS;AAAA,QAC9D,kBAAkB,MAAM,qBAAqB,OAAO,YAAY,OAAO,MAAM;AAAA,MAC/E;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS;AAAA,UAAI,OAC3B,EAAE,OAAO,OAAO,YAAY,EAAE,GAAG,GAAG,UAAU,KAAK,IAAI;AAAA,QACzD;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS;AAAA,UAAI,OAC3B,EAAE,OAAO,OAAO,YAAY,EAAE,GAAG,GAAG,UAAU,MAAM,IAAI;AAAA,QAC1D;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,MAAM,SAAS;AAAA,UAAI,OAC3B,EAAE,OAAO,OAAO,YAAY,EAAE,GAAG,GAAG,OAAO,OAAO,MAAM,IAAI;AAAA,QAC9D;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,UAAU;AAAA,IAExD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,UAAU,CAAC,MAAM,YAAY;AAAA,IAEtE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa;AAAA,QACb,eAAe,OAAO;AAAA,QACtB,aAAa,OAAO;AAAA,MACtB;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,MACf;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,iBAAiB,OAAO,QAAQ;AAAA,IAErD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,SAAS;AAAA,IAEvD;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,WAAW,MAAsB;AACxC,SAAO,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE;AAClD;AAGA,SAAS,YAAY,SAAiB,SAAkC;AACtE,QAAM,UAA2B,CAAC;AAClC,QAAM,WAAW,QAAQ,MAAM,IAAI;AACnC,QAAM,WAAW,QAAQ,MAAM,IAAI;AAEnC,MAAI,IAAI;AACR,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,UAAU,IAAI,SAAS,QAAQ;AACjD,QAAI,KAAK,SAAS,QAAQ;AAExB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,SAAS,CAAC;AAAA,QACnB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF,WAAW,KAAK,SAAS,QAAQ;AAE/B,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS,SAAS,CAAC;AAAA,QACnB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF,WAAW,SAAS,CAAC,MAAM,SAAS,CAAC,GAAG;AAEtC;AACA;AAAA,IACF,OAAO;AAEL,YAAM,eAAe,SAAS,QAAQ,SAAS,CAAC,GAAG,CAAC;AACpD,YAAM,eAAe,SAAS,QAAQ,SAAS,CAAC,GAAG,CAAC;AAEpD,UAAI,iBAAiB,MAAM,iBAAiB,IAAI;AAE9C,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,GAAG,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC;AAAA,UACzC,UAAU;AAAA,QACZ,CAAC;AACD;AACA;AAAA,MACF,WAAW,iBAAiB,IAAI;AAE9B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,SAAS,CAAC;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AACD;AAAA,MACF,OAAO;AAEL,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS,SAAS,CAAC;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAwCA,IAAM,4BAAwB,8BAAiD,IAAI;AAY5E,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA,kBAAkB,CAAC;AAAA,EACnB;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,CAAC,OAAO,QAAQ,QAAI,2BAAW,uBAAuB;AAAA,IAC1D,GAAGD;AAAA,IACH,UAAU;AAAA,IACV,iBAAiB,QAAQ,YAAY;AAAA,IACrC,kBAAkB,QAAQ,oBAAoB;AAAA,EAChD,CAAC;AAED,QAAM,qBAAiB,uBAAO,oBAAI,IAA0C,CAAC;AAC7E,QAAM,uBAAmB,uBAA8B,IAAI;AAC3D,QAAM,qBAAiB,uBAAe,EAAE;AACxC,QAAM,uBAAmB,uBAAO,gBAAgB,MAAM;AAGtD,gCAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,EAAE,KAAK,cAAY;AAC/B,iBAAS,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAC3C,yBAAiB,UAAU,SAAS;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,gCAAU,MAAM;AACd,uBAAmB,MAAM,QAAQ;AACjC,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,MAAM,QAAQ;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,kBAAkB,MAAM,CAAC;AAG7C,gCAAU,MAAM;AACd,QAAI,CAAC,MAAM,mBAAmB,CAAC,UAAU,CAAC,kBAAmB;AAE7D,qBAAiB,UAAU,YAAY,MAAM;AAC3C,YAAM,EAAE,MAAM,KAAK,IAAI,kBAAkB;AAGzC,UAAI,SAAS,eAAe,SAAS;AACnC,uBAAe,UAAU;AACzB,sBAAc,MAAM,MAAM,EAAE,YAAY,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,GAAG,MAAM,gBAAgB;AAEzB,WAAO,MAAM;AACX,UAAI,iBAAiB,SAAS;AAC5B,sBAAc,iBAAiB,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,iBAAiB,MAAM,kBAAkB,QAAQ,iBAAiB,CAAC;AAG7E,QAAM,gBAAY,4BAAY,CAAC,UAA+B;AAC5D,mBAAe,QAAQ,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,EAC5D,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAgB,4BAAY,CAChC,SACA,aACA,YACmB;AACnB,QAAI,CAAC,QAAQ,YAAa,QAAO;AAGjC,UAAM,cAAc,OAAO,eAAe;AAC1C,QAAI,WAAW,MAAM;AAErB,QAAI,SAAS,UAAU,aAAa;AAElC,YAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,OAAK,CAAC,EAAE,QAAQ;AACpE,UAAI,gBAAgB;AAClB,mBAAW,SAAS,OAAO,OAAK,EAAE,OAAO,eAAe,EAAE;AAAA,MAC5D;AAAA,IACF;AAEA,qBAAiB;AACjB,UAAM,cAAc,QAAQ,QAAQ,YAAY,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAE/E,UAAM,UAAmB;AAAA,MACvB,IAAIC,YAAW;AAAA,MACf,QAAQ,iBAAiB;AAAA,MACzB,OAAO,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,WAAW,WAAW;AAAA,MACjC,gBAAgB,YAAY;AAAA,MAC5B,YAAY,SAAS,cAAc;AAAA,MACnC,UAAU;AAAA,IACZ;AAEA,aAAS,EAAE,MAAM,eAAe,QAAQ,CAAC;AACzC,cAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAC9C,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,MAAM,UAAU,SAAS,CAAC;AAGtC,QAAM,oBAAgB,4BAAY,CAAC,cAAsB;AACvD,aAAS,EAAE,MAAM,kBAAkB,UAAU,CAAC;AAC9C,cAAU,EAAE,MAAM,mBAAmB,UAAU,CAAC;AAAA,EAClD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,qBAAiB,4BAAY,CAAC,cAAqC;AACvE,UAAM,UAAU,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AAC3D,QAAI,CAAC,QAAS,QAAO;AAErB,YAAQ,YAAY,OAAO;AAC3B,cAAU,EAAE,MAAM,oBAAoB,UAAU,CAAC;AACjD,WAAO,QAAQ;AAAA,EACjB,GAAG,CAAC,MAAM,UAAU,QAAQ,SAAS,CAAC;AAGtC,QAAM,iBAAa,4BAAY,CAAC,cAAsB;AACpD,aAAS,EAAE,MAAM,eAAe,UAAU,CAAC;AAC3C,cAAU,EAAE,MAAM,kBAAkB,UAAU,CAAC;AAAA,EACjD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,mBAAe,4BAAY,CAAC,cAAsB;AACtD,aAAS,EAAE,MAAM,iBAAiB,UAAU,CAAC;AAC7C,cAAU,EAAE,MAAM,oBAAoB,UAAU,CAAC;AAAA,EACnD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,oBAAgB,4BAAY,CAAC,WAAmB,UAAkB;AACtE,aAAS,EAAE,MAAM,kBAAkB,WAAW,MAAM,CAAC;AACrD,cAAU,EAAE,MAAM,mBAAmB,WAAW,MAAM,CAAC;AAAA,EACzD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,kBAAc,4BAAY,CAAC,cAA6B;AAC5D,aAAS,EAAE,MAAM,uBAAuB,UAAU,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAoB,4BAAY,CAAC,cAAqC;AAC1E,UAAM,UAAU,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AAC3D,WAAO,SAAS,WAAW;AAAA,EAC7B,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,sBAAkB,4BAAY,CAAC,QAAgB,SAA2C;AAC9F,UAAM,cAAc,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,MAAM;AAC5D,UAAM,YAAY,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,IAAI;AAExD,QAAI,CAAC,eAAe,CAAC,UAAW,QAAO;AAEvC,UAAM,UAAU,YAAY,YAAY,aAAa,UAAU,WAAW;AAE1E,WAAO;AAAA,MACL,eAAe;AAAA,MACf,aAAa;AAAA,MACb;AAAA,MACA,OAAO;AAAA,QACL,WAAW,QAAQ,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE;AAAA,QACtD,WAAW,QAAQ,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE;AAAA,QACtD,eAAe,QAAQ,OAAO,OAAK,EAAE,SAAS,cAAc,EAAE;AAAA,MAChE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,mBAAe,4BAAY,CAAC,QAAgB,SAAiB;AACjE,aAAS,EAAE,MAAM,iBAAiB,QAAQ,KAAK,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,MAAM;AACpC,aAAS,EAAE,MAAM,eAAe,CAAC;AAAA,EACnC,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,CAAC,WAAqB;AACpD,aAAS,EAAE,MAAM,gBAAgB,OAAO,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,4BAAY,CAAC,YAAqB;AACpD,aAAS,EAAE,MAAM,iBAAiB,QAAQ,CAAC;AAC3C,cAAU,EAAE,MAAM,qBAAqB,QAAQ,CAAC;AAAA,EAClD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,iBAAa,4BAAY,CAAC,cAAsB;AACpD,WAAO,MAAM,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS;AAAA,EACpD,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,uBAAmB,4BAAY,MAAM;AACzC,WAAO,MAAM,SAAS,CAAC;AAAA,EACzB,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,WAAO,MAAM,SAAS,OAAO,OAAK,EAAE,QAAQ;AAAA,EAC9C,GAAG,CAAC,MAAM,QAAQ,CAAC;AAGnB,QAAM,gBAAY,4BAAY,CAAC,aAAmD;AAChF,mBAAe,QAAQ,IAAI,QAAQ;AACnC,WAAO,MAAM;AACX,qBAAe,QAAQ,OAAO,QAAQ;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAoC;AAAA,IACxC;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EACf;AAEA,SACE,8CAAC,sBAAsB,UAAtB,EAA+B,OAC7B,UACH;AAEJ;AAGO,SAAS,oBAAoB;AAClC,QAAM,cAAU,2BAAW,qBAAqB;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AACA,SAAO;AACT;AAGO,SAAS,4BAA4B;AAC1C,aAAO,2BAAW,qBAAqB;AACzC;;;AClfA,IAAAC,iBAAyB;AA6Eb,IAAAC,uBAAA;AAjEZ,SAAS,WAAW,WAA2B;AAC7C,QAAM,OAAO,IAAI,KAAK,SAAS;AAC/B,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAAU,KAAK,aAAa,MAAM,IAAI,aAAa;AAEzD,MAAI,SAAS;AACX,WAAO,YAAY,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,EACxF;AAEA,QAAM,YAAY,IAAI,KAAK,GAAG;AAC9B,YAAU,QAAQ,UAAU,QAAQ,IAAI,CAAC;AACzC,MAAI,KAAK,aAAa,MAAM,UAAU,aAAa,GAAG;AACpD,WAAO,gBAAgB,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,EAC5F;AAEA,SAAO,KAAK,mBAAmB,CAAC,GAAG;AAAA,IACjC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;AAGA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAWG;AACD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,QAAQ,SAAS,EAAE;AAE5D,QAAM,eAAe,MAAM;AACzB,aAAS,QAAQ;AACjB,kBAAc,KAAK;AAAA,EACrB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oBAAoB,YAAY,wBAAwB,EAAE,IACnE,gBAAgB,6BAA6B,EAC/C,IAAI,cAAc,2BAA2B,EAAE;AAAA,MAG/C;AAAA,uDAAC,SAAI,WAAU,sBAAqB,SAAS,QAC3C;AAAA,yDAAC,SAAI,WAAU,oBACZ;AAAA,yBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,OAAK,YAAY,EAAE,OAAO,KAAK;AAAA,gBACzC,QAAQ;AAAA,gBACR,WAAW,OAAK,EAAE,QAAQ,WAAW,aAAa;AAAA,gBAClD,WAAU;AAAA,gBACV,SAAS,OAAK,EAAE,gBAAgB;AAAA,gBAChC,WAAS;AAAA;AAAA,YACX,IAEA,+CAAC,UAAK,WAAU,qBACb;AAAA,sBAAQ,SAAS,WAAW,QAAQ,MAAM;AAAA,cAC1C,QAAQ,YAAY,8CAAC,UAAK,WAAU,wBAAuB,uBAAE;AAAA,cAC7D,QAAQ,cAAc,8CAAC,UAAK,WAAU,0BAAyB,kBAAI;AAAA,eACtE;AAAA,YAEF,8CAAC,UAAK,WAAU,oBAAoB,qBAAW,QAAQ,SAAS,GAAE;AAAA,aACpE;AAAA,UACA,+CAAC,SAAI,WAAU,sBACZ;AAAA,oBAAQ,OAAO,SACd,8CAAC,SAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK,QAAQ,OAAO,MAAM,WAAU,sBAAqB,IAE1F,8CAAC,SAAI,WAAU,kCACZ,kBAAQ,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,GAC7C;AAAA,YAEF,8CAAC,UAAM,kBAAQ,OAAO,MAAK;AAAA,aAC7B;AAAA,WACF;AAAA,QAGA,+CAAC,SAAI,WAAU,qBACb;AAAA,yDAAC,UAAM;AAAA,oBAAQ;AAAA,YAAU;AAAA,aAAM;AAAA,UAC/B,+CAAC,UAAM;AAAA,oBAAQ;AAAA,YAAe;AAAA,aAAM;AAAA,WACtC;AAAA,QAGA,+CAAC,SAAI,WAAU,uBACb;AAAA,wDAAC,YAAO,SAAS,WAAW,WAAU,mBAAkB,OAAM,wBAAuB,4BAErF;AAAA,UACA,8CAAC,YAAO,SAAS,iBAAiB,WAAU,mBAAkB,OAAM,gCAA+B,4BAEnG;AAAA,UACA,8CAAC,YAAO,SAAS,OAAO,WAAU,mBAAkB,OAAO,QAAQ,WAAW,UAAU,OACrF,kBAAQ,WAAW,oBAAa,iBACnC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,cAAc,IAAI;AAAA,cACjC,WAAU;AAAA,cACV,OAAM;AAAA,cACP;AAAA;AAAA,UAED;AAAA,UACC,CAAC,QAAQ,YACR,8CAAC,YAAO,SAAS,UAAU,WAAU,0CAAyC,OAAM,UAAS,6BAE7F;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,iBAAiB,0BAA0B;AACjD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,aAAa,eAAe,gBAAgB,YAAY,IAAI,UAAU,EAAE;AAE9E,SACE,+CAAC,SAAI,WAAU,0BACb;AAAA,mDAAC,SAAI,WAAU,iCACb;AAAA,oDAAC,QAAG,gCAAkB;AAAA,MACtB,8CAAC,YAAO,SAAS,SAAS,WAAU,gCAA+B,kBAAC;AAAA,OACtE;AAAA,IAEA,+CAAC,SAAI,WAAU,+BACb;AAAA,qDAAC,SAAI,WAAU,+BACb;AAAA,sDAAC,UAAK,WAAU,gCAA+B,mBAAK;AAAA,QACnD,YAAY,SAAS,WAAW,YAAY,MAAM;AAAA,SACrD;AAAA,MACA,8CAAC,UAAK,WAAU,gCAA+B,oBAAC;AAAA,MAChD,+CAAC,SAAI,WAAU,6BACb;AAAA,sDAAC,UAAK,WAAU,gCAA+B,iBAAG;AAAA,QACjD,UAAU,SAAS,WAAW,UAAU,MAAM;AAAA,SACjD;AAAA,OACF;AAAA,IAEC,cACC,+CAAC,SAAI,WAAU,gCACb;AAAA,qDAAC,UAAK,WAAU,gDAA+C;AAAA;AAAA,QAC3D,WAAW,MAAM;AAAA,QAAU;AAAA,SAC/B;AAAA,MACA,+CAAC,UAAK,WAAU,gDAA+C;AAAA;AAAA,QAC3D,WAAW,MAAM;AAAA,QAAU;AAAA,SAC/B;AAAA,MACA,+CAAC,UAAK,WAAU,oDAAmD;AAAA;AAAA,QAC/D,WAAW,MAAM;AAAA,QAAc;AAAA,SACnC;AAAA,OACF;AAAA,IAGF,8CAAC,SAAI,WAAU,+BACZ,sBAAY,QAAQ,IAAI,CAAC,QAAQ,UAChC,+CAAC,SAAgB,WAAW,0BAA0B,OAAO,IAAI,IAC/D;AAAA,oDAAC,UAAK,WAAU,sBACb,iBAAO,SAAS,aAAa,MAAM,OAAO,SAAS,aAAa,MAAM,KACzE;AAAA,MACA,8CAAC,UAAK,WAAU,oBAAoB,iBAAO,SAAQ;AAAA,SAJ3C,KAKV,CACD,GACH;AAAA,KACF;AAEJ;AAGO,SAAS,oBAAoB,EAAE,WAAW,SAAS,YAAY,GAAG,GAA6B;AACpG,QAAM,iBAAiB,0BAA0B;AACjD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAwB,IAAI;AAEtE,MAAI,CAAC,gBAAgB,aAAa,CAAC,eAAe,MAAM,aAAa;AACnE,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,gBAAgB,CAAC,cAAsB;AAC3C,UAAM,UAAU,eAAe,SAAS;AACxC,QAAI,SAAS;AACX,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,cAAsB;AACjD,QAAI,CAAC,eAAe;AAClB,uBAAiB,SAAS;AAAA,IAC5B,OAAO;AACL,qBAAe,aAAa,eAAe,SAAS;AACpD,uBAAiB,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,qBAAiB,IAAI;AACrB,gBAAY;AAAA,EACd;AAGA,QAAM,qBAAqB,MAAM,gBAAgB,WAAW,MAAM,aAAa,IAAI;AACnF,QAAM,mBAAmB,MAAM,cAAc,WAAW,MAAM,WAAW,IAAI;AAE7E,SACE,+CAAC,SAAI,WAAW,uCAAuC,QAAQ,IAAI,SAAS,IAE1E;AAAA,mDAAC,SAAI,WAAU,4BACb;AAAA,oDAAC,QAAG,6BAAe;AAAA,MACnB,8CAAC,YAAO,SAAS,MAAM,YAAY,KAAK,GAAG,WAAU,yBAAwB,kBAAC;AAAA,OAChF;AAAA,IAGA,+CAAC,SAAI,WAAU,wBACb;AAAA,qDAAC,WAAM,WAAU,8BACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAAA,YACf,UAAU,OAAK,YAAY,EAAE,OAAO,OAAO;AAAA;AAAA,QAC7C;AAAA,QAAE;AAAA,SAEJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,cAAc,IAAI,QAAW,EAAE,YAAY,MAAM,CAAC;AAAA,UACjE,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAGC,iBAAiB,CAAC,MAAM,eACvB,+CAAC,SAAI,WAAU,4BACb;AAAA,oDAAC,UAAK,+CAAiC;AAAA,MACvC,8CAAC,YAAO,SAAS,qBAAqB,oBAAM;AAAA,OAC9C;AAAA,IAID,MAAM,eAAe,sBAAsB,oBAC1C;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,QACb,WAAW;AAAA,QACX,SAAS;AAAA;AAAA,IACX;AAAA,IAID,CAAC,MAAM,eACN,8CAAC,SAAI,WAAU,oBACZ,gBAAM,SAAS,WAAW,IACzB,8CAAC,SAAI,WAAU,qBAAoB,6EAEnC,IAEA,gFAEG;AAAA,YAAM,SAAS,KAAK,OAAK,EAAE,QAAQ,KAClC,+CAAC,SAAI,WAAU,uBACb;AAAA,sDAAC,SAAI,WAAU,6BAA4B,8BAAS;AAAA,QACnD,MAAM,SACJ,OAAO,OAAK,EAAE,QAAQ,EACtB,IAAI,aACH;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,MAAM,qBAAqB,QAAQ;AAAA,YAC9C,eAAe,kBAAkB,QAAQ;AAAA,YACzC,aAAa;AAAA,YACb,QAAQ,MAAM,YAAY,QAAQ,EAAE;AAAA,YACpC,WAAW,MAAM,cAAc,QAAQ,EAAE;AAAA,YACzC,OAAO,MAAM,aAAa,QAAQ,EAAE;AAAA,YACpC,UAAU,WAAS,cAAc,QAAQ,IAAI,KAAK;AAAA,YAClD,UAAU,MAAM,cAAc,QAAQ,EAAE;AAAA,YACxC,iBAAiB,MAAM,oBAAoB,QAAQ,EAAE;AAAA;AAAA,UAVhD,QAAQ;AAAA,QAWf,CACD;AAAA,SACL;AAAA,MAIF,+CAAC,SAAI,WAAU,uBACb;AAAA,sDAAC,SAAI,WAAU,6BAA4B,oBAAM;AAAA,QAChD,MAAM,SACJ,OAAO,OAAK,CAAC,EAAE,QAAQ,EACvB,IAAI,aACH;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,MAAM,qBAAqB,QAAQ;AAAA,YAC9C,eAAe,kBAAkB,QAAQ;AAAA,YACzC,aAAa;AAAA,YACb,QAAQ,MAAM,YAAY,QAAQ,EAAE;AAAA,YACpC,WAAW,MAAM,cAAc,QAAQ,EAAE;AAAA,YACzC,OAAO,MAAM,WAAW,QAAQ,EAAE;AAAA,YAClC,UAAU,WAAS,cAAc,QAAQ,IAAI,KAAK;AAAA,YAClD,UAAU,MAAM,cAAc,QAAQ,EAAE;AAAA,YACxC,iBAAiB,MAAM,oBAAoB,QAAQ,EAAE;AAAA;AAAA,UAVhD,QAAQ;AAAA,QAWf,CACD;AAAA,SACL;AAAA,OACF,GAEJ;AAAA,IAID,MAAM,oBACL,+CAAC,SAAI,WAAU,iCACb;AAAA,qDAAC,UAAK;AAAA;AAAA,QAAU,WAAW,MAAM,gBAAgB,GAAG,SAAS,WAAW,WAAW,MAAM,gBAAgB,GAAG,MAAM;AAAA,SAAG;AAAA,MACrH,8CAAC,YAAO,SAAS,MAAM,YAAY,IAAI,GAAG,WAAU,wBAAuB,oCAE3E;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":["import_core","import_core","import_core","import_core","import_core","import_core","ToolbarButton","import_react","import_jsx_runtime","editor","import_react","import_jsx_runtime","toggleMark","toggleBlock","isMarkActive","isBlockActive","SlateElement","import_react","import_slate","import_slate_react","import_jsx_runtime","SlateElement","isHotkey","import_react","import_rich_text","import_lexical","import_jsx_runtime","ToolbarButton","icons","import_react","import_rich_text","import_list","import_link","import_code","import_table","import_LexicalHorizontalRuleNode","import_lexical","import_jsx_runtime","import_react","TipTapEditorComponent","SlateEditorComponent","LexicalEditorComponent","import_jsx_runtime","import_react","import_extension_document","import_extension_paragraph","import_extension_text","import_extension_bold","import_extension_italic","import_extension_underline","import_extension_strike","import_extension_code","import_extension_code_block_lowlight","import_extension_subscript","import_extension_superscript","import_extension_text_style","import_extension_font_family","import_extension_color","import_extension_highlight","import_extension_text_align","import_extension_heading","import_extension_bullet_list","import_extension_ordered_list","import_extension_list_item","import_extension_blockquote","import_extension_horizontal_rule","import_extension_link","import_extension_image","import_extension_table","import_extension_table_row","import_extension_table_cell","import_extension_table_header","import_extension_history","import_extension_placeholder","import_extension_character_count","import_extension_gapcursor","import_extension_dropcursor","import_extension_hard_break","import_lowlight","import_react","import_lucide_react","import_jsx_runtime","FONT_FAMILIES","FONT_SIZES","LINE_HEIGHTS","EmojiPicker","ToolbarButton","import_jsx_runtime","lowlight","toolbarPresets","editor","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","initialState","import_react","import_jsx_runtime","import_react","import_jsx_runtime","initialState","generateId","import_react","import_jsx_runtime"]}